Add prompt to sign in at captive portal to Wi-Fi Slice

- Support signing in captive portal APs in WifiSlice
- Show ContextualWifiSlice when signing in is required
- Generifies SliceBackgroundWorker.getInstance() to return <T extends SliceBackgroundWorker>

Fixes: 128056349
Test: make RunSettingsRoboTests -j
Change-Id: Ib4d3942591a65e81018389e4c0bbddfea6854dbc
(cherry picked from commit dd9f92280b)
This commit is contained in:
Jason Chiu
2019-04-02 13:57:29 +08:00
committed by Tsung-Mao Fang
parent 44427259e8
commit 8f6c06974c
9 changed files with 277 additions and 24 deletions

View File

@@ -16,6 +16,7 @@
package com.android.settings.wifi.slice;
import static org.mockito.ArgumentMatchers.any;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
@@ -24,6 +25,7 @@ import static org.mockito.Mockito.spy;
import android.content.ContentResolver;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
@@ -53,6 +55,7 @@ public class ContextualWifiSliceTest {
private Context mContext;
private ContentResolver mResolver;
private WifiManager mWifiManager;
private ConnectivityManager mConnectivityManager;
private ContextualWifiSlice mWifiSlice;
private FakeFeatureFactory mFeatureFactory;
@@ -70,6 +73,9 @@ public class ContextualWifiSliceTest {
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
mWifiManager.setWifiEnabled(true);
mConnectivityManager = spy(mContext.getSystemService(ConnectivityManager.class));
doReturn(mConnectivityManager).when(mContext).getSystemService(ConnectivityManager.class);
mWifiSlice = new ContextualWifiSlice(mContext);
mWifiSlice.sPreviouslyDisplayed = false;
}
@@ -124,6 +130,29 @@ public class ContextualWifiSliceTest {
assertThat(primaryAction.getIcon().toString()).isEqualTo(expectedToggleIcon.toString());
}
@Test
public void getWifiSlice_isCaptivePortal_shouldHaveTitleAndToggle() {
mWifiSlice.sPreviouslyDisplayed = false;
final WifiConfiguration config = new WifiConfiguration();
config.SSID = "123";
mWifiManager.connect(config, null /* listener */);
doReturn(WifiSliceTest.makeCaptivePortalNetworkCapabilities()).when(mConnectivityManager)
.getNetworkCapabilities(any());
final Slice wifiSlice = mWifiSlice.getSlice();
final SliceMetadata metadata = SliceMetadata.from(mContext, wifiSlice);
assertThat(metadata.getTitle()).isEqualTo(mContext.getString(R.string.wifi_settings));
final List<SliceAction> toggles = metadata.getToggles();
assertThat(toggles).hasSize(1);
final SliceAction primaryAction = metadata.getPrimaryAction();
final IconCompat expectedToggleIcon = IconCompat.createWithResource(mContext,
R.drawable.ic_settings_wireless);
assertThat(primaryAction.getIcon().toString()).isEqualTo(expectedToggleIcon.toString());
}
@Test
public void getWifiSlice_contextualWifiSlice_shouldReturnContextualWifiSliceUri() {
mWifiSlice.sActiveUiSession = mFeatureFactory.slicesFeatureProvider.getUiSessionToken();

View File

@@ -27,6 +27,8 @@ import static org.mockito.Mockito.verify;
import android.content.ContentResolver;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.net.wifi.WifiManager;
@@ -55,6 +57,7 @@ public class WifiScanWorkerTest {
private Context mContext;
private ContentResolver mResolver;
private WifiManager mWifiManager;
private ConnectivityManager mConnectivityManager;
private WifiScanWorker mWifiScanWorker;
@Before
@@ -68,6 +71,7 @@ public class WifiScanWorkerTest {
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
mWifiManager.setWifiEnabled(true);
mConnectivityManager = mContext.getSystemService(ConnectivityManager.class);
mWifiScanWorker = new WifiScanWorker(mContext, WIFI_SLICE_URI);
}
@@ -89,7 +93,7 @@ public class WifiScanWorkerTest {
}
@Test
public void SliceAccessPoint_sameState_shouldBeTheSame() {
public void AccessPointList_sameState_shouldBeTheSame() {
final AccessPoint ap1 = createAccessPoint(AP_NAME, State.CONNECTED);
final AccessPoint ap2 = createAccessPoint(AP_NAME, State.CONNECTED);
@@ -98,7 +102,7 @@ public class WifiScanWorkerTest {
}
@Test
public void SliceAccessPoint_differentState_shouldBeDifferent() {
public void AccessPointList_differentState_shouldBeDifferent() {
final AccessPoint ap1 = createAccessPoint(AP_NAME, State.CONNECTING);
final AccessPoint ap2 = createAccessPoint(AP_NAME, State.CONNECTED);
@@ -107,7 +111,7 @@ public class WifiScanWorkerTest {
}
@Test
public void SliceAccessPoint_differentLength_shouldBeDifferent() {
public void AccessPointList_differentLength_shouldBeDifferent() {
final AccessPoint ap1 = createAccessPoint(AP_NAME, State.CONNECTED);
final AccessPoint ap2 = createAccessPoint(AP_NAME, State.CONNECTED);
final List<AccessPoint> list = new ArrayList<>();
@@ -116,4 +120,15 @@ public class WifiScanWorkerTest {
assertThat(mWifiScanWorker.areListsTheSame(list, Arrays.asList(ap1))).isFalse();
}
@Test
public void NetworkCallback_onCapabilitiesChanged_shouldNotifyChange() {
final Network network = mConnectivityManager.getActiveNetwork();
mWifiScanWorker.registerCaptivePortalNetworkCallback(network);
mWifiScanWorker.mCaptivePortalNetworkCallback.onCapabilitiesChanged(network,
WifiSliceTest.makeCaptivePortalNetworkCapabilities());
verify(mResolver).notifyChange(WIFI_SLICE_URI, null);
}
}

View File

@@ -23,6 +23,7 @@ import static com.android.settings.wifi.slice.WifiSlice.DEFAULT_EXPANDED_ROW_COU
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
@@ -30,6 +31,8 @@ import static org.mockito.Mockito.spy;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkCapabilities;
import android.net.NetworkInfo;
import android.net.Uri;
import android.net.wifi.WifiManager;
@@ -70,6 +73,7 @@ public class WifiSliceTest {
private Context mContext;
private ContentResolver mResolver;
private WifiManager mWifiManager;
private ConnectivityManager mConnectivityManager;
private WifiSlice mWifiSlice;
@Before
@@ -83,6 +87,9 @@ public class WifiSliceTest {
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
mWifiManager.setWifiEnabled(true);
mConnectivityManager = spy(mContext.getSystemService(ConnectivityManager.class));
doReturn(mConnectivityManager).when(mContext).getSystemService(ConnectivityManager.class);
mWifiSlice = new WifiSlice(mContext);
}
@@ -226,6 +233,37 @@ public class WifiSliceTest {
mContext.getString(R.string.wifi_empty_list_wifi_on));
}
@Test
public void getWifiSlice_isCaptivePortal_shouldHaveCaptivePortalItems() {
setWorkerResults(createAccessPoint(AP1_NAME, true, true));
doReturn(makeCaptivePortalNetworkCapabilities()).when(mConnectivityManager)
.getNetworkCapabilities(any());
final Slice wifiSlice = mWifiSlice.getSlice();
final List<SliceItem> sliceItems = wifiSlice.getItems();
SliceTester.assertAnySliceItemContainsTitle(sliceItems, AP1_NAME);
assertCaptivePortalItems(sliceItems);
}
private void assertCaptivePortalItems(List<SliceItem> sliceItems) {
final String expectedSummary = mContext.getString(mContext.getResources()
.getIdentifier("network_available_sign_in", "string", "android"));
SliceTester.assertAnySliceItemContainsSubtitle(sliceItems, expectedSummary);
final IconCompat expectedIcon = IconCompat.createWithResource(mContext,
R.drawable.ic_settings_accent);
SliceTester.assertAnySliceItemContainsIcon(sliceItems, expectedIcon);
}
static NetworkCapabilities makeCaptivePortalNetworkCapabilities() {
final NetworkCapabilities nc = new NetworkCapabilities();
nc.clearAll();
nc.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
nc.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
return nc;
}
@Test
public void handleUriChange_updatesWifi() {
final Intent intent = mWifiSlice.getIntent();