IMS: No option to merge calls in VoWIFI

- Making changes in ImsUtils to check the WFC
  capabilities per slot.

Test: Manual
Bug: 74177709
Change-Id: I97941afb4d05fd7ced0b67e54c1032260f4a0987
diff --git a/src/com/android/phone/ImsUtil.java b/src/com/android/phone/ImsUtil.java
index 4d8ff80..d83d869 100644
--- a/src/com/android/phone/ImsUtil.java
+++ b/src/com/android/phone/ImsUtil.java
@@ -53,11 +53,20 @@
      * @return {@code true} if WFC is supported by the platform and has been enabled by the user.
      */
     public static boolean isWfcEnabled(Context context) {
-        ImsManager imsManager = getDefaultImsManagerInstance(context);
+        return isWfcEnabled(context, SubscriptionManager.getDefaultVoicePhoneId());
+    }
+
+    /**
+     * @return {@code true} if WFC is supported per Slot and has been enabled by the user.
+     */
+    public static boolean isWfcEnabled(Context context, int phoneId) {
+        ImsManager imsManager = ImsManager.getInstance(context, phoneId);
         boolean isEnabledByPlatform = imsManager.isWfcEnabledByPlatform();
         boolean isEnabledByUser = imsManager.isWfcEnabledByUser();
-        if (DBG) Log.d(LOG_TAG, "isWfcEnabled :: isEnabledByPlatform=" + isEnabledByPlatform);
-        if (DBG) Log.d(LOG_TAG, "isWfcEnabled :: isEnabledByUser=" + isEnabledByUser);
+        if (DBG) Log.d(LOG_TAG, "isWfcEnabled :: isEnabledByPlatform=" + isEnabledByPlatform
+                + " phoneId=" + phoneId);
+        if (DBG) Log.d(LOG_TAG, "isWfcEnabled :: isEnabledByUser=" + isEnabledByUser
+                + " phoneId=" + phoneId);
         return isEnabledByPlatform && isEnabledByUser;
     }
 
@@ -66,10 +75,20 @@
      * enabled, this will return {@code false}.
      */
     public static boolean isWfcModeWifiOnly(Context context) {
-        boolean isWifiOnlyMode = getDefaultImsManagerInstance(context).getWfcMode()
-                == ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY;
-        if (DBG) Log.d(LOG_TAG, "isWfcModeWifiOnly :: isWifiOnlyMode" + isWifiOnlyMode);
-        return isWfcEnabled(context) && isWifiOnlyMode;
+        return isWfcModeWifiOnly(context, SubscriptionManager.getDefaultVoicePhoneId());
+    }
+
+    /**
+     * @return {@code true} if the Slot is configured to use "Wi-Fi only" mode. If WFC is not
+     * enabled, this will return {@code false}.
+     */
+    public static boolean isWfcModeWifiOnly(Context context, int phoneId) {
+        ImsManager imsManager = ImsManager.getInstance(context, phoneId);
+        boolean isWifiOnlyMode =
+                imsManager.getWfcMode() == ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY;
+        if (DBG) Log.d(LOG_TAG, "isWfcModeWifiOnly :: isWifiOnlyMode" + isWifiOnlyMode
+                + " phoneId=" + phoneId);
+        return isWfcEnabled(context, phoneId) && isWifiOnlyMode;
     }
 
     /**
@@ -81,9 +100,21 @@
      * @return {@code true} if use of WFC should be promoted, {@code false} otherwise.
      */
     public static boolean shouldPromoteWfc(Context context) {
+        return shouldPromoteWfc(context, SubscriptionManager.getDefaultVoicePhoneId());
+    }
+
+    /**
+     * When a call cannot be placed, determines if the use of WFC should be promoted, per the
+     * carrier config of the slot.  Use of WFC is promoted to the user if the device is
+     * connected to a WIFI network, WFC is disabled but provisioned, and the carrier config
+     * indicates that the features should be promoted.
+     *
+     * @return {@code true} if use of WFC should be promoted, {@code false} otherwise.
+     */
+    public static boolean shouldPromoteWfc(Context context, int phoneId) {
         CarrierConfigManager cfgManager = (CarrierConfigManager) context
                 .getSystemService(Context.CARRIER_CONFIG_SERVICE);
-        if (cfgManager == null || !cfgManager.getConfig()
+        if (cfgManager == null || cfgManager.getConfigForSubId(getSubId(phoneId))
                 .getBoolean(CarrierConfigManager.KEY_CARRIER_PROMOTE_WFC_ON_CALL_FAIL_BOOL)) {
             return false;
         }
@@ -97,7 +128,8 @@
         if (cm != null) {
             NetworkInfo ni = cm.getActiveNetworkInfo();
             if (ni != null && ni.isConnected()) {
-                return ni.getType() == ConnectivityManager.TYPE_WIFI && !isWfcEnabled(context);
+                return ni.getType() == ConnectivityManager.TYPE_WIFI && !isWfcEnabled(context,
+                        phoneId);
             }
         }
         return false;
@@ -106,4 +138,13 @@
     private static ImsManager getDefaultImsManagerInstance(Context context) {
         return ImsManager.getInstance(context, SubscriptionManager.getDefaultVoicePhoneId());
     }
+
+    private static int getSubId(int phoneId) {
+        final int[] subIds = SubscriptionManager.getSubId(phoneId);
+        int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+        if (subIds != null && subIds.length >= 1) {
+            subId = subIds[0];
+        }
+        return subId;
+    }
 }