OSDN Git Service

Change empty apn type in user entered APN to non-read-only types.
authorTreeHugger Robot <treehugger-gerrit@google.com>
Mon, 19 Jun 2017 23:21:12 +0000 (23:21 +0000)
committerAmit Mahajan <amitmahajan@google.com>
Tue, 22 Aug 2017 18:20:32 +0000 (18:20 +0000)
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

index c8f9dd1..ba160ab 100644 (file)
@@ -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<String> 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) {