From 97a1fc643e23158f22316ec5a517bbcce278ab79 Mon Sep 17 00:00:00 2001 From: tom hsu Date: Wed, 24 May 2023 16:06:47 +0800 Subject: [PATCH] [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 --- ...NrAdvancedCallingPreferenceController.java | 25 +++++++++++++++++-- ...vancedCallingPreferenceControllerTest.java | 1 + 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java b/src/com/android/settings/network/telephony/NrAdvancedCallingPreferenceController.java index b585ecec6a4..5786dfc99cd 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.internal.telephony.util.ArrayUtils; 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 @@ public class NrAdvancedCallingPreferenceController extends TelephonyTogglePrefer 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 @@ public class NrAdvancedCallingPreferenceController extends TelephonyTogglePrefer 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 @@ public class NrAdvancedCallingPreferenceController extends TelephonyTogglePrefer @Override public boolean isChecked() { - return mTelephonyManager.isVoNrEnabled(); + return mIsVoNrEnabled; } @VisibleForTesting @@ -174,6 +182,19 @@ public class NrAdvancedCallingPreferenceController extends TelephonyTogglePrefer 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 9d4082ecff6..053fb4d8916 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 @@ public class NrAdvancedCallingPreferenceControllerTest { doReturn(true).when(mTelephonyManager).isVoNrEnabled(); mPreference.setChecked(false); + mController.init(SUB_ID); mController.updateState(mPreference); assertThat(mPreference.isChecked()).isTrue();