diff options
| author | 2022-09-23 21:23:38 +0000 | |
|---|---|---|
| committer | 2022-09-23 21:23:38 +0000 | |
| commit | 00a4f69a91b09fb3705dc9d17650463c95b85f52 (patch) | |
| tree | 2b81a790ff10b4b80a7a6ca589f1ab9172901b91 /packages/SystemUI | |
| parent | bc34146004500566978ea03a4ea949143a27b394 (diff) | |
| parent | 09217538b9c6deac9ca782a67f51286aba55133a (diff) | |
Merge "Hide the status bar dream overlay when low light is active." into tm-qpr-dev am: 2da886cb7d am: 09217538b9
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19993591
Change-Id: I3fd503a05d4ca1be80e7b50d44c5be315adb04b7
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'packages/SystemUI')
8 files changed, 132 insertions, 7 deletions
diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index b7fb4727e981..f3614d327561 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -124,6 +124,7 @@ android_library { "dagger2", "jsr330", "lottie", + "LowLightDreamLib", ], manifest: "AndroidManifest.xml", @@ -228,6 +229,7 @@ android_library { "dagger2", "jsr330", "WindowManager-Shell", + "LowLightDreamLib", ], libs: [ "android.test.runner", diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java index 96f77b3654c5..696fc7254308 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java @@ -16,6 +16,7 @@ package com.android.systemui.dreams; +import android.content.ComponentName; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.util.Log; @@ -26,11 +27,13 @@ import android.view.WindowInsets; import android.view.WindowManager; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleRegistry; import androidx.lifecycle.ViewModelStore; +import com.android.dream.lowlight.dagger.LowLightDreamModule; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; import com.android.internal.policy.PhoneWindow; @@ -44,6 +47,7 @@ import com.android.systemui.dreams.touch.DreamOverlayTouchMonitor; import java.util.concurrent.Executor; import javax.inject.Inject; +import javax.inject.Named; /** * The {@link DreamOverlayService} is responsible for placing an overlay on top of a dream. The @@ -62,6 +66,8 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ // content area). private final DreamOverlayContainerViewController mDreamOverlayContainerViewController; private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; + @Nullable + private final ComponentName mLowLightDreamComponent; private final UiEventLogger mUiEventLogger; // A reference to the {@link Window} used to hold the dream overlay. @@ -125,10 +131,13 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ DreamOverlayComponent.Factory dreamOverlayComponentFactory, DreamOverlayStateController stateController, KeyguardUpdateMonitor keyguardUpdateMonitor, - UiEventLogger uiEventLogger) { + UiEventLogger uiEventLogger, + @Nullable @Named(LowLightDreamModule.LOW_LIGHT_DREAM_COMPONENT) + ComponentName lowLightDreamComponent) { mContext = context; mExecutor = executor; mKeyguardUpdateMonitor = keyguardUpdateMonitor; + mLowLightDreamComponent = lowLightDreamComponent; mKeyguardUpdateMonitor.registerCallback(mKeyguardCallback); mStateController = stateController; mUiEventLogger = uiEventLogger; @@ -155,6 +164,7 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ windowManager.removeView(mWindow.getDecorView()); } mStateController.setOverlayActive(false); + mStateController.setLowLightActive(false); mDestroyed = true; super.onDestroy(); } @@ -163,6 +173,9 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ public void onStartDream(@NonNull WindowManager.LayoutParams layoutParams) { mUiEventLogger.log(DreamOverlayEvent.DREAM_OVERLAY_ENTER_START); setCurrentState(Lifecycle.State.STARTED); + final ComponentName dreamComponent = getDreamComponent(); + mStateController.setLowLightActive( + dreamComponent != null && dreamComponent.equals(mLowLightDreamComponent)); mExecutor.execute(() -> { if (mDestroyed) { // The task could still be executed after the service has been destroyed. Bail if diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java index 69e41ba9b284..72feaca59ace 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStateController.java @@ -50,6 +50,7 @@ public class DreamOverlayStateController implements private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); public static final int STATE_DREAM_OVERLAY_ACTIVE = 1 << 0; + public static final int STATE_LOW_LIGHT_ACTIVE = 1 << 1; private static final int OP_CLEAR_STATE = 1; private static final int OP_SET_STATE = 2; @@ -193,6 +194,14 @@ public class DreamOverlayStateController implements return containsState(STATE_DREAM_OVERLAY_ACTIVE); } + /** + * Returns whether low light mode is active. + * @return {@code true} if in low light mode, {@code false} otherwise. + */ + public boolean isLowLightActive() { + return containsState(STATE_LOW_LIGHT_ACTIVE); + } + private boolean containsState(int state) { return (mState & state) != 0; } @@ -222,6 +231,14 @@ public class DreamOverlayStateController implements } /** + * Sets whether low light mode is active. + * @param active {@code true} if low light mode is active, {@code false} otherwise. + */ + public void setLowLightActive(boolean active) { + modifyState(active ? OP_SET_STATE : OP_CLEAR_STATE, STATE_LOW_LIGHT_ACTIVE); + } + + /** * Returns the available complication types. */ @Complication.ComplicationType diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java index aa59cc666caa..bb1c4303041a 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayStatusBarViewController.java @@ -20,7 +20,6 @@ import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN; import static android.app.StatusBarManager.WINDOW_STATE_HIDING; import static android.app.StatusBarManager.WINDOW_STATE_SHOWING; -import android.annotation.Nullable; import android.app.AlarmManager; import android.app.StatusBarManager; import android.content.res.Resources; @@ -36,6 +35,8 @@ import android.text.format.DateFormat; import android.util.PluralsMessageFormatter; import android.view.View; +import androidx.annotation.Nullable; + import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dreams.DreamOverlayStatusBarItemsProvider.StatusBarItem; @@ -73,6 +74,8 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve private final Optional<DreamOverlayNotificationCountProvider> mDreamOverlayNotificationCountProvider; private final ZenModeController mZenModeController; + private final DreamOverlayStateController mDreamOverlayStateController; + private final StatusBarWindowStateController mStatusBarWindowStateController; private final DreamOverlayStatusBarItemsProvider mStatusBarItemsProvider; private final Executor mMainExecutor; private final List<DreamOverlayStatusBarItemsProvider.StatusBarItem> mExtraStatusBarItems = @@ -102,6 +105,14 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve } }; + private final DreamOverlayStateController.Callback mDreamOverlayStateCallback = + new DreamOverlayStateController.Callback() { + @Override + public void onStateChanged() { + updateLowLightState(); + } + }; + private final IndividualSensorPrivacyController.Callback mSensorCallback = (sensor, blocked) -> updateMicCameraBlockedStatusIcon(); @@ -140,7 +151,8 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve Optional<DreamOverlayNotificationCountProvider> dreamOverlayNotificationCountProvider, ZenModeController zenModeController, StatusBarWindowStateController statusBarWindowStateController, - DreamOverlayStatusBarItemsProvider statusBarItemsProvider) { + DreamOverlayStatusBarItemsProvider statusBarItemsProvider, + DreamOverlayStateController dreamOverlayStateController) { super(view); mResources = resources; mMainExecutor = mainExecutor; @@ -151,8 +163,10 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve mDateFormatUtil = dateFormatUtil; mSensorPrivacyController = sensorPrivacyController; mDreamOverlayNotificationCountProvider = dreamOverlayNotificationCountProvider; + mStatusBarWindowStateController = statusBarWindowStateController; mStatusBarItemsProvider = statusBarItemsProvider; mZenModeController = zenModeController; + mDreamOverlayStateController = dreamOverlayStateController; // Register to receive show/hide updates for the system status bar. Our custom status bar // needs to hide when the system status bar is showing to ovoid overlapping status bars. @@ -180,6 +194,9 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve mStatusBarItemsProvider.addCallback(mStatusBarItemsProviderCallback); + mDreamOverlayStateController.addCallback(mDreamOverlayStateCallback); + updateLowLightState(); + mTouchInsetSession.addViewToTracking(mView); } @@ -193,6 +210,7 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve provider -> provider.removeCallback(mNotificationCountCallback)); mStatusBarItemsProvider.removeCallback(mStatusBarItemsProviderCallback); mView.removeAllExtraStatusBarItemViews(); + mDreamOverlayStateController.removeCallback(mDreamOverlayStateCallback); mTouchInsetSession.clear(); mIsAttached = false; @@ -217,6 +235,15 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve hasAlarm ? buildAlarmContentDescription(alarm) : null); } + private void updateLowLightState() { + int visibility = View.VISIBLE; + if (mDreamOverlayStateController.isLowLightActive() + || mStatusBarWindowStateController.windowIsShowing()) { + visibility = View.INVISIBLE; + } + mView.setVisibility(visibility); + } + private String buildAlarmContentDescription(AlarmManager.AlarmClockInfo alarm) { final String skeleton = mDateFormatUtil.is24HourFormat() ? "EHm" : "Ehma"; final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton); @@ -272,7 +299,7 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve private void onSystemStatusBarStateChanged(@StatusBarManager.WindowVisibleState int state) { mMainExecutor.execute(() -> { - if (!mIsAttached) { + if (!mIsAttached || mDreamOverlayStateController.isLowLightActive()) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java index 2dd2098a78b9..f9dca08ae14f 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamModule.java @@ -19,6 +19,7 @@ package com.android.systemui.dreams.dagger; import android.content.Context; import android.content.res.Resources; +import com.android.dream.lowlight.dagger.LowLightDreamModule; import com.android.settingslib.dream.DreamBackend; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; @@ -37,6 +38,7 @@ import dagger.Provides; */ @Module(includes = { RegisteredComplicationsModule.class, + LowLightDreamModule.class, }, subcomponents = { DreamOverlayComponent.class, diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java index 9d4275e65302..eec33ca2ff78 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayServiceTest.java @@ -23,8 +23,10 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.ComponentName; import android.content.Intent; import android.os.IBinder; +import android.os.RemoteException; import android.service.dreams.DreamService; import android.service.dreams.IDreamOverlay; import android.service.dreams.IDreamOverlayCallback; @@ -57,6 +59,8 @@ import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidTestingRunner.class) public class DreamOverlayServiceTest extends SysuiTestCase { + private static final ComponentName LOW_LIGHT_COMPONENT = new ComponentName("package", + "lowlight"); private final FakeSystemClock mFakeSystemClock = new FakeSystemClock(); private final FakeExecutor mMainExecutor = new FakeExecutor(mFakeSystemClock); @@ -129,7 +133,8 @@ public class DreamOverlayServiceTest extends SysuiTestCase { mDreamOverlayComponentFactory, mStateController, mKeyguardUpdateMonitor, - mUiEventLogger); + mUiEventLogger, + LOW_LIGHT_COMPONENT); } @Test @@ -204,6 +209,22 @@ public class DreamOverlayServiceTest extends SysuiTestCase { } @Test + public void testLowLightSetByIntentExtra() throws RemoteException { + final Intent intent = new Intent(); + intent.putExtra(DreamService.EXTRA_DREAM_COMPONENT, LOW_LIGHT_COMPONENT); + + final IBinder proxy = mService.onBind(intent); + final IDreamOverlay overlay = IDreamOverlay.Stub.asInterface(proxy); + assertThat(mService.getDreamComponent()).isEqualTo(LOW_LIGHT_COMPONENT); + + // Inform the overlay service of dream starting. + overlay.startDream(mWindowParams, mDreamOverlayCallback); + mMainExecutor.runAllReady(); + + verify(mStateController).setLowLightActive(true); + } + + @Test public void testDestroy() { mService.onDestroy(); mMainExecutor.runAllReady(); @@ -211,6 +232,7 @@ public class DreamOverlayServiceTest extends SysuiTestCase { verify(mKeyguardUpdateMonitor).removeCallback(any()); verify(mLifecycleRegistry).setCurrentState(Lifecycle.State.DESTROYED); verify(mStateController).setOverlayActive(false); + verify(mStateController).setLowLightActive(false); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java index 2adf2857a385..d1d32a13589a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStateControllerTest.java @@ -218,4 +218,20 @@ public class DreamOverlayStateControllerTest extends SysuiTestCase { assertThat(stateController.getComplications(true).contains(complication)) .isTrue(); } + + @Test + public void testNotifyLowLightChanged() { + final DreamOverlayStateController stateController = + new DreamOverlayStateController(mExecutor); + + stateController.addCallback(mCallback); + mExecutor.runAllReady(); + assertThat(stateController.isLowLightActive()).isFalse(); + + stateController.setLowLightActive(true); + + mExecutor.runAllReady(); + verify(mCallback, times(1)).onStateChanged(); + assertThat(stateController.isLowLightActive()).isTrue(); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java index 4ebae98d1246..aa021781296a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayStatusBarViewControllerTest.java @@ -24,6 +24,7 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -101,6 +102,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { DreamOverlayStatusBarItemsProvider.StatusBarItem mStatusBarItem; @Mock View mStatusBarItemView; + @Mock + DreamOverlayStateController mDreamOverlayStateController; private final Executor mMainExecutor = Runnable::run; @@ -126,7 +129,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { Optional.of(mDreamOverlayNotificationCountProvider), mZenModeController, mStatusBarWindowStateController, - mDreamOverlayStatusBarItemsProvider); + mDreamOverlayStatusBarItemsProvider, + mDreamOverlayStateController); } @Test @@ -137,6 +141,7 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { verify(mZenModeController).addCallback(any()); verify(mDreamOverlayNotificationCountProvider).addCallback(any()); verify(mDreamOverlayStatusBarItemsProvider).addCallback(any()); + verify(mDreamOverlayStateController).addCallback(any()); } @Test @@ -266,7 +271,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { Optional.empty(), mZenModeController, mStatusBarWindowStateController, - mDreamOverlayStatusBarItemsProvider); + mDreamOverlayStatusBarItemsProvider, + mDreamOverlayStateController); controller.onViewAttached(); verify(mView, never()).showIcon( eq(DreamOverlayStatusBarView.STATUS_ICON_NOTIFICATIONS), eq(true), any()); @@ -305,6 +311,7 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { verify(mZenModeController).removeCallback(any()); verify(mDreamOverlayNotificationCountProvider).removeCallback(any()); verify(mDreamOverlayStatusBarItemsProvider).removeCallback(any()); + verify(mDreamOverlayStateController).removeCallback(any()); } @Test @@ -458,6 +465,7 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { @Test public void testStatusBarShownWhenSystemStatusBarHidden() { mController.onViewAttached(); + reset(mView); final ArgumentCaptor<StatusBarWindowStateListener> callbackCapture = ArgumentCaptor.forClass(StatusBarWindowStateListener.class); @@ -471,6 +479,7 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { public void testUnattachedStatusBarVisibilityUnchangedWhenSystemStatusBarHidden() { mController.onViewAttached(); mController.onViewDetached(); + reset(mView); final ArgumentCaptor<StatusBarWindowStateListener> callbackCapture = ArgumentCaptor.forClass(StatusBarWindowStateListener.class); @@ -493,4 +502,21 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase { verify(mView).setExtraStatusBarItemViews(List.of(mStatusBarItemView)); } + + @Test + public void testLowLightHidesStatusBar() { + when(mDreamOverlayStateController.isLowLightActive()).thenReturn(true); + mController.onViewAttached(); + + verify(mView).setVisibility(View.INVISIBLE); + reset(mView); + + when(mDreamOverlayStateController.isLowLightActive()).thenReturn(false); + final ArgumentCaptor<DreamOverlayStateController.Callback> callbackCapture = + ArgumentCaptor.forClass(DreamOverlayStateController.Callback.class); + verify(mDreamOverlayStateController).addCallback(callbackCapture.capture()); + callbackCapture.getValue().onStateChanged(); + + verify(mView).setVisibility(View.VISIBLE); + } } |