diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java index 92132e82d7c..44fb3216504 100644 --- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java +++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java @@ -103,6 +103,8 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController @VisibleForTesting static final String KEY_HEADER = "connection_header"; @VisibleForTesting + static final String KEY_DATA_USAGE_HEADER = "status_header"; + @VisibleForTesting static final String KEY_BUTTONS_PREF = "buttons"; @VisibleForTesting static final String KEY_SIGNAL_STRENGTH_PREF = "signal_strength"; @@ -426,7 +428,7 @@ public class WifiDetailPreferenceController extends AbstractPreferenceController if (usingDataUsageHeader(mContext)) { headerPref.setVisible(false); - mDataUsageSummaryPref = screen.findPreference("status_header"); + mDataUsageSummaryPref = screen.findPreference(KEY_DATA_USAGE_HEADER); mDataUsageSummaryPref.setVisible(true); mSummaryHeaderController = new WifiDataUsageSummaryPreferenceController(mFragment.getActivity(), diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java index f177b5ea87a..307712e686b 100644 --- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java @@ -43,6 +43,7 @@ import android.net.ConnectivityManager.NetworkCallback; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; +import android.net.MacAddress; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkInfo; @@ -76,6 +77,8 @@ import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.widget.ActionButtonsPreference; import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.wifi.AccessPoint; +import com.android.settingslib.wifi.WifiTracker; +import com.android.settingslib.wifi.WifiTrackerFactory; import org.junit.Before; import org.junit.Test; @@ -95,6 +98,7 @@ import java.net.Inet4Address; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; +import java.util.ArrayList; import java.util.stream.Collectors; @RunWith(RobolectricTestRunner.class) @@ -107,6 +111,8 @@ public class WifiDetailPreferenceControllerTest { private static final int RX_LINK_SPEED = 54; private static final String SSID = "ssid"; private static final String MAC_ADDRESS = WifiInfo.DEFAULT_MAC_ADDRESS; + private static final String RANDOMIZED_MAC_ADDRESS = "RANDOMIZED_MAC_ADDRESS"; + private static final String FACTORY_MAC_ADDRESS = "FACTORY_MAC_ADDRESS"; private static final String SECURITY = "None"; @Mock(answer = Answers.RETURNS_DEEP_STUBS) @@ -131,9 +137,13 @@ public class WifiDetailPreferenceControllerTest { @Mock private WifiManager mockWifiManager; @Mock + private WifiTracker mockWifiTracker; + @Mock private MetricsFeatureProvider mockMetricsFeatureProvider; @Mock private WifiDetailPreferenceController.IconInjector mockIconInjector; + @Mock + private MacAddress mockMacAddress; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private EntityHeaderController mockHeaderController; @@ -285,6 +295,48 @@ public class WifiDetailPreferenceControllerTest { mController = newWifiDetailPreferenceController(); } + private void setUpForConnectedNetwork() { + // Enable saved network detail page feature for this test + FeatureFlagUtils.setEnabled(mContext, FeatureFlags.WIFI_DETAILS_SAVED_SCREEN, true); + when(mockAccessPoint.isActive()).thenReturn(true); + ArrayList list = new ArrayList<>(); + list.add(mockAccessPoint); + when(mockWifiTracker.getAccessPoints()).thenReturn(list); + WifiTrackerFactory.setTestingWifiTracker(mockWifiTracker); + when(mockAccessPoint.matches(any(WifiConfiguration.class))).thenReturn(true); + when(mockAccessPoint.isReachable()).thenReturn(true); + + mController = newWifiDetailPreferenceController(); + } + + private void setUpForDisconnectedNetwork() { + // Enable saved network detail page feature for this test + FeatureFlagUtils.setEnabled(mContext, FeatureFlags.WIFI_DETAILS_SAVED_SCREEN, true); + when(mockAccessPoint.isActive()).thenReturn(false); + ArrayList list = new ArrayList<>(); + list.add(mockAccessPoint); + when(mockWifiTracker.getAccessPoints()).thenReturn(list); + WifiTrackerFactory.setTestingWifiTracker(mockWifiTracker); + when(mockAccessPoint.matches(any(WifiConfiguration.class))).thenReturn(true); + when(mockAccessPoint.isReachable()).thenReturn(true); + + mController = newWifiDetailPreferenceController(); + } + + private void setUpForNotInRangeNetwork() { + // Enable saved network detail page feature for this test + FeatureFlagUtils.setEnabled(mContext, FeatureFlags.WIFI_DETAILS_SAVED_SCREEN, true); + when(mockAccessPoint.isActive()).thenReturn(false); + ArrayList list = new ArrayList<>(); + list.add(mockAccessPoint); + when(mockWifiTracker.getAccessPoints()).thenReturn(list); + WifiTrackerFactory.setTestingWifiTracker(mockWifiTracker); + when(mockAccessPoint.matches(any(WifiConfiguration.class))).thenReturn(false); + when(mockAccessPoint.isReachable()).thenReturn(false); + + mController = newWifiDetailPreferenceController(); + } + private WifiDetailPreferenceController newWifiDetailPreferenceController() { return new WifiDetailPreferenceController( mockAccessPoint, @@ -362,6 +414,33 @@ public class WifiDetailPreferenceControllerTest { verify(mockWifiManager, times(1)).getConnectionInfo(); } + @Test + public void latestWifiInfo_shouldBeFetchedInDisplayPreferenceForConnectedNetwork() { + setUpForConnectedNetwork(); + + displayAndResume(); + + verify(mockWifiManager, times(1)).getConnectionInfo(); + } + + @Test + public void latestWifiInfo_shouldNotBeFetchedInDisplayPreferenceForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + + displayAndResume(); + + verify(mockWifiManager, never()).getConnectionInfo(); + } + + @Test + public void latestWifiInfo_shouldNotBeFetchedInDisplayPreferenceForNotInRangeNetwork() { + setUpForNotInRangeNetwork(); + + displayAndResume(); + + verify(mockWifiManager, never()).getConnectionInfo(); + } + @Test public void latestNetworkInfo_shouldBeFetchedInDisplayPreference() { displayAndResume(); @@ -369,6 +448,33 @@ public class WifiDetailPreferenceControllerTest { verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class)); } + @Test + public void latestNetworkInfo_shouldBeFetchedInDisplayPreferenceForConnectedNetwork() { + setUpForConnectedNetwork(); + + displayAndResume(); + + verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class)); + } + + @Test + public void latestNetworkInfo_shouldNotBeFetchedInDisplayPreferenceForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + + displayAndResume(); + + verify(mockConnectivityManager, never()).getNetworkInfo(any(Network.class)); + } + + @Test + public void latestNetworkInfo_shouldNotBeFetchedInDisplayPreferenceForNotInRangeNetwork() { + setUpForNotInRangeNetwork(); + + displayAndResume(); + + verify(mockConnectivityManager, never()).getNetworkInfo(any(Network.class)); + } + @Test public void networkCallback_shouldBeRegisteredOnResume() { displayAndResume(); @@ -395,6 +501,35 @@ public class WifiDetailPreferenceControllerTest { verify(mockHeaderController).setIcon(expectedIcon); } + @Test + public void entityHeader_shouldHaveIconSetForConnectedNetwork() { + setUpForConnectedNetwork(); + Drawable expectedIcon = mockIconInjector.getIcon(LEVEL); + + displayAndResume(); + + verify(mockHeaderController).setIcon(expectedIcon); + } + + @Test + public void entityHeader_shouldHaveIconSetForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + Drawable expectedIcon = mockIconInjector.getIcon(LEVEL); + + displayAndResume(); + + verify(mockHeaderController).setIcon(expectedIcon); + } + + @Test + public void entityHeader_shouldNotHaveIconSetForNotInRangeNetwork() { + setUpForNotInRangeNetwork(); + + displayAndResume(); + + verify(mockHeaderController, never()).setIcon(any(Drawable.class)); + } + @Test public void entityHeader_shouldHaveLabelSetToTitle() { String label = "title"; @@ -422,6 +557,33 @@ public class WifiDetailPreferenceControllerTest { verify(mockSignalStrengthPref).setIcon(any(Drawable.class)); } + @Test + public void signalStrengthPref_shouldHaveIconSetForConnectedNetwork() { + setUpForConnectedNetwork(); + + displayAndResume(); + + verify(mockSignalStrengthPref).setIcon(any(Drawable.class)); + } + + @Test + public void signalStrengthPref_shouldHaveIconSetForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + + displayAndResume(); + + verify(mockSignalStrengthPref).setIcon(any(Drawable.class)); + } + + @Test + public void signalStrengthPref_shouldNotHaveIconSetForOutOfRangeNetwork() { + setUpForNotInRangeNetwork(); + + displayAndResume(); + + verify(mockSignalStrengthPref, never()).setIcon(any(Drawable.class)); + } + @Test public void signalStrengthPref_shouldHaveDetailTextSet() { String expectedStrength = @@ -432,6 +594,37 @@ public class WifiDetailPreferenceControllerTest { verify(mockSignalStrengthPref).setSummary(expectedStrength); } + @Test + public void signalStrengthPref_shouldHaveDetailTextSetForConnectedNetwork() { + setUpForConnectedNetwork(); + String expectedStrength = + mContext.getResources().getStringArray(R.array.wifi_signal)[LEVEL]; + + displayAndResume(); + + verify(mockSignalStrengthPref).setSummary(expectedStrength); + } + + @Test + public void signalStrengthPref_shouldHaveDetailTextSetForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + String expectedStrength = + mContext.getResources().getStringArray(R.array.wifi_signal)[LEVEL]; + + displayAndResume(); + + verify(mockSignalStrengthPref).setSummary(expectedStrength); + } + + @Test + public void signalStrengthPref_shouldNotHaveDetailTextSetForNotInRangeNetwork() { + setUpForNotInRangeNetwork(); + + displayAndResume(); + + verify(mockSignalStrengthPref, never()).setSummary(any(String.class)); + } + @Test public void linkSpeedPref_shouldHaveDetailTextSet() { String expectedLinkSpeed = mContext.getString(R.string.tx_link_speed, TX_LINK_SPEED); @@ -450,6 +643,37 @@ public class WifiDetailPreferenceControllerTest { verify(mockTxLinkSpeedPref).setVisible(false); } + @Test + public void linkSpeedPref_shouldVisibleForConnectedNetwork() { + setUpForConnectedNetwork(); + String expectedLinkSpeed = mContext.getString(R.string.tx_link_speed, TX_LINK_SPEED); + + displayAndResume(); + + verify(mockTxLinkSpeedPref).setVisible(true); + verify(mockTxLinkSpeedPref).setSummary(expectedLinkSpeed); + } + + @Test + public void linkSpeedPref_shouldInvisibleForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + + displayAndResume(); + + verify(mockTxLinkSpeedPref).setVisible(false); + verify(mockTxLinkSpeedPref, never()).setSummary(any(String.class)); + } + + @Test + public void linkSpeedPref_shouldInvisibleForNotInRangeNetwork() { + setUpForNotInRangeNetwork(); + + displayAndResume(); + + verify(mockTxLinkSpeedPref).setVisible(false); + verify(mockTxLinkSpeedPref, never()).setSummary(any(String.class)); + } + @Test public void rxLinkSpeedPref_shouldHaveDetailTextSet() { String expectedLinkSpeed = mContext.getString(R.string.rx_link_speed, RX_LINK_SPEED); @@ -468,6 +692,37 @@ public class WifiDetailPreferenceControllerTest { verify(mockRxLinkSpeedPref).setVisible(false); } + @Test + public void rxLinkSpeedPref_shouldVisibleForConnectedNetwork() { + setUpForConnectedNetwork(); + String expectedLinkSpeed = mContext.getString(R.string.rx_link_speed, RX_LINK_SPEED); + + displayAndResume(); + + verify(mockRxLinkSpeedPref).setVisible(true); + verify(mockRxLinkSpeedPref).setSummary(expectedLinkSpeed); + } + + @Test + public void rxLinkSpeedPref_shouldInvisibleForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + + displayAndResume(); + + verify(mockRxLinkSpeedPref).setVisible(false); + verify(mockRxLinkSpeedPref, never()).setSummary(any(String.class)); + } + + @Test + public void rxLinkSpeedPref_shouldInvisibleForNotInRangeNetwork() { + setUpForNotInRangeNetwork(); + + displayAndResume(); + + verify(mockRxLinkSpeedPref).setVisible(false); + verify(mockRxLinkSpeedPref, never()).setSummary(any(String.class)); + } + @Test public void ssidPref_shouldHaveDetailTextSet() { when(mockAccessPoint.isPasspoint()).thenReturn(true); @@ -519,6 +774,42 @@ public class WifiDetailPreferenceControllerTest { verify(mockMacAddressPref).setSummary(MAC_ADDRESS); } + @Test + public void macAddressPref_shouldVisibleForConnectedNetwork() { + setUpForConnectedNetwork(); + + displayAndResume(); + + verify(mockMacAddressPref).setVisible(true); + verify(mockMacAddressPref).setSummary(MAC_ADDRESS); + } + + @Test + public void macAddressPref_shouldVisibleAsRandomizedForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + mockWifiConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_PERSISTENT; + when(mockWifiConfig.getRandomizedMacAddress()).thenReturn(mockMacAddress); + when(mockMacAddress.toString()).thenReturn(RANDOMIZED_MAC_ADDRESS); + + displayAndResume(); + + verify(mockMacAddressPref).setVisible(true); + verify(mockMacAddressPref).setSummary(RANDOMIZED_MAC_ADDRESS); + } + + @Test + public void macAddressPref_shouldVisibleAsFactoryForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + mockWifiConfig.macRandomizationSetting = WifiConfiguration.RANDOMIZATION_NONE; + when(mockWifiManager.getFactoryMacAddresses()) + .thenReturn(new String[]{FACTORY_MAC_ADDRESS}); + + displayAndResume(); + + verify(mockMacAddressPref).setVisible(true); + verify(mockMacAddressPref).setSummary(FACTORY_MAC_ADDRESS); + } + @Test public void ipAddressPref_shouldHaveDetailTextSet() { mLinkProperties.addLinkAddress(Constants.IPV4_ADDR); @@ -528,6 +819,26 @@ public class WifiDetailPreferenceControllerTest { verify(mockIpAddressPref).setSummary(Constants.IPV4_ADDR.getAddress().getHostAddress()); } + @Test + public void ipAddressPref_shouldHaveDetailTextSetForConnectedNetwork() { + setUpForConnectedNetwork(); + mLinkProperties.addLinkAddress(Constants.IPV4_ADDR); + + displayAndResume(); + + verify(mockIpAddressPref).setSummary(Constants.IPV4_ADDR.getAddress().getHostAddress()); + verify(mockIpAddressPref).setVisible(true); + } + + @Test + public void ipAddressPref_shouldInvisibleForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + + displayAndResume(); + + verify(mockIpAddressPref).setVisible(false); + } + @Test public void gatewayAndSubnet_shouldHaveDetailTextSet() { mLinkProperties.addLinkAddress(Constants.IPV4_ADDR); @@ -540,6 +851,29 @@ public class WifiDetailPreferenceControllerTest { verify(mockGatewayPref).setSummary("192.0.2.127"); } + @Test + public void gatewayAndSubnet_shouldHaveDetailTextSetForConnectedNetwork() { + setUpForConnectedNetwork(); + mLinkProperties.addLinkAddress(Constants.IPV4_ADDR); + mLinkProperties.addRoute(Constants.IPV4_DEFAULT); + mLinkProperties.addRoute(Constants.IPV4_SUBNET); + + displayAndResume(); + + verify(mockSubnetPref).setSummary("255.255.255.128"); + verify(mockGatewayPref).setSummary("192.0.2.127"); + verify(mockSubnetPref).setVisible(true); + } + + @Test + public void gatewayAndSubnet_shouldInvisibleSetForDisconnectedNetwork() { + setUpForDisconnectedNetwork(); + + displayAndResume(); + + verify(mockSubnetPref).setVisible(false); + } + @Test public void dnsServersPref_shouldHaveDetailTextSet() throws UnknownHostException { mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[] {8, 8, 4, 4})); @@ -554,6 +888,33 @@ public class WifiDetailPreferenceControllerTest { Constants.IPV6_DNS.getHostAddress()); } + @Test + public void dnsServersPref_shouldHaveDetailTextSetForConnectedNetwork() + throws UnknownHostException { + setUpForConnectedNetwork(); + mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[] {8, 8, 4, 4})); + mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[] {8, 8, 8, 8})); + mLinkProperties.addDnsServer(Constants.IPV6_DNS); + + displayAndResume(); + + verify(mockDnsPref).setSummary( + "8.8.4.4\n" + + "8.8.8.8\n" + + Constants.IPV6_DNS.getHostAddress()); + verify(mockDnsPref).setVisible(true); + } + + @Test + public void dnsServersPref_shouldInvisibleSetForDisconnectedNetwork() + throws UnknownHostException { + setUpForDisconnectedNetwork(); + + displayAndResume(); + + verify(mockDnsPref).setVisible(false); + } + @Test public void noCurrentNetwork_shouldFinishActivity() { // If WifiManager#getCurrentNetwork() returns null, then the network is neither connected @@ -565,6 +926,18 @@ public class WifiDetailPreferenceControllerTest { verify(mockActivity).finish(); } + @Test + public void noCurrentNetwork_shouldNotFinishActivityForConnectedNetwork() { + // For new feature for display detail page for saved network for disconnected network, + // mNetwork may be null, do finish activity + setUpForConnectedNetwork(); + when(mockWifiManager.getCurrentNetwork()).thenReturn(null); + + displayAndResume(); + + verify(mockActivity, never()).finish(); + } + @Test public void noLinkProperties_allIpDetailsHidden() { when(mockConnectivityManager.getLinkProperties(mockNetwork)).thenReturn(null); @@ -584,6 +957,25 @@ public class WifiDetailPreferenceControllerTest { verify(mockDnsPref, never()).setVisible(true); } + @Test + public void disconnectedNetwork_allIpDetailsHidden() { + setUpForDisconnectedNetwork(); + reset(mockIpv6Category, mockIpAddressPref, mockSubnetPref, mockGatewayPref, mockDnsPref); + + displayAndResume(); + + verify(mockIpv6Category).setVisible(false); + verify(mockIpAddressPref).setVisible(false); + verify(mockSubnetPref).setVisible(false); + verify(mockGatewayPref).setVisible(false); + verify(mockDnsPref).setVisible(false); + verify(mockIpv6Category, never()).setVisible(true); + verify(mockIpAddressPref, never()).setVisible(true); + verify(mockSubnetPref, never()).setVisible(true); + verify(mockGatewayPref, never()).setVisible(true); + verify(mockDnsPref, never()).setVisible(true); + } + // Convenience method to convert a LinkAddress to a string without a prefix length. private String asString(LinkAddress l) { return l.getAddress().getHostAddress(); @@ -762,7 +1154,7 @@ public class WifiDetailPreferenceControllerTest { displayAndResume(); - verify(mockButtonsPref).setButton3Visible(false); + verify(mockButtonsPref).setButton4Visible(false); } @Test @@ -871,6 +1263,20 @@ public class WifiDetailPreferenceControllerTest { verify(mockWifiManager, times(2)).getConnectionInfo(); } + @Test + public void networkStateChangedIntent_shouldRefetchInfoForConnectedNetwork() { + setUpForConnectedNetwork(); + displayAndResume(); + + verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class)); + verify(mockWifiManager, times(1)).getConnectionInfo(); + + mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION)); + + verify(mockConnectivityManager, times(2)).getNetworkInfo(any(Network.class)); + verify(mockWifiManager, times(2)).getConnectionInfo(); + } + @Test public void rssiChangedIntent_shouldRefetchInfo() { displayAndResume(); @@ -884,6 +1290,20 @@ public class WifiDetailPreferenceControllerTest { verify(mockWifiManager, times(2)).getConnectionInfo(); } + @Test + public void rssiChangedIntent_shouldRefetchInfoForConnectedNetwork() { + setUpForConnectedNetwork(); + displayAndResume(); + + verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class)); + verify(mockWifiManager, times(1)).getConnectionInfo(); + + mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION)); + + verify(mockConnectivityManager, times(2)).getNetworkInfo(any(Network.class)); + verify(mockWifiManager, times(2)).getConnectionInfo(); + } + @Test public void networkDisconnectedState_shouldFinishActivity() { displayAndResume(); @@ -894,6 +1314,18 @@ public class WifiDetailPreferenceControllerTest { verify(mockActivity).finish(); } + @Test + public void networkDisconnectedState_shouldNotFinishActivityForConnectedNetwork() { + setUpForConnectedNetwork(); + + displayAndResume(); + + when(mockConnectivityManager.getNetworkInfo(any(Network.class))).thenReturn(null); + mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION)); + + verify(mockActivity, never()).finish(); + } + @Test public void networkOnLost_shouldFinishActivity() { displayAndResume(); @@ -903,6 +1335,17 @@ public class WifiDetailPreferenceControllerTest { verify(mockActivity).finish(); } + @Test + public void networkOnLost_shouldNotFinishActivityForConnectedNetwork() { + setUpForConnectedNetwork(); + + displayAndResume(); + + mCallbackCaptor.getValue().onLost(mockNetwork); + + verify(mockActivity, never()).finish(); + } + @Test public void ipv6AddressPref_shouldHaveHostAddressTextSet() { mLinkProperties.addLinkAddress(Constants.IPV6_LINKLOCAL); @@ -982,6 +1425,19 @@ public class WifiDetailPreferenceControllerTest { verify(mockIconInjector, times(2)).getIcon(anyInt()); } + @Test + public void testRefreshRssiViews_shouldNotUpdateForNotInRangeNetwork() { + setUpForNotInRangeNetwork(); + + displayAndResume(); + + when(mockAccessPoint.getLevel()).thenReturn(0); + mContext.sendBroadcast(new Intent(WifiManager.RSSI_CHANGED_ACTION)); + + verify(mockSignalStrengthPref, times(2)).setVisible(false); + } + + private ActionButtonsPreference createMock() { final ActionButtonsPreference pref = mock(ActionButtonsPreference.class); when(pref.setButton1Text(anyInt())).thenReturn(pref);