Integrates shouldProcessCall into framework am: d449b2367a
am: f55f9101ea

Change-Id: If476ddfd30068456f63388c9554d64935a49b2c6
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index 4ab6f9a..7891378 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -2204,7 +2204,7 @@
         }
     }
 
-    public void onSmsReady() throws ImsException{
+    public void onSmsReady() throws ImsException {
         try {
             mMmTelFeatureConnection.onSmsReady();
         } catch (RemoteException e) {
@@ -2214,6 +2214,28 @@
     }
 
     /**
+     * Determines whether or not a call with the specified numbers should be placed over IMS or over
+     * CSFB.
+     * @param isEmergency is at least one call an emergency number.
+     * @param numbers A {@link String} array containing the numbers in the call being placed. Can
+     *         be multiple numbers in the case of dialing out a conference.
+     * @return The result of the query, one of the following values:
+     *         - {@link MmTelFeature#PROCESS_CALL_IMS}
+     *         - {@link MmTelFeature#PROCESS_CALL_CSFB}
+     * @throws ImsException if the ImsService is not available. In this case, we should fall back
+     * to CSFB anyway.
+     */
+    public @MmTelFeature.ProcessCallResult int shouldProcessCall(boolean isEmergency,
+            String[] numbers) throws ImsException {
+        try {
+            return mMmTelFeatureConnection.shouldProcessCall(isEmergency, numbers);
+        } catch (RemoteException e) {
+            throw new ImsException("shouldProcessCall()", e,
+                    ImsReasonInfo.CODE_LOCAL_IMS_SERVICE_DOWN);
+        }
+    }
+
+    /**
      * Gets the Multi-Endpoint interface to subscribe to multi-enpoint notifications..
      *
      * @return the multi-endpoint interface instance
diff --git a/src/java/com/android/ims/MmTelFeatureConnection.java b/src/java/com/android/ims/MmTelFeatureConnection.java
index 571670d..2d11ae6 100644
--- a/src/java/com/android/ims/MmTelFeatureConnection.java
+++ b/src/java/com/android/ims/MmTelFeatureConnection.java
@@ -351,6 +351,11 @@
         return tm != null ? tm.getImsConfig(mSlotId, ImsFeature.FEATURE_MMTEL) : null;
     }
 
+    public boolean isEmergencyMmTelAvailable() {
+        TelephonyManager tm = getTelephonyManager(mContext);
+        return tm != null ? tm.isEmergencyMmTelAvailable(mSlotId) : false;
+    }
+
     public IImsServiceFeatureCallback getListener() {
         return mListenerBinder;
     }
@@ -540,6 +545,19 @@
         }
     }
 
+    public @MmTelFeature.ProcessCallResult int shouldProcessCall(boolean isEmergency,
+            String[] numbers) throws RemoteException {
+        if (isEmergency && !isEmergencyMmTelAvailable()) {
+            // Don't query the ImsService if emergency calling is not available on the ImsService.
+            Log.i(TAG, "MmTel does not support emergency over IMS, fallback to CS.");
+            return MmTelFeature.PROCESS_CALL_CSFB;
+        }
+        synchronized (mLock) {
+            checkServiceIsReady();
+            return getServiceInterface(mBinder).shouldProcessCall(numbers);
+        }
+    }
+
     /**
      * @return an integer describing the current Feature Status, defined in
      * {@link ImsFeature.ImsState}.