diff options
5 files changed, 93 insertions, 83 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java index c57d4ad962bd..cbb510505fdd 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiStatusTracker.java @@ -66,31 +66,40 @@ public class WifiStatusTracker { @Override public void onCapabilitiesChanged( Network network, NetworkCapabilities networkCapabilities) { + WifiInfo wifiInfo = (WifiInfo) networkCapabilities.getTransportInfo(); + updateWifiInfo(wifiInfo); + updateStatusLabel(); + mCallback.run(); + } + + @Override + public void onLost(Network network) { + updateWifiInfo(null); updateStatusLabel(); mCallback.run(); } }; private final NetworkCallback mDefaultNetworkCallback = new NetworkCallback() { - @Override - public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) { - // network is now the default network, and its capabilities are nc. - // This method will always be called immediately after the network becomes the - // default, in addition to any time the capabilities change while the network is - // the default. - mDefaultNetwork = network; - mDefaultNetworkCapabilities = nc; - updateStatusLabel(); - mCallback.run(); - } - @Override - public void onLost(Network network) { - // The system no longer has a default network. - mDefaultNetwork = null; - mDefaultNetworkCapabilities = null; - updateStatusLabel(); - mCallback.run(); - } - }; + @Override + public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) { + // network is now the default network, and its capabilities are nc. + // This method will always be called immediately after the network becomes the + // default, in addition to any time the capabilities change while the network is + // the default. + mDefaultNetwork = network; + mDefaultNetworkCapabilities = nc; + updateStatusLabel(); + mCallback.run(); + } + @Override + public void onLost(Network network) { + // The system no longer has a default network. + mDefaultNetwork = null; + mDefaultNetworkCapabilities = null; + updateStatusLabel(); + mCallback.run(); + } + }; private Network mDefaultNetwork = null; private NetworkCapabilities mDefaultNetworkCapabilities = null; private final Runnable mCallback; @@ -170,32 +179,22 @@ public class WifiStatusTracker { String action = intent.getAction(); if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { updateWifiState(); - } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { - updateWifiState(); - final NetworkInfo networkInfo = - intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); - connected = networkInfo != null && networkInfo.isConnected(); - mWifiInfo = null; - ssid = null; - if (connected) { - mWifiInfo = mWifiManager.getConnectionInfo(); - if (mWifiInfo != null) { - if (mWifiInfo.isPasspointAp() || mWifiInfo.isOsuAp()) { - ssid = mWifiInfo.getPasspointProviderFriendlyName(); - } else { - ssid = getValidSsid(mWifiInfo); - } - updateRssi(mWifiInfo.getRssi()); - maybeRequestNetworkScore(); - } + } + } + + private void updateWifiInfo(WifiInfo wifiInfo) { + updateWifiState(); + connected = wifiInfo != null; + mWifiInfo = wifiInfo; + ssid = null; + if (mWifiInfo != null) { + if (mWifiInfo.isPasspointAp() || mWifiInfo.isOsuAp()) { + ssid = mWifiInfo.getPasspointProviderFriendlyName(); + } else { + ssid = getValidSsid(mWifiInfo); } - updateStatusLabel(); - mCallback.run(); - } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) { - // Default to -200 as its below WifiManager.MIN_RSSI. - updateRssi(intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200)); - updateStatusLabel(); - mCallback.run(); + updateRssi(mWifiInfo.getRssi()); + maybeRequestNetworkScore(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index df00a4f743ed..7e3ffde20758 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -344,8 +344,6 @@ public class NetworkControllerImpl extends BroadcastReceiver // broadcasts IntentFilter filter = new IntentFilter(); - filter.addAction(WifiManager.RSSI_CHANGED_ACTION); - filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(Intent.ACTION_SIM_STATE_CHANGED); filter.addAction(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java index 4ae96651b570..3c0b07af74aa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java @@ -101,11 +101,7 @@ public class WifiSignalController extends wifiDesc, mCurrentState.isTransient, mCurrentState.statusLabel); } - /** - * Fetches wifi initial state replacing the initial sticky broadcast. - */ - public void fetchInitialState() { - mWifiTracker.fetchInitialState(); + private void copyWifiStates() { mCurrentState.enabled = mWifiTracker.enabled; mCurrentState.isDefault = mWifiTracker.isDefaultNetwork; mCurrentState.connected = mWifiTracker.connected; @@ -113,6 +109,14 @@ public class WifiSignalController extends mCurrentState.rssi = mWifiTracker.rssi; mCurrentState.level = mWifiTracker.level; mCurrentState.statusLabel = mWifiTracker.statusLabel; + } + + /** + * Fetches wifi initial state replacing the initial sticky broadcast. + */ + public void fetchInitialState() { + mWifiTracker.fetchInitialState(); + copyWifiStates(); notifyListenersIfNecessary(); } @@ -121,19 +125,12 @@ public class WifiSignalController extends */ public void handleBroadcast(Intent intent) { mWifiTracker.handleBroadcast(intent); - mCurrentState.enabled = mWifiTracker.enabled; - mCurrentState.isDefault = mWifiTracker.isDefaultNetwork; - mCurrentState.connected = mWifiTracker.connected; - mCurrentState.ssid = mWifiTracker.ssid; - mCurrentState.rssi = mWifiTracker.rssi; - mCurrentState.level = mWifiTracker.level; - mCurrentState.statusLabel = mWifiTracker.statusLabel; + copyWifiStates(); notifyListenersIfNecessary(); } private void handleStatusUpdated() { - mCurrentState.statusLabel = mWifiTracker.statusLabel; - mCurrentState.isDefault = mWifiTracker.isDefaultNetwork; + copyWifiStates(); notifyListenersIfNecessary(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 3a84e314c1c4..0dfcf7a0a7d0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -40,7 +40,9 @@ import android.content.Intent; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; +import android.net.NetworkRequest; import android.net.NetworkScoreManager; +import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Handler; import android.provider.Settings; @@ -51,7 +53,6 @@ import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; -import android.telephony.TelephonyCallback; import android.telephony.TelephonyDisplayInfo; import android.telephony.TelephonyManager; import android.testing.TestableLooper; @@ -115,6 +116,7 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected int mSubId; private NetworkCapabilities mNetCapabilities; + private ConnectivityManager.NetworkCallback mDefaultNetworkCallback; private ConnectivityManager.NetworkCallback mNetworkCallback; @Rule @@ -214,6 +216,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); verify(mMockCm, atLeastOnce()) .registerDefaultNetworkCallback(callbackArg.capture(), isA(Handler.class)); + mDefaultNetworkCallback = callbackArg.getValue(); + assertNotNull(mDefaultNetworkCallback); + verify(mMockCm, atLeastOnce()).registerNetworkCallback( + isA(NetworkRequest.class), callbackArg.capture(), isA(Handler.class)); mNetworkCallback = callbackArg.getValue(); assertNotNull(mNetworkCallback); } @@ -270,10 +276,19 @@ public class NetworkControllerBaseTest extends SysuiTestCase { } public void setConnectivityViaCallback( - int networkType, boolean validated, boolean isConnected){ + int networkType, boolean validated, boolean isConnected, WifiInfo wifiInfo) { + mNetCapabilities.setTransportInfo(wifiInfo); setConnectivityCommon(networkType, validated, isConnected); - mNetworkCallback.onCapabilitiesChanged( + mDefaultNetworkCallback.onCapabilitiesChanged( mock(Network.class), new NetworkCapabilities(mNetCapabilities)); + if (networkType == NetworkCapabilities.TRANSPORT_WIFI) { + if (isConnected) { + mNetworkCallback.onCapabilitiesChanged( + mock(Network.class), new NetworkCapabilities(mNetCapabilities)); + } else { + mNetworkCallback.onLost(mock(Network.class)); + } + } } private void setConnectivityCommon( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java index 988e02203843..9c9d6ea2d1ae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java @@ -32,6 +32,7 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { // These match the constants in WifiManager and need to be kept up to date. private static final int MIN_RSSI = -100; private static final int MAX_RSSI = -55; + private WifiInfo mWifiInfo = mock(WifiInfo.class); @Test public void testWifiIcon() { @@ -41,15 +42,16 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { setWifiState(true, testSsid); setWifiLevel(0); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, true, mWifiInfo); // Connected, but still not validated - does not show verifyLastWifiIcon(false, WifiIcons.WIFI_SIGNAL_STRENGTH[0][0]); for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) { setWifiLevel(testLevel); - setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true, mWifiInfo); verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]); - setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, false, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, true, mWifiInfo); // Icon does not show if not validated verifyLastWifiIcon(false, WifiIcons.WIFI_SIGNAL_STRENGTH[0][testLevel]); } @@ -69,10 +71,10 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { for (int testLevel = 0; testLevel < WifiIcons.WIFI_LEVEL_COUNT; testLevel++) { setWifiLevel(testLevel); - setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true, mWifiInfo); verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][testLevel], testSsid); - setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, false, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, true, mWifiInfo); verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[0][testLevel], testSsid); } @@ -86,7 +88,7 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { setWifiEnabled(true); setWifiState(true, testSsid); setWifiLevel(testLevel); - setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true, mWifiInfo); verifyLastQsWifiIcon(true, true, WifiIcons.QS_WIFI_SIGNAL_STRENGTH[1][testLevel], testSsid); @@ -111,14 +113,14 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { setWifiEnabled(true); setWifiState(true, testSsid); setWifiLevel(testLevel); - setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true, mWifiInfo); verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]); setupDefaultSignal(); setGsmRoaming(true); // Still be on wifi though. - setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true); - setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_CELLULAR, false, false); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true, mWifiInfo); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_CELLULAR, false, false, mWifiInfo); verifyLastMobileDataIndicators(true, DEFAULT_LEVEL, 0, true); @@ -132,10 +134,10 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { setWifiEnabled(true); setWifiState(true, testSsid); setWifiLevel(testLevel); - setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true, mWifiInfo); verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]); - setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, true, mWifiInfo); verifyLastWifiIcon(false, WifiIcons.WIFI_SIGNAL_STRENGTH[0][testLevel]); } @@ -147,11 +149,11 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { setWifiEnabled(true); setWifiState(true, testSsid); setWifiLevel(testLevel); - setConnectivityViaBroadcast(NetworkCapabilities.TRANSPORT_WIFI, true, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true, mWifiInfo); verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]); setWifiState(false, testSsid); - setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, false); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, false, false, mWifiInfo); verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK); } @@ -162,14 +164,14 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { setWifiEnabled(true); verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK); - setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_VPN, false, true); - setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_VPN, true, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_VPN, false, true, mWifiInfo); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_VPN, true, true, mWifiInfo); verifyLastWifiIcon(false, WifiIcons.WIFI_NO_NETWORK); // Mock calling setUnderlyingNetworks. setWifiState(true, testSsid); setWifiLevel(testLevel); - setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true); + setConnectivityViaCallback(NetworkCapabilities.TRANSPORT_WIFI, true, true, mWifiInfo); verifyLastWifiIcon(true, WifiIcons.WIFI_SIGNAL_STRENGTH[1][testLevel]); } @@ -209,6 +211,7 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { int rssi = (int)(MIN_RSSI + level * amountPerLevel); // Put RSSI in the middle of the range. rssi += amountPerLevel / 2; + when(mWifiInfo.getRssi()).thenReturn(rssi); Intent i = new Intent(WifiManager.RSSI_CHANGED_ACTION); i.putExtra(WifiManager.EXTRA_NEW_RSSI, rssi); mNetworkController.onReceive(mContext, i); @@ -224,10 +227,8 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { Intent i = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION); NetworkInfo networkInfo = mock(NetworkInfo.class); when(networkInfo.isConnected()).thenReturn(connected); - - WifiInfo wifiInfo = mock(WifiInfo.class); - when(wifiInfo.getSSID()).thenReturn(ssid); - when(mMockWm.getConnectionInfo()).thenReturn(wifiInfo); + when(mWifiInfo.getSSID()).thenReturn(ssid); + when(mMockWm.getConnectionInfo()).thenReturn(mWifiInfo); i.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo); mNetworkController.onReceive(mContext, i); |