diff --git a/res/drawable/ic_signal_strength_4g.xml b/res/drawable/ic_signal_strength_4g.xml new file mode 100644 index 00000000000..90620965752 --- /dev/null +++ b/res/drawable/ic_signal_strength_4g.xml @@ -0,0 +1,28 @@ + + + + + \ 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 4b0061387f6..79ccf9cf329 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.telephony.SignalStrength; 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 @@ public class NetworkOperatorPreference extends Preference { private CellInfo mCellInfo; private List 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 forbiddenPlmns) { + CellInfo cellinfo, Context context, List forbiddenPlmns, boolean show4GForLTE) { super(context); mCellInfo = cellinfo; mForbiddenPlmns = forbiddenPlmns; + mShow4GForLTE = show4GForLTE; refresh(); } @@ -87,15 +89,21 @@ public class NetworkOperatorPreference extends Preference { 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 @@ public class NetworkOperatorPreference extends Preference { 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 9205188085e..ec199e6f237 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.SubscriptionManager; 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.Arrays; 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 @@ import java.util.Map; @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 @@ public class NetworkSelectSettings extends DashboardFragment { private Preference mStatusMessagePreference; private List mCellInfoList; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + private ViewGroup mFrameLayout; private NetworkOperatorPreference mSelectedNetworkOperatorPreference; private TelephonyManager mTelephonyManager; private List 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 @@ public class NetworkSelectSettings extends DashboardFragment { 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>() { @Override @@ -144,7 +147,7 @@ public class NetworkSelectSettings extends DashboardFragment { @Override protected void onPostExecute(List result) { mForbiddenPlmns = result; - bindNetworkQueryService(); + loadNetworksList(); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -199,7 +202,7 @@ public class NetworkSelectSettings extends DashboardFragment { 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 @@ public class NetworkSelectSettings extends DashboardFragment { if (DBG) logd("onStop"); getView().removeCallbacks(mUpdateNetworkOperatorsRunnable); stopNetworkQuery(); - // Unbind the NetworkQueryService - unbindNetworkQueryService(); } @Override @@ -239,8 +240,7 @@ public class NetworkSelectSettings extends DashboardFragment { @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 @@ public class NetworkSelectSettings extends DashboardFragment { 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 @@ 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 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 @@ public class NetworkSelectSettings extends DashboardFragment { 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 @@ 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"); @@ -362,8 +390,8 @@ public class NetworkSelectSettings extends DashboardFragment { 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 @@ public class NetworkSelectSettings extends DashboardFragment { removeConnectedNetworkOperatorPreference(); } CellInfo connectedNetworkOperator = null; - for (CellInfo cellInfo : mCellInfoList) { + for (CellInfo cellInfo: mCellInfoList) { if (cellInfo.isRegistered()) { connectedNetworkOperator = cellInfo; break; @@ -443,8 +471,8 @@ public class NetworkSelectSettings extends DashboardFragment { 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 @@ public class NetworkSelectSettings extends DashboardFragment { private List aggregateCellInfoList(List cellInfoList) { if (DBG) logd("before aggregate: " + cellInfoList.toString()); Map 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 @@ public class NetworkSelectSettings extends DashboardFragment { 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) {