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:
Jason Monk
2017-02-23 14:48:05 -05:00
parent 0a4cf4b57f
commit 0288de0e56
8 changed files with 55 additions and 28 deletions

View File

@@ -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() { }
}
}

View File

@@ -66,6 +66,8 @@ public class DeviceProvisionedControllerImpl extends CurrentUserTracker implemen
if (mListeners.size() == 1) {
startListening(getCurrentUser());
}
listener.onUserSetupChanged();
listener.onDeviceProvisionedChanged();
}
@Override

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 */],

View File

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