Add ImsManager.addRegistrationListener function

Switch RcsService from using open() to addRegistrationListener()

Bug: 28150730
Change-Id: If13c610ed1b3a3cb5e36721fab69d72c6cddda62
diff --git a/rcs/rcsservice/src/com/android/service/ims/RcsService.java b/rcs/rcsservice/src/com/android/service/ims/RcsService.java
index fa23603..d5ce570 100644
--- a/rcs/rcsservice/src/com/android/service/ims/RcsService.java
+++ b/rcs/rcsservice/src/com/android/service/ims/RcsService.java
@@ -72,11 +72,6 @@
      */
     private Logger logger = Logger.getLogger(this.getClass().getName());
 
-    final static String ACTION_IMS_FEATURE_STATUS_CHANGED =
-            "com.android.service.ims.presence.ims-feature-changed";
-    private static final int INVALID_SERVICE_ID = -1;
-    int mServiceId = INVALID_SERVICE_ID;
-
     private RcsStackAdaptor mRcsStackAdaptor = null;
     private PresencePublication mPublication = null;
     private PresenceSubscriber mSubscriber = null;
@@ -143,10 +138,6 @@
     }
 
     public void handleImsServiceUp() {
-        // Don't check mServiceId since it wasn't reset to INVALID_SERVICE_ID when
-        // got ACTION_IMS_SERVICE_DOWN
-        // This is phone crash case. Reset mServiceId to INVALID_SERVICE_ID
-        mServiceId = INVALID_SERVICE_ID;
         if(mPublication != null) {
             mPublication.handleImsServiceUp();
         }
@@ -155,11 +146,6 @@
     }
 
     public void handleImsServiceDown() {
-        // Don't close since it could close the wrong one when phone crashed and restarted.
-        //if((mImsManager != null) && (mServiceId != INVALID_SERVICE_ID)) {
-        //    mImsManager.close(mServiceId);
-        //    mServiceId = INVALID_SERVICE_ID;
-        //}
         if(mPublication != null) {
             mPublication.handleImsServiceDown();
         }
@@ -370,45 +356,16 @@
     };
 
     void registerImsConnectionStateListener() {
-        final Context context = this;
-        Thread t = new Thread() {
-            @Override
-            public void run() {
-                while (mServiceId == INVALID_SERVICE_ID) {
-                    try {
-                        ImsManager imsManager = ImsManager.getInstance(context,
-                                SubscriptionManager.getDefaultVoicePhoneId());
-                        if (imsManager != null) {
-                            mServiceId = imsManager.open(ImsServiceClass.RCS,
-                                    createIncomingCallPendingIntent(),
-                                    mImsConnectionStateListener);
-                        }
-                    } catch (ImsException e) {
-                        logger.error("register exception=", e);
-                    }
-
-                    if (mServiceId == INVALID_SERVICE_ID) {
-                        try {
-                            logger.print("register wait for imsservice");
-                            sleep(300);
-                        } catch (InterruptedException e) {
-                            logger.error("register exception=", e);
-                        }
-                    } else {
-                        logger.print("register imsservice ready mServiceId="+mServiceId);
-                    }
-                }
+        try {
+            ImsManager imsManager = ImsManager.getInstance(this,
+                    SubscriptionManager.getDefaultVoicePhoneId());
+            if (imsManager != null) {
+                imsManager.addRegistrationListener(ImsServiceClass.MMTEL,
+                        mImsConnectionStateListener);
             }
-        };
-
-        t.start();
-    }
-
-    private PendingIntent createIncomingCallPendingIntent() {
-        Intent intent = new Intent(ACTION_IMS_FEATURE_STATUS_CHANGED);
-        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-        return PendingIntent.getBroadcast(this, 0, intent,
-                PendingIntent.FLAG_UPDATE_CURRENT);
+        } catch (ImsException e) {
+            logger.error("addRegistrationListener exception=", e);
+        }
     }
 
     private ImsConnectionStateListener mImsConnectionStateListener =
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index 43fdae9..ec70757 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -749,6 +749,32 @@
     }
 
     /**
+     * Adds registration listener to the IMS service.
+     *
+     * @param serviceClass a service class specified in {@link ImsServiceClass}
+     *      For VoLTE service, it MUST be a {@link ImsServiceClass#MMTEL}.
+     * @param listener To listen to IMS registration events; It cannot be null
+     * @throws NullPointerException if {@code listener} is null
+     * @throws ImsException if calling the IMS service results in an error
+     */
+    public void addRegistrationListener(int serviceClass, ImsConnectionStateListener listener)
+            throws ImsException {
+        checkAndThrowExceptionIfServiceUnavailable();
+
+        if (listener == null) {
+            throw new NullPointerException("listener can't be null");
+        }
+
+        try {
+            mImsService.addRegistrationListener(mPhoneId, serviceClass,
+                    createRegistrationListenerProxy(serviceClass, listener));
+        } catch (RemoteException e) {
+            throw new ImsException("addRegistrationListener()", e,
+                    ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
+        }
+    }
+
+    /**
      * Closes the specified service ({@link ImsServiceClass}) not to make/receive calls.
      * All the resources that were allocated to the service are also released.
      *
diff --git a/src/java/com/android/ims/ImsServiceBase.java b/src/java/com/android/ims/ImsServiceBase.java
index 69364e3..66122df 100644
--- a/src/java/com/android/ims/ImsServiceBase.java
+++ b/src/java/com/android/ims/ImsServiceBase.java
@@ -67,6 +67,12 @@
         }
 
         @Override
+        public void addRegistrationListener(int serviceId, int serviceType, IImsRegistrationListener listener) {
+            onAddRegistrationListener(serviceId, serviceType, listener);
+        }
+
+
+        @Override
         public ImsCallProfile createCallProfile(int serviceId, int serviceType, int callType) {
             return onCreateCallProfile(serviceId, serviceType, callType);
         }
@@ -155,6 +161,10 @@
         // no-op
     }
 
+    protected void onAddRegistrationListener(int serviceId, int serviceType, IImsRegistrationListener listener) {
+        // no-op
+    }
+
     protected ImsCallProfile onCreateCallProfile(int serviceId, int serviceType, int callType) {
         // no-op