174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu/* 274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * Copyright (C) 2017 The Android Open Source Project 374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * 474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * Licensed under the Apache License, Version 2.0 (the "License"); 574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * you may not use this file except in compliance with the License. 674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * You may obtain a copy of the License at 774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * 874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * http://www.apache.org/licenses/LICENSE-2.0 974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * 1074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * Unless required by applicable law or agreed to in writing, software 1174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * distributed under the License is distributed on an "AS IS" BASIS, 1274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * See the License for the specific language governing permissions and 1474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * limitations under the License. 1574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu */ 1674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 1774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiupackage com.android.server.wifi; 1874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 190ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwarimport android.annotation.NonNull; 2074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.content.BroadcastReceiver; 2174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.content.Context; 2274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.content.Intent; 2374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.content.IntentFilter; 240ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwarimport android.database.ContentObserver; 250ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwarimport android.net.Uri; 2674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.net.wifi.EAPConstants; 2774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.net.wifi.WifiEnterpriseConfig; 280ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwarimport android.os.Handler; 290ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwarimport android.os.Looper; 3074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.os.PersistableBundle; 3174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.telephony.CarrierConfigManager; 3200162a310f759e17356db0b785e226383b7c6e62Mehdi Alizadehimport android.telephony.ImsiEncryptionInfo; 3374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.telephony.SubscriptionInfo; 3474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.telephony.SubscriptionManager; 3500162a310f759e17356db0b785e226383b7c6e62Mehdi Alizadehimport android.telephony.TelephonyManager; 3674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.util.Base64; 3774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport android.util.Log; 3874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 3974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport java.util.HashMap; 4074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport java.util.List; 4174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiuimport java.util.Map; 4274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 4374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu/** 4474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * Class for maintaining/caching carrier Wi-Fi network configurations. 4574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu */ 4674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiupublic class CarrierNetworkConfig { 4774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu private static final String TAG = "CarrierNetworkConfig"; 4874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 4974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu private static final String NETWORK_CONFIG_SEPARATOR = ","; 5074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu private static final int ENCODED_SSID_INDEX = 0; 5174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu private static final int EAP_TYPE_INDEX = 1; 5274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu private static final int CONFIG_ELEMENT_SIZE = 2; 530ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar private static final Uri CONTENT_URI = Uri.parse("content://carrier_information/carrier"); 5474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 5574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu private final Map<String, NetworkInfo> mCarrierNetworkMap; 5684f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh private boolean mIsCarrierImsiEncryptionInfoAvailable = false; 5774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 580ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar public CarrierNetworkConfig(@NonNull Context context, @NonNull Looper looper, 590ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar @NonNull FrameworkFacade framework) { 6074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu mCarrierNetworkMap = new HashMap<>(); 6174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu updateNetworkConfig(context); 6274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 6374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu // Monitor for carrier config changes. 6474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu IntentFilter filter = new IntentFilter(); 6574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); 6674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu context.registerReceiver(new BroadcastReceiver() { 6774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu @Override 6874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu public void onReceive(Context context, Intent intent) { 6974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu updateNetworkConfig(context); 7074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 7174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu }, filter); 720ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar 730ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar framework.registerContentObserver(context, CONTENT_URI, false, 740ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar new ContentObserver(new Handler(looper)) { 750ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar @Override 760ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar public void onChange(boolean selfChange) { 770ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar updateNetworkConfig(context); 780ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar } 790ae2f996c3c6550226a476caf2e1d5c0f110c1ebpkanwar }); 8074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 8174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 8274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu /** 8374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * @return true if the given SSID is associated with a carrier network 8474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu */ 8574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu public boolean isCarrierNetwork(String ssid) { 8674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return mCarrierNetworkMap.containsKey(ssid); 8774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 8874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 8974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu /** 9074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * @return the EAP type associated with a carrier AP, or -1 if the specified AP 9174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * is not associated with a carrier network 9274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu */ 9374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu public int getNetworkEapType(String ssid) { 9474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu NetworkInfo info = mCarrierNetworkMap.get(ssid); 9574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return info == null ? -1 : info.mEapType; 9674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 9774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 9874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu /** 9974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * @return the name of carrier associated with a carrier AP, or null if the specified AP 10074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * is not associated with a carrier network. 10174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu */ 10274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu public String getCarrierName(String ssid) { 10374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu NetworkInfo info = mCarrierNetworkMap.get(ssid); 10474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return info == null ? null : info.mCarrierName; 10574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 10674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 10774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu /** 10884f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh * @return True if carrier IMSI encryption info is available, False otherwise. 10984f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh */ 11084f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh public boolean isCarrierEncryptionInfoAvailable() { 11184f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh return mIsCarrierImsiEncryptionInfoAvailable; 11284f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh } 11384f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh 11484f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh /** 11584f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh * Verify whether carrier IMSI encryption info is available. 11684f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh * 11784f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh * @param context Current application context 11884f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh * 11984f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh * @return True if carrier IMSI encryption info is available, False otherwise. 12084f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh */ 12184f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh private boolean verifyCarrierImsiEncryptionInfoIsAvailable(Context context) { 12284f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh TelephonyManager telephonyManager = 12384f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 12484f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh if (telephonyManager == null) { 12584f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh return false; 12684f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh } 12784f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh try { 12884f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh ImsiEncryptionInfo imsiEncryptionInfo = telephonyManager 12984f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh .getCarrierInfoForImsiEncryption(TelephonyManager.KEY_TYPE_WLAN); 13084f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh if (imsiEncryptionInfo == null) { 13184f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh return false; 13284f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh } 13384f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh } catch (RuntimeException e) { 13484f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh Log.e(TAG, "Failed to get imsi encryption info: " + e.getMessage()); 13584f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh return false; 13684f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh } 13784f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh 13884f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh return true; 13984f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh } 14084f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh 14184f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh /** 14274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * Utility class for storing carrier network information. 14374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu */ 14474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu private static class NetworkInfo { 14574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu final int mEapType; 14674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu final String mCarrierName; 14774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 14874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu NetworkInfo(int eapType, String carrierName) { 14974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu mEapType = eapType; 15074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu mCarrierName = carrierName; 15174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 15274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 15374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 15474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu /** 15574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * Update the carrier network map based on the current carrier configuration of the active 15674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * subscriptions. 15774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * 15874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * @param context Current application context 15974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu */ 16074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu private void updateNetworkConfig(Context context) { 16184f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh mIsCarrierImsiEncryptionInfoAvailable = verifyCarrierImsiEncryptionInfoIsAvailable(context); 16284f6d8d25d5982b703a74113083e814c9fe5b28fMehdi Alizadeh 16374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu // Reset network map. 16474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu mCarrierNetworkMap.clear(); 16574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 16674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu CarrierConfigManager carrierConfigManager = 16774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu (CarrierConfigManager) context.getSystemService(Context.CARRIER_CONFIG_SERVICE); 16874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu if (carrierConfigManager == null) { 16974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return; 17074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 17174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 17274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu SubscriptionManager subscriptionManager = (SubscriptionManager) context.getSystemService( 17374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu Context.TELEPHONY_SUBSCRIPTION_SERVICE); 17474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu if (subscriptionManager == null) { 17574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return; 17674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 17774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu List<SubscriptionInfo> subInfoList = subscriptionManager.getActiveSubscriptionInfoList(); 17874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu if (subInfoList == null) { 17974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return; 18074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 18174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 18274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu // Process the carrier config for each active subscription. 18374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu for (SubscriptionInfo subInfo : subInfoList) { 18474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu processNetworkConfig( 18574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu carrierConfigManager.getConfigForSubId(subInfo.getSubscriptionId()), 18674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu subInfo.getDisplayName().toString()); 18774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 18874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 18974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 19074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu /** 19174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * Process the carrier network config, the network config string is formatted as follow: 19274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * 19374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * "[Base64 Encoded SSID],[EAP Type]" 19474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * Where EAP Type is the standard EAP method number, refer to 19574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * http://www.iana.org/assignments/eap-numbers/eap-numbers.xhtml for more info. 19674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 19774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * @param carrierConfig The bundle containing the carrier configuration 19874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * @param carrierName The display name of the associated carrier 19974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu */ 20074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu private void processNetworkConfig(PersistableBundle carrierConfig, String carrierName) { 20174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu if (carrierConfig == null) { 20274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return; 20374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 20474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu String[] networkConfigs = carrierConfig.getStringArray( 20574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu CarrierConfigManager.KEY_CARRIER_WIFI_STRING_ARRAY); 20674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu if (networkConfigs == null) { 20774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return; 20874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 20974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 21074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu for (String networkConfig : networkConfigs) { 21174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu String[] configArr = networkConfig.split(NETWORK_CONFIG_SEPARATOR); 21274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu if (configArr.length != CONFIG_ELEMENT_SIZE) { 21374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu Log.e(TAG, "Ignore invalid config: " + networkConfig); 21474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu continue; 21574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 21674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu try { 21774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu String ssid = new String(Base64.decode( 21874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu configArr[ENCODED_SSID_INDEX], Base64.DEFAULT)); 21974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu int eapType = parseEapType(Integer.parseInt(configArr[EAP_TYPE_INDEX])); 22074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu // Verify EAP type, must be a SIM based EAP type. 22174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu if (eapType == -1) { 22274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu Log.e(TAG, "Invalid EAP type: " + configArr[EAP_TYPE_INDEX]); 22374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu continue; 22474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 22574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu mCarrierNetworkMap.put(ssid, new NetworkInfo(eapType, carrierName)); 22674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } catch (NumberFormatException e) { 22774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu Log.e(TAG, "Failed to parse EAP type: " + e.getMessage()); 22874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } catch (IllegalArgumentException e) { 22974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu Log.e(TAG, "Failed to decode SSID: " + e.getMessage()); 23074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 23174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 23274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 23374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu 23474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu /** 23574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * Convert a standard SIM-based EAP type (SIM, AKA, AKA') to the internal EAP type as defined in 23674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * {@link WifiEnterpriseConfig.Eap}. -1 will be returned if the given EAP type is not 23774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * SIM-based. 23874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * 23974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * @return SIM-based EAP type as defined in {@link WifiEnterpriseConfig.Eap}, or -1 if not 24074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu * SIM-based EAP type 24174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu */ 24274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu private static int parseEapType(int eapType) { 24374390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu if (eapType == EAPConstants.EAP_SIM) { 24474390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return WifiEnterpriseConfig.Eap.SIM; 24574390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } else if (eapType == EAPConstants.EAP_AKA) { 24674390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return WifiEnterpriseConfig.Eap.AKA; 24774390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } else if (eapType == EAPConstants.EAP_AKA_PRIME) { 24874390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return WifiEnterpriseConfig.Eap.AKA_PRIME; 24974390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 25074390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu return -1; 25174390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu } 25274390d669cf29f102a7a3804cfffc5934a39d4bcPeter Qiu} 253