Modify the condition of MENU_FIX_CONNECTIVITY
This condition adds checking "whether wifi is enabled"
Bug: 303100761
Test: build pass. local test
make RunSettingsRoboTests ROBOTEST_FILTER=NetworkProviderSettingsTest ->pass
Change-Id: Ib0aa92a77e7fcdbfd2d37e28474e3ef138275ca5
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index 793fecc..bc271ca 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -49,9 +49,11 @@
import android.view.View;
import android.widget.Toast;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog;
+import androidx.core.view.MenuProvider;
import androidx.fragment.app.Fragment;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
@@ -249,6 +251,8 @@
ConnectedEthernetNetworkController mConnectedEthernetNetworkController;
@VisibleForTesting
FooterPreference mWifiStatusMessagePreference;
+ @VisibleForTesting
+ MenuProvider mMenuProvider;
/**
* Mobile networks list for provider model
@@ -306,6 +310,44 @@
mIsRestricted = isUiRestricted();
updateUserType();
+
+ mMenuProvider = new MenuProvider() {
+ @Override
+ public void onCreateMenu(@NonNull Menu menu, @NonNull MenuInflater menuInflater) {
+ MenuItem fixConnectivityItem = menu.add(0, MENU_FIX_CONNECTIVITY, 0,
+ R.string.fix_connectivity);
+ fixConnectivityItem.setIcon(R.drawable.ic_repair_24dp);
+ fixConnectivityItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+ }
+
+ @Override
+ public boolean onMenuItemSelected(@NonNull MenuItem menuItem) {
+ if (menuItem.getItemId() == MENU_FIX_CONNECTIVITY) {
+ if (isPhoneOnCall()) {
+ showResetInternetDialog();
+ return true;
+ }
+ fixConnectivity();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void onPrepareMenu(@NonNull Menu menu) {
+ MenuProvider.super.onPrepareMenu(menu);
+
+ boolean isWifiEnabled = mWifiPickerTracker != null
+ && mWifiPickerTracker.getWifiState() == WifiManager.WIFI_STATE_ENABLED;
+ boolean isAirplaneModeOn =
+ mAirplaneModeEnabler != null && mAirplaneModeEnabler.isAirplaneModeOn();
+ MenuItem fixConnectivityItem = menu.findItem(MENU_FIX_CONNECTIVITY);
+ if (fixConnectivityItem == null) {
+ return;
+ }
+ fixConnectivityItem.setVisible(!mIsGuest && (!isAirplaneModeOn || isWifiEnabled));
+ }
+ };
}
private void updateUserType() {
@@ -425,7 +467,6 @@
}
}
};
- setHasOptionsMenu(true);
if (savedInstanceState != null) {
mDialogMode = savedInstanceState.getInt(SAVE_DIALOG_MODE);
@@ -444,12 +485,13 @@
if (mNetworkMobileProviderController != null) {
mNetworkMobileProviderController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper);
}
+
+ requireActivity().addMenuProvider(mMenuProvider);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
-
}
@Override
@@ -807,6 +849,9 @@
return;
}
+ // update the menu item
+ requireActivity().invalidateMenu();
+
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED:
setWifiScanMessage(/* isWifiEnabled */ true);
@@ -1397,29 +1442,6 @@
return HelpUtils.getHelpIntent(context, helpUrlString, context.getClass().getName());
}
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- if (!mIsGuest && !mAirplaneModeEnabler.isAirplaneModeOn()) {
- MenuItem item = menu.add(0, MENU_FIX_CONNECTIVITY, 0, R.string.fix_connectivity);
- item.setIcon(R.drawable.ic_repair_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());
@@ -1462,6 +1484,8 @@
@Override
public void onAirplaneModeChanged(boolean isAirplaneModeOn) {
updateAirplaneModeMsgPreference(isAirplaneModeOn /* visible */);
+ // update the menu item
+ requireActivity().invalidateMenu();
}
/**
diff --git a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
index a91af12..b1bd41d 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
@@ -286,7 +286,8 @@
private void setUpForOnCreate() {
final FragmentActivity activity = mock(FragmentActivity.class);
- when(mNetworkProviderSettings.getActivity()).thenReturn(activity);
+ doReturn(activity).when(mNetworkProviderSettings).requireActivity();
+ doReturn(activity).when(mNetworkProviderSettings).getActivity();
final Resources.Theme theme = mContext.getTheme();
when(activity.getTheme()).thenReturn(theme);
UserManager userManager = mock(UserManager.class);
@@ -484,59 +485,95 @@
when(controller.getConfig()).thenReturn(config);
WifiDialog2.WifiDialog2Listener listener = mock(WifiDialog2.WifiDialog2Listener.class);
final WifiDialog2 wifiDialog2 = spy(new WifiDialog2(mContext, listener, mWifiEntry, mode));
- when(wifiDialog2.getController()).thenReturn(controller);
+ doReturn(controller).when(wifiDialog2).getController();
return wifiDialog2;
}
- @Test
- public void onCreateOptionsMenu_isGuest_neverAddFixConnectivityMenu() {
- mNetworkProviderSettings.mIsGuest = true;
+ private void mockMenuConditions(boolean isGuest, boolean isAirplaneModeOn, boolean isWifiOn) {
+ mNetworkProviderSettings.mIsGuest = isGuest;
+ doReturn(isAirplaneModeOn).when(mAirplaneModeEnabler).isAirplaneModeOn();
+ when(mMockWifiPickerTracker.getWifiState()).thenReturn(
+ isWifiOn ? WifiManager.WIFI_STATE_ENABLED : WifiManager.WIFI_STATE_DISABLED);
- mNetworkProviderSettings.onCreateOptionsMenu(mMenu, null /* inflater */);
+ doReturn(mMenuItem).when(mMenu).findItem(MENU_FIX_CONNECTIVITY);
+ mNetworkProviderSettings.mAirplaneModeEnabler = mAirplaneModeEnabler;
+ mNetworkProviderSettings.mWifiPickerTracker = mMockWifiPickerTracker;
- verify(mMenu, never()).add(anyInt(), eq(MENU_FIX_CONNECTIVITY), anyInt(), anyInt());
}
@Test
- public void onCreateOptionsMenu_isNotGuest_addFixConnectivityMenu() {
- mNetworkProviderSettings.mIsGuest = false;
+ public void onCreateOptionsMenu_isGuest_hideFixConnectivityMenu() {
+ setUpForOnCreate();
+ mNetworkProviderSettings.onCreate(null);
+ mockMenuConditions(/*isGuest=*/ true, /*isAirplaneModeOn=*/ false, /*isWifiOn=*/ true);
- mNetworkProviderSettings.onCreateOptionsMenu(mMenu, null /* inflater */);
+ mNetworkProviderSettings.mMenuProvider.onPrepareMenu(mMenu);
- verify(mMenu).add(anyInt(), eq(MENU_FIX_CONNECTIVITY), anyInt(), anyInt());
+ verify(mMenuItem).setVisible(false);
+
}
@Test
- public void onCreateOptionsMenu_isAirplaneModeOn_neverAddFixConnectivityMenu() {
- doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn();
+ public void onCreateOptionsMenu_isNotGuest_showFixConnectivityMenu() {
+ setUpForOnCreate();
+ mNetworkProviderSettings.onCreate(null);
+ mockMenuConditions(/*isGuest=*/ false, /*isAirplaneModeOn=*/ false, /*isWifiOn=*/ true);
- mNetworkProviderSettings.onCreateOptionsMenu(mMenu, null /* inflater */);
+ mNetworkProviderSettings.mMenuProvider.onPrepareMenu(mMenu);
- verify(mMenu, never()).add(anyInt(), eq(MENU_FIX_CONNECTIVITY), anyInt(), anyInt());
+ verify(mMenuItem).setVisible(true);
+
}
@Test
- public void onCreateOptionsMenu_isNotAirplaneModeOn_addFixConnectivityMenu() {
- doReturn(false).when(mAirplaneModeEnabler).isAirplaneModeOn();
+ public void onCreateOptionsMenu_isAirplaneModeOnAndWifiOff_hideFixConnectivityMenu() {
+ setUpForOnCreate();
+ mNetworkProviderSettings.onCreate(null);
+ mockMenuConditions(/*isGuest=*/ false, /*isAirplaneModeOn=*/ true, /*isWifiOn=*/ false);
- mNetworkProviderSettings.onCreateOptionsMenu(mMenu, null /* inflater */);
+ mNetworkProviderSettings.mMenuProvider.onPrepareMenu(mMenu);
- verify(mMenu).add(anyInt(), eq(MENU_FIX_CONNECTIVITY), anyInt(), anyInt());
+ verify(mMenuItem).setVisible(false);
+ }
+
+ @Test
+ public void onCreateOptionsMenu_isAirplaneModeOnAndWifiOn_showFixConnectivityMenu() {
+ setUpForOnCreate();
+ mNetworkProviderSettings.onCreate(null);
+ mockMenuConditions(/*isGuest=*/ false, /*isAirplaneModeOn=*/ true, /*isWifiOn=*/ true);
+
+ mNetworkProviderSettings.mMenuProvider.onPrepareMenu(mMenu);
+
+ verify(mMenuItem).setVisible(true);
+ }
+
+ @Test
+ public void onCreateOptionsMenu_isNotAirplaneModeOn_showFixConnectivityMenu() {
+ setUpForOnCreate();
+ mNetworkProviderSettings.onCreate(null);
+ mockMenuConditions(/*isGuest=*/ false, /*isAirplaneModeOn=*/ false, /*isWifiOn=*/ true);
+
+ mNetworkProviderSettings.mMenuProvider.onPrepareMenu(mMenu);
+
+ verify(mMenuItem).setVisible(true);
}
@Test
public void onOptionsItemSelected_fixConnectivity_restartInternet() {
- mNetworkProviderSettings.mInternetResetHelper = mInternetResetHelper;
+ setUpForOnCreate();
doReturn(false).when(mNetworkProviderSettings).isPhoneOnCall();
- doReturn(NetworkProviderSettings.MENU_FIX_CONNECTIVITY).when(mMenuItem).getItemId();
+ doReturn(MENU_FIX_CONNECTIVITY).when(mMenuItem).getItemId();
+ mNetworkProviderSettings.onCreate(null);
+ mNetworkProviderSettings.mInternetResetHelper = mInternetResetHelper;
- mNetworkProviderSettings.onOptionsItemSelected(mMenuItem);
+ mNetworkProviderSettings.mMenuProvider.onMenuItemSelected(mMenuItem);
verify(mInternetResetHelper).restart();
}
@Test
public void onAirplaneModeChanged_apmIsOn_showApmMsg() {
+ setUpForOnCreate();
mNetworkProviderSettings.onAirplaneModeChanged(true);
verify(mAirplaneModeMsgPreference).setVisible(true);
@@ -544,6 +581,7 @@
@Test
public void onAirplaneModeChanged_apmIsOff_hideApmMsg() {
+ setUpForOnCreate();
mNetworkProviderSettings.onAirplaneModeChanged(false);
verify(mAirplaneModeMsgPreference).setVisible(false);