Add network selection preferences
1. Toggle to decide whether to auto select
2. Preference to go to network selection page
Bug: 114749736
Test: RunSettingsRoboTests
Change-Id: Ie9d8e9353bf2a99b8cba1fb14d5a440a43fde66e
diff --git a/res/xml/gsm_umts_options.xml b/res/xml/gsm_umts_options.xml
index 1d1d4f3..cf56595 100644
--- a/res/xml/gsm_umts_options.xml
+++ b/res/xml/gsm_umts_options.xml
@@ -16,28 +16,6 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-
- <com.android.settings.network.telephony.NetworkOperators
- android:key="network_operators_category_key"
- android:title="@string/network_operator_category"
- android:persistent="false">
-
- <SwitchPreference
- android:key="button_auto_select_key"
- android:title="@string/select_automatically"
- android:persistent="false"/>
-
- <com.android.settings.network.telephony.NetworkSelectListPreference
- android:key="button_network_select_key"
- android:title="@string/network_select_title"
- android:persistent="false"/>
-
- <Preference
- android:key="button_choose_network_key"
- android:title="@string/choose_network_title"
- android:fragment="com.android.phone.NetworkSelectSetting" />
- </com.android.settings.network.telephony.NetworkOperators>
-
<!--We want separate APN setting from reset of settings because-->
<!--we want user to change it with caution.-->
<PreferenceCategory
diff --git a/res/xml/network_setting_fragment.xml b/res/xml/network_setting_fragment.xml
index f6b8bed..669a29c 100644
--- a/res/xml/network_setting_fragment.xml
+++ b/res/xml/network_setting_fragment.xml
@@ -127,6 +127,23 @@
settings:controller="com.android.settings.network.telephony.cdma.CdmaApnPreferenceController"/>
</PreferenceCategory>
+ <PreferenceCategory
+ android:key="network_operators_category_key"
+ android:title="@string/network_operator_category"
+ settings:controller="com.android.settings.widget.PreferenceCategoryController">
+
+ <SwitchPreference
+ android:key="auto_select_key"
+ android:title="@string/select_automatically"
+ settings:controller="com.android.settings.network.telephony.gsm.AutoSelectPreferenceController"/>
+
+ <Preference
+ android:key="choose_network_key"
+ android:title="@string/choose_network_title"
+ android:fragment="com.android.phone.NetworkSelectSetting"
+ settings:controller="com.android.settings.network.telephony.gsm.OpenNetworkSelectPagePreferenceController"/>
+ </PreferenceCategory>
+
<Preference
android:key="carrier_settings_key"
android:title="@string/carrier_settings_title"
diff --git a/src/com/android/settings/network/telephony/GsmUmtsOptions.java b/src/com/android/settings/network/telephony/GsmUmtsOptions.java
index 9b3df6b..9954764 100644
--- a/src/com/android/settings/network/telephony/GsmUmtsOptions.java
+++ b/src/com/android/settings/network/telephony/GsmUmtsOptions.java
@@ -46,8 +46,6 @@
private Preference mCategoryAPNExpand;
Preference mCarrierSettingPref;
- private NetworkOperators mNetworkOperator;
-
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";
@@ -65,12 +63,8 @@
mPrefFragment.addPreferencesFromResource(R.xml.gsm_umts_options);
mButtonAPNExpand = (RestrictedPreference) mPrefScreen.findPreference(BUTTON_APN_EXPAND_KEY);
mCategoryAPNExpand = mPrefScreen.findPreference(CATEGORY_APN_EXPAND_KEY);
- mNetworkOperator = (NetworkOperators) mPrefScreen
- .findPreference(NetworkOperators.CATEGORY_NETWORK_OPERATORS_KEY);
mCarrierSettingPref = mPrefScreen.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
- mNetworkOperator.initialize();
-
update(subId);
}
@@ -78,7 +72,7 @@
// When that happens, we update GsmUmtsOptions with new parameters.
protected void update(final int subId) {
boolean addAPNExpand = true;
- boolean addNetworkOperatorsCategory = true;
+
boolean addCarrierSettings = true;
final TelephonyManager telephonyManager = TelephonyManager.from(mPrefFragment.getContext())
.createForSubscriptionId(subId);
@@ -88,7 +82,6 @@
if (telephonyManager.getPhoneType() != PhoneConstants.PHONE_TYPE_GSM) {
log("Not a GSM phone");
addAPNExpand = false;
- mNetworkOperator.setEnabled(false);
} else {
log("Not a CDMA phone");
PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId);
@@ -102,20 +95,6 @@
&& mCategoryAPNExpand != null) {
addAPNExpand = false;
}
- if (!carrierConfig.getBoolean(
- CarrierConfigManager.KEY_OPERATOR_SELECTION_EXPAND_BOOL)) {
- addNetworkOperatorsCategory = false;
- }
-
- if (carrierConfig.getBoolean(CarrierConfigManager.KEY_CSP_ENABLED_BOOL)) {
- if (phone.isCspPlmnEnabled()) {
- log("[CSP] Enabling Operator Selection menu.");
- mNetworkOperator.setEnabled(true);
- } else {
- log("[CSP] Disabling Operator Selection menu.");
- addNetworkOperatorsCategory = false;
- }
- }
// Read platform settings for carrier settings
addCarrierSettings = carrierConfig.getBoolean(
@@ -154,13 +133,6 @@
mPrefScreen.removePreference(mCategoryAPNExpand);
}
- if (addNetworkOperatorsCategory) {
- mPrefScreen.addPreference(mNetworkOperator);
- mNetworkOperator.update(subId);
- } else {
- mPrefScreen.removePreference(mNetworkOperator);
- }
-
if (addCarrierSettings) {
mPrefScreen.addPreference(mCarrierSettingPref);
} else {
@@ -170,11 +142,10 @@
}
protected boolean preferenceTreeClick(Preference preference) {
- return mNetworkOperator.preferenceTreeClick(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 4b1e27a..507fdf4 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkFragment.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkFragment.java
@@ -45,7 +45,6 @@
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceScreen;
@@ -60,11 +59,15 @@
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;
+import com.android.settings.network.telephony.gsm.OpenNetworkSelectPagePreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
+import com.android.settings.widget.PreferenceCategoryController;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
@@ -219,6 +222,15 @@
use(EuiccPreferenceController.class).init(mSubId);
use(WifiCallingPreferenceController.class).init(mSubId);
+ final OpenNetworkSelectPagePreferenceController openNetworkSelectPagePreferenceController =
+ use(OpenNetworkSelectPagePreferenceController.class).init(mSubId);
+ final AutoSelectPreferenceController autoSelectPreferenceController =
+ use(AutoSelectPreferenceController.class)
+ .init(mSubId)
+ .addListener(openNetworkSelectPagePreferenceController);
+ use(PreferenceCategoryController.class).setChildren(
+ Arrays.asList(autoSelectPreferenceController));
+
mCdmaSystemSelectPreferenceController = use(CdmaSystemSelectPreferenceController.class);
mCdmaSystemSelectPreferenceController.init(getPreferenceManager(), mSubId);
mCdmaSubscriptionPreferenceController = use(CdmaSubscriptionPreferenceController.class);
@@ -468,10 +480,6 @@
if (ps != null) {
ps.setEnabled(hasActiveSubscriptions);
}
- ps = findPreference(NetworkOperators.CATEGORY_NETWORK_OPERATORS_KEY);
- if (ps != null) {
- ps.setEnabled(hasActiveSubscriptions);
- }
ps = findPreference(BUTTON_CARRIER_SETTINGS_KEY);
if (ps != null) {
ps.setEnabled(hasActiveSubscriptions);
@@ -480,20 +488,6 @@
if (ps != null) {
ps.setEnabled(hasActiveSubscriptions);
}
- ps = findPreference(NetworkOperators.BUTTON_AUTO_SELECT_KEY);
- if (ps != null) {
- ps.setSummary(null);
- if (mTelephonyManager.getServiceState().getRoaming()) {
- ps.setEnabled(true);
- } else {
- ps.setEnabled(!mOnlyAutoSelectInHomeNW);
- if (mOnlyAutoSelectInHomeNW) {
- ps.setSummary(getResources().getString(
- R.string.manual_mode_disallowed_summary,
- mTelephonyManager.getSimOperatorName()));
- }
- }
- }
}
@Override
@@ -605,17 +599,7 @@
updateGsmUmtsOptions(this, prefSet, mSubId);
- PreferenceCategory networkOperatorCategory =
- (PreferenceCategory) prefSet.findPreference(
- NetworkOperators.CATEGORY_NETWORK_OPERATORS_KEY);
Preference carrierSettings = prefSet.findPreference(BUTTON_CARRIER_SETTINGS_KEY);
- if (networkOperatorCategory != null) {
- if (enable) {
- networkOperatorCategory.setEnabled(true);
- } else {
- prefSet.removePreference(networkOperatorCategory);
- }
- }
if (carrierSettings != null) {
prefSet.removePreference(carrierSettings);
}
@@ -689,12 +673,6 @@
if (preference == null) {
return MetricsProto.MetricsEvent.VIEW_UNKNOWN;
} else if (preference == preferenceScreen
- .findPreference(NetworkOperators.BUTTON_AUTO_SELECT_KEY)) {
- return MetricsProto.MetricsEvent.ACTION_MOBILE_NETWORK_AUTO_SELECT_NETWORK_TOGGLE;
- } else if (preference == preferenceScreen
- .findPreference(NetworkOperators.BUTTON_NETWORK_SELECT_KEY)) {
- return MetricsProto.MetricsEvent.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK;
- } else if (preference == preferenceScreen
.findPreference(BUTTON_CDMA_SYSTEM_SELECT_KEY)) {
return MetricsProto.MetricsEvent.ACTION_MOBILE_NETWORK_CDMA_SYSTEM_SELECT;
} else if (preference == preferenceScreen
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index fca523a..b43cd3a 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -29,6 +29,8 @@
import android.provider.Settings;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
+import android.telephony.CarrierConfigManager;
+import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -275,15 +277,43 @@
return false;
}
+ /**
+ * return {@code true} if we need show Gsm related settings
+ */
public static boolean isGsmOptions(Context context, int subId) {
if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
return false;
}
+ if (isGsmBasicOptions(context, subId)) {
+ return true;
+ }
+ final int settingsNetworkMode = android.provider.Settings.Global.getInt(
+ context.getContentResolver(),
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + subId,
+ Phone.PREFERRED_NT_MODE);
+ if (isWorldMode(context, subId)) {
+ if (settingsNetworkMode == TelephonyManager.NETWORK_MODE_LTE_CDMA_EVDO
+ || settingsNetworkMode == TelephonyManager.NETWORK_MODE_LTE_GSM_WCDMA) {
+ return true;
+ } else if (settingsNetworkMode == TelephonyManager.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA
+ && !MobileNetworkUtils.isTdscdmaSupported(context, subId)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private static boolean isGsmBasicOptions(Context context, int subId) {
final TelephonyManager telephonyManager = TelephonyManager.from(context)
.createForSubscriptionId(subId);
+ final PersistableBundle carrierConfig = context.getSystemService(
+ CarrierConfigManager.class).getConfigForSubId(subId);
if (telephonyManager.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) {
return true;
+ } else if (carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) {
+ return true;
}
return false;
@@ -318,6 +348,39 @@
return worldModeOn;
}
+ /**
+ * Return {@code true} if we need show settings for network selection(i.e. Verizon)
+ */
+ public static boolean shouldDisplayNetworkSelectOptions(Context context, int subId) {
+ final TelephonyManager telephonyManager = TelephonyManager.from(context)
+ .createForSubscriptionId(subId);
+ final PersistableBundle carrierConfig = context.getSystemService(
+ CarrierConfigManager.class).getConfigForSubId(subId);
+ if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ || !carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_OPERATOR_SELECTION_EXPAND_BOOL)
+ || (carrierConfig.getBoolean(CarrierConfigManager.KEY_CSP_ENABLED_BOOL)
+ && !telephonyManager.isManualNetworkSelectionAllowed())) {
+ return false;
+ }
+
+ if (isGsmBasicOptions(context, subId)) {
+ return true;
+ }
+
+ final int settingsNetworkMode = android.provider.Settings.Global.getInt(
+ context.getContentResolver(),
+ android.provider.Settings.Global.PREFERRED_NETWORK_MODE + subId,
+ Phone.PREFERRED_NT_MODE);
+ if (isWorldMode(context, subId)) {
+ if (settingsNetworkMode == TelephonyManager.NETWORK_MODE_LTE_GSM_WCDMA) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
public static boolean isShow4GForLTE(Context context) {
//TODO(b/117882862): move this to framework
try {
diff --git a/src/com/android/settings/network/telephony/NetworkOperators.java b/src/com/android/settings/network/telephony/NetworkOperators.java
deleted file mode 100644
index 7014820..0000000
--- a/src/com/android/settings/network/telephony/NetworkOperators.java
+++ /dev/null
@@ -1,301 +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.app.ProgressDialog;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Handler;
-import android.os.Message;
-import android.telephony.ServiceState;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.Toast;
-
-import androidx.preference.Preference;
-import androidx.preference.PreferenceCategory;
-import androidx.preference.TwoStatePreference;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settingslib.utils.ThreadUtils;
-
-/**
- * "Networks" settings UI for the Phone app.
- */
-public class NetworkOperators extends PreferenceCategory
- implements Preference.OnPreferenceChangeListener {
-
- private static final String LOG_TAG = "NetworkOperators";
- private static final boolean DBG = true;
-
- private static final int EVENT_AUTO_SELECT_DONE = 100;
- private static final int EVENT_GET_NETWORK_SELECTION_MODE_DONE = 200;
-
- //String keys for preference lookup
- public static final String BUTTON_NETWORK_SELECT_KEY = "button_network_select_key";
- public static final String BUTTON_AUTO_SELECT_KEY = "button_auto_select_key";
- public static final String BUTTON_CHOOSE_NETWORK_KEY = "button_choose_network_key";
- public static final String CATEGORY_NETWORK_OPERATORS_KEY = "network_operators_category_key";
-
- //preference objects
- private NetworkSelectListPreference mNetworkSelect;
- private TwoStatePreference mAutoSelect;
- private Preference mChooseNetwork;
- private ProgressDialog mProgressDialog;
-
- private int mSubId;
- private TelephonyManager mTelephonyManager;
-
- // There's two sets of Auto-Select UI in this class.
- // If {@code com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI} set as true
- // {@link mChooseNetwork} will be used, otherwise {@link mNetworkSelect} will be used.
- boolean mEnableNewManualSelectNetworkUI;
-
- public NetworkOperators(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public NetworkOperators(Context context) {
- super(context);
- }
-
- /**
- * Initialize NetworkOperators instance.
- */
- public void initialize() {
- mEnableNewManualSelectNetworkUI = getContext().getResources().getBoolean(
- com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
- mAutoSelect = (TwoStatePreference) findPreference(BUTTON_AUTO_SELECT_KEY);
- mChooseNetwork = findPreference(BUTTON_CHOOSE_NETWORK_KEY);
- mNetworkSelect = (NetworkSelectListPreference) findPreference(BUTTON_NETWORK_SELECT_KEY);
- if (mEnableNewManualSelectNetworkUI) {
- removePreference(mNetworkSelect);
- } else {
- removePreference(mChooseNetwork);
- }
- mProgressDialog = new ProgressDialog(getContext());
- mTelephonyManager = TelephonyManager.from(getContext());
- }
-
- /**
- * Update NetworkOperators instance if like subId is updated.
- *
- * @param subId Corresponding subscription ID of this network.
- */
- protected void update(final int subId) {
- mSubId = subId;
- mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId);
-
- if (mAutoSelect != null) {
- mAutoSelect.setOnPreferenceChangeListener(this);
- }
-
- if (mEnableNewManualSelectNetworkUI) {
- if (mChooseNetwork != null) {
- ServiceState ss = mTelephonyManager.getServiceState();
- if (ss != null && ss.getState() == ServiceState.STATE_IN_SERVICE) {
- mChooseNetwork.setSummary(mTelephonyManager.getNetworkOperatorName());
- } else {
- mChooseNetwork.setSummary(R.string.network_disconnected);
- }
- }
- } else {
- if (mNetworkSelect != null) {
- mNetworkSelect.initialize(mSubId, this, mProgressDialog);
- }
- }
- getNetworkSelectionMode();
- }
-
- /**
- * Implemented to support onPreferenceChangeListener to look for preference
- * changes specifically on auto select button.
- *
- * @param preference is the preference to be changed, should be auto select button.
- * @param newValue should be the value of whether autoSelect is checked.
- */
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- if (preference == mAutoSelect) {
- boolean autoSelect = (Boolean) newValue;
- if (DBG) logd("onPreferenceChange autoSelect: " + String.valueOf(autoSelect));
- selectNetworkAutomatic(autoSelect);
- MetricsLogger.action(getContext(),
- MetricsEvent.ACTION_MOBILE_NETWORK_AUTO_SELECT_NETWORK_TOGGLE, autoSelect);
- return true;
- }
- return false;
- }
-
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case EVENT_AUTO_SELECT_DONE:
- mAutoSelect.setEnabled(true);
- dismissProgressBar();
-
- boolean isSuccessed = (boolean) msg.obj;
-
- if (isSuccessed) {
- if (DBG) logd("automatic network selection: succeeded!");
- displayNetworkSelectionSucceeded();
- } else {
- if (DBG) logd("automatic network selection: failed!");
- displayNetworkSelectionFailed();
- }
-
- break;
- case EVENT_GET_NETWORK_SELECTION_MODE_DONE:
- int networkSelectionMode = msg.arg1;
- if (networkSelectionMode == TelephonyManager.NETWORK_SELECTION_MODE_UNKNOWN) {
- if (DBG) logd("get network selection mode: failed!");
- } else {
- boolean autoSelect = networkSelectionMode
- == TelephonyManager.NETWORK_SELECTION_MODE_AUTO;
- if (DBG) {
- logd("get network selection mode: "
- + (autoSelect ? "auto" : "manual") + " selection");
- }
- if (mAutoSelect != null) {
- mAutoSelect.setChecked(autoSelect);
- }
- if (mEnableNewManualSelectNetworkUI) {
- if (mChooseNetwork != null) {
- mChooseNetwork.setEnabled(!autoSelect);
- }
- } else {
- if (mNetworkSelect != null) {
- mNetworkSelect.setEnabled(!autoSelect);
- }
- }
- }
- }
- return;
- }
- };
-
- // Used by both mAutoSelect and mNetworkSelect buttons.
- protected void displayNetworkSelectionFailed() {
- Toast.makeText(getContext(), R.string.connect_later, Toast.LENGTH_LONG).show();
- }
-
- // Used by both mAutoSelect and mNetworkSelect buttons.
- protected void displayNetworkSelectionSucceeded() {
- Toast.makeText(getContext(), R.string.registration_done, Toast.LENGTH_LONG).show();
- }
-
- private void selectNetworkAutomatic(boolean autoSelect) {
- if (DBG) logd("selectNetworkAutomatic: " + String.valueOf(autoSelect));
-
- if (autoSelect) {
- if (mEnableNewManualSelectNetworkUI) {
- if (mChooseNetwork != null) {
- mChooseNetwork.setEnabled(!autoSelect);
- }
- } else {
- if (mNetworkSelect != null) {
- mNetworkSelect.setEnabled(!autoSelect);
- }
- }
- if (DBG) logd("select network automatically...");
- showAutoSelectProgressBar();
- mAutoSelect.setEnabled(false);
- if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
- ThreadUtils.postOnBackgroundThread(() -> {
- mTelephonyManager.setNetworkSelectionModeAutomatic();
- // Because TelephonyManager#setNetworkSelectionModeAutomatic doesn't have a
- // return value, we query the current network selection mode to tell if the
- // TelephonyManager#setNetworkSelectionModeAutomatic is successed.
- int networkSelectionMode = mTelephonyManager.getNetworkSelectionMode();
- Message msg = mHandler.obtainMessage(EVENT_AUTO_SELECT_DONE);
- msg.obj = networkSelectionMode == TelephonyManager.NETWORK_SELECTION_MODE_AUTO;
- msg.sendToTarget();
- });
- }
- } else {
- if (mEnableNewManualSelectNetworkUI) {
- if (mChooseNetwork != null) {
- // Open the choose Network page automatically when user turn off the auto-select
- openChooseNetworkPage();
- }
- } else {
- if (mNetworkSelect != null) {
- mNetworkSelect.onClick();
- }
- }
- }
- }
-
- protected void getNetworkSelectionMode() {
- if (DBG) logd("getting network selection mode...");
- ThreadUtils.postOnBackgroundThread(() -> {
- int networkSelectionMode = mTelephonyManager.getNetworkSelectionMode();
- Message msg = mHandler.obtainMessage(EVENT_GET_NETWORK_SELECTION_MODE_DONE);
- msg.arg1 = networkSelectionMode;
- msg.sendToTarget();
- });
- }
-
- private void dismissProgressBar() {
- if (mProgressDialog != null && mProgressDialog.isShowing()) {
- mProgressDialog.dismiss();
- }
- }
-
- private void showAutoSelectProgressBar() {
- mProgressDialog.setMessage(
- getContext().getResources().getString(R.string.register_automatically));
- mProgressDialog.setCanceledOnTouchOutside(false);
- mProgressDialog.setCancelable(false);
- mProgressDialog.setIndeterminate(true);
- mProgressDialog.show();
- }
-
- /**
- * Open the Choose network page via {@alink NetworkSelectSettingActivity}
- */
- public void openChooseNetworkPage() {
- //TODO(b/114749736): Build intent without calling static method
- Intent intent = new Intent();
- getContext().startActivity(intent);
- }
-
- protected boolean preferenceTreeClick(Preference preference) {
- if (mEnableNewManualSelectNetworkUI) {
- if (DBG) logd("enable New AutoSelectNetwork UI");
- if (preference == mChooseNetwork) {
- openChooseNetworkPage();
- }
- return (preference == mAutoSelect || preference == mChooseNetwork);
- } else {
- return (preference == mAutoSelect || preference == mNetworkSelect);
- }
- }
-
- private void logd(String msg) {
- Log.d(LOG_TAG, "[NetworksList] " + msg);
- }
-
- private void loge(String msg) {
- Log.e(LOG_TAG, "[NetworksList] " + msg);
- }
-}
diff --git a/src/com/android/settings/network/telephony/NetworkSelectListPreference.java b/src/com/android/settings/network/telephony/NetworkSelectListPreference.java
deleted file mode 100644
index ceb0efa..0000000
--- a/src/com/android/settings/network/telephony/NetworkSelectListPreference.java
+++ /dev/null
@@ -1,506 +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.app.ProgressDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.AsyncTask;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.telephony.CellInfo;
-import android.telephony.CellInfoCdma;
-import android.telephony.CellInfoGsm;
-import android.telephony.CellInfoLte;
-import android.telephony.CellInfoWcdma;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
-import android.text.BidiFormatter;
-import android.text.TextDirectionHeuristics;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.Toast;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.telephony.OperatorInfo;
-import com.android.settings.R;
-import com.android.settingslib.utils.ThreadUtils;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import androidx.preference.ListPreference;
-import androidx.preference.Preference;
-
-
-/**
- * "Networks" preference in "Mobile network" settings UI for the Phone app.
- * It's used to manually search and choose mobile network. Enabled only when
- * autoSelect preference is turned off.
- */
-public class NetworkSelectListPreference extends ListPreference
- implements DialogInterface.OnCancelListener,
- Preference.OnPreferenceChangeListener{
-
- private static final String LOG_TAG = "networkSelect";
- private static final boolean DBG = true;
-
- private static final int EVENT_MANUALLY_NETWORK_SELECTION_DONE = 1;
- private static final int EVENT_NETWORK_SCAN_RESULTS = 2;
- private static final int EVENT_NETWORK_SCAN_COMPLETED = 3;
- private static final int EVENT_NETWORK_SCAN_ERROR = 4;
-
- //dialog ids
- private static final int DIALOG_NETWORK_SELECTION = 100;
- private static final int DIALOG_NETWORK_LIST_LOAD = 200;
-
- private final ExecutorService mNetworkScanExecutor = Executors.newFixedThreadPool(1);
-
- private List<CellInfo> mCellInfoList;
- private CellInfo mCellInfo;
-
- private int mSubId;
- private TelephonyManager mTelephonyManager;
- private NetworkScanHelper mNetworkScanHelper;
- private NetworkOperators mNetworkOperators;
- private List<String> mForbiddenPlmns;
-
- private ProgressDialog mProgressDialog;
- public NetworkSelectListPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public NetworkSelectListPreference(Context context, AttributeSet attrs, int defStyleAttr,
- int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- }
-
- @Override
- protected void onClick() {
- showProgressDialog(DIALOG_NETWORK_LIST_LOAD);
- TelephonyManager telephonyManager = (TelephonyManager)
- getContext().getSystemService(Context.TELEPHONY_SERVICE);
- new AsyncTask<Void, Void, List<String>>() {
- @Override
- protected List<String> doInBackground(Void... voids) {
- String[] forbiddenPlmns = telephonyManager.getForbiddenPlmns();
- return forbiddenPlmns != null ? Arrays.asList(forbiddenPlmns) : null;
- }
-
- @Override
- protected void onPostExecute(List<String> result) {
- mForbiddenPlmns = result;
- loadNetworksList();
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
-
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case EVENT_MANUALLY_NETWORK_SELECTION_DONE:
- if (DBG) logd("hideProgressPanel");
- dismissProgressDialog();
-
- boolean isSuccessed = (boolean) msg.obj;
- if (isSuccessed) {
- if (DBG) {
- logd("manual network selection: succeeded! "
- + getNetworkTitle(mCellInfo));
- }
- mNetworkOperators.displayNetworkSelectionSucceeded();
- } else {
- if (DBG) logd("manual network selection: failed!");
- mNetworkOperators.displayNetworkSelectionFailed();
- }
- mNetworkOperators.getNetworkSelectionMode();
- break;
-
- case EVENT_NETWORK_SCAN_RESULTS:
- List<CellInfo> results = (List<CellInfo>) msg.obj;
- results.removeIf(cellInfo -> cellInfo == null);
- mCellInfoList = new ArrayList<>(results);
- if (DBG) logd("CALLBACK_SCAN_RESULTS" + mCellInfoList.toString());
- break;
-
- case EVENT_NETWORK_SCAN_COMPLETED:
- if (DBG) logd("scan complete, load the cellInfosList");
- dismissProgressDialog();
- networksListLoaded();
- break;
- case EVENT_NETWORK_SCAN_ERROR:
- dismissProgressDialog();
- displayNetworkQueryFailed();
- mNetworkOperators.getNetworkSelectionMode();
- break;
- }
- return;
- }
- };
-
- private final NetworkScanHelper.NetworkScanCallback mCallback =
- new NetworkScanHelper.NetworkScanCallback() {
- public void onResults(List<CellInfo> results) {
- if (DBG) logd("get scan results: " + results.toString());
- Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_RESULTS, results);
- msg.sendToTarget();
- }
-
- public void onComplete() {
- if (DBG) logd("network scan completed.");
- Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED);
- msg.sendToTarget();
- }
-
- public void onError(int error) {
- if (DBG) logd("network scan error.");
- Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_ERROR);
- msg.sendToTarget();
- }
- };
-
- @Override
- //implemented for DialogInterface.OnCancelListener
- public void onCancel(DialogInterface dialog) {
- if (DBG) logd("user manually close the dialog");
- mNetworkScanHelper.stopNetworkQuery();
-
- // If cancelled, we query NetworkSelectMode and update states of AutoSelect button.
- mNetworkOperators.getNetworkSelectionMode();
- }
-
- //TODO(b/114749736): move this logic to preference controller
- protected void onDialogClosed(boolean positiveResult) {
- // If dismissed, we query NetworkSelectMode and update states of AutoSelect button.
- if (!positiveResult) {
- mNetworkOperators.getNetworkSelectionMode();
- }
- }
-
- // This initialize method needs to be called for this preference to work properly.
- protected void initialize(int subId, NetworkOperators networkOperators,
- ProgressDialog progressDialog) {
- mSubId = subId;
- mNetworkOperators = networkOperators;
- // This preference should share the same progressDialog with networkOperators category.
- mProgressDialog = progressDialog;
-
- mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId);
- mNetworkScanHelper = new NetworkScanHelper(
- mTelephonyManager, mCallback, mNetworkScanExecutor);
-
- setSummary(mTelephonyManager.getNetworkOperatorName());
-
- setOnPreferenceChangeListener(this);
- }
-
- @Override
- protected void onPrepareForRemoval() {
- destroy();
- super.onPrepareForRemoval();
- }
-
- private void destroy() {
- dismissProgressDialog();
-
- if (mNetworkScanHelper != null) {
- mNetworkScanHelper.stopNetworkQuery();
- }
-
- mNetworkScanExecutor.shutdown();
- }
-
- private void displayEmptyNetworkList() {
- Toast.makeText(getContext(), R.string.empty_networks_list, Toast.LENGTH_LONG).show();
- }
-
- private void displayNetworkQueryFailed() {
- Toast.makeText(getContext(), R.string.network_query_error, Toast.LENGTH_LONG).show();
- }
-
- private void loadNetworksList() {
- if (DBG) logd("load networks list...");
- mNetworkScanHelper.startNetworkScan(
- NetworkScanHelper.NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS);
- }
-
- private void networksListLoaded() {
- if (DBG) logd("networks list loaded");
-
- mNetworkOperators.getNetworkSelectionMode();
- if (mCellInfoList != null) {
- // create a preference for each item in the list.
- // just use the operator name instead of the mildly
- // confusing mcc/mnc.
- List<CharSequence> networkEntriesList = new ArrayList<>();
- List<CharSequence> networkEntryValuesList = new ArrayList<>();
- for (CellInfo cellInfo: mCellInfoList) {
- // Display each operator name only once.
- String networkTitle = getNetworkTitle(cellInfo);
- if (CellInfoUtil.isForbidden(cellInfo, mForbiddenPlmns)) {
- networkTitle += " "
- + getContext().getResources().getString(R.string.forbidden_network);
- }
- networkEntriesList.add(networkTitle);
- networkEntryValuesList.add(getOperatorNumeric(cellInfo));
- }
- setEntries(networkEntriesList.toArray(new CharSequence[networkEntriesList.size()]));
- setEntryValues(networkEntryValuesList.toArray(
- new CharSequence[networkEntryValuesList.size()]));
-
- super.onClick();
- } else {
- displayEmptyNetworkList();
- }
- }
-
- private void dismissProgressDialog() {
- if (mProgressDialog != null && mProgressDialog.isShowing()) {
- try {
- mProgressDialog.dismiss();
- } catch (IllegalArgumentException ex) {
- loge("Can't close the progress dialog " + ex);
- }
- }
- }
-
- private void showProgressDialog(int id) {
- if (mProgressDialog == null) {
- mProgressDialog = new ProgressDialog(getContext());
- } else {
- // Dismiss progress bar if it's showing now.
- dismissProgressDialog();
- }
-
- switch (id) {
- case DIALOG_NETWORK_SELECTION:
- final String networkSelectMsg = getContext().getResources()
- .getString(R.string.register_on_network,
- getNetworkTitle(mCellInfo));
- mProgressDialog.setMessage(networkSelectMsg);
- mProgressDialog.setCanceledOnTouchOutside(false);
- mProgressDialog.setCancelable(false);
- mProgressDialog.setIndeterminate(true);
- break;
- case DIALOG_NETWORK_LIST_LOAD:
- mProgressDialog.setMessage(
- getContext().getResources().getString(R.string.load_networks_progress));
- mProgressDialog.setCanceledOnTouchOutside(false);
- mProgressDialog.setCancelable(true);
- mProgressDialog.setIndeterminate(false);
- mProgressDialog.setOnCancelListener(this);
- break;
- default:
- }
- mProgressDialog.show();
- }
-
- /**
- * Implemented to support onPreferenceChangeListener to look for preference
- * changes specifically on this button.
- *
- * @param preference is the preference to be changed, should be network select button.
- * @param newValue should be the value of the selection as index of operators.
- */
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- int operatorIndex = findIndexOfValue((String) newValue);
- mCellInfo = mCellInfoList.get(operatorIndex);
- if (DBG) logd("selected network: " + mCellInfo.toString());
-
- MetricsLogger.action(getContext(),
- MetricsEvent.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK);
-
- if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
- ThreadUtils.postOnBackgroundThread(() -> {
- final OperatorInfo operatorInfo = getOperatorInfoFromCellInfo(mCellInfo);
- if (DBG) logd("manually selected network: " + operatorInfo.toString());
- boolean isSuccessed = mTelephonyManager.setNetworkSelectionModeManual(
- operatorInfo, true /* persistSelection */);
- Message msg = mHandler.obtainMessage(EVENT_MANUALLY_NETWORK_SELECTION_DONE);
- msg.obj = isSuccessed;
- msg.sendToTarget();
- });
- } else {
- loge("Error selecting network, subscription Id is invalid " + mSubId);
- }
-
- return true;
- }
-
- /**
- * Returns the title of the network obtained in the manual search.
- *
- * @param cellInfo contains the information of the network.
- * @return Long Name if not null/empty, otherwise Short Name if not null/empty,
- * else MCCMNC string.
- */
- private String getNetworkTitle(CellInfo cellInfo) {
- OperatorInfo ni = getOperatorInfoFromCellInfo(cellInfo);
-
- if (!TextUtils.isEmpty(ni.getOperatorAlphaLong())) {
- return ni.getOperatorAlphaLong();
- } else if (!TextUtils.isEmpty(ni.getOperatorAlphaShort())) {
- return ni.getOperatorAlphaShort();
- } else {
- BidiFormatter bidiFormatter = BidiFormatter.getInstance();
- return bidiFormatter.unicodeWrap(ni.getOperatorNumeric(), TextDirectionHeuristics.LTR);
- }
- }
-
- /**
- * Returns the operator numeric (MCCMNC) obtained in the manual search.
- *
- * @param cellInfo contains the information of the network.
- * @return MCCMNC string.
- */
- private String getOperatorNumeric(CellInfo cellInfo) {
- return getOperatorInfoFromCellInfo(cellInfo).getOperatorNumeric();
- }
-
- /**
- * Wrap a cell info into an operator info.
- */
- private OperatorInfo getOperatorInfoFromCellInfo(CellInfo cellInfo) {
- OperatorInfo oi;
- if (cellInfo instanceof CellInfoLte) {
- CellInfoLte lte = (CellInfoLte) cellInfo;
- oi = new OperatorInfo(
- (String) lte.getCellIdentity().getOperatorAlphaLong(),
- (String) lte.getCellIdentity().getOperatorAlphaShort(),
- lte.getCellIdentity().getMobileNetworkOperator());
- } else if (cellInfo instanceof CellInfoWcdma) {
- CellInfoWcdma wcdma = (CellInfoWcdma) cellInfo;
- oi = new OperatorInfo(
- (String) wcdma.getCellIdentity().getOperatorAlphaLong(),
- (String) wcdma.getCellIdentity().getOperatorAlphaShort(),
- wcdma.getCellIdentity().getMobileNetworkOperator());
- } else if (cellInfo instanceof CellInfoGsm) {
- CellInfoGsm gsm = (CellInfoGsm) cellInfo;
- oi = new OperatorInfo(
- (String) gsm.getCellIdentity().getOperatorAlphaLong(),
- (String) gsm.getCellIdentity().getOperatorAlphaShort(),
- gsm.getCellIdentity().getMobileNetworkOperator());
- } else if (cellInfo instanceof CellInfoCdma) {
- CellInfoCdma cdma = (CellInfoCdma) cellInfo;
- oi = new OperatorInfo(
- (String) cdma.getCellIdentity().getOperatorAlphaLong(),
- (String) cdma.getCellIdentity().getOperatorAlphaShort(),
- "" /* operator numeric */);
- } else {
- oi = new OperatorInfo("", "", "");
- }
- return oi;
- }
-
- @Override
- protected Parcelable onSaveInstanceState() {
- final Parcelable superState = super.onSaveInstanceState();
- if (isPersistent()) {
- // No need to save instance state since it's persistent
- return superState;
- }
-
- final SavedState myState = new SavedState(superState);
- myState.mDialogListEntries = getEntries();
- myState.mDialogListEntryValues = getEntryValues();
- myState.mCellInfoList = mCellInfoList;
- return myState;
- }
-
- @Override
- protected void onRestoreInstanceState(Parcelable state) {
- if (state == null || !state.getClass().equals(SavedState.class)) {
- // Didn't save state for us in onSaveInstanceState
- super.onRestoreInstanceState(state);
- return;
- }
-
- SavedState myState = (SavedState) state;
-
- if (getEntries() == null && myState.mDialogListEntries != null) {
- setEntries(myState.mDialogListEntries);
- }
- if (getEntryValues() == null && myState.mDialogListEntryValues != null) {
- setEntryValues(myState.mDialogListEntryValues);
- }
- if (mCellInfoList == null && myState.mCellInfoList != null) {
- mCellInfoList = myState.mCellInfoList;
- }
-
- super.onRestoreInstanceState(myState.getSuperState());
- }
-
- /**
- * We save entries, entryValues and operatorInfoList into bundle.
- * At onCreate of fragment, dialog will be restored if it was open. In this case,
- * we need to restore entries, entryValues and operatorInfoList. Without those information,
- * onPreferenceChange will fail if user select network from the dialog.
- */
- private static class SavedState extends BaseSavedState {
- CharSequence[] mDialogListEntries;
- CharSequence[] mDialogListEntryValues;
- List<CellInfo> mCellInfoList;
-
- SavedState(Parcel source) {
- super(source);
- final ClassLoader boot = Object.class.getClassLoader();
- mDialogListEntries = source.readCharSequenceArray();
- mDialogListEntryValues = source.readCharSequenceArray();
- mCellInfoList = source.readParcelableList(mCellInfoList, boot);
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeCharSequenceArray(mDialogListEntries);
- dest.writeCharSequenceArray(mDialogListEntryValues);
- dest.writeParcelableList(mCellInfoList, flags);
- }
-
- SavedState(Parcelable superState) {
- super(superState);
- }
-
- public static final Parcelable.Creator<SavedState> CREATOR =
- new Parcelable.Creator<SavedState>() {
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
-
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
- }
-
- private void logd(String msg) {
- Log.d(LOG_TAG, "[NetworksList] " + msg);
- }
-
- private void loge(String msg) {
- Log.e(LOG_TAG, "[NetworksList] " + msg);
- }
-}
\ No newline at end of file
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index 830964b..3e42c70 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -81,7 +81,7 @@
@VisibleForTesting
TelephonyManager mTelephonyManager;
private List<String> mForbiddenPlmns;
- private boolean mShow4GForLTE = true;
+ private boolean mShow4GForLTE = false;
private NetworkScanHelper mNetworkScanHelper;
private final ExecutorService mNetworkScanExecutor = Executors.newFixedThreadPool(1);
private MetricsFeatureProvider mMetricsFeatureProvider;
@@ -95,7 +95,6 @@
com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID);
- addPreferencesFromResource(R.xml.choose_network);
mConnectedPreferenceCategory =
(PreferenceCategory) findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR);
mPreferenceCategory =
@@ -389,6 +388,7 @@
}
private void stopNetworkQuery() {
+ setProgressBarVisible(false);
if (mNetworkScanHelper != null) {
mNetworkScanHelper.stopNetworkQuery();
}
diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
new file mode 100644
index 0000000..72f69cd
--- /dev/null
+++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
@@ -0,0 +1,135 @@
+/*
+ * 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.gsm;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.Preference;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.core.TogglePreferenceController;
+import com.android.settings.network.telephony.MobileNetworkUtils;
+import com.android.settings.network.telephony.MobileSettingsActivity;
+import com.android.settings.network.telephony.NetworkSelectSettings;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Preference controller for "Auto Select Network"
+ */
+public class AutoSelectPreferenceController extends TogglePreferenceController {
+
+ private int mSubId;
+ private TelephonyManager mTelephonyManager;
+ private boolean mOnlyAutoSelectInHome;
+ private List<OnNetworkSelectModeListener> mListeners;
+
+ public AutoSelectPreferenceController(Context context, String key) {
+ super(context, key);
+ mTelephonyManager = context.getSystemService(TelephonyManager.class);
+ mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ mListeners = new ArrayList<>();
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return MobileNetworkUtils.shouldDisplayNetworkSelectOptions(mContext,mSubId)
+ ? AVAILABLE
+ : CONDITIONALLY_UNAVAILABLE;
+ }
+
+ @Override
+ public boolean isChecked() {
+ return mTelephonyManager.getNetworkSelectionMode()
+ == TelephonyManager.NETWORK_SELECTION_MODE_AUTO;
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+
+ preference.setSummary(null);
+ if (mTelephonyManager.getServiceState().getRoaming()) {
+ preference.setEnabled(true);
+ } else {
+ preference.setEnabled(!mOnlyAutoSelectInHome);
+ if (mOnlyAutoSelectInHome) {
+ preference.setSummary(mContext.getString(
+ R.string.manual_mode_disallowed_summary,
+ mTelephonyManager.getSimOperatorName()));
+ }
+ }
+ }
+
+ @Override
+ public boolean setChecked(boolean isChecked) {
+ if (isChecked) {
+ mTelephonyManager.setNetworkSelectionModeAutomatic();
+
+ for (OnNetworkSelectModeListener lsn : mListeners) {
+ lsn.onNetworkSelectModeChanged();
+ }
+ // Manually check whether it is successfully
+ return mTelephonyManager.getNetworkSelectionMode()
+ == TelephonyManager.NETWORK_SELECTION_MODE_AUTO;
+ } else {
+ final Bundle bundle = new Bundle();
+ bundle.putInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID, mSubId);
+ new SubSettingLauncher(mContext)
+ .setDestination(NetworkSelectSettings.class.getName())
+ .setSourceMetricsCategory(MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT)
+ .setTitleRes(R.string.choose_network_title)
+ .setArguments(bundle)
+ .launch();
+ return false;
+ }
+ }
+
+ public AutoSelectPreferenceController init(int subId) {
+ mSubId = subId;
+ mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+ final PersistableBundle carrierConfig = mContext.getSystemService(
+ CarrierConfigManager.class).getConfigForSubId(mSubId);
+ mOnlyAutoSelectInHome = carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_ONLY_AUTO_SELECT_IN_HOME_NETWORK_BOOL);
+
+ return this;
+ }
+
+ public AutoSelectPreferenceController addListener(OnNetworkSelectModeListener lsn) {
+ mListeners.add(lsn);
+
+ return this;
+ }
+
+ /**
+ * Callback when network select mode is changed
+ *
+ * @see TelephonyManager#getNetworkSelectionMode()
+ */
+ public interface OnNetworkSelectModeListener {
+ void onNetworkSelectModeChanged();
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
new file mode 100644
index 0000000..9ea977c
--- /dev/null
+++ b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java
@@ -0,0 +1,110 @@
+/*
+ * 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.gsm;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.SubSettingLauncher;
+import com.android.settings.network.telephony.MobileNetworkUtils;
+import com.android.settings.network.telephony.MobileSettingsActivity;
+import com.android.settings.network.telephony.NetworkSelectSettings;
+
+/**
+ * Preference controller for "Open network select"
+ */
+public class OpenNetworkSelectPagePreferenceController extends BasePreferenceController implements
+ AutoSelectPreferenceController.OnNetworkSelectModeListener {
+
+ private int mSubId;
+ private TelephonyManager mTelephonyManager;
+ private Preference mPreference;
+
+ public OpenNetworkSelectPagePreferenceController(Context context, String key) {
+ super(context, key);
+ mTelephonyManager = context.getSystemService(TelephonyManager.class);
+ mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return MobileNetworkUtils.shouldDisplayNetworkSelectOptions(mContext, mSubId)
+ ? AVAILABLE
+ : CONDITIONALLY_UNAVAILABLE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ mPreference = screen.findPreference(getPreferenceKey());
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ super.updateState(preference);
+ preference.setEnabled(mTelephonyManager.getNetworkSelectionMode()
+ != TelephonyManager.NETWORK_SELECTION_MODE_AUTO);
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ final ServiceState ss = mTelephonyManager.getServiceState();
+ if (ss != null && ss.getState() == ServiceState.STATE_IN_SERVICE) {
+ return mTelephonyManager.getNetworkOperatorName();
+ } else {
+ return mContext.getString(R.string.network_disconnected);
+ }
+ }
+
+ @Override
+ public boolean handlePreferenceTreeClick(Preference preference) {
+ if (TextUtils.equals(preference.getKey(), getPreferenceKey())) {
+ final Bundle bundle = new Bundle();
+ bundle.putInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID, mSubId);
+ new SubSettingLauncher(mContext)
+ .setDestination(NetworkSelectSettings.class.getName())
+ .setSourceMetricsCategory(MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT)
+ .setTitleRes(R.string.choose_network_title)
+ .setArguments(bundle)
+ .launch();
+ return true;
+ }
+
+ return false;
+ }
+
+ public OpenNetworkSelectPagePreferenceController init(int subId) {
+ mSubId = subId;
+ mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId);
+ return this;
+ }
+
+ @Override
+ public void onNetworkSelectModeChanged() {
+ updateState(mPreference);
+ }
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/network/telephony/CarrierPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/CarrierPreferenceControllerTest.java
index e119e89..8673de8 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/CarrierPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/CarrierPreferenceControllerTest.java
@@ -68,6 +68,7 @@
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 CarrierPreferenceController(mContext, "mobile_data");
diff --git a/tests/robotests/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceControllerTest.java
new file mode 100644
index 0000000..5f65241
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceControllerTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.gsm;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Answers;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class AutoSelectPreferenceControllerTest {
+ private static final int SUB_ID = 2;
+ private static final String OPERATOR_NAME = "T-mobile";
+
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+ private TelephonyManager mTelephonyManager;
+ @Mock
+ private SubscriptionManager mSubscriptionManager;
+ @Mock
+ private CarrierConfigManager mCarrierConfigManager;
+
+ private PersistableBundle mCarrierConfig;
+ private AutoSelectPreferenceController mController;
+ private Preference mPreference;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
+ when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+ when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
+ mCarrierConfigManager);
+ when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
+
+ mCarrierConfig = new PersistableBundle();
+ mCarrierConfig.putBoolean(CarrierConfigManager.KEY_ONLY_AUTO_SELECT_IN_HOME_NETWORK_BOOL,
+ true);
+ when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig);
+
+ mPreference = new Preference(mContext);
+ mController = new AutoSelectPreferenceController(mContext, "auto_select");
+ mController.init(SUB_ID);
+ }
+
+ @Test
+ public void setChecked_isChecked_updateValue() {
+ when(mTelephonyManager.getNetworkSelectionMode()).thenReturn(
+ TelephonyManager.NETWORK_SELECTION_MODE_AUTO);
+
+ assertThat(mController.setChecked(true)).isTrue();
+
+ verify(mTelephonyManager).setNetworkSelectionModeAutomatic();
+ }
+
+ @Test
+ public void updateState_isRoaming_enabled() {
+ when(mTelephonyManager.getServiceState().getRoaming()).thenReturn(true);
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isEnabled()).isTrue();
+ }
+
+ @Test
+ public void updateState_notRoamingWithAutoSelectOn_disabled() {
+ when(mTelephonyManager.getServiceState().getRoaming()).thenReturn(false);
+ doReturn(OPERATOR_NAME).when(mTelephonyManager).getSimOperatorName();
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isEnabled()).isFalse();
+ assertThat(mPreference.getSummary()).isEqualTo(
+ mContext.getString(R.string.manual_mode_disallowed_summary,
+ mTelephonyManager.getSimOperatorName()));
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java
new file mode 100644
index 0000000..d5fc6e0
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceControllerTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.gsm;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.ServiceState;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.Preference;
+
+import com.android.settings.R;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class OpenNetworkSelectPagePreferenceControllerTest {
+ private static final int SUB_ID = 2;
+ private static final String OPERATOR_NAME = "T-mobile";
+
+ @Mock
+ private TelephonyManager mTelephonyManager;
+ @Mock
+ private SubscriptionManager mSubscriptionManager;
+ @Mock
+ private CarrierConfigManager mCarrierConfigManager;
+ @Mock
+ private ServiceState mServiceState;
+
+ private PersistableBundle mCarrierConfig;
+ private OpenNetworkSelectPagePreferenceController mController;
+ private Preference mPreference;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
+ when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
+ when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
+ mCarrierConfigManager);
+ when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
+ when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
+
+ mCarrierConfig = new PersistableBundle();
+ when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig);
+
+ mPreference = new Preference(mContext);
+ mController = new OpenNetworkSelectPagePreferenceController(mContext,
+ "open_network_select");
+ mController.init(SUB_ID);
+ }
+
+ @Test
+ public void updateState_modeAuto_disabled() {
+ when(mTelephonyManager.getNetworkSelectionMode()).thenReturn(
+ TelephonyManager.NETWORK_SELECTION_MODE_AUTO);
+
+ mController.updateState(mPreference);
+
+ assertThat(mPreference.isEnabled()).isFalse();
+ }
+
+ @Test
+ public void getSummary_inService_returnOperatorName() {
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
+ doReturn(OPERATOR_NAME).when(mTelephonyManager).getNetworkOperatorName();
+
+ assertThat(mController.getSummary()).isEqualTo(OPERATOR_NAME);
+ }
+
+ @Test
+ public void getSummary_notInService_returnDisconnect() {
+ when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
+ doReturn(OPERATOR_NAME).when(mTelephonyManager).getNetworkOperatorName();
+
+ assertThat(mController.getSummary()).isEqualTo(
+ mContext.getString(R.string.network_disconnected));
+ }
+}