|
|
|
@@ -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,113 +111,81 @@ 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onPostExecute(List<String> result) {
|
|
|
|
|
mForbiddenPlmns = result;
|
|
|
|
|
loadNetworksList();
|
|
|
|
|
}
|
|
|
|
|
}.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, true /* persistSelection */);
|
|
|
|
|
msg.sendToTarget();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
setProgressBarVisible(true);
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
loge("Error selecting network. Subscription Id is invalid.");
|
|
|
|
|
mSelectedNetworkOperatorPreference = null;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
mForbiddenPlmns = Arrays.asList(mTelephonyManager.getForbiddenPlmns());
|
|
|
|
|
setProgressBarVisible(true);
|
|
|
|
|
|
|
|
|
|
if (mUseNewApi) {
|
|
|
|
|
mNetworkScanHelper.startNetworkScan(
|
|
|
|
|
NetworkScanHelper.NETWORK_SCAN_TYPE_INCREMENTAL_RESULTS);
|
|
|
|
|
} else {
|
|
|
|
|
getPreferenceScreen().setEnabled(false);
|
|
|
|
|
return false;
|
|
|
|
|
mNetworkScanHelper.startNetworkScan(
|
|
|
|
|
NetworkScanHelper.NETWORK_SCAN_TYPE_WAIT_FOR_ALL_RESULTS);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onStop() {
|
|
|
|
|
super.onStop();
|
|
|
|
|
if (DBG) logd("onStop");
|
|
|
|
|
getView().removeCallbacks(mUpdateNetworkOperatorsRunnable);
|
|
|
|
|
stopNetworkQuery();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@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
|
|
|
|
|
protected int getPreferenceScreenResId() {
|
|
|
|
|
return R.xml.choose_network;
|
|
|
|
@@ -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;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|