OSDN Git Service

Revert "Telephony: Dynamically instantiate IccCard"
authorWink Saville <wink@google.com>
Wed, 18 Apr 2012 22:37:21 +0000 (15:37 -0700)
committerAndroid (Google) Code Review <android-gerrit@google.com>
Wed, 18 Apr 2012 22:37:21 +0000 (15:37 -0700)
This reverts commit fe37acae729529b8bf3a3140fa397bddce42b1e0

There are two bugs that are weekend release blockers:

  b/6357558
  b/6357880

6357558 is easily fixed with:

  https://android-git.corp.google.com/g/#/c/182228/

But there are still questions. Bug 6357880 has
unknown causes at the moment but this change is the
most likely candidate. So for today's pre-weekend
build we are reverting this change.

21 files changed:
telephony/java/com/android/internal/telephony/DataConnectionTracker.java
telephony/java/com/android/internal/telephony/IccCard.java
telephony/java/com/android/internal/telephony/IccPhoneBookInterfaceManager.java
telephony/java/com/android/internal/telephony/IccRecords.java
telephony/java/com/android/internal/telephony/PhoneBase.java
telephony/java/com/android/internal/telephony/ServiceStateTracker.java
telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java
telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java
telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
telephony/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java
telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
telephony/java/com/android/internal/telephony/cdma/RuimPhoneBookInterfaceManager.java
telephony/java/com/android/internal/telephony/cdma/RuimRecords.java
telephony/java/com/android/internal/telephony/gsm/GSMPhone.java
telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
telephony/java/com/android/internal/telephony/gsm/GsmMmiCode.java
telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
telephony/java/com/android/internal/telephony/gsm/SIMRecords.java
telephony/java/com/android/internal/telephony/gsm/SimPhoneBookInterfaceManager.java
telephony/java/com/android/internal/telephony/sip/SipPhoneBase.java
telephony/java/com/android/internal/telephony/uicc/UiccController.java

index 214627d..55f2ca3 100644 (file)
@@ -46,7 +46,6 @@ import android.util.Log;
 
 import com.android.internal.R;
 import com.android.internal.telephony.DataConnection.FailCause;
-import com.android.internal.telephony.uicc.UiccController;
 import com.android.internal.util.AsyncChannel;
 import com.android.internal.util.Protocol;
 
