diff options
34 files changed, 237 insertions, 75 deletions
diff --git a/core/java/android/service/dreams/DreamOverlayService.java b/core/java/android/service/dreams/DreamOverlayService.java index 163d6ed4b18b..432444211bce 100644 --- a/core/java/android/service/dreams/DreamOverlayService.java +++ b/core/java/android/service/dreams/DreamOverlayService.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; import android.app.Service; +import android.content.ComponentName; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; @@ -36,6 +37,7 @@ public abstract class DreamOverlayService extends Service { private static final String TAG = "DreamOverlayService"; private static final boolean DEBUG = false; private boolean mShowComplications; + private ComponentName mDreamComponent; private IDreamOverlay mDreamOverlay = new IDreamOverlay.Stub() { @Override @@ -56,6 +58,8 @@ public abstract class DreamOverlayService extends Service { public final IBinder onBind(@NonNull Intent intent) { mShowComplications = intent.getBooleanExtra(DreamService.EXTRA_SHOW_COMPLICATIONS, DreamService.DEFAULT_SHOW_COMPLICATIONS); + mDreamComponent = intent.getParcelableExtra(DreamService.EXTRA_DREAM_COMPONENT, + ComponentName.class); return mDreamOverlay.asBinder(); } @@ -84,4 +88,12 @@ public abstract class DreamOverlayService extends Service { public final boolean shouldShowComplications() { return mShowComplications; } + + /** + * Returns the active dream component. + * @hide + */ + public final ComponentName getDreamComponent() { + return mDreamComponent; + } } diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 75155383855b..d066ee773006 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -218,6 +218,12 @@ public class DreamService extends Service implements Window.Callback { "android.service.dreams.SHOW_COMPLICATIONS"; /** + * Extra containing the component name for the active dream. + * @hide + */ + public static final String EXTRA_DREAM_COMPONENT = "android.service.dreams.DREAM_COMPONENT"; + + /** * The default value for whether to show complications on the overlay. * @hide */ @@ -271,6 +277,7 @@ public class DreamService extends Service implements Window.Callback { overlayIntent.setComponent(overlayService); overlayIntent.putExtra(EXTRA_SHOW_COMPLICATIONS, fetchShouldShowComplications(context, serviceInfo)); + overlayIntent.putExtra(EXTRA_DREAM_COMPONENT, dreamService); context.bindService(overlayIntent, this, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE); diff --git a/media/jni/android_media_MediaProfiles.cpp b/media/jni/android_media_MediaProfiles.cpp index ecb1d510f807..9868a148d998 100644 --- a/media/jni/android_media_MediaProfiles.cpp +++ b/media/jni/android_media_MediaProfiles.cpp @@ -255,21 +255,21 @@ android_media_MediaProfiles_native_get_camcorder_profiles(JNIEnv *env, jobject / jmethodID audioProfileConstructorMethodID = env->GetMethodID(audioProfileClazz, "<init>", "(IIIII)V"); - jobjectArray videoCodecs = (jobjectArray)env->NewObjectArray( - cp->getVideoCodecs().size(), videoProfileClazz, nullptr); + jobjectArray videoCodecs = nullptr; { - int i = 0; + auto isAdvancedCodec = [](const MediaProfiles::VideoCodec *vc) -> bool { + return ((vc->getBitDepth() != 8 + || vc->getChromaSubsampling() != CHROMA_SUBSAMPLING_YUV_420 + || vc->getHdrFormat() != HDR_FORMAT_NONE)); + }; + std::vector<jobject> codecVector; for (const MediaProfiles::VideoCodec *vc : cp->getVideoCodecs()) { + if (isAdvancedCodec(vc) && !static_cast<bool>(advanced)) { + continue; + } chroma_subsampling cs = vc->getChromaSubsampling(); int bitDepth = vc->getBitDepth(); hdr_format hdr = vc->getHdrFormat(); - - bool isAdvanced = - (bitDepth != 8 || cs != CHROMA_SUBSAMPLING_YUV_420 || hdr != HDR_FORMAT_NONE); - if (static_cast<bool>(advanced) && !isAdvanced) { - continue; - } - jobject videoCodec = env->NewObject(videoProfileClazz, videoProfileConstructorMethodID, vc->getCodec(), @@ -281,10 +281,17 @@ android_media_MediaProfiles_native_get_camcorder_profiles(JNIEnv *env, jobject / static_cast<int>(cs), bitDepth, static_cast<int>(hdr)); - env->SetObjectArrayElement(videoCodecs, i++, videoCodec); + + codecVector.push_back(videoCodec); } - } + videoCodecs = (jobjectArray)env->NewObjectArray(codecVector.size(), + videoProfileClazz, nullptr); + int i = 0; + for (jobject codecObj : codecVector) { + env->SetObjectArrayElement(videoCodecs, i++, codecObj); + } + } jobjectArray audioCodecs; if (quality >= CAMCORDER_QUALITY_TIME_LAPSE_LIST_START && quality <= CAMCORDER_QUALITY_TIME_LAPSE_LIST_END) { diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index f50dc74210e6..df6f08df7c56 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -124,6 +124,7 @@ android_library { "dagger2", "jsr330", "lottie", + "LowLightDreamLib", ], manifest: "AndroidManifest.xml", @@ -227,6 +228,7 @@ android_library { "dagger2", "jsr330", "WindowManager-Shell", + "LowLightDreamLib", ], libs: [ "android.test.runner", diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml index f4d482406fa0..b24ce122208f 100644 --- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml @@ -66,8 +66,6 @@ <dimen name="lockscreen_shade_qs_transition_distance">@dimen/lockscreen_shade_notifications_scrim_transition_distance</dimen> <dimen name="lockscreen_shade_qs_transition_delay">@dimen/lockscreen_shade_notifications_scrim_transition_delay</dimen> <dimen name="lockscreen_shade_qs_squish_transition_distance">@dimen/lockscreen_shade_qs_transition_distance</dimen> - <!-- On split-shade, the QS squish transition should start from half height. --> - <item name="lockscreen_shade_qs_squish_start_fraction" type="dimen" format="float" >0.5</item> <!-- On split-shade, there should be no depth effect, so setting the value to 0. --> <dimen name="lockscreen_shade_depth_controller_transition_distance">0dp</dimen> <dimen name="lockscreen_shade_udfps_keyguard_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index a587e5a806ca..5dcbeb5c85cf 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -86,8 +86,6 @@ <dimen name="lockscreen_shade_qs_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> <dimen name="lockscreen_shade_qs_transition_delay">@dimen/lockscreen_shade_scrim_transition_distance</dimen> <dimen name="lockscreen_shade_qs_squish_transition_distance">@dimen/lockscreen_shade_qs_transition_distance</dimen> - <!-- On large screen portrait, the QS squish transition should start from half height. --> - <item name="lockscreen_shade_qs_squish_start_fraction" type="dimen" format="float" >0.5</item> <dimen name="lockscreen_shade_depth_controller_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> <dimen name="lockscreen_shade_udfps_keyguard_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> <dimen name="lockscreen_shade_status_bar_transition_distance">@dimen/lockscreen_shade_full_transition_distance</dimen> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 0e2357611b53..f7019dcd06ee 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1222,7 +1222,7 @@ <!-- The fraction at which the QS "squish" transition should start during the lockscreen shade expansion. 0 is fully collapsed, 1 is fully expanded. --> - <item type="dimen" format="float" name="lockscreen_shade_qs_squish_start_fraction">0</item> + <item type="dimen" format="float" name="lockscreen_shade_qs_squish_start_fraction">0.5</item> <!-- Distance that the full shade transition takes in order for depth of the wallpaper to fully change. --> diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt index f82e7dbd5d12..b78fa9a6b392 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardListenModel.kt @@ -52,7 +52,6 @@ data class KeyguardFaceListenModel( val becauseCannotSkipBouncer: Boolean, val biometricSettingEnabledForUser: Boolean, val bouncerFullyShown: Boolean, - val bouncerIsOrWillShow: Boolean, val faceAuthenticated: Boolean, val faceDisabled: Boolean, val faceLockedOut: Boolean, diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 32c1cf9802ab..6745cab2fcb5 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -2597,7 +2597,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab // on bouncer if both fp and fingerprint are enrolled. final boolean awakeKeyguardExcludingBouncerShowing = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep - && !statusBarShadeLocked && !mBouncerIsOrWillBeShowing; + && !statusBarShadeLocked && !mBouncerFullyShown; final int user = getCurrentUser(); final int strongAuth = mStrongAuthTracker.getStrongAuthForUser(user); final boolean isLockDown = @@ -2667,7 +2667,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab becauseCannotSkipBouncer, biometricEnabledForUser, mBouncerFullyShown, - mBouncerIsOrWillBeShowing, faceAuthenticated, faceDisabledForUser, isFaceLockedOut(), @@ -3243,8 +3242,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab cb.onKeyguardBouncerStateChanged(mBouncerIsOrWillBeShowing); } } - updateBiometricListeningState(BIOMETRIC_ACTION_UPDATE, - FaceAuthUiEvent.FACE_AUTH_UPDATED_PRIMARY_BOUNCER_SHOWN_OR_WILL_BE_SHOWN); + updateFingerprintListeningState(BIOMETRIC_ACTION_UPDATE); } if (wasBouncerFullyShown != mBouncerFullyShown) { diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 7fc81231c90b..a5fdc68226e8 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -103,7 +103,6 @@ import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.SystemUIDialogManager; import com.android.systemui.statusbar.policy.AccessibilityController; import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; -import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BluetoothController; import com.android.systemui.statusbar.policy.CastController; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -253,7 +252,6 @@ public class Dependency { @Inject Lazy<UserInfoController> mUserInfoController; @Inject Lazy<KeyguardStateController> mKeyguardMonitor; @Inject Lazy<KeyguardUpdateMonitor> mKeyguardUpdateMonitor; - @Inject Lazy<BatteryController> mBatteryController; @Inject Lazy<NightDisplayListener> mNightDisplayListener; @Inject Lazy<ReduceBrightColorsController> mReduceBrightColorsController; @Inject Lazy<ManagedProfileController> mManagedProfileController; @@ -404,8 +402,6 @@ public class Dependency { mProviders.put(UserInfoController.class, mUserInfoController::get); - mProviders.put(BatteryController.class, mBatteryController::get); - mProviders.put(NightDisplayListener.class, mNightDisplayListener::get); mProviders.put(ReduceBrightColorsController.class, mReduceBrightColorsController::get); diff --git a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java index fbfc94af683e..a99669970a34 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/ReferenceSystemUIModule.java @@ -35,6 +35,7 @@ import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerImpl; import com.android.systemui.doze.DozeHost; +import com.android.systemui.dump.DumpManager; import com.android.systemui.media.dagger.MediaModule; import com.android.systemui.navigationbar.gestural.GestureModule; import com.android.systemui.plugins.qs.QSFactory; @@ -126,6 +127,7 @@ public abstract class ReferenceSystemUIModule { PowerManager powerManager, BroadcastDispatcher broadcastDispatcher, DemoModeController demoModeController, + DumpManager dumpManager, @Main Handler mainHandler, @Background Handler bgHandler) { BatteryController bC = new BatteryControllerImpl( @@ -134,6 +136,7 @@ public abstract class ReferenceSystemUIModule { powerManager, broadcastDispatcher, demoModeController, + dumpManager, mainHandler, bgHandler); bC.init(); 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/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 448e1807f7af..184089f7eef4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -473,6 +473,8 @@ public class QSPanel extends LinearLayout implements Tunable { ? Math.max(mMediaTotalBottomMargin - getPaddingBottom(), 0) : 0; layoutParams.topMargin = mediaNeedsTopMargin() && !horizontal ? mMediaTopMargin : 0; + // Call setLayoutParams explicitly to ensure that requestLayout happens + hostView.setLayoutParams(layoutParams); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index 205d56583967..f41b905775e4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -21,7 +21,6 @@ import static com.android.systemui.media.dagger.MediaModule.QS_PANEL; import static com.android.systemui.qs.QSPanel.QS_SHOW_BRIGHTNESS; import static com.android.systemui.qs.dagger.QSFragmentModule.QS_USING_MEDIA_PLAYER; -import android.content.res.Configuration; import android.view.MotionEvent; import android.view.View; @@ -61,17 +60,6 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { private final BrightnessMirrorHandler mBrightnessMirrorHandler; private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; - private final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener = - new QSPanel.OnConfigurationChangedListener() { - @Override - public void onConfigurationChange(Configuration newConfig) { - mView.updateResources(); - if (mView.isListening()) { - refreshAllTiles(); - } - } - }; - private View.OnTouchListener mTileLayoutTouchListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { @@ -130,7 +118,6 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { if (mView.isListening()) { refreshAllTiles(); } - mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); switchTileLayout(true); mBrightnessMirrorHandler.onQsPanelAttached(); @@ -147,11 +134,18 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { @Override protected void onViewDetached() { mTunerService.removeTunable(mView); - mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); mBrightnessMirrorHandler.onQsPanelDettached(); super.onViewDetached(); } + @Override + protected void onConfigurationChanged() { + mView.updateResources(); + if (mView.isListening()) { + refreshAllTiles(); + } + } + /** */ public void setVisibility(int visibility) { mView.setVisibility(visibility); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index 6e4c858e89df..a5c60a417a05 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -101,11 +101,11 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr + newConfig.windowConfiguration); mQSLogger.logOnConfigurationChanged(mLastOrientation, newConfig.orientation, mView.getDumpableTag()); - onConfigurationChanged(); if (newConfig.orientation != mLastOrientation) { mLastOrientation = newConfig.orientation; switchTileLayout(false); } + onConfigurationChanged(); } }; @@ -422,6 +422,8 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr } if (mMediaHost != null) { pw.println(" media bounds: " + mMediaHost.getCurrentBounds()); + pw.println(" horizontal layout: " + mUsingHorizontalLayout); + pw.println(" last orientation: " + mLastOrientation); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java index c86e6e855c3d..7ce0ad04bb75 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java @@ -46,14 +46,6 @@ import javax.inject.Provider; @QSScope public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> { - private final QSPanel.OnConfigurationChangedListener mOnConfigurationChangedListener = - newConfig -> { - int newMaxTiles = getResources().getInteger(R.integer.quick_qs_panel_max_tiles); - if (newMaxTiles != mView.getNumQuickTiles()) { - setMaxTiles(newMaxTiles); - } - }; - private final Provider<Boolean> mUsingCollapsedLandscapeMediaProvider; @Inject @@ -99,13 +91,11 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> @Override protected void onViewAttached() { super.onViewAttached(); - mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); } @Override protected void onViewDetached() { super.onViewDetached(); - mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); } private void setMaxTiles(int parseNumTiles) { @@ -115,6 +105,10 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> @Override protected void onConfigurationChanged() { + int newMaxTiles = getResources().getInteger(R.integer.quick_qs_panel_max_tiles); + if (newMaxTiles != mView.getNumQuickTiles()) { + setMaxTiles(newMaxTiles); + } updateMediaExpansion(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index e06c97756ea7..073ab8b16864 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -1199,7 +1199,8 @@ public class KeyguardIndicationController { return ((!updateMonitor.isUnlockingWithBiometricAllowed(true /* isStrongBiometric */) && msgId != FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) || msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED - || msgId == FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED); + || msgId == FingerprintManager.FINGERPRINT_ERROR_USER_CANCELED + || msgId == FingerprintManager.BIOMETRIC_ERROR_POWER_PRESSED); } private boolean shouldSuppressFaceError(int msgId, KeyguardUpdateMonitor updateMonitor) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java index 753e94015751..149ed0a71b91 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java @@ -19,14 +19,17 @@ package com.android.systemui.statusbar.policy; import android.annotation.Nullable; import android.view.View; -import com.android.systemui.Dumpable; import com.android.systemui.demomode.DemoMode; import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; import java.io.PrintWriter; import java.lang.ref.WeakReference; -public interface BatteryController extends DemoMode, Dumpable, +/** + * Controller for battery related information, including the charge level, power save mode, + * and time remaining information + */ +public interface BatteryController extends DemoMode, CallbackController<BatteryStateChangeCallback> { /** * Prints the current state of the {@link BatteryController} to the given {@link PrintWriter}. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java index 33ddf7eed006..c7ad76722929 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java @@ -38,11 +38,13 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.settingslib.fuelgauge.Estimate; import com.android.settingslib.utils.PowerUtil; +import com.android.systemui.Dumpable; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.demomode.DemoMode; import com.android.systemui.demomode.DemoModeController; +import com.android.systemui.dump.DumpManager; import com.android.systemui.power.EnhancedEstimates; import com.android.systemui.util.Assert; @@ -56,7 +58,8 @@ import java.util.concurrent.atomic.AtomicReference; * Default implementation of a {@link BatteryController}. This controller monitors for battery * level change events that are broadcasted by the system. */ -public class BatteryControllerImpl extends BroadcastReceiver implements BatteryController { +public class BatteryControllerImpl extends BroadcastReceiver implements BatteryController, + Dumpable { private static final String TAG = "BatteryController"; private static final String ACTION_LEVEL_TEST = "com.android.systemui.BATTERY_LEVEL_TEST"; @@ -70,6 +73,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC private final ArrayList<EstimateFetchCompletion> mFetchCallbacks = new ArrayList<>(); private final PowerManager mPowerManager; private final DemoModeController mDemoModeController; + private final DumpManager mDumpManager; private final Handler mMainHandler; private final Handler mBgHandler; protected final Context mContext; @@ -101,6 +105,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC PowerManager powerManager, BroadcastDispatcher broadcastDispatcher, DemoModeController demoModeController, + DumpManager dumpManager, @Main Handler mainHandler, @Background Handler bgHandler) { mContext = context; @@ -110,6 +115,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC mEstimates = enhancedEstimates; mBroadcastDispatcher = broadcastDispatcher; mDemoModeController = demoModeController; + mDumpManager = dumpManager; } private void registerReceiver() { @@ -134,6 +140,7 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC } } mDemoModeController.addCallback(this); + mDumpManager.registerDumpable(TAG, this); updatePowerSave(); updateEstimateInBackground(); } diff --git a/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java b/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java index 27746c024dad..00ed3d635fa1 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/tv/TvSystemUIModule.java @@ -36,6 +36,7 @@ import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dock.DockManager; import com.android.systemui.dock.DockManagerImpl; import com.android.systemui.doze.DozeHost; +import com.android.systemui.dump.DumpManager; import com.android.systemui.navigationbar.gestural.GestureModule; import com.android.systemui.plugins.qs.QSFactory; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -116,9 +117,12 @@ public abstract class TvSystemUIModule { static BatteryController provideBatteryController(Context context, EnhancedEstimates enhancedEstimates, PowerManager powerManager, BroadcastDispatcher broadcastDispatcher, DemoModeController demoModeController, + DumpManager dumpManager, @Main Handler mainHandler, @Background Handler bgHandler) { BatteryController bC = new BatteryControllerImpl(context, enhancedEstimates, powerManager, - broadcastDispatcher, demoModeController, mainHandler, bgHandler); + broadcastDispatcher, demoModeController, + dumpManager, + mainHandler, bgHandler); bC.init(); return bC; } diff --git a/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt b/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt index d7ad3cefaf06..938417f9dbe3 100644 --- a/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt @@ -174,6 +174,7 @@ object UserSwitcherViewBinder { setOnItemClickListener { _, _, position, _ -> val itemPositionExcludingHeader = position - 1 adapter.getItem(itemPositionExcludingHeader).onClicked() + dismiss() } show() diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt index 2714cf427e19..485a7e5738f1 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardListenQueueTest.kt @@ -86,7 +86,6 @@ private fun faceModel(user: Int) = KeyguardFaceListenModel( becauseCannotSkipBouncer = false, biometricSettingEnabledForUser = false, bouncerFullyShown = false, - bouncerIsOrWillShow = false, onlyFaceEnrolled = false, faceAuthenticated = false, faceDisabled = false, diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index ae980f58cb3f..409457e23ce9 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -1554,7 +1554,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { anyBoolean()); CancellationSignal cancelSignal = mCancellationSignalCaptor.getValue(); - bouncerWillBeVisibleSoon(); + bouncerFullyVisible(); mTestableLooper.processAllMessages(); assertThat(cancelSignal.isCanceled()).isTrue(); @@ -1752,11 +1752,6 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { setKeyguardBouncerVisibility(true); } - private void bouncerWillBeVisibleSoon() { - mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(true, false); - mTestableLooper.processAllMessages(); - } - private void setKeyguardBouncerVisibility(boolean isVisible) { mKeyguardUpdateMonitor.sendKeyguardBouncerChanged(isVisible, isVisible); mTestableLooper.processAllMessages(); 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); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java index ecc845720717..cbe118635e95 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java @@ -226,7 +226,9 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { + " Tile records:\n" + " " + mockTileString + "\n" + " " + mockTileViewString + "\n" - + " media bounds: null\n"; + + " media bounds: null\n" + + " horizontal layout: false\n" + + " last orientation: 0\n"; assertEquals(expected, w.getBuffer().toString()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt index 39f27d43ed12..4af5b9018d5a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt @@ -123,8 +123,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { @Test fun mediaExpansion_afterConfigChange_inLandscape_collapsedInLandscapeTrue_updatesToCollapsed() { - // times(2) because both controller and base controller are registering their listeners - verify(quickQSPanel, times(2)).addOnConfigurationChangedListener(captor.capture()) + verify(quickQSPanel).addOnConfigurationChangedListener(captor.capture()) // verify that media starts in the expanded state by default verify(mediaHost).expansion = MediaHostState.EXPANDED @@ -139,8 +138,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { @Test fun mediaExpansion_afterConfigChange_landscape_collapsedInLandscapeFalse_remainsExpanded() { - // times(2) because both controller and base controller are registering their listeners - verify(quickQSPanel, times(2)).addOnConfigurationChangedListener(captor.capture()) + verify(quickQSPanel).addOnConfigurationChangedListener(captor.capture()) reset(mediaHost) usingCollapsedLandscapeMedia = false diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java index 945cf7f8774f..9a13e93ebcfc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -635,6 +635,19 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { } @Test + public void transientIndication_visibleWhenDozing_ignoresPowerPressed() { + createController(); + + mController.setVisible(true); + reset(mRotateTextViewController); + mController.getKeyguardCallback().onBiometricError( + FingerprintManager.BIOMETRIC_ERROR_POWER_PRESSED, "foo", + BiometricSourceType.FINGERPRINT); + + verifyNoMessage(INDICATION_TYPE_BIOMETRIC_MESSAGE); + } + + @Test public void transientIndication_swipeUpToRetry() { createController(); String message = mContext.getString(R.string.keyguard_retry); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java index fda80a2f9ed8..43d0fe9559b6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java @@ -42,6 +42,7 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.demomode.DemoModeController; +import com.android.systemui.dump.DumpManager; import com.android.systemui.power.EnhancedEstimates; import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; @@ -80,6 +81,7 @@ public class BatteryControllerTest extends SysuiTestCase { mPowerManager, mBroadcastDispatcher, mDemoModeController, + mock(DumpManager.class), new Handler(), new Handler()); // Can throw if updateEstimate is called on the main thread diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index a71f51a9c8b7..e31c952e10f9 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -46,6 +46,7 @@ import static android.app.AppOpsManager.OP_PLAY_AUDIO; import static android.app.AppOpsManager.OP_RECEIVE_AMBIENT_TRIGGER_AUDIO; import static android.app.AppOpsManager.OP_RECORD_AUDIO; import static android.app.AppOpsManager.OP_RECORD_AUDIO_HOTWORD; +import static android.app.AppOpsManager.OP_VIBRATE; import static android.app.AppOpsManager.OnOpStartedListener.START_TYPE_FAILED; import static android.app.AppOpsManager.OnOpStartedListener.START_TYPE_RESUMED; import static android.app.AppOpsManager.OnOpStartedListener.START_TYPE_STARTED; @@ -266,6 +267,7 @@ public class AppOpsService extends IAppOpsService.Stub { OP_PLAY_AUDIO, OP_RECORD_AUDIO, OP_CAMERA, + OP_VIBRATE, }; private static final int MAX_UNFORWARDED_OPS = 10; |