[Settings] Use background thread to get VoNr state.

 - TelephonyManager#isVoNrEnabled may not send back the result in time,
   so use different thread and timer to prevent ANR.

Bug: 282876876
Test: atest passed
Change-Id: Ie6cc0f8a459f5ebed930e457dacb9b742df70fad
diff --git a/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java b/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java
index b585ece..5786dfc 100644
--- a/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java
+++ b/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java
@@ -17,6 +17,8 @@
 package com.android.settings.network.telephony;
 
 import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
 import android.os.PersistableBundle;
 import android.telephony.CarrierConfigManager;
 import android.telephony.SubscriptionManager;
@@ -33,9 +35,10 @@
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnStart;
 import com.android.settingslib.core.lifecycle.events.OnStop;
+import com.android.settingslib.utils.ThreadUtils;
 
 /**
- * Preference controller for "Enhanced 4G LTE"
+ * Preference controller for "Voice over NR".
  */
 public class NrAdvancedCallingPreferenceController extends TelephonyTogglePreferenceController
         implements LifecycleObserver, OnStart, OnStop {
@@ -50,8 +53,11 @@
     private boolean mIsVonrVisibleFromCarrierConfig = false;
     private boolean mIsNrEnableFromCarrierConfig = false;
     private boolean mHas5gCapability = false;
+    private boolean mIsVoNrEnabled = false;
     private Integer mCallState;
 
+    private Handler mHandler = new Handler(Looper.getMainLooper());
+
     public NrAdvancedCallingPreferenceController(Context context, String key) {
         super(context, key);
         mTelephonyManager = context.getSystemService(TelephonyManager.class);
@@ -94,6 +100,8 @@
                 CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY);
         mIsNrEnableFromCarrierConfig = !ArrayUtils.isEmpty(nrAvailabilities);
 
+        updateVoNrState();
+
         Log.d(TAG, "mHas5gCapability: " + mHas5gCapability
                 + ",mIsNrEnabledFromCarrierConfig: " + mIsNrEnableFromCarrierConfig
                 + ",mIsVonrEnabledFromCarrierConfig: " + mIsVonrEnabledFromCarrierConfig
@@ -162,7 +170,7 @@
 
     @Override
     public boolean isChecked() {
-        return mTelephonyManager.isVoNrEnabled();
+        return mIsVoNrEnabled;
     }
 
     @VisibleForTesting
@@ -174,6 +182,19 @@
         return isCallStateIdle();
     }
 
+    private void updateVoNrState() {
+        ThreadUtils.postOnBackgroundThread(() -> {
+            boolean result = mTelephonyManager.isVoNrEnabled();
+            if (result != mIsVoNrEnabled) {
+                Log.i(TAG, "VoNr state : " + result);
+                mIsVoNrEnabled = result;
+                mHandler.post(() -> {
+                    updateState(mPreference);
+                });
+            }
+        });
+    }
+
     private class PhoneCallStateTelephonyCallback extends TelephonyCallback implements
             TelephonyCallback.CallStateListener {
 
diff --git a/tests/unit/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceControllerTest.java
index 9d4082e..053fb4d 100644
--- a/tests/unit/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceControllerTest.java
@@ -186,6 +186,7 @@
         doReturn(true).when(mTelephonyManager).isVoNrEnabled();
         mPreference.setChecked(false);
 
+        mController.init(SUB_ID);
         mController.updateState(mPreference);
 
         assertThat(mPreference.isChecked()).isTrue();