update CdmaApnPreferenceController
Rename it to ApnPreferenceController since it support both Gsm and
Cdma. Also add check for Gsm sim card.
Bug: 118402844
Test: RunSettingsRoboTests
Change-Id: Iafe111bfdc8f8e7d91d104df652ae9b27c9b166f
diff --git a/res/xml/network_setting_fragment.xml b/res/xml/network_setting_fragment.xml
index 669a29c..459a269 100644
--- a/res/xml/network_setting_fragment.xml
+++ b/res/xml/network_setting_fragment.xml
@@ -117,16 +117,6 @@
android:dialogTitle="@string/cdma_subscription_dialogtitle"
settings:controller="com.android.settings.network.telephony.cdma.CdmaSubscriptionPreferenceController"/>
- <!--We want separate APN setting from reset of settings because we want user to change it with caution-->
- <PreferenceCategory
- android:key="category_cdma_apn_key">
- <com.android.settingslib.RestrictedPreference
- android:key="button_cdma_apn_key"
- android:title="@string/apn_settings"
- android:persistent="false"
- settings:controller="com.android.settings.network.telephony.cdma.CdmaApnPreferenceController"/>
- </PreferenceCategory>
-
<PreferenceCategory
android:key="network_operators_category_key"
android:title="@string/network_operator_category"
@@ -144,6 +134,14 @@
settings:controller="com.android.settings.network.telephony.gsm.OpenNetworkSelectPagePreferenceController"/>
</PreferenceCategory>
+ <!--We want separate APN setting from reset of settings because we want user to change it with caution-->
+ <com.android.settingslib.RestrictedPreference
+ android:key="telephony_apn_key"
+ android:persistent="false"
+ android:title="@string/apn_settings"
+ settings:allowDividerAbove="true"
+ settings:controller="com.android.settings.network.telephony.ApnPreferenceController"/>
+
<Preference
android:key="carrier_settings_key"
android:title="@string/carrier_settings_title"
diff --git a/src/com/android/settings/network/telephony/ApnPreferenceController.java b/src/com/android/settings/network/telephony/ApnPreferenceController.java
new file mode 100644
index 0000000..e02d9d4
--- /dev/null
+++ b/src/com/android/settings/network/telephony/ApnPreferenceController.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network.telephony;
+
+import static android.provider.Telephony.Carriers.ENFORCE_MANAGED_URI;
+
+import android.content.Context;
+import android.content.Intent;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.PersistableBundle;
+import android.provider.Settings;
+import android.telephony.CarrierConfigManager;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.network.ApnSettings;
+import com.android.settingslib.RestrictedLockUtilsInternal;
+import com.android.settingslib.RestrictedPreference;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
+
+/**
+ * Preference controller for "Apn settings"
+ */
+public class ApnPreferenceController extends BasePreferenceController implements
+ LifecycleObserver, OnStart, OnStop {
+
+ @VisibleForTesting
+ CarrierConfigManager mCarrierConfigManager;
+ private int mSubId;
+ private Preference mPreference;
+ private DpcApnEnforcedObserver mDpcApnEnforcedObserver;
+
+ public ApnPreferenceController(Context context, String key) {
+ super(context, key);
+ mCarrierConfigManager = new CarrierConfigManager(context);
+ mDpcApnEnforcedObserver = new DpcApnEnforcedObserver(new Handler(Looper.getMainLooper()));
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
+ final boolean isCdmaApn = MobileNetworkUtils.isCdmaOptions(mContext, mSubId)
+ && carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_APN_SETTING_CDMA_BOOL);
+ final boolean isGsmApn = MobileNetworkUtils.isGsmOptions(mContext, mSubId)
+ && carrierConfig.getBoolean(CarrierConfigManager.KEY_APN_EXPAND_BOOL);
+
+ return carrierConfig != null
+ && (isCdmaApn || isGsmApn)
+ ? AVAILABLE
+ : CONDITIONALLY_UNAVAILABLE;
+ }
+
+ @Override
+ public void onStart() {
+ mDpcApnEnforcedObserver.register(mContext);
+ }
+
+ @Override
+ public void onStop() {
+ mDpcApnEnforcedObserver.unRegister(mContext);
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ ((RestrictedPreference) mPreference).setDisabledByAdmin(
+ MobileNetworkUtils.isDpcApnEnforced(mContext)
+ ? RestrictedLockUtilsInternal.getDeviceOwner(mContext)
+ : null);
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (getPreferenceKey().equals(preference.getKey())) {
+ // This activity runs in phone process, we must use intent to start
+ final Intent intent = new Intent(Settings.ACTION_APN_SETTINGS);
+ // This will setup the Home and Search affordance
+ intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, true);
+ intent.putExtra(ApnSettings.SUB_ID, mSubId);
+ mContext.startActivity(intent);
+ return true;
+ }
+
+ return false;
+ }
+
+ public void init(int subId) {
+ mSubId = subId;
+ }
+
+ @VisibleForTesting
+ void setPreference(Preference preference) {
+ mPreference = preference;
+ }
+
+ private class DpcApnEnforcedObserver extends ContentObserver {
+ DpcApnEnforcedObserver(Handler handler) {
+ super(handler);
+ }
+
+ public void register(Context context) {
+ context.getContentResolver().registerContentObserver(ENFORCE_MANAGED_URI, false, this);
+
+ }
+
+ public void unRegister(Context context) {
+ context.getContentResolver().unregisterContentObserver(this);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ updateState(mPreference);
+ }
+ }
+}
diff --git a/src/com/android/settings/network/telephony/GsmUmtsOptions.java b/src/com/android/settings/network/telephony/GsmUmtsOptions.java
deleted file mode 100644
index 9954764..0000000
--- a/src/com/android/settings/network/telephony/GsmUmtsOptions.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.PersistableBundle;
-import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
-import android.telephony.TelephonyManager;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceFragmentCompat;
-import androidx.preference.PreferenceScreen;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneConstants;
-import com.android.settings.R;
-import com.android.settingslib.RestrictedLockUtilsInternal;
-import com.android.settingslib.RestrictedPreference;
-
-/**
- * List of Network-specific settings screens.
- */
-public class GsmUmtsOptions {
- private static final String LOG_TAG = "GsmUmtsOptions";
-
- private CarrierConfigManager mCarrierConfigManager;
- private RestrictedPreference mButtonAPNExpand;
- private Preference mCategoryAPNExpand;
- Preference mCarrierSettingPref;
-
- private static final String BUTTON_APN_EXPAND_KEY = "button_gsm_apn_key";
- private static final String CATEGORY_APN_EXPAND_KEY = "category_gsm_apn_key";
- private static final String BUTTON_CARRIER_SETTINGS_KEY = "carrier_settings_key";
-
- public static final String EXTRA_SUB_ID = "sub_id";
- private PreferenceFragmentCompat mPrefFragment;
- private PreferenceScreen mPrefScreen;
-
- public GsmUmtsOptions(PreferenceFragmentCompat prefFragment, PreferenceScreen prefScreen,
- final int subId) {
- final Context context = prefFragment.getContext();
- mPrefFragment = prefFragment;
- mPrefScreen = prefScreen;
- mCarrierConfigManager = new CarrierConfigManager(context);
- mPrefFragment.addPreferencesFromResource(R.xml.gsm_umts_options);
- mButtonAPNExpand = (RestrictedPreference) mPrefScreen.findPreference(BUTTON_APN_EXPAND_KEY);
- mCategoryAPNExpand = mPrefScreen.findPreference(CATEGORY_APN_EXPAND_KEY);
- mCarrierSettingPref = mPrefScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
-
- update(subId);
- }
-
- // Unlike mPrefFragment or mPrefScreen, subId may change during lifecycle of GsmUmtsOptions.
- // When that happens, we update GsmUmtsOptions with new parameters.
- protected void update(final int subId) {
- boolean addAPNExpand = true;
-
- boolean addCarrierSettings = true;
- final TelephonyManager telephonyManager = TelephonyManager.from(mPrefFragment.getContext())
- .createForSubscriptionId(subId);
- //TODO(b/115429509): Get phone from subId
- Phone phone = null;
- if (phone == null) return;
- if (telephonyManager.getPhoneType() != PhoneConstants.PHONE_TYPE_GSM) {
- log("Not a GSM phone");
- addAPNExpand = false;
- } else {
- log("Not a CDMA phone");
- PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
-
- // Determine which options to display. For GSM these are defaulted to true in
- // CarrierConfigManager, but they maybe overriden by DefaultCarrierConfigService or a
- // carrier app.
- // Note: these settings used to be controlled with overlays in
- // Telephony/res/values/config.xml
- if (!carrierConfig.getBoolean(CarrierConfigManager.KEY_APN_EXPAND_BOOL)
- && mCategoryAPNExpand != null) {
- addAPNExpand = false;
- }
-
- // Read platform settings for carrier settings
- addCarrierSettings = carrierConfig.getBoolean(
- CarrierConfigManager.KEY_CARRIER_SETTINGS_ENABLE_BOOL);
- }
-
- // Making no assumptions of whether they are added or removed at this point.
- // Calling add or remove explicitly to make sure they are updated.
-
- if (addAPNExpand) {
- log("update: addAPNExpand");
- mButtonAPNExpand.setDisabledByAdmin(
- MobileNetworkUtils.isDpcApnEnforced(mButtonAPNExpand.getContext())
- ? RestrictedLockUtilsInternal.getDeviceOwner(
- mButtonAPNExpand.getContext())
- : null);
- mButtonAPNExpand.setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- @Override
- public boolean onPreferenceClick(Preference preference) {
- MetricsLogger.action(mButtonAPNExpand.getContext(),
- MetricsEvent.ACTION_MOBILE_NETWORK_APN_SETTINGS);
- // We need to build the Intent by hand as the Preference Framework
- // does not allow to add an Intent with some extras into a Preference
- // XML file
- final Intent intent = new Intent(Settings.ACTION_APN_SETTINGS);
- // This will setup the Home and Search affordance
- intent.putExtra(":settings:show_fragment_as_subsetting", true);
- intent.putExtra(EXTRA_SUB_ID, subId);
- mPrefFragment.startActivity(intent);
- return true;
- }
- });
- mPrefScreen.addPreference(mCategoryAPNExpand);
- } else {
- mPrefScreen.removePreference(mCategoryAPNExpand);
- }
-
- if (addCarrierSettings) {
- mPrefScreen.addPreference(mCarrierSettingPref);
- } else {
- mPrefScreen.removePreference(mCarrierSettingPref);
- }
-
- }
-
- protected boolean preferenceTreeClick(Preference preference) {
- return false;
- }
-
- protected void log(String s) {
- android.util.Log.d(LOG_TAG, s);
- }
-}
\ No newline at end of file
diff --git a/src/com/android/settings/network/telephony/MobileNetworkFragment.java b/src/com/android/settings/network/telephony/MobileNetworkFragment.java
index 507fdf4..1e788f7 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkFragment.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkFragment.java
@@ -56,7 +56,6 @@
import com.android.internal.telephony.TelephonyIntents;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.network.telephony.cdma.CdmaApnPreferenceController;
import com.android.settings.network.telephony.cdma.CdmaSubscriptionPreferenceController;
import com.android.settings.network.telephony.cdma.CdmaSystemSelectPreferenceController;
import com.android.settings.network.telephony.gsm.AutoSelectPreferenceController;
@@ -128,9 +127,6 @@
private ImsManager mImsMgr;
private boolean mOkClicked;
- //GsmUmts options and Cdma options
- GsmUmtsOptions mGsmUmtsOptions;
-
private String mClickedPrefKey;
private boolean mShow4GForLTE;
private boolean mIsGlobalCdma;
@@ -159,9 +155,6 @@
/** TODO: Refactor and get rid of the if's using subclasses */
if (preference.getKey().equals(BUTTON_4G_LTE_KEY)) {
return true;
- } else if (mGsmUmtsOptions != null &&
- mGsmUmtsOptions.preferenceTreeClick(preference) == true) {
- return true;
} else if (TextUtils.equals(key, BUTTON_CDMA_SYSTEM_SELECT_KEY)
|| TextUtils.equals(key, BUTTON_CDMA_SUBSCRIPTION_KEY)) {
if (mTelephonyManager.getEmergencyCallbackMode()) {
@@ -213,7 +206,7 @@
use(MobileDataPreferenceController.class).init(getFragmentManager(), mSubId);
use(RoamingPreferenceController.class).init(getFragmentManager(), mSubId);
- use(CdmaApnPreferenceController.class).init(mSubId);
+ use(ApnPreferenceController.class).init(mSubId);
use(CarrierPreferenceController.class).init(mSubId);
use(DataUsagePreferenceController.class).init(mSubId);
use(PreferredNetworkModePreferenceController.class).init(mSubId);
@@ -693,11 +686,6 @@
// We don't want to re-create GsmUmtsOptions if already exists. Otherwise, the
// preferences inside it will also be re-created which causes unexpected behavior.
// For example, the open dialog gets dismissed or detached after pause / resume.
- if (mGsmUmtsOptions == null) {
- mGsmUmtsOptions = new GsmUmtsOptions(prefFragment, prefScreen, subId);
- } else {
- mGsmUmtsOptions.update(subId);
- }
}
private static Intent buildPhoneAccountConfigureIntent(
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaApnPreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaApnPreferenceController.java
deleted file mode 100644
index eaacdb2..0000000
--- a/src/com/android/settings/network/telephony/cdma/CdmaApnPreferenceController.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.network.telephony.cdma;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.PersistableBundle;
-import android.provider.Settings;
-import android.telephony.CarrierConfigManager;
-
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.SettingsActivity;
-import com.android.settings.network.ApnSettings;
-import com.android.settings.network.telephony.MobileNetworkUtils;
-import com.android.settingslib.RestrictedLockUtilsInternal;
-import com.android.settingslib.RestrictedPreference;
-
-/**
- * Preference controller for "CDMA Apn"
- */
-public class CdmaApnPreferenceController extends CdmaBasePreferenceController {
-
- private static final String CATEGORY_KEY = "category_cdma_apn_key";
- @VisibleForTesting
- CarrierConfigManager mCarrierConfigManager;
-
- public CdmaApnPreferenceController(Context context, String key) {
- super(context, key);
- mCarrierConfigManager = new CarrierConfigManager(context);
- }
-
- @Override
- public int getAvailabilityStatus() {
- final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId);
-
- return carrierConfig != null
- && carrierConfig.getBoolean(CarrierConfigManager.KEY_SHOW_APN_SETTING_CDMA_BOOL)
- && MobileNetworkUtils.isCdmaOptions(mContext, mSubId)
- ? AVAILABLE
- : CONDITIONALLY_UNAVAILABLE;
- }
-
- @Override
- public void displayPreference(PreferenceScreen screen) {
- super.displayPreference(screen);
- if (isAvailable()) {
- ((RestrictedPreference) mPreference).setDisabledByAdmin(
- MobileNetworkUtils.isDpcApnEnforced(mContext)
- ? RestrictedLockUtilsInternal.getDeviceOwner(mContext)
- : null);
- } else {
- screen.findPreference(CATEGORY_KEY).setVisible(false);
- }
- }
-
- @Override
- public boolean handlePreferenceTreeClick(Preference preference) {
- if (getPreferenceKey().equals(preference.getKey())) {
- // This activity runs in phone process, we must use intent to start
- final Intent intent = new Intent(Settings.ACTION_APN_SETTINGS);
- // This will setup the Home and Search affordance
- intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, true);
- intent.putExtra(ApnSettings.SUB_ID, mSubId);
- mContext.startActivity(intent);
- return true;
- }
-
- return false;
- }
-}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaApnPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/ApnPreferenceControllerTest.java
similarity index 83%
rename from tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaApnPreferenceControllerTest.java
rename to tests/robotests/src/com/android/settings/network/telephony/ApnPreferenceControllerTest.java
index 2aceda7..0fda51f 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/cdma/CdmaApnPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/ApnPreferenceControllerTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.settings.network.telephony.cdma;
+package com.android.settings.network.telephony;
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
@@ -47,7 +47,7 @@
import org.robolectric.RuntimeEnvironment;
@RunWith(SettingsRobolectricTestRunner.class)
-public class CdmaApnPreferenceControllerTest {
+public class ApnPreferenceControllerTest {
private static final int SUB_ID = 2;
@Mock
@@ -59,7 +59,7 @@
@Mock
private CarrierConfigManager mCarrierConfigManager;
- private CdmaApnPreferenceController mController;
+ private ApnPreferenceController mController;
private RestrictedPreference mPreference;
private Context mContext;
@@ -73,11 +73,12 @@
doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
doReturn(mInvalidTelephonyManager).when(mTelephonyManager).createForSubscriptionId(
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+ doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class);
mPreference = new RestrictedPreference(mContext);
- mController = new CdmaApnPreferenceController(mContext, "mobile_data");
+ mController = new ApnPreferenceController(mContext, "mobile_data");
mController.init(SUB_ID);
- mController.mPreference = mPreference;
+ mController.setPreference(mPreference);
mController.mCarrierConfigManager = mCarrierConfigManager;
mPreference.setKey(mController.getPreferenceKey());
}
@@ -103,6 +104,16 @@
}
@Test
+ public void getAvailabilityStatus_apnSettingsSupportedWithGsm_returnAvailable() {
+ doReturn(PhoneConstants.PHONE_TYPE_GSM).when(mTelephonyManager).getPhoneType();
+ final PersistableBundle bundle = new PersistableBundle();
+ bundle.putBoolean(CarrierConfigManager.KEY_APN_EXPAND_BOOL, true);
+ doReturn(bundle).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
+
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
+ }
+
+ @Test
public void handPreferenceTreeClick_fireIntent() {
ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);