diff options
8 files changed, 274 insertions, 62 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index fe0ae33d17f1..ae4c8e5a3327 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -59,6 +59,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.power.EnhancedEstimates; import com.android.systemui.power.PowerUI; import com.android.systemui.privacy.PrivacyItemController; +import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.screenrecord.RecordingController; @@ -246,6 +247,7 @@ public class Dependency { @Inject Lazy<KeyguardUpdateMonitor> mKeyguardUpdateMonitor; @Inject Lazy<BatteryController> mBatteryController; @Inject Lazy<NightDisplayListener> mNightDisplayListener; + @Inject Lazy<ReduceBrightColorsController> mReduceBrightColorsController; @Inject Lazy<ManagedProfileController> mManagedProfileController; @Inject Lazy<NextAlarmController> mNextAlarmController; @Inject Lazy<DataSaverController> mDataSaverController; @@ -393,6 +395,8 @@ public class Dependency { mProviders.put(NightDisplayListener.class, mNightDisplayListener::get); + mProviders.put(ReduceBrightColorsController.class, mReduceBrightColorsController::get); + mProviders.put(ManagedProfileController.class, mManagedProfileController::get); mProviders.put(NextAlarmController.class, mNextAlarmController::get); diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index 726e2d06bf90..a2f96bbad203 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.om.OverlayManager; import android.hardware.display.AmbientDisplayConfiguration; +import android.hardware.display.ColorDisplayManager; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; @@ -60,6 +61,7 @@ import com.android.systemui.navigationbar.NavigationBarOverlayController; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.PluginInitializerImpl; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.Recents; import com.android.systemui.settings.UserTracker; @@ -82,6 +84,7 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.theme.ThemeOverlayApplier; import com.android.systemui.util.leak.LeakDetector; +import com.android.systemui.util.settings.SecureSettings; import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; import com.android.wm.shell.pip.Pip; @@ -266,6 +269,15 @@ public class DependencyProvider { } /** */ + @SysUISingleton + @Provides + public ReduceBrightColorsController provideReduceBrightColorsListener( + @Background Handler bgHandler, UserTracker userTracker, + ColorDisplayManager colorDisplayManager, SecureSettings secureSettings) { + return new ReduceBrightColorsController(userTracker, bgHandler, + colorDisplayManager, secureSettings); + } + @Provides @SysUISingleton public ActivityManagerWrapper provideActivityManagerWrapper() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsController.java b/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsController.java new file mode 100644 index 000000000000..42d603ec5051 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/ReduceBrightColorsController.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2021 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; + +import android.content.Context; +import android.database.ContentObserver; +import android.hardware.display.ColorDisplayManager; +import android.net.Uri; +import android.os.Handler; +import android.os.HandlerExecutor; +import android.provider.Settings; + +import androidx.annotation.NonNull; + +import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.settings.UserTracker; +import com.android.systemui.statusbar.policy.CallbackController; +import com.android.systemui.util.settings.SecureSettings; + +import java.util.ArrayList; + +import javax.inject.Inject; + +/** + * @hide + */ +public class ReduceBrightColorsController implements + CallbackController<ReduceBrightColorsController.Listener> { + private final ColorDisplayManager mManager; + private final UserTracker mUserTracker; + private UserTracker.Callback mCurrentUserTrackerCallback; + private final Handler mHandler; + private final ContentObserver mContentObserver; + private final SecureSettings mSecureSettings; + private final ArrayList<ReduceBrightColorsController.Listener> mListeners = new ArrayList<>(); + + @Inject + public ReduceBrightColorsController(UserTracker userTracker, + @Background Handler handler, + ColorDisplayManager colorDisplayManager, + SecureSettings secureSettings) { + mManager = colorDisplayManager; + mUserTracker = userTracker; + mHandler = handler; + mSecureSettings = secureSettings; + mContentObserver = new ContentObserver(mHandler) { + @Override + public void onChange(boolean selfChange, Uri uri) { + super.onChange(selfChange, uri); + final String setting = uri == null ? null : uri.getLastPathSegment(); + synchronized (mListeners) { + if (setting != null && mListeners.size() != 0) { + if (setting.equals(Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED)) { + for (Listener listener : mListeners) { + listener.onActivated(mManager.isReduceBrightColorsActivated()); + } + } + } + } + } + }; + + mCurrentUserTrackerCallback = new UserTracker.Callback() { + @Override + public void onUserChanged(int newUser, Context userContext) { + synchronized (mListeners) { + if (mListeners.size() > 0) { + mSecureSettings.unregisterContentObserver(mContentObserver); + mSecureSettings.registerContentObserverForUser( + Settings.Secure.getUriFor( + Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED), + false, mContentObserver, newUser); + } + } + } + }; + mUserTracker.addCallback(mCurrentUserTrackerCallback, new HandlerExecutor(handler)); + } + + @Override + public void addCallback(@NonNull Listener listener) { + synchronized (mListeners) { + if (!mListeners.contains(listener)) { + mListeners.add(listener); + if (mListeners.size() == 1) { + mSecureSettings.registerContentObserverForUser( + Settings.Secure.getUriFor( + Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED), + false, mContentObserver, mUserTracker.getUserId()); + } + } + } + } + + @Override + public void removeCallback(@androidx.annotation.NonNull Listener listener) { + synchronized (mListeners) { + if (mListeners.remove(listener) && mListeners.size() == 0) { + mSecureSettings.unregisterContentObserver(mContentObserver); + } + } + } + + /** Returns {@code true} if Reduce Bright Colors is activated */ + public boolean isReduceBrightColorsActivated() { + return mManager.isReduceBrightColorsActivated(); + } + + /** Sets the activation state of Reduce Bright Colors */ + public void setReduceBrightColorsActivated(boolean activated) { + mManager.setReduceBrightColorsActivated(activated); + } + + /** + * Listener invoked whenever the Reduce Bright Colors settings are changed. + */ + public interface Listener { + /** + * Listener invoked when the activated state changes. + * + * @param activated {@code true} if Reduce Bright Colors is activated. + */ + default void onActivated(boolean activated) { + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java index 33713f3724c7..d41bd7ad4d3c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSModule.java @@ -16,6 +16,8 @@ package com.android.systemui.qs.dagger; +import static com.android.systemui.qs.dagger.QSFlagsModule.RBC_AVAILABLE; + import android.content.Context; import android.hardware.display.NightDisplayListener; import android.os.Handler; @@ -25,6 +27,7 @@ import com.android.systemui.media.dagger.MediaModule; import com.android.systemui.qs.AutoAddTracker; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.ManagedProfileController; import com.android.systemui.statusbar.policy.CastController; @@ -32,6 +35,8 @@ import com.android.systemui.statusbar.policy.DataSaverController; import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.util.settings.SecureSettings; +import javax.inject.Named; + import dagger.Binds; import dagger.Module; import dagger.Provides; @@ -54,7 +59,9 @@ public interface QSModule { DataSaverController dataSaverController, ManagedProfileController managedProfileController, NightDisplayListener nightDisplayListener, - CastController castController) { + CastController castController, + ReduceBrightColorsController reduceBrightColorsController, + @Named(RBC_AVAILABLE) boolean isReduceBrightColorsAvailable) { AutoTileManager manager = new AutoTileManager( context, autoAddTrackerBuilder, @@ -65,7 +72,9 @@ public interface QSModule { dataSaverController, managedProfileController, nightDisplayListener, - castController + castController, + reduceBrightColorsController, + isReduceBrightColorsAvailable ); manager.init(); return manager; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java index f94cabcee297..aec7b9a4b6b1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java @@ -33,46 +33,39 @@ import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.QSHost; -import com.android.systemui.qs.SecureSetting; +import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; -import com.android.systemui.settings.UserTracker; -import com.android.systemui.util.settings.SecureSettings; import javax.inject.Inject; import javax.inject.Named; /** Quick settings tile: Reduce Bright Colors **/ -public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> { +public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> + implements ReduceBrightColorsController.Listener{ //TODO(b/170973645): get icon drawable private final Icon mIcon = null; - private final SecureSetting mActivatedSetting; private final boolean mIsAvailable; + private final ReduceBrightColorsController mReduceBrightColorsController; + private boolean mIsListening; @Inject public ReduceBrightColorsTile( @Named(RBC_AVAILABLE) boolean isAvailable, + ReduceBrightColorsController reduceBrightColorsController, QSHost host, @Background Looper backgroundLooper, @Main Handler mainHandler, MetricsLogger metricsLogger, StatusBarStateController statusBarStateController, ActivityStarter activityStarter, - QSLogger qsLogger, - UserTracker userTracker, - SecureSettings secureSettings + QSLogger qsLogger ) { super(host, backgroundLooper, mainHandler, metricsLogger, statusBarStateController, activityStarter, qsLogger); - - mActivatedSetting = new SecureSetting(secureSettings, mainHandler, - Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, userTracker.getUserId()) { - @Override - protected void handleValueChanged(int value, boolean observedChange) { - refreshState(); - } - }; + mReduceBrightColorsController = reduceBrightColorsController; + mReduceBrightColorsController.observe(getLifecycle(), this); mIsAvailable = isAvailable; } @@ -84,7 +77,6 @@ public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> { @Override protected void handleDestroy() { super.handleDestroy(); - mActivatedSetting.setListening(false); } @Override @@ -93,25 +85,13 @@ public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> { } @Override - public void handleSetListening(boolean listening) { - super.handleSetListening(listening); - mActivatedSetting.setListening(listening); - } - - @Override - protected void handleUserSwitch(int newUserId) { - mActivatedSetting.setUserId(newUserId); - refreshState(); - } - - @Override public Intent getLongClickIntent() { return new Intent(Settings.ACTION_REDUCE_BRIGHT_COLORS_SETTINGS); } @Override protected void handleClick() { - mActivatedSetting.setValue(mState.value ? 0 : 1); + mReduceBrightColorsController.setReduceBrightColorsActivated(!mState.value); } @Override @@ -121,7 +101,7 @@ public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> { @Override protected void handleUpdateState(BooleanState state, Object arg) { - state.value = mActivatedSetting.getValue() == 1; + state.value = mReduceBrightColorsController.isReduceBrightColorsActivated(); state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE; state.label = mContext.getString(R.string.quick_settings_reduce_bright_colors_label); state.expandedAccessibilityClassName = Switch.class.getName(); @@ -132,4 +112,9 @@ public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> { public int getMetricsCategory() { return 0; } + + @Override + public void onActivated(boolean activated) { + refreshState(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java index e40c262765ea..204dd9f5e58c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoTileManager.java @@ -14,6 +14,8 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.qs.dagger.QSFlagsModule.RBC_AVAILABLE; + import android.content.Context; import android.content.res.Resources; import android.hardware.display.ColorDisplayManager; @@ -27,6 +29,7 @@ import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.qs.AutoAddTracker; import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.qs.SecureSetting; import com.android.systemui.qs.external.CustomTile; import com.android.systemui.statusbar.policy.CastController; @@ -41,6 +44,8 @@ import com.android.systemui.util.settings.SecureSettings; import java.util.ArrayList; import java.util.Objects; +import javax.inject.Named; + /** * Manages which tiles should be automatically added to QS. */ @@ -69,6 +74,8 @@ public class AutoTileManager implements UserAwareController { private final ManagedProfileController mManagedProfileController; private final NightDisplayListener mNightDisplayListener; private final CastController mCastController; + private final ReduceBrightColorsController mReduceBrightColorsController; + private final boolean mIsReduceBrightColorsAvailable; private final ArrayList<AutoAddSetting> mAutoAddSettingList = new ArrayList<>(); public AutoTileManager(Context context, AutoAddTracker.Builder autoAddTrackerBuilder, @@ -79,7 +86,9 @@ public class AutoTileManager implements UserAwareController { DataSaverController dataSaverController, ManagedProfileController managedProfileController, NightDisplayListener nightDisplayListener, - CastController castController) { + CastController castController, + ReduceBrightColorsController reduceBrightColorsController, + @Named(RBC_AVAILABLE) boolean isReduceBrightColorsAvailable) { mContext = context; mHost = host; mSecureSettings = secureSettings; @@ -91,6 +100,8 @@ public class AutoTileManager implements UserAwareController { mManagedProfileController = managedProfileController; mNightDisplayListener = nightDisplayListener; mCastController = castController; + mReduceBrightColorsController = reduceBrightColorsController; + mIsReduceBrightColorsAvailable = isReduceBrightColorsAvailable; } /** @@ -124,9 +135,9 @@ public class AutoTileManager implements UserAwareController { if (!mAutoTracker.isAdded(CAST)) { mCastController.addCallback(mCastCallback); } - - // TODO(b/170970675): Set a listener/controller and callback for Reduce Bright Colors - // state changes. Call into ColorDisplayService to get availability/config status + if (!mAutoTracker.isAdded(BRIGHTNESS) && mIsReduceBrightColorsAvailable) { + mReduceBrightColorsController.addCallback(mReduceBrightColorsCallback); + } int settingsN = mAutoAddSettingList.size(); for (int i = 0; i < settingsN; i++) { @@ -143,6 +154,9 @@ public class AutoTileManager implements UserAwareController { if (ColorDisplayManager.isNightDisplayAvailable(mContext)) { mNightDisplayListener.setCallback(null); } + if (mIsReduceBrightColorsAvailable) { + mReduceBrightColorsController.removeCallback(mReduceBrightColorsCallback); + } mCastController.removeCallback(mCastCallback); int settingsN = mAutoAddSettingList.size(); for (int i = 0; i < settingsN; i++) { @@ -287,6 +301,24 @@ public class AutoTileManager implements UserAwareController { }; @VisibleForTesting + final ReduceBrightColorsController.Listener mReduceBrightColorsCallback = + new ReduceBrightColorsController.Listener() { + @Override + public void onActivated(boolean activated) { + if (activated) { + addReduceBrightColorsTile(); + } + } + + private void addReduceBrightColorsTile() { + if (mAutoTracker.isAdded(BRIGHTNESS)) return; + mHost.addTile(BRIGHTNESS); + mAutoTracker.setTileAdded(BRIGHTNESS); + mHandler.post(() -> mReduceBrightColorsController.removeCallback(this)); + } + }; + + @VisibleForTesting final CastController.Callback mCastCallback = new CastController.Callback() { @Override public void onCastDevicesChanged() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java index ffd747e09e23..880c290802df 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ReduceBrightColorsTileTest.java @@ -18,10 +18,12 @@ package com.android.systemui.qs.tiles; import static junit.framework.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.os.Handler; -import android.provider.Settings; import android.service.quicksettings.Tile; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -34,9 +36,9 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.settings.UserTracker; -import com.android.systemui.util.settings.FakeSettings; import org.junit.Before; import org.junit.Test; @@ -60,8 +62,9 @@ public class ReduceBrightColorsTileTest extends SysuiTestCase { private QSLogger mQSLogger; @Mock private UserTracker mUserTracker; + @Mock + private ReduceBrightColorsController mReduceBrightColorsController; - private FakeSettings mFakeSettings; private TestableLooper mTestableLooper; private ReduceBrightColorsTile mTile; @@ -72,24 +75,23 @@ public class ReduceBrightColorsTileTest extends SysuiTestCase { mTestableLooper = TestableLooper.get(this); when(mHost.getContext()).thenReturn(mContext); - mFakeSettings = new FakeSettings(); mTile = new ReduceBrightColorsTile( true, + mReduceBrightColorsController, mHost, mTestableLooper.getLooper(), new Handler(mTestableLooper.getLooper()), mMetricsLogger, mStatusBarStateController, mActivityStarter, - mQSLogger, - mUserTracker, - mFakeSettings + mQSLogger ); } @Test public void testNotActive() { + when(mReduceBrightColorsController.isReduceBrightColorsActivated()).thenReturn(false); mTile.refreshState(); mTestableLooper.processAllMessages(); @@ -100,33 +102,27 @@ public class ReduceBrightColorsTileTest extends SysuiTestCase { @Test public void testActive() { - mFakeSettings.putIntForUser( - Settings.Secure.REDUCE_BRIGHT_COLORS_ACTIVATED, - 1, - mUserTracker.getUserId()); + when(mReduceBrightColorsController.isReduceBrightColorsActivated()).thenReturn(true); mTile.refreshState(); mTestableLooper.processAllMessages(); - assertActiveState(); + assertEquals(Tile.STATE_ACTIVE, mTile.getState().state); + assertEquals(mTile.getState().label.toString(), + mContext.getString(R.string.quick_settings_reduce_bright_colors_label)); } @Test - public void testActive_clicked_isActive() { + public void testActive_clicked_featureIsActivated() { + when(mReduceBrightColorsController.isReduceBrightColorsActivated()).thenReturn(false); mTile.refreshState(); mTestableLooper.processAllMessages(); // Validity check assertEquals(Tile.STATE_INACTIVE, mTile.getState().state); mTile.handleClick(); - mTile.refreshState(); - mTestableLooper.processAllMessages(); - assertActiveState(); + verify(mReduceBrightColorsController, times(1)) + .setReduceBrightColorsActivated(eq(true)); } - private void assertActiveState() { - assertEquals(Tile.STATE_ACTIVE, mTile.getState().state); - assertEquals(mTile.getState().label.toString(), - mContext.getString(R.string.quick_settings_reduce_bright_colors_label)); - } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java index 82d1f43e5e4e..094a70e24572 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.phone; +import static com.android.systemui.qs.dagger.QSFlagsModule.RBC_AVAILABLE; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; @@ -47,6 +49,7 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.qs.AutoAddTracker; import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.ReduceBrightColorsController; import com.android.systemui.qs.SecureSetting; import com.android.systemui.statusbar.policy.CastController; import com.android.systemui.statusbar.policy.CastController.CastDevice; @@ -67,6 +70,8 @@ import org.mockito.MockitoAnnotations; import java.util.Collections; import java.util.List; +import javax.inject.Named; + @RunWith(AndroidTestingRunner.class) @RunWithLooper @SmallTest @@ -88,9 +93,11 @@ public class AutoTileManagerTest extends SysuiTestCase { @Mock private DataSaverController mDataSaverController; @Mock private ManagedProfileController mManagedProfileController; @Mock private NightDisplayListener mNightDisplayListener; + @Mock private ReduceBrightColorsController mReduceBrightColorsController; @Mock(answer = Answers.RETURNS_SELF) private AutoAddTracker.Builder mAutoAddTrackerBuilder; @Mock private Context mUserContext; + private final boolean mIsReduceBrightColorsAvailable = true; private AutoTileManager mAutoTileManager; private SecureSettings mSecureSettings; @@ -130,7 +137,9 @@ public class AutoTileManagerTest extends SysuiTestCase { DataSaverController dataSaverController, ManagedProfileController managedProfileController, NightDisplayListener nightDisplayListener, - CastController castController) { + CastController castController, + ReduceBrightColorsController reduceBrightColorsController, + @Named(RBC_AVAILABLE) boolean isReduceBrightColorsAvailable) { return new AutoTileManager(context, autoAddTrackerBuilder, mQsTileHost, Handler.createAsync(TestableLooper.get(this).getLooper()), mSecureSettings, @@ -138,13 +147,15 @@ public class AutoTileManagerTest extends SysuiTestCase { dataSaverController, managedProfileController, nightDisplayListener, - castController); + castController, + reduceBrightColorsController, + isReduceBrightColorsAvailable); } private AutoTileManager createAutoTileManager(Context context) { return createAutoTileManager(context, mAutoAddTrackerBuilder, mHotspotController, mDataSaverController, mManagedProfileController, mNightDisplayListener, - mCastController); + mCastController, mReduceBrightColorsController, mIsReduceBrightColorsAvailable); } @Test @@ -157,9 +168,11 @@ public class AutoTileManagerTest extends SysuiTestCase { ManagedProfileController mPC = mock(ManagedProfileController.class); NightDisplayListener nDS = mock(NightDisplayListener.class); CastController cC = mock(CastController.class); + ReduceBrightColorsController rBC = mock(ReduceBrightColorsController.class); AutoTileManager manager = - createAutoTileManager(mock(Context.class), builder, hC, dSC, mPC, nDS, cC); + createAutoTileManager(mock(Context.class), builder, hC, dSC, mPC, nDS, cC, rBC, + true); verify(tracker, never()).initialize(); verify(hC, never()).addCallback(any()); @@ -167,6 +180,7 @@ public class AutoTileManagerTest extends SysuiTestCase { verify(mPC, never()).addCallback(any()); verify(nDS, never()).setCallback(any()); verify(cC, never()).addCallback(any()); + verify(rBC, never()).addCallback(any()); assertNull(manager.getSecureSettingForKey(TEST_SETTING)); assertNull(manager.getSecureSettingForKey(TEST_SETTING_COMPONENT)); } @@ -207,6 +221,10 @@ public class AutoTileManagerTest extends SysuiTestCase { inOrderNightDisplay.verify(mNightDisplayListener).setCallback(isNotNull()); } + InOrder inOrderReduceBrightColors = inOrder(mReduceBrightColorsController); + inOrderReduceBrightColors.verify(mReduceBrightColorsController).removeCallback(any()); + inOrderReduceBrightColors.verify(mReduceBrightColorsController).addCallback(any()); + InOrder inOrderCast = inOrder(mCastController); inOrderCast.verify(mCastController).removeCallback(any()); inOrderCast.verify(mCastController).addCallback(any()); @@ -247,6 +265,10 @@ public class AutoTileManagerTest extends SysuiTestCase { inOrderNightDisplay.verify(mNightDisplayListener).setCallback(isNotNull()); } + InOrder inOrderReduceBrightColors = inOrder(mReduceBrightColorsController); + inOrderReduceBrightColors.verify(mReduceBrightColorsController).removeCallback(any()); + inOrderReduceBrightColors.verify(mReduceBrightColorsController).addCallback(any()); + InOrder inOrderCast = inOrder(mCastController); inOrderCast.verify(mCastController).removeCallback(any()); inOrderCast.verify(mCastController, never()).addCallback(any()); @@ -315,6 +337,18 @@ public class AutoTileManagerTest extends SysuiTestCase { verify(mQsTileHost, never()).addTile("night"); } + @Test + public void reduceBrightColorsTileAdded_whenActivated() { + mAutoTileManager.mReduceBrightColorsCallback.onActivated(true); + verify(mQsTileHost).addTile("reduce_brightness"); + } + + @Test + public void reduceBrightColorsTileNotAdded_whenDeactivated() { + mAutoTileManager.mReduceBrightColorsCallback.onActivated(false); + verify(mQsTileHost, never()).addTile("reduce_brightness"); + } + private static List<CastDevice> buildFakeCastDevice(boolean isCasting) { CastDevice cd = new CastDevice(); cd.state = isCasting ? CastDevice.STATE_CONNECTED : CastDevice.STATE_DISCONNECTED; |