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
This commit is contained in:
SongFerngWang
2023-10-24 17:19:09 +08:00
parent 680a183ab7
commit b271e84e42
2 changed files with 109 additions and 47 deletions

View File

@@ -49,9 +49,11 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.core.view.MenuProvider;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceCategory;
@@ -249,6 +251,8 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
ConnectedEthernetNetworkController mConnectedEthernetNetworkController; ConnectedEthernetNetworkController mConnectedEthernetNetworkController;
@VisibleForTesting @VisibleForTesting
FooterPreference mWifiStatusMessagePreference; FooterPreference mWifiStatusMessagePreference;
@VisibleForTesting
MenuProvider mMenuProvider;
/** /**
* Mobile networks list for provider model * Mobile networks list for provider model
@@ -306,6 +310,44 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
mIsRestricted = isUiRestricted(); mIsRestricted = isUiRestricted();
updateUserType(); 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() { private void updateUserType() {
@@ -425,7 +467,6 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
} }
} }
}; };
setHasOptionsMenu(true);
if (savedInstanceState != null) { if (savedInstanceState != null) {
mDialogMode = savedInstanceState.getInt(SAVE_DIALOG_MODE); mDialogMode = savedInstanceState.getInt(SAVE_DIALOG_MODE);
@@ -444,12 +485,13 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
if (mNetworkMobileProviderController != null) { if (mNetworkMobileProviderController != null) {
mNetworkMobileProviderController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper); mNetworkMobileProviderController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper);
} }
requireActivity().addMenuProvider(mMenuProvider);
} }
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
} }
@Override @Override
@@ -807,6 +849,9 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
return; return;
} }
// update the menu item
requireActivity().invalidateMenu();
switch (wifiState) { switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED: case WifiManager.WIFI_STATE_ENABLED:
setWifiScanMessage(/* isWifiEnabled */ true); setWifiScanMessage(/* isWifiEnabled */ true);
@@ -1397,29 +1442,6 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
return HelpUtils.getHelpIntent(context, helpUrlString, context.getClass().getName()); 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 @VisibleForTesting
void showResetInternetDialog() { void showResetInternetDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
@@ -1462,6 +1484,8 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment
@Override @Override
public void onAirplaneModeChanged(boolean isAirplaneModeOn) { public void onAirplaneModeChanged(boolean isAirplaneModeOn) {
updateAirplaneModeMsgPreference(isAirplaneModeOn /* visible */); updateAirplaneModeMsgPreference(isAirplaneModeOn /* visible */);
// update the menu item
requireActivity().invalidateMenu();
} }
/** /**

View File

@@ -286,7 +286,8 @@ public class NetworkProviderSettingsTest {
private void setUpForOnCreate() { private void setUpForOnCreate() {
final FragmentActivity activity = mock(FragmentActivity.class); 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(); final Resources.Theme theme = mContext.getTheme();
when(activity.getTheme()).thenReturn(theme); when(activity.getTheme()).thenReturn(theme);
UserManager userManager = mock(UserManager.class); UserManager userManager = mock(UserManager.class);
@@ -484,59 +485,95 @@ public class NetworkProviderSettingsTest {
when(controller.getConfig()).thenReturn(config); when(controller.getConfig()).thenReturn(config);
WifiDialog2.WifiDialog2Listener listener = mock(WifiDialog2.WifiDialog2Listener.class); WifiDialog2.WifiDialog2Listener listener = mock(WifiDialog2.WifiDialog2Listener.class);
final WifiDialog2 wifiDialog2 = spy(new WifiDialog2(mContext, listener, mWifiEntry, mode)); final WifiDialog2 wifiDialog2 = spy(new WifiDialog2(mContext, listener, mWifiEntry, mode));
when(wifiDialog2.getController()).thenReturn(controller); doReturn(controller).when(wifiDialog2).getController();
return wifiDialog2; return wifiDialog2;
} }
@Test private void mockMenuConditions(boolean isGuest, boolean isAirplaneModeOn, boolean isWifiOn) {
public void onCreateOptionsMenu_isGuest_neverAddFixConnectivityMenu() { mNetworkProviderSettings.mIsGuest = isGuest;
mNetworkProviderSettings.mIsGuest = true; 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 @Test
public void onCreateOptionsMenu_isNotGuest_addFixConnectivityMenu() { public void onCreateOptionsMenu_isGuest_hideFixConnectivityMenu() {
mNetworkProviderSettings.mIsGuest = false; 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 @Test
public void onCreateOptionsMenu_isAirplaneModeOn_neverAddFixConnectivityMenu() { public void onCreateOptionsMenu_isNotGuest_showFixConnectivityMenu() {
doReturn(true).when(mAirplaneModeEnabler).isAirplaneModeOn(); 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 @Test
public void onCreateOptionsMenu_isNotAirplaneModeOn_addFixConnectivityMenu() { public void onCreateOptionsMenu_isAirplaneModeOnAndWifiOff_hideFixConnectivityMenu() {
doReturn(false).when(mAirplaneModeEnabler).isAirplaneModeOn(); 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 @Test
public void onOptionsItemSelected_fixConnectivity_restartInternet() { public void onOptionsItemSelected_fixConnectivity_restartInternet() {
mNetworkProviderSettings.mInternetResetHelper = mInternetResetHelper; setUpForOnCreate();
doReturn(false).when(mNetworkProviderSettings).isPhoneOnCall(); 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(); verify(mInternetResetHelper).restart();
} }
@Test @Test
public void onAirplaneModeChanged_apmIsOn_showApmMsg() { public void onAirplaneModeChanged_apmIsOn_showApmMsg() {
setUpForOnCreate();
mNetworkProviderSettings.onAirplaneModeChanged(true); mNetworkProviderSettings.onAirplaneModeChanged(true);
verify(mAirplaneModeMsgPreference).setVisible(true); verify(mAirplaneModeMsgPreference).setVisible(true);
@@ -544,6 +581,7 @@ public class NetworkProviderSettingsTest {
@Test @Test
public void onAirplaneModeChanged_apmIsOff_hideApmMsg() { public void onAirplaneModeChanged_apmIsOff_hideApmMsg() {
setUpForOnCreate();
mNetworkProviderSettings.onAirplaneModeChanged(false); mNetworkProviderSettings.onAirplaneModeChanged(false);
verify(mAirplaneModeMsgPreference).setVisible(false); verify(mAirplaneModeMsgPreference).setVisible(false);