Merge "Change status bar icons upon capability changes in the default network." into pi-dev

am: ceeba4f6d6

Change-Id: I811a18f21270e30dcf8fff6912bc4da2a9bb8db2
This commit is contained in:
Anarghya Mitra
2018-05-16 23:59:39 -07:00
committed by android-build-merger
6 changed files with 131 additions and 23 deletions

View File

@@ -23,6 +23,7 @@ import android.content.IntentFilter;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
@@ -219,6 +220,38 @@ public class NetworkControllerImpl extends BroadcastReceiver
deviceProvisionedController.getCurrentUser()));
}
});
ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback(){
private Network mLastNetwork;
private NetworkCapabilities mLastNetworkCapabilities;
@Override
public void onCapabilitiesChanged(
Network network, NetworkCapabilities networkCapabilities) {
boolean lastValidated = (mLastNetworkCapabilities != null) &&
mLastNetworkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED);
boolean validated =
networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED);
// This callback is invoked a lot (i.e. when RSSI changes), so avoid updating
// icons when connectivity state has remained the same.
if (network.equals(mLastNetwork) &&
networkCapabilities.equalsTransportTypes(mLastNetworkCapabilities) &&
validated == lastValidated) {
return;
}
mLastNetwork = network;
mLastNetworkCapabilities = networkCapabilities;
updateConnectivity();
}
};
// Even though this callback runs on the receiver handler thread which also processes the
// CONNECTIVITY_ACTION broadcasts, the broadcast and callback might come in at different
// times. This is safe since updateConnectivity() builds the list of transports from
// scratch.
// TODO: Move off of the deprecated CONNECTIVITY_ACTION broadcast and rely on callbacks
// exclusively for status bar icons.
mConnectivityManager.registerDefaultNetworkCallback(callback, mReceiverHandler);
}
public DataSaverController getDataSaverController() {

View File

@@ -17,20 +17,25 @@
package com.android.systemui.statusbar.policy;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isA;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.provider.Settings;
import android.provider.Settings.Global;
import android.telephony.PhoneStateListener;
@@ -90,6 +95,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
protected int mSubId;
private NetworkCapabilities mNetCapabilities;
private ConnectivityManager.NetworkCallback mNetworkCallback;
@Rule
public TestWatcher failWatcher = new TestWatcher() {
@@ -154,6 +160,13 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
setSubscriptions(mSubId);
mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId);
mPhoneStateListener = mMobileSignalController.mPhoneStateListener;
ArgumentCaptor<ConnectivityManager.NetworkCallback> callbackArg =
ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class);
Mockito.verify(mMockCm, atLeastOnce())
.registerDefaultNetworkCallback(callbackArg.capture(), isA(Handler.class));
mNetworkCallback = callbackArg.getValue();
assertNotNull(mNetworkCallback);
}
protected void setDefaultSubId(int subId) {
@@ -195,24 +208,37 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
setLevel(DEFAULT_LEVEL);
updateDataConnectionState(TelephonyManager.DATA_CONNECTED,
TelephonyManager.NETWORK_TYPE_UMTS);
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, true, true);
setConnectivityViaBroadcast(
NetworkCapabilities.TRANSPORT_CELLULAR, true, true);
}
public void setConnectivity(int networkType, boolean inetCondition, boolean isConnected) {
public void setConnectivityViaBroadcast(
int networkType, boolean validated, boolean isConnected) {
setConnectivityCommon(networkType, validated, isConnected);
Intent i = new Intent(ConnectivityManager.INET_CONDITION_ACTION);
mNetworkController.onReceive(mContext, i);
}
public void setConnectivityViaCallback(
int networkType, boolean validated, boolean isConnected){
setConnectivityCommon(networkType, validated, isConnected);
mNetworkCallback.onCapabilitiesChanged(
mock(Network.class), new NetworkCapabilities(mNetCapabilities));
}
private void setConnectivityCommon(
int networkType, boolean validated, boolean isConnected){
// TODO: Separate out into several NetworkCapabilities.
if (isConnected) {
mNetCapabilities.addTransportType(networkType);
} else {
mNetCapabilities.removeTransportType(networkType);
}
if (inetCondition) {
if (validated) {
mNetCapabilities.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
} else {
mNetCapabilities.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
}
mNetworkController.onReceive(mContext, i);
}
public void setGsmRoaming(boolean isRoaming) {

View File

@@ -118,7 +118,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
setupDefaultSignal();
updateDataConnectionState(TelephonyManager.DATA_CONNECTED, 0);
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
// Verify that a SignalDrawable with a cut out is used to display data disabled.
verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, 0,
@@ -132,7 +132,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
setupDefaultSignal();
updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0);
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
// Verify that a SignalDrawable with a cut out is used to display data disabled.
verifyLastMobileDataIndicators(true, DEFAULT_SIGNAL_STRENGTH, 0,
@@ -146,7 +146,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
setupDefaultSignal();
updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0);
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
when(mMockProvisionController.isUserSetup(anyInt())).thenReturn(false);
mUserCallback.onUserSetupChanged();
TestableLooper.get(this).processAllMessages();

View File

@@ -38,7 +38,7 @@ public class NetworkControllerEthernetTest extends NetworkControllerBaseTest {
}
protected void setEthernetState(boolean connected, boolean validated) {
setConnectivity(NetworkCapabilities.TRANSPORT_ETHERNET, validated, connected);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_ETHERNET, validated, connected);
}
protected void verifyLastEthernetIcon(boolean visible, int icon) {

View File

@@ -143,7 +143,7 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
testStrength, DEFAULT_ICON);
// Verify low inet number indexing.
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, true);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, true);
verifyLastMobileDataIndicators(true,
testStrength, DEFAULT_ICON, false, false);
}
@@ -230,8 +230,8 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
@Test
public void testNoBangWithWifi() {
setupDefaultSignal();
setConnectivity(mMobileSignalController.mTransportType, false, false);
setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
setConnectivityViaBroadcast(mMobileSignalController.mTransportType, false, false);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
verifyLastMobileDataIndicators(true, DEFAULT_LEVEL, 0);
}

