[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

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2021 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="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?android:attr/colorAccent">
<path
android:fillColor="@android:color/white"
android:pathData="M13,9v2h7V4h-2v2.74C16.53,5.07 14.4,4 12,4c-2.21,0 -4.21,0.9 -5.66,2.34S4,9.79 4,12c0,4.42 3.58,8 8,8 2.21,0 4.21,-0.9 5.66,-2.34l-1.42,-1.42C15.15,17.33 13.65,18 12,18c-3.31,0 -6,-2.69 -6,-6 0,-1.65 0.67,-3.15 1.76,-4.24C8.85,6.67 10.35,6 12,6c2.21,0 4.15,1.21 5.19,3H13z"/>
</vector>

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2021 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.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/content_margin_left"
android:layout_marginEnd="@dimen/content_margin_left"
android:layout_marginTop="@dimen/description_margin_top"
android:layout_marginBottom="@dimen/description_margin_top"
android:gravity="center_vertical"
android:orientation="horizontal">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/reset_internet_ring_progress_right_margin"
style="?android:attr/progressBarStyleSmallTitle"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/resetting_internet_text"
android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout>
</LinearLayout>

View File

@@ -209,6 +209,7 @@
<!-- Internet Preferences -->
<dimen name="view_airplane_mode_networks_button_margin_vertical">24dp</dimen>
<dimen name="reset_internet_ring_progress_right_margin">4dp</dimen>
<!-- Color picker -->
<dimen name="color_swatch_size">16dp</dimen>

View File

@@ -12536,6 +12536,16 @@
<string name="viewing_airplane_mode_networks">Viewing airplane mode networks</string>
<!-- Label text to turn off airplane mode. [CHAR LIMIT=40] -->
<string name="turn_off_airplane_mode">Turn off airplane mode</string>
<!-- Title for interrupting the voice call alert. [CHAR_LIMIT=NONE] -->
<string name="reset_your_internet_title">Reset your internet?</string>
<!-- Description for interrupting the voice call alert. [CHAR_LIMIT=NONE] -->
<string name="reset_internet_text" product="default">This will end your phone call</string>
<!-- Description for interrupting the voice call alert. [CHAR_LIMIT=NONE] -->
<string name="reset_internet_text" product="tablet">This will end your phone call</string>
<!-- Description to wait device resetting internet networks. [CHAR_LIMIT=NONE] -->
<string name="resetting_internet_text">Resetting your internet\u2026</string>
<!-- Menu option for data connectivity recovery for all requested technologies. [CHAR_LIMIT=NONE] -->
<string name="fix_connectivity">Fix connectivity</string>
<!-- Summary text separator for preferences including a short description
(eg. "Connected / 5G"). [CHAR LIMIT=50] -->

View File

@@ -20,6 +20,14 @@
android:title="@string/provider_internet_settings"
settings:keywords="@string/keywords_wifi">
<!-- Resetting your internet description -->
<com.android.settingslib.widget.LayoutPreference
android:key="resetting_your_internet"
android:title="@string/resetting_internet_text"
android:selectable="false"
android:layout="@layout/resetting_internet"
settings:allowDividerBelow="true"/>
<!-- View airplane mode networks button -->
<com.android.settingslib.widget.LayoutPreference
android:key="view_airplane_mode_netwokrs_button"

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

View File

@@ -90,9 +90,7 @@ public class ViewAirplaneModeNetworksLayoutPreferenceController extends Abstract
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
if (isAvailable()) {
generateLayout();
}
generateLayout();
}
/** Lifecycle.Event.ON_START */
@@ -158,4 +156,13 @@ public class ViewAirplaneModeNetworksLayoutPreferenceController extends Abstract
mButton.setVisibility(isWifiEnabled ? View.GONE : View.VISIBLE);
}
}
/**
* Sets the visibility of the preference.
*/
public void setVisible(boolean visible) {
if (mPreference != null) {
mPreference.setVisible(visible);
}
}
}

View File

