[Provider Model] Add Fix connectivity toggle to Internet Settings

- Add Fix connectivity toggle in menu item

- Show "Resetting your internet..." when recovering

- Screenshot:
  https://screenshot.googleplex.com/BPyRADfNUoPE8Dc

Bug: 172297799
Test: manual test
- make RunSettingsRoboTests ROBOTEST_FILTER=NetworkProviderSettingsTest

Change-Id: I27594d24659ca281e224f86accc20d49514d5001
This commit is contained in:
Weng Su
2021-01-18 02:13:08 +00:00
parent 88ffca9af9
commit 598934d645
8 changed files with 276 additions and 5 deletions

View File

@@ -32,19 +32,24 @@ import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.PowerManager;
import android.os.Process;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceScreen;
@@ -71,8 +76,10 @@ import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settingslib.HelpUtils;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.connectivity.ConnectivitySubsystemsRecoveryManager;
import com.android.settingslib.search.Indexable;
import com.android.settingslib.search.SearchIndexable;
import com.android.settingslib.widget.LayoutPreference;
import com.android.settingslib.wifi.LongPressWifiEntryPreference;
import com.android.settingslib.wifi.WifiSavedConfigUtils;
import com.android.wifitrackerlib.WifiEntry;
@@ -90,7 +97,8 @@ import java.util.Optional;
@SearchIndexable
public class NetworkProviderSettings extends RestrictedSettingsFragment
implements Indexable, WifiPickerTracker.WifiPickerTrackerCallback,
WifiDialog2.WifiDialog2Listener, DialogInterface.OnDismissListener {
WifiDialog2.WifiDialog2Listener, DialogInterface.OnDismissListener,
ConnectivitySubsystemsRecoveryManager.RecoveryStatusCallback {
public static final String ACTION_NETWORK_PROVIDER_SETTINGS =
"android.settings.NETWORK_PROVIDER_SETTINGS";
@@ -103,6 +111,7 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
@VisibleForTesting
static final int MENU_ID_FORGET = Menu.FIRST + 3;
static final int MENU_ID_MODIFY = Menu.FIRST + 4;
static final int MENU_FIX_CONNECTIVITY = Menu.FIRST + 5;
@VisibleForTesting
static final int ADD_NETWORK_REQUEST = 2;
@@ -117,6 +126,7 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
private static final String PREF_KEY_SAVED_NETWORKS = "saved_networks";
@VisibleForTesting
static final String PREF_KEY_DATA_USAGE = "non_carrier_data_usage";
private static final String PREF_KEY_RESET_INTERNET = "resetting_your_internet";
private static final int REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER = 0;
@@ -163,6 +173,10 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
private WifiManager.ActionListener mSaveListener;
private WifiManager.ActionListener mForgetListener;
@VisibleForTesting
protected ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager;
private HandlerThread mRecoveryThread;
/**
* The state of {@link #isUiRestricted()} at {@link #onCreate(Bundle)}}. This is necessary to
* ensure that behavior is consistent if {@link #isUiRestricted()} changes. It could be changed
@@ -188,8 +202,11 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
Preference mSavedNetworksPreference;
@VisibleForTesting
DataUsagePreference mDataUsagePreference;
private ViewAirplaneModeNetworksLayoutPreferenceController
@VisibleForTesting
ViewAirplaneModeNetworksLayoutPreferenceController
mViewAirplaneModeNetworksButtonPreference;
@VisibleForTesting
LayoutPreference mResetInternetPreference;
/**
* Mobile networks list for provider model
@@ -244,6 +261,10 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
mDataUsagePreference.setTemplate(NetworkTemplate.buildTemplateWifiWildcard(),
0 /*subId*/,
null /*service*/);
mResetInternetPreference = findPreference(PREF_KEY_RESET_INTERNET);
if (mResetInternetPreference != null) {
mResetInternetPreference.setVisible(false);
}
addNetworkMobileProviderController();
addViewAirplaneModeNetworksButtonController();
}
@@ -1078,4 +1099,89 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
Intent getHelpIntent(Context context, String helpUrlString) {
return HelpUtils.getHelpIntent(context, helpUrlString, context.getClass().getName());
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
MenuItem item = menu.add(0, MENU_FIX_CONNECTIVITY, 0, R.string.fix_connectivity);
item.setIcon(R.drawable.ic_refresh_24dp);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
if (menuItem.getItemId() == MENU_FIX_CONNECTIVITY) {
if (isPhoneOnCall()) {
showResetInternetDialog();
return true;
}
fixConnectivity();
return true;
}
return super.onOptionsItemSelected(menuItem);
}
@VisibleForTesting
void showResetInternetDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
DialogInterface.OnClickListener resetInternetClickListener =
new Dialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
fixConnectivity();
}
};
builder.setTitle(R.string.reset_your_internet_title)
.setMessage(R.string.reset_internet_text)
.setPositiveButton(R.string.tts_reset, resetInternetClickListener)
.setNegativeButton(android.R.string.cancel, null)
.create()
.show();
}
@VisibleForTesting
boolean isPhoneOnCall() {
TelephonyManager mTelephonyManager = getActivity().getSystemService(TelephonyManager.class);
int state = mTelephonyManager.getCallState();
return state != TelephonyManager.CALL_STATE_IDLE;
}
private void fixConnectivity() {
if (mConnectivitySubsystemsRecoveryManager == null) {
mRecoveryThread = new HandlerThread(TAG
+ "{" + Integer.toHexString(System.identityHashCode(this)) + "}",
Process.THREAD_PRIORITY_BACKGROUND);
mRecoveryThread.start();
mConnectivitySubsystemsRecoveryManager = new ConnectivitySubsystemsRecoveryManager(
getContext(), mRecoveryThread.getThreadHandler());
}
if (mConnectivitySubsystemsRecoveryManager.isRecoveryAvailable()) {
mConnectivitySubsystemsRecoveryManager.triggerSubsystemRestart(TAG, this);
}
}
/**
* Callback for the internet recovery started.
*/
public void onSubsystemRestartOperationBegin() {
if (mResetInternetPreference != null) {
mResetInternetPreference.setVisible(true);
}
if (mViewAirplaneModeNetworksButtonPreference != null) {
mViewAirplaneModeNetworksButtonPreference.setVisible(false);
}
}
/**
* Callback for the internet recovery ended.
*/
public void onSubsystemRestartOperationEnd() {
if (mResetInternetPreference != null) {
mResetInternetPreference.setVisible(false);
}
if (mViewAirplaneModeNetworksButtonPreference != null
&& mViewAirplaneModeNetworksButtonPreference.isAvailable()) {
mViewAirplaneModeNetworksButtonPreference.setVisible(true);
}
}
}