@@ -58,7 +57,6 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * {@hide}
@@ -140,7 +138,6 @@ public abstract class DataConnectionTracker extends Handler {
     public static final int EVENT_CLEAN_UP_ALL_CONNECTIONS = BASE + 30;
     public static final int CMD_SET_DEPENDENCY_MET = BASE + 31;
     public static final int CMD_SET_POLICY_DATA_ENABLE = BASE + 32;
-    protected static final int EVENT_ICC_CHANGED = BASE + 33;
 
     /***** Constants *****/
 
@@ -253,8 +250,6 @@ public abstract class DataConnectionTracker extends Handler {
 
     // member variables
     protected PhoneBase mPhone;
-    protected UiccController mUiccController;
-    protected AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>();
     protected Activity mActivity = Activity.NONE;
     protected State mState = State.IDLE;
     protected Handler mDataConnectionTracker = null;
@@ -505,8 +500,6 @@ public abstract class DataConnectionTracker extends Handler {
     protected DataConnectionTracker(PhoneBase phone) {
         super();
         mPhone = phone;
-        mUiccController = UiccController.getInstance();
-        mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);
 
         IntentFilter filter = new IntentFilter();
         filter.addAction(getActionIntentReconnectAlarm());
@@ -548,7 +541,6 @@ public abstract class DataConnectionTracker extends Handler {
         mIsDisposed = true;
         mPhone.getContext().unregisterReceiver(this.mIntentReceiver);
         mDataRoamingSettingObserver.unregister(mPhone.getContext());
-        mUiccController.unregisterForIccChanged(this);
     }
 
     protected void broadcastMessenger() {
@@ -671,7 +663,6 @@ public abstract class DataConnectionTracker extends Handler {
     protected abstract void onCleanUpConnection(boolean tearDown, int apnId, String reason);
     protected abstract void onCleanUpAllConnections(String cause);
     protected abstract boolean isDataPossible(String apnType);
-    protected abstract void onUpdateIcc();
 
     protected void onDataStallAlarm(int tag) {
         loge("onDataStallAlarm: not impleted tag=" + tag);
@@ -782,10 +773,6 @@ public abstract class DataConnectionTracker extends Handler {
                 onSetPolicyDataEnabled(enabled);
                 break;
             }
-            case EVENT_ICC_CHANGED:
-                onUpdateIcc();
-                break;
-
             default:
                 Log.e("DATA", "Unidentified event msg=" + msg);
                 break;
index 140b7c6..92024cd 100644 (file)
@@ -35,12 +35,10 @@ import android.view.WindowManager;
 
 import com.android.internal.telephony.PhoneBase;
 import com.android.internal.telephony.CommandsInterface.RadioState;
-import com.android.internal.telephony.gsm.GSMPhone;
 import com.android.internal.telephony.gsm.SIMFileHandler;
 import com.android.internal.telephony.gsm.SIMRecords;
 import com.android.internal.telephony.cat.CatService;
 import com.android.internal.telephony.cdma.CDMALTEPhone;
-import com.android.internal.telephony.cdma.CDMAPhone;
 import com.android.internal.telephony.cdma.CdmaLteUiccFileHandler;
 import com.android.internal.telephony.cdma.CdmaLteUiccRecords;
 import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager;
@@ -116,6 +114,8 @@ public class IccCard {
     protected static final int EVENT_ICC_LOCKED = 1;
     private static final int EVENT_GET_ICC_STATUS_DONE = 2;
     protected static final int EVENT_RADIO_OFF_OR_NOT_AVAILABLE = 3;
+    private static final int EVENT_PINPUK_DONE = 4;
+    private static final int EVENT_REPOLL_STATUS_DONE = 5;
     protected static final int EVENT_ICC_READY = 6;
     private static final int EVENT_QUERY_FACILITY_LOCK_DONE = 7;
     private static final int EVENT_CHANGE_FACILITY_LOCK_DONE = 8;
@@ -178,19 +178,34 @@ public class IccCard {
         return State.UNKNOWN;
     }
 
-    public IccCard(PhoneBase phone, IccCardStatus ics, String logTag, boolean dbg) {
+    public IccCard(PhoneBase phone, String logTag, Boolean is3gpp, Boolean dbg) {
         mLogTag = logTag;
         mDbg = dbg;
-        if (mDbg) log("Creating");
-        update(phone, ics);
+        if (mDbg) log("[IccCard] Creating card type " + (is3gpp ? "3gpp" : "3gpp2"));
+        mPhone = phone;
+        this.is3gpp = is3gpp;
         mCdmaSSM = CdmaSubscriptionSourceManager.getInstance(mPhone.getContext(),
                 mPhone.mCM, mHandler, EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null);
+        if (phone.mCM.getLteOnCdmaMode() == Phone.LTE_ON_CDMA_TRUE
+                && phone instanceof CDMALTEPhone) {
+            mIccFileHandler = new CdmaLteUiccFileHandler(this, "", mPhone.mCM);
+            mIccRecords = new CdmaLteUiccRecords(this, mPhone.mContext, mPhone.mCM);
+        } else {
+            // Correct aid will be set later (when GET_SIM_STATUS returns)
+            mIccFileHandler = is3gpp ? new SIMFileHandler(this, "", mPhone.mCM) :
+                                       new RuimFileHandler(this, "", mPhone.mCM);
+            mIccRecords = is3gpp ? new SIMRecords(this, mPhone.mContext, mPhone.mCM) :
+                                   new RuimRecords(this, mPhone.mContext, mPhone.mCM);
+        }
+        mCatService = CatService.getInstance(mPhone.mCM, mIccRecords,
+                mPhone.mContext, mIccFileHandler, this);
         mPhone.mCM.registerForOffOrNotAvailable(mHandler, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
         mPhone.mCM.registerForOn(mHandler, EVENT_RADIO_ON, null);
+        mPhone.mCM.registerForIccStatusChanged(mHandler, EVENT_ICC_STATUS_CHANGED, null);
     }
 
     public void dispose() {
-        if (mDbg) log("Disposing card type " + (is3gpp ? "3gpp" : "3gpp2"));
+        if (mDbg) log("[IccCard] Disposing card type " + (is3gpp ? "3gpp" : "3gpp2"));
         mPhone.mCM.unregisterForIccStatusChanged(mHandler);
         mPhone.mCM.unregisterForOffOrNotAvailable(mHandler);
         mPhone.mCM.unregisterForOn(mHandler);
@@ -200,40 +215,6 @@ public class IccCard {
         mIccFileHandler.dispose();
     }
 
-    public void update(PhoneBase phone, IccCardStatus ics) {
-        if (phone != mPhone) {
-            PhoneBase oldPhone = mPhone;
-            mPhone = phone;
-            log("Update");
-            if (phone instanceof GSMPhone) {
-                is3gpp = true;
-            } else if (phone instanceof CDMALTEPhone){
-                is3gpp = true;
-            } else if (phone instanceof CDMAPhone){
-                is3gpp = false;
-            } else {
-                throw new RuntimeException("Update: Unhandled phone type. Critical error!" +
-                        phone.getPhoneName());
-            }
-
-
-            if (phone.mCM.getLteOnCdmaMode() == Phone.LTE_ON_CDMA_TRUE
-                    && phone instanceof CDMALTEPhone) {
-                mIccFileHandler = new CdmaLteUiccFileHandler(this, "", mPhone.mCM);
-                mIccRecords = new CdmaLteUiccRecords(this, mPhone.mContext, mPhone.mCM);
-            } else {
-                // Correct aid will be set later (when GET_SIM_STATUS returns)
-                mIccFileHandler = is3gpp ? new SIMFileHandler(this, "", mPhone.mCM) :
-                                           new RuimFileHandler(this, "", mPhone.mCM);
-                mIccRecords = is3gpp ? new SIMRecords(this, mPhone.mContext, mPhone.mCM) :
-                                       new RuimRecords(this, mPhone.mContext, mPhone.mCM);
-            }
-            mCatService = CatService.getInstance(mPhone.mCM, mIccRecords, mPhone.mContext,
-                    mIccFileHandler, this);
-        }
-        mHandler.sendMessage(mHandler.obtainMessage(EVENT_GET_ICC_STATUS_DONE, ics));
-    }
-
     protected void finalize() {
         if (mDbg) log("[IccCard] Finalized card type " + (is3gpp ? "3gpp" : "3gpp2"));
     }
@@ -363,23 +344,27 @@ public class IccCard {
      */
 
     public void supplyPin (String pin, Message onComplete) {
-        mPhone.mCM.supplyIccPin(pin, onComplete);
+        mPhone.mCM.supplyIccPin(pin, mHandler.obtainMessage(EVENT_PINPUK_DONE, onComplete));
     }
 
     public void supplyPuk (String puk, String newPin, Message onComplete) {
-        mPhone.mCM.supplyIccPuk(puk, newPin, onComplete);
+        mPhone.mCM.supplyIccPuk(puk, newPin,
+                mHandler.obtainMessage(EVENT_PINPUK_DONE, onComplete));
     }
 
     public void supplyPin2 (String pin2, Message onComplete) {
-        mPhone.mCM.supplyIccPin2(pin2, onComplete);
+        mPhone.mCM.supplyIccPin2(pin2,
+                mHandler.obtainMessage(EVENT_PINPUK_DONE, onComplete));
     }
 
     public void supplyPuk2 (String puk2, String newPin2, Message onComplete) {
-        mPhone.mCM.supplyIccPuk2(puk2, newPin2, onComplete);
+        mPhone.mCM.supplyIccPuk2(puk2, newPin2,
+                mHandler.obtainMessage(EVENT_PINPUK_DONE, onComplete));
     }
 
     public void supplyNetworkDepersonalization (String pin, Message onComplete) {
-        mPhone.mCM.supplyNetworkDepersonalization(pin, onComplete);
+        mPhone.mCM.supplyNetworkDepersonalization(pin,
+                mHandler.obtainMessage(EVENT_PINPUK_DONE, onComplete));
     }
 
     /**
@@ -509,15 +494,21 @@ public class IccCard {
      *
      */
     public String getServiceProviderName () {
-        return mIccRecords.getServiceProviderName();
+        return mPhone.mIccRecords.getServiceProviderName();
     }
 
     protected void updateStateProperty() {
         mPhone.setSystemProperty(TelephonyProperties.PROPERTY_SIM_STATE, getState().toString());
     }
 
-    private void getIccCardStatusDone(IccCardStatus ics) {
-        handleIccCardStatus(ics);
+    private void getIccCardStatusDone(AsyncResult ar) {
+        if (ar.exception != null) {
+            Log.e(mLogTag,"Error getting ICC status. "
+                    + "RIL_REQUEST_GET_ICC_STATUS should "
+                    + "never return an error", ar.exception);
+            return;
+        }
+        handleIccCardStatus((IccCardStatus) ar.result);
     }
 
     private void handleIccCardStatus(IccCardStatus newCardStatus) {
@@ -593,7 +584,6 @@ public class IccCard {
         if (oldState != State.READY && newState == State.READY &&
                 (is3gpp || isSubscriptionFromIccCard)) {
             mIccFileHandler.setAid(getAid());
-            broadcastIccStateChangedIntent(INTENT_VALUE_ICC_READY, null);
             mIccRecords.onReady();
         }
     }
@@ -714,6 +704,7 @@ public class IccCard {
                     if (!is3gpp) {
                         handleCdmaSubscriptionSource();
                     }
+                    mPhone.mCM.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE));
                     break;
                 case EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED:
                     handleCdmaSubscriptionSource();
@@ -734,9 +725,30 @@ public class IccCard {
                              obtainMessage(EVENT_QUERY_FACILITY_LOCK_DONE));
                      break;
                 case EVENT_GET_ICC_STATUS_DONE:
-                    IccCardStatus cs = (IccCardStatus)msg.obj;
+                    ar = (AsyncResult)msg.obj;
+
+                    getIccCardStatusDone(ar);
+                    break;
+                case EVENT_PINPUK_DONE:
+                    // a PIN/PUK/PIN2/PUK2/Network Personalization
+                    // request has completed. ar.userObj is the response Message
+                    // Repoll before returning
+                    ar = (AsyncResult)msg.obj;
+                    // TODO should abstract these exceptions
+                    AsyncResult.forMessage(((Message)ar.userObj)).exception
+                                                        = ar.exception;
+                    mPhone.mCM.getIccCardStatus(
+                        obtainMessage(EVENT_REPOLL_STATUS_DONE, ar.userObj));
+                    break;
+                case EVENT_REPOLL_STATUS_DONE:
+                    // Finished repolling status after PIN operation
+                    // ar.userObj is the response messaeg
+                    // ar.userObj.obj is already an AsyncResult with an
+                    // appropriate exception filled in if applicable
 
-                    getIccCardStatusDone(cs);
+                    ar = (AsyncResult)msg.obj;
+                    getIccCardStatusDone(ar);
+                    ((Message)ar.userObj).sendToTarget();
                     break;
                 case EVENT_QUERY_FACILITY_LOCK_DONE:
                     ar = (AsyncResult)msg.obj;
@@ -785,6 +797,10 @@ public class IccCard {
                                                         = ar.exception;
                     ((Message)ar.userObj).sendToTarget();
                     break;
+                case EVENT_ICC_STATUS_CHANGED:
+                    Log.d(mLogTag, "Received Event EVENT_ICC_STATUS_CHANGED");
+                    mPhone.mCM.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE));
+                    break;
                 case EVENT_CARD_REMOVED:
                     onIccSwap(false);
                     break;
@@ -951,10 +967,6 @@ public class IccCard {
         Log.d(mLogTag, "[IccCard] " + msg);
     }
 
-    private void loge(String msg) {
-        Log.e(mLogTag, "[IccCard] " + msg);
-    }
-
     protected int getCurrentApplicationIndex() {
         if (is3gpp) {
             return mIccCardStatus.getGsmUmtsSubscriptionAppIndex();
index 0e5f2da..45562ca 100644 (file)
@@ -103,23 +103,11 @@ public abstract class IccPhoneBookInterfaceManager extends IIccPhoneBook.Stub {
 
     public IccPhoneBookInterfaceManager(PhoneBase phone) {
         this.phone = phone;
-        IccRecords r = phone.mIccRecords.get();
-        if (r != null) {
-            adnCache = r.getAdnCache();
-        }
     }
 
     public void dispose() {
     }
 
-    public void updateIccRecords(IccRecords iccRecords) {
-        if (iccRecords != null) {
-            adnCache = iccRecords.getAdnCache();
-        } else {
-            adnCache = null;
-        }
-    }
-
     protected void publish() {
         //NOTE service "simphonebook" added by IccSmsInterfaceManagerProxy
         ServiceManager.addService("simphonebook", this);
index 3c90647..41c9d5a 100644 (file)
@@ -26,8 +26,6 @@ import android.os.RegistrantList;
 import com.android.internal.telephony.gsm.UsimServiceTable;
 import com.android.internal.telephony.ims.IsimRecords;
 
-import java.util.concurrent.atomic.AtomicBoolean;
-
 /**
  * {@hide}
  */
@@ -35,7 +33,7 @@ public abstract class IccRecords extends Handler implements IccConstants {
 
     protected static final boolean DBG = true;
     // ***** Instance Variables
-    protected AtomicBoolean mDestroyed = new AtomicBoolean(false);
+    protected boolean mDestroyed = false; // set to true once this object needs to be disposed of
     protected Context mContext;
     protected CommandsInterface mCi;
     protected IccFileHandler mFh;
@@ -81,9 +79,9 @@ public abstract class IccRecords extends Handler implements IccConstants {
 
     // ***** Event Constants
     protected static final int EVENT_SET_MSISDN_DONE = 30;
-    public static final int EVENT_MWI = 0; // Message Waiting indication
-    public static final int EVENT_CFI = 1; // Call Forwarding indication
-    public static final int EVENT_SPN = 2; // Service Provider Name
+    public static final int EVENT_MWI = 0;
+    public static final int EVENT_CFI = 1;
+    public static final int EVENT_SPN = 2;
 
     public static final int EVENT_GET_ICC_RECORD_DONE = 100;
 
@@ -115,7 +113,7 @@ public abstract class IccRecords extends Handler implements IccConstants {
      * Call when the IccRecords object is no longer going to be used.
      */
     public void dispose() {
-        mDestroyed.set(true);
+        mDestroyed = true;
         mParentCard = null;
         mFh = null;
         mCi = null;
@@ -130,8 +128,12 @@ public abstract class IccRecords extends Handler implements IccConstants {
         return adnCache;
     }
 
+    public IccCard getIccCard() {
+        return mParentCard;
+    }
+
     public void registerForRecordsLoaded(Handler h, int what, Object obj) {
-        if (mDestroyed.get()) {
+        if (mDestroyed) {
             return;
         }
 
index 0c2f234..2ac9365 100644 (file)
@@ -40,7 +40,6 @@ import com.android.internal.R;
 import com.android.internal.telephony.gsm.UsimServiceTable;
 import com.android.internal.telephony.ims.IsimRecords;
 import com.android.internal.telephony.test.SimulatedRadioControl;
-import com.android.internal.telephony.uicc.UiccController;
 import com.android.internal.telephony.gsm.SIMRecords;
 
 import java.io.FileDescriptor;
@@ -111,7 +110,6 @@ public abstract class PhoneBase extends Handler implements Phone {
     protected static final int EVENT_SET_NETWORK_AUTOMATIC          = 28;
     protected static final int EVENT_NEW_ICC_SMS                    = 29;
     protected static final int EVENT_ICC_RECORD_EVENTS              = 30;
-    protected static final int EVENT_ICC_CHANGED                    = 31;
 
     // Key used to read/write current CLIR setting
     public static final String CLIR_KEY = "clir_key";
@@ -128,8 +126,7 @@ public abstract class PhoneBase extends Handler implements Phone {
     int mCallRingDelay;
     public boolean mIsTheCurrentActivePhone = true;
     boolean mIsVoiceCapable = true;
-    protected UiccController mUiccController = null;
-    public AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>();
+    public IccRecords mIccRecords;
     protected AtomicReference<IccCard> mIccCard = new AtomicReference<IccCard>();
     public SmsStorageMonitor mSmsStorageMonitor;
     public SmsUsageMonitor mSmsUsageMonitor;
@@ -254,8 +251,6 @@ public abstract class PhoneBase extends Handler implements Phone {
         // Initialize device storage and outgoing SMS usage monitors for SMSDispatchers.
         mSmsStorageMonitor = new SmsStorageMonitor(this);
         mSmsUsageMonitor = new SmsUsageMonitor(context);
-        mUiccController = UiccController.getInstance(this);
-        mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);
     }
 
     public void dispose() {
@@ -267,7 +262,6 @@ public abstract class PhoneBase extends Handler implements Phone {
             // Dispose the SMS usage and storage monitors
             mSmsStorageMonitor.dispose();
             mSmsUsageMonitor.dispose();
-            mUiccController.unregisterForIccChanged(this);
         }
     }
 
@@ -275,10 +269,9 @@ public abstract class PhoneBase extends Handler implements Phone {
         mSmsStorageMonitor = null;
         mSmsUsageMonitor = null;
         mSMS = null;
-        mIccRecords.set(null);
+        mIccRecords = null;
         mIccCard.set(null);
         mDataConnectionTracker = null;
-        mUiccController = null;
     }
 
     /**
@@ -315,10 +308,6 @@ public abstract class PhoneBase extends Handler implements Phone {
                 }
                 break;
 
-            case EVENT_ICC_CHANGED:
-                onUpdateIccAvailability();
-                break;
-
             default:
                 throw new RuntimeException("unexpected event not handled");
         }
@@ -329,9 +318,6 @@ public abstract class PhoneBase extends Handler implements Phone {
         return mContext;
     }
 
-    // Will be called when icc changed
-    protected abstract void onUpdateIccAvailability();
-
     /**
      * Disables the DNS check (i.e., allows "0.0.0.0").
      * Useful for lab testing environment.
@@ -680,26 +666,22 @@ public abstract class PhoneBase extends Handler implements Phone {
 
     @Override
     public String getIccSerialNumber() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.iccid : "";
+        return mIccRecords.iccid;
     }
 
     @Override
     public boolean getIccRecordsLoaded() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getRecordsLoaded() : false;
+        return mIccRecords.getRecordsLoaded();
     }
 
     @Override
     public boolean getMessageWaitingIndicator() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getVoiceMessageWaiting() : false;
+        return mIccRecords.getVoiceMessageWaiting();
     }
 
     @Override
     public boolean getCallForwardingIndicator() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getVoiceCallForwardingFlag() : false;
+        return mIccRecords.getVoiceCallForwardingFlag();
     }
 
     /**
@@ -1153,10 +1135,7 @@ public abstract class PhoneBase extends Handler implements Phone {
      */
     @Override
     public void setVoiceMessageWaiting(int line, int countWaiting) {
-        IccRecords r = mIccRecords.get();
-        if (r != null) {
-            r.setVoiceMessageWaiting(line, countWaiting);
-        }
+        mIccRecords.setVoiceMessageWaiting(line, countWaiting);
     }
 
     /**
@@ -1165,8 +1144,7 @@ public abstract class PhoneBase extends Handler implements Phone {
      */
     @Override
     public UsimServiceTable getUsimServiceTable() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getUsimServiceTable() : null;
+        return mIccRecords.getUsimServiceTable();
     }
 
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
index a86b68b..75eb226 100644 (file)
@@ -18,15 +18,12 @@ package com.android.internal.telephony;
 
 import android.os.AsyncResult;
 import android.os.Handler;
-import android.os.Looper;
 import android.os.Message;
 import android.os.Registrant;
 import android.os.RegistrantList;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
 
-import com.android.internal.telephony.uicc.UiccController;
-
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 
@@ -36,9 +33,6 @@ import java.io.PrintWriter;
 public abstract class ServiceStateTracker extends Handler {
 
     protected CommandsInterface cm;
-    protected UiccController mUiccController = null;
-    protected IccCard mIccCard = null;
-    protected IccRecords mIccRecords = null;
 
     public ServiceState ss;
     protected ServiceState newSS;
@@ -136,7 +130,7 @@ public abstract class ServiceStateTracker extends Handler {
     protected static final int EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED  = 39;
     protected static final int EVENT_CDMA_PRL_VERSION_CHANGED          = 40;
     protected static final int EVENT_RADIO_ON                          = 41;
-    protected static final int EVENT_ICC_CHANGED                       = 42;
+
 
     protected static final String TIMEZONE_PROPERTY = "persist.sys.timezone";
 
@@ -173,10 +167,7 @@ public abstract class ServiceStateTracker extends Handler {
     protected static final String REGISTRATION_DENIED_GEN  = "General";
     protected static final String REGISTRATION_DENIED_AUTH = "Authentication Failure";
 
-    public ServiceStateTracker(PhoneBase p, CommandsInterface ci) {
-        cm = ci;
-        mUiccController = UiccController.getInstance();
-        mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);
+    public ServiceStateTracker() {
     }
 
     public boolean getDesiredPowerState() {
@@ -303,10 +294,6 @@ public abstract class ServiceStateTracker extends Handler {
                 }
                 break;
 
-            case EVENT_ICC_CHANGED:
-                onUpdateIccAvailability();
-                break;
-
             default:
                 log("Unhandled message with number: " + msg.what);
                 break;
@@ -317,7 +304,6 @@ public abstract class ServiceStateTracker extends Handler {
     protected abstract void handlePollStateResult(int what, AsyncResult ar);
     protected abstract void updateSpnDisplay();
     protected abstract void setPowerStateToDesired();
-    protected abstract void onUpdateIccAvailability();
     protected abstract void log(String s);
     protected abstract void loge(String s);
 
@@ -477,21 +463,6 @@ public abstract class ServiceStateTracker extends Handler {
         pollingContext = new int[1];
     }
 
-    /**
-     * Verifies the current thread is the same as the thread originally
-     * used in the initialization of this instance. Throws RuntimeException
-     * if not.
-     *
-     * @exception RuntimeException if the current thread is not
-     * the thread that originally obtained this PhoneBase instance.
-     */
-    protected void checkCorrectThread() {
-        if (Thread.currentThread() != getLooper().getThread()) {
-            throw new RuntimeException(
-                    "ServiceStateTracker must be used from within one thread");
-        }
-    }
-
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("ServiceStateTracker:");
         pw.println(" ss=" + ss);
index 24bb814..d99a625 100644 (file)
@@ -29,7 +29,6 @@ import android.util.Log;
 
 import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.IccRecords;
 import com.android.internal.telephony.OperatorInfo;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneNotifier;
@@ -67,6 +66,7 @@ public class CDMALTEPhone extends CDMAPhone {
     public CDMALTEPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) {
         super(context, ci, notifier, false);
         m3gppSMS = new GsmSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);
+        mIccRecords.registerForNewSms(this, EVENT_NEW_ICC_SMS, null);
     }
 
     @Override
@@ -88,6 +88,10 @@ public class CDMALTEPhone extends CDMAPhone {
 
     @Override
     protected void initSstIcc() {
+        mIccCard.set(UiccController.getInstance(this).getIccCard());
+        mIccRecords = mIccCard.get().getIccRecords();
+        // CdmaLteServiceStateTracker registers with IccCard to know
+        // when the card is ready. So create mIccCard before the ServiceStateTracker
         mSST = new CdmaLteServiceStateTracker(this);
     }
 
@@ -96,6 +100,7 @@ public class CDMALTEPhone extends CDMAPhone {
         synchronized(PhoneProxy.lockForRadioTechnologyChange) {
             super.dispose();
             m3gppSMS.dispose();
+            mIccRecords.unregisterForNewSms(this);
         }
     }
 
@@ -198,12 +203,11 @@ public class CDMALTEPhone extends CDMAPhone {
 
     @Override
     public boolean updateCurrentCarrierInProvider() {
-        IccRecords r = mIccRecords.get();
-        if (r != null) {
+        if (mIccRecords != null) {
             try {
                 Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
                 ContentValues map = new ContentValues();
-                String operatorNumeric = r.getOperatorNumeric();
+                String operatorNumeric = mIccRecords.getOperatorNumeric();
                 map.put(Telephony.Carriers.NUMERIC, operatorNumeric);
                 if (DBG) log("updateCurrentCarrierInProvider from UICC: numeric=" +
                         operatorNumeric);
@@ -221,8 +225,7 @@ public class CDMALTEPhone extends CDMAPhone {
     // return IMSI from USIM as subscriber ID.
     @Override
     public String getSubscriberId() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getIMSI() : "";
+        return mIccRecords.getIMSI();
     }
 
     @Override
@@ -237,14 +240,12 @@ public class CDMALTEPhone extends CDMAPhone {
 
     @Override
     public IsimRecords getIsimRecords() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getIsimRecords() : null;
+        return mIccRecords.getIsimRecords();
     }
 
     @Override
     public String getMsisdn() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getMsisdnNumber() : null;
+        return mIccRecords.getMsisdnNumber();
     }
 
     @Override
@@ -258,26 +259,6 @@ public class CDMALTEPhone extends CDMAPhone {
     }
 
     @Override
-    protected void registerForRuimRecordEvents() {
-        IccRecords r = mIccRecords.get();
-        if (r == null) {
-            return;
-        }
-        r.registerForNewSms(this, EVENT_NEW_ICC_SMS, null);
-        super.registerForRuimRecordEvents();
-    }
-
-    @Override
-    protected void unregisterForRuimRecordEvents() {
-        IccRecords r = mIccRecords.get();
-        if (r == null) {
-            return;
-        }
-        r.unregisterForNewSms(this);
-        super.unregisterForRuimRecordEvents();
-    }
-
-    @Override
     protected void log(String s) {
             Log.d(LOG_TAG, "[CDMALTEPhone] " + s);
     }
index 7922b3c..9f6ec71 100755 (executable)
@@ -50,7 +50,6 @@ import com.android.internal.telephony.IccCard;
 import com.android.internal.telephony.IccException;
 import com.android.internal.telephony.IccFileHandler;
 import com.android.internal.telephony.IccPhoneBookInterfaceManager;
-import com.android.internal.telephony.IccRecords;
 import com.android.internal.telephony.IccSmsInterfaceManager;
 import com.android.internal.telephony.MccTable;
 import com.android.internal.telephony.MmiCode;
@@ -153,6 +152,10 @@ public class CDMAPhone extends PhoneBase {
     }
 
     protected void initSstIcc() {
+        mIccCard.set(UiccController.getInstance(this).getIccCard());
+        mIccRecords = mIccCard.get().getIccRecords();
+        // CdmaServiceStateTracker registers with IccCard to know
+        // when the Ruim card is ready. So create mIccCard before the ServiceStateTracker
         mSST = new CdmaServiceStateTracker(this);
     }
 
@@ -169,6 +172,7 @@ public class CDMAPhone extends PhoneBase {
         mEriManager = new EriManager(this, context, EriManager.ERI_FROM_XML);
 
         mCM.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null);
+        registerForRuimRecordEvents();
         mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
         mCM.registerForOn(this, EVENT_RADIO_ON, null);
         mCM.setOnSuppServiceNotification(this, EVENT_SSN, null);
@@ -723,10 +727,7 @@ public class CDMAPhone extends PhoneBase {
         Message resp;
         mVmNumber = voiceMailNumber;
         resp = obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete);
-        IccRecords r = mIccRecords.get();
-        if (r != null) {
-            r.setVoiceMailNumber(alphaTag, mVmNumber, resp);
-        }
+        mIccRecords.setVoiceMailNumber(alphaTag, mVmNumber, resp);
     }
 
     public String getVoiceMailNumber() {
@@ -748,8 +749,7 @@ public class CDMAPhone extends PhoneBase {
      * @hide
      */
     public int getVoiceMessageCount() {
-        IccRecords r = mIccRecords.get();
-        int voicemailCount =  (r != null) ? r.getVoiceMessageCount() : 0;
+        int voicemailCount =  mIccRecords.getVoiceMessageCount();
         // If mRuimRecords.getVoiceMessageCount returns zero, then there is possibility
         // that phone was power cycled and would have lost the voicemail count.
         // So get the count from preferences.
@@ -1064,39 +1064,6 @@ public class CDMAPhone extends PhoneBase {
         }
     }
 
-    @Override
-    protected void onUpdateIccAvailability() {
-        if (mUiccController == null ) {
-            return;
-        }
-
-        IccCard newIccCard = mUiccController.getIccCard();
-
-        IccCard c = mIccCard.get();
-        if (c != newIccCard) {
-            if (c != null) {
-                log("Removing stale icc objects.");
-                if (mIccRecords.get() != null) {
-                    unregisterForRuimRecordEvents();
-                    if (mRuimPhoneBookInterfaceManager != null) {
-                        mRuimPhoneBookInterfaceManager.updateIccRecords(null);
-                    }
-                }
-                mIccRecords.set(null);
-                mIccCard.set(null);
-            }
-            if (newIccCard != null) {
-                log("New card found");
-                mIccCard.set(newIccCard);
-                mIccRecords.set(newIccCard.getIccRecords());
-                registerForRuimRecordEvents();
-                if (mRuimPhoneBookInterfaceManager != null) {
-                    mRuimPhoneBookInterfaceManager.updateIccRecords(mIccRecords.get());
-                }
-            }
-        }
-    }
-
     private void processIccRecordEvents(int eventCode) {
         switch (eventCode) {
             case RuimRecords.EVENT_MWI:
@@ -1495,22 +1462,14 @@ public class CDMAPhone extends PhoneBase {
         return mEriManager.isEriFileLoaded();
     }
 
-    protected void registerForRuimRecordEvents() {
-        IccRecords r = mIccRecords.get();
-        if (r == null) {
-            return;
-        }
-        r.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null);
-        r.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null);
+    private void registerForRuimRecordEvents() {
+        mIccRecords.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null);
+        mIccRecords.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null);
     }
 
-    protected void unregisterForRuimRecordEvents() {
-        IccRecords r = mIccRecords.get();
-        if (r == null) {
-            return;
-        }
-        r.unregisterForRecordsEvents(this);
-        r.unregisterForRecordsLoaded(this);
+    private void unregisterForRuimRecordEvents() {
+        mIccRecords.unregisterForRecordsEvents(this);
+        mIccRecords.unregisterForRecordsLoaded(this);
     }
 
     protected void log(String s) {
index d05ed62..7e5e707 100644 (file)
@@ -40,8 +40,6 @@ import com.android.internal.telephony.DataConnection;
 import com.android.internal.telephony.DataConnectionAc;
 import com.android.internal.telephony.DataConnectionTracker;
 import com.android.internal.telephony.EventLogTags;
-import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.IccRecords;
 import com.android.internal.telephony.RetryManager;
 import com.android.internal.telephony.RILConstants;
 import com.android.internal.telephony.Phone;
@@ -112,6 +110,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
 
         p.mCM.registerForAvailable (this, EVENT_RADIO_AVAILABLE, null);
         p.mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
+        p.mIccRecords.registerForRecordsLoaded(this, EVENT_RECORDS_LOADED, null);
         p.mCM.registerForDataNetworkStateChanged (this, EVENT_DATA_STATE_CHANGED, null);
         p.mCT.registerForVoiceCallEnded (this, EVENT_VOICE_CALL_ENDED, null);
         p.mCT.registerForVoiceCallStarted (this, EVENT_VOICE_CALL_STARTED, null);
@@ -153,8 +152,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
         // Unregister from all events
         mPhone.mCM.unregisterForAvailable(this);
         mPhone.mCM.unregisterForOffOrNotAvailable(this);
-        IccRecords r = mIccRecords.get();
-        if (r != null) { r.unregisterForRecordsLoaded(this);}
+        mCdmaPhone.mIccRecords.unregisterForRecordsLoaded(this);
         mPhone.mCM.unregisterForDataNetworkStateChanged(this);
         mCdmaPhone.mCT.unregisterForVoiceCallEnded(this);
         mCdmaPhone.mCT.unregisterForVoiceCallStarted(this);
@@ -224,12 +222,11 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
         boolean subscriptionFromNv = (mCdmaSSM.getCdmaSubscriptionSource()
                                        == CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_NV);
 
-        IccRecords r = mIccRecords.get();
         boolean allowed =
                     (psState == ServiceState.STATE_IN_SERVICE ||
                             mAutoAttachOnCreation) &&
                     (subscriptionFromNv ||
-                            (r != null && r.getRecordsLoaded())) &&
+                            mCdmaPhone.mIccRecords.getRecordsLoaded()) &&
                     (mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed() ||
                             mPhone.getState() == Phone.State.IDLE) &&
                     !roaming &&
@@ -244,7 +241,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
                 reason += " - psState= " + psState;
             }
             if (!subscriptionFromNv &&
-                    !(r != null && r.getRecordsLoaded())) {
+                    !mCdmaPhone.mIccRecords.getRecordsLoaded()) {
                 reason += " - RUIM not loaded";
             }
             if (!(mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed() ||
@@ -1009,33 +1006,6 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
     }
 
     @Override
-    protected void onUpdateIcc() {
-        if (mUiccController == null ) {
-            return;
-        }
-
-        IccCard newIccCard = mUiccController.getIccCard();
-        IccRecords newIccRecords = null;
-        if (newIccCard != null) {
-            newIccRecords = newIccCard.getIccRecords();
-        }
-
-        IccRecords r = mIccRecords.get();
-        if (r != newIccRecords) {
-            if (r != null) {
-                log("Removing stale icc objects.");
-                r.unregisterForRecordsLoaded(this);
-                mIccRecords.set(null);
-            }
-            if (newIccCard != null) {
-                log("New card found");
-                mIccRecords.set(newIccRecords);
-                newIccRecords.registerForRecordsLoaded(this, EVENT_RECORDS_LOADED, null);
-            }
-        }
-    }
-
-    @Override
     public boolean isDisconnected() {
         return ((mState == State.IDLE) || (mState == State.FAILED));
     }
index 9a82f57..ff7a081 100644 (file)
@@ -65,7 +65,7 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker {
             handlePollStateResult(msg.what, ar);
             break;
         case EVENT_RUIM_RECORDS_LOADED:
-            CdmaLteUiccRecords sim = (CdmaLteUiccRecords)mIccRecords;
+            CdmaLteUiccRecords sim = (CdmaLteUiccRecords)phone.mIccRecords;
             if ((sim != null) && sim.isProvisioned()) {
                 mMdn = sim.getMdn();
                 mMin = sim.getMin();
@@ -353,18 +353,16 @@ public class CdmaLteServiceStateTracker extends CdmaServiceStateTracker {
                 ss.setOperatorAlphaLong(eriText);
             }
 
-            if (mIccCard != null && mIccCard.getState() == IccCard.State.READY &&
-                    mIccRecords != null) {
+            if (phone.getIccCard().getState() == IccCard.State.READY) {
                 // SIM is found on the device. If ERI roaming is OFF, and SID/NID matches
                 // one configfured in SIM, use operator name  from CSIM record.
                 boolean showSpn =
-                    ((CdmaLteUiccRecords)mIccRecords).getCsimSpnDisplayCondition();
+                    ((CdmaLteUiccRecords)phone.mIccRecords).getCsimSpnDisplayCondition();
                 int iconIndex = ss.getCdmaEriIconIndex();
 
                 if (showSpn && (iconIndex == EriInfo.ROAMING_INDICATOR_OFF) &&
-                    isInHomeSidNid(ss.getSystemId(), ss.getNetworkId()) &&
-                    mIccRecords != null) {
-                    ss.setOperatorAlphaLong(mIccRecords.getServiceProviderName());
+                    isInHomeSidNid(ss.getSystemId(), ss.getNetworkId())) {
+                    ss.setOperatorAlphaLong(phone.mIccRecords.getServiceProviderName());
                 }
             }
 
index 16ff70e..b694e0a 100755 (executable)
@@ -115,6 +115,12 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
     long mSavedTime;
     long mSavedAtTime;
 
+    /**
+     * We can't register for SIM_RECORDS_LOADED immediately because the
+     * SIMRecords object may not be instantiated yet.
+     */
+    private boolean mNeedToRegForRuimLoaded = false;
+
     /** Wake lock used while setting time of day. */
     private PowerManager.WakeLock mWakeLock;
     private static final String WAKELOCK_TAG = "ServiceStateTracker";
@@ -156,10 +162,11 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
     };
 
     public CdmaServiceStateTracker(CDMAPhone phone) {
-        super(phone, phone.mCM);
+        super();
 
         this.phone = phone;
         cr = phone.getContext().getContentResolver();
+        cm = phone.mCM;
         ss = new ServiceState();
         newSS = new ServiceState();
         cellLoc = new CdmaCellLocation();
@@ -196,17 +203,18 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
             Settings.System.getUriFor(Settings.System.AUTO_TIME_ZONE), true,
             mAutoTimeZoneObserver);
         setSignalStrengthDefaultValues();
+
+        mNeedToRegForRuimLoaded = true;
     }
 
     public void dispose() {
-        checkCorrectThread();
         // Unregister for all events.
         cm.unregisterForRadioStateChanged(this);
         cm.unregisterForVoiceNetworkStateChanged(this);
+        phone.getIccCard().unregisterForReady(this);
         cm.unregisterForCdmaOtaProvision(this);
         phone.unregisterForEriFileLoaded(this);
-        if (mIccCard != null) {mIccCard.unregisterForReady(this);}
-        if (mIccRecords != null) {mIccRecords.unregisterForRecordsLoaded(this);}
+        phone.mIccRecords.unregisterForRecordsLoaded(this);
         cm.unSetOnSignalStrengthUpdate(this);
         cm.unSetOnNITZTime(this);
         cr.unregisterContentObserver(mAutoTimeObserver);
@@ -277,6 +285,14 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
         case EVENT_RUIM_READY:
             // TODO: Consider calling setCurrentPreferredNetworkType as we do in GsmSST.
             // cm.setCurrentPreferredNetworkType();
+
+            // The RUIM is now ready i.e if it was locked it has been
+            // unlocked. At this stage, the radio is already powered on.
+            if (mNeedToRegForRuimLoaded) {
+                phone.mIccRecords.registerForRecordsLoaded(this,
+                        EVENT_RUIM_RECORDS_LOADED, null);
+                mNeedToRegForRuimLoaded = false;
+            }
             if (DBG) log("Receive EVENT_RUIM_READY and Send Request getCDMASubscription.");
             getSubscriptionInfoAndStartPollingThreads();
             phone.prepareEri();
@@ -389,16 +405,8 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
                     mIsMinInfoReady = true;
 
                     updateOtaspState();
-                    if (mIccCard != null) {
-                        if (DBG) log("GET_CDMA_SUBSCRIPTION broadcast Icc state changed");
-                        mIccCard.broadcastIccStateChangedIntent(IccCard.INTENT_VALUE_ICC_IMSI,
-                                null);
-                    } else {
-                        if (DBG) {
-                            log("GET_CDMA_SUBSCRIPTION mIccCard is null (probably NV type device)" +
-                                    " can't broadcast Icc state changed");
-                        }
-                    }
+                    phone.getIccCard().broadcastIccStateChangedIntent(IccCard.INTENT_VALUE_ICC_IMSI,
+                            null);
                 } else {
                     if (DBG) {
                         log("GET_CDMA_SUBSCRIPTION: error parsing cdmaSubscription params num="
@@ -490,6 +498,8 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
         if (!isSubscriptionFromRuim) {
             // NV is ready when subscription source is NV
             sendMessage(obtainMessage(EVENT_NV_READY));
+        } else {
+            phone.getIccCard().registerForReady(this, EVENT_RUIM_READY, null);
         }
     }
 
@@ -1685,38 +1695,6 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
     }
 
     @Override
-    protected void onUpdateIccAvailability() {
-        if (mUiccController == null ) {
-            return;
-        }
-
-        IccCard newIccCard = mUiccController.getIccCard();
-
-        if (mIccCard != newIccCard) {
-            if (mIccCard != null) {
-                log("Removing stale icc objects.");
-                mIccCard.unregisterForReady(this);
-                if (mIccRecords != null) {
-                    mIccRecords.unregisterForRecordsLoaded(this);
-                }
-                mIccRecords = null;
-                mIccCard = null;
-            }
-            if (newIccCard != null) {
-                log("New card found");
-                mIccCard = newIccCard;
-                mIccRecords = mIccCard.getIccRecords();
-                if (isSubscriptionFromRuim) {
-                    mIccCard.registerForReady(this, EVENT_RUIM_READY, null);
-                    if (mIccRecords != null) {
-                        mIccRecords.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null);
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
     protected void log(String s) {
         Log.d(LOG_TAG, "[CdmaSST] " + s);
     }
@@ -1749,6 +1727,7 @@ public class CdmaServiceStateTracker extends ServiceStateTracker {
         pw.println(" mSavedTimeZone=" + mSavedTimeZone);
         pw.println(" mSavedTime=" + mSavedTime);
         pw.println(" mSavedAtTime=" + mSavedAtTime);
+        pw.println(" mNeedToRegForRuimLoaded=" + mNeedToRegForRuimLoaded);
         pw.println(" mWakeLock=" + mWakeLock);
         pw.println(" mCurPlmn=" + mCurPlmn);
         pw.println(" mMdn=" + mMdn);
index e919245..04ee2dd 100644 (file)
@@ -21,7 +21,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import android.os.Message;
 import android.util.Log;
 
-import com.android.internal.telephony.IccFileHandler;
 import com.android.internal.telephony.IccPhoneBookInterfaceManager;
 
 /**
@@ -35,6 +34,7 @@ public class RuimPhoneBookInterfaceManager extends IccPhoneBookInterfaceManager
 
     public RuimPhoneBookInterfaceManager(CDMAPhone phone) {
         super(phone);
+        adnCache = phone.mIccRecords.getAdnCache();
         //NOTE service "simphonebook" added by IccSmsInterfaceManagerProxy
     }
 
@@ -61,12 +61,8 @@ public class RuimPhoneBookInterfaceManager extends IccPhoneBookInterfaceManager
             AtomicBoolean status = new AtomicBoolean(false);
             Message response = mBaseHandler.obtainMessage(EVENT_GET_SIZE_DONE, status);
 
-            IccFileHandler fh = phone.getIccFileHandler();
-            //IccFileHandler can be null if there is no icc card present.
-            if (fh != null) {
-                fh.getEFLinearRecordSize(efid, response);
-                waitForResult(status);
-            }
+            phone.getIccFileHandler().getEFLinearRecordSize(efid, response);
+            waitForResult(status);
         }
 
         return recordSize;
index 80183c6..2fefa3f 100755 (executable)
@@ -199,7 +199,7 @@ public final class RuimRecords extends IccRecords {
 
         boolean isRecordLoadResponse = false;
 
-        if (mDestroyed.get()) {
+        if (mDestroyed) {
             loge("Received message " + msg +
                     "[" + msg.what + "] while being destroyed. Ignoring.");
             return;
@@ -317,20 +317,18 @@ public final class RuimRecords extends IccRecords {
         // One record loaded successfully or failed, In either case
         // we need to update the recordsToLoad count
         recordsToLoad -= 1;
-        if (DBG) log("onRecordLoaded " + recordsToLoad + " requested: " + recordsRequested);
+        if (DBG) log("RuimRecords:onRecordLoaded " + recordsToLoad + " requested: " + recordsRequested);
 
         if (recordsToLoad == 0 && recordsRequested == true) {
             onAllRecordsLoaded();
         } else if (recordsToLoad < 0) {
-            loge("recordsToLoad <0, programmer error suspected");
+            loge("RuimRecords: recordsToLoad <0, programmer error suspected");
             recordsToLoad = 0;
         }
     }
 
     @Override
     protected void onAllRecordsLoaded() {
-        if (DBG) log("record load complete");
-
         // Further records that can be inserted are Operator/OEM dependent
 
         String operator = getRUIMOperatorNumeric();
@@ -350,6 +348,13 @@ public final class RuimRecords extends IccRecords {
 
     @Override
     public void onReady() {
+        /* broadcast intent ICC_READY here so that we can make sure
+          READY is sent before IMSI ready
+        */
+
+        mParentCard.broadcastIccStateChangedIntent(
+                IccCard.INTENT_VALUE_ICC_READY, null);
+
         fetchRuimRecords();
 
         mCi.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE));
@@ -359,7 +364,7 @@ public final class RuimRecords extends IccRecords {
     private void fetchRuimRecords() {
         recordsRequested = true;
 
-        if (DBG) log("fetchRuimRecords " + recordsToLoad);
+        Log.v(LOG_TAG, "RuimRecords:fetchRuimRecords " + recordsToLoad);
 
         mCi.getIMSI(obtainMessage(EVENT_GET_IMSI_DONE));
         recordsToLoad++;
@@ -368,7 +373,7 @@ public final class RuimRecords extends IccRecords {
                 obtainMessage(EVENT_GET_ICCID_DONE));
         recordsToLoad++;
 
-        if (DBG) log("fetchRuimRecords " + recordsToLoad + " requested: " + recordsRequested);
+        log("RuimRecords:fetchRuimRecords " + recordsToLoad + " requested: " + recordsRequested);
         // Further records that can be inserted are Operator/OEM dependent
     }
 
index 8dda74b..6e9cd51 100644 (file)
@@ -59,7 +59,6 @@ import com.android.internal.telephony.Connection;
 import com.android.internal.telephony.IccCard;
 import com.android.internal.telephony.IccFileHandler;
 import com.android.internal.telephony.IccPhoneBookInterfaceManager;
-import com.android.internal.telephony.IccRecords;
 import com.android.internal.telephony.IccSmsInterfaceManager;
 import com.android.internal.telephony.MmiCode;
 import com.android.internal.telephony.OperatorInfo;
@@ -138,11 +137,13 @@ public class GSMPhone extends PhoneBase {
         if (ci instanceof SimulatedRadioControl) {
             mSimulatedRadioControl = (SimulatedRadioControl) ci;
         }
+
         mCM.setPhoneType(Phone.PHONE_TYPE_GSM);
+        mIccCard.set(UiccController.getInstance(this).getIccCard());
+        mIccRecords = mIccCard.get().getIccRecords();
         mCT = new GsmCallTracker(this);
         mSST = new GsmServiceStateTracker (this);
         mSMS = new GsmSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);
-
         mDataConnectionTracker = new GsmDataConnectionTracker (this);
         if (!unitTestMode) {
             mSimPhoneBookIntManager = new SimPhoneBookInterfaceManager(this);
@@ -151,6 +152,7 @@ public class GSMPhone extends PhoneBase {
         }
 
         mCM.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null);
+        registerForSimRecordEvents();
         mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
         mCM.registerForOn(this, EVENT_RADIO_ON, null);
         mCM.setOnUSSD(this, EVENT_USSD, null);
@@ -794,8 +796,7 @@ public class GSMPhone extends PhoneBase {
 
     public String getVoiceMailNumber() {
         // Read from the SIM. If its null, try reading from the shared preference area.
-        IccRecords r = mIccRecords.get();
-        String number = (r != null) ? r.getVoiceMailNumber() : "";
+        String number = mIccRecords.getVoiceMailNumber();
         if (TextUtils.isEmpty(number)) {
             SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext());
             number = sp.getString(VM_NUMBER, null);
@@ -817,9 +818,8 @@ public class GSMPhone extends PhoneBase {
 
     public String getVoiceMailAlphaTag() {
         String ret;
-        IccRecords r = mIccRecords.get();
 
-        ret = (r != null) ? r.getVoiceMailAlphaTag() : "";
+        ret = mIccRecords.getVoiceMailAlphaTag();
 
         if (ret == null || ret.length() == 0) {
             return mContext.getText(
@@ -852,31 +852,24 @@ public class GSMPhone extends PhoneBase {
     }
 
     public String getSubscriberId() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getIMSI() : "";
+        return mIccRecords.getIMSI();
     }
 
     public String getLine1Number() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getMsisdnNumber() : "";
+        return mIccRecords.getMsisdnNumber();
     }
 
     @Override
     public String getMsisdn() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getMsisdnNumber() : "";
+        return mIccRecords.getMsisdnNumber();
     }
 
     public String getLine1AlphaTag() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.getMsisdnAlphaTag() : "";
+        return mIccRecords.getMsisdnAlphaTag();
     }
 
     public void setLine1Number(String alphaTag, String number, Message onComplete) {
-        IccRecords r = mIccRecords.get();
-        if (r != null) {
-            r.setMsisdnNumber(alphaTag, number, onComplete);
-        }
+        mIccRecords.setMsisdnNumber(alphaTag, number, onComplete);
     }
 
     public void setVoiceMailNumber(String alphaTag,
@@ -886,10 +879,7 @@ public class GSMPhone extends PhoneBase {
         Message resp;
         mVmNumber = voiceMailNumber;
         resp = obtainMessage(EVENT_SET_VM_NUMBER_DONE, 0, 0, onComplete);
-        IccRecords r = mIccRecords.get();
-        if (r != null) {
-            r.setVoiceMailNumber(alphaTag, mVmNumber, resp);
-        }
+        mIccRecords.setVoiceMailNumber(alphaTag, mVmNumber, resp);
     }
 
     private boolean isValidCommandInterfaceCFReason (int commandInterfaceCFReason) {
@@ -1257,9 +1247,8 @@ public class GSMPhone extends PhoneBase {
 
             case EVENT_SET_CALL_FORWARD_DONE:
                 ar = (AsyncResult)msg.obj;
-                IccRecords r = mIccRecords.get();
-                if (ar.exception == null && r != null) {
-                    r.setVoiceCallForwardingFlag(1, msg.arg1 == 1);
+                if (ar.exception == null) {
+                    mIccRecords.setVoiceCallForwardingFlag(1, msg.arg1 == 1);
                 }
                 onComplete = (Message) ar.userObj;
                 if (onComplete != null) {
@@ -1332,41 +1321,12 @@ public class GSMPhone extends PhoneBase {
         }
     }
 
-    @Override
-    protected void onUpdateIccAvailability() {
-        if (mUiccController == null ) {
-            return;
-        }
-
-        IccCard newIccCard = mUiccController.getIccCard();
-
-        IccCard c = mIccCard.get();
-        if (c != newIccCard) {
-            if (c != null) {
-                if (LOCAL_DEBUG) log("Removing stale icc objects.");
-                if (mIccRecords.get() != null) {
-                    unregisterForSimRecordEvents();
-                    mSimPhoneBookIntManager.updateIccRecords(null);
-                }
-                mIccRecords.set(null);
-                mIccCard.set(null);
-            }
-            if (newIccCard != null) {
-                if (LOCAL_DEBUG) log("New card found");
-                mIccCard.set(newIccCard);
-                mIccRecords.set(newIccCard.getIccRecords());
-                registerForSimRecordEvents();
-                mSimPhoneBookIntManager.updateIccRecords(mIccRecords.get());
-            }
-        }
-    }
-
     private void processIccRecordEvents(int eventCode) {
         switch (eventCode) {
-            case IccRecords.EVENT_CFI:
+            case SIMRecords.EVENT_CFI:
                 notifyCallForwardingIndicator();
                 break;
-            case IccRecords.EVENT_MWI:
+            case SIMRecords.EVENT_MWI:
                 notifyMessageWaitingIndicator();
                 break;
         }
@@ -1378,12 +1338,11 @@ public class GSMPhone extends PhoneBase {
      * @return true for success; false otherwise.
      */
     boolean updateCurrentCarrierInProvider() {
-        IccRecords r = mIccRecords.get();
-        if (r != null) {
+        if (mIccRecords != null) {
             try {
                 Uri uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "current");
                 ContentValues map = new ContentValues();
-                map.put(Telephony.Carriers.NUMERIC, r.getOperatorNumeric());
+                map.put(Telephony.Carriers.NUMERIC, mIccRecords.getOperatorNumeric());
                 mContext.getContentResolver().insert(uri, map);
                 return true;
             } catch (SQLException e) {
@@ -1445,19 +1404,16 @@ public class GSMPhone extends PhoneBase {
     }
 
     private void handleCfuQueryResult(CallForwardInfo[] infos) {
-        IccRecords r = mIccRecords.get();
-        if (r != null) {
-            if (infos == null || infos.length == 0) {
-                // Assume the default is not active
-                // Set unconditional CFF in SIM to false
-                r.setVoiceCallForwardingFlag(1, false);
-            } else {
-                for (int i = 0, s = infos.length; i < s; i++) {
-                    if ((infos[i].serviceClass & SERVICE_CLASS_VOICE) != 0) {
-                        r.setVoiceCallForwardingFlag(1, (infos[i].status == 1));
-                        // should only have the one
-                        break;
-                    }
+        if (infos == null || infos.length == 0) {
+            // Assume the default is not active
+            // Set unconditional CFF in SIM to false
+            mIccRecords.setVoiceCallForwardingFlag(1, false);
+        } else {
+            for (int i = 0, s = infos.length; i < s; i++) {
+                if ((infos[i].serviceClass & SERVICE_CLASS_VOICE) != 0) {
+                    mIccRecords.setVoiceCallForwardingFlag(1, (infos[i].status == 1));
+                    // should only have the one
+                    break;
                 }
             }
         }
@@ -1516,35 +1472,22 @@ public class GSMPhone extends PhoneBase {
     }
 
     public boolean isCspPlmnEnabled() {
-        IccRecords r = mIccRecords.get();
-        return (r != null) ? r.isCspPlmnEnabled() : false;
+        return mIccRecords.isCspPlmnEnabled();
     }
 
     private void registerForSimRecordEvents() {
-        IccRecords r = mIccRecords.get();
-        if (r == null) {
-            return;
-        }
-        r.registerForNetworkSelectionModeAutomatic(
+        mIccRecords.registerForNetworkSelectionModeAutomatic(
                 this, EVENT_SET_NETWORK_AUTOMATIC, null);
-        r.registerForNewSms(this, EVENT_NEW_ICC_SMS, null);
-        r.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null);
-        r.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null);
+        mIccRecords.registerForNewSms(this, EVENT_NEW_ICC_SMS, null);
+        mIccRecords.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null);
+        mIccRecords.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null);
     }
 
     private void unregisterForSimRecordEvents() {
-        IccRecords r = mIccRecords.get();
-        if (r == null) {
-            return;
-        }
-        r.unregisterForNetworkSelectionModeAutomatic(this);
-        r.unregisterForNewSms(this);
-        r.unregisterForRecordsEvents(this);
-        r.unregisterForRecordsLoaded(this);
-    }
-
-    protected void log(String s) {
-            Log.d(LOG_TAG, "[GSMPhone] " + s);
+        mIccRecords.unregisterForNetworkSelectionModeAutomatic(this);
+        mIccRecords.unregisterForNewSms(this);
+        mIccRecords.unregisterForRecordsEvents(this);
+        mIccRecords.unregisterForRecordsLoaded(this);
     }
 
     @Override
index b44ba0b..40ee58c 100644 (file)
@@ -59,8 +59,6 @@ import com.android.internal.telephony.DataConnection.UpdateLinkPropertyResult;
 import com.android.internal.telephony.DataConnectionAc;
 import com.android.internal.telephony.DataConnectionTracker;
 import com.android.internal.telephony.EventLogTags;
-import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.IccRecords;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneBase;
 import com.android.internal.telephony.RILConstants;
@@ -180,6 +178,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
 
         p.mCM.registerForAvailable (this, EVENT_RADIO_AVAILABLE, null);
         p.mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null);
+        p.mIccRecords.registerForRecordsLoaded(this, EVENT_RECORDS_LOADED, null);
         p.mCM.registerForDataNetworkStateChanged (this, EVENT_DATA_STATE_CHANGED, null);
         p.getCallTracker().registerForVoiceCallEnded (this, EVENT_VOICE_CALL_ENDED, null);
         p.getCallTracker().registerForVoiceCallStarted (this, EVENT_VOICE_CALL_STARTED, null);
@@ -220,8 +219,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
         //Unregister for all events
         mPhone.mCM.unregisterForAvailable(this);
         mPhone.mCM.unregisterForOffOrNotAvailable(this);
-        IccRecords r = mIccRecords.get();
-        if (r != null) { r.unregisterForRecordsLoaded(this);}
+        mPhone.mIccRecords.unregisterForRecordsLoaded(this);
         mPhone.mCM.unregisterForDataNetworkStateChanged(this);
         mPhone.getCallTracker().unregisterForVoiceCallEnded(this);
         mPhone.getCallTracker().unregisterForVoiceCallStarted(this);
@@ -622,12 +620,10 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
 
         int gprsState = mPhone.getServiceStateTracker().getCurrentDataConnectionState();
         boolean desiredPowerState = mPhone.getServiceStateTracker().getDesiredPowerState();
-        IccRecords r = mIccRecords.get();
-        boolean recordsLoaded = (r != null) ? r.getRecordsLoaded() : false;
 
         boolean allowed =
                     (gprsState == ServiceState.STATE_IN_SERVICE || mAutoAttachOnCreation) &&
-                    recordsLoaded &&
+                    mPhone.mIccRecords.getRecordsLoaded() &&
                     (mPhone.getState() == Phone.State.IDLE ||
                      mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) &&
                     internalDataEnabled &&
@@ -639,7 +635,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
             if (!((gprsState == ServiceState.STATE_IN_SERVICE) || mAutoAttachOnCreation)) {
                 reason += " - gprs= " + gprsState;
             }
-            if (!recordsLoaded) reason += " - SIM not loaded";
+            if (!mPhone.mIccRecords.getRecordsLoaded()) reason += " - SIM not loaded";
             if (mPhone.getState() != Phone.State.IDLE &&
                     !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) {
                 reason += " - PhoneState= " + mPhone.getState();
@@ -1900,8 +1896,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
             log("onRadioAvailable: We're on the simulator; assuming data is connected");
         }
 
-        IccRecords r = mIccRecords.get();
-        if (r != null && r.getRecordsLoaded()) {
+        if (mPhone.mIccRecords.getRecordsLoaded()) {
             notifyOffApnsOfAvailability(null);
         }
 
@@ -2213,8 +2208,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
      */
     private void createAllApnList() {
         mAllApns = new ArrayList<ApnSetting>();
-        IccRecords r = mIccRecords.get();
-        String operator = (r != null) ? r.getOperatorNumeric() : "";
+        String operator = mPhone.mIccRecords.getOperatorNumeric();
         if (operator != null) {
             String selection = "numeric = '" + operator + "'";
             // query only enabled apn.
@@ -2325,9 +2319,8 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
             }
         }
 
-        IccRecords r = mIccRecords.get();
-        String operator = (r != null) ? r.getOperatorNumeric() : "";
-        int radioTech = mPhone.getServiceState().getRadioTechnology();
+        String operator = mPhone.mIccRecords.getOperatorNumeric();
+        int networkType = mPhone.getServiceState().getNetworkType();
 
         if (requestedApnType.equals(Phone.APN_TYPE_DEFAULT)) {
             if (canSetPreferApn && mPreferredApn != null) {
@@ -2336,7 +2329,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
                         + mPreferredApn.numeric + ":" + mPreferredApn);
                 }
                 if (mPreferredApn.numeric.equals(operator)) {
-                    if (mPreferredApn.bearer == 0 || mPreferredApn.bearer == radioTech) {
+                    if (mPreferredApn.bearer == 0 || mPreferredApn.bearer == networkType) {
                         apnList.add(mPreferredApn);
                         if (DBG) log("buildWaitingApns: X added preferred apnList=" + apnList);
                         return apnList;
@@ -2355,7 +2348,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
         if (mAllApns != null) {
             for (ApnSetting apn : mAllApns) {
                 if (apn.canHandleType(requestedApnType)) {
-                    if (apn.bearer == 0 || apn.bearer == radioTech) {
+                    if (apn.bearer == 0 || apn.bearer == networkType) {
                         if (DBG) log("apn info : " +apn.toString());
                         apnList.add(apn);
                     }
@@ -2563,33 +2556,6 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
     }
 
     @Override
-    protected void onUpdateIcc() {
-        if (mUiccController == null ) {
-            return;
-        }
-
-        IccCard newIccCard = mUiccController.getIccCard();
-        IccRecords newIccRecords = null;
-        if (newIccCard != null) {
-            newIccRecords = newIccCard.getIccRecords();
-        }
-
-        IccRecords r = mIccRecords.get();
-        if (r != newIccRecords) {
-            if (r != null) {
-                log("Removing stale icc objects.");
-                r.unregisterForRecordsLoaded(this);
-                mIccRecords.set(null);
-            }
-            if (newIccCard != null) {
-                log("New card found");
-                mIccRecords.set(newIccRecords);
-                newIccRecords.registerForRecordsLoaded(this, EVENT_RECORDS_LOADED, null);
-            }
-        }
-    }
-
-    @Override
     protected void log(String s) {
         Log.d(LOG_TAG, "[GsmDCT] "+ s);
     }
index 9e34b6a..9b3d5cd 100644 (file)
@@ -885,10 +885,7 @@ public final class GsmMmiCode extends Handler implements MmiCode {
                 */
                 if ((ar.exception == null) && (msg.arg1 == 1)) {
                     boolean cffEnabled = (msg.arg2 == 1);
-                    IccRecords r = phone.mIccRecords.get();
-                    if (r != null) {
-                        r.setVoiceCallForwardingFlag(1, cffEnabled);
-                    }
+                    phone.mIccRecords.setVoiceCallForwardingFlag(1, cffEnabled);
                 }
 
                 onSetComplete(ar);
@@ -1206,10 +1203,7 @@ public final class GsmMmiCode extends Handler implements MmiCode {
                 (info.serviceClass & serviceClassMask)
                         == CommandsInterface.SERVICE_CLASS_VOICE) {
             boolean cffEnabled = (info.status == 1);
-            IccRecords r = phone.mIccRecords.get();
-            if (r != null) {
-                r.setVoiceCallForwardingFlag(1, cffEnabled);
-            }
+            phone.mIccRecords.setVoiceCallForwardingFlag(1, cffEnabled);
         }
 
         return TextUtils.replace(template, sources, destinations);
@@ -1234,10 +1228,7 @@ public final class GsmMmiCode extends Handler implements MmiCode {
                 sb.append(context.getText(com.android.internal.R.string.serviceDisabled));
 
                 // Set unconditional CFF in SIM to false
-                IccRecords r = phone.mIccRecords.get();
-                if (r != null) {
-                    r.setVoiceCallForwardingFlag(1, false);
-                }
+                phone.mIccRecords.setVoiceCallForwardingFlag(1, false);
             } else {
 
                 SpannableStringBuilder tb = new SpannableStringBuilder();
index 7c03d03..c0acf5b 100644 (file)
@@ -124,6 +124,12 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
     long mSavedTime;
     long mSavedAtTime;
 
+    /**
+     * We can't register for SIM_RECORDS_LOADED immediately because the
+     * SIMRecords object may not be instantiated yet.
+     */
+    private boolean mNeedToRegForSimLoaded;
+
     /** Started the recheck process after finding gprs should registered but not. */
     private boolean mStartedGprsRegCheck = false;
 
@@ -186,9 +192,10 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
     };
 
     public GsmServiceStateTracker(GSMPhone phone) {
-        super(phone, phone.mCM);
+        super();
 
         this.phone = phone;
+        cm = phone.mCM;
         ss = new ServiceState();
         newSS = new ServiceState();
         cellLoc = new GsmCellLocation();
@@ -206,6 +213,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
         cm.setOnNITZTime(this, EVENT_NITZ_TIME, null);
         cm.setOnSignalStrengthUpdate(this, EVENT_SIGNAL_STRENGTH_UPDATE, null);
         cm.setOnRestrictedStateChanged(this, EVENT_RESTRICTED_STATE_CHANGED, null);
+        phone.getIccCard().registerForReady(this, EVENT_SIM_READY, null);
 
         // system setting property AIRPLANE_MODE_ON is set in Settings.
         int airplaneMode = Settings.System.getInt(
@@ -222,6 +230,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
                 mAutoTimeZoneObserver);
 
         setSignalStrengthDefaultValues();
+        mNeedToRegForSimLoaded = true;
 
         // Monitor locale change
         IntentFilter filter = new IntentFilter();
@@ -233,13 +242,12 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
     }
 
     public void dispose() {
-        checkCorrectThread();
         // Unregister for all events.
         cm.unregisterForAvailable(this);
         cm.unregisterForRadioStateChanged(this);
         cm.unregisterForVoiceNetworkStateChanged(this);
-        if (mIccCard != null) {mIccCard.unregisterForReady(this);}
-        if (mIccRecords != null) {mIccRecords.unregisterForRecordsLoaded(this);}
+        phone.getIccCard().unregisterForReady(this);
+        phone.mIccRecords.unregisterForRecordsLoaded(this);
         cm.unSetOnSignalStrengthUpdate(this);
         cm.unSetOnRestrictedStateChanged(this);
         cm.unSetOnNITZTime(this);
@@ -277,6 +285,15 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
                 // Set the network type, in case the radio does not restore it.
                 cm.setCurrentPreferredNetworkType();
 
+                // The SIM is now ready i.e if it was locked
+                // it has been unlocked. At this stage, the radio is already
+                // powered on.
+                if (mNeedToRegForSimLoaded) {
+                    phone.mIccRecords.registerForRecordsLoaded(this,
+                            EVENT_SIM_RECORDS_LOADED, null);
+                    mNeedToRegForSimLoaded = false;
+                }
+
                 boolean skipRestoringSelection = phone.getContext().getResources().getBoolean(
                         com.android.internal.R.bool.skip_restoring_network_selection);
 
@@ -478,11 +495,8 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
     }
 
     protected void updateSpnDisplay() {
-        if (mIccRecords == null) {
-            return;
-        }
-        int rule = mIccRecords.getDisplayRule(ss.getOperatorNumeric());
-        String spn = mIccRecords.getServiceProviderName();
+        int rule = phone.mIccRecords.getDisplayRule(ss.getOperatorNumeric());
+        String spn = phone.mIccRecords.getServiceProviderName();
         String plmn = ss.getOperatorAlphaLong();
 
         // For emergency calls only, pass the EmergencyCallsOnly string via EXTRA_PLMN
@@ -1131,7 +1145,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
                     ((state & RILConstants.RIL_RESTRICTED_STATE_CS_EMERGENCY) != 0) ||
                     ((state & RILConstants.RIL_RESTRICTED_STATE_CS_ALL) != 0) );
             //ignore the normal call and data restricted state before SIM READY
-            if (mIccCard.getState() == IccCard.State.READY) {
+            if (phone.getIccCard().getState() == IccCard.State.READY) {
                 newRs.setCsNormalRestricted(
                         ((state & RILConstants.RIL_RESTRICTED_STATE_CS_NORMAL) != 0) ||
                         ((state & RILConstants.RIL_RESTRICTED_STATE_CS_ALL) != 0) );
@@ -1658,35 +1672,6 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
     }
 
     @Override
-    protected void onUpdateIccAvailability() {
-        if (mUiccController == null ) {
-            return;
-        }
-
-        IccCard newIccCard = mUiccController.getIccCard();
-
-        if (mIccCard != newIccCard) {
-            if (mIccCard != null) {
-                log("Removing stale icc objects.");
-                mIccCard.unregisterForReady(this);
-                if (mIccRecords != null) {
-                    mIccRecords.unregisterForRecordsLoaded(this);
-                }
-                mIccRecords = null;
-                mIccCard = null;
-            }
-            if (newIccCard != null) {
-                log("New card found");
-                mIccCard = newIccCard;
-                mIccRecords = mIccCard.getIccRecords();
-                mIccCard.registerForReady(this, EVENT_SIM_READY, null);
-                if (mIccRecords != null) {
-                    mIccRecords.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null);
-                }
-            }
-        }
-    }
-    @Override
     protected void log(String s) {
         Log.d(LOG_TAG, "[GsmSST] " + s);
     }
@@ -1726,6 +1711,7 @@ final class GsmServiceStateTracker extends ServiceStateTracker {
         pw.println(" mSavedTimeZone=" + mSavedTimeZone);
         pw.println(" mSavedTime=" + mSavedTime);
         pw.println(" mSavedAtTime=" + mSavedAtTime);
+        pw.println(" mNeedToRegForSimLoaded=" + mNeedToRegForSimLoaded);
         pw.println(" mStartedGprsRegCheck=" + mStartedGprsRegCheck);
         pw.println(" mReportedGprsNoReg=" + mReportedGprsNoReg);
         pw.println(" mNotification=" + mNotification);
index 3077995..80988fd 100755 (executable)
@@ -521,7 +521,7 @@ public class SIMRecords extends IccRecords {
 
         boolean isRecordLoadResponse = false;
 
-        if (mDestroyed.get()) {
+        if (mDestroyed) {
             loge("Received message " + msg + "[" + msg.what + "] " +
                     " while being destroyed. Ignoring.");
             return;
@@ -1299,6 +1299,12 @@ public class SIMRecords extends IccRecords {
 
     @Override
     public void onReady() {
+        /* broadcast intent SIM_READY here so that we can make sure
+          READY is sent before IMSI ready
+        */
+        mParentCard.broadcastIccStateChangedIntent(
+                IccCard.INTENT_VALUE_ICC_READY, null);
+
         fetchSimRecords();
     }
 
index 37f9a4f..35ba0d1 100644 (file)
@@ -21,7 +21,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import android.os.Message;
 import android.util.Log;
 
-import com.android.internal.telephony.IccFileHandler;
 import com.android.internal.telephony.IccPhoneBookInterfaceManager;
 
 /**
@@ -35,6 +34,7 @@ public class SimPhoneBookInterfaceManager extends IccPhoneBookInterfaceManager {
 
     public SimPhoneBookInterfaceManager(GSMPhone phone) {
         super(phone);
+        adnCache = phone.mIccRecords.getAdnCache();
         //NOTE service "simphonebook" added by IccSmsInterfaceManagerProxy
     }
 
@@ -61,11 +61,8 @@ public class SimPhoneBookInterfaceManager extends IccPhoneBookInterfaceManager {
             AtomicBoolean status = new AtomicBoolean(false);
             Message response = mBaseHandler.obtainMessage(EVENT_GET_SIZE_DONE, status);
 
-            IccFileHandler fh = phone.getIccFileHandler();
-            if (fh != null) {
-                fh.getEFLinearRecordSize(efid, response);
-                waitForResult(status);
-            }
+            phone.getIccFileHandler().getEFLinearRecordSize(efid, response);
+            waitForResult(status);
         }
 
         return recordSize;
index 0243522..5c4b446 100755 (executable)
@@ -461,8 +461,4 @@ abstract class SipPhoneBase extends PhoneBase {
             notifyPhoneStateChanged();
         }
     }
-
-    @Override
-    protected void onUpdateIccAvailability() {
-    }
 }
index 4e12d6d..5961efd 100644 (file)
 
 package com.android.internal.telephony.uicc;
 
-import com.android.internal.telephony.CommandsInterface;
 import com.android.internal.telephony.IccCard;
-import com.android.internal.telephony.IccCardStatus;
-import com.android.internal.telephony.IccCardStatus.CardState;
 import com.android.internal.telephony.PhoneBase;
+import com.android.internal.telephony.cdma.CDMALTEPhone;
+import com.android.internal.telephony.cdma.CDMAPhone;
+import com.android.internal.telephony.gsm.GSMPhone;
 
-import android.os.AsyncResult;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Registrant;
-import android.os.RegistrantList;
 import android.util.Log;
 
 /* This class is responsible for keeping all knowledge about
  * ICCs in the system. It is also used as API to get appropriate
  * applications to pass them to phone and service trackers.
  */
-public class UiccController extends Handler {
+public class UiccController {
     private static final boolean DBG = true;
     private static final String LOG_TAG = "RIL_UiccController";
 
-    private static final int EVENT_ICC_STATUS_CHANGED = 1;
-    private static final int EVENT_GET_ICC_STATUS_DONE = 2;
-
     private static UiccController mInstance;
 
     private PhoneBase mCurrentPhone;
-    private CommandsInterface mCi;
+    private boolean mIsCurrentCard3gpp;
     private IccCard mIccCard;
-    private boolean mRegisteredWithCi = false;
-
-    private RegistrantList mIccChangedRegistrants = new RegistrantList();
 
     public static synchronized UiccController getInstance(PhoneBase phone) {
         if (mInstance == null) {
             mInstance = new UiccController(phone);
-        } else if (phone != null) {
+        } else {
             mInstance.setNewPhone(phone);
         }
         return mInstance;
     }
 
-    // This method is not synchronized as getInstance(PhoneBase) is.
-    public static UiccController getInstance() {
-        return getInstance(null);
-    }
-
-    public synchronized IccCard getIccCard() {
+    public IccCard getIccCard() {
         return mIccCard;
     }
 
-    //Notifies when card status changes
-    public void registerForIccChanged(Handler h, int what, Object obj) {
-        Registrant r = new Registrant (h, what, obj);
-        mIccChangedRegistrants.add(r);
-        //Notify registrant right after registering, so that it will get the latest ICC status,
-        //otherwise which may not happen until there is an actual change in ICC status.
-        r.notifyRegistrant();
-    }
-    public void unregisterForIccChanged(Handler h) {
-        mIccChangedRegistrants.remove(h);
-    }
-
-    @Override
-    public void handleMessage (Message msg) {
-        switch (msg.what) {
-            case EVENT_ICC_STATUS_CHANGED:
-                if (DBG) log("Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus");
-                mCi.getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE));
-                break;
-            case EVENT_GET_ICC_STATUS_DONE:
-                if (DBG) log("Received EVENT_GET_ICC_STATUS_DONE");
-                AsyncResult ar = (AsyncResult)msg.obj;
-                onGetIccCardStatusDone(ar);
-                break;
-            default:
-                Log.e(LOG_TAG, " Unknown Event " + msg.what);
-        }
-    }
-
     private UiccController(PhoneBase phone) {
         if (DBG) log("Creating UiccController");
         setNewPhone(phone);
     }
 
-    private synchronized void onGetIccCardStatusDone(AsyncResult ar) {
-        if (ar.exception != null) {
-            Log.e(LOG_TAG,"Error getting ICC status. "
-                    + "RIL_REQUEST_GET_ICC_STATUS should "
-                    + "never return an error", ar.exception);
-            return;
+    private void setNewPhone(PhoneBase phone) {
+        mCurrentPhone = phone;
+        if (phone instanceof GSMPhone) {
+            if (DBG) log("New phone is GSMPhone");
+            updateCurrentCard(IccCard.CARD_IS_3GPP);
+        } else if (phone instanceof CDMALTEPhone){
+            if (DBG) log("New phone type is CDMALTEPhone");
+            updateCurrentCard(IccCard.CARD_IS_3GPP);
+        } else if (phone instanceof CDMAPhone){
+            if (DBG) log("New phone type is CDMAPhone");
+            updateCurrentCard(IccCard.CARD_IS_NOT_3GPP);
+        } else {
+            Log.e(LOG_TAG, "Unhandled phone type. Critical error!");
         }
+    }
 
-        IccCardStatus status = (IccCardStatus)ar.result;
-
-        //Update already existing card
-        if (mIccCard != null && status.getCardState() == CardState.CARDSTATE_PRESENT) {
-            mIccCard.update(mCurrentPhone, status);
+    private void updateCurrentCard(boolean isNewCard3gpp) {
+        if (mIsCurrentCard3gpp == isNewCard3gpp && mIccCard != null) {
+            return;
         }
 
-        //Dispose of removed card
-        if (mIccCard != null && status.getCardState() != CardState.CARDSTATE_PRESENT) {
+        if (mIccCard != null) {
             mIccCard.dispose();
             mIccCard = null;
         }
 
-        //Create new card
-        if (mIccCard == null && status.getCardState() == CardState.CARDSTATE_PRESENT) {
-            mIccCard = new IccCard(mCurrentPhone, status, mCurrentPhone.getPhoneName(), true);
-        }
-
-        if (DBG) log("Notifying IccChangedRegistrants");
-        mIccChangedRegistrants.notifyRegistrants();
-    }
-
-    private void setNewPhone(PhoneBase phone) {
-        if (phone == null) {
-            throw new RuntimeException("Phone can't be null in UiccController");
-        }
-
-        if (DBG) log("setNewPhone");
-        if (mCurrentPhone != phone) {
-            if (mIccCard != null) {
-                // Refresh card if phone changed
-                // TODO: Remove once card is simplified
-                if (DBG) log("Disposing card since phone object changed");
-                mIccCard.dispose();
-                mIccCard = null;
-            }
-            sendMessage(obtainMessage(EVENT_ICC_STATUS_CHANGED));
-            mCurrentPhone = phone;
-
-            if (!mRegisteredWithCi) {
-                // This needs to be done only once after we have valid phone object
-                mCi = mCurrentPhone.mCM;
-                mCi.registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, null);
-                // TODO remove this once modem correctly notifies the unsols
-                mCi.registerForOn(this, EVENT_ICC_STATUS_CHANGED, null);
-                mRegisteredWithCi = true;
-            }
-        }
+        mIsCurrentCard3gpp = isNewCard3gpp;
+        mIccCard = new IccCard(mCurrentPhone, mCurrentPhone.getPhoneName(),
+                isNewCard3gpp, DBG);
     }
 
     private void log(String string) {
         Log.d(LOG_TAG, string);
     }
-}
+}
\ No newline at end of file