Merge changes from topic "Read dun APNs from apn db"
* changes: Change empty apn type in user entered APN to non-read-only types. Check for null mReadOnlyApnTypes. Disallow adding/editing dun APNs unless allowed by carrier.
This commit is contained in:
@@ -2982,6 +2982,8 @@
|
|||||||
<string name="error_mcc_not3">MCC field must be 3 digits.</string>
|
<string name="error_mcc_not3">MCC field must be 3 digits.</string>
|
||||||
<!-- APN error dialog messages: -->
|
<!-- APN error dialog messages: -->
|
||||||
<string name="error_mnc_not23">MNC field must be 2 or 3 digits.</string>
|
<string name="error_mnc_not23">MNC field must be 2 or 3 digits.</string>
|
||||||
|
<!-- APN error dialog messages: -->
|
||||||
|
<string name="error_adding_apn_type">Carrier does not allow adding APNs of type %s.</string>
|
||||||
<!-- The message of dialog indicated restoring default APN settings in progress -->
|
<!-- The message of dialog indicated restoring default APN settings in progress -->
|
||||||
<string name="restore_default_apn">Restoring default APN settings.</string>
|
<string name="restore_default_apn">Restoring default APN settings.</string>
|
||||||
<!-- APNs screen menu option to reset default APN settings -->
|
<!-- APNs screen menu option to reset default APN settings -->
|
||||||
|
@@ -52,6 +52,7 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
|||||||
import com.android.internal.telephony.PhoneConstants;
|
import com.android.internal.telephony.PhoneConstants;
|
||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.internal.util.ArrayUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -117,6 +118,7 @@ public class ApnEditor extends SettingsPreferenceFragment
|
|||||||
private String[] mReadOnlyApnTypes;
|
private String[] mReadOnlyApnTypes;
|
||||||
private String[] mReadOnlyApnFields;
|
private String[] mReadOnlyApnFields;
|
||||||
private boolean mReadOnlyApn;
|
private boolean mReadOnlyApn;
|
||||||
|
private String mUserEnteredApnType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Standard projection for the interesting columns of a normal note.
|
* Standard projection for the interesting columns of a normal note.
|
||||||
@@ -212,6 +214,24 @@ public class ApnEditor extends SettingsPreferenceFragment
|
|||||||
mReadOnlyApn = false;
|
mReadOnlyApn = false;
|
||||||
mReadOnlyApnTypes = null;
|
mReadOnlyApnTypes = null;
|
||||||
mReadOnlyApnFields = null;
|
mReadOnlyApnFields = null;
|
||||||
|
mUserEnteredApnType = 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);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (action.equals(Intent.ACTION_EDIT)) {
|
if (action.equals(Intent.ACTION_EDIT)) {
|
||||||
Uri uri = intent.getData();
|
Uri uri = intent.getData();
|
||||||
@@ -220,17 +240,6 @@ public class ApnEditor extends SettingsPreferenceFragment
|
|||||||
finish();
|
finish();
|
||||||
return;
|
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;
|
mUri = uri;
|
||||||
} else if (action.equals(Intent.ACTION_INSERT)) {
|
} else if (action.equals(Intent.ACTION_INSERT)) {
|
||||||
if (mFirstTime || icicle.getInt(SAVED_POS) == 0) {
|
if (mFirstTime || icicle.getInt(SAVED_POS) == 0) {
|
||||||
@@ -295,7 +304,7 @@ public class ApnEditor extends SettingsPreferenceFragment
|
|||||||
* @param apnTypes array of APN types. "*" indicates all types.
|
* @param apnTypes array of APN types. "*" indicates all types.
|
||||||
* @return true if all apn types are included in the array, false otherwise
|
* @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)) {
|
if (ArrayUtils.isEmpty(apnTypes)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -950,7 +959,7 @@ public class ApnEditor extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
callUpdate = setStringValueAndCheckIfDiff(values,
|
callUpdate = setStringValueAndCheckIfDiff(values,
|
||||||
Telephony.Carriers.TYPE,
|
Telephony.Carriers.TYPE,
|
||||||
checkNotSet(mApnType.getText()),
|
checkNotSet(getUserEnteredApnType()),
|
||||||
callUpdate,
|
callUpdate,
|
||||||
TYPE_INDEX);
|
TYPE_INDEX);
|
||||||
|
|
||||||
@@ -1052,6 +1061,25 @@ public class ApnEditor extends SettingsPreferenceFragment
|
|||||||
errorMsg = mRes.getString(R.string.error_mnc_not23);
|
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 (!ArrayUtils.isEmpty(mReadOnlyApnTypes)
|
||||||
|
&& 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) {
|
||||||
|
stringBuilder.delete(stringBuilder.length() - 2, stringBuilder.length());
|
||||||
|
}
|
||||||
|
errorMsg = String.format(mRes.getString(R.string.error_adding_apn_type),
|
||||||
|
stringBuilder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return errorMsg;
|
return errorMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1088,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 class ErrorDialog extends InstrumentedDialogFragment {
|
||||||
|
|
||||||
public static void showError(ApnEditor editor) {
|
public static void showError(ApnEditor editor) {
|
||||||
|
@@ -173,6 +173,15 @@ public class ApnSettings extends RestrictedSettingsFragment implements
|
|||||||
PersistableBundle b = configManager.getConfig();
|
PersistableBundle b = configManager.getConfig();
|
||||||
mHideImsApn = b.getBoolean(CarrierConfigManager.KEY_HIDE_IMS_APN_BOOL);
|
mHideImsApn = b.getBoolean(CarrierConfigManager.KEY_HIDE_IMS_APN_BOOL);
|
||||||
mAllowAddingApns = b.getBoolean(CarrierConfigManager.KEY_ALLOW_ADDING_APNS_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);
|
mUserManager = UserManager.get(activity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user