OSDN Git Service

Update NetworkSelectSettings page
authorjackqdyulei <jackqdyulei@google.com>
Wed, 24 Oct 2018 17:10:49 +0000 (10:10 -0700)
committerjackqdyulei <jackqdyulei@google.com>
Thu, 25 Oct 2018 17:51:23 +0000 (10:51 -0700)
Clean it up and make it compatiable with all devices. Before this CL
it only used in Pixel 3 with new moderm.

Bug: 114749736
Test: RunSettingsRoboTests
Change-Id: Iad3bc131e294d34cff90b9130715780182adccd7

src/com/android/settings/network/telephony/NetworkOperatorPreference.java
src/com/android/settings/network/telephony/NetworkSelectSettings.java
tests/robotests/assets/grandfather_not_implementing_index_provider
tests/robotests/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java [new file with mode: 0644]

index 79ccf9c..ad0285f 100644 (file)
@@ -22,6 +22,7 @@ import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.LayerDrawable;
 import android.telephony.CellInfo;
+import android.telephony.CellSignalStrength;
 import android.telephony.SignalStrength;
 import android.util.Log;
 import android.view.Gravity;
@@ -40,11 +41,14 @@ public class NetworkOperatorPreference extends Preference {
 
     private static final String TAG = "NetworkOperatorPref";
     private static final boolean DBG = false;
+
+    private static final int LEVEL_NONE = -1;
+
     // number of signal strength level
     public static final int NUMBER_OF_LEVELS = SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
     private CellInfo mCellInfo;
     private List<String> mForbiddenPlmns;
-    private int mLevel = -1;
+    private int mLevel = LEVEL_NONE;
     private boolean mShow4GForLTE;
 
     // The following constants are used to draw signal icon.
@@ -74,7 +78,9 @@ public class NetworkOperatorPreference extends Preference {
             networkTitle += " " + getContext().getResources().getString(R.string.forbidden_network);
         }
         setTitle(networkTitle);
-        int level = mCellInfo.getCellSignalStrength().getLevel();
+
+        final CellSignalStrength signalStrength = mCellInfo.getCellSignalStrength();
+        final int level = signalStrength != null ? signalStrength.getLevel() : LEVEL_NONE;
         if (DBG) Log.d(TAG, "refresh level: " + String.valueOf(level));
         if (mLevel != level) {
             mLevel = level;
index ec199e6..830964b 100644 (file)
@@ -17,13 +17,12 @@ package com.android.settings.network.telephony;
 
 import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT;
 
+import android.app.Activity;
 import android.content.Context;
-import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
 import android.os.PersistableBundle;
-import android.provider.SearchIndexableResource;
 import android.telephony.AccessNetworkConstants;
 import android.telephony.CarrierConfigManager;
 import android.telephony.CellIdentity;
@@ -32,23 +31,18 @@ import android.telephony.NetworkRegistrationState;
 import android.telephony.ServiceState;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
-import android.util.Log;
 import android.view.View;
-import android.view.ViewGroup;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
-import androidx.preference.PreferenceScreen;
 
-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.settings.dashboard.DashboardFragment;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Indexable;
-import com.android.settingslib.search.SearchIndexable;
-import com.android.settingslib.utils.ThreadUtils;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -61,14 +55,10 @@ import java.util.concurrent.Executors;
 /**
  * "Choose network" settings UI for the Phone app.
  */
-//TODO(b/115429509): Add test for this file once b/115429509 is not blocked anymore
-@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
 public class NetworkSelectSettings extends DashboardFragment {
 
     private static final String TAG = "NetworkSelectSettings";
-    private static final boolean DBG = true;
 
-    private static final int EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE = 1;
     private static final int EVENT_NETWORK_SCAN_RESULTS = 2;
     private static final int EVENT_NETWORK_SCAN_ERROR = 3;
     private static final int EVENT_NETWORK_SCAN_COMPLETED = 4;
@@ -77,41 +67,41 @@ public class NetworkSelectSettings extends DashboardFragment {
             "connected_network_operator_preference";
     private static final String PREF_KEY_NETWORK_OPERATORS = "network_operators_preference";
 
-    // used to add/remove NetworkOperatorsPreference.
-    private PreferenceCategory mNetworkOperatorsPreferences;
-    // used to add/remove connected NetworkOperatorPreference.
-    private PreferenceCategory mConnectedNetworkOperatorsPreference;
-    // manage the progress bar on the top of the page.
+    @VisibleForTesting
+    PreferenceCategory mPreferenceCategory;
+    @VisibleForTesting
+    PreferenceCategory mConnectedPreferenceCategory;
+    @VisibleForTesting
+    NetworkOperatorPreference mSelectedPreference;
     private View mProgressHeader;
     private Preference mStatusMessagePreference;
-    private List<CellInfo> mCellInfoList;
+    @VisibleForTesting
+    List<CellInfo> mCellInfoList;
     private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-    private ViewGroup mFrameLayout;
-    private NetworkOperatorPreference mSelectedNetworkOperatorPreference;
-    private TelephonyManager mTelephonyManager;
+    @VisibleForTesting
+    TelephonyManager mTelephonyManager;
     private List<String> mForbiddenPlmns;
     private boolean mShow4GForLTE = true;
     private NetworkScanHelper mNetworkScanHelper;
     private final ExecutorService mNetworkScanExecutor = Executors.newFixedThreadPool(1);
-
-    private final Runnable mUpdateNetworkOperatorsRunnable = () -> {
-        updateNetworkOperatorsPreferenceCategory();
-    };
+    private MetricsFeatureProvider mMetricsFeatureProvider;
+    private boolean mUseNewApi;
 
     @Override
     public void onCreate(Bundle icicle) {
-        if (DBG) logd("onCreate");
         super.onCreate(icicle);
 
+        mUseNewApi = getContext().getResources().getBoolean(
+                com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
         mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID);
 
         addPreferencesFromResource(R.xml.choose_network);
-        mConnectedNetworkOperatorsPreference =
+        mConnectedPreferenceCategory =
                 (PreferenceCategory) findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR);
-        mNetworkOperatorsPreferences =
+        mPreferenceCategory =
                 (PreferenceCategory) findPreference(PREF_KEY_NETWORK_OPERATORS);
         mStatusMessagePreference = new Preference(getContext());
-        mSelectedNetworkOperatorPreference = null;
+        mSelectedPreference = null;
         mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId);
         mNetworkScanHelper = new NetworkScanHelper(
                 mTelephonyManager, mCallback, mNetworkScanExecutor);
@@ -121,111 +111,79 @@ public class NetworkSelectSettings extends DashboardFragment {
             mShow4GForLTE = bundle.getBoolean(
                     CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL);
         }
-        setRetainInstance(true);
+
+        mMetricsFeatureProvider = FeatureFactory
+                .getFactory(getContext()).getMetricsFeatureProvider();
     }
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
-        if (DBG) logd("onViewCreated");
         super.onViewCreated(view, savedInstanceState);
 
-        // TODO(b/114749736): build the progress bar
-        forceConfigConnectedNetworkOperatorsPreferenceCategory();
+        final Activity activity = getActivity();
+        if (activity != null) {
+            mProgressHeader = setPinnedHeaderView(R.layout.wifi_progress_header)
+                    .findViewById(R.id.progress_bar_animation);
+            setProgressBarVisible(false);
+        }
+        forceUpdateConnectedPreferenceCategory();
     }
 
     @Override
     public void onStart() {
-        if (DBG) logd("onStart");
         super.onStart();
-        new AsyncTask<Void, Void, List<String>>() {
-            @Override
-            protected List<String> doInBackground(Void... voids) {
-                String[] forbiddenPlmns = mTelephonyManager.getForbiddenPlmns();
-                return forbiddenPlmns != null ? Arrays.asList(forbiddenPlmns) : null;
-            }
+        mForbiddenPlmns = Arrays.asList(mTelephonyManager.getForbiddenPlmns());
+        setProgressBarVisible(true);
 
-            @Override
-            protected void onPostExecute(List<String> result) {
-                mForbiddenPlmns = result;
-                loadNetworksList();
-            }
-        }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+        if (mUseNewApi) {
+            mNetworkScanHelper.startNetworkScan(
+                    NetworkScanHelper.NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS);
+        } else {
+            mNetworkScanHelper.startNetworkScan(
+                    NetworkScanHelper.NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS);
+        }
     }
 
-    /**
-     * Invoked on each preference click in this hierarchy, overrides
-     * PreferenceActivity's implementation.  Used to make sure we track the
-     * preference click events.
-     * Since the connected network operator is either faked (when no data connection) or already
-     * connected, we do not allow user to click the connected network operator.
-     */
     @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        if (DBG) logd("User clicked the screen");
+    public void onStop() {
+        super.onStop();
         stopNetworkQuery();
-        setProgressBarVisible(false);
-        if (preference instanceof NetworkOperatorPreference) {
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        if (preference != mSelectedPreference) {
+            stopNetworkQuery();
+            setProgressBarVisible(false);
             // Refresh the last selected item in case users reselect network.
-            if (mSelectedNetworkOperatorPreference != null) {
-                mSelectedNetworkOperatorPreference.setSummary("");
+            if (mSelectedPreference != null) {
+                mSelectedPreference.setSummary(null);
             }
 
-            mSelectedNetworkOperatorPreference = (NetworkOperatorPreference) preference;
-            CellInfo cellInfo = mSelectedNetworkOperatorPreference.getCellInfo();
-            if (DBG) logd("User click a NetworkOperatorPreference: " + cellInfo.toString());
+            mSelectedPreference = (NetworkOperatorPreference) preference;
+            CellInfo cellInfo = mSelectedPreference.getCellInfo();
 
-            // Send metrics event
-            MetricsLogger.action(getContext(),
+            mMetricsFeatureProvider.action(getContext(),
                     MetricsEvent.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK);
 
-            // Connect to the network
-            if (SubscriptionManager.isValidSubscriptionId(mSubId)) {
-                if (DBG) {
-                    logd("Connect to the network: " + CellInfoUtil.getNetworkTitle(cellInfo));
-                }
-                // Set summary as "Connecting" to the selected network.
-                mSelectedNetworkOperatorPreference.setSummary(R.string.network_connecting);
-
-                // Set summary as "Disconnected" to the previously connected network
-                if (mConnectedNetworkOperatorsPreference.getPreferenceCount() > 0) {
-                    NetworkOperatorPreference connectedNetworkOperator = (NetworkOperatorPreference)
-                            (mConnectedNetworkOperatorsPreference.getPreference(0));
-                    if (!CellInfoUtil.getNetworkTitle(cellInfo).equals(
-                            CellInfoUtil.getNetworkTitle(connectedNetworkOperator.getCellInfo()))) {
-                        connectedNetworkOperator.setSummary(R.string.network_disconnected);
-                    }
+            // Set summary as "Disconnected" to the previously connected network
+            if (mConnectedPreferenceCategory.getPreferenceCount() > 0) {
+                NetworkOperatorPreference connectedNetworkOperator = (NetworkOperatorPreference)
+                        (mConnectedPreferenceCategory.getPreference(0));
+                if (!CellInfoUtil.getNetworkTitle(cellInfo).equals(
+                        CellInfoUtil.getNetworkTitle(connectedNetworkOperator.getCellInfo()))) {
+                    connectedNetworkOperator.setSummary(R.string.network_disconnected);
                 }
-
-                OperatorInfo operatorInfo = CellInfoUtil.getOperatorInfoFromCellInfo(cellInfo);
-                if (DBG) logd("manually selected network operator: " + operatorInfo.toString());
-
-                ThreadUtils.postOnBackgroundThread(() -> {
-                    Message msg = mHandler.obtainMessage(EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE);
-                    msg.obj = mTelephonyManager.setNetworkSelectionModeManual(
-                            operatorInfo, true /* persistSelection */);
-                    msg.sendToTarget();
-                });
-
-                setProgressBarVisible(true);
-                return true;
-            } else {
-                loge("Error selecting network. Subscription Id is invalid.");
-                mSelectedNetworkOperatorPreference = null;
-                return false;
             }
 
-        } else {
-            getPreferenceScreen().setEnabled(false);
-            return false;
+            final OperatorInfo operatorInfo = CellInfoUtil.getOperatorInfoFromCellInfo(cellInfo);
+            final boolean isSuccess = mTelephonyManager.setNetworkSelectionModeManual(
+                    operatorInfo, true /* persistSelection */);
+            mSelectedPreference.setSummary(
+                    isSuccess ? R.string.network_connected : R.string.network_could_not_connect);
         }
-    }
 
-    @Override
-    public void onStop() {
-        super.onStop();
-        if (DBG) logd("onStop");
-        getView().removeCallbacks(mUpdateNetworkOperatorsRunnable);
-        stopNetworkQuery();
+        return true;
     }
 
     @Override
@@ -247,29 +205,11 @@ public class NetworkSelectSettings extends DashboardFragment {
         @Override
         public void handleMessage(Message msg) {
             switch (msg.what) {
-                case EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE:
-                    if (DBG) logd("network selection done: hide the progress header");
-                    setProgressBarVisible(false);
-
-                    boolean isSuccessed = (boolean) msg.obj;
-                    if (isSuccessed) {
-                        if (DBG) logd("manual network selection: succeeded! ");
-                        // Set summary as "Connected" to the selected network.
-                        mSelectedNetworkOperatorPreference.setSummary(R.string.network_connected);
-                    } else {
-                        if (DBG) logd("manual network selection: failed! ");
-                        // Set summary as "Couldn't connect" to the selected network.
-                        mSelectedNetworkOperatorPreference.setSummary(
-                                R.string.network_could_not_connect);
-                    }
-                    break;
-
                 case EVENT_NETWORK_SCAN_RESULTS:
                     List<CellInfo> results = aggregateCellInfoList((List<CellInfo>) msg.obj);
                     mCellInfoList = new ArrayList<>(results);
-                    if (DBG) logd("after aggregate: " + mCellInfoList.toString());
                     if (mCellInfoList != null && mCellInfoList.size() != 0) {
-                        updateNetworkOperators();
+                        updateAllPreferenceCategory();
                     } else {
                         addMessagePreference(R.string.empty_networks_list);
                     }
@@ -277,15 +217,12 @@ public class NetworkSelectSettings extends DashboardFragment {
                     break;
 
                 case EVENT_NETWORK_SCAN_ERROR:
-                    int error = msg.arg1;
-                    if (DBG) logd("error while querying available networks " + error);
                     stopNetworkQuery();
                     addMessagePreference(R.string.network_query_error);
                     break;
 
                 case EVENT_NETWORK_SCAN_COMPLETED:
                     stopNetworkQuery();
-                    if (DBG) logd("scan complete");
                     if (mCellInfoList == null) {
                         // In case the scan timeout before getting any results
                         addMessagePreference(R.string.empty_networks_list);
@@ -296,47 +233,25 @@ public class NetworkSelectSettings extends DashboardFragment {
         }
     };
 
-    private void loadNetworksList() {
-        if (DBG) logd("load networks list...");
-        setProgressBarVisible(true);
-        mNetworkScanHelper.startNetworkScan(
-                NetworkScanHelper.NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS);
-    }
-
     private final NetworkScanHelper.NetworkScanCallback mCallback =
             new NetworkScanHelper.NetworkScanCallback() {
                 public void onResults(List<CellInfo> results) {
-                    if (DBG) logd("get scan results.");
                     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("get onError callback with error code: " + error);
                     Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_ERROR, error,
                             0 /* arg2 */);
                     msg.sendToTarget();
                 }
             };
 
-    private void updateNetworkOperators() {
-        if (DBG) logd("updateNetworkOperators");
-        if (getActivity() != null) {
-            final View view = getView();
-            final Handler handler = view.getHandler();
-            if (handler != null && handler.hasCallbacks(mUpdateNetworkOperatorsRunnable)) {
-                return;
-            }
-            view.post(mUpdateNetworkOperatorsRunnable);
-        }
-    }
-
     /**
      * Update the currently available network operators list, which only contains the unregistered
      * network operators. So if the device has no data and the network operator in the connected
@@ -345,17 +260,18 @@ public class NetworkSelectSettings extends DashboardFragment {
      * network operator in the connected network operator category shows "Connected", it will not
      * exist in the available network category.
      */
-    private void updateNetworkOperatorsPreferenceCategory() {
-        mNetworkOperatorsPreferences.removeAll();
+    @VisibleForTesting
+    void updateAllPreferenceCategory() {
+        updateConnectedPreferenceCategory();
 
-        configConnectedNetworkOperatorsPreferenceCategory();
+        mPreferenceCategory.removeAll();
         for (int index = 0; index < mCellInfoList.size(); index++) {
             if (!mCellInfoList.get(index).isRegistered()) {
                 NetworkOperatorPreference pref = new NetworkOperatorPreference(
                         mCellInfoList.get(index), getContext(), mForbiddenPlmns, mShow4GForLTE);
                 pref.setKey(CellInfoUtil.getNetworkTitle(mCellInfoList.get(index)));
                 pref.setOrder(index);
-                mNetworkOperatorsPreferences.addPreference(pref);
+                mPreferenceCategory.addPreference(pref);
             }
         }
     }
@@ -363,33 +279,30 @@ public class NetworkSelectSettings extends DashboardFragment {
     /**
      * Config the connected network operator preference when the page was created. When user get
      * into this page, the device might or might not have data connection.
-     *   - If the device has data:
-     *     1. use {@code ServiceState#getNetworkRegistrationStates()} to get the currently
-     *        registered cellIdentity, wrap it into a CellInfo;
-     *     2. set the signal strength level as strong;
-     *     3. use {@link TelephonyManager#getNetworkOperatorName()} to get the title of the
-     *        previously connected network operator, since the CellIdentity got from step 1 only has
-     *        PLMN.
-     *   - If the device has no data, we will remove the connected network operators list from the
-     *     screen.
+     * - If the device has data:
+     * 1. use {@code ServiceState#getNetworkRegistrationStates()} to get the currently
+     * registered cellIdentity, wrap it into a CellInfo;
+     * 2. set the signal strength level as strong;
+     * 3. use {@link TelephonyManager#getNetworkOperatorName()} to get the title of the
+     * previously connected network operator, since the CellIdentity got from step 1 only has
+     * PLMN.
+     * - If the device has no data, we will remove the connected network operators list from the
+     * screen.
      */
-    private void forceConfigConnectedNetworkOperatorsPreferenceCategory() {
-        if (DBG) logd("Force config ConnectedNetworkOperatorsPreferenceCategory");
+    private void forceUpdateConnectedPreferenceCategory() {
         if (mTelephonyManager.getDataState() == mTelephonyManager.DATA_CONNECTED) {
             // Try to get the network registration states
             ServiceState ss = mTelephonyManager.getServiceState();
             List<NetworkRegistrationState> networkList =
                     ss.getNetworkRegistrationStates(AccessNetworkConstants.TransportType.WWAN);
             if (networkList == null || networkList.size() == 0) {
-                loge("getNetworkRegistrationStates return null");
                 // Remove the connected network operators category
-                removeConnectedNetworkOperatorPreference();
+                mConnectedPreferenceCategory.setVisible(false);
                 return;
             }
             CellIdentity cellIdentity = networkList.get(0).getCellIdentity();
             CellInfo cellInfo = CellInfoUtil.wrapCellInfoWithCellIdentity(cellIdentity);
             if (cellInfo != null) {
-                if (DBG) logd("Currently registered cell: " + cellInfo.toString());
                 NetworkOperatorPreference pref = new NetworkOperatorPreference(
                         cellInfo, getContext(), mForbiddenPlmns, mShow4GForLTE);
                 pref.setTitle(mTelephonyManager.getNetworkOperatorName());
@@ -397,17 +310,14 @@ public class NetworkSelectSettings extends DashboardFragment {
                 // Update the signal strength icon, since the default signalStrength value would be
                 // zero (it would be quite confusing why the connected network has no signal)
                 pref.setIcon(NetworkOperatorPreference.NUMBER_OF_LEVELS - 1);
-
-                mConnectedNetworkOperatorsPreference.addPreference(pref);
+                mConnectedPreferenceCategory.addPreference(pref);
             } else {
-                loge("Invalid CellIfno: " + cellInfo.toString());
                 // Remove the connected network operators category
-                removeConnectedNetworkOperatorPreference();
+                mConnectedPreferenceCategory.setVisible(false);
             }
         } else {
-            if (DBG) logd("No currently registered cell");
             // Remove the connected network operators category
-            removeConnectedNetworkOperatorPreference();
+            mConnectedPreferenceCategory.setVisible(false);
         }
     }
 
@@ -416,74 +326,27 @@ public class NetworkSelectSettings extends DashboardFragment {
      * configured if the category is currently empty or the operator network title of the previous
      * connected network is different from the new one.
      */
-    private void configConnectedNetworkOperatorsPreferenceCategory() {
-        if (DBG) logd("config ConnectedNetworkOperatorsPreferenceCategory");
-        // Remove the category if the CellInfo list is empty or does not have registered cell.
-        if (mCellInfoList.size() == 0) {
-            if (DBG) logd("empty cellinfo list");
-            removeConnectedNetworkOperatorPreference();
-        }
+    private void updateConnectedPreferenceCategory() {
         CellInfo connectedNetworkOperator = null;
-        for (CellInfo cellInfo: mCellInfoList) {
+        for (CellInfo cellInfo : mCellInfoList) {
             if (cellInfo.isRegistered()) {
                 connectedNetworkOperator = cellInfo;
                 break;
             }
         }
-        if (connectedNetworkOperator == null) {
-            if (DBG) logd("no registered network");
-            removeConnectedNetworkOperatorPreference();
-            return;
-        }
 
-        // config the category if it is empty.
-        if (mConnectedNetworkOperatorsPreference.getPreferenceCount() == 0) {
-            if (DBG) logd("ConnectedNetworkSelectList is empty, add one");
+        if (connectedNetworkOperator != null) {
             addConnectedNetworkOperatorPreference(connectedNetworkOperator);
-            return;
-        }
-        NetworkOperatorPreference previousConnectedNetworkOperator = (NetworkOperatorPreference)
-                (mConnectedNetworkOperatorsPreference.getPreference(0));
-
-        // config the category if the network title of the previous connected network is different
-        // from the new one.
-        String cTitle = CellInfoUtil.getNetworkTitle(connectedNetworkOperator);
-        String pTitle = CellInfoUtil.getNetworkTitle(
-                previousConnectedNetworkOperator.getCellInfo());
-        if (!cTitle.equals(pTitle)) {
-            if (DBG) logd("reconfig the category: connected network changed");
-            addConnectedNetworkOperatorPreference(connectedNetworkOperator);
-            return;
         }
-        if (DBG) logd("same network operator is connected, only refresh the connected network");
-        // Otherwise same network operator is connected, only refresh the connected network
-        // operator preference (first and the only one in this category).
-        ((NetworkOperatorPreference) mConnectedNetworkOperatorsPreference.getPreference(0))
-                .refresh();
-        return;
     }
 
-    /**
-     * Creates a Preference for the given {@link CellInfo} and adds it to the
-     * {@link #mConnectedNetworkOperatorsPreference}.
-     */
     private void addConnectedNetworkOperatorPreference(CellInfo cellInfo) {
-        if (DBG) logd("addConnectedNetworkOperatorPreference");
-        // Remove the current ConnectedNetworkOperatorsPreference
-        removeConnectedNetworkOperatorPreference();
+        mConnectedPreferenceCategory.removeAll();
         final NetworkOperatorPreference pref = new NetworkOperatorPreference(
                 cellInfo, getContext(), mForbiddenPlmns, mShow4GForLTE);
         pref.setSummary(R.string.network_connected);
-        mConnectedNetworkOperatorsPreference.addPreference(pref);
-        PreferenceScreen preferenceScreen = getPreferenceScreen();
-        preferenceScreen.addPreference(mConnectedNetworkOperatorsPreference);
-    }
-
-    /** Removes all preferences and hide the {@link #mConnectedNetworkOperatorsPreference}. */
-    private void removeConnectedNetworkOperatorPreference() {
-        mConnectedNetworkOperatorsPreference.removeAll();
-        PreferenceScreen preferenceScreen = getPreferenceScreen();
-        preferenceScreen.removePreference(mConnectedNetworkOperatorsPreference);
+        mConnectedPreferenceCategory.addPreference(pref);
+        mConnectedPreferenceCategory.setVisible(true);
     }
 
     protected void setProgressBarVisible(boolean visible) {
@@ -493,14 +356,11 @@ public class NetworkSelectSettings extends DashboardFragment {
     }
 
     private void addMessagePreference(int messageId) {
-        if (DBG) logd("remove callback");
-        getView().removeCallbacks(mUpdateNetworkOperatorsRunnable);
         setProgressBarVisible(false);
-        if (DBG) logd("addMessagePreference");
         mStatusMessagePreference.setTitle(messageId);
-        removeConnectedNetworkOperatorPreference();
-        mNetworkOperatorsPreferences.removeAll();
-        mNetworkOperatorsPreferences.addPreference(mStatusMessagePreference);
+        mConnectedPreferenceCategory.setVisible(false);
+        mPreferenceCategory.removeAll();
+        mPreferenceCategory.addPreference(mStatusMessagePreference);
     }
 
     /**
@@ -509,9 +369,8 @@ public class NetworkSelectSettings extends DashboardFragment {
      * with the strongest signal strength.
      */
     private List<CellInfo> aggregateCellInfoList(List<CellInfo> cellInfoList) {
-        if (DBG) logd("before aggregate: " + cellInfoList.toString());
         Map<String, CellInfo> map = new HashMap<>();
-        for (CellInfo cellInfo: cellInfoList) {
+        for (CellInfo cellInfo : cellInfoList) {
             String plmn = CellInfoUtil.getOperatorInfoFromCellInfo(cellInfo).getOperatorNumeric();
             if (cellInfo.isRegistered() || !map.containsKey(plmn)) {
                 map.put(plmn, cellInfo);
@@ -540,26 +399,4 @@ public class NetworkSelectSettings extends DashboardFragment {
         mNetworkScanExecutor.shutdown();
         super.onDestroy();
     }
-
-    private void logd(String msg) {
-        Log.d(TAG, msg);
-    }
-
-    private void loge(String msg) {
-        Log.e(TAG, msg);
-    }
-
-    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider() {
-                @Override
-                public List<SearchIndexableResource> getXmlResourcesToIndex(Context context,
-                        boolean enabled) {
-                    final ArrayList<SearchIndexableResource> result = new ArrayList<>();
-
-                    final SearchIndexableResource sir = new SearchIndexableResource(context);
-                    sir.xmlResId = R.xml.choose_network;
-                    result.add(sir);
-                    return result;
-                }
-            };
 }
index 38108f7..6f4deca 100644 (file)
@@ -50,6 +50,7 @@ com.android.settings.inputmethod.SpellCheckersSettings
 com.android.settings.localepicker.LocaleListEditor
 com.android.settings.network.ApnEditor
 com.android.settings.network.ApnSettings
+com.android.settings.network.telephony.NetworkSelectSettings
 com.android.settings.notification.AppNotificationSettings
 com.android.settings.notification.ChannelGroupNotificationSettings
 com.android.settings.notification.ChannelNotificationSettings
diff --git a/tests/robotests/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java b/tests/robotests/src/com/android/settings/network/telephony/NetworkSelectSettingsTest.java
new file mode 100644 (file)
index 0000000..3ebeba1
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * 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 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.telephony.CellInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceManager;
+
+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;
+
+import java.util.Arrays;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+public class NetworkSelectSettingsTest {
+    private static final int SUB_ID = 2;
+
+    @Mock
+    private TelephonyManager mTelephonyManager;
+    @Mock
+    private SubscriptionManager mSubscriptionManager;
+    @Mock
+    private CellInfo mCellInfo1;
+    @Mock
+    private CellInfo mCellInfo2;
+    @Mock
+    private PreferenceManager mPreferenceManager;
+    private Context mContext;
+
+    private PreferenceCategory mConnectedPreferenceCategory;
+    private PreferenceCategory mPreferenceCategory;
+
+    private NetworkSelectSettings mNetworkSelectSettings;
+
+    @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(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager);
+
+        when(mCellInfo1.isRegistered()).thenReturn(true);
+        when(mCellInfo2.isRegistered()).thenReturn(false);
+
+        mConnectedPreferenceCategory = spy(new PreferenceCategory(mContext));
+        doReturn(mPreferenceManager).when(mConnectedPreferenceCategory).getPreferenceManager();
+        mPreferenceCategory = spy(new PreferenceCategory(mContext));
+        doReturn(mPreferenceManager).when(mPreferenceCategory).getPreferenceManager();
+
+        mNetworkSelectSettings = spy(new NetworkSelectSettings());
+        doReturn(mContext).when(mNetworkSelectSettings).getContext();
+        mNetworkSelectSettings.mTelephonyManager = mTelephonyManager;
+        mNetworkSelectSettings.mConnectedPreferenceCategory = mConnectedPreferenceCategory;
+        mNetworkSelectSettings.mPreferenceCategory = mPreferenceCategory;
+        mNetworkSelectSettings.mCellInfoList = Arrays.asList(mCellInfo1, mCellInfo2);
+    }
+
+    @Test
+    public void updateAllPreferenceCategory_containCorrectPreference() {
+        mNetworkSelectSettings.updateAllPreferenceCategory();
+
+        assertThat(mConnectedPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+        final NetworkOperatorPreference connectedPreference =
+                (NetworkOperatorPreference) mConnectedPreferenceCategory.getPreference(0);
+        assertThat(connectedPreference.getCellInfo()).isEqualTo(mCellInfo1);
+        assertThat(mPreferenceCategory.getPreferenceCount()).isEqualTo(1);
+        final NetworkOperatorPreference preference =
+                (NetworkOperatorPreference) mPreferenceCategory.getPreference(0);
+        assertThat(preference.getCellInfo()).isEqualTo(mCellInfo2);
+    }
+
+}