View File

@@ -18,9 +18,9 @@ import org.mockito.Mockito;
import static junit.framework.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@SmallTest
@@ -44,9 +44,9 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest {
for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) {
setWifiLevel(testLevel);
setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, false, true);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, false, true);
verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][testLevel]);
}
}
@@ -65,10 +65,10 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest {
for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) {
setWifiLevel(testLevel);
setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][testLevel],
testSsid);
setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, false, true);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, false, true);
verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[0][testLevel],
testSsid);
}
@@ -82,7 +82,7 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest {
setWifiEnabled(true);
setWifiState(true, testSsid);
setWifiLevel(testLevel);
setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
verifyLastQsWifiIcon(true, true,
WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][testLevel], testSsid);
@@ -107,19 +107,68 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest {
setWifiEnabled(true);
setWifiState(true, testSsid);
setWifiLevel(testLevel);
setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
setupDefaultSignal();
setGsmRoaming(true);
// Still be on wifi though.
setConnectivity(NetworkCapabilities.TRANSPORT_WIFI, true, true);
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
verifyLastMobileDataIndicators(true,
DEFAULT_LEVEL,
0, true);
}
@Test
public void testWifiIconInvalidatedViaCallback() {
// Setup normal connection
String testSsid = "Test SSID";
int testLevel = 2;
setWifiEnabled(true);
setWifiState(true, testSsid);
setWifiLevel(testLevel);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, true);
verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[0][testLevel]);
}
@Test
public void testWifiIconDisconnectedViaCallback(){
// Setup normal connection
String testSsid = "Test SSID";
int testLevel = 2;
setWifiEnabled(true);
setWifiState(true, testSsid);
setWifiLevel(testLevel);
setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true);
verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
setWifiState(false, testSsid);
setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, false);
verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK);
}
@Test
public void testVpnWithUnderlyingWifi(){
String testSsid = "Test SSID";
int testLevel = 2;
setWifiEnabled(true);
verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK);
setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_VPN, false, true);
setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_VPN, true, true);
verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK);
// Mock calling setUnderlyingNetworks.
setWifiState(true, testSsid);
setWifiLevel(testLevel);
setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true);
verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]);
}
protected void setWifiActivity(int activity) {
// TODO: Not this, because this variable probably isn't sticking around.
mNetworkController.mWifiSignalController.setActivity(activity);
@@ -143,10 +192,10 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest {
protected void setWifiState(boolean connected, String ssid) {
Intent i = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
NetworkInfo networkInfo = Mockito.mock(NetworkInfo.class);
NetworkInfo networkInfo = mock(NetworkInfo.class);
when(networkInfo.isConnected()).thenReturn(connected);
WifiInfo wifiInfo = Mockito.mock(WifiInfo.class);
WifiInfo wifiInfo = mock(WifiInfo.class);
when(wifiInfo.getSSID()).thenReturn(ssid);
when(mMockWm.getConnectionInfo()).thenReturn(wifiInfo);