diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java index 793feccd93a..bc271ca74d3 100644 --- a/src/com/android/settings/network/NetworkProviderSettings.java +++ b/src/com/android/settings/network/NetworkProviderSettings.java @@ -49,9 +49,11 @@ import android.view.MenuItem; 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 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment ConnectedEthernetNetworkController mConnectedEthernetNetworkController; @VisibleForTesting FooterPreference mWifiStatusMessagePreference; + @VisibleForTesting + MenuProvider mMenuProvider; /** * Mobile networks list for provider model @@ -306,6 +310,44 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment 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 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment } } }; - setHasOptionsMenu(true); if (savedInstanceState != null) { mDialogMode = savedInstanceState.getInt(SAVE_DIALOG_MODE); @@ -444,12 +485,13 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment if (mNetworkMobileProviderController != null) { mNetworkMobileProviderController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper); } + + requireActivity().addMenuProvider(mMenuProvider); } @Override public void onAttach(Context context) { super.onAttach(context); - } @Override @@ -807,6 +849,9 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment return; } + // update the menu item + requireActivity().invalidateMenu(); + switch (wifiState) { case WifiManager.WIFI_STATE_ENABLED: setWifiScanMessage(/* isWifiEnabled */ true); @@ -1397,29 +1442,6 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment 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 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment @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 a91af128d5d..b1bd41d0bc9 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 @@ public class NetworkProviderSettingsTest { 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 @@ public class NetworkProviderSettingsTest { 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(mMenuItem).setVisible(false); - verify(mMenu).add(anyInt(), eq(MENU_FIX_CONNECTIVITY), anyInt(), anyInt()); } @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(mMenuItem).setVisible(true); - verify(mMenu, never()).add(anyInt(), eq(MENU_FIX_CONNECTIVITY), anyInt(), anyInt()); } @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 @@ public class NetworkProviderSettingsTest { @Test public void onAirplaneModeChanged_apmIsOff_hideApmMsg() { + setUpForOnCreate(); mNetworkProviderSettings.onAirplaneModeChanged(false); verify(mAirplaneModeMsgPreference).setVisible(false);