[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:
26
res/drawable/ic_refresh_24dp.xml
Normal file
26
res/drawable/ic_refresh_24dp.xml
Normal 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>
|
47
res/layout/resetting_internet.xml
Normal file
47
res/layout/resetting_internet.xml
Normal 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>
|
@@ -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>
|
||||
|
@@ -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] -->
|
||||
|
@@ -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"
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user