Merge "[Settings] Refactor of Wifi Calling part"
diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
index 3f77059..e928dba 100644
--- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
+++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
@@ -34,8 +34,8 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
-import com.android.ims.ImsManager;
 import com.android.settings.R;
+import com.android.settings.network.ims.WifiCallingQueryImsState;
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
@@ -48,12 +48,12 @@
 public class WifiCallingPreferenceController extends TelephonyBasePreferenceController implements
         LifecycleObserver, OnStart, OnStop {
 
+    private static final String TAG = "WifiCallingPreference";
+
     @VisibleForTesting
     Integer mCallState;
     @VisibleForTesting
     CarrierConfigManager mCarrierConfigManager;
-    @VisibleForTesting
-    ImsManager mImsManager;
     private ImsMmTelManager mImsMmTelManager;
     @VisibleForTesting
     PhoneAccountHandle mSimCallManager;
@@ -68,8 +68,8 @@
 
     @Override
     public int getAvailabilityStatus(int subId) {
-        return subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID
-                && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId)
+        return SubscriptionManager.isValidSubscriptionId(subId)
+                && isWifiCallingEnabled(mContext, subId)
                 ? AVAILABLE
                 : UNSUPPORTED_ON_DEVICE;
     }
@@ -100,6 +100,7 @@
         if (mCallState == null) {
             return;
         }
+        CharSequence summaryText = null;
         if (mSimCallManager != null) {
             final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext,
                     mSimCallManager);
@@ -110,53 +111,55 @@
             final PackageManager pm = mContext.getPackageManager();
             final List<ResolveInfo> resolutions = pm.queryIntentActivities(intent, 0);
             preference.setTitle(resolutions.get(0).loadLabel(pm));
-            preference.setSummary(null);
             preference.setIntent(intent);
         } else {
             final String title = SubscriptionManager.getResourcesForSubId(mContext, mSubId)
                     .getString(R.string.wifi_calling_settings_title);
             preference.setTitle(title);
-            int resId = com.android.internal.R.string.wifi_calling_off_summary;
-            if (mImsManager.isWfcEnabledByUser()) {
-                boolean useWfcHomeModeForRoaming = false;
-                if (mCarrierConfigManager != null) {
-                    final PersistableBundle carrierConfig =
-                            mCarrierConfigManager.getConfigForSubId(mSubId);
-                    if (carrierConfig != null) {
-                        useWfcHomeModeForRoaming = carrierConfig.getBoolean(
-                                CarrierConfigManager
-                                        .KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL);
-                    }
-                }
-                final boolean isRoaming = getTelephonyManager(mContext, mSubId)
-                        .isNetworkRoaming();
-                final int wfcMode = (isRoaming && !useWfcHomeModeForRoaming)
-                        ? mImsMmTelManager.getVoWiFiRoamingModeSetting() :
-                        mImsMmTelManager.getVoWiFiModeSetting();
-                switch (wfcMode) {
-                    case ImsMmTelManager.WIFI_MODE_WIFI_ONLY:
-                        resId = com.android.internal.R.string.wfc_mode_wifi_only_summary;
-                        break;
-                    case ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED:
-                        resId = com.android.internal.R.string
-                                .wfc_mode_cellular_preferred_summary;
-                        break;
-                    case ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED:
-                        resId = com.android.internal.R.string.wfc_mode_wifi_preferred_summary;
-                        break;
-                    default:
-                        break;
+            summaryText = getResourceIdForWfcMode(mSubId);
+        }
+        preference.setSummary(summaryText);
+        preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE);
+    }
+
+    private CharSequence getResourceIdForWfcMode(int subId) {
+        int resId = com.android.internal.R.string.wifi_calling_off_summary;
+        if (queryImsState(subId).isEnabledByUser()) {
+            boolean useWfcHomeModeForRoaming = false;
+            if (mCarrierConfigManager != null) {
+                final PersistableBundle carrierConfig =
+                        mCarrierConfigManager.getConfigForSubId(subId);
+                if (carrierConfig != null) {
+                    useWfcHomeModeForRoaming = carrierConfig.getBoolean(
+                            CarrierConfigManager
+                                    .KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL);
                 }
             }
-            preference.setSummary(
-                    SubscriptionManager.getResourcesForSubId(mContext, mSubId).getText(resId));
+            final boolean isRoaming = getTelephonyManager(mContext, subId)
+                    .isNetworkRoaming();
+            final int wfcMode = (isRoaming && !useWfcHomeModeForRoaming)
+                    ? mImsMmTelManager.getVoWiFiRoamingModeSetting() :
+                    mImsMmTelManager.getVoWiFiModeSetting();
+            switch (wfcMode) {
+                case ImsMmTelManager.WIFI_MODE_WIFI_ONLY:
+                    resId = com.android.internal.R.string.wfc_mode_wifi_only_summary;
+                    break;
+                case ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED:
+                    resId = com.android.internal.R.string
+                            .wfc_mode_cellular_preferred_summary;
+                    break;
+                case ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED:
+                    resId = com.android.internal.R.string.wfc_mode_wifi_preferred_summary;
+                    break;
+                default:
+                    break;
+            }
         }
-        preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE);
+        return SubscriptionManager.getResourcesForSubId(mContext, subId).getText(resId);
     }
 
     public WifiCallingPreferenceController init(int subId) {
         mSubId = subId;
-        mImsManager = ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(mSubId));
         mImsMmTelManager = getImsMmTelManager(mSubId);
         mSimCallManager = mContext.getSystemService(TelecomManager.class)
                 .getSimCallManagerForSubscription(mSubId);
@@ -164,14 +167,22 @@
         return this;
     }
 
+    @VisibleForTesting
+    WifiCallingQueryImsState queryImsState(int subId) {
+        return new WifiCallingQueryImsState(mContext, subId);
+    }
+
     protected ImsMmTelManager getImsMmTelManager(int subId) {
+        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+            return null;
+        }
         return ImsMmTelManager.createForSubscriptionId(subId);
     }
 
     @VisibleForTesting
     TelephonyManager getTelephonyManager(Context context, int subId) {
         final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
-        if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
             return telephonyMgr;
         }
         final TelephonyManager subscriptionTelephonyMgr =
@@ -204,4 +215,23 @@
             mTelephonyManager.listen(this, PhoneStateListener.LISTEN_NONE);
         }
     }
+
+    private boolean isWifiCallingEnabled(Context context, int subId) {
+        final PhoneAccountHandle simCallManager =
+                context.getSystemService(TelecomManager.class)
+                       .getSimCallManagerForSubscription(subId);
+        final int phoneId = SubscriptionManager.getSlotIndex(subId);
+
+        boolean isWifiCallingEnabled;
+        if (simCallManager != null) {
+            final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(
+                    context, simCallManager);
+
+            isWifiCallingEnabled = intent != null;
+        } else {
+            isWifiCallingEnabled = queryImsState(subId).isReadyToWifiCalling();
+        }
+
+        return isWifiCallingEnabled;
+    }
 }
