diff --git a/src/com/android/settings/network/ims/VolteQueryImsState.java b/src/com/android/settings/network/ims/VolteQueryImsState.java
index 1fa72d7..167b4b1 100644
--- a/src/com/android/settings/network/ims/VolteQueryImsState.java
+++ b/src/com/android/settings/network/ims/VolteQueryImsState.java
@@ -27,10 +27,6 @@
 
 import androidx.annotation.VisibleForTesting;
 
-import com.android.ims.ImsManager;
-import com.android.settings.network.SubscriptionUtil;
-import com.android.settings.network.telephony.MobileNetworkUtils;
-
 /**
  * Controller class for querying Volte status
  */
@@ -66,12 +62,6 @@
         return (new ImsQueryEnhanced4gLteModeUserSetting(subId)).query();
     }
 
-    @VisibleForTesting
-    ImsManager getImsManager(int subId) {
-        return ImsManager.getInstance(mContext,
-                SubscriptionUtil.getPhoneId(mContext, subId));
-    }
-
     /**
      * Check whether VoLTE has been provisioned or not on this subscription
      *
@@ -101,8 +91,15 @@
         if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
             return false;
         }
-        return isVoLteProvisioned()
-                && MobileNetworkUtils.isImsServiceStateReady(getImsManager(mSubId));
+        if (!isVoLteProvisioned()) {
+            return false;
+        }
+        try {
+            return isServiceStateReady(mSubId);
+        } catch (InterruptedException | IllegalArgumentException | ImsException exception) {
+            Log.w(LOG_TAG, "fail to get VoLte service status. subId=" + mSubId, exception);
+        }
+        return false;
     }
 
     /**
diff --git a/tests/robotests/src/com/android/settings/network/ims/MockVolteQueryImsState.java b/tests/robotests/src/com/android/settings/network/ims/MockVolteQueryImsState.java
index 97d76ca..515ab5b 100644
--- a/tests/robotests/src/com/android/settings/network/ims/MockVolteQueryImsState.java
+++ b/tests/robotests/src/com/android/settings/network/ims/MockVolteQueryImsState.java
@@ -19,10 +19,6 @@
 import android.content.Context;
 import android.telephony.ims.ImsException;
 
-import com.android.ims.ImsManager;
-
-
-
 /**
  * Controller class for mock VoLte status
  */
@@ -31,6 +27,7 @@
     private Boolean mIsTtyOnVolteEnabled;
     private Boolean mIsSupported;
     private Boolean mIsProvisionedOnDevice;
