[go: nahoru, domu]

SubscriptionInfoUpdater.java revision 4b09dff383ae7dfca595aeeea886a594a1947340
1a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/*
21e7aeace971d8b6d5e5b8cf2038cfce820bb7772Legler Wu* Copyright (C) 2014 The Android Open Source Project
3a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville*
4a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville* Licensed under the Apache License, Version 2.0 (the "License");
5a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville* you may not use this file except in compliance with the License.
6a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville* You may obtain a copy of the License at
7a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville*
8a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville*      http://www.apache.org/licenses/LICENSE-2.0
9a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville*
10a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville* Unless required by applicable law or agreed to in writing, software
11a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville* distributed under the License is distributed on an "AS IS" BASIS,
12a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville* See the License for the specific language governing permissions and
14a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville* limitations under the License.
15a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville*/
16a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
17a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savillepackage com.android.internal.telephony;
18a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
19a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.BroadcastReceiver;
20a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.Context;
21a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.ContentResolver;
22a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.ContentValues;
23a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.Intent;
24a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.content.IntentFilter;
25a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajanimport android.content.SharedPreferences;
26a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.AsyncResult;
27a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Handler;
28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.os.Message;
29a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajanimport android.os.SystemProperties;
30a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajanimport android.preference.PreferenceManager;
31a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajanimport android.provider.Settings;
32a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.Rlog;
33a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.SubscriptionManager;
34299dad50409e907993fa96c7401d4f10c58018b1Wink Savilleimport android.telephony.SubscriptionInfo;
35a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.TelephonyManager;
36a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.uicc.IccConstants;
37a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.uicc.IccFileHandler;
38a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.uicc.IccUtils;
3924e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padaweimport android.text.TextUtils;
40a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
41a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport java.util.List;
42a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
43a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville/**
44a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville *@hide
45a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville */
46299dad50409e907993fa96c7401d4f10c58018b1Wink Savillepublic class SubscriptionInfoUpdater extends Handler {
474b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private static final String LOG_TAG = "SubscriptionInfoUpdater";
48a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int PROJECT_SIM_NUM = TelephonyManager.getDefault().getPhoneCount();
49a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_OFFSET = 8;
50a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final int EVENT_QUERY_ICCID_DONE = 1;
513b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal    private static final int EVENT_GET_NETWORK_SELECTION_MODE_DONE = 2;
52a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private static final String ICCID_STRING_FOR_NO_SIM = "";
53a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    /**
54a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     *  int[] sInsertSimState maintains all slots' SIM inserted status currently,
55a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     *  it may contain 4 kinds of values:
56a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     *    SIM_NOT_INSERT : no SIM inserted in slot i now
57a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     *    SIM_CHANGED    : a valid SIM insert in slot i and is different SIM from last time
58a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     *                     it will later become SIM_NEW or SIM_REPOSITION during update procedure
59a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     *    SIM_NOT_CHANGE : a valid SIM insert in slot i and is the same SIM as last time
60a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     *    SIM_NEW        : a valid SIM insert in slot i and is a new SIM
61a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     *    SIM_REPOSITION : a valid SIM insert in slot i and is inserted in different slot last time
62a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     *    positive integer #: index to distinguish SIM cards with the same IccId
63a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville     */
64a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public static final int SIM_NOT_CHANGE = 0;
65a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public static final int SIM_CHANGED    = -1;
66a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public static final int SIM_NEW        = -2;
67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public static final int SIM_REPOSITION = -3;
68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public static final int SIM_NOT_INSERT = -99;
69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public static final int STATUS_NO_SIM_INSERTED = 0x00;
71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public static final int STATUS_SIM1_INSERTED = 0x01;
72a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public static final int STATUS_SIM2_INSERTED = 0x02;
73a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public static final int STATUS_SIM3_INSERTED = 0x04;
74a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public static final int STATUS_SIM4_INSERTED = 0x08;
75a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
76a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan    // Key used to read/write the current IMSI. Updated on SIM_STATE_CHANGED - LOADED.
77a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan    public static final String CURR_IMSI = "curr_imsi";
78a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan
794b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private static Phone[] mPhone;
804b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private static Context mContext = null;
814b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private static IccFileHandler[] mFh = new IccFileHandler[PROJECT_SIM_NUM];
824b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private static String mIccId[] = new String[PROJECT_SIM_NUM];
834b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private static int[] mInsertSimState = new int[PROJECT_SIM_NUM];
844b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private static TelephonyManager mTelephonyMgr = null;
854b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private SubscriptionManager mSubscriptionManager = null;
864b09dff383ae7dfca595aeeea886a594a1947340Wink Saville
87a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    // To prevent repeatedly update flow every time receiver SIM_STATE_CHANGE
884b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private static boolean mNeedUpdate = true;
894b09dff383ae7dfca595aeeea886a594a1947340Wink Saville
90a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
91299dad50409e907993fa96c7401d4f10c58018b1Wink Saville    public SubscriptionInfoUpdater(Context context, Phone[] phoneProxy, CommandsInterface[] ci) {
92a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        logd("Constructor invoked");
93a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
944b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        mContext = context;
954b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        mPhone = phoneProxy;
964b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        mSubscriptionManager = SubscriptionManager.from(mContext);
974b09dff383ae7dfca595aeeea886a594a1947340Wink Saville
98a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        IntentFilter intentFilter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
994b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        mContext.registerReceiver(sReceiver, intentFilter);
100a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
101a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1024b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private int encodeEventId(int event, int slotId) {
103a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return event << (slotId * EVENT_OFFSET);
104a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
105a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
106a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private final BroadcastReceiver sReceiver = new  BroadcastReceiver() {
107440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville        @Override
108a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        public void onReceive(Context context, Intent intent) {
109a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            logd("[Receiver]+");
110a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            String action = intent.getAction();
111a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            int slotId;
112a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            logd("Action: " + action);
113a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) {
114a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                String simStatus = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
115440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                slotId = intent.getIntExtra(PhoneConstants.SLOT_KEY,
1164b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        SubscriptionManager.INVALID_SIM_SLOT_INDEX);
117a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                logd("slotId: " + slotId + " simStatus: " + simStatus);
1184b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                if (slotId == SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
119440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                    return;
120440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                }
121a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                if (IccCardConstants.INTENT_VALUE_ICC_READY.equals(simStatus)
122a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        || IccCardConstants.INTENT_VALUE_ICC_LOCKED.equals(simStatus)) {
1234b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    if (mIccId[slotId] != null && mIccId[slotId].equals(ICCID_STRING_FOR_NO_SIM)) {
124a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        logd("SIM" + (slotId + 1) + " hot plug in");
1254b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        mIccId[slotId] = null;
1264b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        mNeedUpdate = true;
127a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    }
128a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    queryIccId(slotId);
129a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                } else if (IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(simStatus)) {
130a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    queryIccId(slotId);
1314b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    if (mTelephonyMgr == null) {
1324b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        mTelephonyMgr = TelephonyManager.from(mContext);
133a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    }
134b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville                    int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
1354b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                            SubscriptionManager.INVALID_SUBSCRIPTION_ID);
136440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville
137440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                    if (SubscriptionManager.isValidSubId(subId)) {
1384b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        String msisdn = TelephonyManager.getDefault()
1394b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                                .getLine1NumberForSubscriber(subId);
1404b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        ContentResolver contentResolver = mContext.getContentResolver();
141440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville
142440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                        if (msisdn != null) {
143440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            ContentValues number = new ContentValues(1);
144440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            number.put(SubscriptionManager.NUMBER, msisdn);
145440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            contentResolver.update(SubscriptionManager.CONTENT_URI, number,
1464b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                                    SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "="
1474b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                                    + Long.toString(subId), null);
148440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                        }
149440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville
150299dad50409e907993fa96c7401d4f10c58018b1Wink Saville                        SubscriptionInfo subInfo =
1514b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                                mSubscriptionManager.getActiveSubscriptionInfo(subId);
152440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville
153440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                        if (subInfo != null
15424e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padawe                                && subInfo.getNameSource() !=
15524e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padawe                                SubscriptionManager.NAME_SOURCE_USER_INPUT) {
156440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            String nameToSet;
157440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            String CarrierName =
158440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                                    TelephonyManager.getDefault().getSimOperator(subId);
159440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            logd("CarrierName = " + CarrierName);
16024e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padawe                            String simCarrierName =
16124e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padawe                                    TelephonyManager.getDefault().getSimOperatorName(subId);
162440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville
16324e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padawe                            if (!TextUtils.isEmpty(simCarrierName)) {
16424e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padawe                                nameToSet = simCarrierName;
165440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            } else {
16624e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padawe                                nameToSet = "CARD " + Integer.toString(slotId + 1);
167440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            }
16824e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padawe                            logd("sim name = " + nameToSet + " carrier name = " + simCarrierName);
169440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville
170440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            ContentValues name = new ContentValues(1);
171440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            name.put(SubscriptionManager.DISPLAY_NAME, nameToSet);
17224e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padawe                            name.put(SubscriptionManager.CARRIER_NAME,
17324e3fd66bf996b3b2c63088aa2b0c201871dd4a5Sanket Padawe                                    !TextUtils.isEmpty(simCarrierName) ? simCarrierName :
1744b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                                    mContext.getString(com.android.internal.R.string.unknownName));
175440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                            contentResolver.update(SubscriptionManager.CONTENT_URI, name,
1764b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                                    SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID
1774b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                                    + "=" + Long.toString(subId), null);
178440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                        }
179a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan
180a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                        /* Update preferred network type and network selection mode on IMSI change.
181a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                         * Storing last IMSI in SharedPreference for now. Can consider making it
182a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                         * part of subscription info db */
1834b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        SharedPreferences sp =
1844b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                                PreferenceManager.getDefaultSharedPreferences(context);
185a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                        String storedImsi = sp.getString(CURR_IMSI + slotId, "");
1864b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        String newImsi = mPhone[slotId].getSubscriberId();
187a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan
188a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                        if (!storedImsi.equals(newImsi)) {
1892c08b740c7217b0ac3f66d558cf1379142883a16Amit Mahajan                            int networkType = RILConstants.PREFERRED_NETWORK_MODE;
190a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan
191a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                            // Set the modem network mode
1924b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                            mPhone[slotId].setPreferredNetworkType(networkType, null);
1934b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                            Settings.Global.putInt(mPhone[slotId].getContext().getContentResolver(),
1944b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                                    Settings.Global.PREFERRED_NETWORK_MODE + mPhone[slotId].getSubId(),
1953bc32aa4a3f533421f82a6d7991bb1971bf78191Amit Mahajan                                    networkType);
196a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan
1973b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal                            // Only support automatic selection mode on IMSI change.
1984b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                            mPhone[slotId].getNetworkSelectionMode(
1993b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal                                    obtainMessage(EVENT_GET_NETWORK_SELECTION_MODE_DONE));
200a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan
201a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                            // Update stored IMSI
202a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                            SharedPreferences.Editor editor = sp.edit();
203a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                            editor.putString(CURR_IMSI + slotId, newImsi);
204a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                            editor.apply();
205a77b7504cf2c437548b89e73bdc0898feaa30be0Amit Mahajan                        }
206440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                    } else {
207440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                        logd("[Receiver] Invalid subId, could not update ContentResolver");
208440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                    }
209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                } else if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(simStatus)) {
2104b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    if (mIccId[slotId] != null && !mIccId[slotId].equals(ICCID_STRING_FOR_NO_SIM)) {
211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        logd("SIM" + (slotId + 1) + " hot plug out");
2124b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        mNeedUpdate = true;
213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    }
2144b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    mFh[slotId] = null;
2154b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    mIccId[slotId] = ICCID_STRING_FOR_NO_SIM;
2164b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    if (isAllIccIdQueryDone() && mNeedUpdate) {
217299dad50409e907993fa96c7401d4f10c58018b1Wink Saville                        updateSubscriptionInfoByIccId();
218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    }
219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            logd("[Receiver]-");
222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    };
224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private boolean isAllIccIdQueryDone() {
226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (int i = 0; i < PROJECT_SIM_NUM; i++) {
2274b09dff383ae7dfca595aeeea886a594a1947340Wink Saville            if (mIccId[i] == null) {
228a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                logd("Wait for SIM" + (i + 1) + " IccId");
229a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                return false;
230a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
231a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
232a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        logd("All IccIds query complete");
233a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
234a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return true;
235a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
236a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
2374b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    public void setDisplayNameForNewSub(String newSubName, int subId, int newNameSource) {
2384b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        SubscriptionInfo subInfo = mSubscriptionManager.getActiveSubscriptionInfo(subId);
239a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        if (subInfo != null) {
240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // overwrite SIM display name if it is not assigned by user
2415f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott            int oldNameSource = subInfo.getNameSource();
2425f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott            CharSequence oldSubName = subInfo.getDisplayName();
2435f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott            logd("[setDisplayNameForNewSub] subId = " + subInfo.getSubscriptionId()
2445f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott                    + ", oldSimName = " + oldSubName + ", oldNameSource = " + oldNameSource
2455f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott                    + ", newSubName = " + newSubName + ", newNameSource = " + newNameSource);
246440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville            if (oldSubName == null ||
2474b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                (oldNameSource ==
2484b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE && newSubName != null) ||
249440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                (oldNameSource == SubscriptionManager.NAME_SOURCE_SIM_SOURCE && newSubName != null
250440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                        && !newSubName.equals(oldSubName))) {
2514b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                mSubscriptionManager.setDisplayName(newSubName, subInfo.getSubscriptionId(),
2525f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott                        newNameSource);
253a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
254a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
255a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            logd("SUB" + (subId + 1) + " SubInfo not created yet");
256a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
257a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
258a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
259440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville    @Override
260a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void handleMessage(Message msg) {
261a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        AsyncResult ar = (AsyncResult)msg.obj;
262a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        int msgNum = msg.what;
263a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        int slotId;
264a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (slotId = PhoneConstants.SUB1; slotId <= PhoneConstants.SUB3; slotId++) {
265a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            int pivot = 1 << (slotId * EVENT_OFFSET);
266a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (msgNum >= pivot) {
267a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                continue;
268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            } else {
269a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
270a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
271a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
272a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        slotId--;
273a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        int event = msgNum >> (slotId * EVENT_OFFSET);
274a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        switch (event) {
275a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            case EVENT_QUERY_ICCID_DONE:
276a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                logd("handleMessage : <EVENT_QUERY_ICCID_DONE> SIM" + (slotId + 1));
277a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                if (ar.exception == null) {
278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    if (ar.result != null) {
279a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        byte[] data = (byte[])ar.result;
2804b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        mIccId[slotId] = IccUtils.bcdToString(data, 0, data.length);
281a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    } else {
282a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        logd("Null ar");
2834b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        mIccId[slotId] = ICCID_STRING_FOR_NO_SIM;
284a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    }
285a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                } else {
2864b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    mIccId[slotId] = ICCID_STRING_FOR_NO_SIM;
287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    logd("Query IccId fail: " + ar.exception);
288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
2894b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                logd("sIccId[" + slotId + "] = " + mIccId[slotId]);
2904b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                if (isAllIccIdQueryDone() && mNeedUpdate) {
291299dad50409e907993fa96c7401d4f10c58018b1Wink Saville                    updateSubscriptionInfoByIccId();
292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
2943b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal            case EVENT_GET_NETWORK_SELECTION_MODE_DONE:
2953b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal                if (ar.exception == null && ar.result != null) {
2963b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal                    int[] modes = (int[])ar.result;
2973b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal                    if (modes[0] == 1) {  // Manual mode.
2984b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        mPhone[slotId].setNetworkSelectionModeAutomatic(null);
2993b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal                    }
3003b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal                } else {
3013b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal                    logd("EVENT_GET_NETWORK_SELECTION_MODE_DONE: error getting network mode.");
3023b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal                }
3033b9b9d704121b1c7a9cd98626d7ca87d9cff5437Shishir Agrawal                break;
304a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            default:
305a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                logd("Unknown msg:" + msg.what);
306a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
307a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
308a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
309a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    private void queryIccId(int slotId) {
310d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville        logd("queryIccId: slotid=" + slotId);
3114b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        if (mFh[slotId] == null) {
312a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            logd("Getting IccFileHandler");
3134b09dff383ae7dfca595aeeea886a594a1947340Wink Saville            mFh[slotId] = ((PhoneProxy)mPhone[slotId]).getIccFileHandler();
314a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
3154b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        if (mFh[slotId] != null) {
3164b09dff383ae7dfca595aeeea886a594a1947340Wink Saville            String iccId = mIccId[slotId];
317d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville            if (iccId == null) {
318a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                logd("Querying IccId");
3194b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                mFh[slotId].loadEFTransparent(IccConstants.EF_ICCID,
3204b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        obtainMessage(encodeEventId(EVENT_QUERY_ICCID_DONE, slotId)));
321d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville            } else {
322d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville                logd("NOT Querying IccId its already set sIccid[" + slotId + "]=" + iccId);
323a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
324a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } else {
325d4397df465323b2add2f5e532824ec0ed0d785f4Wink Saville            logd("sFh[" + slotId + "] is null, ignore");
326a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
327a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
328a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
329299dad50409e907993fa96c7401d4f10c58018b1Wink Saville    /**
330299dad50409e907993fa96c7401d4f10c58018b1Wink Saville     * TODO: Simplify more, as no one is interested in what happened
331299dad50409e907993fa96c7401d4f10c58018b1Wink Saville     * only what the current list contains.
332299dad50409e907993fa96c7401d4f10c58018b1Wink Saville     */
333299dad50409e907993fa96c7401d4f10c58018b1Wink Saville    synchronized private void updateSubscriptionInfoByIccId() {
334299dad50409e907993fa96c7401d4f10c58018b1Wink Saville        logd("updateSubscriptionInfoByIccId:+ Start");
3354b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        mNeedUpdate = false;
336a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
3374b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        mSubscriptionManager.clearSubscriptionInfo();
338a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
339a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (int i = 0; i < PROJECT_SIM_NUM; i++) {
3404b09dff383ae7dfca595aeeea886a594a1947340Wink Saville            mInsertSimState[i] = SIM_NOT_CHANGE;
341a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
342a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
343a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        int insertedSimCount = PROJECT_SIM_NUM;
344a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (int i = 0; i < PROJECT_SIM_NUM; i++) {
3454b09dff383ae7dfca595aeeea886a594a1947340Wink Saville            if (ICCID_STRING_FOR_NO_SIM.equals(mIccId[i])) {
346a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                insertedSimCount--;
3474b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                mInsertSimState[i] = SIM_NOT_INSERT;
348a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
349a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
350a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        logd("insertedSimCount = " + insertedSimCount);
351a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
352a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        int index = 0;
353a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (int i = 0; i < PROJECT_SIM_NUM; i++) {
3544b09dff383ae7dfca595aeeea886a594a1947340Wink Saville            if (mInsertSimState[i] == SIM_NOT_INSERT) {
355a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                continue;
356a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
357a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            index = 2;
358a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            for (int j = i + 1; j < PROJECT_SIM_NUM; j++) {
3594b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                if (mInsertSimState[j] == SIM_NOT_CHANGE && mIccId[i].equals(mIccId[j])) {
3604b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    mInsertSimState[i] = 1;
3614b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    mInsertSimState[j] = index;
362a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    index++;
363a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
364a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
365a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
366a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
3674b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        ContentResolver contentResolver = mContext.getContentResolver();
368a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        String[] oldIccId = new String[PROJECT_SIM_NUM];
369a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (int i = 0; i < PROJECT_SIM_NUM; i++) {
370a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            oldIccId[i] = null;
371299dad50409e907993fa96c7401d4f10c58018b1Wink Saville            List<SubscriptionInfo> oldSubInfo =
372440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                    SubscriptionController.getInstance().getSubInfoUsingSlotIdWithCheck(i, false);
373a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if (oldSubInfo != null) {
3745f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott                oldIccId[i] = oldSubInfo.get(0).getIccId();
375299dad50409e907993fa96c7401d4f10c58018b1Wink Saville                logd("updateSubscriptionInfoByIccId: oldSubId = "
376299dad50409e907993fa96c7401d4f10c58018b1Wink Saville                        + oldSubInfo.get(0).getSubscriptionId());
3774b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                if (mInsertSimState[i] == SIM_NOT_CHANGE && !mIccId[i].equals(oldIccId[i])) {
3784b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    mInsertSimState[i] = SIM_CHANGED;
379a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
3804b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                if (mInsertSimState[i] != SIM_NOT_CHANGE) {
381a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    ContentValues value = new ContentValues(1);
3824b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    value.put(SubscriptionManager.SIM_SLOT_INDEX,
3834b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                            SubscriptionManager.INVALID_SIM_SLOT_INDEX);
384a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    contentResolver.update(SubscriptionManager.CONTENT_URI, value,
3854b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                            SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "="
3865f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott                            + Integer.toString(oldSubInfo.get(0).getSubscriptionId()), null);
387a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
388a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            } else {
3894b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                if (mInsertSimState[i] == SIM_NOT_CHANGE) {
390a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    // no SIM inserted last time, but there is one SIM inserted now
3914b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    mInsertSimState[i] = SIM_CHANGED;
392a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
393a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                oldIccId[i] = ICCID_STRING_FOR_NO_SIM;
394299dad50409e907993fa96c7401d4f10c58018b1Wink Saville                logd("updateSubscriptionInfoByIccId: No SIM in slot " + i + " last time");
395a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
396a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
397a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
398a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (int i = 0; i < PROJECT_SIM_NUM; i++) {
399299dad50409e907993fa96c7401d4f10c58018b1Wink Saville            logd("updateSubscriptionInfoByIccId: oldIccId[" + i + "] = " + oldIccId[i] +
4004b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    ", sIccId[" + i + "] = " + mIccId[i]);
401a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
402a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
403a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        //check if the inserted SIM is new SIM
404a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        int nNewCardCount = 0;
405a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        int nNewSimStatus = 0;
406a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (int i = 0; i < PROJECT_SIM_NUM; i++) {
4074b09dff383ae7dfca595aeeea886a594a1947340Wink Saville            if (mInsertSimState[i] == SIM_NOT_INSERT) {
408299dad50409e907993fa96c7401d4f10c58018b1Wink Saville                logd("updateSubscriptionInfoByIccId: No SIM inserted in slot " + i + " this time");
409a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            } else {
4104b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                if (mInsertSimState[i] > 0) {
411a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    //some special SIMs may have the same IccIds, add suffix to distinguish them
412a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    //FIXME: addSubInfoRecord can return an error.
4134b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    mSubscriptionManager.addSubscriptionInfoRecord(mIccId[i]
4144b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                            + Integer.toString(mInsertSimState[i]), i);
415a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    logd("SUB" + (i + 1) + " has invalid IccId");
416a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                } else /*if (sInsertSimState[i] != SIM_NOT_INSERT)*/ {
4174b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    mSubscriptionManager.addSubscriptionInfoRecord(mIccId[i], i);
418a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
4194b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                if (isNewSim(mIccId[i], oldIccId)) {
420a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    nNewCardCount++;
421a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    switch (i) {
422a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        case PhoneConstants.SUB1:
423a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            nNewSimStatus |= STATUS_SIM1_INSERTED;
424a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            break;
425a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        case PhoneConstants.SUB2:
426a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            nNewSimStatus |= STATUS_SIM2_INSERTED;
427a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            break;
428a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        case PhoneConstants.SUB3:
429a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            nNewSimStatus |= STATUS_SIM3_INSERTED;
430a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                            break;
431a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        //case PhoneConstants.SUB3:
432a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        //    nNewSimStatus |= STATUS_SIM4_INSERTED;
433a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        //    break;
434a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    }
435a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
4364b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    mInsertSimState[i] = SIM_NEW;
437a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                }
438a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
439a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
440a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
441a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for (int i = 0; i < PROJECT_SIM_NUM; i++) {
4424b09dff383ae7dfca595aeeea886a594a1947340Wink Saville            if (mInsertSimState[i] == SIM_CHANGED) {
4434b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                mInsertSimState[i] = SIM_REPOSITION;
444a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
445299dad50409e907993fa96c7401d4f10c58018b1Wink Saville            logd("updateSubscriptionInfoByIccId: sInsertSimState[" + i + "] = "
4464b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                    + mInsertSimState[i]);
447a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
448a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
4494b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        List<SubscriptionInfo> subInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
450a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        int nSubCount = (subInfos == null) ? 0 : subInfos.size();
451299dad50409e907993fa96c7401d4f10c58018b1Wink Saville        logd("updateSubscriptionInfoByIccId: nSubCount = " + nSubCount);
4524b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        for (int i=0; i < nSubCount; i++) {
453299dad50409e907993fa96c7401d4f10c58018b1Wink Saville            SubscriptionInfo temp = subInfos.get(i);
454440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville
4555f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott            String msisdn = TelephonyManager.getDefault().getLine1NumberForSubscriber(
4565f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott                    temp.getSubscriptionId());
457440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville
458440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville            if (msisdn != null) {
459440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                ContentValues value = new ContentValues(1);
460440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                value.put(SubscriptionManager.NUMBER, msisdn);
461440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville                contentResolver.update(SubscriptionManager.CONTENT_URI, value,
4624b09dff383ae7dfca595aeeea886a594a1947340Wink Saville                        SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID + "="
4635f208fd8c2c2ef5036dabffafc72b73b9eb3fc16Stuart Scott                        + Integer.toString(temp.getSubscriptionId()), null);
464440b44eb71b8d5afeeaa5fda8912f3a61b4c1588Wink Saville            }
465a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
466a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
467299dad50409e907993fa96c7401d4f10c58018b1Wink Saville        SubscriptionController.getInstance().notifySubscriptionInfoChanged();
468299dad50409e907993fa96c7401d4f10c58018b1Wink Saville        logd("updateSubscriptionInfoByIccId:- SsubscriptionInfo update complete");
469a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
470a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
4714b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private boolean isNewSim(String iccId, String[] oldIccId) {
472a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        boolean newSim = true;
473a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        for(int i = 0; i < PROJECT_SIM_NUM; i++) {
474a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            if(iccId.equals(oldIccId[i])) {
475a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                newSim = false;
476a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                break;
477a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
478a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
479a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        logd("newSim = " + newSim);
480a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
481a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return newSim;
482a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
483a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
484a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void dispose() {
485a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        logd("[dispose]");
4864b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        mContext.unregisterReceiver(sReceiver);
487a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
488a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
4894b09dff383ae7dfca595aeeea886a594a1947340Wink Saville    private void logd(String message) {
4904b09dff383ae7dfca595aeeea886a594a1947340Wink Saville        Rlog.d(LOG_TAG, message);
491a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
492a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville}
493a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
494