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 59958e663d)
Merged-In: I692209035332bfd463537988f4e3ce166414031e
This commit is contained in:
SongFerngWang
2021-01-27 22:14:56 +08:00
committed by SongFerng Wang
parent 16fa77369f
commit c0b8f62b57
2 changed files with 31 additions and 17 deletions

View File

@@ -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

View File

@@ -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);