@@ -27,6 +27,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -44,6 +45,7 @@ import android.os.PowerManager;
import android.os.UserManager;
import android.provider.Settings;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import androidx.fragment.app.FragmentActivity;
@@ -59,6 +61,8 @@ import com.android.settings.testutils.shadow.ShadowFragment;
import com.android.settings.wifi.AddWifiNetworkPreference;
import com.android.settings.wifi.WifiConfigController2;
import com.android.settings.wifi.WifiDialog2;
import com.android.settingslib.connectivity.ConnectivitySubsystemsRecoveryManager;
import com.android.settingslib.widget.LayoutPreference;
import com.android.settingslib.wifi.LongPressWifiEntryPreference;
import com.android.wifitrackerlib.WifiEntry;
import com.android.wifitrackerlib.WifiPickerTracker;
@@ -91,6 +95,15 @@ public class NetworkProviderSettingsTest {
private WifiPickerTracker mMockWifiPickerTracker;
@Mock
private PreferenceManager mPreferenceManager;
@Mock
private ConnectivitySubsystemsRecoveryManager mConnectivitySubsystemsRecoveryManager;
@Mock
private ViewAirplaneModeNetworksLayoutPreferenceController
mViewAirplaneModeNetworksButtonPreference;
@Mock
private LayoutPreference mResetInternetPreference;
@Mock
private MenuItem mMenuItem;
@Before
public void setUp() {
@@ -374,4 +387,57 @@ public class NetworkProviderSettingsTest {
when(wifiDialog2.getController()).thenReturn(controller);
return wifiDialog2;
}
@Test
public void onOptionsItemSelected_fixConnectivity_triggerSubsystemRestart() {
doReturn(true).when(mConnectivitySubsystemsRecoveryManager).isRecoveryAvailable();
mNetworkProviderSettings.mConnectivitySubsystemsRecoveryManager =
mConnectivitySubsystemsRecoveryManager;
doReturn(false).when(mNetworkProviderSettings).isPhoneOnCall();
doReturn(NetworkProviderSettings.MENU_FIX_CONNECTIVITY).when(mMenuItem).getItemId();
mNetworkProviderSettings.onOptionsItemSelected(mMenuItem);
verify(mConnectivitySubsystemsRecoveryManager).triggerSubsystemRestart(any(), any());
}
@Test
public void onOptionsItemSelected_fixConnectivityOnCall_neverTriggerSubsystemRestart() {
doReturn(true).when(mConnectivitySubsystemsRecoveryManager).isRecoveryAvailable();
mNetworkProviderSettings.mConnectivitySubsystemsRecoveryManager =
mConnectivitySubsystemsRecoveryManager;
doReturn(true).when(mNetworkProviderSettings).isPhoneOnCall();
doNothing().when(mNetworkProviderSettings).showResetInternetDialog();
doReturn(NetworkProviderSettings.MENU_FIX_CONNECTIVITY).when(mMenuItem).getItemId();
mNetworkProviderSettings.onOptionsItemSelected(mMenuItem);
verify(mConnectivitySubsystemsRecoveryManager, never()).triggerSubsystemRestart(any(),
any());
}
@Test
public void onSubsystemRestartOperationBegin_showResetInternetHideApmNetworks() {
mNetworkProviderSettings.mResetInternetPreference = mResetInternetPreference;
mNetworkProviderSettings.mViewAirplaneModeNetworksButtonPreference =
mViewAirplaneModeNetworksButtonPreference;
mNetworkProviderSettings.onSubsystemRestartOperationBegin();
verify(mResetInternetPreference).setVisible(true);
verify(mViewAirplaneModeNetworksButtonPreference).setVisible(false);
}
@Test
public void onSubsystemRestartOperationEnd_showApmNetworksHideResetInternet() {
mNetworkProviderSettings.mResetInternetPreference = mResetInternetPreference;
mNetworkProviderSettings.mViewAirplaneModeNetworksButtonPreference =
mViewAirplaneModeNetworksButtonPreference;
doReturn(true).when(mViewAirplaneModeNetworksButtonPreference).isAvailable();
mNetworkProviderSettings.onSubsystemRestartOperationEnd();
verify(mResetInternetPreference).setVisible(false);
verify(mViewAirplaneModeNetworksButtonPreference).setVisible(true);
}
}