[Wi-Fi] Support multi-SIM for SIM dependent EAP methods

Before this change, users are not able to choose SIM
card for SIM dependent EAP methods when a device supports
multi-SIM.

This change support to choose a SIM when adding an EAP
Wi-Fi network. And this change support to show the related
SIM information on Wi-Fi detail screen.

Bug: 142792009
Test: make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.wifi.WifiConfigControllerTest
      make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.wifi.WifiConfigController2Test
      make RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.wifi.details2.WifiDetailPreferenceController2Test
      Manually add an EAP Wi-Fi network of EAP-SIM type, observe the
      value in Wi-Fi detail screen.
Change-Id: I2910931166dc6541897663857c46abcc1b3115fa
This commit is contained in:
Arc Wang
2020-07-03 14:12:58 +08:00
parent d88cc7e01f
commit 2df3a3e7df
9 changed files with 457 additions and 9 deletions

View File

@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
import android.content.Context;
import android.content.res.Resources;
@@ -32,6 +33,9 @@ import android.net.wifi.WifiEnterpriseConfig.Phase2;
import android.net.wifi.WifiManager;
import android.os.ServiceSpecificException;
import android.security.KeyStore;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
@@ -56,6 +60,9 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowInputMethodManager;
import org.robolectric.shadows.ShadowSubscriptionManager;
import java.util.Arrays;
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowConnectivityManager.class)
@@ -71,6 +78,7 @@ public class WifiConfigController2Test {
private KeyStore mKeyStore;
private View mView;
private Spinner mHiddenSettingsSpinner;
private ShadowSubscriptionManager mShadowSubscriptionManager;
public WifiConfigController2 mController;
private static final String HEX_PSK = "01234567012345670123456701234567012345670123456701234567"
@@ -101,6 +109,7 @@ public class WifiConfigController2Test {
final Spinner ipSettingsSpinner = mView.findViewById(R.id.ip_settings);
mHiddenSettingsSpinner = mView.findViewById(R.id.hidden_settings);
ipSettingsSpinner.setSelection(DHCP);
mShadowSubscriptionManager = shadowOf(mContext.getSystemService(SubscriptionManager.class));
mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
WifiConfigUiBase2.MODE_CONNECT);
@@ -760,4 +769,41 @@ public class WifiConfigController2Test {
mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
WifiConfigUiBase2.MODE_MODIFY);
}
@Test
public void loadSims_noSim_simSpinnerDefaultNoSim() {
when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
WifiConfigUiBase2.MODE_CONNECT);
final Spinner eapMethodSpinner = mock(Spinner.class);
when(eapMethodSpinner.getSelectedItemPosition()).thenReturn(
WifiConfigController2.WIFI_EAP_METHOD_SIM);
mController.mEapMethodSpinner = eapMethodSpinner;
mController.loadSims();
final WifiConfiguration wifiConfiguration = mController.getConfig();
assertThat(wifiConfiguration.carrierId).isEqualTo(TelephonyManager.UNKNOWN_CARRIER_ID);
}
@Test
public void loadSims_oneSim_simSpinnerDefaultSubscription() {
when(mWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
final SubscriptionInfo subscriptionInfo = mock(SubscriptionInfo.class);
final int carrierId = 6;
when(subscriptionInfo.getCarrierId()).thenReturn(carrierId);
when(subscriptionInfo.getCarrierName()).thenReturn("FAKE-CARRIER");
mShadowSubscriptionManager.setActiveSubscriptionInfoList(Arrays.asList(subscriptionInfo));
mController = new TestWifiConfigController2(mConfigUiBase, mView, mWifiEntry,
WifiConfigUiBase2.MODE_CONNECT);
final Spinner eapMethodSpinner = mock(Spinner.class);
when(eapMethodSpinner.getSelectedItemPosition()).thenReturn(
WifiConfigController2.WIFI_EAP_METHOD_SIM);
mController.mEapMethodSpinner = eapMethodSpinner;
mController.loadSims();
final WifiConfiguration wifiConfiguration = mController.getConfig();
assertThat(wifiConfiguration.carrierId).isEqualTo(carrierId);
}
}

