diff options
author | Roman Birg <roman@cyngn.com> | 2016-01-28 16:31:26 -0800 |
---|---|---|
committer | Gerrit Code Review <gerrit@cyanogenmod.org> | 2016-02-08 10:01:58 -0800 |
commit | 6f4133e18978fecacaf7f88c6072490ceb44e576 (patch) | |
tree | 8929e1a0f031193bef6a157765260b845ae8bb69 /src/com/android/settings/ApnEditor.java | |
parent | 68872cb8247d4f53e63a67c8abe62aca029c1e4f (diff) | |
download | packages_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.java | 81 |
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); |