diff --git a/src/com/android/settings/wifi/calling/OWNERS b/src/com/android/settings/wifi/calling/OWNERS
new file mode 100644
index 0000000..d23f816
--- /dev/null
+++ b/src/com/android/settings/wifi/calling/OWNERS
@@ -0,0 +1,8 @@
+# Default reviewers for this and subdirectories.
+allenwtsu@google.com
+andychou@google.com
+bonianchen@google.com
+songferngwang@google.com
+tomhsu@google.com
+
+# Emergency approvers in case the above are not available
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettings.java b/src/com/android/settings/wifi/calling/WifiCallingSettings.java
index 72e1df2..5c0ee9b 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettings.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettings.java
@@ -22,9 +22,6 @@
 import android.provider.Settings;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
-import android.telephony.ims.ProvisioningManager;
-import android.telephony.ims.feature.MmTelFeature;
-import android.telephony.ims.stub.ImsRegistrationImplBase;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -35,11 +32,11 @@
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentPagerAdapter;
 
-import com.android.ims.ImsManager;
 import com.android.internal.util.CollectionUtils;
 import com.android.settings.R;
 import com.android.settings.core.InstrumentedFragment;
 import com.android.settings.network.SubscriptionUtil;
+import com.android.settings.network.ims.WifiCallingQueryImsState;
 import com.android.settings.search.actionbar.SearchMenuController;
 import com.android.settings.support.actionbar.HelpMenuController;
 import com.android.settings.support.actionbar.HelpResourceProvider;
@@ -196,25 +193,6 @@
         }
     }
 
-    @VisibleForTesting
-    boolean isWfcEnabledByPlatform(SubscriptionInfo info) {
-        final ImsManager imsManager = ImsManager.getInstance(getActivity(),
-                info.getSimSlotIndex());
-        return imsManager.isWfcEnabledByPlatform();
-    }
-
-    @VisibleForTesting
-    boolean isWfcProvisionedOnDevice(SubscriptionInfo info) {
-        final ProvisioningManager provisioningMgr =
-                ProvisioningManager.createForSubscriptionId(info.getSubscriptionId());
-        if (provisioningMgr == null) {
-            return true;
-        }
-        return provisioningMgr.getProvisioningStatusForCapability(
-                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
-                ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN);
-    }
-
     private void updateSubList() {
         mSil = SubscriptionUtil.getActiveSubscriptions(
                 getContext().getSystemService(SubscriptionManager.class));
@@ -225,7 +203,7 @@
         }
         for (int i = 0; i < mSil.size(); ) {
             final SubscriptionInfo info = mSil.get(i);
-            if (!isWfcEnabledByPlatform(info) || !isWfcProvisionedOnDevice(info)) {
+            if (!queryImsState(info.getSubscriptionId()).isWifiCallingProvisioned()) {
                 mSil.remove(i);
             } else {
                 i++;
@@ -241,4 +219,9 @@
             getActivity().getActionBar().setTitle(title);
         }
     }
+
+    @VisibleForTesting
+    WifiCallingQueryImsState queryImsState(int subId) {
+        return new WifiCallingQueryImsState(getContext(), subId);
+    }
 }
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index e1bd0ed..735fecc 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -30,10 +30,10 @@
 import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.telephony.ims.ImsManager;
 import android.telephony.ims.ImsMmTelManager;
 import android.telephony.ims.ProvisioningManager;
 import android.text.TextUtils;
-import android.text.util.Linkify;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -47,8 +47,6 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.ims.ImsConfig;
-import com.android.ims.ImsException;
-import com.android.ims.ImsManager;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.telephony.Phone;
 import com.android.settings.R;
@@ -56,7 +54,7 @@
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
 import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.network.telephony.MobileNetworkUtils;
