From c0b8f62b57b189a0f9a6daf2c60e1e321640fb55 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Wed, 27 Jan 2021 22:14:56 +0800 Subject: [PATCH] The UI is not immediately updated Solution: Add Data Connection State listener by PhoneStateListener. Bug: 178350321 Test: atest NetworkProviderWorkerTest Change-Id: I692209035332bfd463537988f4e3ce166414031e (cherry picked from commit 59958e663d2242ddfdbb9932826fca5ba8407b8e) Merged-In: I692209035332bfd463537988f4e3ce166414031e --- .../telephony/NetworkProviderWorker.java | 36 ++++++++++--------- .../telephony/NetworkProviderWorkerTest.java | 12 +++++++ 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/com/android/settings/network/telephony/NetworkProviderWorker.java b/src/com/android/settings/network/telephony/NetworkProviderWorker.java index e2e0264375c..50c56cf659f 100644 --- a/src/com/android/settings/network/telephony/NetworkProviderWorker.java +++ b/src/com/android/settings/network/telephony/NetworkProviderWorker.java @@ -43,8 +43,6 @@ import com.android.settingslib.mobile.MobileMappings; import com.android.settingslib.mobile.MobileMappings.Config; import java.util.Collections; -import java.util.concurrent.Executor; - /** * BackgroundWorker for Provider Model slice. @@ -63,6 +61,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements private DataConnectivityListener mConnectivityListener; private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private final Context mContext; + final Handler mHandler; @VisibleForTesting final PhoneStateListener mPhoneStateListener; private TelephonyManager mTelephonyManager; @@ -76,15 +75,15 @@ public class NetworkProviderWorker extends WifiScanWorker implements public NetworkProviderWorker(Context context, Uri uri) { super(context, uri); // Mobile data worker - final Handler handler = new Handler(Looper.getMainLooper()); - mMobileDataObserver = new DataContentObserver(handler, this); + mHandler = new Handler(Looper.getMainLooper()); + mMobileDataObserver = new DataContentObserver(mHandler, this); mContext = context; mDefaultDataSubid = getDefaultDataSubscriptionId(); mTelephonyManager = mContext.getSystemService( TelephonyManager.class).createForSubscriptionId(mDefaultDataSubid); - mPhoneStateListener = new NetworkProviderPhoneStateListener(handler::post); + mPhoneStateListener = new NetworkProviderPhoneStateListener(); mSubscriptionsListener = new SubscriptionsChangeListener(context, this); mDataEnabledListener = new MobileDataEnabledListener(context, this); mConnectivityListener = new DataConnectivityListener(context, this); @@ -102,9 +101,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements mDataEnabledListener.start(mDefaultDataSubid); mConnectivityListener.start(); mSignalStrengthListener.resume(); - mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE - | PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED); - + mTelephonyManager.registerPhoneStateListener(mHandler::post, mPhoneStateListener); super.onSlicePinned(); } @@ -115,7 +112,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements mDataEnabledListener.stop(); mConnectivityListener.stop(); mSignalStrengthListener.pause(); - mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); + mTelephonyManager.unregisterPhoneStateListener(mPhoneStateListener); super.onSliceUnpinned(); } @@ -145,13 +142,12 @@ public class NetworkProviderWorker extends WifiScanWorker implements return; } if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) { - mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); + mTelephonyManager.unregisterPhoneStateListener(mPhoneStateListener); mMobileDataObserver.unregister(mContext); mSignalStrengthListener.updateSubscriptionIds(Collections.singleton(defaultDataSubId)); mTelephonyManager = mTelephonyManager.createForSubscriptionId(defaultDataSubId); - mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE - | PhoneStateListener.LISTEN_DISPLAY_INFO_CHANGED); + mTelephonyManager.registerPhoneStateListener(mHandler::post, mPhoneStateListener); mMobileDataObserver.register(mContext, mDefaultDataSubid); mConfig = getConfig(mContext); } else { @@ -221,11 +217,10 @@ public class NetworkProviderWorker extends WifiScanWorker implements } } - class NetworkProviderPhoneStateListener extends PhoneStateListener { - NetworkProviderPhoneStateListener(Executor executor) { - super(executor); - } - + class NetworkProviderPhoneStateListener extends PhoneStateListener implements + PhoneStateListener.DataConnectionStateChangedListener, + PhoneStateListener.DisplayInfoChangedListener, + PhoneStateListener.ServiceStateChangedListener { @Override public void onServiceStateChanged(ServiceState state) { Log.d(TAG, "onServiceStateChanged voiceState=" + state.getState() @@ -239,6 +234,13 @@ public class NetworkProviderWorker extends WifiScanWorker implements mTelephonyDisplayInfo = telephonyDisplayInfo; updateSlice(); } + + @Override + public void onDataConnectionStateChanged(int state, int networkType) { + Log.d(TAG, + "onDataConnectionStateChanged: networkType=" + networkType + " state=" + state); + updateSlice(); + } } @VisibleForTesting diff --git a/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java b/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java index 1905e444ce0..2ce9a513daf 100644 --- a/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java +++ b/tests/unit/src/com/android/settings/network/telephony/NetworkProviderWorkerTest.java @@ -228,6 +228,18 @@ public class NetworkProviderWorkerTest { assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue(); } + @Test + @UiThreadTest + public void onDataConnectionStateChanged_notifyPhoneStateListener_callUpdateSlice() { + mMockNetworkProviderWorker.onSlicePinned(); + mMockNetworkProviderWorker.receiveNotification(false); + + mMockNetworkProviderWorker.mPhoneStateListener.onDataConnectionStateChanged( + TelephonyManager.DATA_DISCONNECTED, TelephonyManager.NETWORK_TYPE_LTE); + + assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue(); + } + @Test public void onInternetTypeChanged_connectedFromWifiToEthernet_callUpdateSlice() { mMockNetworkProviderWorker.receiveNotification(false);