Recopy NetworkSelectSetting from phone to settings

NetworkSelectSetting is changed during the migration, recopy it
to make it up to date

Following CL will refactor to reuse this fragment for all devices.

Bug: 114749736
Test: Build
Change-Id: Id43cb480cf31447a6e4a23eb3709f9ab972a2930
diff --git a/res/drawable/ic_signal_strength_4g.xml b/res/drawable/ic_signal_strength_4g.xml
new file mode 100644
index 0000000..9062096
--- /dev/null
+++ b/res/drawable/ic_signal_strength_4g.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="9.208dp"
+    android:height="17dp"
+    android:viewportWidth="13.0"
+    android:viewportHeight="24.0"
+    android:tint="?android:attr/colorControlNormal">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M4.600000,7.800000l0.700000,0.000000l0.000000,1.300000L4.600000,9.100000L4.600000,11.000000L3.000000,11.000000L3.000000,9.200000L0.100000,9.200000L0.000000,8.100000L3.000000,2.500000l1.700000,0.000000L4.700000,7.800000zM1.600000,7.800000L3.000000,7.800000l0.000000,-3.000000L2.900000,5.000000L1.600000,7.800000z"/>
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M11.900000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.100000,9.000000 6.100000,7.900000L6.100000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000S8.100000,2.400000 9.000000,2.400000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S9.500000,3.700000 9.000000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S7.700000,5.000000 7.700000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.099999,7.800000L9.000000,7.800000L9.000000,6.600000l2.900000,0.000000L11.900000,9.900000z"/>
+</vector>
\ No newline at end of file
diff --git a/src/com/android/settings/network/telephony/NetworkOperatorPreference.java b/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
index 4b00613..79ccf9c 100644
--- a/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
+++ b/src/com/android/settings/network/telephony/NetworkOperatorPreference.java
@@ -26,13 +26,13 @@
 import android.util.Log;
 import android.view.Gravity;
 
+import androidx.preference.Preference;
+
 import com.android.settings.R;
 import com.android.settingslib.graph.SignalDrawable;
 
 import java.util.List;
 
-import androidx.preference.Preference;
-
 /**
  * A Preference represents a network operator in the NetworkSelectSetting fragment.
  */
@@ -45,16 +45,18 @@
     private CellInfo mCellInfo;
     private List<String> mForbiddenPlmns;
     private int mLevel = -1;
+    private boolean mShow4GForLTE;
 
     // The following constants are used to draw signal icon.
     private static final Drawable EMPTY_DRAWABLE = new ColorDrawable(Color.TRANSPARENT);
     private static final int NO_CELL_DATA_CONNECTED_ICON = 0;
 
     public NetworkOperatorPreference(
-            CellInfo cellinfo, Context context, List<String> forbiddenPlmns) {
+            CellInfo cellinfo, Context context, List<String> forbiddenPlmns, boolean show4GForLTE) {
         super(context);
         mCellInfo = cellinfo;
         mForbiddenPlmns = forbiddenPlmns;
+        mShow4GForLTE = show4GForLTE;
         refresh();
     }
 
@@ -87,15 +89,21 @@
         updateIcon(level);
     }
 
