Merge changes I80b93689,Ie767a9b8
* changes: Add capport info to WiFi details(WifiDetailPreferenceController2) Add capport info to WiFi details
This commit is contained in:
@@ -20,7 +20,6 @@ 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.anyString;
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Mockito.atLeastOnce;
|
||||
import static org.mockito.Mockito.doNothing;
|
||||
@@ -41,6 +40,7 @@ import android.content.res.Resources;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.CaptivePortalData;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.ConnectivityManager.NetworkCallback;
|
||||
import android.net.IpPrefix;
|
||||
@@ -52,6 +52,7 @@ import android.net.NetworkCapabilities;
|
||||
import android.net.NetworkInfo;
|
||||
import android.net.NetworkRequest;
|
||||
import android.net.RouteInfo;
|
||||
import android.net.Uri;
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.net.wifi.WifiInfo;
|
||||
import android.net.wifi.WifiManager;
|
||||
@@ -75,6 +76,7 @@ import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
|
||||
import com.android.settings.widget.EntityHeaderController;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.utils.StringUtil;
|
||||
import com.android.settingslib.widget.ActionButtonsPreference;
|
||||
import com.android.settingslib.widget.LayoutPreference;
|
||||
import com.android.settingslib.wifi.AccessPoint;
|
||||
@@ -99,6 +101,10 @@ import org.robolectric.shadows.ShadowToast;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.FormatStyle;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -146,6 +152,8 @@ public class WifiDetailPreferenceControllerTest {
|
||||
@Mock
|
||||
private WifiDetailPreferenceController.IconInjector mockIconInjector;
|
||||
@Mock
|
||||
private WifiDetailPreferenceController.Clock mMockClock;
|
||||
@Mock
|
||||
private MacAddress mockMacAddress;
|
||||
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
@@ -286,7 +294,10 @@ public class WifiDetailPreferenceControllerTest {
|
||||
// builder pattern
|
||||
when(mockHeaderController.setRecyclerView(mockFragment.getListView(), mLifecycle))
|
||||
.thenReturn(mockHeaderController);
|
||||
when(mockHeaderController.setSummary(anyString())).thenReturn(mockHeaderController);
|
||||
when(mockHeaderController.setSummary(nullable(String.class)))
|
||||
.thenReturn(mockHeaderController);
|
||||
when(mockHeaderController.setSecondSummary(nullable(String.class)))
|
||||
.thenReturn(mockHeaderController);
|
||||
when(mockIconInjector.getIcon(anyInt())).thenReturn(new ColorDrawable());
|
||||
|
||||
setupMockedPreferenceScreen();
|
||||
@@ -338,7 +349,8 @@ public class WifiDetailPreferenceControllerTest {
|
||||
mLifecycle,
|
||||
mockWifiManager,
|
||||
mockMetricsFeatureProvider,
|
||||
mockIconInjector);
|
||||
mockIconInjector,
|
||||
mMockClock);
|
||||
}
|
||||
|
||||
private void setupMockedPreferenceScreen() {
|
||||
@@ -525,6 +537,54 @@ public class WifiDetailPreferenceControllerTest {
|
||||
verify(mockHeaderController).setSummary(summary);
|
||||
}
|
||||
|
||||
private void doShouldShowRemainingTimeTest(ZonedDateTime now, long timeRemainingMs) {
|
||||
when(mMockClock.now()).thenReturn(now);
|
||||
setUpForConnectedNetwork();
|
||||
displayAndResume();
|
||||
|
||||
final CaptivePortalData data = new CaptivePortalData.Builder()
|
||||
.setExpiryTime(now.toInstant().getEpochSecond() * 1000 + timeRemainingMs)
|
||||
.build();
|
||||
final LinkProperties lp = new LinkProperties();
|
||||
lp.setCaptivePortalData(data);
|
||||
|
||||
updateLinkProperties(lp);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityHeader_shouldShowShortRemainingTime() {
|
||||
// Expires in 1h, 2min, 15sec
|
||||
final long timeRemainingMs = (3600 + 2 * 60 + 15) * 1000;
|
||||
final ZonedDateTime fakeNow = ZonedDateTime.of(2020, 1, 2, 3, 4, 5, 6,
|
||||
ZoneId.of("Europe/London"));
|
||||
doShouldShowRemainingTimeTest(fakeNow, timeRemainingMs);
|
||||
final String expectedSummary = mContext.getString(R.string.wifi_time_remaining,
|
||||
StringUtil.formatElapsedTime(mContext, timeRemainingMs, false /* withSeconds */));
|
||||
final InOrder inOrder = inOrder(mockHeaderController);
|
||||
inOrder.verify(mockHeaderController).setSecondSummary(expectedSummary);
|
||||
|
||||
updateLinkProperties(new LinkProperties());
|
||||
inOrder.verify(mockHeaderController).setSecondSummary((String) null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityHeader_shouldShowExpiryDate() {
|
||||
// Expires in 49h, 2min, 15sec
|
||||
final long timeRemainingMs = (49 * 3600 + 2 * 60 + 15) * 1000;
|
||||
final ZonedDateTime fakeNow = ZonedDateTime.of(2020, 1, 2, 3, 4, 5, 6,
|
||||
ZoneId.of("Europe/London"));
|
||||
doShouldShowRemainingTimeTest(fakeNow, timeRemainingMs);
|
||||
final String expectedSummary = mContext.getString(
|
||||
R.string.wifi_expiry_time,
|
||||
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).format(
|
||||
fakeNow.plusNanos(timeRemainingMs * 1_000_000)));
|
||||
final InOrder inOrder = inOrder(mockHeaderController);
|
||||
inOrder.verify(mockHeaderController).setSecondSummary(expectedSummary);
|
||||
|
||||
updateLinkProperties(new LinkProperties());
|
||||
inOrder.verify(mockHeaderController).setSecondSummary((String) null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityHeader_shouldConvertSavedAsDisconnected() {
|
||||
setUpForDisconnectedNetwork();
|
||||
@@ -1272,6 +1332,8 @@ public class WifiDetailPreferenceControllerTest {
|
||||
|
||||
nc.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
|
||||
updateNetworkCapabilities(nc);
|
||||
|
||||
inOrder.verify(mockButtonsPref).setButton2Text(R.string.wifi_sign_in_button_text);
|
||||
inOrder.verify(mockButtonsPref).setButton2Visible(true);
|
||||
|
||||
nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
|
||||
@@ -1279,6 +1341,31 @@ public class WifiDetailPreferenceControllerTest {
|
||||
inOrder.verify(mockButtonsPref).setButton2Visible(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void captivePortal_shouldShowVenueInfoButton() {
|
||||
setUpForConnectedNetwork();
|
||||
|
||||
InOrder inOrder = inOrder(mockButtonsPref);
|
||||
|
||||
displayAndResume();
|
||||
|
||||
inOrder.verify(mockButtonsPref).setButton2Visible(false);
|
||||
|
||||
LinkProperties lp = new LinkProperties();
|
||||
final CaptivePortalData data = new CaptivePortalData.Builder()
|
||||
.setVenueInfoUrl(Uri.parse("https://example.com/info"))
|
||||
.build();
|
||||
lp.setCaptivePortalData(data);
|
||||
updateLinkProperties(lp);
|
||||
|
||||
inOrder.verify(mockButtonsPref).setButton2Text(R.string.wifi_venue_website_button_text);
|
||||
inOrder.verify(mockButtonsPref).setButton2Visible(true);
|
||||
|
||||
lp.setCaptivePortalData(null);
|
||||
updateLinkProperties(lp);
|
||||
inOrder.verify(mockButtonsPref).setButton2Visible(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSignInButton_shouldStartCaptivePortalApp() {
|
||||
setUpForConnectedNetwork();
|
||||
@@ -1286,7 +1373,8 @@ public class WifiDetailPreferenceControllerTest {
|
||||
displayAndResume();
|
||||
|
||||
ArgumentCaptor<OnClickListener> captor = ArgumentCaptor.forClass(OnClickListener.class);
|
||||
verify(mockButtonsPref).setButton2OnClickListener(captor.capture());
|
||||
verify(mockButtonsPref, atLeastOnce()).setButton2OnClickListener(captor.capture());
|
||||
// getValue() returns the last captured value
|
||||
captor.getValue().onClick(null);
|
||||
verify(mockConnectivityManager).startCaptivePortalApp(mockNetwork);
|
||||
verify(mockMetricsFeatureProvider)
|
||||
|
@@ -20,8 +20,8 @@ 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.anyString;
|
||||
import static org.mockito.ArgumentMatchers.nullable;
|
||||
import static org.mockito.Mockito.atLeastOnce;
|
||||
import static org.mockito.Mockito.doNothing;
|
||||
import static org.mockito.Mockito.inOrder;
|
||||
import static org.mockito.Mockito.mock;
|
||||
@@ -40,6 +40,7 @@ import android.content.res.Resources;
|
||||
import android.graphics.drawable.BitmapDrawable;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.CaptivePortalData;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.ConnectivityManager.NetworkCallback;
|
||||
import android.net.IpPrefix;
|
||||
@@ -51,6 +52,7 @@ import android.net.NetworkCapabilities;
|
||||
import android.net.NetworkInfo;
|
||||
import android.net.NetworkRequest;
|
||||
import android.net.RouteInfo;
|
||||
import android.net.Uri;
|
||||
import android.net.wifi.WifiConfiguration;
|
||||
import android.net.wifi.WifiInfo;
|
||||
import android.net.wifi.WifiManager;
|
||||
@@ -74,6 +76,7 @@ import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
|
||||
import com.android.settings.widget.EntityHeaderController;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.utils.StringUtil;
|
||||
import com.android.settingslib.widget.ActionButtonsPreference;
|
||||
import com.android.settingslib.widget.LayoutPreference;
|
||||
import com.android.wifitrackerlib.NetworkDetailsTracker;
|
||||
@@ -98,6 +101,10 @@ import org.robolectric.shadows.ShadowToast;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.FormatStyle;
|
||||
import java.util.Arrays;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -148,6 +155,8 @@ public class WifiDetailPreferenceController2Test {
|
||||
@Mock
|
||||
private WifiDetailPreferenceController2.IconInjector mMockIconInjector;
|
||||
@Mock
|
||||
private WifiDetailPreferenceController2.Clock mMockClock;
|
||||
@Mock
|
||||
private MacAddress mMockMacAddress;
|
||||
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
@@ -288,7 +297,10 @@ public class WifiDetailPreferenceController2Test {
|
||||
// builder pattern
|
||||
when(mMockHeaderController.setRecyclerView(mMockFragment.getListView(), mLifecycle))
|
||||
.thenReturn(mMockHeaderController);
|
||||
when(mMockHeaderController.setSummary(anyString())).thenReturn(mMockHeaderController);
|
||||
when(mMockHeaderController.setSummary(nullable(String.class)))
|
||||
.thenReturn(mMockHeaderController);
|
||||
when(mMockHeaderController.setSecondSummary(nullable(String.class)))
|
||||
.thenReturn(mMockHeaderController);
|
||||
when(mMockIconInjector.getIcon(anyInt())).thenReturn(new ColorDrawable());
|
||||
|
||||
setupMockedPreferenceScreen();
|
||||
@@ -326,7 +338,8 @@ public class WifiDetailPreferenceController2Test {
|
||||
mLifecycle,
|
||||
mMockWifiManager,
|
||||
mMockMetricsFeatureProvider,
|
||||
mMockIconInjector));
|
||||
mMockIconInjector,
|
||||
mMockClock));
|
||||
}
|
||||
|
||||
private void setupMockedPreferenceScreen() {
|
||||
@@ -514,6 +527,54 @@ public class WifiDetailPreferenceController2Test {
|
||||
verify(mMockHeaderController).setSummary(summary);
|
||||
}
|
||||
|
||||
private void doShouldShowRemainingTimeTest(ZonedDateTime now, long timeRemainingMs) {
|
||||
when(mMockClock.now()).thenReturn(now);
|
||||
setUpForConnectedNetwork();
|
||||
displayAndResume();
|
||||
|
||||
final CaptivePortalData data = new CaptivePortalData.Builder()
|
||||
.setExpiryTime(now.toInstant().getEpochSecond() * 1000 + timeRemainingMs)
|
||||
.build();
|
||||
final LinkProperties lp = new LinkProperties();
|
||||
lp.setCaptivePortalData(data);
|
||||
|
||||
updateLinkProperties(lp);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityHeader_shouldShowShortRemainingTime() {
|
||||
// Expires in 1h, 2min, 15sec
|
||||
final long timeRemainingMs = (3600 + 2 * 60 + 15) * 1000;
|
||||
final ZonedDateTime fakeNow = ZonedDateTime.of(2020, 1, 2, 3, 4, 5, 6,
|
||||
ZoneId.of("Europe/London"));
|
||||
doShouldShowRemainingTimeTest(fakeNow, timeRemainingMs);
|
||||
final String expectedSummary = mContext.getString(R.string.wifi_time_remaining,
|
||||
StringUtil.formatElapsedTime(mContext, timeRemainingMs, false /* withSeconds */));
|
||||
final InOrder inOrder = inOrder(mMockHeaderController);
|
||||
inOrder.verify(mMockHeaderController).setSecondSummary(expectedSummary);
|
||||
|
||||
updateLinkProperties(new LinkProperties());
|
||||
inOrder.verify(mMockHeaderController).setSecondSummary((String) null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityHeader_shouldShowExpiryDate() {
|
||||
// Expires in 49h, 2min, 15sec
|
||||
final long timeRemainingMs = (49 * 3600 + 2 * 60 + 15) * 1000;
|
||||
final ZonedDateTime fakeNow = ZonedDateTime.of(2020, 1, 2, 3, 4, 5, 6,
|
||||
ZoneId.of("Europe/London"));
|
||||
doShouldShowRemainingTimeTest(fakeNow, timeRemainingMs);
|
||||
final String expectedSummary = mContext.getString(
|
||||
R.string.wifi_expiry_time,
|
||||
DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT).format(
|
||||
fakeNow.plusNanos(timeRemainingMs * 1_000_000)));
|
||||
final InOrder inOrder = inOrder(mMockHeaderController);
|
||||
inOrder.verify(mMockHeaderController).setSecondSummary(expectedSummary);
|
||||
|
||||
updateLinkProperties(new LinkProperties());
|
||||
inOrder.verify(mMockHeaderController).setSecondSummary((String) null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void entityHeader_shouldConvertSavedAsDisconnected() {
|
||||
setUpForDisconnectedNetwork();
|
||||
@@ -1260,6 +1321,8 @@ public class WifiDetailPreferenceController2Test {
|
||||
|
||||
nc.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
|
||||
updateNetworkCapabilities(nc);
|
||||
|
||||
inOrder.verify(mMockButtonsPref).setButton2Text(R.string.wifi_sign_in_button_text);
|
||||
inOrder.verify(mMockButtonsPref).setButton2Visible(true);
|
||||
|
||||
nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
|
||||
@@ -1267,6 +1330,31 @@ public class WifiDetailPreferenceController2Test {
|
||||
inOrder.verify(mMockButtonsPref).setButton2Visible(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void captivePortal_shouldShowVenueInfoButton() {
|
||||
setUpForConnectedNetwork();
|
||||
|
||||
InOrder inOrder = inOrder(mMockButtonsPref);
|
||||
|
||||
displayAndResume();
|
||||
|
||||
inOrder.verify(mMockButtonsPref).setButton2Visible(false);
|
||||
|
||||
LinkProperties lp = new LinkProperties();
|
||||
final CaptivePortalData data = new CaptivePortalData.Builder()
|
||||
.setVenueInfoUrl(Uri.parse("https://example.com/info"))
|
||||
.build();
|
||||
lp.setCaptivePortalData(data);
|
||||
updateLinkProperties(lp);
|
||||
|
||||
inOrder.verify(mMockButtonsPref).setButton2Text(R.string.wifi_venue_website_button_text);
|
||||
inOrder.verify(mMockButtonsPref).setButton2Visible(true);
|
||||
|
||||
lp.setCaptivePortalData(null);
|
||||
updateLinkProperties(lp);
|
||||
inOrder.verify(mMockButtonsPref).setButton2Visible(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSignInButton_shouldStartCaptivePortalApp() {
|
||||
setUpForConnectedNetwork();
|
||||
@@ -1274,7 +1362,8 @@ public class WifiDetailPreferenceController2Test {
|
||||
displayAndResume();
|
||||
|
||||
ArgumentCaptor<OnClickListener> captor = ArgumentCaptor.forClass(OnClickListener.class);
|
||||
verify(mMockButtonsPref).setButton2OnClickListener(captor.capture());
|
||||
verify(mMockButtonsPref, atLeastOnce()).setButton2OnClickListener(captor.capture());
|
||||
// getValue() returns the last captured value
|
||||
captor.getValue().onClick(null);
|
||||
verify(mMockConnectivityManager).startCaptivePortalApp(mMockNetwork);
|
||||
verify(mMockMetricsFeatureProvider)
|
||||
|
Reference in New Issue
Block a user