From b060c09e721281e33c25cb73d676da646c126a95 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Mon, 13 Jul 2020 19:13:37 +0800 Subject: [WifiTrackerLib] Hide Connect button if there is no active SIM of the carrier ID If users set a carrier ID for SIM dependent EAP method, when the SIM subscription of the carrier ID is not active, Connect button should be hide. Bug: 142792009 Test: atest com.android.wifitrackerlib.StandardWifiEntryTest Change-Id: Idb225a34b7bcd3a9c7d3e415fd0d8f69ba52bc8e --- .../android/wifitrackerlib/StandardWifiEntry.java | 34 ++++- .../wifitrackerlib/StandardWifiEntryTest.java | 140 +++++++++++++++++++++ 2 files changed, 172 insertions(+), 2 deletions(-) (limited to 'libs') diff --git a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java index 19c2619bc..6fef5e961 100644 --- a/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java +++ b/libs/WifiTrackerLib/src/com/android/wifitrackerlib/StandardWifiEntry.java @@ -54,6 +54,9 @@ import android.net.wifi.WifiManager; import android.net.wifi.WifiNetworkScoreCache; import android.os.Handler; import android.os.SystemClock; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import android.text.TextUtils; import androidx.annotation.GuardedBy; @@ -357,8 +360,35 @@ public class StandardWifiEntry extends WifiEntry { @Override public boolean canConnect() { - return mLevel != WIFI_LEVEL_UNREACHABLE - && getConnectedState() == CONNECTED_STATE_DISCONNECTED; + if (mLevel == WIFI_LEVEL_UNREACHABLE + || getConnectedState() != CONNECTED_STATE_DISCONNECTED) { + return false; + } + // Allow connection for EAP SIM dependent methods if the SIM of specified carrier ID is + // active in the device. + if (getSecurity() == SECURITY_EAP && mWifiConfig != null + && mWifiConfig.enterpriseConfig != null) { + if (!mWifiConfig.enterpriseConfig.isAuthenticationSimBased()) { + return true; + } + List activeSubscriptionInfos = ((SubscriptionManager) mContext + .getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)) + .getActiveSubscriptionInfoList(); + if (activeSubscriptionInfos == null || activeSubscriptionInfos.size() == 0) { + return false; + } + if (mWifiConfig.carrierId == TelephonyManager.UNKNOWN_CARRIER_ID) { + // To connect via default subscription. + return true; + } + for (SubscriptionInfo subscriptionInfo : activeSubscriptionInfos) { + if (subscriptionInfo.getCarrierId() == mWifiConfig.carrierId) { + return true; + } + } + return false; + } + return true; } @Override diff --git a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java index b9a0ca12b..ba78b3fa5 100644 --- a/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java +++ b/libs/WifiTrackerLib/tests/src/com/android/wifitrackerlib/StandardWifiEntryTest.java @@ -31,6 +31,7 @@ import static com.android.wifitrackerlib.WifiEntry.SECURITY_EAP; import static com.android.wifitrackerlib.WifiEntry.SECURITY_NONE; import static com.android.wifitrackerlib.WifiEntry.SECURITY_OWE; import static com.android.wifitrackerlib.WifiEntry.SECURITY_PSK; +import static com.android.wifitrackerlib.WifiEntry.SECURITY_SAE; import static com.android.wifitrackerlib.WifiEntry.SECURITY_WEP; import static com.android.wifitrackerlib.WifiEntry.SPEED_FAST; import static com.android.wifitrackerlib.WifiEntry.SPEED_SLOW; @@ -61,11 +62,15 @@ import android.net.ScoredNetwork; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration.NetworkSelectionStatus; +import android.net.wifi.WifiEnterpriseConfig; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WifiNetworkScoreCache; import android.os.Handler; import android.os.test.TestLooper; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import org.junit.Before; import org.junit.Test; @@ -89,6 +94,7 @@ public class StandardWifiEntryTest { @Mock private WifiEntry.ConnectCallback mMockConnectCallback; @Mock private WifiManager mMockWifiManager; @Mock private ConnectivityManager mMockConnectivityManager; + @Mock private SubscriptionManager mSubscriptionManager; @Mock private WifiInfo mMockWifiInfo; @Mock private NetworkInfo mMockNetworkInfo; @Mock private Context mMockContext; @@ -120,6 +126,9 @@ public class StandardWifiEntryTest { .thenReturn(mMockNetworkScoreManager); when(mMockScoreCache.getScoredNetwork((ScanResult) any())).thenReturn(mMockScoredNetwork); when(mMockScoreCache.getScoredNetwork((NetworkKey) any())).thenReturn(mMockScoredNetwork); + + when(mMockContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)) + .thenReturn(mSubscriptionManager); } /** @@ -833,4 +842,135 @@ public class StandardWifiEntryTest { assertThat(entry.getSpeed()).isEqualTo(SPEED_SLOW); } + + @Test + public void testCanConnect_nonEapMethod_returnTrueIfReachable() { + StandardWifiEntry spyEntry = spy(new StandardWifiEntry(mMockContext, mTestHandler, + ssidAndSecurityToStandardWifiEntryKey("ssid", SECURITY_NONE), + Arrays.asList(buildScanResult("ssid", "bssid0", 0, GOOD_RSSI)), + mMockWifiManager, mMockScoreCache, false /* forSavedNetworksPage */)); + when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED); + + assertThat(spyEntry.canConnect()).isEqualTo(true); + + spyEntry = spy(new StandardWifiEntry(mMockContext, mTestHandler, + ssidAndSecurityToStandardWifiEntryKey("ssid", SECURITY_OWE), + Arrays.asList(buildScanResult("ssid", "bssid0", 0, GOOD_RSSI)), + mMockWifiManager, mMockScoreCache, false /* forSavedNetworksPage */)); + when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED); + + assertThat(spyEntry.canConnect()).isEqualTo(true); + + spyEntry = spy(new StandardWifiEntry(mMockContext, mTestHandler, + ssidAndSecurityToStandardWifiEntryKey("ssid", SECURITY_WEP), + Arrays.asList(buildScanResult("ssid", "bssid0", 0, GOOD_RSSI)), + mMockWifiManager, mMockScoreCache, false /* forSavedNetworksPage */)); + when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED); + + assertThat(spyEntry.canConnect()).isEqualTo(true); + + spyEntry = spy(new StandardWifiEntry(mMockContext, mTestHandler, + ssidAndSecurityToStandardWifiEntryKey("ssid", SECURITY_PSK), + Arrays.asList(buildScanResult("ssid", "bssid0", 0, GOOD_RSSI)), + mMockWifiManager, mMockScoreCache, false /* forSavedNetworksPage */)); + when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED); + + assertThat(spyEntry.canConnect()).isEqualTo(true); + + spyEntry = spy(new StandardWifiEntry(mMockContext, mTestHandler, + ssidAndSecurityToStandardWifiEntryKey("ssid", SECURITY_SAE), + Arrays.asList(buildScanResult("ssid", "bssid0", 0, GOOD_RSSI)), + mMockWifiManager, mMockScoreCache, false /* forSavedNetworksPage */)); + when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED); + + assertThat(spyEntry.canConnect()).isEqualTo(true); + } + + @Test + public void testCanConnect_nonSimMethod_returnTrueIfReachable() { + WifiConfiguration mockWifiConfiguration = mock(WifiConfiguration.class); + mockWifiConfiguration.SSID = "\"ssid\""; + WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class); + when(mockWifiEnterpriseConfig.isAuthenticationSimBased()).thenReturn(false); + mockWifiConfiguration.enterpriseConfig = mockWifiEnterpriseConfig; + StandardWifiEntry spyEntry = spy(new StandardWifiEntry(mMockContext, mTestHandler, + ssidAndSecurityToStandardWifiEntryKey("ssid", SECURITY_EAP), + mockWifiConfiguration, + mMockWifiManager, mMockScoreCache, false /* forSavedNetworksPage */)); + spyEntry.updateScanResultInfo(Arrays.asList( + buildScanResult("ssid", "bssid0", 0, GOOD_RSSI))); + when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED); + + assertThat(spyEntry.canConnect()).isEqualTo(true); + } + + @Test + public void testCanConnect_unknownCarrierId_returnTrueIfActiveSubscriptionAvailable() { + WifiConfiguration mockWifiConfiguration = mock(WifiConfiguration.class); + mockWifiConfiguration.SSID = "\"ssid\""; + mockWifiConfiguration.carrierId = TelephonyManager.UNKNOWN_CARRIER_ID; + WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class); + when(mockWifiEnterpriseConfig.isAuthenticationSimBased()).thenReturn(true); + mockWifiConfiguration.enterpriseConfig = mockWifiEnterpriseConfig; + StandardWifiEntry spyEntry = spy(new StandardWifiEntry(mMockContext, mTestHandler, + ssidAndSecurityToStandardWifiEntryKey("ssid", SECURITY_EAP), + mockWifiConfiguration, + mMockWifiManager, mMockScoreCache, false /* forSavedNetworksPage */)); + spyEntry.updateScanResultInfo(Arrays.asList( + buildScanResult("ssid", "bssid0", 0, GOOD_RSSI))); + when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED); + when(mSubscriptionManager.getActiveSubscriptionInfoList()) + .thenReturn(Arrays.asList(mock(SubscriptionInfo.class))); + + assertThat(spyEntry.canConnect()).isEqualTo(true); + } + + @Test + public void testCanConnect_specifiedCarrierIdMatched_returnTrue() { + WifiConfiguration mockWifiConfiguration = mock(WifiConfiguration.class); + mockWifiConfiguration.SSID = "\"ssid\""; + int carrierId = 6; + mockWifiConfiguration.carrierId = carrierId; + WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class); + when(mockWifiEnterpriseConfig.isAuthenticationSimBased()).thenReturn(true); + mockWifiConfiguration.enterpriseConfig = mockWifiEnterpriseConfig; + StandardWifiEntry spyEntry = spy(new StandardWifiEntry(mMockContext, mTestHandler, + ssidAndSecurityToStandardWifiEntryKey("ssid", SECURITY_EAP), + mockWifiConfiguration, + mMockWifiManager, mMockScoreCache, false /* forSavedNetworksPage */)); + spyEntry.updateScanResultInfo(Arrays.asList( + buildScanResult("ssid", "bssid0", 0, GOOD_RSSI))); + when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED); + SubscriptionInfo mockSubscriptionInfo = mock(SubscriptionInfo.class); + when(mockSubscriptionInfo.getCarrierId()).thenReturn(carrierId); + when(mSubscriptionManager.getActiveSubscriptionInfoList()) + .thenReturn(Arrays.asList(mockSubscriptionInfo)); + + assertThat(spyEntry.canConnect()).isEqualTo(true); + } + + @Test + public void testCanConnect_specifiedCarrierIdNotMatched_returnFalse() { + WifiConfiguration mockWifiConfiguration = mock(WifiConfiguration.class); + mockWifiConfiguration.SSID = "\"ssid\""; + int specifiedCarrierId = 6; + int simCarrierId = 7; + mockWifiConfiguration.carrierId = specifiedCarrierId; + WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class); + when(mockWifiEnterpriseConfig.isAuthenticationSimBased()).thenReturn(true); + mockWifiConfiguration.enterpriseConfig = mockWifiEnterpriseConfig; + StandardWifiEntry spyEntry = spy(new StandardWifiEntry(mMockContext, mTestHandler, + ssidAndSecurityToStandardWifiEntryKey("ssid", SECURITY_EAP), + mockWifiConfiguration, + mMockWifiManager, mMockScoreCache, false /* forSavedNetworksPage */)); + spyEntry.updateScanResultInfo(Arrays.asList( + buildScanResult("ssid", "bssid0", 0, GOOD_RSSI))); + when(spyEntry.getConnectedState()).thenReturn(CONNECTED_STATE_DISCONNECTED); + SubscriptionInfo mockSubscriptionInfo = mock(SubscriptionInfo.class); + when(mockSubscriptionInfo.getCarrierId()).thenReturn(simCarrierId); + when(mSubscriptionManager.getActiveSubscriptionInfoList()) + .thenReturn(Arrays.asList(mockSubscriptionInfo)); + + assertThat(spyEntry.canConnect()).isEqualTo(false); + } } -- cgit v1.2.3