Merge changes Iad3bc131,Id43cb480

* changes:
  Update NetworkSelectSettings page
  Recopy NetworkSelectSetting from phone to settings
This commit is contained in:
Lei Yu
2018-10-25 22:32:32 +00:00
committed by Android (Google) Code Review
5 changed files with 303 additions and 311 deletions

View File

@@ -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>

View File

@@ -22,17 +22,18 @@ import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.LayerDrawable;
import android.telephony.CellInfo; import android.telephony.CellInfo;
import android.telephony.CellSignalStrength;
import android.telephony.SignalStrength; import android.telephony.SignalStrength;
import android.util.Log; import android.util.Log;
import android.view.Gravity; import android.view.Gravity;
import androidx.preference.Preference;
import com.android.settings.R; import com.android.settings.R;
import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.graph.SignalDrawable;
import java.util.List; import java.util.List;
import androidx.preference.Preference;
/** /**
* A Preference represents a network operator in the NetworkSelectSetting fragment. * A Preference represents a network operator in the NetworkSelectSetting fragment.
*/ */
@@ -40,21 +41,26 @@ public class NetworkOperatorPreference extends Preference {
private static final String TAG = "NetworkOperatorPref"; private static final String TAG = "NetworkOperatorPref";
private static final boolean DBG = false; private static final boolean DBG = false;
private static final int LEVEL_NONE = -1;
// number of signal strength level // number of signal strength level
public static final int NUMBER_OF_LEVELS = SignalStrength.NUM_SIGNAL_STRENGTH_BINS; public static final int NUMBER_OF_LEVELS = SignalStrength.NUM_SIGNAL_STRENGTH_BINS;
private CellInfo mCellInfo; private CellInfo mCellInfo;
private List<String> mForbiddenPlmns; 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. // The following constants are used to draw signal icon.
private static final Drawable EMPTY_DRAWABLE = new ColorDrawable(Color.TRANSPARENT); private static final Drawable EMPTY_DRAWABLE = new ColorDrawable(Color.TRANSPARENT);
private static final int NO_CELL_DATA_CONNECTED_ICON = 0; private static final int NO_CELL_DATA_CONNECTED_ICON = 0;
public NetworkOperatorPreference( public NetworkOperatorPreference(
CellInfo cellinfo, Context context, List<String> forbiddenPlmns) { CellInfo cellinfo, Context context, List<String> forbiddenPlmns, boolean show4GForLTE) {
super(context); super(context);
mCellInfo = cellinfo; mCellInfo = cellinfo;
mForbiddenPlmns = forbiddenPlmns; mForbiddenPlmns = forbiddenPlmns;
mShow4GForLTE = show4GForLTE;
refresh(); refresh();
} }
@@ -72,7 +78,9 @@ public class NetworkOperatorPreference extends Preference {
networkTitle += " " + getContext().getResources().getString(R.string.forbidden_network); networkTitle += " " + getContext().getResources().getString(R.string.forbidden_network);
} }
setTitle(networkTitle); 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 (DBG) Log.d(TAG, "refresh level: " + String.valueOf(level));
if (mLevel != level) { if (mLevel != level) {
mLevel = level; mLevel = level;
@@ -87,15 +95,21 @@ public class NetworkOperatorPreference extends Preference {
updateIcon(level); updateIcon(level);
} }
private static int getIconIdForCell(CellInfo ci) { private int getIconIdForCell(CellInfo ci) {
final int type = ci.getCellIdentity().getType(); final int type = ci.getCellIdentity().getType();
switch (type) { 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_WCDMA: // fall through
case CellInfo.TYPE_TDSCDMA: return R.drawable.signal_strength_3g; case CellInfo.TYPE_TDSCDMA:
case CellInfo.TYPE_LTE: return R.drawable.signal_strength_lte; return R.drawable.signal_strength_3g;
case CellInfo.TYPE_CDMA: return R.drawable.signal_strength_1x; case CellInfo.TYPE_LTE:
default: return 0; 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 +131,7 @@ public class NetworkOperatorPreference extends Preference {
iconType == NO_CELL_DATA_CONNECTED_ICON iconType == NO_CELL_DATA_CONNECTED_ICON
? EMPTY_DRAWABLE ? EMPTY_DRAWABLE
: getContext() : getContext()
.getResources().getDrawable(iconType, getContext().getTheme()); .getResources().getDrawable(iconType, getContext().getTheme());
// Overlay the two drawables // Overlay the two drawables
Drawable[] layers = {networkDrawable, signalDrawable}; Drawable[] layers = {networkDrawable, signalDrawable};

View File

@@ -15,55 +15,50 @@
*/ */
package com.android.settings.network.telephony; 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.content.Context;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.provider.SearchIndexableResource; import android.os.PersistableBundle;
import android.telephony.AccessNetworkConstants; import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
import android.telephony.CellIdentity; import android.telephony.CellIdentity;
import android.telephony.CellInfo; import android.telephony.CellInfo;
import android.telephony.NetworkRegistrationState; import android.telephony.NetworkRegistrationState;
import android.telephony.ServiceState; import android.telephony.ServiceState;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View; import android.view.View;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceCategory; 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.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.telephony.OperatorInfo; import com.android.internal.telephony.OperatorInfo;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.Indexable; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/** /**
* "Choose network" settings UI for the Phone app. * "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 { 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_RESULTS = 2;
private static final int EVENT_NETWORK_SCAN_ERROR = 3; private static final int EVENT_NETWORK_SCAN_ERROR = 3;
private static final int EVENT_NETWORK_SCAN_COMPLETED = 4; private static final int EVENT_NETWORK_SCAN_COMPLETED = 4;
@@ -72,159 +67,123 @@ public class NetworkSelectSettings extends DashboardFragment {
"connected_network_operator_preference"; "connected_network_operator_preference";
private static final String PREF_KEY_NETWORK_OPERATORS = "network_operators_preference"; private static final String PREF_KEY_NETWORK_OPERATORS = "network_operators_preference";
// used to add/remove NetworkOperatorsPreference. @VisibleForTesting
private PreferenceCategory mNetworkOperatorsPreferences; PreferenceCategory mPreferenceCategory;
// used to add/remove connected NetworkOperatorPreference. @VisibleForTesting
private PreferenceCategory mConnectedNetworkOperatorsPreference; PreferenceCategory mConnectedPreferenceCategory;
// manage the progress bar on the top of the page. @VisibleForTesting
NetworkOperatorPreference mSelectedPreference;
private View mProgressHeader; private View mProgressHeader;
private Preference mStatusMessagePreference; private Preference mStatusMessagePreference;
private List<CellInfo> mCellInfoList; @VisibleForTesting
List<CellInfo> mCellInfoList;
private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
private NetworkOperatorPreference mSelectedNetworkOperatorPreference; @VisibleForTesting
private TelephonyManager mTelephonyManager; TelephonyManager mTelephonyManager;
private List<String> mForbiddenPlmns; private List<String> mForbiddenPlmns;
//Flag indicating whether we have called bind on the service. private boolean mShow4GForLTE = true;
private boolean mShouldUnbind; private NetworkScanHelper mNetworkScanHelper;
private final ExecutorService mNetworkScanExecutor = Executors.newFixedThreadPool(1);
private final Runnable mUpdateNetworkOperatorsRunnable = () -> { private MetricsFeatureProvider mMetricsFeatureProvider;
updateNetworkOperatorsPreferenceCategory(); private boolean mUseNewApi;
};
/**
* 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 @Override
public void onCreate(Bundle icicle) { public void onCreate(Bundle icicle) {
if (DBG) logd("onCreate");
super.onCreate(icicle); super.onCreate(icicle);
mSubId = getArguments().getInt(KEY_SUBSCRIPTION_ID); mUseNewApi = getContext().getResources().getBoolean(
com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI);
mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID);
mConnectedNetworkOperatorsPreference = addPreferencesFromResource(R.xml.choose_network);
mConnectedPreferenceCategory =
(PreferenceCategory) findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR); (PreferenceCategory) findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR);
mNetworkOperatorsPreferences = mPreferenceCategory =
(PreferenceCategory) findPreference(PREF_KEY_NETWORK_OPERATORS); (PreferenceCategory) findPreference(PREF_KEY_NETWORK_OPERATORS);
mStatusMessagePreference = new Preference(getContext()); mStatusMessagePreference = new Preference(getContext());
mSelectedNetworkOperatorPreference = null; mSelectedPreference = null;
mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId); mTelephonyManager = TelephonyManager.from(getContext()).createForSubscriptionId(mSubId);
setRetainInstance(true); 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);
}
mMetricsFeatureProvider = FeatureFactory
.getFactory(getContext()).getMetricsFeatureProvider();
} }
@Override @Override
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
mProgressHeader = setPinnedHeaderView(R.layout.wifi_progress_header) final Activity activity = getActivity();
.findViewById(R.id.progress_bar_animation); if (activity != null) {
setProgressBarVisible(false); mProgressHeader = setPinnedHeaderView(R.layout.wifi_progress_header)
forceConfigConnectedNetworkOperatorsPreferenceCategory(); .findViewById(R.id.progress_bar_animation);
setProgressBarVisible(false);
}
forceUpdateConnectedPreferenceCategory();
} }
@Override @Override
public void onStart() { public void onStart() {
super.onStart(); super.onStart();
new AsyncTask<Void, Void, List<String>>() { mForbiddenPlmns = Arrays.asList(mTelephonyManager.getForbiddenPlmns());
@Override setProgressBarVisible(true);
protected List<String> doInBackground(Void... voids) {
String[] forbiddenPlmns = mTelephonyManager.getForbiddenPlmns();
return forbiddenPlmns != null ? Arrays.asList(forbiddenPlmns) : null;
}
@Override
protected void onPostExecute(List<String> result) {
mForbiddenPlmns = result;
bindNetworkQueryService();
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
/**
* 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");
stopNetworkQuery();
setProgressBarVisible(false);
if (preference instanceof NetworkOperatorPreference) {
// Refresh the last selected item in case users reselect network.
if (mSelectedNetworkOperatorPreference != null) {
mSelectedNetworkOperatorPreference.setSummary("");
}
mSelectedNetworkOperatorPreference = (NetworkOperatorPreference) preference;
CellInfo cellInfo = mSelectedNetworkOperatorPreference.getCellInfo();
if (DBG) logd("User click a NetworkOperatorPreference: " + cellInfo.toString());
// Send metrics event
MetricsLogger.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);
}
}
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.getOperatorNumeric(), true /* persistSelection */);
msg.sendToTarget();
});
setProgressBarVisible(true);
return true;
} else {
loge("Error selecting network. Subscription Id is invalid.");
mSelectedNetworkOperatorPreference = null;
return false;
}
if (mUseNewApi) {
mNetworkScanHelper.startNetworkScan(
NetworkScanHelper.NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS);
} else { } else {
getPreferenceScreen().setEnabled(false); mNetworkScanHelper.startNetworkScan(
return false; NetworkScanHelper.NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS);
} }
} }
@Override @Override
public void onStop() { public void onStop() {
super.onStop(); super.onStop();
if (DBG) logd("onStop");
getView().removeCallbacks(mUpdateNetworkOperatorsRunnable);
stopNetworkQuery(); stopNetworkQuery();
// Unbind the NetworkQueryService }
unbindNetworkQueryService();
@Override
public boolean onPreferenceTreeClick(Preference preference) {
if (preference != mSelectedPreference) {
stopNetworkQuery();
setProgressBarVisible(false);
// Refresh the last selected item in case users reselect network.
if (mSelectedPreference != null) {
mSelectedPreference.setSummary(null);
}
mSelectedPreference = (NetworkOperatorPreference) preference;
CellInfo cellInfo = mSelectedPreference.getCellInfo();
mMetricsFeatureProvider.action(getContext(),
MetricsEvent.ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK);
// 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);
}
}
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);
}
return true;
} }
@Override @Override
@@ -239,38 +198,18 @@ public class NetworkSelectSettings extends DashboardFragment {
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
//TODO(b/114749736): add metrics id for this page return MOBILE_NETWORK_SELECT;
return 0;
} }
private final Handler mHandler = new Handler() { private final Handler mHandler = new Handler() {
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
switch (msg.what) { 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! ");
updateNetworkSelection();
// Set summary as "Couldn't connect" to the selected network.
mSelectedNetworkOperatorPreference.setSummary(
R.string.network_could_not_connect);
}
break;
case EVENT_NETWORK_SCAN_RESULTS: case EVENT_NETWORK_SCAN_RESULTS:
List<CellInfo> results = aggregateCellInfoList((List<CellInfo>) msg.obj); List<CellInfo> results = aggregateCellInfoList((List<CellInfo>) msg.obj);
mCellInfoList = new ArrayList<>(results); mCellInfoList = new ArrayList<>(results);
if (DBG) logd("after aggregate: " + mCellInfoList.toString());
if (mCellInfoList != null && mCellInfoList.size() != 0) { if (mCellInfoList != null && mCellInfoList.size() != 0) {
updateNetworkOperators(); updateAllPreferenceCategory();
} else { } else {
addMessagePreference(R.string.empty_networks_list); addMessagePreference(R.string.empty_networks_list);
} }
@@ -278,15 +217,12 @@ public class NetworkSelectSettings extends DashboardFragment {
break; break;
case EVENT_NETWORK_SCAN_ERROR: case EVENT_NETWORK_SCAN_ERROR:
int error = msg.arg1;
if (DBG) logd("error while querying available networks " + error);
stopNetworkQuery(); stopNetworkQuery();
addMessagePreference(R.string.network_query_error); addMessagePreference(R.string.network_query_error);
break; break;
case EVENT_NETWORK_SCAN_COMPLETED: case EVENT_NETWORK_SCAN_COMPLETED:
stopNetworkQuery(); stopNetworkQuery();
if (DBG) logd("scan complete");
if (mCellInfoList == null) { if (mCellInfoList == null) {
// In case the scan timeout before getting any results // In case the scan timeout before getting any results
addMessagePreference(R.string.empty_networks_list); addMessagePreference(R.string.empty_networks_list);
@@ -297,17 +233,24 @@ public class NetworkSelectSettings extends DashboardFragment {
} }
}; };
private void updateNetworkOperators() { private final NetworkScanHelper.NetworkScanCallback mCallback =
if (DBG) logd("updateNetworkOperators"); new NetworkScanHelper.NetworkScanCallback() {
if (getActivity() != null) { public void onResults(List<CellInfo> results) {
final View view = getView(); Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_RESULTS, results);
final Handler handler = view.getHandler(); msg.sendToTarget();
if (handler != null && handler.hasCallbacks(mUpdateNetworkOperatorsRunnable)) { }
return;
} public void onComplete() {
view.post(mUpdateNetworkOperatorsRunnable); Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_COMPLETED);
} msg.sendToTarget();
} }
public void onError(int error) {
Message msg = mHandler.obtainMessage(EVENT_NETWORK_SCAN_ERROR, error,
0 /* arg2 */);
msg.sendToTarget();
}
};
/** /**
* Update the currently available network operators list, which only contains the unregistered * Update the currently available network operators list, which only contains the unregistered
@@ -317,17 +260,18 @@ public class NetworkSelectSettings extends DashboardFragment {
* network operator in the connected network operator category shows "Connected", it will not * network operator in the connected network operator category shows "Connected", it will not
* exist in the available network category. * exist in the available network category.
*/ */
private void updateNetworkOperatorsPreferenceCategory() { @VisibleForTesting
mNetworkOperatorsPreferences.removeAll(); void updateAllPreferenceCategory() {
updateConnectedPreferenceCategory();
configConnectedNetworkOperatorsPreferenceCategory(); mPreferenceCategory.removeAll();
for (int index = 0; index < mCellInfoList.size(); index++) { for (int index = 0; index < mCellInfoList.size(); index++) {
if (!mCellInfoList.get(index).isRegistered()) { if (!mCellInfoList.get(index).isRegistered()) {
NetworkOperatorPreference pref = new NetworkOperatorPreference( NetworkOperatorPreference pref = new NetworkOperatorPreference(
mCellInfoList.get(index), getContext(), mForbiddenPlmns); mCellInfoList.get(index), getContext(), mForbiddenPlmns, mShow4GForLTE);
pref.setKey(CellInfoUtil.getNetworkTitle(mCellInfoList.get(index))); pref.setKey(CellInfoUtil.getNetworkTitle(mCellInfoList.get(index)));
pref.setOrder(index); pref.setOrder(index);
mNetworkOperatorsPreferences.addPreference(pref); mPreferenceCategory.addPreference(pref);
} }
} }
} }
@@ -345,41 +289,35 @@ public class NetworkSelectSettings extends DashboardFragment {
* - If the device has no data, we will remove the connected network operators list from the * - If the device has no data, we will remove the connected network operators list from the
* screen. * screen.
*/ */
private void forceConfigConnectedNetworkOperatorsPreferenceCategory() { private void forceUpdateConnectedPreferenceCategory() {
if (DBG) logd("Force config ConnectedNetworkOperatorsPreferenceCategory");
if (mTelephonyManager.getDataState() == mTelephonyManager.DATA_CONNECTED) { if (mTelephonyManager.getDataState() == mTelephonyManager.DATA_CONNECTED) {
// Try to get the network registration states // Try to get the network registration states
ServiceState ss = mTelephonyManager.getServiceState(); ServiceState ss = mTelephonyManager.getServiceState();
List<NetworkRegistrationState> networkList = List<NetworkRegistrationState> networkList =
ss.getNetworkRegistrationStates(AccessNetworkConstants.TransportType.WWAN); ss.getNetworkRegistrationStates(AccessNetworkConstants.TransportType.WWAN);
if (networkList == null || networkList.size() == 0) { if (networkList == null || networkList.size() == 0) {
loge("getNetworkRegistrationStates return null");
// Remove the connected network operators category // Remove the connected network operators category
removeConnectedNetworkOperatorPreference(); mConnectedPreferenceCategory.setVisible(false);
return; return;
} }
CellIdentity cellIdentity = networkList.get(0).getCellIdentity(); CellIdentity cellIdentity = networkList.get(0).getCellIdentity();
CellInfo cellInfo = CellInfoUtil.wrapCellInfoWithCellIdentity(cellIdentity); CellInfo cellInfo = CellInfoUtil.wrapCellInfoWithCellIdentity(cellIdentity);
if (cellInfo != null) { if (cellInfo != null) {
if (DBG) logd("Currently registered cell: " + cellInfo.toString()); NetworkOperatorPreference pref = new NetworkOperatorPreference(
NetworkOperatorPreference pref = cellInfo, getContext(), mForbiddenPlmns, mShow4GForLTE);
new NetworkOperatorPreference(cellInfo, getContext(), mForbiddenPlmns);
pref.setTitle(mTelephonyManager.getNetworkOperatorName()); pref.setTitle(mTelephonyManager.getNetworkOperatorName());
pref.setSummary(R.string.network_connected); pref.setSummary(R.string.network_connected);
// Update the signal strength icon, since the default signalStrength value would be // 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) // zero (it would be quite confusing why the connected network has no signal)
pref.setIcon(NetworkOperatorPreference.NUMBER_OF_LEVELS - 1); pref.setIcon(NetworkOperatorPreference.NUMBER_OF_LEVELS - 1);
mConnectedPreferenceCategory.addPreference(pref);
mConnectedNetworkOperatorsPreference.addPreference(pref);
} else { } else {
loge("Invalid CellIfno: " + cellInfo.toString());
// Remove the connected network operators category // Remove the connected network operators category
removeConnectedNetworkOperatorPreference(); mConnectedPreferenceCategory.setVisible(false);
} }
} else { } else {
if (DBG) logd("No currently registered cell");
// Remove the connected network operators category // Remove the connected network operators category
removeConnectedNetworkOperatorPreference(); mConnectedPreferenceCategory.setVisible(false);
} }
} }
@@ -388,13 +326,7 @@ public class NetworkSelectSettings extends DashboardFragment {
* configured if the category is currently empty or the operator network title of the previous * configured if the category is currently empty or the operator network title of the previous
* connected network is different from the new one. * connected network is different from the new one.
*/ */
private void configConnectedNetworkOperatorsPreferenceCategory() { private void updateConnectedPreferenceCategory() {
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();
}
CellInfo connectedNetworkOperator = null; CellInfo connectedNetworkOperator = null;
for (CellInfo cellInfo : mCellInfoList) { for (CellInfo cellInfo : mCellInfoList) {
if (cellInfo.isRegistered()) { if (cellInfo.isRegistered()) {
@@ -402,60 +334,19 @@ public class NetworkSelectSettings extends DashboardFragment {
break; break;
} }
} }
if (connectedNetworkOperator == null) {
if (DBG) logd("no registered network");
removeConnectedNetworkOperatorPreference();
return;
}
// config the category if it is empty. if (connectedNetworkOperator != null) {
if (mConnectedNetworkOperatorsPreference.getPreferenceCount() == 0) {
if (DBG) logd("ConnectedNetworkSelectList is empty, add one");
addConnectedNetworkOperatorPreference(connectedNetworkOperator); 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) { private void addConnectedNetworkOperatorPreference(CellInfo cellInfo) {
if (DBG) logd("addConnectedNetworkOperatorPreference"); mConnectedPreferenceCategory.removeAll();
// Remove the current ConnectedNetworkOperatorsPreference final NetworkOperatorPreference pref = new NetworkOperatorPreference(
removeConnectedNetworkOperatorPreference(); cellInfo, getContext(), mForbiddenPlmns, mShow4GForLTE);
final NetworkOperatorPreference pref =
new NetworkOperatorPreference(cellInfo, getContext(), mForbiddenPlmns);
pref.setSummary(R.string.network_connected); pref.setSummary(R.string.network_connected);
mConnectedNetworkOperatorsPreference.addPreference(pref); mConnectedPreferenceCategory.addPreference(pref);
PreferenceScreen preferenceScreen = getPreferenceScreen(); mConnectedPreferenceCategory.setVisible(true);
preferenceScreen.addPreference(mConnectedNetworkOperatorsPreference);
}
/** Removes all preferences and hide the {@link #mConnectedNetworkOperatorsPreference}. */
private void removeConnectedNetworkOperatorPreference() {
mConnectedNetworkOperatorsPreference.removeAll();
PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.removePreference(mConnectedNetworkOperatorsPreference);
} }
protected void setProgressBarVisible(boolean visible) { protected void setProgressBarVisible(boolean visible) {
@@ -465,14 +356,11 @@ public class NetworkSelectSettings extends DashboardFragment {
} }
private void addMessagePreference(int messageId) { private void addMessagePreference(int messageId) {
if (DBG) logd("remove callback");
getView().removeCallbacks(mUpdateNetworkOperatorsRunnable);
setProgressBarVisible(false); setProgressBarVisible(false);
if (DBG) logd("addMessagePreference");
mStatusMessagePreference.setTitle(messageId); mStatusMessagePreference.setTitle(messageId);
removeConnectedNetworkOperatorPreference(); mConnectedPreferenceCategory.setVisible(false);
mNetworkOperatorsPreferences.removeAll(); mPreferenceCategory.removeAll();
mNetworkOperatorsPreferences.addPreference(mStatusMessagePreference); mPreferenceCategory.addPreference(mStatusMessagePreference);
} }
/** /**
@@ -481,7 +369,6 @@ public class NetworkSelectSettings extends DashboardFragment {
* with the strongest signal strength. * with the strongest signal strength.
*/ */
private List<CellInfo> aggregateCellInfoList(List<CellInfo> cellInfoList) { private List<CellInfo> aggregateCellInfoList(List<CellInfo> cellInfoList) {
if (DBG) logd("before aggregate: " + cellInfoList.toString());
Map<String, CellInfo> map = new HashMap<>(); Map<String, CellInfo> map = new HashMap<>();
for (CellInfo cellInfo : cellInfoList) { for (CellInfo cellInfo : cellInfoList) {
String plmn = CellInfoUtil.getOperatorInfoFromCellInfo(cellInfo).getOperatorNumeric(); String plmn = CellInfoUtil.getOperatorInfoFromCellInfo(cellInfo).getOperatorNumeric();
@@ -501,57 +388,15 @@ public class NetworkSelectSettings extends DashboardFragment {
return new ArrayList<>(map.values()); return new ArrayList<>(map.values());
} }
private void loadNetworksList() { private void stopNetworkQuery() {
if (DBG) logd("load networks list..."); if (mNetworkScanHelper != null) {
setProgressBarVisible(true); mNetworkScanHelper.stopNetworkQuery();
//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 updateNetworkSelection() { @Override
if (DBG) logd("Update notification about no service of user selected operator"); public void onDestroy() {
//TODO(b/114749736): update network selection once b/115429509 is done mNetworkScanExecutor.shutdown();
super.onDestroy();
} }
private void stopNetworkQuery() {
// Stop the network query process
//TODO(b/114749736): stop service/manager query once b/115401728 is done
}
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;
}
};
} }

View File

@@ -50,6 +50,7 @@ com.android.settings.inputmethod.SpellCheckersSettings
com.android.settings.localepicker.LocaleListEditor com.android.settings.localepicker.LocaleListEditor
com.android.settings.network.ApnEditor com.android.settings.network.ApnEditor
com.android.settings.network.ApnSettings com.android.settings.network.ApnSettings
com.android.settings.network.telephony.NetworkSelectSettings
com.android.settings.notification.AppNotificationSettings com.android.settings.notification.AppNotificationSettings
com.android.settings.notification.ChannelGroupNotificationSettings com.android.settings.notification.ChannelGroupNotificationSettings
com.android.settings.notification.ChannelNotificationSettings com.android.settings.notification.ChannelNotificationSettings

View File

@@ -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);
}
}