OSDN Git Service

Implement context menu for ConnectedAccessPointPreference
authorcosmohsieh <cosmohsieh@google.com>
Tue, 2 Apr 2019 10:05:34 +0000 (18:05 +0800)
committerCosmo Hsieh <cosmohsieh@google.com>
Tue, 16 Apr 2019 07:35:36 +0000 (07:35 +0000)
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
(cherry picked from commit 9f8522565ad82381b9270248054cdfb319656c8c)

src/com/android/settings/wifi/ConnectedAccessPointPreference.java
src/com/android/settings/wifi/WifiSettings.java
tests/robotests/src/com/android/settings/wifi/ConnectedAccessPointPreferenceTest.java
tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java

index 3efbbff..a316674 100644 (file)
@@ -20,6 +20,7 @@ import android.content.Context;
 import android.view.View;
 
 import androidx.annotation.DrawableRes;
+import androidx.fragment.app.Fragment;
 import androidx.preference.PreferenceViewHolder;
 
 import com.android.settings.R;
@@ -29,15 +30,16 @@ import com.android.settingslib.wifi.AccessPointPreference;
 /**
  * An AP preference for the currently connected AP
  */
-public class ConnectedAccessPointPreference extends AccessPointPreference implements
+public class ConnectedAccessPointPreference extends LongPressAccessPointPreference implements
         View.OnClickListener {
 
     private OnGearClickListener mOnGearClickListener;
     private boolean mIsCaptivePortal;
 
     public ConnectedAccessPointPreference(AccessPoint accessPoint, Context context,
-            UserBadgeCache cache, @DrawableRes int iconResId, boolean forSavedNetworks) {
-        super(accessPoint, context, cache, iconResId, forSavedNetworks);
+            UserBadgeCache cache, @DrawableRes int iconResId, boolean forSavedNetworks,
+            Fragment fragment) {
+        super(accessPoint, context, cache, forSavedNetworks, iconResId, fragment);
     }
 
     @Override
index da10148..e47bcc9 100644 (file)
@@ -71,7 +71,6 @@ import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener;
 import com.android.settings.widget.SwitchBarController;
 import com.android.settings.wifi.details.WifiNetworkDetailsFragment;
 import com.android.settings.wifi.dpp.WifiDppUtils;
-import com.android.settings.wifi.savedaccesspoints.SavedAccessPointsWifiSettings;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.RestrictedLockUtilsInternal;
 import com.android.settingslib.search.SearchIndexable;
@@ -100,7 +99,8 @@ public class WifiSettings extends RestrictedSettingsFragment
     private static final String TAG = "WifiSettings";
 
     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;
 
     public static final int WIFI_DIALOG_ID = 1;
@@ -459,7 +459,7 @@ public class WifiSettings extends RestrictedSettingsFragment
                     ((LongPressAccessPointPreference) preference).getAccessPoint();
             menu.setHeaderTitle(mSelectedAccessPoint.getTitle());
             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();
@@ -468,14 +468,17 @@ public class WifiSettings extends RestrictedSettingsFragment
                 return;
             }
 
-            if (mSelectedAccessPoint.isSaved() || mSelectedAccessPoint.isEphemeral()) {
-                // Allow forgetting a network if either the network is saved or ephemerally
-                // connected. (In the latter case, "forget" blacklists the network so it won't
-                // be used again, ephemerally).
-                menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
+            // "forget" for normal saved network. And "disconnect" for ephemeral network because we
+            // could only disconnect it and put it in blacklists so it won't be used again.
+            if (mSelectedAccessPoint.isEphemeral()) {
+                menu.add(Menu.NONE, MENU_ID_FORGET, 0 /* order */,
+                    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
-    private ConnectedAccessPointPreference createConnectedAccessPointPreference(
-            AccessPoint accessPoint) {
-        return new ConnectedAccessPointPreference(accessPoint, getPrefContext(), mUserBadgeCache,
-                R.drawable.ic_wifi_signal_0, false /* forSavedNetworks */);
+    @VisibleForTesting
+    ConnectedAccessPointPreference createConnectedAccessPointPreference(
+            AccessPoint accessPoint, Context context) {
+        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) {
         final ConnectedAccessPointPreference pref =
-                createConnectedAccessPointPreference(connectedAp);
+                createConnectedAccessPointPreference(connectedAp, getPrefContext());
         registerCaptivePortalNetworkCallback(getCurrentWifiNetwork(), pref);
 
         // Launch details page or captive portal on click.
index c4fae41..bb9971b 100644 (file)
@@ -54,7 +54,7 @@ public class ConnectedAccessPointPreferenceTest {
 
         mContext = RuntimeEnvironment.application;
         mConnectedAccessPointPreference = new ConnectedAccessPointPreference(mAccessPoint, mContext,
-                null, 0 /* iconResId */, false /* forSavedNetworks */);
+                null, 0 /* iconResId */, false /* forSavedNetworks */, null /* fragment */);
         mConnectedAccessPointPreference.setOnGearClickListener(mOnGearClickListener);
     }
 
index 82e6717..2a90b90 100644 (file)
@@ -37,6 +37,8 @@ import android.os.PowerManager;
 import android.os.UserManager;
 import android.provider.Settings;
 
+import android.view.ContextMenu;
+import android.view.View;
 import androidx.fragment.app.FragmentActivity;
 import androidx.preference.Preference;
 
@@ -44,6 +46,7 @@ import com.android.settings.R;
 import com.android.settings.datausage.DataUsagePreference;
 import com.android.settings.search.SearchIndexableRaw;
 import com.android.settings.testutils.shadow.ShadowDataUsageUtils;
+import com.android.settingslib.wifi.AccessPoint;
 import com.android.settingslib.wifi.WifiTracker;
 
 import org.junit.Before;
@@ -205,4 +208,26 @@ public class WifiSettingsTest {
         verify(mDataUsagePreference).setVisible(true);
         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());
+    }
 }