Merge "[Settings] Reduce the operation of VoLTE config redraw"
diff --git a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
index f6db370..ba12146 100644
--- a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
+++ b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java
@@ -57,8 +57,7 @@
     private boolean mShow5gLimitedDialog;
     boolean mIsNrEnabledFromCarrierConfig;
     private boolean mHas5gCapability;
-    @VisibleForTesting
-    Integer mCallState;
+    private Integer mCallState;
     private final List<On4gLteUpdateListener> m4gLteListeners;
 
     protected static final int MODE_NONE = -1;
@@ -199,8 +198,13 @@
         return new VolteQueryImsState(mContext, subId);
     }
 
+    @VisibleForTesting
+    boolean isCallStateIdle() {
+        return (mCallState != null) && (mCallState == TelephonyManager.CALL_STATE_IDLE);
+    }
+
     private boolean isUserControlAllowed(final PersistableBundle carrierConfig) {
-        return (mCallState != null) && (mCallState == TelephonyManager.CALL_STATE_IDLE)
+        return isCallStateIdle()
                 && (carrierConfig != null)
                 && carrierConfig.getBoolean(
                 CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL);
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 598f30a..d107814 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java
@@ -79,6 +79,9 @@
 
         mCarrierConfig = new PersistableBundle();
         doReturn(mCarrierConfig).when(mCarrierConfigManager).getConfigForSubId(SUB_ID);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_HIDE_ENHANCED_4G_LTE_BOOL, false);
+        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL, true);
+        mCarrierConfig.putInt(CarrierConfigManager.KEY_ENHANCED_4G_LTE_TITLE_VARIANT_INT, 1);
 
         mQueryImsState = spy(new MockVolteQueryImsState(mContext, SUB_ID));
         mQueryImsState.setEnabledByPlatform(true);
@@ -91,6 +94,8 @@
         mController = spy(new Enhanced4gLtePreferenceController(mContext, "VoLTE"));
         mController.init(SUB_ID);
         doReturn(mQueryImsState).when(mController).queryImsState(anyInt());
+        doReturn(true).when(mController).isCallStateIdle();
+        doReturn(1).when(mController).getMode();
         mPreference.setKey(mController.getPreferenceKey());
     }
 
@@ -106,6 +111,16 @@
     }
 
     @Test
+    public void getAvailabilityStatus_modeMismatch_returnUnavailable() {
+        doReturn(2).when(mController).getMode();
+
+        mController.init(SUB_ID);
+
+        assertThat(mController.getAvailabilityStatus()).isEqualTo(
+                BasePreferenceController.CONDITIONALLY_UNAVAILABLE);
+    }
+
+    @Test
     public void getAvailabilityStatus_volteDisabled_returnUnavailable() {
         mQueryImsState.setEnabledByPlatform(false);
 
@@ -115,11 +130,7 @@
 
     @Test
     public void updateState_configEnabled_prefEnabled() {
-        mQueryImsState.setIsEnabledByUser(true);
         mPreference.setEnabled(false);
-        mCarrierConfig.putInt(CarrierConfigManager.KEY_ENHANCED_4G_LTE_TITLE_VARIANT_INT, 1);
-        mController.mCallState = TelephonyManager.CALL_STATE_IDLE;
-        mCarrierConfig.putBoolean(CarrierConfigManager.KEY_EDITABLE_ENHANCED_4G_LTE_BOOL, true);
 
         mController.updateState(mPreference);
 
@@ -127,6 +138,16 @@
     }
 
     @Test
+    public void updateState_callStateNotIdle_prefDisabled() {
+        doReturn(false).when(mController).isCallStateIdle();
+        mPreference.setEnabled(true);
+
+        mController.updateState(mPreference);
+
+        assertThat(mPreference.isEnabled()).isFalse();
+    }
+
+    @Test
     public void updateState_configOn_prefChecked() {
         mQueryImsState.setIsEnabledByUser(true);
         mPreference.setChecked(false);