Add multi-user support for AutoTileManager
Before this CL, AutoTileManager (and AutoAddTracker) would only work
"corectly" for user 0, as all the settings (read and write) were done in
user 0. This meant that tiles that got auto added as user 0 would not be
auto-added for other users. Similarly, tiles that got auto added as a
secondary user would not be auto added as user 0.
This CL makes sure that everything is done with respect to the current
user (as reported by QSTileHost).
Test: manual
Test: atest AutoTileManagerTest AutoAddTrackerTest
Bug: 154607890
Change-Id: I518334cca0a0960e0b3b74b43ac9fce4610c7bd0
Merged-In: I518334cca0a0960e0b3b74b43ac9fce4610c7bd0
(cherry picked from commit 1b5d7afb7f)
This commit is contained in:
@@ -43,6 +43,7 @@ import com.android.systemui.plugins.qs.QSFactory;
|
|||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||||
import com.android.systemui.power.EnhancedEstimates;
|
import com.android.systemui.power.EnhancedEstimates;
|
||||||
import com.android.systemui.power.EnhancedEstimatesImpl;
|
import com.android.systemui.power.EnhancedEstimatesImpl;
|
||||||
|
import com.android.systemui.qs.dagger.QSModule;
|
||||||
import com.android.systemui.qs.tileimpl.QSFactoryImpl;
|
import com.android.systemui.qs.tileimpl.QSFactoryImpl;
|
||||||
import com.android.systemui.recents.Recents;
|
import com.android.systemui.recents.Recents;
|
||||||
import com.android.systemui.recents.RecentsImplementation;
|
import com.android.systemui.recents.RecentsImplementation;
|
||||||
@@ -74,7 +75,7 @@ import dagger.Binds;
|
|||||||
import dagger.Module;
|
import dagger.Module;
|
||||||
import dagger.Provides;
|
import dagger.Provides;
|
||||||
|
|
||||||
@Module(includes = {DividerModule.class})
|
@Module(includes = {DividerModule.class, QSModule.class})
|
||||||
public abstract class CarSystemUIModule {
|
public abstract class CarSystemUIModule {
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
|||||||
@@ -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.controls.UserAwareController
|
import com.android.systemui.util.UserAwareController
|
||||||
import java.util.function.Consumer
|
import java.util.function.Consumer
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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.controls.UserAwareController
|
import com.android.systemui.util.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
|
||||||
|
|||||||
@@ -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.controls.UserAwareController
|
import com.android.systemui.util.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].
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import com.android.systemui.plugins.qs.QSFactory;
|
|||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||||
import com.android.systemui.power.EnhancedEstimates;
|
import com.android.systemui.power.EnhancedEstimates;
|
||||||
import com.android.systemui.power.EnhancedEstimatesImpl;
|
import com.android.systemui.power.EnhancedEstimatesImpl;
|
||||||
|
import com.android.systemui.qs.dagger.QSModule;
|
||||||
import com.android.systemui.qs.tileimpl.QSFactoryImpl;
|
import com.android.systemui.qs.tileimpl.QSFactoryImpl;
|
||||||
import com.android.systemui.recents.Recents;
|
import com.android.systemui.recents.Recents;
|
||||||
import com.android.systemui.recents.RecentsImplementation;
|
import com.android.systemui.recents.RecentsImplementation;
|
||||||
@@ -70,7 +71,7 @@ import dagger.Provides;
|
|||||||
* A dagger module for injecting default implementations of components of System UI that may be
|
* A dagger module for injecting default implementations of components of System UI that may be
|
||||||
* overridden by the System UI implementation.
|
* overridden by the System UI implementation.
|
||||||
*/
|
*/
|
||||||
@Module(includes = {DividerModule.class})
|
@Module(includes = {DividerModule.class, QSModule.class})
|
||||||
public abstract class SystemUIDefaultModule {
|
public abstract class SystemUIDefaultModule {
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ 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;
|
||||||
@@ -30,6 +31,7 @@ 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;
|
||||||
@@ -37,7 +39,7 @@ import java.util.Collections;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
public class AutoAddTracker {
|
public class AutoAddTracker implements UserAwareController {
|
||||||
|
|
||||||
private static final String[][] CONVERT_PREFS = {
|
private static final String[][] CONVERT_PREFS = {
|
||||||
{Key.QS_HOTSPOT_ADDED, HOTSPOT},
|
{Key.QS_HOTSPOT_ADDED, HOTSPOT},
|
||||||
@@ -49,20 +51,45 @@ public class AutoAddTracker {
|
|||||||
|
|
||||||
private final ArraySet<String> mAutoAdded;
|
private final ArraySet<String> mAutoAdded;
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
|
private int mUserId;
|
||||||
|
|
||||||
@Inject
|
public AutoAddTracker(Context context, int userId) {
|
||||||
public AutoAddTracker(Context context) {
|
|
||||||
mContext = context;
|
mContext = context;
|
||||||
|
mUserId = userId;
|
||||||
mAutoAdded = new ArraySet<>(getAdded());
|
mAutoAdded = new ArraySet<>(getAdded());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init method must be called after construction to start listening
|
||||||
|
*/
|
||||||
|
public void initialize() {
|
||||||
// TODO: remove migration code and shared preferences keys after P release
|
// TODO: remove migration code and shared preferences keys after P release
|
||||||
for (String[] convertPref : CONVERT_PREFS) {
|
if (mUserId == UserHandle.USER_SYSTEM) {
|
||||||
if (Prefs.getBoolean(context, convertPref[0], false)) {
|
for (String[] convertPref : CONVERT_PREFS) {
|
||||||
setTileAdded(convertPref[1]);
|
if (Prefs.getBoolean(mContext, convertPref[0], false)) {
|
||||||
Prefs.remove(context, convertPref[0]);
|
setTileAdded(convertPref[1]);
|
||||||
|
Prefs.remove(mContext, 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) {
|
||||||
@@ -86,12 +113,13 @@ public class AutoAddTracker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void saveTiles() {
|
private void saveTiles() {
|
||||||
Secure.putString(mContext.getContentResolver(), Secure.QS_AUTO_ADDED_TILES,
|
Secure.putStringForUser(mContext.getContentResolver(), Secure.QS_AUTO_ADDED_TILES,
|
||||||
TextUtils.join(",", mAutoAdded));
|
TextUtils.join(",", mAutoAdded), mUserId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Collection<String> getAdded() {
|
private Collection<String> getAdded() {
|
||||||
String current = Secure.getString(mContext.getContentResolver(), Secure.QS_AUTO_ADDED_TILES);
|
String current = Secure.getStringForUser(mContext.getContentResolver(),
|
||||||
|
Secure.QS_AUTO_ADDED_TILES, mUserId);
|
||||||
if (current == null) {
|
if (current == null) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
@@ -102,7 +130,27 @@ public class AutoAddTracker {
|
|||||||
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -255,6 +255,9 @@ 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(
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2020 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.systemui.qs.dagger;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.hardware.display.NightDisplayListener;
|
||||||
|
import android.os.Handler;
|
||||||
|
|
||||||
|
import com.android.systemui.dagger.qualifiers.Background;
|
||||||
|
import com.android.systemui.qs.AutoAddTracker;
|
||||||
|
import com.android.systemui.qs.QSTileHost;
|
||||||
|
import com.android.systemui.statusbar.phone.AutoTileManager;
|
||||||
|
import com.android.systemui.statusbar.phone.ManagedProfileController;
|
||||||
|
import com.android.systemui.statusbar.policy.CastController;
|
||||||
|
import com.android.systemui.statusbar.policy.DataSaverController;
|
||||||
|
import com.android.systemui.statusbar.policy.HotspotController;
|
||||||
|
|
||||||
|
import dagger.Module;
|
||||||
|
import dagger.Provides;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Module for QS dependencies
|
||||||
|
*/
|
||||||
|
// TODO: Add other QS classes
|
||||||
|
@Module
|
||||||
|
public interface QSModule {
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
static AutoTileManager provideAutoTileManager(
|
||||||
|
Context context,
|
||||||
|
AutoAddTracker.Builder autoAddTrackerBuilder,
|
||||||
|
QSTileHost host,
|
||||||
|
@Background Handler handler,
|
||||||
|
HotspotController hotspotController,
|
||||||
|
DataSaverController dataSaverController,
|
||||||
|
ManagedProfileController managedProfileController,
|
||||||
|
NightDisplayListener nightDisplayListener,
|
||||||
|
CastController castController) {
|
||||||
|
AutoTileManager manager = new AutoTileManager(context, autoAddTrackerBuilder,
|
||||||
|
host, handler, hotspotController, dataSaverController, managedProfileController,
|
||||||
|
nightDisplayListener, castController);
|
||||||
|
manager.init();
|
||||||
|
return manager;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,6 +19,7 @@ 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;
|
||||||
@@ -34,16 +35,15 @@ 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;
|
||||||
|
|
||||||
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 {
|
public class AutoTileManager implements UserAwareController {
|
||||||
private static final String TAG = "AutoTileManager";
|
private static final String TAG = "AutoTileManager";
|
||||||
|
|
||||||
public static final String HOTSPOT = "hotspot";
|
public static final String HOTSPOT = "hotspot";
|
||||||
@@ -52,7 +52,10 @@ public class AutoTileManager {
|
|||||||
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";
|
||||||
public static final String SETTING_SEPARATOR = ":";
|
static final String SETTING_SEPARATOR = ":";
|
||||||
|
|
||||||
|
private UserHandle mCurrentUser;
|
||||||
|
private boolean mInitialized;
|
||||||
|
|
||||||
protected final Context mContext;
|
protected final Context mContext;
|
||||||
protected final QSTileHost mHost;
|
protected final QSTileHost mHost;
|
||||||
@@ -65,44 +68,67 @@ public class AutoTileManager {
|
|||||||
private final CastController mCastController;
|
private final CastController mCastController;
|
||||||
private final ArrayList<AutoAddSetting> mAutoAddSettingList = new ArrayList<>();
|
private final ArrayList<AutoAddSetting> mAutoAddSettingList = new ArrayList<>();
|
||||||
|
|
||||||
@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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init method must be called after construction to start listening
|
||||||
|
*/
|
||||||
|
public void init() {
|
||||||
|
if (mInitialized) {
|
||||||
|
Log.w(TAG, "Trying to re-initialize");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mAutoTracker.initialize();
|
||||||
|
populateSettingsList();
|
||||||
|
startControllersAndSettingsListeners();
|
||||||
|
mInitialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void startControllersAndSettingsListeners() {
|
||||||
if (!mAutoTracker.isAdded(HOTSPOT)) {
|
if (!mAutoTracker.isAdded(HOTSPOT)) {
|
||||||
hotspotController.addCallback(mHotspotCallback);
|
mHotspotController.addCallback(mHotspotCallback);
|
||||||
}
|
}
|
||||||
if (!mAutoTracker.isAdded(SAVER)) {
|
if (!mAutoTracker.isAdded(SAVER)) {
|
||||||
dataSaverController.addCallback(mDataSaverListener);
|
mDataSaverController.addCallback(mDataSaverListener);
|
||||||
}
|
}
|
||||||
if (!mAutoTracker.isAdded(WORK)) {
|
if (!mAutoTracker.isAdded(WORK)) {
|
||||||
managedProfileController.addCallback(mProfileCallback);
|
mManagedProfileController.addCallback(mProfileCallback);
|
||||||
}
|
}
|
||||||
if (!mAutoTracker.isAdded(NIGHT)
|
if (!mAutoTracker.isAdded(NIGHT)
|
||||||
&& ColorDisplayManager.isNightDisplayAvailable(mContext)) {
|
&& ColorDisplayManager.isNightDisplayAvailable(mContext)) {
|
||||||
nightDisplayListener.setCallback(mNightDisplayCallback);
|
mNightDisplayListener.setCallback(mNightDisplayCallback);
|
||||||
}
|
}
|
||||||
if (!mAutoTracker.isAdded(CAST)) {
|
if (!mAutoTracker.isAdded(CAST)) {
|
||||||
castController.addCallback(mCastCallback);
|
mCastController.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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void destroy() {
|
protected void stopListening() {
|
||||||
mAutoTracker.destroy();
|
|
||||||
mHotspotController.removeCallback(mHotspotCallback);
|
mHotspotController.removeCallback(mHotspotCallback);
|
||||||
mDataSaverController.removeCallback(mDataSaverListener);
|
mDataSaverController.removeCallback(mDataSaverListener);
|
||||||
mManagedProfileController.removeCallback(mProfileCallback);
|
mManagedProfileController.removeCallback(mProfileCallback);
|
||||||
@@ -116,6 +142,11 @@ public class AutoTileManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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>
|
||||||
@@ -137,17 +168,45 @@ public class AutoTileManager {
|
|||||||
if (split.length == 2) {
|
if (split.length == 2) {
|
||||||
String setting = split[0];
|
String setting = split[0];
|
||||||
String spec = split[1];
|
String spec = split[1];
|
||||||
if (!mAutoTracker.isAdded(spec)) {
|
// Populate all the settings. As they may not have been added in other users
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This will be sent off the main thread if needed
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void changeUser(UserHandle newUser) {
|
||||||
|
if (!mInitialized) {
|
||||||
|
throw new IllegalStateException("AutoTileManager not initialized");
|
||||||
|
}
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.android.systemui.controls
|
package com.android.systemui.util
|
||||||
|
|
||||||
import android.os.UserHandle
|
import android.os.UserHandle
|
||||||
|
|
||||||
@@ -23,6 +23,8 @@ 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
|
||||||
}
|
}
|
||||||
@@ -21,6 +21,7 @@ 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;
|
||||||
@@ -40,6 +41,8 @@ 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
|
||||||
@@ -51,7 +54,8 @@ 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);
|
mAutoTracker = new AutoAddTracker(mContext, USER);
|
||||||
|
mAutoTracker.initialize();
|
||||||
|
|
||||||
assertTrue(mAutoTracker.isAdded(SAVER));
|
assertTrue(mAutoTracker.isAdded(SAVER));
|
||||||
assertTrue(mAutoTracker.isAdded(WORK));
|
assertTrue(mAutoTracker.isAdded(WORK));
|
||||||
@@ -68,7 +72,8 @@ public class AutoAddTrackerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testChangeFromBackup() {
|
public void testChangeFromBackup() {
|
||||||
mAutoTracker = new AutoAddTracker(mContext);
|
mAutoTracker = new AutoAddTracker(mContext, USER);
|
||||||
|
mAutoTracker.initialize();
|
||||||
|
|
||||||
assertFalse(mAutoTracker.isAdded(SAVER));
|
assertFalse(mAutoTracker.isAdded(SAVER));
|
||||||
|
|
||||||
@@ -82,7 +87,8 @@ public class AutoAddTrackerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSetAdded() {
|
public void testSetAdded() {
|
||||||
mAutoTracker = new AutoAddTracker(mContext);
|
mAutoTracker = new AutoAddTracker(mContext, USER);
|
||||||
|
mAutoTracker.initialize();
|
||||||
|
|
||||||
assertFalse(mAutoTracker.isAdded(SAVER));
|
assertFalse(mAutoTracker.isAdded(SAVER));
|
||||||
mAutoTracker.setTileAdded(SAVER);
|
mAutoTracker.setTileAdded(SAVER);
|
||||||
@@ -94,16 +100,38 @@ public class AutoAddTrackerTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPersist() {
|
public void testPersist() {
|
||||||
mAutoTracker = new AutoAddTracker(mContext);
|
mAutoTracker = new AutoAddTracker(mContext, USER);
|
||||||
|
mAutoTracker.initialize();
|
||||||
|
|
||||||
assertFalse(mAutoTracker.isAdded(SAVER));
|
assertFalse(mAutoTracker.isAdded(SAVER));
|
||||||
mAutoTracker.setTileAdded(SAVER);
|
mAutoTracker.setTileAdded(SAVER);
|
||||||
|
|
||||||
mAutoTracker.destroy();
|
mAutoTracker.destroy();
|
||||||
mAutoTracker = new AutoAddTracker(mContext);
|
mAutoTracker = new AutoAddTracker(mContext, USER);
|
||||||
|
|
||||||
assertTrue(mAutoTracker.isAdded(SAVER));
|
assertTrue(mAutoTracker.isAdded(SAVER));
|
||||||
|
|
||||||
mAutoTracker.destroy();
|
mAutoTracker.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIndependentUsers() {
|
||||||
|
mAutoTracker = new AutoAddTracker(mContext, USER);
|
||||||
|
mAutoTracker.initialize();
|
||||||
|
mAutoTracker.setTileAdded(SAVER);
|
||||||
|
|
||||||
|
mAutoTracker = new AutoAddTracker(mContext, USER + 1);
|
||||||
|
assertFalse(mAutoTracker.isAdded(SAVER));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testChangeUser() {
|
||||||
|
mAutoTracker = new AutoAddTracker(mContext, USER);
|
||||||
|
mAutoTracker.initialize();
|
||||||
|
mAutoTracker.setTileAdded(SAVER);
|
||||||
|
|
||||||
|
mAutoTracker = new AutoAddTracker(mContext, USER + 1);
|
||||||
|
mAutoTracker.changeUser(UserHandle.of(USER));
|
||||||
|
assertTrue(mAutoTracker.isAdded(SAVER));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -16,18 +16,37 @@
|
|||||||
|
|
||||||
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.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
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.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;
|
||||||
|
|
||||||
@@ -43,9 +62,12 @@ 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;
|
||||||
|
|
||||||
@@ -64,9 +86,18 @@ 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;
|
||||||
|
|
||||||
@@ -81,20 +112,165 @@ public class AutoTileManagerTest extends SysuiTestCase {
|
|||||||
TEST_SETTING_COMPONENT + SEPARATOR + TEST_CUSTOM_SPEC
|
TEST_SETTING_COMPONENT + SEPARATOR + TEST_CUSTOM_SPEC
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
mContext.getOrCreateTestableResources().addOverride(
|
||||||
|
com.android.internal.R.bool.config_nightDisplayAvailable, true);
|
||||||
|
|
||||||
mAutoTileManager = createAutoTileManager();
|
when(mAutoAddTrackerBuilder.build()).thenReturn(mAutoAddTracker);
|
||||||
|
when(mQsTileHost.getUserContext()).thenReturn(mUserContext);
|
||||||
|
when(mUserContext.getUser()).thenReturn(UserHandle.of(USER));
|
||||||
|
|
||||||
|
mAutoTileManager = createAutoTileManager(new MyContextWrapper(mContext));
|
||||||
|
mAutoTileManager.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
private AutoTileManager createAutoTileManager() {
|
@After
|
||||||
return new AutoTileManager(mContext, mAutoAddTracker, mQsTileHost,
|
public void tearDown() {
|
||||||
|
mAutoTileManager.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
private AutoTileManager createAutoTileManager(
|
||||||
|
Context context,
|
||||||
|
AutoAddTracker.Builder autoAddTrackerBuilder,
|
||||||
|
HotspotController hotspotController,
|
||||||
|
DataSaverController dataSaverController,
|
||||||
|
ManagedProfileController managedProfileController,
|
||||||
|
NightDisplayListener nightDisplayListener,
|
||||||
|
CastController castController) {
|
||||||
|
return new AutoTileManager(context, autoAddTrackerBuilder, mQsTileHost,
|
||||||
Handler.createAsync(TestableLooper.get(this).getLooper()),
|
Handler.createAsync(TestableLooper.get(this).getLooper()),
|
||||||
mock(HotspotController.class),
|
hotspotController,
|
||||||
mock(DataSaverController.class),
|
dataSaverController,
|
||||||
mock(ManagedProfileController.class),
|
managedProfileController,
|
||||||
mock(NightDisplayListener.class),
|
nightDisplayListener,
|
||||||
|
castController);
|
||||||
|
}
|
||||||
|
|
||||||
|
private AutoTileManager createAutoTileManager(Context context) {
|
||||||
|
return createAutoTileManager(context, mAutoAddTrackerBuilder, mHotspotController,
|
||||||
|
mDataSaverController, mManagedProfileController, mNightDisplayListener,
|
||||||
mCastController);
|
mCastController);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreatedAutoTileManagerIsNotInitialized() {
|
||||||
|
AutoAddTracker.Builder builder = mock(AutoAddTracker.Builder.class, Answers.RETURNS_SELF);
|
||||||
|
AutoAddTracker tracker = mock(AutoAddTracker.class);
|
||||||
|
when(builder.build()).thenReturn(tracker);
|
||||||
|
HotspotController hC = mock(HotspotController.class);
|
||||||
|
DataSaverController dSC = mock(DataSaverController.class);
|
||||||
|
ManagedProfileController mPC = mock(ManagedProfileController.class);
|
||||||
|
NightDisplayListener nDS = mock(NightDisplayListener.class);
|
||||||
|
CastController cC = mock(CastController.class);
|
||||||
|
|
||||||
|
AutoTileManager manager =
|
||||||
|
createAutoTileManager(mock(Context.class), builder, hC, dSC, mPC, nDS, cC);
|
||||||
|
|
||||||
|
verify(tracker, never()).initialize();
|
||||||
|
verify(hC, never()).addCallback(any());
|
||||||
|
verify(dSC, never()).addCallback(any());
|
||||||
|
verify(mPC, never()).addCallback(any());
|
||||||
|
verify(nDS, never()).setCallback(any());
|
||||||
|
verify(cC, never()).addCallback(any());
|
||||||
|
assertNull(manager.getSecureSettingForKey(TEST_SETTING));
|
||||||
|
assertNull(manager.getSecureSettingForKey(TEST_SETTING_COMPONENT));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testChangeUserWhenNotInitializedThrows() {
|
||||||
|
AutoTileManager manager = createAutoTileManager(mock(Context.class));
|
||||||
|
|
||||||
|
try {
|
||||||
|
manager.changeUser(UserHandle.of(USER + 1));
|
||||||
|
fail();
|
||||||
|
} catch (Exception e) {
|
||||||
|
// This should throw and take this path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@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());
|
||||||
|
|
||||||
|
if (ColorDisplayManager.isNightDisplayAvailable(mContext)) {
|
||||||
|
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());
|
||||||
|
|
||||||
|
if (ColorDisplayManager.isNightDisplayAvailable(mContext)) {
|
||||||
|
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)) {
|
||||||
@@ -212,14 +388,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();
|
createAutoTileManager(mContext).destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@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();
|
createAutoTileManager(mContext).destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Will only notify if it's listening
|
// Will only notify if it's listening
|
||||||
@@ -230,4 +406,22 @@ 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user