Fix data disabled icon from not showing in status bar
The NetworkController seemed to think the user wasn't set up since the DeviceProvisionedController didn't send an initial callback on add. Also add some extra listening to data disabled state to avoid race conditions there. Change-Id: I17f759894a283da08eb0da7ceb5181355c8f4d55 Fixes: 35708363 Fixes: 35632846 Test: runtest systemui
This commit is contained in:
@@ -26,7 +26,9 @@ public interface DeviceProvisionedController extends CallbackController<DevicePr
|
||||
|
||||
interface DeviceProvisionedListener {
|
||||
default void onDeviceProvisionedChanged() { }
|
||||
default void onUserSwitched() { }
|
||||
default void onUserSwitched() {
|
||||
onUserSetupChanged();
|
||||
}
|
||||
default void onUserSetupChanged() { }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,6 +66,8 @@ public class DeviceProvisionedControllerImpl extends CurrentUserTracker implemen
|
||||
if (mListeners.size() == 1) {
|
||||
startListening(getCurrentUser());
|
||||
}
|
||||
listener.onUserSetupChanged();
|
||||
listener.onDeviceProvisionedChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -17,8 +17,11 @@ package com.android.systemui.statusbar.policy;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.database.ContentObserver;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.provider.Settings.Global;
|
||||
import android.telephony.PhoneStateListener;
|
||||
import android.telephony.ServiceState;
|
||||
import android.telephony.SignalStrength;
|
||||
@@ -49,6 +52,7 @@ public class MobileSignalController extends SignalController<
|
||||
private final SubscriptionDefaults mDefaults;
|
||||
private final String mNetworkNameDefault;
|
||||
private final String mNetworkNameSeparator;
|
||||
private final ContentObserver mObserver;
|
||||
@VisibleForTesting
|
||||
final PhoneStateListener mPhoneStateListener;
|
||||
// Save entire info for logging, we only use the id.
|
||||
@@ -97,6 +101,12 @@ public class MobileSignalController extends SignalController<
|
||||
mLastState.iconGroup = mCurrentState.iconGroup = mDefaultIcons;
|
||||
// Get initial data sim state.
|
||||
updateDataSim();
|
||||
mObserver = new ContentObserver(new Handler(receiverLooper)) {
|
||||
@Override
|
||||
public void onChange(boolean selfChange) {
|
||||
updateTelephony();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public void setConfiguration(Config config) {
|
||||
@@ -144,6 +154,11 @@ public class MobileSignalController extends SignalController<
|
||||
| PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
|
||||
| PhoneStateListener.LISTEN_DATA_ACTIVITY
|
||||
| PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE);
|
||||
mContext.getContentResolver().registerContentObserver(Global.getUriFor(Global.MOBILE_DATA),
|
||||
true, mObserver);
|
||||
mContext.getContentResolver().registerContentObserver(Global.getUriFor(
|
||||
Global.MOBILE_DATA + mSubscriptionInfo.getSubscriptionId()),
|
||||
true, mObserver);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -151,6 +166,7 @@ public class MobileSignalController extends SignalController<
|
||||
*/
|
||||
public void unregisterListener() {
|
||||
mPhone.listen(mPhoneStateListener, 0);
|
||||
mContext.getContentResolver().unregisterContentObserver(mObserver);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -242,11 +258,11 @@ public class MobileSignalController extends SignalController<
|
||||
description = mCurrentState.isEmergency ? null : mCurrentState.networkName;
|
||||
}
|
||||
boolean activityIn = mCurrentState.dataConnected
|
||||
&& !mCurrentState.carrierNetworkChangeMode
|
||||
&& mCurrentState.activityIn;
|
||||
&& !mCurrentState.carrierNetworkChangeMode
|
||||
&& mCurrentState.activityIn;
|
||||
boolean activityOut = mCurrentState.dataConnected
|
||||
&& !mCurrentState.carrierNetworkChangeMode
|
||||
&& mCurrentState.activityOut;
|
||||
&& !mCurrentState.carrierNetworkChangeMode
|
||||
&& mCurrentState.activityOut;
|
||||
showDataIcon &= mCurrentState.isDefault || dataDisabled;
|
||||
int typeIcon = showDataIcon ? icons.mDataType : 0;
|
||||
callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon,
|
||||
@@ -294,7 +310,7 @@ public class MobileSignalController extends SignalController<
|
||||
final int iconMode = mServiceState.getCdmaEriIconMode();
|
||||
return mServiceState.getCdmaEriIconIndex() != EriInfo.ROAMING_INDICATOR_OFF
|
||||
&& (iconMode == EriInfo.ROAMING_ICON_MODE_NORMAL
|
||||
|| iconMode == EriInfo.ROAMING_ICON_MODE_FLASH);
|
||||
|| iconMode == EriInfo.ROAMING_ICON_MODE_FLASH);
|
||||
} else {
|
||||
return mServiceState != null && mServiceState.getRoaming();
|
||||
}
|
||||
|
||||
@@ -43,7 +43,6 @@ public interface NetworkController extends CallbackController<SignalCallback>, D
|
||||
|
||||
void addEmergencyListener(EmergencyListener listener);
|
||||
void removeEmergencyListener(EmergencyListener listener);
|
||||
void setUserSetupComplete(boolean userSetup);
|
||||
boolean hasEmergencyCryptKeeperText();
|
||||
boolean isRadioOn();
|
||||
|
||||
|
||||
@@ -551,17 +551,11 @@ public class NetworkControllerImpl extends BroadcastReceiver
|
||||
updateAirplaneMode(true /* force */);
|
||||
}
|
||||
|
||||
public void setUserSetupComplete(final boolean userSetup) {
|
||||
mReceiverHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
handleSetUserSetupComplete(userSetup);
|
||||
}
|
||||
});
|
||||
private void setUserSetupComplete(final boolean userSetup) {
|
||||
mReceiverHandler.post(() -> handleSetUserSetupComplete(userSetup));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void handleSetUserSetupComplete(boolean userSetup) {
|
||||
private void handleSetUserSetupComplete(boolean userSetup) {
|
||||
mUserSetup = userSetup;
|
||||
for (MobileSignalController controller : mMobileSignalControllers.values()) {
|
||||
controller.setUserSetupComplete(mUserSetup);
|
||||
|
||||
@@ -31,6 +31,7 @@ import android.telephony.TelephonyManager;
|
||||
import android.util.Log;
|
||||
import com.android.internal.telephony.cdma.EriInfo;
|
||||
import com.android.settingslib.net.DataUsageController;
|
||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener;
|
||||
import com.android.systemui.statusbar.policy.NetworkController.IconState;
|
||||
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
|
||||
import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
|
||||
@@ -43,6 +44,8 @@ import org.junit.rules.TestWatcher;
|
||||
import org.junit.runner.Description;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mockito;
|
||||
import org.mockito.invocation.InvocationOnMock;
|
||||
import org.mockito.stubbing.Answer;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
@@ -56,6 +59,7 @@ import static org.mockito.Matchers.anyBoolean;
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Matchers.anyString;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@@ -82,6 +86,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
|
||||
protected CallbackHandler mCallbackHandler;
|
||||
protected SubscriptionDefaults mMockSubDefaults;
|
||||
protected NetworkScoreManager mMockNetworkScoreManager;
|
||||
protected DeviceProvisionedController mMockProvisionController;
|
||||
protected DeviceProvisionedListener mUserCallback;
|
||||
|
||||
protected int mSubId;
|
||||
|
||||
@@ -120,11 +126,21 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
|
||||
mConfig = new Config();
|
||||
mConfig.hspaDataDistinguishable = true;
|
||||
mCallbackHandler = mock(CallbackHandler.class);
|
||||
|
||||
mMockProvisionController = mock(DeviceProvisionedController.class);
|
||||
when(mMockProvisionController.isUserSetup(anyInt())).thenReturn(true);
|
||||
doAnswer(invocation -> {
|
||||
mUserCallback = (DeviceProvisionedListener) invocation.getArguments()[0];
|
||||
mUserCallback.onUserSetupChanged();
|
||||
mUserCallback.onDeviceProvisionedChanged();
|
||||
return null;
|
||||
}).when(mMockProvisionController).addCallback(any());
|
||||
|
||||
mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockNetworkScoreManager,
|
||||
mMockTm, mMockWm, mMockSm,
|
||||
mConfig, Looper.getMainLooper(), mCallbackHandler,
|
||||
mock(AccessPointControllerImpl.class), mock(DataUsageController.class),
|
||||
mMockSubDefaults, mock(DeviceProvisionedController.class));
|
||||
mMockSubDefaults, mMockProvisionController);
|
||||
setupNetworkController();
|
||||
|
||||
// Trigger blank callbacks to always get the current state (some tests don't trigger
|
||||
@@ -139,7 +155,6 @@ public class NetworkControllerBaseTest extends SysuiTestCase {
|
||||
when(mMockTm.getDataEnabled(mSubId)).thenReturn(true);
|
||||
setDefaultSubId(mSubId);
|
||||
setSubscriptions(mSubId);
|
||||
mNetworkController.handleSetUserSetupComplete(true);
|
||||
mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId);
|
||||
mPhoneStateListener = mMobileSignalController.mPhoneStateListener;
|
||||
}
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
package com.android.systemui.statusbar.policy;
|
||||
|
||||
import static org.mockito.Matchers.anyInt;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.os.Looper;
|
||||
import android.support.test.runner.AndroidJUnit4;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
|
||||
import com.android.settingslib.net.DataUsageController;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
@SmallTest
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
@@ -106,7 +109,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
|
||||
@Test
|
||||
public void testDataDisabledIcon() {
|
||||
setupNetworkController();
|
||||
Mockito.when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
|
||||
when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
|
||||
setupDefaultSignal();
|
||||
updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0);
|
||||
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
|
||||
@@ -118,11 +121,12 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
|
||||
@Test
|
||||
public void testDataDisabledIcon_UserNotSetup() {
|
||||
setupNetworkController();
|
||||
Mockito.when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
|
||||
when(mMockTm.getDataEnabled(mSubId)).thenReturn(false);
|
||||
setupDefaultSignal();
|
||||
updateDataConnectionState(TelephonyManager.DATA_DISCONNECTED, 0);
|
||||
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
|
||||
mNetworkController.handleSetUserSetupComplete(false);
|
||||
when(mMockProvisionController.isUserSetup(anyInt())).thenReturn(false);
|
||||
mUserCallback.onUserSetupChanged();
|
||||
|
||||
// Don't show the X until the device is setup.
|
||||
verifyDataIndicators(0, 0);
|
||||
@@ -154,7 +158,7 @@ public class NetworkControllerDataTest extends NetworkControllerBaseTest {
|
||||
verifyDataIndicators(TelephonyIcons.DATA_LTE[1][0 /* No direction */],
|
||||
TelephonyIcons.QS_DATA_LTE);
|
||||
|
||||
Mockito.when(mServiceState.getDataNetworkType())
|
||||
when(mServiceState.getDataNetworkType())
|
||||
.thenReturn(TelephonyManager.NETWORK_TYPE_HSPA);
|
||||
updateServiceState();
|
||||
verifyDataIndicators(TelephonyIcons.DATA_H[1][0 /* No direction */],
|
||||
|
||||
@@ -46,11 +46,6 @@ public class FakeNetworkController extends BaseLeakChecker<SignalCallback>
|
||||
mEmergencyChecker.removeCallback(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUserSetupComplete(boolean userSetup) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasEmergencyCryptKeeperText() {
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user