Merge "Leverage the behavior of showing the searching message in wifi slice"

This commit is contained in:
Jason Chiu
2019-02-27 10:03:28 +00:00
committed by Android (Google) Code Review
3 changed files with 149 additions and 5 deletions

View File

@@ -118,10 +118,19 @@ public class WifiSlice implements CustomSliceable {
final SliceBackgroundWorker worker = SliceBackgroundWorker.getInstance(getUri());
final List<AccessPoint> results = worker != null ? worker.getResults() : null;
final int apCount = results == null ? 0 : results.size();
// Need a loading text when results are not ready.
boolean needLoadingRow = results == null;
final int apCount = needLoadingRow ? 0 : results.size();
// Need a loading text when results are not ready or out of date.
boolean needLoadingRow = true;
int index = apCount > 0 && results.get(0).isActive() ? 1 : 0;
// This loop checks the existence of reachable APs to determine the validity of the current
// AP list.
for (; index < apCount; index++) {
if (results.get(index).isReachable()) {
needLoadingRow = false;
break;
}
}
// Add AP rows
final CharSequence placeholder = mContext.getText(R.string.summary_placeholder);

View File

@@ -253,6 +253,18 @@ public class SliceTester {
assertThat(hasText(sliceItems, subtitle, null /* hints */)).isTrue();
}
/**
* Assert no slice item contains subtitle.
*
* @param sliceItems All slice items of a Slice.
* @param subtitle Subtitle for asserting.
*/
public static void assertNoSliceItemContainsSubtitle(List<SliceItem> sliceItems,
String subtitle) {
// Subtitle has no hints
assertThat(hasText(sliceItems, subtitle, null /* hints */)).isFalse();
}
private static boolean hasText(List<SliceItem> sliceItems, String text, String hints) {
boolean hasText = false;
for (SliceItem item : sliceItems) {

View File

@@ -21,6 +21,7 @@ import static android.app.slice.SliceItem.FORMAT_SLICE;
import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI;
import static com.android.settings.wifi.slice.WifiSlice.DEFAULT_EXPANDED_ROW_COUNT;
import static com.android.settings.wifi.slice.WifiSlice.WifiScanWorker;
import static com.google.common.truth.Truth.assertThat;
@@ -32,6 +33,8 @@ import static org.mockito.Mockito.verify;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.net.NetworkInfo;
import android.net.Uri;
import android.net.wifi.WifiManager;
import androidx.core.graphics.drawable.IconCompat;
@@ -44,24 +47,33 @@ import androidx.slice.core.SliceQuery;
import androidx.slice.widget.SliceLiveData;
import com.android.settings.R;
import com.android.settings.slices.SliceBackgroundWorker;
import com.android.settings.testutils.SliceTester;
import com.android.settingslib.wifi.AccessPoint;
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 org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import java.util.ArrayList;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
public class WifiSliceTest {
private static final String AP1_NAME = "ap1";
private static final String AP2_NAME = "ap2";
private Context mContext;
private ContentResolver mResolver;
private WifiManager mWifiManager;
private WifiSlice mWifiSlice;
private WifiSlice.WifiScanWorker mWifiScanWorker;
private WifiScanWorker mWifiScanWorker;
@Before
public void setUp() {
@@ -75,7 +87,7 @@ public class WifiSliceTest {
mWifiManager.setWifiEnabled(true);
mWifiSlice = new WifiSlice(mContext);
mWifiScanWorker = new WifiSlice.WifiScanWorker(mContext, WIFI_SLICE_URI);
mWifiScanWorker = new WifiScanWorker(mContext, WIFI_SLICE_URI);
}
@Test
@@ -122,6 +134,107 @@ public class WifiSliceTest {
mContext.getString(R.string.wifi_empty_list_wifi_on));
}
private AccessPoint createAccessPoint(String name, boolean active, boolean reachable) {
final AccessPoint accessPoint = mock(AccessPoint.class);
doReturn(name).when(accessPoint).getConfigName();
doReturn(active).when(accessPoint).isActive();
doReturn(reachable).when(accessPoint).isReachable();
if (active) {
final NetworkInfo networkInfo = mock(NetworkInfo.class);
doReturn(networkInfo).when(accessPoint).getNetworkInfo();
doReturn(NetworkInfo.State.CONNECTED).when(networkInfo).getState();
}
return accessPoint;
}
private void setWorkerResults(AccessPoint... accessPoints) {
final ArrayList<AccessPoint> results = new ArrayList<>();
for (AccessPoint ap : accessPoints) {
results.add(ap);
}
final SliceBackgroundWorker worker = SliceBackgroundWorker.getInstance(mWifiSlice.getUri());
doReturn(results).when(worker).getResults();
}
@Test
@Config(shadows = ShadowSliceBackgroundWorker.class)
public void getWifiSlice_noReachableAp_shouldReturnLoadingRow() {
setWorkerResults(
createAccessPoint(AP1_NAME, false, false),
createAccessPoint(AP2_NAME, false, false));
final Slice wifiSlice = mWifiSlice.getSlice();
final List<SliceItem> sliceItems = wifiSlice.getItems();
SliceTester.assertAnySliceItemContainsTitle(sliceItems, AP1_NAME);
SliceTester.assertAnySliceItemContainsTitle(sliceItems, AP2_NAME);
// Has scanning text
SliceTester.assertAnySliceItemContainsSubtitle(sliceItems,
mContext.getString(R.string.wifi_empty_list_wifi_on));
}
@Test
@Config(shadows = ShadowSliceBackgroundWorker.class)
public void getWifiSlice_oneActiveAp_shouldReturnLoadingRow() {
setWorkerResults(createAccessPoint(AP1_NAME, true, true));
final Slice wifiSlice = mWifiSlice.getSlice();
final List<SliceItem> sliceItems = wifiSlice.getItems();
SliceTester.assertAnySliceItemContainsTitle(sliceItems, AP1_NAME);
// Has scanning text
SliceTester.assertAnySliceItemContainsSubtitle(sliceItems,
mContext.getString(R.string.wifi_empty_list_wifi_on));
}
@Test
@Config(shadows = ShadowSliceBackgroundWorker.class)
public void getWifiSlice_oneActiveApAndOneUnreachableAp_shouldReturnLoadingRow() {
setWorkerResults(
createAccessPoint(AP1_NAME, true, true),
createAccessPoint(AP2_NAME, false, false));
final Slice wifiSlice = mWifiSlice.getSlice();
final List<SliceItem> sliceItems = wifiSlice.getItems();
SliceTester.assertAnySliceItemContainsTitle(sliceItems, AP1_NAME);
SliceTester.assertAnySliceItemContainsTitle(sliceItems, AP2_NAME);
// Has scanning text
SliceTester.assertAnySliceItemContainsSubtitle(sliceItems,
mContext.getString(R.string.wifi_empty_list_wifi_on));
}
@Test
@Config(shadows = ShadowSliceBackgroundWorker.class)
public void getWifiSlice_oneReachableAp_shouldNotReturnLoadingRow() {
setWorkerResults(createAccessPoint(AP1_NAME, false, true));
final Slice wifiSlice = mWifiSlice.getSlice();
final List<SliceItem> sliceItems = wifiSlice.getItems();
SliceTester.assertAnySliceItemContainsTitle(sliceItems, AP1_NAME);
// No scanning text
SliceTester.assertNoSliceItemContainsSubtitle(sliceItems,
mContext.getString(R.string.wifi_empty_list_wifi_on));
}
@Test
@Config(shadows = ShadowSliceBackgroundWorker.class)
public void getWifiSlice_allReachableAps_shouldNotReturnLoadingRow() {
setWorkerResults(
createAccessPoint(AP1_NAME, false, true),
createAccessPoint(AP2_NAME, false, true));
final Slice wifiSlice = mWifiSlice.getSlice();
final List<SliceItem> sliceItems = wifiSlice.getItems();
SliceTester.assertAnySliceItemContainsTitle(sliceItems, AP1_NAME);
SliceTester.assertAnySliceItemContainsTitle(sliceItems, AP2_NAME);
// No scanning text
SliceTester.assertNoSliceItemContainsSubtitle(sliceItems,
mContext.getString(R.string.wifi_empty_list_wifi_on));
}
@Test
public void handleUriChange_updatesWifi() {
final Intent intent = mWifiSlice.getIntent();
@@ -146,4 +259,14 @@ public class WifiSliceTest {
verify(mResolver).notifyChange(WIFI_SLICE_URI, null);
}
@Implements(SliceBackgroundWorker.class)
public static class ShadowSliceBackgroundWorker {
private static WifiScanWorker mWifiScanWorker = mock(WifiScanWorker.class);
@Implementation
public static SliceBackgroundWorker getInstance(Uri uri) {
return mWifiScanWorker;
}
}
}