diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml
index a0f49e4b35a..1914462bc2e 100644
--- a/res/layout/wifi_dialog.xml
+++ b/res/layout/wifi_dialog.xml
@@ -141,6 +141,24 @@
android:prompt="@string/wifi_eap_method" />
+
+
+
+
+
+
No SIM card
+
+ SIM
+
+ No SIM
+
+ None
+
+ Requires SIM to connect
+
+ Requires %s SIM to connect
+
diff --git a/res/xml/wifi_network_details_fragment2.xml b/res/xml/wifi_network_details_fragment2.xml
index 92f68cc4665..181b79909ca 100644
--- a/res/xml/wifi_network_details_fragment2.xml
+++ b/res/xml/wifi_network_details_fragment2.xml
@@ -105,6 +105,11 @@
android:title="@string/wifi_advanced_ssid_title"
android:selectable="false"
settings:enableCopying="true"/>
+
mActiveSubscriptionInfos = new ArrayList<>();
+
public WifiConfigController(WifiConfigUiBase parent, View view, AccessPoint accessPoint,
int mode) {
this (parent, view, accessPoint, mode, true /* requestFocus */);
@@ -809,6 +816,12 @@ public class WifiConfigController implements TextWatcher,
return null;
}
+ if (config.enterpriseConfig.isAuthenticationSimBased()
+ && mActiveSubscriptionInfos.size() > 0) {
+ config.carrierId = mActiveSubscriptionInfos
+ .get(mEapSimSpinner.getSelectedItemPosition()).getCarrierId();
+ }
+
config.setIpConfiguration(
new IpConfiguration(mIpAssignment, mProxySettings,
mStaticIpConfiguration, mHttpProxy));
@@ -997,6 +1010,7 @@ public class WifiConfigController implements TextWatcher,
initiateEnterpriseNetworkUi = true;
mEapMethodSpinner = (Spinner) mView.findViewById(R.id.method);
mEapMethodSpinner.setOnItemSelectedListener(this);
+ mEapSimSpinner = (Spinner) mView.findViewById(R.id.sim);
mPhase2Spinner = (Spinner) mView.findViewById(R.id.phase2);
mPhase2Spinner.setOnItemSelectedListener(this);
mEapCaCertSpinner = (Spinner) mView.findViewById(R.id.ca_cert);
@@ -1033,6 +1047,8 @@ public class WifiConfigController implements TextWatcher,
}
if (refreshCertificates) {
+ loadSims();
+
loadCertificates(
mEapCaCertSpinner,
Credentials.CA_CERTIFICATE,
@@ -1054,9 +1070,10 @@ public class WifiConfigController implements TextWatcher,
// Modifying an existing network
if (initiateEnterpriseNetworkUi && mAccessPoint != null && mAccessPoint.isSaved()) {
- WifiEnterpriseConfig enterpriseConfig = mAccessPoint.getConfig().enterpriseConfig;
- int eapMethod = enterpriseConfig.getEapMethod();
- int phase2Method = enterpriseConfig.getPhase2Method();
+ final WifiConfiguration wifiConfig = mAccessPoint.getConfig();
+ final WifiEnterpriseConfig enterpriseConfig = wifiConfig.enterpriseConfig;
+ final int eapMethod = enterpriseConfig.getEapMethod();
+ final int phase2Method = enterpriseConfig.getPhase2Method();
mEapMethodSpinner.setSelection(eapMethod);
showEapFieldsByMethod(eapMethod);
switch (eapMethod) {
@@ -1104,6 +1121,16 @@ public class WifiConfigController implements TextWatcher,
default:
break;
}
+
+ if (enterpriseConfig.isAuthenticationSimBased()) {
+ for (int i = 0; i < mActiveSubscriptionInfos.size(); i++) {
+ if (wifiConfig.carrierId == mActiveSubscriptionInfos.get(i).getCarrierId()) {
+ mEapSimSpinner.setSelection(i);
+ break;
+ }
+ }
+ }
+
if (!TextUtils.isEmpty(enterpriseConfig.getCaPath())) {
setSelection(mEapCaCertSpinner, mUseSystemCertsString);
} else {
@@ -1192,6 +1219,7 @@ public class WifiConfigController implements TextWatcher,
mView.findViewById(R.id.l_ocsp).setVisibility(View.VISIBLE);
mView.findViewById(R.id.password_layout).setVisibility(View.VISIBLE);
mView.findViewById(R.id.show_password_layout).setVisibility(View.VISIBLE);
+ mView.findViewById(R.id.l_sim).setVisibility(View.VISIBLE);
Context context = mConfigUi.getContext();
switch (eapMethod) {
@@ -1202,12 +1230,14 @@ public class WifiConfigController implements TextWatcher,
setDomainInvisible();
setAnonymousIdentInvisible();
setUserCertInvisible();
+ mView.findViewById(R.id.l_sim).setVisibility(View.GONE);
break;
case WIFI_EAP_METHOD_TLS:
mView.findViewById(R.id.l_user_cert).setVisibility(View.VISIBLE);
setPhase2Invisible();
setAnonymousIdentInvisible();
setPasswordInvisible();
+ mView.findViewById(R.id.l_sim).setVisibility(View.GONE);
break;
case WIFI_EAP_METHOD_PEAP:
// Reset adapter if needed
@@ -1229,6 +1259,7 @@ public class WifiConfigController implements TextWatcher,
mView.findViewById(R.id.l_phase2).setVisibility(View.VISIBLE);
mView.findViewById(R.id.l_anonymous).setVisibility(View.VISIBLE);
setUserCertInvisible();
+ mView.findViewById(R.id.l_sim).setVisibility(View.GONE);
break;
case WIFI_EAP_METHOD_SIM:
case WIFI_EAP_METHOD_AKA:
@@ -1265,11 +1296,13 @@ public class WifiConfigController implements TextWatcher,
mEapIdentityView.setText("");
mView.findViewById(R.id.l_identity).setVisibility(View.GONE);
setPasswordInvisible();
+ mView.findViewById(R.id.l_sim).setVisibility(View.VISIBLE);
} else {
mView.findViewById(R.id.l_identity).setVisibility(View.VISIBLE);
mView.findViewById(R.id.l_anonymous).setVisibility(View.VISIBLE);
mView.findViewById(R.id.password_layout).setVisibility(View.VISIBLE);
mView.findViewById(R.id.show_password_layout).setVisibility(View.VISIBLE);
+ mView.findViewById(R.id.l_sim).setVisibility(View.GONE);
}
}
@@ -1432,6 +1465,44 @@ public class WifiConfigController implements TextWatcher,
return KeyStore.getInstance();
}
+ @VisibleForTesting
+ void loadSims() {
+ List activeSubscriptionInfos = mContext
+ .getSystemService(SubscriptionManager.class).getActiveSubscriptionInfoList();
+ if (activeSubscriptionInfos == null) {
+ activeSubscriptionInfos = Collections.EMPTY_LIST;
+ }
+ mActiveSubscriptionInfos.clear();
+
+ // De-duplicates active subscriptions and caches in mActiveSubscriptionInfos.
+ for (SubscriptionInfo newInfo : activeSubscriptionInfos) {
+ for (SubscriptionInfo cachedInfo : mActiveSubscriptionInfos) {
+ if (newInfo.getCarrierId() == cachedInfo.getCarrierId()) {
+ continue;
+ }
+ }
+ mActiveSubscriptionInfos.add(newInfo);
+ }
+
+ // Shows disabled 'No SIM' when there is no active subscription.
+ if (mActiveSubscriptionInfos.size() == 0) {
+ final String[] noSim = new String[]{mContext.getString(R.string.wifi_no_sim_card)};
+ mEapSimSpinner.setAdapter(getSpinnerAdapter(noSim));
+ mEapSimSpinner.setSelection(0 /* position */);
+ mEapSimSpinner.setEnabled(false);
+ return;
+ }
+
+ // Shows display name of each active subscription.
+ final String[] displayNames = mActiveSubscriptionInfos.stream().map(
+ SubscriptionInfo::getDisplayName).toArray(String[]::new);
+ mEapSimSpinner.setAdapter(getSpinnerAdapter(displayNames));
+ mEapSimSpinner.setSelection(0 /* position */);
+ if (displayNames.length == 1) {
+ mEapSimSpinner.setEnabled(false);
+ }
+ }
+
@VisibleForTesting
void loadCertificates(
Spinner spinner,
diff --git a/src/com/android/settings/wifi/WifiConfigController2.java b/src/com/android/settings/wifi/WifiConfigController2.java
index 576ffa2f3d2..7ae6061c4df 100644
--- a/src/com/android/settings/wifi/WifiConfigController2.java
+++ b/src/com/android/settings/wifi/WifiConfigController2.java
@@ -35,6 +35,8 @@ import android.os.IBinder;
import android.os.UserManager;
import android.security.Credentials;
import android.security.KeyStore;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
import android.text.Editable;
import android.text.InputType;
import android.text.SpannableString;
@@ -80,7 +82,9 @@ import java.net.Inet4Address;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.Iterator;
+import java.util.List;
import java.util.stream.Collectors;
/**
@@ -159,7 +163,8 @@ public class WifiConfigController2 implements TextWatcher,
private ScrollView mDialogContainer;
private Spinner mSecuritySpinner;
- private Spinner mEapMethodSpinner;
+ @VisibleForTesting Spinner mEapMethodSpinner;
+ @VisibleForTesting Spinner mEapSimSpinner; // For EAP-SIM, EAP-AKA and EAP-AKA-PRIME.
private Spinner mEapCaCertSpinner;
private Spinner mEapOcspSpinner;
private TextView mEapDomainView;
@@ -204,6 +209,8 @@ public class WifiConfigController2 implements TextWatcher,
private final WifiManager mWifiManager;
+ private final List mActiveSubscriptionInfos = new ArrayList<>();
+
public WifiConfigController2(WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry,
int mode) {
mConfigUi = parent;
@@ -700,6 +707,12 @@ public class WifiConfigController2 implements TextWatcher,
break;
}
+ if (config.enterpriseConfig.isAuthenticationSimBased()
+ && mActiveSubscriptionInfos.size() > 0) {
+ config.carrierId = mActiveSubscriptionInfos
+ .get(mEapSimSpinner.getSelectedItemPosition()).getCarrierId();
+ }
+
String caCert = (String) mEapCaCertSpinner.getSelectedItem();
config.enterpriseConfig.setCaCertificateAliases(null);
config.enterpriseConfig.setCaPath(null);
@@ -978,6 +991,7 @@ public class WifiConfigController2 implements TextWatcher,
initiateEnterpriseNetworkUi = true;
mEapMethodSpinner = (Spinner) mView.findViewById(R.id.method);
mEapMethodSpinner.setOnItemSelectedListener(this);
+ mEapSimSpinner = (Spinner) mView.findViewById(R.id.sim);
mPhase2Spinner = (Spinner) mView.findViewById(R.id.phase2);
mPhase2Spinner.setOnItemSelectedListener(this);
mEapCaCertSpinner = (Spinner) mView.findViewById(R.id.ca_cert);
@@ -1015,6 +1029,8 @@ public class WifiConfigController2 implements TextWatcher,
}
if (refreshCertificates) {
+ loadSims();
+
loadCertificates(
mEapCaCertSpinner,
Credentials.CA_CERTIFICATE,
@@ -1036,10 +1052,10 @@ public class WifiConfigController2 implements TextWatcher,
// Modifying an existing network
if (initiateEnterpriseNetworkUi && mWifiEntry != null && mWifiEntry.isSaved()) {
- WifiEnterpriseConfig enterpriseConfig = mWifiEntry.getWifiConfiguration()
- .enterpriseConfig;
- int eapMethod = enterpriseConfig.getEapMethod();
- int phase2Method = enterpriseConfig.getPhase2Method();
+ final WifiConfiguration wifiConfig = mWifiEntry.getWifiConfiguration();
+ final WifiEnterpriseConfig enterpriseConfig = wifiConfig.enterpriseConfig;
+ final int eapMethod = enterpriseConfig.getEapMethod();
+ final int phase2Method = enterpriseConfig.getPhase2Method();
mEapMethodSpinner.setSelection(eapMethod);
showEapFieldsByMethod(eapMethod);
switch (eapMethod) {
@@ -1087,6 +1103,16 @@ public class WifiConfigController2 implements TextWatcher,
default:
break;
}
+
+ if (enterpriseConfig.isAuthenticationSimBased()) {
+ for (int i = 0; i < mActiveSubscriptionInfos.size(); i++) {
+ if (wifiConfig.carrierId == mActiveSubscriptionInfos.get(i).getCarrierId()) {
+ mEapSimSpinner.setSelection(i);
+ break;
+ }
+ }
+ }
+
if (!TextUtils.isEmpty(enterpriseConfig.getCaPath())) {
setSelection(mEapCaCertSpinner, mUseSystemCertsString);
} else {
@@ -1175,6 +1201,7 @@ public class WifiConfigController2 implements TextWatcher,
mView.findViewById(R.id.l_ocsp).setVisibility(View.VISIBLE);
mView.findViewById(R.id.password_layout).setVisibility(View.VISIBLE);
mView.findViewById(R.id.show_password_layout).setVisibility(View.VISIBLE);
+ mView.findViewById(R.id.l_sim).setVisibility(View.VISIBLE);
Context context = mConfigUi.getContext();
switch (eapMethod) {
@@ -1185,12 +1212,14 @@ public class WifiConfigController2 implements TextWatcher,
setDomainInvisible();
setAnonymousIdentInvisible();
setUserCertInvisible();
+ mView.findViewById(R.id.l_sim).setVisibility(View.GONE);
break;
case WIFI_EAP_METHOD_TLS:
mView.findViewById(R.id.l_user_cert).setVisibility(View.VISIBLE);
setPhase2Invisible();
setAnonymousIdentInvisible();
setPasswordInvisible();
+ mView.findViewById(R.id.l_sim).setVisibility(View.GONE);
break;
case WIFI_EAP_METHOD_PEAP:
// Reset adapter if needed
@@ -1212,6 +1241,7 @@ public class WifiConfigController2 implements TextWatcher,
mView.findViewById(R.id.l_phase2).setVisibility(View.VISIBLE);
mView.findViewById(R.id.l_anonymous).setVisibility(View.VISIBLE);
setUserCertInvisible();
+ mView.findViewById(R.id.l_sim).setVisibility(View.GONE);
break;
case WIFI_EAP_METHOD_SIM:
case WIFI_EAP_METHOD_AKA:
@@ -1248,11 +1278,13 @@ public class WifiConfigController2 implements TextWatcher,
mEapIdentityView.setText("");
mView.findViewById(R.id.l_identity).setVisibility(View.GONE);
setPasswordInvisible();
+ mView.findViewById(R.id.l_sim).setVisibility(View.VISIBLE);
} else {
mView.findViewById(R.id.l_identity).setVisibility(View.VISIBLE);
mView.findViewById(R.id.l_anonymous).setVisibility(View.VISIBLE);
mView.findViewById(R.id.password_layout).setVisibility(View.VISIBLE);
mView.findViewById(R.id.show_password_layout).setVisibility(View.VISIBLE);
+ mView.findViewById(R.id.l_sim).setVisibility(View.GONE);
}
}
@@ -1415,6 +1447,44 @@ public class WifiConfigController2 implements TextWatcher,
return KeyStore.getInstance();
}
+ @VisibleForTesting
+ void loadSims() {
+ List activeSubscriptionInfos = mContext
+ .getSystemService(SubscriptionManager.class).getActiveSubscriptionInfoList();
+ if (activeSubscriptionInfos == null) {
+ activeSubscriptionInfos = Collections.EMPTY_LIST;
+ }
+ mActiveSubscriptionInfos.clear();
+
+ // De-duplicates active subscriptions and caches in mActiveSubscriptionInfos.
+ for (SubscriptionInfo newInfo : activeSubscriptionInfos) {
+ for (SubscriptionInfo cachedInfo : mActiveSubscriptionInfos) {
+ if (newInfo.getCarrierId() == cachedInfo.getCarrierId()) {
+ continue;
+ }
+ }
+ mActiveSubscriptionInfos.add(newInfo);
+ }
+
+ // Shows disabled 'No SIM' when there is no active subscription.
+ if (mActiveSubscriptionInfos.size() == 0) {
+ final String[] noSim = new String[]{mContext.getString(R.string.wifi_no_sim_card)};
+ mEapSimSpinner.setAdapter(getSpinnerAdapter(noSim));
+ mEapSimSpinner.setSelection(0 /* position */);
+ mEapSimSpinner.setEnabled(false);
+ return;
+ }
+
+ // Shows display name of each active subscription.
+ final String[] displayNames = mActiveSubscriptionInfos.stream().map(
+ SubscriptionInfo::getDisplayName).toArray(String[]::new);
+ mEapSimSpinner.setAdapter(getSpinnerAdapter(displayNames));
+ mEapSimSpinner.setSelection(0 /* position */);
+ if (displayNames.length == 1) {
+ mEapSimSpinner.setEnabled(false);
+ }
+ }
+
@VisibleForTesting
void loadCertificates(
Spinner spinner,
diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
index 5c48dfd4934..ef57e541423 100644
--- a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
+++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
@@ -23,8 +23,10 @@ import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.settings.SettingsEnums;
+import android.content.AsyncQueryHandler;
import android.content.Context;
import android.content.Intent;
+import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
@@ -41,9 +43,14 @@ import android.net.NetworkRequest;
import android.net.NetworkUtils;
import android.net.RouteInfo;
import android.net.Uri;
+import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
+import android.provider.Telephony.CarrierId;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import android.util.Log;
@@ -98,6 +105,7 @@ import java.time.Instant;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
+import java.util.List;
import java.util.StringJoiner;
import java.util.stream.Collectors;
@@ -133,6 +141,8 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
@VisibleForTesting
static final String KEY_SSID_PREF = "ssid";
@VisibleForTesting
+ static final String KEY_EAP_SIM_SUBSCRIPTION_PREF = "eap_sim_subscription";
+ @VisibleForTesting
static final String KEY_MAC_ADDRESS_PREF = "mac_address";
@VisibleForTesting
static final String KEY_IP_ADDRESS_PREF = "ip_address";
@@ -170,6 +180,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
private Preference mFrequencyPref;
private Preference mSecurityPref;
private Preference mSsidPref;
+ private Preference mEapSimSubscriptionPref;
private Preference mMacAddressPref;
private Preference mIpAddressPref;
private Preference mGatewayPref;
@@ -187,6 +198,35 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
private final NetworkRequest mNetworkRequest = new NetworkRequest.Builder()
.clearCapabilities().addTransportType(TRANSPORT_WIFI).build();
+ private CarrierIdAsyncQueryHandler mCarrierIdAsyncQueryHandler;
+ private static final int TOKEN_QUERY_CARRIER_ID_AND_UPDATE_SIM_SUMMARY = 1;
+ private static final int COLUMN_CARRIER_NAME = 0;
+
+ private class CarrierIdAsyncQueryHandler extends AsyncQueryHandler {
+
+ private CarrierIdAsyncQueryHandler(Context context) {
+ super(context.getContentResolver());
+ }
+
+ @Override
+ protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
+ if (token == TOKEN_QUERY_CARRIER_ID_AND_UPDATE_SIM_SUMMARY) {
+ if (mContext == null || cursor == null || !cursor.moveToFirst()) {
+ if (cursor != null) {
+ cursor.close();
+ }
+ mEapSimSubscriptionPref.setSummary(R.string.wifi_require_sim_card_to_connect);
+ return;
+ }
+ mEapSimSubscriptionPref.setSummary(mContext.getString(
+ R.string.wifi_require_specific_sim_card_to_connect,
+ cursor.getString(COLUMN_CARRIER_NAME)));
+ cursor.close();
+ return;
+ }
+ }
+ }
+
// Must be run on the UI thread since it directly manipulates UI state.
private final NetworkCallback mNetworkCallback = new NetworkCallback() {
@Override
@@ -336,6 +376,7 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
mSecurityPref = screen.findPreference(KEY_SECURITY_PREF);
mSsidPref = screen.findPreference(KEY_SSID_PREF);
+ mEapSimSubscriptionPref = screen.findPreference(KEY_EAP_SIM_SUBSCRIPTION_PREF);
mMacAddressPref = screen.findPreference(KEY_MAC_ADDRESS_PREF);
mIpAddressPref = screen.findPreference(KEY_IP_ADDRESS_PREF);
mGatewayPref = screen.findPreference(KEY_GATEWAY_PREF);
@@ -507,6 +548,8 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
refreshIpLayerInfo();
// SSID Pref
refreshSsid();
+ // EAP SIM subscription
+ refreshEapSimSubscription();
// MAC Address Pref
refreshMacAddress();
}
@@ -630,6 +673,62 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
}
}
+ private void refreshEapSimSubscription() {
+ mEapSimSubscriptionPref.setVisible(false);
+
+ if (mWifiEntry.getSecurity() != WifiEntry.SECURITY_EAP) {
+ return;
+ }
+ final WifiConfiguration config = mWifiEntry.getWifiConfiguration();
+ if (config == null || config.enterpriseConfig == null) {
+ return;
+ }
+ if (!config.enterpriseConfig.isAuthenticationSimBased()) {
+ return;
+ }
+
+ mEapSimSubscriptionPref.setVisible(true);
+
+ // Checks if the SIM subscription is active.
+ final List activeSubscriptionInfos = mContext
+ .getSystemService(SubscriptionManager.class).getActiveSubscriptionInfoList();
+ final int defaultDataSubscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
+ if (activeSubscriptionInfos != null) {
+ for (SubscriptionInfo subscriptionInfo : activeSubscriptionInfos) {
+ if (config.carrierId == subscriptionInfo.getCarrierId()) {
+ mEapSimSubscriptionPref.setSummary(subscriptionInfo.getDisplayName());
+ return;
+ }
+
+ // When it's UNKNOWN_CARRIER_ID, devices connects it with the SIM subscription of
+ // defaultDataSubscriptionId.
+ if (config.carrierId == TelephonyManager.UNKNOWN_CARRIER_ID
+ && defaultDataSubscriptionId == subscriptionInfo.getSubscriptionId()) {
+ mEapSimSubscriptionPref.setSummary(subscriptionInfo.getDisplayName());
+ return;
+ }
+ }
+ }
+
+ if (config.carrierId == TelephonyManager.UNKNOWN_CARRIER_ID) {
+ mEapSimSubscriptionPref.setSummary(R.string.wifi_no_related_sim_card);
+ return;
+ }
+
+ // The Wi-Fi network has specified carrier id, query carrier name from CarrierIdProvider.
+ if (mCarrierIdAsyncQueryHandler == null) {
+ mCarrierIdAsyncQueryHandler = new CarrierIdAsyncQueryHandler(mContext);
+ }
+ mCarrierIdAsyncQueryHandler.cancelOperation(TOKEN_QUERY_CARRIER_ID_AND_UPDATE_SIM_SUMMARY);
+ mCarrierIdAsyncQueryHandler.startQuery(TOKEN_QUERY_CARRIER_ID_AND_UPDATE_SIM_SUMMARY,
+ null /* cookie */,
+ CarrierId.All.CONTENT_URI,
+ new String[]{CarrierId.CARRIER_NAME},
+ CarrierId.CARRIER_ID + "=?",
+ new String[] {Integer.toString(config.carrierId)},
+ null /* orderBy */);
+ }
+
private void refreshMacAddress() {
final String macAddress = mWifiEntry.getMacAddress();
if (TextUtils.isEmpty(macAddress)) {
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
index 06697fb5d74..779044c77f5 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigController2Test.java
@@ -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);
@@ -789,4 +798,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);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
index 39f9cda33dc..9e62b251850 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java
@@ -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);
@@ -604,4 +613,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);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
index 8d3405c6c75..9aaaa43cd72 100644
--- a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
@@ -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);