+    private Boolean mIsServiceStateReady;
     private Boolean mIsEnabledByUser;
 
     /**
@@ -43,10 +40,6 @@
         super(context, subId);
     }
 
-    public ImsManager getImsManager(int subId) {
-        return super.getImsManager(subId);
-    }
-
     public void setIsTtyOnVolteEnabled(boolean enabled) {
         mIsTtyOnVolteEnabled = enabled;
     }
@@ -84,6 +77,19 @@
         return super.isProvisionedOnDevice(subId);
     }
 
+    public void setServiceStateReady(boolean isReady) {
+        mIsServiceStateReady = isReady;
+    }
+
+    @Override
+    boolean isServiceStateReady(int subId) throws InterruptedException, ImsException,
+            IllegalArgumentException {
+        if (mIsServiceStateReady != null) {
+            return mIsServiceStateReady;
+        }
+        return super.isServiceStateReady(subId);
+    }
+
     public void setIsEnabledByUser(boolean enabled) {
         mIsEnabledByUser = enabled;
     }
diff --git a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java
index ba71a79..598f30a 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java
@@ -28,12 +28,9 @@
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.telephony.ims.ProvisioningManager;
-import android.telephony.ims.feature.MmTelFeature;
-import android.telephony.ims.stub.ImsRegistrationImplBase;
 
 import androidx.preference.SwitchPreference;
 
-import com.android.ims.ImsManager;
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.network.ims.MockVolteQueryImsState;
 import com.android.settingslib.RestrictedSwitchPreference;
@@ -59,8 +56,6 @@
     @Mock
     private CarrierConfigManager mCarrierConfigManager;
     @Mock
-    private ImsManager mImsManager;
-    @Mock
     private ProvisioningManager mProvisioningManager;
 
     private MockVolteQueryImsState mQueryImsState;
@@ -86,9 +81,10 @@
         doReturn(mCarrierConfig).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
 
         mQueryImsState = spy(new MockVolteQueryImsState(mContext, SUB_ID));
-        doReturn(mImsManager).when(mQueryImsState).getImsManager(anyInt());
         mQueryImsState.setEnabledByPlatform(true);
         mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
+        mQueryImsState.setServiceStateReady(true);
         mQueryImsState.setIsEnabledByUser(true);
 
         mPreference = new RestrictedSwitchPreference(mContext);
@@ -100,6 +96,9 @@
 
     @Test
     public void getAvailabilityStatus_default_returnUnavailable() {
+        mQueryImsState.setEnabledByPlatform(false);
+        mQueryImsState.setIsProvisionedOnDevice(false);
+
         mController.init(SUB_ID);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(
@@ -109,9 +108,6 @@
     @Test
     public void getAvailabilityStatus_volteDisabled_returnUnavailable() {
         mQueryImsState.setEnabledByPlatform(false);
-        doReturn(true).when(mProvisioningManager).getProvisioningStatusForCapability(
-                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
-                ImsRegistrationImplBase.REGISTRATION_TECH_LTE);
 
         assertThat(mController.getAvailabilityStatus()).isEqualTo(
                 BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
@@ -123,7 +119,6 @@
         mPreference.setEnabled(false);
         mCarrierConfig.putInt(CarrierConfigManager.KEY_ENHANCED_4G_LTE_TITLE_VARIANT_INT, 1);
         mController.mCallState = TelephonyManager.CALL_STATE_IDLE;
-        doReturn(true).when(mImsManager).isNonTtyOrTtyOnVolteEnabled();
         mCarrierConfig.putBoolean(CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL, true);
 
         mController.updateState(mPreference);
@@ -135,8 +130,6 @@
     public void updateState_configOn_prefChecked() {
         mQueryImsState.setIsEnabledByUser(true);
         mPreference.setChecked(false);
-        doReturn(true).when(mImsManager).isEnhanced4gLteModeSettingEnabledByUser();
-        doReturn(true).when(mImsManager).isNonTtyOrTtyOnVolteEnabled();
 
         mController.updateState(mPreference);
 
diff --git a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
index 944d8e6..50446ad 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gLteSliceHelperTest.java
@@ -43,7 +43,6 @@
 import androidx.slice.core.SliceQuery;
 import androidx.slice.widget.SliceLiveData;
 
-import com.android.ims.ImsManager;
 import com.android.settings.R;
 import com.android.settings.network.ims.MockVolteQueryImsState;
 import com.android.settings.slices.CustomSliceRegistry;
@@ -74,8 +73,6 @@
     private CarrierConfigManager mMockCarrierConfigManager;
 
     @Mock
-    private ImsManager mMockImsManager;
-    @Mock
     private ProvisioningManager mProvisioningManager;
 
     private ShadowSubscriptionManager mShadowSubscriptionManager;
@@ -109,9 +106,10 @@
         mReceiver = spy(new SliceBroadcastReceiver());
 
         mQueryImsState = spy(new MockVolteQueryImsState(mContext, SUB_ID));
-        doReturn(mMockImsManager).when(mQueryImsState).getImsManager(anyInt());
         mQueryImsState.setEnabledByPlatform(true);
         mQueryImsState.setIsProvisionedOnDevice(true);
+        mQueryImsState.setIsTtyOnVolteEnabled(true);
+        mQueryImsState.setServiceStateReady(true);
         mQueryImsState.setIsEnabledByUser(true);
 
         mEnhanced4gLteSliceHelper = spy(new FakeEnhanced4gLteSliceHelper(mContext));
@@ -149,7 +147,6 @@
     public void test_CreateEnhanced4gLteSlice_success() {
         mQueryImsState.setEnabledByPlatform(true);
         mQueryImsState.setIsProvisionedOnDevice(true);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
         when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null);
 
         final Slice slice = mEnhanced4gLteSliceHelper.createEnhanced4gLteSlice(
@@ -163,7 +160,6 @@
     public void test_SettingSliceProvider_getsRightSliceEnhanced4gLte() {
         mQueryImsState.setEnabledByPlatform(true);
         mQueryImsState.setIsProvisionedOnDevice(true);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
         when(mMockCarrierConfigManager.getConfigForSubId(1)).thenReturn(null);
         when(mSlicesFeatureProvider.getNewEnhanced4gLteSliceHelper(mContext))
                 .thenReturn(mEnhanced4gLteSliceHelper);
@@ -180,7 +176,6 @@
         mQueryImsState.setEnabledByPlatform(true);
         mQueryImsState.setIsProvisionedOnDevice(true);
         mQueryImsState.setIsEnabledByUser(false);
-        when(mMockImsManager.isNonTtyOrTtyOnVolteEnabled()).thenReturn(true);
         when(mSlicesFeatureProvider.getNewEnhanced4gLteSliceHelper(mContext))
                 .thenReturn(mEnhanced4gLteSliceHelper);
 
@@ -194,7 +189,7 @@
         // change the setting
         mReceiver.onReceive(mContext, intent);
 
-        verify((mMockImsManager)).setEnhanced4gLteModeSetting(
+        verify(mEnhanced4gLteSliceHelper).setEnhanced4gLteModeSetting(anyInt(),
                 mEnhanced4gLteSettingCaptor.capture());
 
         // assert the change
