diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml index 45ecd610e7e..92fff9a6d94 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 WifiConfigController2(WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry, int mode) { mConfigUi = parent; @@ -690,6 +697,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); @@ -964,6 +977,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); @@ -1001,6 +1015,8 @@ public class WifiConfigController2 implements TextWatcher, } if (refreshCertificates) { + loadSims(); + loadCertificates( mEapCaCertSpinner, Credentials.CA_CERTIFICATE, @@ -1022,10 +1038,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) { @@ -1073,6 +1089,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 { @@ -1161,6 +1187,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) { @@ -1171,12 +1198,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 @@ -1198,6 +1227,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: @@ -1235,11 +1265,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); } } @@ -1402,6 +1434,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 4ab005ebb25..b8625403370 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; @@ -97,6 +104,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; @@ -132,6 +140,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"; @@ -169,6 +179,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; @@ -186,6 +197,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 @@ -335,6 +375,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); @@ -506,6 +547,8 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle refreshIpLayerInfo(); // SSID Pref refreshSsid(); + // EAP SIM subscription + refreshEapSimSubscription(); // MAC Address Pref refreshMacAddress(); } @@ -627,6 +670,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 9bd12cc03a5..49b3a3e6199 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); @@ -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); + } } 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);