From 21361e1f84dbf55fcf6bd0675e9bbe5a09beb37b Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Fri, 15 Nov 2019 14:43:29 +0800 Subject: [PATCH] [Settings] Refactor PhoneStateListener Remove Looper and update of mSubId Bug: 144542981 Test: make RunSettingsRoboTests -j ROBOTEST_FILTER=Enhanced4gBasePreferenceControllerTest make RunSettingsRoboTests -j ROBOTEST_FILTER=VideoCallingPreferenceControllerTest make RunSettingsRoboTests -j ROBOTEST_FILTER=WifiCallingPreferenceControllerTest Change-Id: Ie6ae5b5914322644f2655e585b03a6b685bbc84a --- .../Enhanced4gBasePreferenceController.java | 21 ++++----- .../VideoCallingPreferenceController.java | 21 ++++----- .../WifiCallingPreferenceController.java | 44 +++++++++++++------ ...nhanced4gBasePreferenceControllerTest.java | 2 +- .../WifiCallingPreferenceControllerTest.java | 13 +++--- 5 files changed, 59 insertions(+), 42 deletions(-) diff --git a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java index 869091a8650..668f7630066 100644 --- a/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java +++ b/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceController.java @@ -17,7 +17,6 @@ package com.android.settings.network.telephony; import android.content.Context; -import android.os.Looper; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.PhoneStateListener; @@ -47,7 +46,6 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc implements LifecycleObserver, OnStart, OnStop { private Preference mPreference; - private TelephonyManager mTelephonyManager; private CarrierConfigManager mCarrierConfigManager; private PersistableBundle mCarrierConfig; @VisibleForTesting @@ -67,7 +65,7 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc super(context, key); mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); m4gLteListeners = new ArrayList<>(); - mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper()); + mPhoneStateListener = new PhoneCallStateListener(); } public Enhanced4gBasePreferenceController init(int subId) { @@ -75,8 +73,6 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc return this; } mSubId = subId; - mTelephonyManager = mContext.getSystemService(TelephonyManager.class) - .createForSubscriptionId(mSubId); mCarrierConfig = mCarrierConfigManager.getConfigForSubId(mSubId); if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { mImsManager = ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(mSubId)); @@ -123,7 +119,7 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc @Override public void onStart() { - mPhoneStateListener.register(mSubId); + mPhoneStateListener.register(mContext, mSubId); } @Override @@ -192,18 +188,23 @@ public class Enhanced4gBasePreferenceController extends TelephonyTogglePreferenc private class PhoneCallStateListener extends PhoneStateListener { - public PhoneCallStateListener(Looper looper) { - super(looper); + PhoneCallStateListener() { + super(); } + private TelephonyManager mTelephonyManager; + @Override public void onCallStateChanged(int state, String incomingNumber) { mCallState = state; updateState(mPreference); } - public void register(int subId) { - Enhanced4gBasePreferenceController.this.mSubId = subId; + public void register(Context context, int subId) { + mTelephonyManager = context.getSystemService(TelephonyManager.class); + if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + mTelephonyManager = mTelephonyManager.createForSubscriptionId(subId); + } mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE); } diff --git a/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java b/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java index 22a3b7c4c57..9aa390cb8e5 100644 --- a/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/VideoCallingPreferenceController.java @@ -17,7 +17,6 @@ package com.android.settings.network.telephony; import android.content.Context; -import android.os.Looper; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.PhoneStateListener; @@ -47,7 +46,6 @@ public class VideoCallingPreferenceController extends TelephonyTogglePreferenceC Enhanced4gBasePreferenceController.On4gLteUpdateListener { private Preference mPreference; - private TelephonyManager mTelephonyManager; private CarrierConfigManager mCarrierConfigManager; @VisibleForTesting ImsManager mImsManager; @@ -60,7 +58,7 @@ public class VideoCallingPreferenceController extends TelephonyTogglePreferenceC super(context, key); mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); mDataContentObserver = new MobileDataEnabledListener(context, this); - mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper()); + mPhoneStateListener = new PhoneCallStateListener(); } @Override @@ -79,7 +77,7 @@ public class VideoCallingPreferenceController extends TelephonyTogglePreferenceC @Override public void onStart() { - mPhoneStateListener.register(mSubId); + mPhoneStateListener.register(mContext, mSubId); mDataContentObserver.start(mSubId); } @@ -120,9 +118,7 @@ public class VideoCallingPreferenceController extends TelephonyTogglePreferenceC public VideoCallingPreferenceController init(int subId) { mSubId = subId; - mTelephonyManager = mContext.getSystemService(TelephonyManager.class); if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId); mImsManager = ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(mSubId)); } @@ -177,18 +173,23 @@ public class VideoCallingPreferenceController extends TelephonyTogglePreferenceC private class PhoneCallStateListener extends PhoneStateListener { - public PhoneCallStateListener(Looper looper) { - super(looper); + PhoneCallStateListener() { + super(); } + private TelephonyManager mTelephonyManager; + @Override public void onCallStateChanged(int state, String incomingNumber) { mCallState = state; updateState(mPreference); } - public void register(int subId) { - VideoCallingPreferenceController.this.mSubId = subId; + public void register(Context context, int subId) { + mTelephonyManager = context.getSystemService(TelephonyManager.class); + if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + mTelephonyManager = mTelephonyManager.createForSubscriptionId(subId); + } mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE); } diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java index efd24e633c0..2f176efaecd 100644 --- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java +++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java @@ -20,7 +20,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.os.Looper; import android.os.PersistableBundle; import android.provider.Settings; import android.telecom.PhoneAccountHandle; @@ -49,7 +48,8 @@ import java.util.List; public class WifiCallingPreferenceController extends TelephonyBasePreferenceController implements LifecycleObserver, OnStart, OnStop { - private TelephonyManager mTelephonyManager; + @VisibleForTesting + Integer mCallState; @VisibleForTesting CarrierConfigManager mCarrierConfigManager; @VisibleForTesting @@ -63,8 +63,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont public WifiCallingPreferenceController(Context context, String key) { super(context, key); mCarrierConfigManager = context.getSystemService(CarrierConfigManager.class); - mTelephonyManager = context.getSystemService(TelephonyManager.class); - mPhoneStateListener = new PhoneCallStateListener(Looper.getMainLooper()); + mPhoneStateListener = new PhoneCallStateListener(); } @Override @@ -77,7 +76,7 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont @Override public void onStart() { - mPhoneStateListener.register(mSubId); + mPhoneStateListener.register(mContext, mSubId); } @Override @@ -98,6 +97,9 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont @Override public void updateState(Preference preference) { super.updateState(preference); + if (mCallState == null) { + return; + } if (mSimCallManager != null) { final Intent intent = MobileNetworkUtils.buildPhoneAccountConfigureIntent(mContext, mSimCallManager); @@ -126,7 +128,8 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont .KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL); } } - final boolean isRoaming = mTelephonyManager.isNetworkRoaming(); + final boolean isRoaming = getTelephonyManager(mContext, mSubId) + .isNetworkRoaming(); final int wfcMode = (isRoaming && !useWfcHomeModeForRoaming) ? mImsMmTelManager.getVoWiFiRoamingModeSetting() : mImsMmTelManager.getVoWiFiModeSetting(); @@ -147,14 +150,11 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont } preference.setSummary(resId); } - preference.setEnabled( - mTelephonyManager.getCallState(mSubId) == TelephonyManager.CALL_STATE_IDLE); + preference.setEnabled(mCallState == TelephonyManager.CALL_STATE_IDLE); } public WifiCallingPreferenceController init(int subId) { mSubId = subId; - mTelephonyManager = mContext.getSystemService(TelephonyManager.class) - .createForSubscriptionId(mSubId); mImsManager = ImsManager.getInstance(mContext, SubscriptionManager.getPhoneId(mSubId)); mImsMmTelManager = getImsMmTelManager(mSubId); mSimCallManager = mContext.getSystemService(TelecomManager.class) @@ -167,23 +167,39 @@ public class WifiCallingPreferenceController extends TelephonyBasePreferenceCont return ImsMmTelManager.createForSubscriptionId(subId); } + @VisibleForTesting + TelephonyManager getTelephonyManager(Context context, int subId) { + final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class); + if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + return telephonyMgr; + } + final TelephonyManager subscriptionTelephonyMgr = + telephonyMgr.createForSubscriptionId(subId); + return (subscriptionTelephonyMgr == null) ? telephonyMgr : subscriptionTelephonyMgr; + } + + private class PhoneCallStateListener extends PhoneStateListener { - public PhoneCallStateListener(Looper looper) { - super(looper); + PhoneCallStateListener() { + super(); } + private TelephonyManager mTelephonyManager; + @Override public void onCallStateChanged(int state, String incomingNumber) { + mCallState = state; updateState(mPreference); } - public void register(int subId) { - WifiCallingPreferenceController.this.mSubId = subId; + public void register(Context context, int subId) { + mTelephonyManager = getTelephonyManager(context, subId); mTelephonyManager.listen(this, PhoneStateListener.LISTEN_CALL_STATE); } public void unregister() { + mCallState = null; mTelephonyManager.listen(this, PhoneStateListener.LISTEN_NONE); } } 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 9c1dc4f1b1c..714eb4ec5eb 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/Enhanced4gBasePreferenceControllerTest.java @@ -71,7 +71,7 @@ public class Enhanced4gBasePreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE); + doReturn(mTelephonyManager).when(mContext).getSystemService(TelephonyManager.class); doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class); doReturn(mCarrierConfigManager).when(mContext).getSystemService(CarrierConfigManager.class); doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID); diff --git a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java index a320c6edecc..1c79266ee02 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/WifiCallingPreferenceControllerTest.java @@ -72,22 +72,22 @@ public class WifiCallingPreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager); - when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); - when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager); mPreference = new Preference(mContext); - mController = new WifiCallingPreferenceController(mContext, "wifi_calling") { + mController = spy(new WifiCallingPreferenceController(mContext, "wifi_calling") { @Override protected ImsMmTelManager getImsMmTelManager(int subId) { return mImsMmTelManager; } - }; + }); mController.mCarrierConfigManager = mCarrierConfigManager; mController.init(SUB_ID); mController.mImsManager = mImsManager; + mController.mCallState = TelephonyManager.CALL_STATE_IDLE; mPreference.setKey(mController.getPreferenceKey()); + when(mController.getTelephonyManager(mContext, SUB_ID)).thenReturn(mTelephonyManager); + mCarrierConfig = new PersistableBundle(); when(mCarrierConfigManager.getConfigForSubId(SUB_ID)).thenReturn(mCarrierConfig); @@ -112,8 +112,7 @@ public class WifiCallingPreferenceControllerTest { @Test public void updateState_notCallIdle_disable() { - when(mTelephonyManager.getCallState(SUB_ID)).thenReturn( - TelephonyManager.CALL_STATE_RINGING); + mController.mCallState = TelephonyManager.CALL_STATE_RINGING; mController.updateState(mPreference);