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