View File

@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
import android.content.Context;
import android.content.res.Resources;
@@ -32,6 +33,9 @@ import android.net.wifi.WifiEnterpriseConfig.Phase2;
import android.net.wifi.WifiManager;
import android.os.ServiceSpecificException;
import android.security.KeyStore;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
@@ -56,6 +60,9 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowInputMethodManager;
import org.robolectric.shadows.ShadowSubscriptionManager;
import java.util.Arrays;
@RunWith(RobolectricTestRunner.class)
@Config(shadows = ShadowConnectivityManager.class)
@@ -71,6 +78,7 @@ public class WifiConfigControllerTest {
private KeyStore mKeyStore;
private View mView;
private Spinner mHiddenSettingsSpinner;
private ShadowSubscriptionManager mShadowSubscriptionManager;
public WifiConfigController mController;
private static final String HEX_PSK = "01234567012345670123456701234567012345670123456701234567"
@@ -95,6 +103,7 @@ public class WifiConfigControllerTest {
final Spinner ipSettingsSpinner = mView.findViewById(R.id.ip_settings);
mHiddenSettingsSpinner = mView.findViewById(R.id.hidden_settings);
ipSettingsSpinner.setSelection(DHCP);
mShadowSubscriptionManager = shadowOf(mContext.getSystemService(SubscriptionManager.class));
mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
WifiConfigUiBase.MODE_CONNECT);
@@ -575,4 +584,41 @@ public class WifiConfigControllerTest {
assertThat(advButton.getVisibility()).isEqualTo(View.GONE);
}
@Test
public void loadSims_noSim_simSpinnerDefaultNoSim() {
when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_EAP);
mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
WifiConfigUiBase.MODE_CONNECT);
final Spinner eapMethodSpinner = mock(Spinner.class);
when(eapMethodSpinner.getSelectedItemPosition()).thenReturn(
WifiConfigController2.WIFI_EAP_METHOD_SIM);
mController.mEapMethodSpinner = eapMethodSpinner;
mController.loadSims();
final WifiConfiguration wifiConfiguration = mController.getConfig();
assertThat(wifiConfiguration.carrierId).isEqualTo(TelephonyManager.UNKNOWN_CARRIER_ID);
}
@Test
public void loadSims_oneSim_simSpinnerDefaultSubscription() {
when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_EAP);
final SubscriptionInfo subscriptionInfo = mock(SubscriptionInfo.class);
final int carrierId = 6;
when(subscriptionInfo.getCarrierId()).thenReturn(carrierId);
when(subscriptionInfo.getCarrierName()).thenReturn("FAKE-CARRIER");
mShadowSubscriptionManager.setActiveSubscriptionInfoList(Arrays.asList(subscriptionInfo));
mController = new TestWifiConfigController(mConfigUiBase, mView, mAccessPoint,
WifiConfigUiBase.MODE_CONNECT);
final Spinner eapMethodSpinner = mock(Spinner.class);
when(eapMethodSpinner.getSelectedItemPosition()).thenReturn(
WifiConfigController2.WIFI_EAP_METHOD_SIM);
mController.mEapMethodSpinner = eapMethodSpinner;
mController.loadSims();
final WifiConfiguration wifiConfiguration = mController.getConfig();
assertThat(wifiConfiguration.carrierId).isEqualTo(carrierId);
}
}

View File