-    private static int getIconIdForCell(CellInfo ci) {
+    private int getIconIdForCell(CellInfo ci) {
         final int type = ci.getCellIdentity().getType();
         switch (type) {
-            case CellInfo.TYPE_GSM: return R.drawable.signal_strength_g;
+            case CellInfo.TYPE_GSM:
+                return R.drawable.signal_strength_g;
             case CellInfo.TYPE_WCDMA: // fall through
-            case CellInfo.TYPE_TDSCDMA: return R.drawable.signal_strength_3g;
-            case CellInfo.TYPE_LTE: return R.drawable.signal_strength_lte;
-            case CellInfo.TYPE_CDMA: return R.drawable.signal_strength_1x;
-            default: return 0;
+            case CellInfo.TYPE_TDSCDMA:
+                return R.drawable.signal_strength_3g;
+            case CellInfo.TYPE_LTE:
+                return mShow4GForLTE
+                        ? R.drawable.ic_signal_strength_4g : R.drawable.signal_strength_lte;
+            case CellInfo.TYPE_CDMA:
+                return R.drawable.signal_strength_1x;
+            default:
+                return 0;
         }
     }
 
@@ -117,7 +125,7 @@
                 iconType == NO_CELL_DATA_CONNECTED_ICON
                         ? EMPTY_DRAWABLE
                         : getContext()
-                        .getResources().getDrawable(iconType, getContext().getTheme());
+                                .getResources().getDrawable(iconType, getContext().getTheme());
 
         // Overlay the two drawables
         Drawable[] layers = {networkDrawable, signalDrawable};
diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
index 9205188..ec199e6 100644
--- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java
+++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java
@@ -15,13 +15,17 @@
  */
 package com.android.settings.network.telephony;
 
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT;
+
 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;
 import android.telephony.CellInfo;
 import android.telephony.NetworkRegistrationState;
@@ -30,6 +34,7 @@
 import android.telephony.TelephonyManager;
 import android.util.Log;
 import android.view.View;
+import android.view.ViewGroup;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceCategory;
@@ -50,6 +55,8 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * "Choose network" settings UI for the Phone app.
@@ -58,11 +65,9 @@
 @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
 public class NetworkSelectSettings extends DashboardFragment {
 
-    private static final String TAG = "NetworkSelectSetting";
+    private static final String TAG = "NetworkSelectSettings";
     private static final boolean DBG = true;
 
-    public static final String KEY_SUBSCRIPTION_ID = "subscription_id";
-
     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;
@@ -81,36 +86,26 @@
     private Preference mStatusMessagePreference;
     private List<CellInfo> mCellInfoList;
     private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+    private ViewGroup mFrameLayout;
     private NetworkOperatorPreference mSelectedNetworkOperatorPreference;
     private TelephonyManager mTelephonyManager;
     private List<String> mForbiddenPlmns;
-    //Flag indicating whether we have called bind on the service.
-    private boolean mShouldUnbind;
+    private boolean mShow4GForLTE = true;
+    private NetworkScanHelper mNetworkScanHelper;
+    private final ExecutorService mNetworkScanExecutor = Executors.newFixedThreadPool(1);
 
     private final Runnable mUpdateNetworkOperatorsRunnable = () -> {
         updateNetworkOperatorsPreferenceCategory();
     };
 
-    /**
-     * Create a new instance of this fragment.
-     */
-    public static NetworkSelectSettings newInstance(int subId) {
-        Bundle args = new Bundle();
-        args.putInt(KEY_SUBSCRIPTION_ID, subId);
-        NetworkSelectSettings
-                fragment = new NetworkSelectSettings();
-        fragment.setArguments(args);
-
-        return fragment;
-    }
-
     @Override
     public void onCreate(Bundle icicle) {
         if (DBG) logd("onCreate");
         super.onCreate(icicle);
 
-        mSubId = getArguments().getInt(KEY_SUBSCRIPTION_ID);
+        mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID);
 
+        addPreferencesFromResource(R.xml.choose_network);
         mConnectedNetworkOperatorsPreference =
                 (PreferenceCategory) findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR);
         mNetworkOperatorsPreferences =
@@ -118,21 +113,29 @@
         mStatusMessagePreference = new Preference(getContext());
         mSelectedNetworkOperatorPreference = null;
         mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId);
+        mNetworkScanHelper = new NetworkScanHelper(
+                mTelephonyManager, mCallback, mNetworkScanExecutor);
+        PersistableBundle bundle = ((CarrierConfigManager) getContext().getSystemService(
+                Context.CARRIER_CONFIG_SERVICE)).getConfigForSubId(mSubId);
+        if (bundle != null) {
+            mShow4GForLTE = bundle.getBoolean(
+                    CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL);
+        }
         setRetainInstance(true);
     }
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
+        if (DBG) logd("onViewCreated");
         super.onViewCreated(view, savedInstanceState);
 
-        mProgressHeader = setPinnedHeaderView(R.layout.wifi_progress_header)
-                .findViewById(R.id.progress_bar_animation);
-        setProgressBarVisible(false);
+        // TODO(b/114749736): build the progress bar
         forceConfigConnectedNetworkOperatorsPreferenceCategory();
     }
 
     @Override
     public void onStart() {
+        if (DBG) logd("onStart");
         super.onStart();
         new AsyncTask<Void, Void, List<String>>() {
             @Override
@@ -144,7 +147,7 @@
             @Override
             protected void onPostExecute(List<String> result) {
                 mForbiddenPlmns = result;
-                bindNetworkQueryService();
+                loadNetworksList();
             }
         }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
@@ -199,7 +202,7 @@
                 ThreadUtils.postOnBackgroundThread(() -> {
                     Message msg = mHandler.obtainMessage(EVENT_SET_NETWORK_SELECTION_MANUALLY_DONE);
                     msg.obj = mTelephonyManager.setNetworkSelectionModeManual(
-                            operatorInfo.getOperatorNumeric(), true /* persistSelection */);
+                            operatorInfo, true /* persistSelection */);
                     msg.sendToTarget();
                 });
 
@@ -223,8 +226,6 @@
         if (DBG) logd("onStop");
         getView().removeCallbacks(mUpdateNetworkOperatorsRunnable);
         stopNetworkQuery();
-        // Unbind the NetworkQueryService
-        unbindNetworkQueryService();
     }
 
     @Override
