summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/communal/conditions/CommunalTrustedNetworkCondition.java73
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/communal/CommunalTrustedNetworkConditionTest.java72
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;
}