From aa4ac1e5b98f3b5f3d38ef13f5dc286a4a0fb642 Mon Sep 17 00:00:00 2001 From: Mattias Nilsson Date: Mon, 28 Feb 2022 18:49:55 +0100 Subject: [PATCH] Do not allow editing of mcc, mnc for carrier id APNs A user that is allowed to edit mcc, mnc or mvno data can break the APN list. If a carrier or OEM has added an APN that is matched with carrier id there is no need to edit those fields. Apn Editor should not throw any error when a user backs out of from a carrier id APN where mcc, mnc is empty. Disable editing of these fields and check for carrier id APN before adding error message. Test: Add carrier APN, insert sim and back out from ApnEditor Bug: 222103038 Change-Id: I4e86cdd3e8caaf3dbfefe9b9f82f11c2804577ff --- .../settings/network/apn/ApnEditor.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/network/apn/ApnEditor.java b/src/com/android/settings/network/apn/ApnEditor.java index 03db1b89be7..926c77e6530 100644 --- a/src/com/android/settings/network/apn/ApnEditor.java +++ b/src/com/android/settings/network/apn/ApnEditor.java @@ -149,6 +149,7 @@ public class ApnEditor extends SettingsPreferenceFragment private String[] mReadOnlyApnFields; private boolean mReadOnlyApn; private Uri mCarrierUri; + private boolean mIsCarrierIdApn; /** * APN types for data connections. These are usage categories for an APN @@ -227,7 +228,8 @@ public class ApnEditor extends SettingsPreferenceFragment Telephony.Carriers.MVNO_TYPE, // 21 Telephony.Carriers.MVNO_MATCH_DATA, // 22 Telephony.Carriers.EDITED_STATUS, // 23 - Telephony.Carriers.USER_EDITABLE //24 + Telephony.Carriers.USER_EDITABLE, // 24 + Telephony.Carriers.CARRIER_ID // 25 }; private static final int ID_INDEX = 0; @@ -262,6 +264,7 @@ public class ApnEditor extends SettingsPreferenceFragment private static final int MVNO_MATCH_DATA_INDEX = 22; private static final int EDITED_INDEX = 23; private static final int USER_EDITABLE_INDEX = 24; + private static final int CARRIER_ID_INDEX = 25; @Override public void onCreate(Bundle icicle) { @@ -312,6 +315,9 @@ public class ApnEditor extends SettingsPreferenceFragment } else { mApnData = new ApnData(sProjection.length); } + final int carrierId = mApnData.getInteger(CARRIER_ID_INDEX, + TelephonyManager.UNKNOWN_CARRIER_ID); + mIsCarrierIdApn = (carrierId > TelephonyManager.UNKNOWN_CARRIER_ID); final boolean isUserEdited = mApnData.getInteger(EDITED_INDEX, Telephony.Carriers.USER_EDITED) == Telephony.Carriers.USER_EDITED; @@ -326,6 +332,10 @@ public class ApnEditor extends SettingsPreferenceFragment } else if (!ArrayUtils.isEmpty(mReadOnlyApnFields)) { disableFields(mReadOnlyApnFields); } + // Make sure that a user cannot break carrier id APN matching + if (mIsCarrierIdApn) { + disableFieldsForCarrieridApn(); + } for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) { getPreferenceScreen().getPreference(i).setOnPreferenceChangeListener(this); @@ -517,6 +527,16 @@ public class ApnEditor extends SettingsPreferenceFragment mMvnoMatchData.setEnabled(false); } + /** + * Disables fields for a carrier id APN to avoid breaking the match criteria + */ + private void disableFieldsForCarrieridApn() { + mMcc.setEnabled(false); + mMnc.setEnabled(false); + mMvnoType.setEnabled(false); + mMvnoMatchData.setEnabled(false); + } + @Override public int getMetricsCategory() { return SettingsEnums.APN_EDITOR; @@ -1150,11 +1170,15 @@ public class ApnEditor extends SettingsPreferenceFragment final String apn = checkNotSet(mApn.getText()); final String mcc = checkNotSet(mMcc.getText()); final String mnc = checkNotSet(mMnc.getText()); - + boolean doNotCheckMccMnc = mIsCarrierIdApn && TextUtils.isEmpty(mcc) + && TextUtils.isEmpty(mnc); if (TextUtils.isEmpty(name)) { errorMsg = getResources().getString(R.string.error_name_empty); } else if (TextUtils.isEmpty(apn)) { errorMsg = getResources().getString(R.string.error_apn_empty); + } else if (doNotCheckMccMnc) { + Log.d(TAG, "validateApnData: carrier id APN does not have mcc/mnc defined"); + // no op, skip mcc mnc null check } else if (mcc == null || mcc.length() != 3) { errorMsg = getResources().getString(R.string.error_mcc_not3); } else if ((mnc == null || (mnc.length() & 0xFFFE) != 2)) {