From c6fb75882a2479fdc0e88bd627f8d7c628763bf3 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Tue, 15 Mar 2022 22:33:19 +0800 Subject: [PATCH] Restrict WiFi network connection (Internet Panel) - Use StandardWifiEntry#canConnect() to determine if the network should be disabled or not. - Disabled WiFi network if it cannot connect. - If WiFi network is connected or saved network, leave it enabled to disconnect or configure. - See the result screenshot in b/203168943#comment14 Bug: 203168938 Bug: 203168943 Test: manual test atest -c InternetAdapterTest \ InternetDialogControllerTest \ InternetDialogTest Change-Id: I7d488bf0298d3ee6c8e315fbab0ea492e684efd1 --- .../qs/tiles/dialog/InternetAdapter.java | 46 +++++++++--- .../qs/tiles/dialog/InternetDialog.java | 3 +- .../dialog/InternetDialogController.java | 2 +- .../qs/tiles/dialog/InternetAdapterTest.java | 70 +++++++++++++++++++ .../dialog/InternetDialogControllerTest.java | 10 ++- 5 files changed, 112 insertions(+), 19 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java index 8bad2de189c5f..2cc3986c6e82b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetAdapter.java @@ -21,6 +21,7 @@ import android.content.Intent; import android.graphics.drawable.Drawable; import android.text.Html; import android.text.TextUtils; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -158,22 +159,47 @@ public class InternetAdapter extends RecyclerView.Adapter mInternetDialogController.launchWifiNetworkDetailsSetting( + v -> mInternetDialogController.launchWifiDetailsSetting( wifiEntry.getKey(), v)); return; } - mWifiListLayout.setOnClickListener(v -> { - if (wifiEntry.shouldEditBeforeConnect()) { - final Intent intent = WifiUtils.getWifiDialogIntent(wifiEntry.getKey(), - true /* connectForCaller */); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); - mContext.startActivity(intent); - } + mWifiListLayout.setOnClickListener(v -> onWifiClick(wifiEntry, v)); + } + + boolean shouldEnabled(@NonNull WifiEntry wifiEntry) { + if (wifiEntry.canConnect()) { + return true; + } + // If Wi-Fi is connected or saved network, leave it enabled to disconnect or configure. + if (wifiEntry.canDisconnect() || wifiEntry.isSaved()) { + return true; + } + return false; + } + + void onWifiClick(@NonNull WifiEntry wifiEntry, @NonNull View view) { + if (wifiEntry.shouldEditBeforeConnect()) { + final Intent intent = WifiUtils.getWifiDialogIntent(wifiEntry.getKey(), + true /* connectForCaller */); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + mContext.startActivity(intent); + return; + } + + if (wifiEntry.canConnect()) { mInternetDialogController.connect(wifiEntry); - }); + return; + } + + if (wifiEntry.isSaved()) { + Log.w(TAG, "The saved Wi-Fi network does not allow to connect. SSID:" + + wifiEntry.getSsid()); + mInternetDialogController.launchWifiDetailsSetting(wifiEntry.getKey(), view); + } } void setWifiNetworkLayout(CharSequence title, CharSequence summary) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java index d1c784457c9fb..8921e95fcee97 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java @@ -531,8 +531,7 @@ public class InternetDialog extends SystemUIDialog implements if (mConnectedWifiEntry == null) { return; } - mInternetDialogController.launchWifiNetworkDetailsSetting(mConnectedWifiEntry.getKey(), - view); + mInternetDialogController.launchWifiDetailsSetting(mConnectedWifiEntry.getKey(), view); } void onClickSeeMoreButton(View view) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java index b322cbf6c60e5..d97ce7757d8cd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java @@ -635,7 +635,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi startActivity(getSettingsIntent(), view); } - void launchWifiNetworkDetailsSetting(String key, View view) { + void launchWifiDetailsSetting(String key, View view) { Intent intent = getWifiDetailsSettingsIntent(key); if (intent != null) { startActivity(intent, view); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetAdapterTest.java index d3bb241baad42..f306fd601136f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetAdapterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetAdapterTest.java @@ -4,14 +4,19 @@ import static com.android.systemui.qs.tiles.dialog.InternetDialogController.MAX_ import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.Context; import android.graphics.drawable.Drawable; import android.testing.AndroidTestingRunner; import android.testing.TestableResources; @@ -30,6 +35,7 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -40,6 +46,7 @@ import java.util.List; @RunWith(AndroidTestingRunner.class) public class InternetAdapterTest extends SysuiTestCase { + private static final String WIFI_KEY = "Wi-Fi_Key"; private static final String WIFI_TITLE = "Wi-Fi Title"; private static final String WIFI_SUMMARY = "Wi-Fi Summary"; private static final int GEAR_ICON_RES_ID = R.drawable.ic_settings_24dp; @@ -47,6 +54,8 @@ public class InternetAdapterTest extends SysuiTestCase { @Rule public MockitoRule mRule = MockitoJUnit.rule(); + @Spy + private Context mSpyContext = mContext; @Mock private WifiEntry mInternetWifiEntry; @@ -74,6 +83,7 @@ public class InternetAdapterTest extends SysuiTestCase { when(mInternetWifiEntry.getSummary(false)).thenReturn(WIFI_SUMMARY); when(mInternetWifiEntry.isDefaultNetwork()).thenReturn(true); when(mInternetWifiEntry.hasInternetAccess()).thenReturn(true); + when(mWifiEntry.getKey()).thenReturn(WIFI_KEY); when(mWifiEntry.getTitle()).thenReturn(WIFI_TITLE); when(mWifiEntry.getSummary(false)).thenReturn(WIFI_SUMMARY); @@ -196,6 +206,66 @@ public class InternetAdapterTest extends SysuiTestCase { assertThat(mInternetAdapter.mMaxEntriesCount).isEqualTo(maxCount); } + @Test + public void viewHolderShouldEnabled_wifiCanConnect_returnTrue() { + when(mWifiEntry.canConnect()).thenReturn(true); + + assertThat(mViewHolder.shouldEnabled(mWifiEntry)).isTrue(); + } + + @Test + public void viewHolderShouldEnabled_wifiCanNotConnect_returnFalse() { + when(mWifiEntry.canConnect()).thenReturn(false); + + assertThat(mViewHolder.shouldEnabled(mWifiEntry)).isFalse(); + } + + @Test + public void viewHolderShouldEnabled_wifiCanNotConnectButCanDisconnect_returnTrue() { + when(mWifiEntry.canConnect()).thenReturn(false); + when(mWifiEntry.canConnect()).thenReturn(true); + + assertThat(mViewHolder.shouldEnabled(mWifiEntry)).isTrue(); + } + + @Test + public void viewHolderShouldEnabled_wifiCanNotConnectButIsSaved_returnTrue() { + when(mWifiEntry.canConnect()).thenReturn(false); + when(mWifiEntry.isSaved()).thenReturn(true); + + assertThat(mViewHolder.shouldEnabled(mWifiEntry)).isTrue(); + } + + @Test + public void viewHolderOnWifiClick_wifiShouldEditBeforeConnect_startActivity() { + when(mWifiEntry.shouldEditBeforeConnect()).thenReturn(true); + mViewHolder = mInternetAdapter.onCreateViewHolder(new LinearLayout(mSpyContext), 0); + doNothing().when(mSpyContext).startActivity(any()); + + mViewHolder.onWifiClick(mWifiEntry, mock(View.class)); + + verify(mSpyContext).startActivity(any()); + } + + @Test + public void viewHolderOnWifiClick_wifiCanConnect_connectWifi() { + when(mWifiEntry.canConnect()).thenReturn(true); + + mViewHolder.onWifiClick(mWifiEntry, mock(View.class)); + + verify(mInternetDialogController).connect(mWifiEntry); + } + + @Test + public void viewHolderOnWifiClick_wifiCanNotConnectButIsSaved_launchWifiDetailsSetting() { + when(mWifiEntry.canConnect()).thenReturn(false); + when(mWifiEntry.isSaved()).thenReturn(true); + + mViewHolder.onWifiClick(mWifiEntry, mock(View.class)); + + verify(mInternetDialogController).launchWifiDetailsSetting(anyString(), any()); + } + @Test public void viewHolderUpdateEndIcon_wifiConnected_updateGearIcon() { mTestableResources.addOverride(GEAR_ICON_RES_ID, mGearIcon); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java index a2959e2fb917a..633a9c3a03d8e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java @@ -385,18 +385,16 @@ public class InternetDialogControllerTest extends SysuiTestCase { } @Test - public void launchWifiNetworkDetailsSetting_withNoWifiEntryKey_doNothing() { - mInternetDialogController.launchWifiNetworkDetailsSetting(null /* key */, - mDialogLaunchView); + public void launchWifiDetailsSetting_withNoWifiEntryKey_doNothing() { + mInternetDialogController.launchWifiDetailsSetting(null /* key */, mDialogLaunchView); verify(mActivityStarter, never()) .postStartActivityDismissingKeyguard(any(Intent.class), anyInt()); } @Test - public void launchWifiNetworkDetailsSetting_withWifiEntryKey_startActivity() { - mInternetDialogController.launchWifiNetworkDetailsSetting("wifi_entry_key", - mDialogLaunchView); + public void launchWifiDetailsSetting_withWifiEntryKey_startActivity() { + mInternetDialogController.launchWifiDetailsSetting("wifi_entry_key", mDialogLaunchView); verify(mActivityStarter).postStartActivityDismissingKeyguard(any(Intent.class), anyInt(), any());