@@ -53,10 +53,12 @@ import android.net.NetworkRequest;
import android.net.RouteInfo;
import android.net.Uri;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
@@ -175,6 +177,8 @@ public class WifiDetailPreferenceController2Test {
@Mock
private Preference mMockSsidPref;
@Mock
private Preference mMockEapSimSubscriptionPref;
@Mock
private Preference mMockMacAddressPref;
@Mock
private Preference mMockIpAddressPref;
@@ -374,6 +378,8 @@ public class WifiDetailPreferenceController2Test {
.thenReturn(mMockSecurityPref);
when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_SSID_PREF))
.thenReturn(mMockSsidPref);
when(mMockScreen.findPreference(WifiDetailPreferenceController2
.KEY_EAP_SIM_SUBSCRIPTION_PREF)).thenReturn(mMockEapSimSubscriptionPref);
when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_MAC_ADDRESS_PREF))
.thenReturn(mMockMacAddressPref);
when(mMockScreen.findPreference(WifiDetailPreferenceController2.KEY_IP_ADDRESS_PREF))
@@ -1582,6 +1588,82 @@ public class WifiDetailPreferenceController2Test {
verify(mMockHeaderController).setSummary(expired);
}
@Test
public void refreshEapSimSubscription_nonEapSecurity_invisibleEapSimSubscriptionPref() {
setUpForDisconnectedNetwork();
when(mMockWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_NONE);
displayAndResume();
verify(mMockEapSimSubscriptionPref, times(1)).setVisible(false);
when(mMockWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_OWE);
displayAndResume();
verify(mMockEapSimSubscriptionPref, times(2)).setVisible(false);
when(mMockWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_PSK);
displayAndResume();
verify(mMockEapSimSubscriptionPref, times(3)).setVisible(false);
when(mMockWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_SAE);
displayAndResume();
verify(mMockEapSimSubscriptionPref, times(4)).setVisible(false);
verify(mMockEapSimSubscriptionPref, never()).setVisible(true);
}
@Test
public void refreshEapSimSubscription_nonSimEapMethod_invisibleEapSimSubscriptionPref() {
setUpForDisconnectedNetwork();
when(mMockWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
final WifiConfiguration mockWifiConfiguration = mock(WifiConfiguration.class);
final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
when(mockWifiEnterpriseConfig.isAuthenticationSimBased()).thenReturn(false);
mockWifiConfiguration.enterpriseConfig = mockWifiEnterpriseConfig;
when(mMockWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfiguration);
displayAndResume();
verify(mMockEapSimSubscriptionPref, times(1)).setVisible(false);
}
@Test
public void refreshEapSimSubscription_simEapMethod_visibleEapSimSubscriptionPref() {
setUpForDisconnectedNetwork();
when(mMockWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
final WifiConfiguration mockWifiConfiguration = mock(WifiConfiguration.class);
final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
when(mockWifiEnterpriseConfig.isAuthenticationSimBased()).thenReturn(true);
mockWifiConfiguration.enterpriseConfig = mockWifiEnterpriseConfig;
when(mMockWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfiguration);
displayAndResume();
verify(mMockEapSimSubscriptionPref).setVisible(true);
}
@Test
public void refreshEapSimSubscription_unknownCarrierId_noSimEapSimSubscriptionPref() {
setUpForDisconnectedNetwork();
when(mMockWifiEntry.getSecurity()).thenReturn(WifiEntry.SECURITY_EAP);
final WifiConfiguration mockWifiConfiguration = mock(WifiConfiguration.class);
mockWifiConfiguration.carrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
final WifiEnterpriseConfig mockWifiEnterpriseConfig = mock(WifiEnterpriseConfig.class);
when(mockWifiEnterpriseConfig.isAuthenticationSimBased()).thenReturn(true);
mockWifiConfiguration.enterpriseConfig = mockWifiEnterpriseConfig;
when(mMockWifiEntry.getWifiConfiguration()).thenReturn(mockWifiConfiguration);
displayAndResume();
verify(mMockEapSimSubscriptionPref).setVisible(true);
verify(mMockEapSimSubscriptionPref).setSummary(R.string.wifi_no_related_sim_card);
}
private ActionButtonsPreference createMock() {
final ActionButtonsPreference pref = mock(ActionButtonsPreference.class);
when(pref.setButton1Text(anyInt())).thenReturn(pref);