[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();