Merge "Revert "Add multi-user support for AutoTileManager"" into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-06-15 14:21:43 +00:00
committed by Android (Google) Code Review
9 changed files with 48 additions and 298 deletions

View File

@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.systemui.util package com.android.systemui.controls
import android.os.UserHandle import android.os.UserHandle
@@ -23,8 +23,6 @@ import android.os.UserHandle
* changes. * changes.
*/ */
interface UserAwareController { interface UserAwareController {
@JvmDefault
fun changeUser(newUser: UserHandle) {} fun changeUser(newUser: UserHandle) {}
val currentUserId: Int val currentUserId: Int
} }

View File

@@ -20,7 +20,7 @@ import android.content.ComponentName
import android.service.controls.Control import android.service.controls.Control
import android.service.controls.ControlsProviderService import android.service.controls.ControlsProviderService
import android.service.controls.actions.ControlAction import android.service.controls.actions.ControlAction
import com.android.systemui.util.UserAwareController import com.android.systemui.controls.UserAwareController
import java.util.function.Consumer import java.util.function.Consumer
/** /**

View File

@@ -21,7 +21,7 @@ import android.service.controls.Control
import android.service.controls.ControlsProviderService import android.service.controls.ControlsProviderService
import android.service.controls.actions.ControlAction import android.service.controls.actions.ControlAction
import com.android.systemui.controls.ControlStatus import com.android.systemui.controls.ControlStatus
import com.android.systemui.util.UserAwareController import com.android.systemui.controls.UserAwareController
import com.android.systemui.controls.management.ControlsFavoritingActivity import com.android.systemui.controls.management.ControlsFavoritingActivity
import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.controls.ui.ControlsUiController
import java.util.function.Consumer import java.util.function.Consumer

View File

@@ -18,7 +18,7 @@ package com.android.systemui.controls.management
import android.content.ComponentName import android.content.ComponentName
import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.ControlsServiceInfo
import com.android.systemui.util.UserAwareController import com.android.systemui.controls.UserAwareController
import com.android.systemui.statusbar.policy.CallbackController import com.android.systemui.statusbar.policy.CallbackController
/** /**
@@ -26,7 +26,7 @@ import com.android.systemui.statusbar.policy.CallbackController
*/ */
interface ControlsListingController : interface ControlsListingController :
CallbackController<ControlsListingController.ControlsListingCallback>, CallbackController<ControlsListingController.ControlsListingCallback>,
UserAwareController { UserAwareController {
/** /**
* @return the current list of services that satisfies the [ServiceListing]. * @return the current list of services that satisfies the [ServiceListing].

View File

@@ -23,7 +23,6 @@ import static com.android.systemui.statusbar.phone.AutoTileManager.WORK;
import android.content.Context; import android.content.Context;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.os.Handler; import android.os.Handler;
import android.os.UserHandle;
import android.provider.Settings.Secure; import android.provider.Settings.Secure;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArraySet; import android.util.ArraySet;
@@ -31,7 +30,6 @@ import android.util.ArraySet;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Prefs; import com.android.systemui.Prefs;
import com.android.systemui.Prefs.Key; import com.android.systemui.Prefs.Key;
import com.android.systemui.util.UserAwareController;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@@ -39,7 +37,7 @@ import java.util.Collections;
import javax.inject.Inject; import javax.inject.Inject;
public class AutoAddTracker implements UserAwareController { public class AutoAddTracker {
private static final String[][] CONVERT_PREFS = { private static final String[][] CONVERT_PREFS = {
{Key.QS_HOTSPOT_ADDED, HOTSPOT}, {Key.QS_HOTSPOT_ADDED, HOTSPOT},
@@ -51,39 +49,20 @@ public class AutoAddTracker implements UserAwareController {
private final ArraySet<String> mAutoAdded; private final ArraySet<String> mAutoAdded;
private final Context mContext; private final Context mContext;
private int mUserId;
public AutoAddTracker(Context context, int userId) { @Inject
public AutoAddTracker(Context context) {
mContext = context; mContext = context;
mUserId = userId;
mAutoAdded = new ArraySet<>(getAdded()); mAutoAdded = new ArraySet<>(getAdded());
// TODO: remove migration code and shared preferences keys after P release // TODO: remove migration code and shared preferences keys after P release
if (mUserId == UserHandle.USER_SYSTEM) { for (String[] convertPref : CONVERT_PREFS) {
for (String[] convertPref : CONVERT_PREFS) { if (Prefs.getBoolean(context, convertPref[0], false)) {
if (Prefs.getBoolean(context, convertPref[0], false)) { setTileAdded(convertPref[1]);
setTileAdded(convertPref[1]); Prefs.remove(context, convertPref[0]);
Prefs.remove(context, convertPref[0]);
}
} }
} }
mContext.getContentResolver().registerContentObserver( mContext.getContentResolver().registerContentObserver(
Secure.getUriFor(Secure.QS_AUTO_ADDED_TILES), false, mObserver, Secure.getUriFor(Secure.QS_AUTO_ADDED_TILES), false, mObserver);
UserHandle.USER_ALL);
}
@Override
public void changeUser(UserHandle newUser) {
if (newUser.getIdentifier() == mUserId) {
return;
}
mUserId = newUser.getIdentifier();
mAutoAdded.clear();
mAutoAdded.addAll(getAdded());
}
@Override
public int getCurrentUserId() {
return mUserId;
} }
public boolean isAdded(String tile) { public boolean isAdded(String tile) {
@@ -107,13 +86,12 @@ public class AutoAddTracker implements UserAwareController {
} }
private void saveTiles() { private void saveTiles() {
Secure.putStringForUser(mContext.getContentResolver(), Secure.QS_AUTO_ADDED_TILES, Secure.putString(mContext.getContentResolver(), Secure.QS_AUTO_ADDED_TILES,
TextUtils.join(",", mAutoAdded), mUserId); TextUtils.join(",", mAutoAdded));
} }
private Collection<String> getAdded() { private Collection<String> getAdded() {
String current = Secure.getStringForUser(mContext.getContentResolver(), String current = Secure.getString(mContext.getContentResolver(), Secure.QS_AUTO_ADDED_TILES);
Secure.QS_AUTO_ADDED_TILES, mUserId);
if (current == null) { if (current == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
@@ -124,27 +102,7 @@ public class AutoAddTracker implements UserAwareController {
protected final ContentObserver mObserver = new ContentObserver(new Handler()) { protected final ContentObserver mObserver = new ContentObserver(new Handler()) {
@Override @Override
public void onChange(boolean selfChange) { public void onChange(boolean selfChange) {
mAutoAdded.clear();
mAutoAdded.addAll(getAdded()); mAutoAdded.addAll(getAdded());
} }
}; };
public static class Builder {
private final Context mContext;
private int mUserId;
@Inject
public Builder(Context context) {
mContext = context;
}
public Builder setUserId(int userId) {
mUserId = userId;
return this;
}
public AutoAddTracker build() {
return new AutoAddTracker(mContext, mUserId);
}
}
} }

View File

@@ -255,9 +255,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D
int currentUser = ActivityManager.getCurrentUser(); int currentUser = ActivityManager.getCurrentUser();
if (currentUser != mCurrentUser) { if (currentUser != mCurrentUser) {
mUserContext = mContext.createContextAsUser(UserHandle.of(currentUser), 0); mUserContext = mContext.createContextAsUser(UserHandle.of(currentUser), 0);
if (mAutoTiles != null) {
mAutoTiles.changeUser(UserHandle.of(currentUser));
}
} }
if (tileSpecs.equals(mTileSpecs) && currentUser == mCurrentUser) return; if (tileSpecs.equals(mTileSpecs) && currentUser == mCurrentUser) return;
mTiles.entrySet().stream().filter(tile -> !tileSpecs.contains(tile.getKey())).forEach( mTiles.entrySet().stream().filter(tile -> !tileSpecs.contains(tile.getKey())).forEach(

View File

@@ -19,7 +19,6 @@ import android.content.res.Resources;
import android.hardware.display.ColorDisplayManager; import android.hardware.display.ColorDisplayManager;
import android.hardware.display.NightDisplayListener; import android.hardware.display.NightDisplayListener;
import android.os.Handler; import android.os.Handler;
import android.os.UserHandle;
import android.util.Log; import android.util.Log;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
@@ -35,7 +34,6 @@ import com.android.systemui.statusbar.policy.DataSaverController;
import com.android.systemui.statusbar.policy.DataSaverController.Listener; import com.android.systemui.statusbar.policy.DataSaverController.Listener;
import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.statusbar.policy.HotspotController;
import com.android.systemui.statusbar.policy.HotspotController.Callback; import com.android.systemui.statusbar.policy.HotspotController.Callback;
import com.android.systemui.util.UserAwareController;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Objects; import java.util.Objects;
@@ -45,7 +43,7 @@ import javax.inject.Inject;
/** /**
* Manages which tiles should be automatically added to QS. * Manages which tiles should be automatically added to QS.
*/ */
public class AutoTileManager implements UserAwareController { public class AutoTileManager {
private static final String TAG = "AutoTileManager"; private static final String TAG = "AutoTileManager";
public static final String HOTSPOT = "hotspot"; public static final String HOTSPOT = "hotspot";
@@ -54,9 +52,7 @@ public class AutoTileManager implements UserAwareController {
public static final String WORK = "work"; public static final String WORK = "work";
public static final String NIGHT = "night"; public static final String NIGHT = "night";
public static final String CAST = "cast"; public static final String CAST = "cast";
static final String SETTING_SEPARATOR = ":"; public static final String SETTING_SEPARATOR = ":";
private UserHandle mCurrentUser;
private final Context mContext; private final Context mContext;
private final QSTileHost mHost; private final QSTileHost mHost;
@@ -70,56 +66,43 @@ public class AutoTileManager implements UserAwareController {
private final ArrayList<AutoAddSetting> mAutoAddSettingList = new ArrayList<>(); private final ArrayList<AutoAddSetting> mAutoAddSettingList = new ArrayList<>();
@Inject @Inject
public AutoTileManager(Context context, AutoAddTracker.Builder autoAddTrackerBuilder, public AutoTileManager(Context context, AutoAddTracker autoAddTracker, QSTileHost host,
QSTileHost host,
@Background Handler handler, @Background Handler handler,
HotspotController hotspotController, HotspotController hotspotController,
DataSaverController dataSaverController, DataSaverController dataSaverController,
ManagedProfileController managedProfileController, ManagedProfileController managedProfileController,
NightDisplayListener nightDisplayListener, NightDisplayListener nightDisplayListener,
CastController castController) { CastController castController) {
mAutoTracker = autoAddTracker;
mContext = context; mContext = context;
mHost = host; mHost = host;
mCurrentUser = mHost.getUserContext().getUser();
mAutoTracker = autoAddTrackerBuilder.setUserId(mCurrentUser.getIdentifier()).build();
mHandler = handler; mHandler = handler;
mHotspotController = hotspotController; mHotspotController = hotspotController;
mDataSaverController = dataSaverController; mDataSaverController = dataSaverController;
mManagedProfileController = managedProfileController; mManagedProfileController = managedProfileController;
mNightDisplayListener = nightDisplayListener; mNightDisplayListener = nightDisplayListener;
mCastController = castController; mCastController = castController;
populateSettingsList();
startControllersAndSettingsListeners();
}
protected void startControllersAndSettingsListeners() {
if (!mAutoTracker.isAdded(HOTSPOT)) { if (!mAutoTracker.isAdded(HOTSPOT)) {
mHotspotController.addCallback(mHotspotCallback); hotspotController.addCallback(mHotspotCallback);
} }
if (!mAutoTracker.isAdded(SAVER)) { if (!mAutoTracker.isAdded(SAVER)) {
mDataSaverController.addCallback(mDataSaverListener); dataSaverController.addCallback(mDataSaverListener);
} }
if (!mAutoTracker.isAdded(WORK)) { if (!mAutoTracker.isAdded(WORK)) {
mManagedProfileController.addCallback(mProfileCallback); managedProfileController.addCallback(mProfileCallback);
} }
if (!mAutoTracker.isAdded(NIGHT) if (!mAutoTracker.isAdded(NIGHT)
&& ColorDisplayManager.isNightDisplayAvailable(mContext)) { && ColorDisplayManager.isNightDisplayAvailable(mContext)) {
mNightDisplayListener.setCallback(mNightDisplayCallback); nightDisplayListener.setCallback(mNightDisplayCallback);
} }
if (!mAutoTracker.isAdded(CAST)) { if (!mAutoTracker.isAdded(CAST)) {
mCastController.addCallback(mCastCallback); castController.addCallback(mCastCallback);
}
int settingsN = mAutoAddSettingList.size();
for (int i = 0; i < settingsN; i++) {
if (!mAutoTracker.isAdded(mAutoAddSettingList.get(i).mSpec)) {
mAutoAddSettingList.get(i).setListening(true);
}
} }
populateSettingsList();
} }
protected void stopListening() { public void destroy() {
mAutoTracker.destroy();
mHotspotController.removeCallback(mHotspotCallback); mHotspotController.removeCallback(mHotspotCallback);
mDataSaverController.removeCallback(mDataSaverListener); mDataSaverController.removeCallback(mDataSaverListener);
mManagedProfileController.removeCallback(mProfileCallback); mManagedProfileController.removeCallback(mProfileCallback);
@@ -133,11 +116,6 @@ public class AutoTileManager implements UserAwareController {
} }
} }
public void destroy() {
stopListening();
mAutoTracker.destroy();
}
/** /**
* Populates a list with the pairs setting:spec in the config resource. * Populates a list with the pairs setting:spec in the config resource.
* <p> * <p>
@@ -159,39 +137,17 @@ public class AutoTileManager implements UserAwareController {
if (split.length == 2) { if (split.length == 2) {
String setting = split[0]; String setting = split[0];
String spec = split[1]; String spec = split[1];
// Populate all the settings. As they may not have been added in other users if (!mAutoTracker.isAdded(spec)) {
AutoAddSetting s = new AutoAddSetting(mContext, mHandler, setting, spec); AutoAddSetting s = new AutoAddSetting(mContext, mHandler, setting, spec);
mAutoAddSettingList.add(s); mAutoAddSettingList.add(s);
s.setListening(true);
}
} else { } else {
Log.w(TAG, "Malformed item in array: " + tile); Log.w(TAG, "Malformed item in array: " + tile);
} }
} }
} }
@Override
public void changeUser(UserHandle newUser) {
if (!Thread.currentThread().equals(mHandler.getLooper().getThread())) {
mHandler.post(() -> changeUser(newUser));
return;
}
if (newUser.getIdentifier() == mCurrentUser.getIdentifier()) {
return;
}
stopListening();
mCurrentUser = newUser;
int settingsN = mAutoAddSettingList.size();
for (int i = 0; i < settingsN; i++) {
mAutoAddSettingList.get(i).setUserId(newUser.getIdentifier());
}
mAutoTracker.changeUser(newUser);
startControllersAndSettingsListeners();
}
@Override
public int getCurrentUserId() {
return mCurrentUser.getIdentifier();
}
public void unmarkTileAsAutoAdded(String tabSpec) { public void unmarkTileAsAutoAdded(String tabSpec) {
mAutoTracker.setTileRemoved(tabSpec); mAutoTracker.setTileRemoved(tabSpec);
} }

View File

@@ -21,7 +21,6 @@ import static com.android.systemui.statusbar.phone.AutoTileManager.WORK;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import android.os.UserHandle;
import android.provider.Settings.Secure; import android.provider.Settings.Secure;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper; import android.testing.TestableLooper.RunWithLooper;
@@ -41,8 +40,6 @@ import org.junit.runner.RunWith;
@SmallTest @SmallTest
public class AutoAddTrackerTest extends SysuiTestCase { public class AutoAddTrackerTest extends SysuiTestCase {
private static final int USER = 0;
private AutoAddTracker mAutoTracker; private AutoAddTracker mAutoTracker;
@Before @Before
@@ -54,7 +51,7 @@ public class AutoAddTrackerTest extends SysuiTestCase {
public void testMigration() { public void testMigration() {
Prefs.putBoolean(mContext, Key.QS_DATA_SAVER_ADDED, true); Prefs.putBoolean(mContext, Key.QS_DATA_SAVER_ADDED, true);
Prefs.putBoolean(mContext, Key.QS_WORK_ADDED, true); Prefs.putBoolean(mContext, Key.QS_WORK_ADDED, true);
mAutoTracker = new AutoAddTracker(mContext, USER); mAutoTracker = new AutoAddTracker(mContext);
assertTrue(mAutoTracker.isAdded(SAVER)); assertTrue(mAutoTracker.isAdded(SAVER));
assertTrue(mAutoTracker.isAdded(WORK)); assertTrue(mAutoTracker.isAdded(WORK));
@@ -71,7 +68,7 @@ public class AutoAddTrackerTest extends SysuiTestCase {
@Test @Test
public void testChangeFromBackup() { public void testChangeFromBackup() {
mAutoTracker = new AutoAddTracker(mContext, USER); mAutoTracker = new AutoAddTracker(mContext);
assertFalse(mAutoTracker.isAdded(SAVER)); assertFalse(mAutoTracker.isAdded(SAVER));
@@ -85,7 +82,7 @@ public class AutoAddTrackerTest extends SysuiTestCase {
@Test @Test
public void testSetAdded() { public void testSetAdded() {
mAutoTracker = new AutoAddTracker(mContext, USER); mAutoTracker = new AutoAddTracker(mContext);
assertFalse(mAutoTracker.isAdded(SAVER)); assertFalse(mAutoTracker.isAdded(SAVER));
mAutoTracker.setTileAdded(SAVER); mAutoTracker.setTileAdded(SAVER);
@@ -97,35 +94,16 @@ public class AutoAddTrackerTest extends SysuiTestCase {
@Test @Test
public void testPersist() { public void testPersist() {
mAutoTracker = new AutoAddTracker(mContext, USER); mAutoTracker = new AutoAddTracker(mContext);
assertFalse(mAutoTracker.isAdded(SAVER)); assertFalse(mAutoTracker.isAdded(SAVER));
mAutoTracker.setTileAdded(SAVER); mAutoTracker.setTileAdded(SAVER);
mAutoTracker.destroy(); mAutoTracker.destroy();
mAutoTracker = new AutoAddTracker(mContext, USER); mAutoTracker = new AutoAddTracker(mContext);
assertTrue(mAutoTracker.isAdded(SAVER)); assertTrue(mAutoTracker.isAdded(SAVER));
mAutoTracker.destroy(); mAutoTracker.destroy();
} }
@Test
public void testIndependentUsers() {
mAutoTracker = new AutoAddTracker(mContext, USER);
mAutoTracker.setTileAdded(SAVER);
mAutoTracker = new AutoAddTracker(mContext, USER + 1);
assertFalse(mAutoTracker.isAdded(SAVER));
}
@Test
public void testChangeUser() {
mAutoTracker = new AutoAddTracker(mContext, USER);
mAutoTracker.setTileAdded(SAVER);
mAutoTracker = new AutoAddTracker(mContext, USER + 1);
mAutoTracker.changeUser(UserHandle.of(USER));
assertTrue(mAutoTracker.isAdded(SAVER));
}
} }

View File

@@ -16,34 +16,18 @@
package com.android.systemui.statusbar.phone; package com.android.systemui.statusbar.phone;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.isNotNull;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.ContextWrapper;
import android.hardware.display.ColorDisplayManager; import android.hardware.display.ColorDisplayManager;
import android.hardware.display.NightDisplayListener; import android.hardware.display.NightDisplayListener;
import android.os.Handler; import android.os.Handler;
import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableContentResolver;
import android.testing.TestableContext;
import android.testing.TestableLooper; import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper; import android.testing.TestableLooper.RunWithLooper;
@@ -54,18 +38,14 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.qs.AutoAddTracker; import com.android.systemui.qs.AutoAddTracker;
import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.QSTileHost;
import com.android.systemui.qs.SecureSetting; import com.android.systemui.qs.SecureSetting;
import com.android.systemui.statusbar.phone.AutoTileManagerTest.MyContextWrapper;
import com.android.systemui.statusbar.policy.CastController; import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.CastController.CastDevice; import com.android.systemui.statusbar.policy.CastController.CastDevice;
import com.android.systemui.statusbar.policy.DataSaverController; import com.android.systemui.statusbar.policy.DataSaverController;
import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.statusbar.policy.HotspotController;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.InOrder;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
@@ -84,18 +64,9 @@ public class AutoTileManagerTest extends SysuiTestCase {
private static final String TEST_CUSTOM_SPEC = "custom(" + TEST_COMPONENT + ")"; private static final String TEST_CUSTOM_SPEC = "custom(" + TEST_COMPONENT + ")";
private static final String SEPARATOR = AutoTileManager.SETTING_SEPARATOR; private static final String SEPARATOR = AutoTileManager.SETTING_SEPARATOR;
private static final int USER = 0;
@Mock private QSTileHost mQsTileHost; @Mock private QSTileHost mQsTileHost;
@Mock private AutoAddTracker mAutoAddTracker; @Mock private AutoAddTracker mAutoAddTracker;
@Mock private CastController mCastController; @Mock private CastController mCastController;
@Mock private HotspotController mHotspotController;
@Mock private DataSaverController mDataSaverController;
@Mock private ManagedProfileController mManagedProfileController;
@Mock private NightDisplayListener mNightDisplayListener;
@Mock(answer = Answers.RETURNS_SELF)
private AutoAddTracker.Builder mAutoAddTrackerBuilder;
@Mock private Context mUserContext;
private AutoTileManager mAutoTileManager; private AutoTileManager mAutoTileManager;
@@ -111,109 +82,19 @@ public class AutoTileManagerTest extends SysuiTestCase {
} }
); );
when(mAutoAddTrackerBuilder.build()).thenReturn(mAutoAddTracker); mAutoTileManager = createAutoTileManager();
when(mQsTileHost.getUserContext()).thenReturn(mUserContext);
when(mUserContext.getUser()).thenReturn(UserHandle.of(USER));
mAutoTileManager = createAutoTileManager(new
MyContextWrapper(mContext));
} }
@After private AutoTileManager createAutoTileManager() {
public void tearDown() { return new AutoTileManager(mContext, mAutoAddTracker, mQsTileHost,
mAutoTileManager.destroy();
}
private AutoTileManager createAutoTileManager(Context context) {
return new AutoTileManager(context, mAutoAddTrackerBuilder, mQsTileHost,
Handler.createAsync(TestableLooper.get(this).getLooper()), Handler.createAsync(TestableLooper.get(this).getLooper()),
mHotspotController, mock(HotspotController.class),
mDataSaverController, mock(DataSaverController.class),
mManagedProfileController, mock(ManagedProfileController.class),
mNightDisplayListener, mock(NightDisplayListener.class),
mCastController); mCastController);
} }
@Test
public void testChangeUserCallbacksStoppedAndStarted() throws Exception {
TestableLooper.get(this).runWithLooper(() ->
mAutoTileManager.changeUser(UserHandle.of(USER + 1))
);
InOrder inOrderHotspot = inOrder(mHotspotController);
inOrderHotspot.verify(mHotspotController).removeCallback(any());
inOrderHotspot.verify(mHotspotController).addCallback(any());
InOrder inOrderDataSaver = inOrder(mDataSaverController);
inOrderDataSaver.verify(mDataSaverController).removeCallback(any());
inOrderDataSaver.verify(mDataSaverController).addCallback(any());
InOrder inOrderManagedProfile = inOrder(mManagedProfileController);
inOrderManagedProfile.verify(mManagedProfileController).removeCallback(any());
inOrderManagedProfile.verify(mManagedProfileController).addCallback(any());
InOrder inOrderNightDisplay = inOrder(mNightDisplayListener);
inOrderNightDisplay.verify(mNightDisplayListener).setCallback(isNull());
inOrderNightDisplay.verify(mNightDisplayListener).setCallback(isNotNull());
InOrder inOrderCast = inOrder(mCastController);
inOrderCast.verify(mCastController).removeCallback(any());
inOrderCast.verify(mCastController).addCallback(any());
SecureSetting setting = mAutoTileManager.getSecureSettingForKey(TEST_SETTING);
assertEquals(USER + 1, setting.getCurrentUser());
assertTrue(setting.isListening());
}
@Test
public void testChangeUserSomeCallbacksNotAdded() throws Exception {
when(mAutoAddTracker.isAdded("hotspot")).thenReturn(true);
when(mAutoAddTracker.isAdded("work")).thenReturn(true);
when(mAutoAddTracker.isAdded("cast")).thenReturn(true);
when(mAutoAddTracker.isAdded(TEST_SPEC)).thenReturn(true);
TestableLooper.get(this).runWithLooper(() ->
mAutoTileManager.changeUser(UserHandle.of(USER + 1))
);
verify(mAutoAddTracker).changeUser(UserHandle.of(USER + 1));
InOrder inOrderHotspot = inOrder(mHotspotController);
inOrderHotspot.verify(mHotspotController).removeCallback(any());
inOrderHotspot.verify(mHotspotController, never()).addCallback(any());
InOrder inOrderDataSaver = inOrder(mDataSaverController);
inOrderDataSaver.verify(mDataSaverController).removeCallback(any());
inOrderDataSaver.verify(mDataSaverController).addCallback(any());
InOrder inOrderManagedProfile = inOrder(mManagedProfileController);
inOrderManagedProfile.verify(mManagedProfileController).removeCallback(any());
inOrderManagedProfile.verify(mManagedProfileController, never()).addCallback(any());
InOrder inOrderNightDisplay = inOrder(mNightDisplayListener);
inOrderNightDisplay.verify(mNightDisplayListener).setCallback(isNull());
inOrderNightDisplay.verify(mNightDisplayListener).setCallback(isNotNull());
InOrder inOrderCast = inOrder(mCastController);
inOrderCast.verify(mCastController).removeCallback(any());
inOrderCast.verify(mCastController, never()).addCallback(any());
SecureSetting setting = mAutoTileManager.getSecureSettingForKey(TEST_SETTING);
assertEquals(USER + 1, setting.getCurrentUser());
assertFalse(setting.isListening());
}
@Test
public void testGetCurrentUserId() throws Exception {
assertEquals(USER, mAutoTileManager.getCurrentUserId());
TestableLooper.get(this).runWithLooper(() ->
mAutoTileManager.changeUser(UserHandle.of(USER + 100))
);
assertEquals(USER + 100, mAutoTileManager.getCurrentUserId());
}
@Test @Test
public void nightTileAdded_whenActivated() { public void nightTileAdded_whenActivated() {
if (!ColorDisplayManager.isNightDisplayAvailable(mContext)) { if (!ColorDisplayManager.isNightDisplayAvailable(mContext)) {
@@ -332,14 +213,14 @@ public class AutoTileManagerTest extends SysuiTestCase {
public void testEmptyArray_doesNotCrash() { public void testEmptyArray_doesNotCrash() {
mContext.getOrCreateTestableResources().addOverride( mContext.getOrCreateTestableResources().addOverride(
R.array.config_quickSettingsAutoAdd, new String[0]); R.array.config_quickSettingsAutoAdd, new String[0]);
createAutoTileManager(mContext).destroy(); createAutoTileManager();
} }
@Test @Test
public void testMissingConfig_doesNotCrash() { public void testMissingConfig_doesNotCrash() {
mContext.getOrCreateTestableResources().addOverride( mContext.getOrCreateTestableResources().addOverride(
R.array.config_quickSettingsAutoAdd, null); R.array.config_quickSettingsAutoAdd, null);
createAutoTileManager(mContext).destroy(); createAutoTileManager();
} }
// Will only notify if it's listening // Will only notify if it's listening
@@ -350,22 +231,4 @@ public class AutoTileManagerTest extends SysuiTestCase {
s.onChange(false); s.onChange(false);
} }
} }
class MyContextWrapper extends ContextWrapper {
private TestableContentResolver mSpiedTCR;
MyContextWrapper(TestableContext context) {
super(context);
mSpiedTCR = spy(context.getContentResolver());
doNothing().when(mSpiedTCR).registerContentObserver(any(), anyBoolean(), any(),
anyInt());
doNothing().when(mSpiedTCR).unregisterContentObserver(any());
}
@Override
public ContentResolver getContentResolver() {
return mSpiedTCR;
}
}
} }