Add subtext for Wi-Fi items on Wi-Fi slice
- Sync the Wi-Fi slice items subtexts with Wi-Fi page, and add "Not connected" when the returned subtext is empty - Wi-Fi slice header subtext just simply reveals on/off state - Add a placeholder to the loading row to sync its height with other rows - Show contextual Wi-Fi slice when the connected network is captive portal, is invalidated, or has limited connectivity Bug: 130751985 Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=com.android.settings.wifi Change-Id: I0b2715295f00edc8dd7d6d75b7fdc18263675797
This commit is contained in:
@@ -16,7 +16,6 @@
|
||||
|
||||
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;
|
||||
@@ -25,7 +24,7 @@ import static org.mockito.Mockito.spy;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.net.wifi.WifiManager;
|
||||
|
||||
@@ -40,22 +39,24 @@ import com.android.settings.R;
|
||||
import com.android.settings.slices.CustomSliceRegistry;
|
||||
import com.android.settings.slices.SlicesFeatureProviderImpl;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.shadow.ShadowConnectivityManager;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = ShadowConnectivityManager.class)
|
||||
public class ContextualWifiSliceTest {
|
||||
|
||||
private Context mContext;
|
||||
private ContentResolver mResolver;
|
||||
private WifiManager mWifiManager;
|
||||
private ConnectivityManager mConnectivityManager;
|
||||
private ContextualWifiSlice mWifiSlice;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
|
||||
@@ -73,9 +74,6 @@ 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;
|
||||
}
|
||||
@@ -83,9 +81,7 @@ public class ContextualWifiSliceTest {
|
||||
@Test
|
||||
public void getWifiSlice_hasActiveConnection_shouldReturnNull() {
|
||||
mWifiSlice.sPreviouslyDisplayed = false;
|
||||
final WifiConfiguration config = new WifiConfiguration();
|
||||
config.SSID = "123";
|
||||
mWifiManager.connect(config, null /* listener */);
|
||||
connectToWifi(makeValidatedNetworkCapabilities());
|
||||
|
||||
final Slice wifiSlice = mWifiSlice.getSlice();
|
||||
|
||||
@@ -98,10 +94,7 @@ public class ContextualWifiSliceTest {
|
||||
// previous displayed: yes
|
||||
mWifiSlice.sPreviouslyDisplayed = true;
|
||||
mWifiSlice.sActiveUiSession = ~mFeatureFactory.slicesFeatureProvider.getUiSessionToken();
|
||||
|
||||
final WifiConfiguration config = new WifiConfiguration();
|
||||
config.SSID = "123";
|
||||
mWifiManager.connect(config, null /* listener */);
|
||||
connectToWifi(makeValidatedNetworkCapabilities());
|
||||
|
||||
final Slice wifiSlice = mWifiSlice.getSlice();
|
||||
|
||||
@@ -112,9 +105,7 @@ public class ContextualWifiSliceTest {
|
||||
public void getWifiSlice_previousDisplayed_hasActiveConnection_shouldHaveTitleAndToggle() {
|
||||
mWifiSlice.sActiveUiSession = mFeatureFactory.slicesFeatureProvider.getUiSessionToken();
|
||||
mWifiSlice.sPreviouslyDisplayed = true;
|
||||
final WifiConfiguration config = new WifiConfiguration();
|
||||
config.SSID = "123";
|
||||
mWifiManager.connect(config, null /* listener */);
|
||||
connectToWifi(makeValidatedNetworkCapabilities());
|
||||
|
||||
final Slice wifiSlice = mWifiSlice.getSlice();
|
||||
|
||||
@@ -133,11 +124,7 @@ public class ContextualWifiSliceTest {
|
||||
@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());
|
||||
connectToWifi(WifiSliceTest.makeCaptivePortalNetworkCapabilities());
|
||||
|
||||
final Slice wifiSlice = mWifiSlice.getSlice();
|
||||
|
||||
@@ -162,4 +149,20 @@ public class ContextualWifiSliceTest {
|
||||
|
||||
assertThat(wifiSlice.getUri()).isEqualTo(CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI);
|
||||
}
|
||||
|
||||
private void connectToWifi(NetworkCapabilities nc) {
|
||||
final WifiConfiguration config = new WifiConfiguration();
|
||||
config.SSID = "123";
|
||||
mWifiManager.connect(config, null /* listener */);
|
||||
ShadowConnectivityManager.getShadow().setNetworkCapabilities(
|
||||
mWifiManager.getCurrentNetwork(), nc);
|
||||
}
|
||||
|
||||
private NetworkCapabilities makeValidatedNetworkCapabilities() {
|
||||
final NetworkCapabilities nc = new NetworkCapabilities();
|
||||
nc.clearAll();
|
||||
nc.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
|
||||
nc.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
|
||||
return nc;
|
||||
}
|
||||
}
|
||||
|
@@ -32,9 +32,10 @@ import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.ConnectivityManager.NetworkCallback;
|
||||
import android.net.Network;
|
||||
import android.net.NetworkInfo;
|
||||
import android.net.NetworkInfo.State;
|
||||
import android.net.NetworkInfo.DetailedState;
|
||||
import android.net.wifi.WifiInfo;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.net.wifi.WifiSsid;
|
||||
@@ -62,6 +63,7 @@ import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.annotation.Implementation;
|
||||
import org.robolectric.annotation.Implements;
|
||||
import org.robolectric.shadows.ShadowNetworkInfo;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = {
|
||||
@@ -70,8 +72,6 @@ import org.robolectric.annotation.Implements;
|
||||
})
|
||||
public class WifiScanWorkerTest {
|
||||
|
||||
private static final String AP_NAME = "ap";
|
||||
|
||||
private Context mContext;
|
||||
private ContentResolver mResolver;
|
||||
private WifiManager mWifiManager;
|
||||
@@ -107,20 +107,10 @@ public class WifiScanWorkerTest {
|
||||
verify(mResolver).notifyChange(WIFI_SLICE_URI, null);
|
||||
}
|
||||
|
||||
private AccessPoint createAccessPoint(String name, State state) {
|
||||
final NetworkInfo info = mock(NetworkInfo.class);
|
||||
doReturn(state).when(info).getState();
|
||||
|
||||
final Bundle savedState = new Bundle();
|
||||
savedState.putString("key_ssid", name);
|
||||
savedState.putParcelable("key_networkinfo", info);
|
||||
return new AccessPoint(mContext, savedState);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void AccessPointList_sameState_shouldBeTheSame() {
|
||||
final AccessPoint ap1 = createAccessPoint(AP_NAME, State.CONNECTED);
|
||||
final AccessPoint ap2 = createAccessPoint(AP_NAME, State.CONNECTED);
|
||||
final AccessPoint ap1 = createAccessPoint(DetailedState.CONNECTED);
|
||||
final AccessPoint ap2 = createAccessPoint(DetailedState.CONNECTED);
|
||||
|
||||
assertThat(mWifiScanWorker.areListsTheSame(Arrays.asList(ap1), Arrays.asList(ap2)))
|
||||
.isTrue();
|
||||
@@ -128,17 +118,17 @@ public class WifiScanWorkerTest {
|
||||
|
||||
@Test
|
||||
public void AccessPointList_differentState_shouldBeDifferent() {
|
||||
final AccessPoint ap1 = createAccessPoint(AP_NAME, State.CONNECTING);
|
||||
final AccessPoint ap2 = createAccessPoint(AP_NAME, State.CONNECTED);
|
||||
final AccessPoint ap1 = createAccessPoint(DetailedState.CONNECTING);
|
||||
final AccessPoint ap2 = createAccessPoint(DetailedState.CONNECTED);
|
||||
|
||||
assertThat(mWifiScanWorker.areListsTheSame(Arrays.asList(ap1), Arrays.asList(ap2)))
|
||||
.isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void AccessPointList_differentLength_shouldBeDifferent() {
|
||||
final AccessPoint ap1 = createAccessPoint(AP_NAME, State.CONNECTED);
|
||||
final AccessPoint ap2 = createAccessPoint(AP_NAME, State.CONNECTED);
|
||||
public void AccessPointList_differentListLength_shouldBeDifferent() {
|
||||
final AccessPoint ap1 = createAccessPoint(DetailedState.CONNECTED);
|
||||
final AccessPoint ap2 = createAccessPoint(DetailedState.CONNECTED);
|
||||
final List<AccessPoint> list = new ArrayList<>();
|
||||
list.add(ap1);
|
||||
list.add(ap2);
|
||||
@@ -149,20 +139,14 @@ public class WifiScanWorkerTest {
|
||||
@Test
|
||||
public void NetworkCallback_onCapabilitiesChanged_shouldNotifyChange() {
|
||||
final Network network = mConnectivityManager.getActiveNetwork();
|
||||
mWifiScanWorker.registerCaptivePortalNetworkCallback(network);
|
||||
mWifiScanWorker.registerNetworkCallback(network);
|
||||
|
||||
mWifiScanWorker.mCaptivePortalNetworkCallback.onCapabilitiesChanged(network,
|
||||
mWifiScanWorker.mNetworkCallback.onCapabilitiesChanged(network,
|
||||
WifiSliceTest.makeCaptivePortalNetworkCapabilities());
|
||||
|
||||
verify(mResolver).notifyChange(WIFI_SLICE_URI, null);
|
||||
}
|
||||
|
||||
private AccessPoint createAccessPoint(String ssid) {
|
||||
final AccessPoint accessPoint = mock(AccessPoint.class);
|
||||
doReturn(ssid).when(accessPoint).getSsidStr();
|
||||
return accessPoint;
|
||||
}
|
||||
|
||||
private void setConnectionInfoSSID(String ssid) {
|
||||
final WifiInfo wifiInfo = new WifiInfo();
|
||||
wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(ssid));
|
||||
@@ -174,10 +158,10 @@ public class WifiScanWorkerTest {
|
||||
final AccessPoint accessPoint = createAccessPoint("ap1");
|
||||
setConnectionInfoSSID("ap1");
|
||||
final Network network = mConnectivityManager.getActiveNetwork();
|
||||
mWifiScanWorker.registerCaptivePortalNetworkCallback(network);
|
||||
mWifiScanWorker.registerNetworkCallback(network);
|
||||
|
||||
mConnectToWifiHandler.connect(accessPoint);
|
||||
mWifiScanWorker.mCaptivePortalNetworkCallback.onCapabilitiesChanged(network,
|
||||
mWifiScanWorker.mNetworkCallback.onCapabilitiesChanged(network,
|
||||
WifiSliceTest.makeCaptivePortalNetworkCapabilities());
|
||||
|
||||
verify(mContext).startActivityAsUser(any(Intent.class), eq(UserHandle.CURRENT));
|
||||
@@ -188,10 +172,10 @@ public class WifiScanWorkerTest {
|
||||
final AccessPoint accessPoint = createAccessPoint("ap1");
|
||||
setConnectionInfoSSID("ap2");
|
||||
final Network network = mConnectivityManager.getActiveNetwork();
|
||||
mWifiScanWorker.registerCaptivePortalNetworkCallback(network);
|
||||
mWifiScanWorker.registerNetworkCallback(network);
|
||||
|
||||
mConnectToWifiHandler.connect(accessPoint);
|
||||
mWifiScanWorker.mCaptivePortalNetworkCallback.onCapabilitiesChanged(network,
|
||||
mWifiScanWorker.mNetworkCallback.onCapabilitiesChanged(network,
|
||||
WifiSliceTest.makeCaptivePortalNetworkCapabilities());
|
||||
|
||||
verify(mContext, never()).startActivityAsUser(any(Intent.class), eq(UserHandle.CURRENT));
|
||||
@@ -201,9 +185,9 @@ public class WifiScanWorkerTest {
|
||||
public void NetworkCallback_onCapabilitiesChanged_neverClickWifi_shouldNotStartActivity() {
|
||||
setConnectionInfoSSID("ap1");
|
||||
final Network network = mConnectivityManager.getActiveNetwork();
|
||||
mWifiScanWorker.registerCaptivePortalNetworkCallback(network);
|
||||
mWifiScanWorker.registerNetworkCallback(network);
|
||||
|
||||
mWifiScanWorker.mCaptivePortalNetworkCallback.onCapabilitiesChanged(network,
|
||||
mWifiScanWorker.mNetworkCallback.onCapabilitiesChanged(network,
|
||||
WifiSliceTest.makeCaptivePortalNetworkCapabilities());
|
||||
|
||||
verify(mContext, never()).startActivityAsUser(any(Intent.class), eq(UserHandle.CURRENT));
|
||||
@@ -214,9 +198,8 @@ public class WifiScanWorkerTest {
|
||||
final AccessPoint accessPoint = createAccessPoint("ap1");
|
||||
setConnectionInfoSSID("ap1");
|
||||
final Network network = mConnectivityManager.getActiveNetwork();
|
||||
mWifiScanWorker.registerCaptivePortalNetworkCallback(network);
|
||||
final WifiScanWorker.CaptivePortalNetworkCallback callback =
|
||||
mWifiScanWorker.mCaptivePortalNetworkCallback;
|
||||
mWifiScanWorker.registerNetworkCallback(network);
|
||||
final NetworkCallback callback = mWifiScanWorker.mNetworkCallback;
|
||||
|
||||
mWifiScanWorker.onSlicePinned();
|
||||
mConnectToWifiHandler.connect(accessPoint);
|
||||
@@ -227,6 +210,23 @@ public class WifiScanWorkerTest {
|
||||
verify(mContext, never()).startActivityAsUser(any(Intent.class), eq(UserHandle.CURRENT));
|
||||
}
|
||||
|
||||
private AccessPoint createAccessPoint(String ssid, DetailedState detailedState) {
|
||||
final NetworkInfo info = ShadowNetworkInfo.newInstance(detailedState, 1 /* type */,
|
||||
0 /*subType */, true /* isAvailable */, true /* isConnected */);
|
||||
final Bundle savedState = new Bundle();
|
||||
savedState.putString("key_ssid", ssid);
|
||||
savedState.putParcelable("key_networkinfo", info);
|
||||
return new AccessPoint(mContext, savedState);
|
||||
}
|
||||
|
||||
private AccessPoint createAccessPoint(DetailedState detailedState) {
|
||||
return createAccessPoint("ap", detailedState);
|
||||
}
|
||||
|
||||
private AccessPoint createAccessPoint(String ssid) {
|
||||
return createAccessPoint(ssid, DetailedState.DISCONNECTED);
|
||||
}
|
||||
|
||||
@Implements(WifiTracker.class)
|
||||
public static class ShadowWifiTracker {
|
||||
@Implementation
|
||||
|
@@ -247,8 +247,7 @@ public class WifiSliceTest {
|
||||
}
|
||||
|
||||
private void assertCaptivePortalItems(List<SliceItem> sliceItems) {
|
||||
final String expectedSummary = mContext.getString(mContext.getResources()
|
||||
.getIdentifier("network_available_sign_in", "string", "android"));
|
||||
final String expectedSummary = mContext.getString(R.string.switch_on_text);
|
||||
SliceTester.assertAnySliceItemContainsSubtitle(sliceItems, expectedSummary);
|
||||
|
||||
final IconCompat expectedIcon = IconCompat.createWithResource(mContext,
|
||||
|
Reference in New Issue
Block a user