@@ -239,8 +240,7 @@
 
     @Override
     public int getMetricsCategory() {
-        //TODO(b/114749736): add metrics id for this page
-        return 0;
+        return MOBILE_NETWORK_SELECT;
     }
 
     private final Handler mHandler = new Handler() {
@@ -258,7 +258,6 @@
                         mSelectedNetworkOperatorPreference.setSummary(R.string.network_connected);
                     } else {
                         if (DBG) logd("manual network selection: failed! ");
-                        updateNetworkSelection();
                         // Set summary as "Couldn't connect" to the selected network.
                         mSelectedNetworkOperatorPreference.setSummary(
                                 R.string.network_could_not_connect);
@@ -297,6 +296,35 @@
         }
     };
 
+    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) {
@@ -324,7 +352,7 @@
         for (int index = 0; index < mCellInfoList.size(); index++) {
             if (!mCellInfoList.get(index).isRegistered()) {
                 NetworkOperatorPreference pref = new NetworkOperatorPreference(
-                        mCellInfoList.get(index), getContext(), mForbiddenPlmns);
+                        mCellInfoList.get(index), getContext(), mForbiddenPlmns, mShow4GForLTE);
                 pref.setKey(CellInfoUtil.getNetworkTitle(mCellInfoList.get(index)));
                 pref.setOrder(index);
                 mNetworkOperatorsPreferences.addPreference(pref);
@@ -335,15 +363,15 @@
     /**
      * 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");
@@ -362,8 +390,8 @@
             CellInfo cellInfo = CellInfoUtil.wrapCellInfoWithCellIdentity(cellIdentity);
             if (cellInfo != null) {
                 if (DBG) logd("Currently registered cell: " + cellInfo.toString());
-                NetworkOperatorPreference pref =
-                        new NetworkOperatorPreference(cellInfo, getContext(), mForbiddenPlmns);
+                NetworkOperatorPreference pref = new NetworkOperatorPreference(
+                        cellInfo, getContext(), mForbiddenPlmns, mShow4GForLTE);
                 pref.setTitle(mTelephonyManager.getNetworkOperatorName());
                 pref.setSummary(R.string.network_connected);
                 // Update the signal strength icon, since the default signalStrength value would be
@@ -396,7 +424,7 @@
             removeConnectedNetworkOperatorPreference();
         }
         CellInfo connectedNetworkOperator = null;
-        for (CellInfo cellInfo : mCellInfoList) {
+        for (CellInfo cellInfo: mCellInfoList) {
             if (cellInfo.isRegistered()) {
                 connectedNetworkOperator = cellInfo;
                 break;
@@ -443,8 +471,8 @@
         if (DBG) logd("addConnectedNetworkOperatorPreference");
         // Remove the current ConnectedNetworkOperatorsPreference
         removeConnectedNetworkOperatorPreference();
-        final NetworkOperatorPreference pref =
-                new NetworkOperatorPreference(cellInfo, getContext(), mForbiddenPlmns);
+        final NetworkOperatorPreference pref = new NetworkOperatorPreference(
+                cellInfo, getContext(), mForbiddenPlmns, mShow4GForLTE);
         pref.setSummary(R.string.network_connected);
         mConnectedNetworkOperatorsPreference.addPreference(pref);
         PreferenceScreen preferenceScreen = getPreferenceScreen();
@@ -483,7 +511,7 @@
     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);
@@ -501,36 +529,16 @@
         return new ArrayList<>(map.values());
     }
 
-    private void loadNetworksList() {
-        if (DBG) logd("load networks list...");
-        setProgressBarVisible(true);
-        //TODO(b/114749736): load network list once b/115401728 is done
-    }
-
-    private void bindNetworkQueryService() {
-        if (DBG) logd("bindNetworkQueryService");
-        //TODO(b/114749736): bind service/manager once b/115401728 is done
-        mShouldUnbind = true;
-    }
-
-    private void unbindNetworkQueryService() {
-        if (DBG) logd("unbindNetworkQueryService");
-        if (mShouldUnbind) {
-            if (DBG) logd("mShouldUnbind is true");
-            // unbind the service.
-            //TODO(b/114749736): unbind service/manager once b/115401728 is done
-            mShouldUnbind = false;
+    private void stopNetworkQuery() {
+        if (mNetworkScanHelper != null) {
+            mNetworkScanHelper.stopNetworkQuery();
         }
     }
 
-    private void updateNetworkSelection() {
-        if (DBG) logd("Update notification about no service of user selected operator");
-        //TODO(b/114749736): update network selection once b/115429509 is done
-    }
-
-    private void stopNetworkQuery() {
-        // Stop the network query process
-        //TODO(b/114749736): stop service/manager query once b/115401728 is done
+    @Override
+    public void onDestroy() {
+        mNetworkScanExecutor.shutdown();
+        super.onDestroy();
     }
 
     private void logd(String msg) {