+import com.android.settings.network.ims.WifiCallingQueryImsState;
 import com.android.settings.widget.SwitchBar;
 
 /**
@@ -100,8 +98,8 @@
     private boolean mUseWfcHomeModeForRoaming = false;
 
     private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-    private ImsManager mImsManager;
     private ImsMmTelManager mImsMmTelManager;
+    private ProvisioningManager mProvisioningManager;
     private TelephonyManager mTelephonyManager;
 
     private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
@@ -114,11 +112,13 @@
         @Override
         public void onCallStateChanged(int state, String incomingNumber) {
             final SettingsActivity activity = (SettingsActivity) getActivity();
-            final boolean isNonTtyOrTtyOnVolteEnabled = mImsManager.isNonTtyOrTtyOnVolteEnabled();
+            final boolean isNonTtyOrTtyOnVolteEnabled =
+                    queryImsState(WifiCallingSettingsForSub.this.mSubId).isAllowUserControl();
             final boolean isWfcEnabled = mSwitchBar.isChecked()
                     && isNonTtyOrTtyOnVolteEnabled;
-            boolean isCallStateIdle =
-                    mTelephonyManager.getCallState() == TelephonyManager.CALL_STATE_IDLE;
+            boolean isCallStateIdle = getTelephonyManagerForSub(
+                    WifiCallingSettingsForSub.this.mSubId).getCallState()
+                    == TelephonyManager.CALL_STATE_IDLE;
             mSwitchBar.setEnabled(isCallStateIdle
                     && isNonTtyOrTtyOnVolteEnabled);
 
@@ -183,7 +183,6 @@
 
         mEmptyView = getView().findViewById(android.R.id.empty);
         setEmptyView(mEmptyView);
-        mEmptyView.setAutoLinkMask(Linkify.WEB_URLS);
         final Resources res = getResourcesForSubId();
         final String emptyViewText = res.getString(R.string.wifi_calling_off_explanation,
                 res.getString(R.string.wifi_calling_off_explanation_2));
@@ -200,7 +199,8 @@
         mSwitchBar.hide();
     }
 
-    private void showAlert(Intent intent) {
+    @VisibleForTesting
+    void showAlert(Intent intent) {
         final Context context = getActivity();
 
         final CharSequence title = intent.getCharSequenceExtra(Phone.EXTRA_KEY_ALERT_TITLE);
@@ -221,7 +221,7 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             final String action = intent.getAction();
-            if (action.equals(ImsManager.ACTION_IMS_REGISTRATION_ERROR)) {
+            if (action.equals(ImsManager.ACTION_WFC_IMS_REGISTRATION_ERROR)) {
                 // If this fragment is active then we are immediately
                 // showing alert on screen. There is no need to add
                 // notification in this case.
@@ -247,12 +247,31 @@
     }
 
     @VisibleForTesting
-    ImsManager getImsManager() {
-        return ImsManager.getInstance(getActivity(), SubscriptionManager.getPhoneId(mSubId));
+    TelephonyManager getTelephonyManagerForSub(int subId) {
+        if (mTelephonyManager == null) {
+            mTelephonyManager = getContext().getSystemService(TelephonyManager.class);
+        }
+        return mTelephonyManager.createForSubscriptionId(subId);
+    }
+
+    @VisibleForTesting
+    WifiCallingQueryImsState queryImsState(int subId) {
+        return new WifiCallingQueryImsState(getContext(), subId);
+    }
+
+    @VisibleForTesting
+    ProvisioningManager getImsProvisioningManager() {
+        if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
+            return null;
+        }
+        return ProvisioningManager.createForSubscriptionId(mSubId);
     }
 
     @VisibleForTesting
     ImsMmTelManager getImsMmTelManager() {
+        if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
+            return null;
+        }
         return ImsMmTelManager.createForSubscriptionId(mSubId);
     }
 
@@ -271,11 +290,9 @@
                     FRAGMENT_BUNDLE_SUBID, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
         }
 
-        mImsManager = getImsManager();
+        mProvisioningManager = getImsProvisioningManager();
         mImsMmTelManager = getImsMmTelManager();
 
-        mTelephonyManager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE));
-
         mButtonWfcMode = findPreference(BUTTON_WFC_MODE);
         mButtonWfcMode.setOnPreferenceChangeListener(this);
 
@@ -286,7 +303,7 @@
         mUpdateAddress.setOnPreferenceClickListener(mUpdateAddressListener);
 
         mIntentFilter = new IntentFilter();
-        mIntentFilter.addAction(ImsManager.ACTION_IMS_REGISTRATION_ERROR);
+        mIntentFilter.addAction(ImsManager.ACTION_WFC_IMS_REGISTRATION_ERROR);
     }
 
     @Override
@@ -312,7 +329,7 @@
 
     @VisibleForTesting
     boolean isWfcProvisionedOnDevice() {
-        return MobileNetworkUtils.isWfcProvisionedOnDevice(mSubId);
+        return queryImsState(mSubId).isWifiCallingProvisioned();
     }
 
     private void updateBody() {
@@ -342,7 +359,7 @@
             }
         }
 
-        Resources res = getResourcesForSubId();
+        final Resources res = getResourcesForSubId();
         mButtonWfcMode.setTitle(res.getString(R.string.wifi_calling_mode_title));
         mButtonWfcMode.setDialogTitle(res.getString(R.string.wifi_calling_mode_dialog_title));
         mButtonWfcRoamingMode.setTitle(res.getString(R.string.wifi_calling_roaming_mode_title));
@@ -383,8 +400,9 @@
         }
 
         // NOTE: Buttons will be enabled/disabled in mPhoneStateListener
-        final boolean wfcEnabled = mImsManager.isWfcEnabledByUser()
-                && mImsManager.isNonTtyOrTtyOnVolteEnabled();
+        final WifiCallingQueryImsState queryIms = queryImsState(mSubId);
+        final boolean wfcEnabled = queryIms.isEnabledByUser()
+                && queryIms.isAllowUserControl();
         mSwitch.setChecked(wfcEnabled);
         final int wfcMode = mImsMmTelManager.getVoWiFiModeSetting();
         final int wfcRoamingMode = mImsMmTelManager.getVoWiFiRoamingModeSetting();
@@ -397,18 +415,18 @@
     public void onResume() {
         super.onResume();
 
-        final Context context = getActivity();
-
         updateBody();
 
-        if (mImsManager.isWfcEnabledByPlatform()) {
-            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+        if (queryImsState(mSubId).isWifiCallingSupported()) {
+            getTelephonyManagerForSub(mSubId).listen(mPhoneStateListener,
+                    PhoneStateListener.LISTEN_CALL_STATE);
 
             mSwitchBar.addOnSwitchChangeListener(this);
 
             mValidListener = true;
         }
 
+        final Context context = getActivity();
         context.registerReceiver(mIntentReceiver, mIntentFilter);
 
         final Intent intent = getActivity().getIntent();
@@ -417,12 +435,7 @@
         }
 
         // Register callback for provisioning changes.
-        try {
-            mImsManager.getConfigInterface().addConfigCallback(mProvisioningCallback);
-        } catch (ImsException e) {
-            Log.w(TAG, "onResume: Unable to register callback for provisioning changes.");
-        }
-
+        registerProvisioningChangedCallback();
     }
 
     @Override
@@ -434,7 +447,8 @@
         if (mValidListener) {
             mValidListener = false;
 
-            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+            getTelephonyManagerForSub(mSubId).listen(mPhoneStateListener,
+                    PhoneStateListener.LISTEN_NONE);
 
             mSwitchBar.removeOnSwitchChangeListener(this);
         }
@@ -442,13 +456,7 @@
         context.unregisterReceiver(mIntentReceiver);
 
         // Remove callback for provisioning changes.
-        try {
-            mImsManager.getConfigInterface().removeConfigCallback(
-                    mProvisioningCallback.getBinder());
-        } catch (ImsException e) {
-            Log.w(TAG, "onPause: Unable to remove callback for provisioning changes");
-        }
-
+        unregisterProvisioningChangedCallback();
     }
 
     /**
@@ -508,7 +516,7 @@
      */
     private void updateWfcMode(boolean wfcEnabled) {
         Log.i(TAG, "updateWfcMode(" + wfcEnabled + ")");
-        mImsManager.setWfcSetting(wfcEnabled);
+        mImsMmTelManager.setVoWiFiSettingEnabled(wfcEnabled);
 
         final int wfcMode = mImsMmTelManager.getVoWiFiModeSetting();
         final int wfcRoamingMode = mImsMmTelManager.getVoWiFiRoamingModeSetting();
@@ -524,8 +532,6 @@
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
 
-        final Context context = getActivity();
-
         Log.d(TAG, "WFC activity request = " + requestCode + " result = " + resultCode);
 
         switch (requestCode) {
@@ -619,7 +625,7 @@
 
     private CharSequence getWfcModeSummary(int wfcMode) {
         int resId = com.android.internal.R.string.wifi_calling_off_summary;
-        if (mImsManager.isWfcEnabledByUser()) {
+        if (queryImsState(mSubId).isEnabledByUser()) {
             switch (wfcMode) {
                 case ImsMmTelManager.WIFI_MODE_WIFI_ONLY:
                     resId = com.android.internal.R.string.wfc_mode_wifi_only_summary;
@@ -639,6 +645,27 @@
 
     @VisibleForTesting
     Resources getResourcesForSubId() {
-        return SubscriptionManager.getResourcesForSubId(getContext(), mSubId, false);
+        return SubscriptionManager.getResourcesForSubId(getContext(), mSubId);
+    }
+
+    @VisibleForTesting
+    void registerProvisioningChangedCallback() {
+        if (mProvisioningManager == null) {
+            return;
+        }
+        try {
+            mProvisioningManager.registerProvisioningChangedCallback(getContext().getMainExecutor(),
+                    mProvisioningCallback);
+        } catch (Exception ex) {
+            Log.w(TAG, "onResume: Unable to register callback for provisioning changes.");
+        }
+    }
+
+    @VisibleForTesting
+    void unregisterProvisioningChangedCallback() {
+        if (mProvisioningManager == null) {
+            return;
+        }
+        mProvisioningManager.unregisterProvisioningChangedCallback(mProvisioningCallback);
     }
 }
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java
index 967146c..69adf55 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSliceHelper.java
@@ -43,10 +43,9 @@
 import androidx.slice.builders.SliceAction;
 
 import com.android.ims.ImsConfig;
-import com.android.ims.ImsManager;
 import com.android.settings.R;
 import com.android.settings.Utils;
-import com.android.settings.network.telephony.MobileNetworkUtils;
+import com.android.settings.network.ims.WifiCallingQueryImsState;
 import com.android.settings.slices.SliceBroadcastReceiver;
 
 import java.util.concurrent.Callable;
@@ -132,57 +131,39 @@
      */
     public Slice createWifiCallingSlice(Uri sliceUri) {
         final int subId = getDefaultVoiceSubId();
-        Resources res = getResourcesForSubId(subId);
 
-        if (subId <= SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
             Log.d(TAG, "Invalid subscription Id");
             return null;
         }
 
-        final ImsManager imsManager = getImsManager(subId);
-
-        if (!imsManager.isWfcEnabledByPlatform()
-                || !isWfcProvisionedOnDevice(subId)) {
+        if (!queryImsState(subId).isWifiCallingProvisioned()) {
             Log.d(TAG, "Wifi calling is either not provisioned or not enabled by Platform");
             return null;
         }
 
-        try {
-            final boolean isWifiCallingEnabled = isWifiCallingEnabled(imsManager);
-            final Intent activationAppIntent =
-                    getWifiCallingCarrierActivityIntent(subId);
+        final boolean isWifiCallingEnabled = isWifiCallingEnabled();
+        final Intent activationAppIntent =
+                getWifiCallingCarrierActivityIntent(subId);
 
-            // Send this actionable wifi calling slice to toggle the setting
-            // only when there is no need for wifi calling activation with the server
-            if (activationAppIntent != null && !isWifiCallingEnabled) {
-                Log.d(TAG, "Needs Activation");
-                // Activation needed for the next action of the user
-                // Give instructions to go to settings app
-                return getNonActionableWifiCallingSlice(
-                        res.getText(R.string.wifi_calling_settings_title),
-                        res.getText(R.string.wifi_calling_settings_activation_instructions),
-                        sliceUri, getActivityIntent(ACTION_WIFI_CALLING_SETTINGS_ACTIVITY));
-            }
-            return getWifiCallingSlice(sliceUri, isWifiCallingEnabled, subId);
-        } catch (InterruptedException | TimeoutException | ExecutionException e) {
-            Log.e(TAG, "Unable to read the current WiFi calling status", e);
-            return null;
+        // Send this actionable wifi calling slice to toggle the setting
+        // only when there is no need for wifi calling activation with the server
+        if (activationAppIntent != null && !isWifiCallingEnabled) {
+            Log.d(TAG, "Needs Activation");
+            // Activation needed for the next action of the user
+            // Give instructions to go to settings app
+            final Resources res = getResourcesForSubId(subId);
+            return getNonActionableWifiCallingSlice(
+                    res.getText(R.string.wifi_calling_settings_title),
+                    res.getText(R.string.wifi_calling_settings_activation_instructions),
+                    sliceUri, getActivityIntent(ACTION_WIFI_CALLING_SETTINGS_ACTIVITY));
         }
+        return getWifiCallingSlice(sliceUri, isWifiCallingEnabled, subId);
     }
 
-    private boolean isWifiCallingEnabled(ImsManager imsManager)
-            throws InterruptedException, ExecutionException, TimeoutException {
-        final FutureTask<Boolean> isWifiOnTask = new FutureTask<>(new Callable<Boolean>() {
-            @Override
-            public Boolean call() {
-                return imsManager.isWfcEnabledByUser();
-            }
-        });
-        final ExecutorService executor = Executors.newSingleThreadExecutor();
-        executor.execute(isWifiOnTask);
-
-        return isWifiOnTask.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
-                && imsManager.isNonTtyOrTtyOnVolteEnabled();
+    private boolean isWifiCallingEnabled() {
+        final WifiCallingQueryImsState queryState = queryImsState(getDefaultVoiceSubId());
+        return queryState.isEnabledByUser() && queryState.isAllowUserControl();
     }
 
     /**
@@ -191,7 +172,7 @@
      */
     private Slice getWifiCallingSlice(Uri sliceUri, boolean isWifiCallingEnabled, int subId) {
         final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.wifi_signal);
-        Resources res = getResourcesForSubId(subId);
+        final Resources res = getResourcesForSubId(subId);
 
         return new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY)
                 .setAccentColor(Utils.getColorAccentDefaultColor(mContext))
@@ -227,7 +208,7 @@
     public Slice createWifiCallingPreferenceSlice(Uri sliceUri) {
         final int subId = getDefaultVoiceSubId();
 
-        if (subId <= SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+        if (!SubscriptionManager.isValidSubscriptionId(subId)) {
             Log.d(TAG, "Invalid Subscription Id");
             return null;
         }
@@ -236,24 +217,22 @@
                 CarrierConfigManager.KEY_EDITABLE_WFC_MODE_BOOL, subId, false);
         final boolean isWifiOnlySupported = isCarrierConfigManagerKeyEnabled(
                 CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, subId, true);
-        final ImsManager imsManager = getImsManager(subId);
-        final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId);
-
-        if (!imsManager.isWfcEnabledByPlatform()
-                || !isWfcProvisionedOnDevice(subId)) {
-            Log.d(TAG, "Wifi calling is either not provisioned or not enabled by platform");
-            return null;
-        }
 
         if (!isWifiCallingPrefEditable) {
             Log.d(TAG, "Wifi calling preference is not editable");
             return null;
         }
 
+        if (!queryImsState(subId).isWifiCallingProvisioned()) {
+            Log.d(TAG, "Wifi calling is either not provisioned or not enabled by platform");
+            return null;
+        }
+
         boolean isWifiCallingEnabled = false;
         int wfcMode = -1;
         try {
-            isWifiCallingEnabled = isWifiCallingEnabled(imsManager);
+            final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId);
+            isWifiCallingEnabled = isWifiCallingEnabled();
             wfcMode = getWfcMode(imsMmTelManager);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             Log.e(TAG, "Unable to get wifi calling preferred mode", e);
@@ -261,7 +240,7 @@
         }
         if (!isWifiCallingEnabled) {
             // wifi calling is not enabled. Ask user to enable wifi calling
-            Resources res = getResourcesForSubId(subId);
+            final Resources res = getResourcesForSubId(subId);
             return getNonActionableWifiCallingSlice(
                     res.getText(R.string.wifi_calling_mode_title),
                     res.getText(R.string.wifi_calling_turn_on),
@@ -286,7 +265,7 @@
             Uri sliceUri,
             int subId) {
         final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.wifi_signal);
-        Resources res = getResourcesForSubId(subId);
+        final Resources res = getResourcesForSubId(subId);
         // Top row shows information on current preference state
         final ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY)
                 .setAccentColor(Utils.getColorAccentDefaultColor(mContext));
@@ -332,7 +311,7 @@
             int preferenceTitleResId, String action, boolean checked, int subId) {
         final IconCompat icon =
                 IconCompat.createWithResource(mContext, R.drawable.radio_button_check);
-        Resources res = getResourcesForSubId(subId);
+        final Resources res = getResourcesForSubId(subId);
         return new RowBuilder()
                 .setTitle(res.getText(preferenceTitleResId))
                 .setTitleItem(SliceAction.createToggle(getBroadcastIntent(action),
@@ -347,7 +326,7 @@
      * @return summary/name of the wifi calling preference
      */
     private CharSequence getWifiCallingPreferenceSummary(int wfcMode, int subId) {
-        Resources res = getResourcesForSubId(subId);
+        final Resources res = getResourcesForSubId(subId);
         switch (wfcMode) {
             case ImsMmTelManager.WIFI_MODE_WIFI_ONLY:
                 return res.getText(
@@ -363,10 +342,6 @@
         }
     }
 
-    protected ImsManager getImsManager(int subId) {
-        return ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(subId));
-    }
-
     protected ImsMmTelManager getImsMmTelManager(int subId) {
         return ImsMmTelManager.createForSubscriptionId(subId);
     }
@@ -393,12 +368,11 @@
     public void handleWifiCallingChanged(Intent intent) {
         final int subId = getDefaultVoiceSubId();
 
-        if (subId > SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
-            final ImsManager imsManager = getImsManager(subId);
-            if (imsManager.isWfcEnabledByPlatform()
-                    && isWfcProvisionedOnDevice(subId)) {
-                final boolean currentValue = imsManager.isWfcEnabledByUser()
-                        && imsManager.isNonTtyOrTtyOnVolteEnabled();
+        if (SubscriptionManager.isValidSubscriptionId(subId)) {
+            final WifiCallingQueryImsState queryState = queryImsState(subId);
+            if (queryState.isWifiCallingProvisioned()) {
+                final boolean currentValue = queryState.isEnabledByUser()
+                        && queryState.isAllowUserControl();
                 final boolean newValue = intent.getBooleanExtra(EXTRA_TOGGLE_STATE,
                         currentValue);
                 final Intent activationAppIntent =
@@ -407,7 +381,8 @@
                     // If either the action is to turn off wifi calling setting
                     // or there is no activation involved - Update the setting
                     if (newValue != currentValue) {
-                        imsManager.setWfcSetting(newValue);
+                        final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId);
+                        imsMmTelManager.setVoWiFiSettingEnabled(newValue);
                     }
                 }
             }
@@ -430,18 +405,17 @@
         final int subId = getDefaultVoiceSubId();
         final int errorValue = -1;
 
-        if (subId > SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
+        if (SubscriptionManager.isValidSubscriptionId(subId)) {
             final boolean isWifiCallingPrefEditable = isCarrierConfigManagerKeyEnabled(
                     CarrierConfigManager.KEY_EDITABLE_WFC_MODE_BOOL, subId, false);
             final boolean isWifiOnlySupported = isCarrierConfigManagerKeyEnabled(
                     CarrierConfigManager.KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL, subId, true);
 
-            final ImsManager imsManager = getImsManager(subId);
+            final WifiCallingQueryImsState queryState = queryImsState(subId);
             if (isWifiCallingPrefEditable
-                    && imsManager.isWfcEnabledByPlatform()
-                    && isWfcProvisionedOnDevice(subId)
-                    && imsManager.isWfcEnabledByUser()
-                    && imsManager.isNonTtyOrTtyOnVolteEnabled()) {
+                    && queryState.isWifiCallingProvisioned()
+                    && queryState.isEnabledByUser()
+                    && queryState.isAllowUserControl()) {
                 // Change the preference only when wifi calling is enabled
                 // And when wifi calling preference is editable for the current carrier
                 final ImsMmTelManager imsMmTelManager = getImsMmTelManager(subId);
@@ -522,11 +496,6 @@
         return SubscriptionManager.getDefaultVoiceSubscriptionId();
     }
 
-    @VisibleForTesting
-    boolean isWfcProvisionedOnDevice(int subId) {
-        return MobileNetworkUtils.isWfcProvisionedOnDevice(subId);
-    }
-
     /**
      * Returns Intent of the activation app required to activate wifi calling or null if there is no
      * need for activation.
@@ -586,4 +555,9 @@
     private Resources getResourcesForSubId(int subId) {
         return SubscriptionManager.getResourcesForSubId(mContext, subId);
     }
+
+    @VisibleForTesting
+    WifiCallingQueryImsState queryImsState(int subId) {
+        return new WifiCallingQueryImsState(mContext, subId);
+    }
 }
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSuggestionActivity.java b/src/com/android/settings/wifi/calling/WifiCallingSuggestionActivity.java
index 526e9c3..6b6eebf 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSuggestionActivity.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSuggestionActivity.java
@@ -19,19 +19,16 @@
 import android.content.Context;
 import android.telephony.SubscriptionManager;
 
-import com.android.ims.ImsManager;
 import com.android.settings.SettingsActivity;
-import com.android.settings.network.telephony.MobileNetworkUtils;
+import com.android.settings.network.ims.WifiCallingQueryImsState;
 
 public class WifiCallingSuggestionActivity extends SettingsActivity {
 
     public static boolean isSuggestionComplete(Context context) {
-        if (!ImsManager.isWfcEnabledByPlatform(context) ||
-                !MobileNetworkUtils.isWfcProvisionedOnDevice(
-                        SubscriptionManager.getDefaultVoiceSubscriptionId())) {
-            return true;
-        }
-        return ImsManager.isWfcEnabledByUser(context)
-                && ImsManager.isNonTtyOrTtyOnVolteEnabled(context);
+        final WifiCallingQueryImsState queryState =
+                new WifiCallingQueryImsState(context,
+                SubscriptionManager.getDefaultVoiceSubscriptionId());
+        return (!queryState.isWifiCallingProvisioned())
+                || (queryState.isEnabledByUser() && queryState.isAllowUserControl());
     }
 }
diff --git a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
index 204529a..dbfd3b2 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java
@@ -19,6 +19,8 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
@@ -35,11 +37,12 @@
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
-import com.android.ims.ImsManager;
 import com.android.internal.R;
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.network.ims.MockWifiCallingQueryImsState;
 
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -56,12 +59,12 @@
     @Mock
     private TelephonyManager mTelephonyManager;
     @Mock
-    private ImsManager mImsManager;
-    @Mock
     private ImsMmTelManager mImsMmTelManager;
     @Mock
     private PreferenceScreen mPreferenceScreen;
 
+    private MockWifiCallingQueryImsState mQueryImsState;
+
     private WifiCallingPreferenceController mController;
     private Preference mPreference;
     private Context mContext;
@@ -73,6 +76,10 @@
 
         mContext = spy(RuntimeEnvironment.application);
 
+        mQueryImsState = new MockWifiCallingQueryImsState(mContext, SUB_ID);
+        mQueryImsState.setIsEnabledByUser(true);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+
         mPreference = new Preference(mContext);
         mController = spy(new WifiCallingPreferenceController(mContext, "wifi_calling") {
             @Override
@@ -82,8 +89,8 @@
         });
         mController.mCarrierConfigManager = mCarrierConfigManager;
         mController.init(SUB_ID);
-        mController.mImsManager = mImsManager;
         mController.mCallState = TelephonyManager.CALL_STATE_IDLE;
+        doReturn(mQueryImsState).when(mController).queryImsState(anyInt());
         mPreference.setKey(mController.getPreferenceKey());
 
         when(mController.getTelephonyManager(mContext, SUB_ID)).thenReturn(mTelephonyManager);
@@ -98,7 +105,7 @@
     @Test
     public void updateState_noSimCallManager_setCorrectSummary() {
         mController.mSimCallManager = null;
-        when(mImsManager.isWfcEnabledByUser()).thenReturn(true);
+        mQueryImsState.setIsEnabledByUser(true);
         when(mImsMmTelManager.getVoWiFiRoamingModeSetting()).thenReturn(
                 ImsMmTelManager.WIFI_MODE_WIFI_ONLY);
         when(mImsMmTelManager.getVoWiFiModeSetting()).thenReturn(
@@ -128,18 +135,17 @@
     }
 
     @Test
-    public void updateState_nonRoaming_wfcCellularPreferred() {
+    public void updateState_wfcNonRoamingByConfig() {
         assertNull(mController.mSimCallManager);
         mCarrierConfig.putBoolean(
                 CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL, true);
         mController.init(SUB_ID);
-        mController.mImsManager = mImsManager;
 
         when(mImsMmTelManager.getVoWiFiRoamingModeSetting()).thenReturn(
                 ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED);
         when(mImsMmTelManager.getVoWiFiModeSetting()).thenReturn(
                 ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED);
-        when(mImsManager.isWfcEnabledByUser()).thenReturn(true);
+        mQueryImsState.setIsEnabledByUser(true);
         when(mTelephonyManager.isNetworkRoaming()).thenReturn(true);
 
         mController.updateState(mPreference);
@@ -148,7 +154,7 @@
     }
 
     @Test
-    public void updateState_roaming_wfcWifiPreferred() {
+    public void updateState_wfcRoamingByConfig() {
         assertNull(mController.mSimCallManager);
         // useWfcHomeModeForRoaming is false by default. In order to check wfc in roaming mode. We
         // need the device roaming, and not using home mode in roaming network.
@@ -156,7 +162,7 @@
                 ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED);
         when(mImsMmTelManager.getVoWiFiModeSetting()).thenReturn(
                 ImsMmTelManager.WIFI_MODE_CELLULAR_PREFERRED);
-        when(mImsManager.isWfcEnabledByUser()).thenReturn(true);
+        mQueryImsState.setIsEnabledByUser(true);
         when(mTelephonyManager.isNetworkRoaming()).thenReturn(true);
 
         mController.updateState(mPreference);
@@ -174,6 +180,7 @@
     }
 
     @Test
+    @Ignore
     public void displayPreference_available_setsSubscriptionIdOnIntent() {
         final Intent intent = new Intent();
         mPreference.setIntent(intent);
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java
index 307c0ac..e864ce3 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/ListWithEntrySummaryPreferenceTest.java
@@ -32,6 +32,7 @@
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowLooper;
 
 @RunWith(RobolectricTestRunner.class)
 public class ListWithEntrySummaryPreferenceTest {
@@ -53,6 +54,7 @@
     public void setUp() {
         mContext = RuntimeEnvironment.application;
         mContext.setTheme(R.style.Theme_Settings_Home);
+        ShadowLooper.pauseMainLooper();
         mPreference = new ListWithEntrySummaryPreference(mContext, null);
         mPreference.setEntries(mDefaultEntries);
         mPreference.setEntryValues(mDefaultEntryValues);
@@ -60,7 +62,7 @@
     }
 
     @Test
-    public void initialize_defaultEntries_shouldDisplayDefalutEntries() {
+    public void initialize_defaultEntries_shouldDisplayDefaultEntries() {
         AlertDialog dialog = showDialog(mPreference);
         ListAdapter adapter = dialog.getListView().getAdapter();
 
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
index 25fa737..207a231 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingDisclaimerFragmentTest.java
@@ -22,7 +22,6 @@
 import static org.mockito.Matchers.anyObject;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -41,9 +40,7 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.shadow.ShadowDisclaimerItemFactory;
-
-import java.util.ArrayList;
-import java.util.List;
+import com.android.settings.testutils.shadow.ShadowFragment;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -52,12 +49,15 @@
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.List;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowDisclaimerItemFactory.class)
+@Config(shadows = {ShadowDisclaimerItemFactory.class, ShadowFragment.class})
 public class WifiCallingDisclaimerFragmentTest {
 
     @Mock
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
index eb9a58d..2e93faa 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsForSubTest.java
@@ -44,17 +44,16 @@
 import android.telephony.CarrierConfigManager;
 import android.telephony.TelephonyManager;
 import android.telephony.ims.ImsMmTelManager;
-import android.telephony.ims.ProvisioningManager;
 import android.view.View;
 import android.widget.TextView;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
-import com.android.ims.ImsConfig;
-import com.android.ims.ImsManager;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.network.ims.MockWifiCallingQueryImsState;
+import com.android.settings.network.ims.WifiCallingQueryImsState;
 import com.android.settings.testutils.shadow.ShadowFragment;
 import com.android.settings.widget.SwitchBar;
 import com.android.settings.widget.ToggleSwitch;
@@ -73,6 +72,8 @@
 @Config(shadows = ShadowFragment.class)
 @RunWith(RobolectricTestRunner.class)
 public class WifiCallingSettingsForSubTest {
+    private static final int SUB_ID = 2;
+
     private static final String BUTTON_WFC_MODE = "wifi_calling_mode";
     private static final String BUTTON_WFC_ROAMING_MODE = "wifi_calling_roaming_mode";
     private static final String TEST_EMERGENCY_ADDRESS_CARRIER_APP =
@@ -83,9 +84,10 @@
     private TextView mEmptyView;
     private final PersistableBundle mBundle = new PersistableBundle();
 
+    private MockWifiCallingQueryImsState mQueryImsState;
+
     @Mock private static CarrierConfigManager sCarrierConfigManager;
     @Mock private CarrierConfigManager mMockConfigManager;
-    @Mock private ImsManager mImsManager;
     @Mock private ImsMmTelManager mImsMmTelManager;
     @Mock private TelephonyManager mTelephonyManager;
     @Mock private PreferenceScreen mPreferenceScreen;
@@ -93,7 +95,6 @@
     @Mock private SwitchBar mSwitchBar;
     @Mock private ToggleSwitch mToggleSwitch;
     @Mock private View mView;
-    @Mock private ImsConfig mImsConfig;
     @Mock private ListWithEntrySummaryPreference mButtonWfcMode;
     @Mock private ListWithEntrySummaryPreference mButtonWfcRoamingMode;
     @Mock private Preference mUpdateAddress;
@@ -127,12 +128,13 @@
         ReflectionHelpers.setField(mSwitchBar, "mSwitch", mToggleSwitch);
         doReturn(mSwitchBar).when(mView).findViewById(R.id.switch_bar);
 
-        doReturn(mImsManager).when(mFragment).getImsManager();
+        mQueryImsState = new MockWifiCallingQueryImsState(mContext, SUB_ID);
+
         doReturn(mImsMmTelManager).when(mFragment).getImsMmTelManager();
-        doReturn(mImsConfig).when(mImsManager).getConfigInterface();
-        doReturn(true).when(mFragment).isWfcProvisionedOnDevice();
-        doReturn(true).when(mImsManager).isWfcEnabledByUser();
-        doReturn(true).when(mImsManager).isNonTtyOrTtyOnVolteEnabled();
+        mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsEnabledByPlatform(true);
+        mQueryImsState.setIsEnabledByUser(true);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
         doReturn(ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED)
                 .when(mImsMmTelManager).getVoWiFiModeSetting();
         doReturn(ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED)
@@ -178,7 +180,7 @@
     @Test
     public void onResume_provisioningDisallowed_shouldFinish() {
         // Call onResume while provisioning is disallowed.
-        doReturn(false).when(mFragment).isWfcProvisionedOnDevice();
+        mQueryImsState.setIsProvisionedOnDevice(false);
         mFragment.onResume();
 
         // Verify that finish() is called
@@ -189,11 +191,11 @@
     public void onResumeOnPause_provisioningCallbackRegistration() throws Exception {
         // Verify that provisioning callback is registered after call to onResume().
         mFragment.onResume();
-        verify(mImsConfig).addConfigCallback(any(ProvisioningManager.Callback.class));
+        verify(mFragment).registerProvisioningChangedCallback();
 
         // Verify that provisioning callback is unregistered after call to onPause.
         mFragment.onPause();
-        verify(mImsConfig).removeConfigCallback(any());
+        verify(mFragment).unregisterProvisioningChangedCallback();
     }
 
     @Test
@@ -327,7 +329,7 @@
         verify(mPreferenceScreen).addPreference(mButtonWfcRoamingMode);
         verify(mPreferenceScreen).addPreference(mUpdateAddress);
         // Check the WFC enable request.
-        verify(mImsManager).setWfcSetting(true);
+        verify(mImsMmTelManager).setVoWiFiSettingEnabled(true);
     }
 
     @Test
@@ -350,5 +352,18 @@
                     return null;
             }
         }
+
+        @Override
+        TelephonyManager getTelephonyManagerForSub(int subId) {
+            return mTelephonyManager;
+        }
+
+        @Override
+        WifiCallingQueryImsState queryImsState(int subId) {
+            return mQueryImsState;
+        }
+
+        @Override
+        void showAlert(Intent intent) {}
     }
 }
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java
index 7957ae0..1ba8e7a 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSettingsTest.java
@@ -18,13 +18,12 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
+import android.content.Context;
 import android.content.Intent;
 import android.provider.Settings;
 import android.telephony.SubscriptionInfo;
@@ -32,14 +31,19 @@
 
 import androidx.fragment.app.FragmentActivity;
 
+import com.android.ims.ImsManager;
 import com.android.settings.R;
 import com.android.settings.network.SubscriptionUtil;
+import com.android.settings.network.ims.MockWifiCallingQueryImsState;
 import com.android.settings.widget.RtlCompatibleViewPager;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.shadows.androidx.fragment.FragmentController;
 
 import java.util.ArrayList;
@@ -48,12 +52,37 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class WifiCallingSettingsTest {
+    private static final int SUB_ID1 = 111;
+    private static final int SUB_ID2 = 222;
+
+    private Context mContext;
+
+    @Mock
+    private ImsManager mImsManager;
 
     private WifiCallingSettings mFragment;
 
+    private MockWifiCallingQueryImsState mQueryImsState1;
+    private MockWifiCallingQueryImsState mQueryImsState2;
+
     @Before
     public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mContext = spy(RuntimeEnvironment.application);
+
+        mQueryImsState1 = new MockWifiCallingQueryImsState(mContext, SUB_ID1);
+        mQueryImsState2 = new MockWifiCallingQueryImsState(mContext, SUB_ID2);
+        mQueryImsState1.setIsEnabledByUser(true);
+        mQueryImsState2.setIsEnabledByUser(true);
+        mQueryImsState1.setIsEnabledByPlatform(true);
+        mQueryImsState2.setIsEnabledByPlatform(true);
+        mQueryImsState1.setIsProvisionedOnDevice(true);
+        mQueryImsState2.setIsProvisionedOnDevice(true);
+
         mFragment = spy(new WifiCallingSettings());
+        doReturn(mQueryImsState1).when(mFragment).queryImsState(SUB_ID1);
+        doReturn(mQueryImsState2).when(mFragment).queryImsState(SUB_ID2);
     }
 
     @Test
@@ -65,12 +94,12 @@
     @Test
     public void setupFragment_oneSubscription_noCrash() {
         final SubscriptionInfo info = mock(SubscriptionInfo.class);
-        when(info.getSubscriptionId()).thenReturn(111);
+        when(info.getSubscriptionId()).thenReturn(SUB_ID1);
 
         SubscriptionUtil.setActiveSubscriptionsForTesting(new ArrayList<>(
                 Collections.singletonList(info)));
-        doReturn(true).when(mFragment).isWfcEnabledByPlatform(any(SubscriptionInfo.class));
-        doReturn(true).when(mFragment).isWfcProvisionedOnDevice(any(SubscriptionInfo.class));
+        mQueryImsState1.setIsEnabledByPlatform(true);
+        mQueryImsState1.setIsProvisionedOnDevice(true);
 
         final Intent intent = new Intent();
         intent.putExtra(Settings.EXTRA_SUB_ID, info.getSubscriptionId());
@@ -88,13 +117,11 @@
     public void setupFragment_twoSubscriptions_correctSelection() {
         final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
         final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
-        when(info1.getSubscriptionId()).thenReturn(111);
-        when(info2.getSubscriptionId()).thenReturn(222);
+        when(info1.getSubscriptionId()).thenReturn(SUB_ID1);
+        when(info2.getSubscriptionId()).thenReturn(SUB_ID2);
 
         SubscriptionUtil.setActiveSubscriptionsForTesting(new ArrayList<>(
                 Arrays.asList(info1, info2)));
-        doReturn(true).when(mFragment).isWfcEnabledByPlatform(any(SubscriptionInfo.class));
-        doReturn(true).when(mFragment).isWfcProvisionedOnDevice(any(SubscriptionInfo.class));
 
         final Intent intent = new Intent();
         intent.putExtra(Settings.EXTRA_SUB_ID, info2.getSubscriptionId());
@@ -114,14 +141,12 @@
     public void setupFragment_twoSubscriptionsOneNotProvisionedOnDevice_oneResult() {
         final SubscriptionInfo info1 = mock(SubscriptionInfo.class);
         final SubscriptionInfo info2 = mock(SubscriptionInfo.class);
-        when(info1.getSubscriptionId()).thenReturn(111);
-        when(info2.getSubscriptionId()).thenReturn(222);
+        when(info1.getSubscriptionId()).thenReturn(SUB_ID1);
+        when(info2.getSubscriptionId()).thenReturn(SUB_ID2);
 
         SubscriptionUtil.setActiveSubscriptionsForTesting(new ArrayList<>(
                 Arrays.asList(info1, info2)));
-        doReturn(true).when(mFragment).isWfcEnabledByPlatform(any(SubscriptionInfo.class));
-        doReturn(true).when(mFragment).isWfcProvisionedOnDevice(eq(info1));
-        doReturn(false).when(mFragment).isWfcProvisionedOnDevice(eq(info2));
+        mQueryImsState2.setIsProvisionedOnDevice(false);
 
         final Intent intent = new Intent();
         intent.putExtra(Settings.EXTRA_SUB_ID, info1.getSubscriptionId());
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java
index 274ce34..0013234 100644
--- a/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/calling/WifiCallingSliceHelperTest.java
@@ -47,6 +47,7 @@
 
 import com.android.ims.ImsManager;
 import com.android.settings.R;
+import com.android.settings.network.ims.MockWifiCallingQueryImsState;
 import com.android.settings.slices.CustomSliceRegistry;
 import com.android.settings.slices.SettingsSliceProvider;
 import com.android.settings.slices.SliceBroadcastReceiver;
@@ -68,6 +69,7 @@
 
 @RunWith(RobolectricTestRunner.class)
 public class WifiCallingSliceHelperTest {
+    private static final int SUB_ID = 1;
 
     private Context mContext;
     @Mock
@@ -79,6 +81,8 @@
     @Mock
     private ImsMmTelManager mMockImsMmTelManager;
 
+    private MockWifiCallingQueryImsState mQueryImsState;
+
     private FakeWifiCallingSliceHelper mWfcSliceHelper;
     private SettingsSliceProvider mProvider;
     private SliceBroadcastReceiver mReceiver;
@@ -101,7 +105,13 @@
         mFeatureFactory = FakeFeatureFactory.setupForTest();
         mSlicesFeatureProvider = mFeatureFactory.getSlicesFeatureProvider();
 
+        mQueryImsState = new MockWifiCallingQueryImsState(mContext, SUB_ID);
+        mQueryImsState.setIsEnabledByUser(true);
+        mQueryImsState.setIsEnabledByPlatform(true);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+
         mWfcSliceHelper = spy(new FakeWifiCallingSliceHelper(mContext));
+        doReturn(mQueryImsState).when(mWfcSliceHelper).queryImsState(anyInt());
 
         // Set-up specs for SliceMetadata.
         SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
@@ -109,6 +119,8 @@
 
     @Test
     public void test_CreateWifiCallingSlice_invalidSubId() {
+        mQueryImsState.setIsEnabledByUser(true);
+        mQueryImsState.setIsProvisionedOnDevice(false);
         mWfcSliceHelper.setDefaultVoiceSubId(-1);
 
         final Slice slice = mWfcSliceHelper.createWifiCallingSlice(
@@ -119,7 +131,7 @@
 
     @Test
     public void test_CreateWifiCallingSlice_wfcNotSupported() {
-        when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(false);
+        mQueryImsState.setIsProvisionedOnDevice(false);
 
         final Slice slice = mWfcSliceHelper.createWifiCallingSlice(
                 CustomSliceRegistry.WIFI_CALLING_URI);
@@ -135,10 +147,9 @@
         turned off) we need to guide the user to wifi calling settings
         activity so the user can perform the activation there.(PrimaryAction)
          */
-        when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true);
-        when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true);
-        when(mMockImsManager.isWfcEnabledByUser()).thenReturn(false);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(false);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsEnabledByUser(false);
+        mQueryImsState.setIsTtyOnVolteEnabled(false);
         when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null);
         mWfcSliceHelper.setActivationAppIntent(new Intent()); // dummy Intent
 
@@ -153,10 +164,9 @@
 
     @Test
     public void test_CreateWifiCallingSlice_success() {
-        when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true);
-        when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true);
-        when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsEnabledByUser(true);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
         when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null);
 
         final Slice slice = mWfcSliceHelper.createWifiCallingSlice(
@@ -168,10 +178,9 @@
 
     @Test
     public void test_SettingSliceProvider_getsRightSliceWifiCalling() {
-        when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true);
-        when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true);
-        when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsEnabledByUser(true);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
         when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null);
         when(mSlicesFeatureProvider.getNewWifiCallingSliceHelper(mContext))
                 .thenReturn(mWfcSliceHelper);
@@ -184,10 +193,9 @@
 
     @Test
     public void test_SliceBroadcastReceiver_toggleOnWifiCalling() {
-        when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true);
-        when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true);
-        when(mMockImsManager.isWfcEnabledByUser()).thenReturn(false);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsEnabledByUser(false);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
         when(mSlicesFeatureProvider.getNewWifiCallingSliceHelper(mContext))
                 .thenReturn(mWfcSliceHelper);
         mWfcSliceHelper.setActivationAppIntent(null);
@@ -201,7 +209,7 @@
         // change the setting
         mReceiver.onReceive(mContext, intent);
 
-        verify((mMockImsManager)).setWfcSetting(mWfcSettingCaptor.capture());
+        verify((mMockImsMmTelManager)).setVoWiFiSettingEnabled(mWfcSettingCaptor.capture());
 
         // assert the change
         assertThat(mWfcSettingCaptor.getValue()).isTrue();
@@ -209,10 +217,9 @@
 
     @Test
     public void test_CreateWifiCallingPreferenceSlice_prefNotEditable() {
-        when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true);
-        when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true);
-        when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsEnabledByUser(true);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
         mWfcSliceHelper.setIsWifiCallingPrefEditable(false);
 
         final Slice slice = mWfcSliceHelper.createWifiCallingPreferenceSlice(
@@ -224,10 +231,9 @@
 
     @Test
     public void test_CreateWifiCallingPreferenceSlice_wfcOff() {
-        when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true);
-        when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true);
-        when(mMockImsManager.isWfcEnabledByUser()).thenReturn(false);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsEnabledByUser(false);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
         mWfcSliceHelper.setIsWifiCallingPrefEditable(true);
 
         final Slice slice = mWfcSliceHelper.createWifiCallingPreferenceSlice(
@@ -241,10 +247,9 @@
 
     @Test
     public void test_CreateWifiCallingPreferenceSlice_success() {
-        when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true);
-        when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true);
-        when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsEnabledByUser(true);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
         when(mMockImsMmTelManager.getVoWiFiModeSetting()).thenReturn(
                 ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED);
         mWfcSliceHelper.setIsWifiCallingPrefEditable(true);
@@ -259,10 +264,9 @@
 
     @Test
     public void test_SettingsSliceProvider_getWfcPreferenceSlice() {
-        when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true);
-        when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true);
-        when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsEnabledByUser(true);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
         when(mMockImsMmTelManager.getVoWiFiModeSetting()).thenReturn(
                 ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED);
         when(mSlicesFeatureProvider.getNewWifiCallingSliceHelper(mContext))
@@ -278,10 +282,9 @@
     }
     @Test
     public void test_SliceBroadcastReceiver_setWfcPrefCellularPref() {
-        when(mMockImsManager.isWfcEnabledByPlatform()).thenReturn(true);
-        when(mWfcSliceHelper.isWfcProvisionedOnDevice(anyInt())).thenReturn(true);
-        when(mMockImsManager.isWfcEnabledByUser()).thenReturn(true);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
+        mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsEnabledByUser(true);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
         when(mMockImsMmTelManager.getVoWiFiModeSetting()).thenReturn(
                 ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED);
         when(mSlicesFeatureProvider.getNewWifiCallingSliceHelper(mContext))
@@ -433,12 +436,6 @@
             return mMockCarrierConfigManager;
         }
 
-        @Override
-        protected ImsManager getImsManager(int subId) {
-            return mMockImsManager;
-        }
-
-        @Override
         protected ImsMmTelManager getImsMmTelManager(int subId) {
             return mMockImsMmTelManager;
         }
@@ -451,10 +448,6 @@
             mSubId = id;
         }
 
-        boolean isWfcProvisionedOnDevice(int subId) {
-            return true;
-        }
-
         @Override
         protected Intent getWifiCallingCarrierActivityIntent(int subId) {
             return mActivationAppIntent;