Wait until the SIM is loaded for IMS Registration

We need to wait until a sim is detected an loaded
to register for IMS Registration updates, or there
is a possibility that we will try to register for
an IMS Registration listener with an invalid
Phone Id.

Bug: 64375490
Test: Manual
Change-Id: I2f2f9c33908a1ce049f8025c1fa3f06ba4b27032
diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsService.java b/rcs/rcsservice/src/com/android/service/ims/RcsService.java
index 53ba728..aeccb30 100644
--- a/rcs/rcsservice/src/com/android/service/ims/RcsService.java
+++ b/rcs/rcsservice/src/com/android/service/ims/RcsService.java
@@ -61,6 +61,8 @@
 import com.android.ims.RcsPresence.PublishState;
 
 import com.android.ims.internal.Logger;
+import com.android.internal.telephony.IccCardConstants;
+import com.android.internal.telephony.TelephonyIntents;
 import com.android.service.ims.RcsStackAdaptor;
 
 import com.android.service.ims.presence.PresencePublication;
@@ -115,8 +117,6 @@
                 Settings.Global.getUriFor(Settings.Global.VT_IMS_ENABLED),
                 false, mVtSettingObserver);
 
-        registerImsConnectionStateListener();
-
         mReceiver = new BroadcastReceiver() {
             @Override
             public void onReceive(Context context, Intent intent) {
@@ -127,6 +127,11 @@
                 } else if(ImsManager.ACTION_IMS_SERVICE_DOWN.equalsIgnoreCase(
                         intent.getAction())){
                     handleImsServiceDown();
+                } else if(TelephonyIntents.ACTION_SIM_STATE_CHANGED.equalsIgnoreCase(
+                        intent.getAction())) {
+                    String stateExtra = intent.getStringExtra(
+                            IccCardConstants.INTENT_KEY_ICC_STATE);
+                    handleSimStateChanged(stateExtra);
                 }
             }
         };
@@ -134,6 +139,7 @@
         IntentFilter statusFilter = new IntentFilter();
         statusFilter.addAction(ImsManager.ACTION_IMS_SERVICE_UP);
         statusFilter.addAction(ImsManager.ACTION_IMS_SERVICE_DOWN);
+        statusFilter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
         registerReceiver(mReceiver, statusFilter);
     }
 
@@ -151,6 +157,14 @@
         }
     }
 
+    public void handleSimStateChanged(String state) {
+
+        if(IccCardConstants.INTENT_VALUE_ICC_LOADED.equalsIgnoreCase(state)) {
+            // ImsManager depends on a loaded SIM to get the default Voice Registration.
+            registerImsConnectionStateListener();
+        }
+    }
+
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
@@ -358,8 +372,7 @@
             ImsManager imsManager = ImsManager.getInstance(this,
                     SubscriptionManager.getDefaultVoicePhoneId());
             if (imsManager != null) {
-                imsManager.addRegistrationListener(ImsServiceClass.MMTEL,
-                        mImsConnectionStateListener);
+                imsManager.addRegistrationListener(mImsConnectionStateListener);
             }
         } catch (ImsException e) {
             logger.error("addRegistrationListener exception=", e);