Implement context menu for ConnectedAccessPointPreference

1) User wants to long press ConnectedAccessPointPreference to forget network if this
is a captive portal network.
2) Change context menu string

Bug: 113756562
Test: make RunSettingsRoboTests -j32 ROBOTEST_FILTER=com.android.settings.wifi
Change-Id: If5c45c45fe126f627eeb53a6c1873a070ad23ae8
This commit is contained in:
cosmohsieh
2019-04-02 18:05:34 +08:00
parent 2858c05963
commit 9f8522565a
4 changed files with 50 additions and 19 deletions

View File

@@ -20,6 +20,7 @@ import android.content.Context;
import android.view.View; import android.view.View;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.fragment.app.Fragment;
import androidx.preference.PreferenceViewHolder; import androidx.preference.PreferenceViewHolder;
import com.android.settings.R; import com.android.settings.R;
@@ -29,15 +30,16 @@ import com.android.settingslib.wifi.AccessPointPreference;
/** /**
* An AP preference for the currently connected AP * An AP preference for the currently connected AP
*/ */
public class ConnectedAccessPointPreference extends AccessPointPreference implements public class ConnectedAccessPointPreference extends LongPressAccessPointPreference implements
View.OnClickListener { View.OnClickListener {
private OnGearClickListener mOnGearClickListener; private OnGearClickListener mOnGearClickListener;
private boolean mIsCaptivePortal; private boolean mIsCaptivePortal;
public ConnectedAccessPointPreference(AccessPoint accessPoint, Context context, public ConnectedAccessPointPreference(AccessPoint accessPoint, Context context,
UserBadgeCache cache, @DrawableRes int iconResId, boolean forSavedNetworks) { UserBadgeCache cache, @DrawableRes int iconResId, boolean forSavedNetworks,
super(accessPoint, context, cache, iconResId, forSavedNetworks); Fragment fragment) {
super(accessPoint, context, cache, forSavedNetworks, iconResId, fragment);
} }
@Override @Override

View File

@@ -71,7 +71,6 @@ import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
import com.android.settings.widget.SwitchBarController; import com.android.settings.widget.SwitchBarController;
import com.android.settings.wifi.details.WifiNetworkDetailsFragment; import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
import com.android.settings.wifi.dpp.WifiDppUtils; import com.android.settings.wifi.dpp.WifiDppUtils;
import com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings;
import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.search.SearchIndexable;
@@ -100,7 +99,8 @@ public class WifiSettings extends RestrictedSettingsFragment
private static final String TAG = "WifiSettings"; private static final String TAG = "WifiSettings";
private static final int MENU_ID_CONNECT = Menu.FIRST + 6; private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
private static final int MENU_ID_FORGET = Menu.FIRST + 7; @VisibleForTesting
static final int MENU_ID_FORGET = Menu.FIRST + 7;
private static final int MENU_ID_MODIFY = Menu.FIRST + 8; private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
public static final int WIFI_DIALOG_ID = 1; public static final int WIFI_DIALOG_ID = 1;
@@ -459,7 +459,7 @@ public class WifiSettings extends RestrictedSettingsFragment
((LongPressAccessPointPreference) preference).getAccessPoint(); ((LongPressAccessPointPreference) preference).getAccessPoint();
menu.setHeaderTitle(mSelectedAccessPoint.getTitle()); menu.setHeaderTitle(mSelectedAccessPoint.getTitle());
if (mSelectedAccessPoint.isConnectable()) { if (mSelectedAccessPoint.isConnectable()) {
menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect); menu.add(Menu.NONE, MENU_ID_CONNECT, 0 /* order */, R.string.wifi_connect);
} }
WifiConfiguration config = mSelectedAccessPoint.getConfig(); WifiConfiguration config = mSelectedAccessPoint.getConfig();
@@ -468,14 +468,17 @@ public class WifiSettings extends RestrictedSettingsFragment
return; return;
} }
if (mSelectedAccessPoint.isSaved() || mSelectedAccessPoint.isEphemeral()) { // "forget" for normal saved network. And "disconnect" for ephemeral network because we
// Allow forgetting a network if either the network is saved or ephemerally // could only disconnect it and put it in blacklists so it won't be used again.
// connected. (In the latter case, "forget" blacklists the network so it won't if (mSelectedAccessPoint.isEphemeral()) {
// be used again, ephemerally). menu.add(Menu.NONE, MENU_ID_FORGET, 0 /* order */,
menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget); R.string.wifi_disconnect_button_text);
} else if (mSelectedAccessPoint.isSaved()) {
menu.add(Menu.NONE, MENU_ID_FORGET, 0 /* order */, R.string.forget);
} }
if (mSelectedAccessPoint.isSaved()) {
menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify); if (mSelectedAccessPoint.isSaved() && !mSelectedAccessPoint.isActive()) {
menu.add(Menu.NONE, MENU_ID_MODIFY, 0 /* order */, R.string.wifi_modify);
} }
} }
} }
@@ -783,10 +786,11 @@ public class WifiSettings extends RestrictedSettingsFragment
} }
@NonNull @NonNull
private ConnectedAccessPointPreference createConnectedAccessPointPreference( @VisibleForTesting
AccessPoint accessPoint) { ConnectedAccessPointPreference createConnectedAccessPointPreference(
return new ConnectedAccessPointPreference(accessPoint, getPrefContext(), mUserBadgeCache, AccessPoint accessPoint, Context context) {
R.drawable.ic_wifi_signal_0, false /* forSavedNetworks */); return new ConnectedAccessPointPreference(accessPoint, context, mUserBadgeCache,
R.drawable.ic_wifi_signal_0, false /* forSavedNetworks */, this);
} }
/** /**
@@ -839,7 +843,7 @@ public class WifiSettings extends RestrictedSettingsFragment
*/ */
private void addConnectedAccessPointPreference(AccessPoint connectedAp) { private void addConnectedAccessPointPreference(AccessPoint connectedAp) {
final ConnectedAccessPointPreference pref = final ConnectedAccessPointPreference pref =
createConnectedAccessPointPreference(connectedAp); createConnectedAccessPointPreference(connectedAp, getPrefContext());
registerCaptivePortalNetworkCallback(getCurrentWifiNetwork(), pref); registerCaptivePortalNetworkCallback(getCurrentWifiNetwork(), pref);
// Launch details page or captive portal on click. // Launch details page or captive portal on click.

View File

@@ -54,7 +54,7 @@ public class ConnectedAccessPointPreferenceTest {
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
mConnectedAccessPointPreference = new ConnectedAccessPointPreference(mAccessPoint, mContext, mConnectedAccessPointPreference = new ConnectedAccessPointPreference(mAccessPoint, mContext,
null, 0 /* iconResId */, false /* forSavedNetworks */); null, 0 /* iconResId */, false /* forSavedNetworks */, null /* fragment */);
mConnectedAccessPointPreference.setOnGearClickListener(mOnGearClickListener); mConnectedAccessPointPreference.setOnGearClickListener(mOnGearClickListener);
} }

View File

@@ -37,6 +37,8 @@ import android.os.PowerManager;
import android.os.UserManager; import android.os.UserManager;
import android.provider.Settings; import android.provider.Settings;
import android.view.ContextMenu;
import android.view.View;
import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentActivity;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -44,6 +46,7 @@ import com.android.settings.R;
import com.android.settings.datausage.DataUsagePreference; import com.android.settings.datausage.DataUsagePreference;
import com.android.settings.search.SearchIndexableRaw; import com.android.settings.search.SearchIndexableRaw;
import com.android.settings.testutils.shadow.ShadowDataUsageUtils; import com.android.settings.testutils.shadow.ShadowDataUsageUtils;
import com.android.settingslib.wifi.AccessPoint;
import com.android.settingslib.wifi.WifiTracker; import com.android.settingslib.wifi.WifiTracker;
import org.junit.Before; import org.junit.Before;
@@ -205,4 +208,26 @@ public class WifiSettingsTest {
verify(mDataUsagePreference).setVisible(true); verify(mDataUsagePreference).setVisible(true);
verify(mDataUsagePreference).setTemplate(any(), eq(0) /*subId*/, eq(null) /*service*/); verify(mDataUsagePreference).setTemplate(any(), eq(0) /*subId*/, eq(null) /*service*/);
} }
@Test
public void onCreateContextMenu_shouldHaveForgetMenuForConnectedAccessPreference() {
final FragmentActivity mockActivity = mock(FragmentActivity.class);
when(mockActivity.getApplicationContext()).thenReturn(mContext);
when(mWifiSettings.getActivity()).thenReturn(mockActivity);
final AccessPoint accessPoint = mock(AccessPoint.class);
when(accessPoint.isConnectable()).thenReturn(false);
when(accessPoint.isSaved()).thenReturn(true);
when(accessPoint.isActive()).thenReturn(true);
final ConnectedAccessPointPreference connectedPreference =
mWifiSettings.createConnectedAccessPointPreference(accessPoint, mContext);
final View view = mock(View.class);
when(view.getTag()).thenReturn(connectedPreference);
final ContextMenu menu = mock(ContextMenu.class);
mWifiSettings.onCreateContextMenu(menu, view, null /* info */);
verify(menu).add(anyInt(), eq(WifiSettings.MENU_ID_FORGET), anyInt(), anyInt());
}
} }