diff options
2 files changed, 136 insertions, 9 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalTrustedNetworkCondition.java b/packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalTrustedNetworkCondition.java index c817979ee3c5..e4692dbba1ca 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalTrustedNetworkCondition.java +++ b/packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalTrustedNetworkCondition.java @@ -16,15 +16,26 @@ package com.android.systemui.communal.conditions; +import android.database.ContentObserver; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.net.wifi.WifiInfo; +import android.os.Handler; +import android.os.UserHandle; +import android.provider.Settings; +import android.text.TextUtils; import android.util.Log; import androidx.annotation.NonNull; +import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.util.settings.SecureSettings; + +import java.util.Arrays; +import java.util.HashSet; + import javax.inject.Inject; /** @@ -34,10 +45,32 @@ import javax.inject.Inject; public class CommunalTrustedNetworkCondition extends CommunalCondition { private final String mTag = getClass().getSimpleName(); private final ConnectivityManager mConnectivityManager; + private final ContentObserver mTrustedNetworksObserver; + private final SecureSettings mSecureSettings; + + // The SSID of the connected Wi-Fi network. Null if not connected to Wi-Fi. + private String mWifiSSID; + + // Set of SSIDs of trusted networks. + private final HashSet<String> mTrustedNetworks = new HashSet<>(); + + /** + * The deliminator used to separate trusted network keys saved as a string in secure settings. + */ + public static final String SETTINGS_STRING_DELIMINATOR = ",/"; @Inject - public CommunalTrustedNetworkCondition(ConnectivityManager connectivityManager) { + public CommunalTrustedNetworkCondition(@Main Handler handler, + ConnectivityManager connectivityManager, SecureSettings secureSettings) { mConnectivityManager = connectivityManager; + mSecureSettings = secureSettings; + + mTrustedNetworksObserver = new ContentObserver(handler) { + @Override + public void onChange(boolean selfChange) { + fetchTrustedNetworks(); + } + }; } /** @@ -47,9 +80,14 @@ public class CommunalTrustedNetworkCondition extends CommunalCondition { protected void start() { if (shouldLog()) Log.d(mTag, "start listening for wifi connections"); + fetchTrustedNetworks(); + final NetworkRequest wifiNetworkRequest = new NetworkRequest.Builder().addTransportType( NetworkCapabilities.TRANSPORT_WIFI).build(); mConnectivityManager.registerNetworkCallback(wifiNetworkRequest, mNetworkCallback); + mSecureSettings.registerContentObserverForUser( + Settings.Secure.COMMUNAL_MODE_TRUSTED_NETWORKS, false, mTrustedNetworksObserver, + UserHandle.USER_SYSTEM); } /** @@ -60,11 +98,40 @@ public class CommunalTrustedNetworkCondition extends CommunalCondition { if (shouldLog()) Log.d(mTag, "stop listening for wifi connections"); mConnectivityManager.unregisterNetworkCallback(mNetworkCallback); + mSecureSettings.unregisterContentObserver(mTrustedNetworksObserver); } private void updateWifiInfo(WifiInfo wifiInfo) { - // TODO(b/202778351): check whether wifi is trusted. - final boolean connectedToTrustedNetwork = wifiInfo != null; + if (wifiInfo == null) { + mWifiSSID = null; + } else { + // Remove the wrapping quotes around the SSID. + mWifiSSID = wifiInfo.getSSID().replace("\"", ""); + } + + checkIfConnectedToTrustedNetwork(); + } + + private void fetchTrustedNetworks() { + final String trustedNetworksString = mSecureSettings.getStringForUser( + Settings.Secure.COMMUNAL_MODE_TRUSTED_NETWORKS, UserHandle.USER_SYSTEM); + mTrustedNetworks.clear(); + + if (shouldLog()) Log.d(mTag, "fetched trusted networks: " + trustedNetworksString); + + if (TextUtils.isEmpty(trustedNetworksString)) { + return; + } + + mTrustedNetworks.addAll( + Arrays.asList(trustedNetworksString.split(SETTINGS_STRING_DELIMINATOR))); + + checkIfConnectedToTrustedNetwork(); + } + + private void checkIfConnectedToTrustedNetwork() { + final boolean connectedToTrustedNetwork = mWifiSSID != null && mTrustedNetworks.contains( + mWifiSSID); if (shouldLog()) { Log.d(mTag, (connectedToTrustedNetwork ? "connected to" : "disconnected from") diff --git a/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalTrustedNetworkConditionTest.java b/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalTrustedNetworkConditionTest.java index a00c12b113a1..61a5126fb139 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalTrustedNetworkConditionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/communal/CommunalTrustedNetworkConditionTest.java @@ -16,9 +16,12 @@ package com.android.systemui.communal; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -27,12 +30,18 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.net.wifi.WifiInfo; +import android.os.Handler; +import android.os.Looper; +import android.os.UserHandle; +import android.provider.Settings; import android.testing.AndroidTestingRunner; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.communal.conditions.CommunalTrustedNetworkCondition; +import com.android.systemui.util.settings.FakeSettings; +import com.android.systemui.utils.os.FakeHandler; import org.junit.Before; import org.junit.Test; @@ -49,12 +58,21 @@ public class CommunalTrustedNetworkConditionTest extends SysuiTestCase { @Captor private ArgumentCaptor<ConnectivityManager.NetworkCallback> mNetworkCallbackCaptor; + private final Handler mHandler = new FakeHandler(Looper.getMainLooper()); private CommunalTrustedNetworkCondition mCondition; + private final String mTrustedWifi1 = "wifi-1"; + private final String mTrustedWifi2 = "wifi-2"; + @Before public void setup() { MockitoAnnotations.initMocks(this); - mCondition = new CommunalTrustedNetworkCondition(mConnectivityManager); + final FakeSettings secureSettings = new FakeSettings(); + secureSettings.putStringForUser(Settings.Secure.COMMUNAL_MODE_TRUSTED_NETWORKS, + mTrustedWifi1 + CommunalTrustedNetworkCondition.SETTINGS_STRING_DELIMINATOR + + mTrustedWifi2, UserHandle.USER_SYSTEM); + mCondition = new CommunalTrustedNetworkCondition(mHandler, mConnectivityManager, + secureSettings); } @Test @@ -65,17 +83,58 @@ public class CommunalTrustedNetworkConditionTest extends SysuiTestCase { final ConnectivityManager.NetworkCallback networkCallback = captureNetworkCallback(); - // Connected to Wi-Fi. + // Connected to trusted Wi-Fi network. final Network network = mock(Network.class); networkCallback.onAvailable(network); - networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities()); + networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities(mTrustedWifi1)); // Verifies that the callback is triggered. verify(callback).onConditionChanged(mCondition, true); } @Test - public void updateCallback_disconnectedFromTrustedNetwork_reportsFalse() { + public void updateCallback_switchedToAnotherTrustedNetwork_reportsNothing() { + final CommunalTrustedNetworkCondition.Callback callback = + mock(CommunalTrustedNetworkCondition.Callback.class); + mCondition.addCallback(callback); + + final ConnectivityManager.NetworkCallback networkCallback = captureNetworkCallback(); + + // Connected to a trusted Wi-Fi network. + final Network network = mock(Network.class); + networkCallback.onAvailable(network); + networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities(mTrustedWifi1)); + clearInvocations(callback); + + // Connected to another trusted Wi-Fi network. + networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities(mTrustedWifi2)); + + // Verifies that the callback is not triggered. + verify(callback, never()).onConditionChanged(eq(mCondition), anyBoolean()); + } + + @Test + public void updateCallback_connectedToNonTrustedNetwork_reportsFalse() { + final CommunalTrustedNetworkCondition.Callback callback = + mock(CommunalTrustedNetworkCondition.Callback.class); + mCondition.addCallback(callback); + + final ConnectivityManager.NetworkCallback networkCallback = captureNetworkCallback(); + + // Connected to trusted Wi-Fi network. + final Network network = mock(Network.class); + networkCallback.onAvailable(network); + networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities(mTrustedWifi1)); + + // Connected to non-trusted Wi-Fi network. + networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities("random-wifi")); + + // Verifies that the callback is triggered. + verify(callback).onConditionChanged(mCondition, false); + } + + @Test + public void updateCallback_disconnectedFromNetwork_reportsFalse() { final CommunalTrustedNetworkCondition.Callback callback = mock(CommunalTrustedNetworkCondition.Callback.class); mCondition.addCallback(callback); @@ -85,7 +144,7 @@ public class CommunalTrustedNetworkConditionTest extends SysuiTestCase { // Connected to Wi-Fi. final Network network = mock(Network.class); networkCallback.onAvailable(network); - networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities()); + networkCallback.onCapabilitiesChanged(network, fakeNetworkCapabilities(mTrustedWifi1)); clearInvocations(callback); // Disconnected from Wi-Fi. @@ -103,9 +162,10 @@ public class CommunalTrustedNetworkConditionTest extends SysuiTestCase { return mNetworkCallbackCaptor.getValue(); } - private NetworkCapabilities fakeNetworkCapabilities() { + private NetworkCapabilities fakeNetworkCapabilities(String ssid) { final NetworkCapabilities networkCapabilities = mock(NetworkCapabilities.class); final WifiInfo wifiInfo = mock(WifiInfo.class); + when(wifiInfo.getSSID()).thenReturn(ssid); when(networkCapabilities.getTransportInfo()).thenReturn(wifiInfo); return networkCapabilities; } |