summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/ApnEditor.java
diff options
context:
space:
mode:
authorRoman Birg <roman@cyngn.com>2016-01-28 16:31:26 -0800
committerGerrit Code Review <gerrit@cyanogenmod.org>2016-02-08 10:01:58 -0800
commit6f4133e18978fecacaf7f88c6072490ceb44e576 (patch)
tree8929e1a0f031193bef6a157765260b845ae8bb69 /src/com/android/settings/ApnEditor.java
parent68872cb8247d4f53e63a67c8abe62aca029c1e4f (diff)
downloadpackages_apps_Settings-6f4133e18978fecacaf7f88c6072490ceb44e576.zip
packages_apps_Settings-6f4133e18978fecacaf7f88c6072490ceb44e576.tar.gz
packages_apps_Settings-6f4133e18978fecacaf7f88c6072490ceb44e576.tar.bz2
Settings: don't allow duplicate APN entries
Prompt user with warning if they are about to add a new APN which is a duplicate. Change-Id: I86c6a6d272a7ba079b81dedb05b44575fd4d86e7 Signed-off-by: Roman Birg <roman@cyngn.com>
Diffstat (limited to 'src/com/android/settings/ApnEditor.java')
-rw-r--r--src/com/android/settings/ApnEditor.java81
1 files changed, 80 insertions, 1 deletions
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
index 181d0aa..2ed7438 100644
--- a/src/com/android/settings/ApnEditor.java
+++ b/src/com/android/settings/ApnEditor.java
@@ -30,7 +30,6 @@ import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.MultiSelectListPreference;
import android.preference.Preference;
-import android.preference.PreferenceActivity;
import android.preference.SwitchPreference;
import android.provider.Telephony;
import android.telephony.ServiceState;
@@ -43,7 +42,10 @@ import android.view.Menu;
import android.view.MenuItem;
import com.android.internal.logging.MetricsLogger;
+import java.util.ArrayList;
import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
import java.util.Set;
public class ApnEditor extends InstrumentedPreferenceActivity
@@ -66,6 +68,7 @@ public class ApnEditor extends InstrumentedPreferenceActivity
private static final int MENU_SAVE = Menu.FIRST + 1;
private static final int MENU_CANCEL = Menu.FIRST + 2;
private static final int ERROR_DIALOG_ID = 0;
+ private static final int DUPLICATE_DIALOG_ID = 1;
private static String sNotSet;
private EditTextPreference mName;
@@ -714,11 +717,81 @@ public class ApnEditor extends InstrumentedPreferenceActivity
values.put(Telephony.Carriers.MVNO_MATCH_DATA, checkNotSet(mMvnoMatchData.getText()));
values.put(Telephony.Carriers.CARRIER_ENABLED, mCarrierEnabled.isChecked() ? 1 : 0);
+
+ if (isDuplicate(values)) {
+ showDialog(DUPLICATE_DIALOG_ID);
+ return false;
+ }
+
getContentResolver().update(mUri, values, null, null);
return true;
}
+ private boolean isDuplicate(ContentValues row) {
+ if (!getResources().getBoolean(R.bool.config_enable_duplicate_apn_checking)) {
+ return false;
+ }
+
+ final Set<String> keys = row.keySet();
+
+ StringBuilder queryBuilder = new StringBuilder();
+ List<String> selectionArgsList = new ArrayList<>();
+
+ final Iterator<String> iterator = keys.iterator();
+ while (iterator.hasNext()) {
+ final String key = iterator.next();
+
+ if (!keyForDuplicateCheck(key) || row.getAsString(key).isEmpty()) {
+ // Skip keys which don't interest us for the duplicate query.
+ // Or if the user hasn't yet filled a field in (empty value), skip it.
+ continue;
+ }
+
+ queryBuilder.append(key);
+ queryBuilder.append("=?");
+ queryBuilder.append(" AND ");
+
+ selectionArgsList.add(row.getAsString(key));
+ }
+ // remove extra AND at the end
+ queryBuilder.delete(queryBuilder.length() - " AND ".length(), queryBuilder.length());
+
+ String[] selectionArgs = new String[selectionArgsList.size()];
+ selectionArgsList.toArray(selectionArgs);
+
+ try (Cursor query = getContentResolver().query(Telephony.Carriers.CONTENT_URI,
+ sProjection, queryBuilder.toString(), selectionArgs, null)) {
+ return query.getCount() > (mNewApn ? 0 : 1);
+ } catch (Exception e) {
+ Log.e(TAG, "error querying for duplicates", e);
+ return false;
+ }
+ }
+
+ /**
+ * Helper method to decide what columns should be considered valid when checking for
+ * potential duplicate APNs before allowing the user to add a new one.
+ *
+ * @param key the column of the row we want to check
+ * @return whether to include this key-value pair in the duplicate query
+ */
+ private static boolean keyForDuplicateCheck(String key) {
+ switch (key) {
+ case Telephony.Carriers.APN:
+ case Telephony.Carriers.MMSPROXY:
+ case Telephony.Carriers.MMSPORT:
+ case Telephony.Carriers.MMSC:
+ case Telephony.Carriers.TYPE:
+ case Telephony.Carriers.MCC:
+ case Telephony.Carriers.MNC:
+ case Telephony.Carriers.NUMERIC:
+ return true;
+ default:
+ return false;
+ }
+ }
+
private String getErrorMsg() {
String errorMsg = null;
@@ -751,6 +824,12 @@ public class ApnEditor extends InstrumentedPreferenceActivity
.setPositiveButton(android.R.string.ok, null)
.setMessage(msg)
.create();
+ } else if (id == DUPLICATE_DIALOG_ID) {
+ return new AlertDialog.Builder(this)
+ .setTitle(R.string.duplicate_apn_error_title)
+ .setPositiveButton(android.R.string.ok, null)
+ .setMessage(getString(R.string.duplicate_apn_error_message))
+ .create();
}
return super.onCreateDialog(id);