Dynamic Query for ImsService

1) Fixes ImsManager.Connector bug where we would reset
retry count, even if there was an ImsException.

2) ImsManager#isServiceAvailable now uses ImsResolver state
to figure out if an ImsService is possibly going to bind/
unbind.

Test: Telephony test ImsService, telephony unit tests
Bug: 72642524

Change-Id: Iac4de9091c3374970be450930424a22d9158de13
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index 24d9247..a5d4e48 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -340,10 +340,19 @@
         private void notifyReady() throws ImsException {
             ImsManager manager;
             synchronized (mLock) {
-                mRetryCount = 0;
                 manager = mImsManager;
             }
-            mListener.connectionReady(manager);
+            try {
+                mListener.connectionReady(manager);
+            }
+            catch (ImsException e) {
+                Log.w(TAG, "Connector: notifyReady exception: " + e.getMessage());
+                throw e;
+            }
+            // Only reset retry count if connectionReady does not generate an ImsException/
+            synchronized (mLock) {
+                mRetryCount = 0;
+            }
         }
 
         private void notifyNotReady() {
@@ -1418,10 +1427,18 @@
     }
 
     /*
-     * Returns a flag indicating whether the IMS service is available. If it is not available,
-     * it will try to connect before reporting failure.
+     * Returns a flag indicating whether the IMS service is available. If it is not available or
+     * busy, it will try to connect before reporting failure.
      */
     public boolean isServiceAvailable() {
+        // If we are busy resolving dynamic IMS bindings, we are not available yet.
+        TelephonyManager tm = (TelephonyManager)
+                mContext.getSystemService(Context.TELEPHONY_SERVICE);
+        if (tm.isResolvingImsBinding()) {
+            Log.d(TAG, "isServiceAvailable: resolving IMS binding, returning false");
+            return false;
+        }
+
         connectIfServiceIsAvailable();
         // mImsServiceProxy will always create an ImsServiceProxy.
         return mMmTelFeatureConnection.isBinderAlive();