Loading res/layout/wifi_dialog.xml +18 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,24 @@ android:prompt="@string/wifi_eap_method" /> </LinearLayout> <LinearLayout android:id="@+id/l_sim" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" style="@style/wifi_item" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/wifi_item_label" android:text="@string/sim_card" /> <Spinner android:id="@+id/sim" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/wifi_item_spinner" android:prompt="@string/sim_card" /> </LinearLayout> <LinearLayout android:id="@+id/l_phase2" android:layout_width="match_parent" android:layout_height="wrap_content" Loading res/values/strings.xml +11 −0 Original line number Diff line number Diff line Loading @@ -11481,6 +11481,17 @@ <!-- Message informs the user that has no SIM card in personalized Settings [CHAR LIMIT=30] --> <string name="no_sim_card">No SIM card</string> <!-- A title for a SIM card spinner UI component which users can choose a SIM card. [CHAR LIMIT=NONE] --> <string name="sim_card">SIM</string> <!-- A label when there is no SIM card to choose. [CHAR LIMIT=NONE] --> <string name="wifi_no_sim_card">No SIM</string> <!-- A label when there is no SIM card information of a Wi-Fi network. [CHAR LIMIT=NONE] --> <string name="wifi_no_related_sim_card">None</string> <!-- A label wen a user needs a SIM to connect to the Wi-Fi network. [CHAR LIMIT=NONE] --> <string name="wifi_require_sim_card_to_connect">Requires SIM to connect</string> <!-- A label wen a user needs a specific SIM to connect to the Wi-Fi network. [CHAR LIMIT=NONE] --> <string name="wifi_require_specific_sim_card_to_connect">Requires <xliff:g id="wireless_carrier" example="Verizon">%s</xliff:g> SIM to connect</string> <!-- The following strings are summaries for preferred network modes in Mobile network settings, and have a character limit of 100 --> <!-- WCDMA preferred [CHAR LIMIT=NONE] --> res/xml/wifi_network_details_fragment2.xml +5 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,11 @@ android:title="@string/wifi_advanced_ssid_title" android:selectable="false" settings:enableCopying="true"/> <Preference android:key="eap_sim_subscription" android:title="@string/sim_card" android:selectable="false" settings:enableCopying="true"/> <Preference android:key="mac_address" android:title="@string/wifi_advanced_randomized_mac_address_title" Loading src/com/android/settings/wifi/WifiConfigController.java +75 −4 Original line number Diff line number Diff line Loading @@ -37,6 +37,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; Loading Loading @@ -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; /** Loading Loading @@ -162,7 +166,8 @@ public class WifiConfigController 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; Loading Loading @@ -208,6 +213,8 @@ public class WifiConfigController implements TextWatcher, private final WifiManager mWifiManager; private final List<SubscriptionInfo> mActiveSubscriptionInfos = new ArrayList<>(); public WifiConfigController(WifiConfigUiBase parent, View view, AccessPoint accessPoint, int mode) { this (parent, view, accessPoint, mode, true /* requestFocus */); Loading Loading @@ -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)); Loading Loading @@ -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); Loading Loading @@ -1033,6 +1047,8 @@ public class WifiConfigController implements TextWatcher, } if (refreshCertificates) { loadSims(); loadCertificates( mEapCaCertSpinner, Credentials.CA_CERTIFICATE, Loading @@ -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) { Loading Loading @@ -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 { Loading Loading @@ -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) { Loading @@ -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 Loading @@ -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: Loading Loading @@ -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); } } Loading Loading @@ -1432,6 +1465,44 @@ public class WifiConfigController implements TextWatcher, return KeyStore.getInstance(); } @VisibleForTesting void loadSims() { List<SubscriptionInfo> 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, Loading src/com/android/settings/wifi/WifiConfigController2.java +75 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; /** Loading Loading @@ -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; Loading Loading @@ -204,6 +209,8 @@ public class WifiConfigController2 implements TextWatcher, private final WifiManager mWifiManager; private final List<SubscriptionInfo> mActiveSubscriptionInfos = new ArrayList<>(); public WifiConfigController2(WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry, int mode) { mConfigUi = parent; Loading Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -1015,6 +1029,8 @@ public class WifiConfigController2 implements TextWatcher, } if (refreshCertificates) { loadSims(); loadCertificates( mEapCaCertSpinner, Credentials.CA_CERTIFICATE, Loading @@ -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) { Loading Loading @@ -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 { Loading Loading @@ -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) { Loading @@ -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 Loading @@ -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: Loading Loading @@ -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); } } Loading Loading @@ -1415,6 +1447,44 @@ public class WifiConfigController2 implements TextWatcher, return KeyStore.getInstance(); } @VisibleForTesting void loadSims() { List<SubscriptionInfo> 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, Loading Loading
res/layout/wifi_dialog.xml +18 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,24 @@ android:prompt="@string/wifi_eap_method" /> </LinearLayout> <LinearLayout android:id="@+id/l_sim" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" style="@style/wifi_item" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/wifi_item_label" android:text="@string/sim_card" /> <Spinner android:id="@+id/sim" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/wifi_item_spinner" android:prompt="@string/sim_card" /> </LinearLayout> <LinearLayout android:id="@+id/l_phase2" android:layout_width="match_parent" android:layout_height="wrap_content" Loading
res/values/strings.xml +11 −0 Original line number Diff line number Diff line Loading @@ -11481,6 +11481,17 @@ <!-- Message informs the user that has no SIM card in personalized Settings [CHAR LIMIT=30] --> <string name="no_sim_card">No SIM card</string> <!-- A title for a SIM card spinner UI component which users can choose a SIM card. [CHAR LIMIT=NONE] --> <string name="sim_card">SIM</string> <!-- A label when there is no SIM card to choose. [CHAR LIMIT=NONE] --> <string name="wifi_no_sim_card">No SIM</string> <!-- A label when there is no SIM card information of a Wi-Fi network. [CHAR LIMIT=NONE] --> <string name="wifi_no_related_sim_card">None</string> <!-- A label wen a user needs a SIM to connect to the Wi-Fi network. [CHAR LIMIT=NONE] --> <string name="wifi_require_sim_card_to_connect">Requires SIM to connect</string> <!-- A label wen a user needs a specific SIM to connect to the Wi-Fi network. [CHAR LIMIT=NONE] --> <string name="wifi_require_specific_sim_card_to_connect">Requires <xliff:g id="wireless_carrier" example="Verizon">%s</xliff:g> SIM to connect</string> <!-- The following strings are summaries for preferred network modes in Mobile network settings, and have a character limit of 100 --> <!-- WCDMA preferred [CHAR LIMIT=NONE] -->
res/xml/wifi_network_details_fragment2.xml +5 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,11 @@ android:title="@string/wifi_advanced_ssid_title" android:selectable="false" settings:enableCopying="true"/> <Preference android:key="eap_sim_subscription" android:title="@string/sim_card" android:selectable="false" settings:enableCopying="true"/> <Preference android:key="mac_address" android:title="@string/wifi_advanced_randomized_mac_address_title" Loading
src/com/android/settings/wifi/WifiConfigController.java +75 −4 Original line number Diff line number Diff line Loading @@ -37,6 +37,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; Loading Loading @@ -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; /** Loading Loading @@ -162,7 +166,8 @@ public class WifiConfigController 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; Loading Loading @@ -208,6 +213,8 @@ public class WifiConfigController implements TextWatcher, private final WifiManager mWifiManager; private final List<SubscriptionInfo> mActiveSubscriptionInfos = new ArrayList<>(); public WifiConfigController(WifiConfigUiBase parent, View view, AccessPoint accessPoint, int mode) { this (parent, view, accessPoint, mode, true /* requestFocus */); Loading Loading @@ -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)); Loading Loading @@ -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); Loading Loading @@ -1033,6 +1047,8 @@ public class WifiConfigController implements TextWatcher, } if (refreshCertificates) { loadSims(); loadCertificates( mEapCaCertSpinner, Credentials.CA_CERTIFICATE, Loading @@ -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) { Loading Loading @@ -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 { Loading Loading @@ -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) { Loading @@ -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 Loading @@ -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: Loading Loading @@ -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); } } Loading Loading @@ -1432,6 +1465,44 @@ public class WifiConfigController implements TextWatcher, return KeyStore.getInstance(); } @VisibleForTesting void loadSims() { List<SubscriptionInfo> 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, Loading
src/com/android/settings/wifi/WifiConfigController2.java +75 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; /** Loading Loading @@ -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; Loading Loading @@ -204,6 +209,8 @@ public class WifiConfigController2 implements TextWatcher, private final WifiManager mWifiManager; private final List<SubscriptionInfo> mActiveSubscriptionInfos = new ArrayList<>(); public WifiConfigController2(WifiConfigUiBase2 parent, View view, WifiEntry wifiEntry, int mode) { mConfigUi = parent; Loading Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -1015,6 +1029,8 @@ public class WifiConfigController2 implements TextWatcher, } if (refreshCertificates) { loadSims(); loadCertificates( mEapCaCertSpinner, Credentials.CA_CERTIFICATE, Loading @@ -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) { Loading Loading @@ -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 { Loading Loading @@ -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) { Loading @@ -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 Loading @@ -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: Loading Loading @@ -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); } } Loading Loading @@ -1415,6 +1447,44 @@ public class WifiConfigController2 implements TextWatcher, return KeyStore.getInstance(); } @VisibleForTesting void loadSims() { List<SubscriptionInfo> 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, Loading