From 607e684f64e1bf486e9811acfae8c46ea97ed236 Mon Sep 17 00:00:00 2001 From: Amit Mahajan Date: Tue, 9 May 2017 22:31:13 -0700 Subject: [PATCH 1/3] Disallow adding/editing dun APNs unless allowed by carrier. Test: WIP Bug: 38186417 Change-Id: If1cc34ad979659a56a3886da2a02fdbf642739ac --- res/values/strings.xml | 2 ++ src/com/android/settings/ApnEditor.java | 43 ++++++++++++++++------- src/com/android/settings/ApnSettings.java | 9 +++++ 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 2b27d596707..5e66cf4dbbe 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2982,6 +2982,8 @@ MCC field must be 3 digits. MNC field must be 2 or 3 digits. + + Carrier does not allow adding APNs of type %s. Restoring default APN settings. diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java index d5affa85974..11d8ea27e38 100644 --- a/src/com/android/settings/ApnEditor.java +++ b/src/com/android/settings/ApnEditor.java @@ -213,6 +213,18 @@ public class ApnEditor extends SettingsPreferenceFragment mReadOnlyApnTypes = null; mReadOnlyApnFields = null; + CarrierConfigManager configManager = (CarrierConfigManager) + getSystemService(Context.CARRIER_CONFIG_SERVICE); + if (configManager != null) { + PersistableBundle b = configManager.getConfig(); + if (b != null) { + mReadOnlyApnTypes = b.getStringArray( + CarrierConfigManager.KEY_READ_ONLY_APN_TYPES_STRING_ARRAY); + mReadOnlyApnFields = b.getStringArray( + CarrierConfigManager.KEY_READ_ONLY_APN_FIELDS_STRING_ARRAY); + } + } + if (action.equals(Intent.ACTION_EDIT)) { Uri uri = intent.getData(); if (!uri.isPathPrefixMatch(Telephony.Carriers.CONTENT_URI)) { @@ -220,17 +232,6 @@ public class ApnEditor extends SettingsPreferenceFragment finish(); return; } - CarrierConfigManager configManager = (CarrierConfigManager) - getSystemService(Context.CARRIER_CONFIG_SERVICE); - if (configManager != null) { - PersistableBundle b = configManager.getConfig(); - if (b != null) { - mReadOnlyApnTypes = b.getStringArray( - CarrierConfigManager.KEY_READ_ONLY_APN_TYPES_STRING_ARRAY); - mReadOnlyApnFields = b.getStringArray( - CarrierConfigManager.KEY_READ_ONLY_APN_FIELDS_STRING_ARRAY); - } - } mUri = uri; } else if (action.equals(Intent.ACTION_INSERT)) { if (mFirstTime || icicle.getInt(SAVED_POS) == 0) { @@ -295,7 +296,7 @@ public class ApnEditor extends SettingsPreferenceFragment * @param apnTypes array of APN types. "*" indicates all types. * @return true if all apn types are included in the array, false otherwise */ - private boolean hasAllApns(String[] apnTypes) { + static boolean hasAllApns(String[] apnTypes) { if (ArrayUtils.isEmpty(apnTypes)) { return false; } @@ -1052,6 +1053,24 @@ public class ApnEditor extends SettingsPreferenceFragment errorMsg = mRes.getString(R.string.error_mnc_not23); } + if (errorMsg == null) { + // if carrier does not allow editing certain apn types, make sure type does not include + // those + if (mReadOnlyApnTypes.length > 0 + && apnTypesMatch(mReadOnlyApnTypes, mApnType.getText())) { + StringBuilder stringBuilder = new StringBuilder(); + for (String type : mReadOnlyApnTypes) { + stringBuilder.append(type).append(", "); + } + // remove last ", " + if (stringBuilder.length() >= 2) { + stringBuilder.delete(stringBuilder.length() - 2, stringBuilder.length()); + } + errorMsg = String.format(mRes.getString(R.string.error_adding_apn_type), + stringBuilder); + } + } + return errorMsg; } diff --git a/src/com/android/settings/ApnSettings.java b/src/com/android/settings/ApnSettings.java index b460050eea4..37552edd657 100755 --- a/src/com/android/settings/ApnSettings.java +++ b/src/com/android/settings/ApnSettings.java @@ -173,6 +173,15 @@ public class ApnSettings extends RestrictedSettingsFragment implements PersistableBundle b = configManager.getConfig(); mHideImsApn = b.getBoolean(CarrierConfigManager.KEY_HIDE_IMS_APN_BOOL); mAllowAddingApns = b.getBoolean(CarrierConfigManager.KEY_ALLOW_ADDING_APNS_BOOL); + if (mAllowAddingApns) { + String[] readOnlyApnTypes = b.getStringArray( + CarrierConfigManager.KEY_READ_ONLY_APN_TYPES_STRING_ARRAY); + // if no apn type can be edited, do not allow adding APNs + if (ApnEditor.hasAllApns(readOnlyApnTypes)) { + Log.d(TAG, "not allowing adding APN because all APN types are read only"); + mAllowAddingApns = false; + } + } mUserManager = UserManager.get(activity); } From 2bfc9906c1a7edec20155bce5737f27839b613ef Mon Sep 17 00:00:00 2001 From: Amit Mahajan Date: Thu, 1 Jun 2017 16:39:40 -0700 Subject: [PATCH 2/3] Check for null mReadOnlyApnTypes. Test: none Bug: 62247121 Change-Id: I6866bf2df8d4cb46dd75b94ab88c1e62e65ddda7 --- src/com/android/settings/ApnEditor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java index 11d8ea27e38..c8f9dd12e14 100644 --- a/src/com/android/settings/ApnEditor.java +++ b/src/com/android/settings/ApnEditor.java @@ -1056,7 +1056,7 @@ public class ApnEditor extends SettingsPreferenceFragment if (errorMsg == null) { // if carrier does not allow editing certain apn types, make sure type does not include // those - if (mReadOnlyApnTypes.length > 0 + if (!ArrayUtils.isEmpty(mReadOnlyApnTypes) && apnTypesMatch(mReadOnlyApnTypes, mApnType.getText())) { StringBuilder stringBuilder = new StringBuilder(); for (String type : mReadOnlyApnTypes) { From 937e2d5a8e9bd1397330876304d9ecb3e86f54c6 Mon Sep 17 00:00:00 2001 From: TreeHugger Robot Date: Mon, 19 Jun 2017 23:21:12 +0000 Subject: [PATCH 3/3] Change empty apn type in user entered APN to non-read-only types. Test: Manually added APN and verified read-only and non-wildcardable types are not included Bug: 38186417 Change-Id: I07bcf1c2a950a1257446f0a7beb602fed79423b3 --- src/com/android/settings/ApnEditor.java | 48 +++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java index c8f9dd12e14..ba160abc43b 100644 --- a/src/com/android/settings/ApnEditor.java +++ b/src/com/android/settings/ApnEditor.java @@ -52,6 +52,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.internal.telephony.PhoneConstants; import com.android.internal.util.ArrayUtils; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -117,6 +118,7 @@ public class ApnEditor extends SettingsPreferenceFragment private String[] mReadOnlyApnTypes; private String[] mReadOnlyApnFields; private boolean mReadOnlyApn; + private String mUserEnteredApnType; /** * Standard projection for the interesting columns of a normal note. @@ -212,6 +214,7 @@ public class ApnEditor extends SettingsPreferenceFragment mReadOnlyApn = false; mReadOnlyApnTypes = null; mReadOnlyApnFields = null; + mUserEnteredApnType = null; CarrierConfigManager configManager = (CarrierConfigManager) getSystemService(Context.CARRIER_CONFIG_SERVICE); @@ -220,6 +223,11 @@ public class ApnEditor extends SettingsPreferenceFragment if (b != null) { mReadOnlyApnTypes = b.getStringArray( CarrierConfigManager.KEY_READ_ONLY_APN_TYPES_STRING_ARRAY); + if (!ArrayUtils.isEmpty(mReadOnlyApnTypes)) { + for (String apnType : mReadOnlyApnTypes) { + Log.d(TAG, "onCreate: read only APN type: " + apnType); + } + } mReadOnlyApnFields = b.getStringArray( CarrierConfigManager.KEY_READ_ONLY_APN_FIELDS_STRING_ARRAY); } @@ -951,7 +959,7 @@ public class ApnEditor extends SettingsPreferenceFragment callUpdate = setStringValueAndCheckIfDiff(values, Telephony.Carriers.TYPE, - checkNotSet(mApnType.getText()), + checkNotSet(getUserEnteredApnType()), callUpdate, TYPE_INDEX); @@ -1057,10 +1065,11 @@ public class ApnEditor extends SettingsPreferenceFragment // if carrier does not allow editing certain apn types, make sure type does not include // those if (!ArrayUtils.isEmpty(mReadOnlyApnTypes) - && apnTypesMatch(mReadOnlyApnTypes, mApnType.getText())) { + && apnTypesMatch(mReadOnlyApnTypes, getUserEnteredApnType())) { StringBuilder stringBuilder = new StringBuilder(); for (String type : mReadOnlyApnTypes) { stringBuilder.append(type).append(", "); + Log.d(TAG, "getErrorMsg: appending type: " + type); } // remove last ", " if (stringBuilder.length() >= 2) { @@ -1107,6 +1116,41 @@ public class ApnEditor extends SettingsPreferenceFragment } } + private String getUserEnteredApnType() { + if (mUserEnteredApnType != null) { + return mUserEnteredApnType; + } + + // if user has not specified a type, map it to "ALL APN TYPES THAT ARE NOT READ-ONLY" + mUserEnteredApnType = mApnType.getText(); + if (mUserEnteredApnType != null) mUserEnteredApnType = mUserEnteredApnType.trim(); + if ((TextUtils.isEmpty(mUserEnteredApnType) + || PhoneConstants.APN_TYPE_ALL.equals(mUserEnteredApnType)) + && !ArrayUtils.isEmpty(mReadOnlyApnTypes)) { + StringBuilder editableApnTypes = new StringBuilder(); + List readOnlyApnTypes = Arrays.asList(mReadOnlyApnTypes); + boolean first = true; + for (String apnType : PhoneConstants.APN_TYPES) { + // add APN type if it is not read-only and is not wild-cardable + if (!readOnlyApnTypes.contains(apnType) + && !apnType.equals(PhoneConstants.APN_TYPE_IA) + && !apnType.equals(PhoneConstants.APN_TYPE_EMERGENCY)) { + if (first) { + first = false; + } else { + editableApnTypes.append(","); + } + editableApnTypes.append(apnType); + } + } + mUserEnteredApnType = editableApnTypes.toString(); + Log.d(TAG, "getUserEnteredApnType: changed apn type to editable apn types: " + + mUserEnteredApnType); + } + + return mUserEnteredApnType; + } + public static class ErrorDialog extends InstrumentedDialogFragment { public static void showError(ApnEditor editor) {