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