summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AconfigFlags.bp7
-rw-r--r--apct-tests/perftests/core/src/android/conscrypt/conscrypt/ClientSocketPerfTest.java2
-rw-r--r--apct-tests/perftests/core/src/android/conscrypt/conscrypt/ServerSocketPerfTest.java2
-rw-r--r--core/java/android/hardware/input/input_framework.aconfig7
-rw-r--r--core/java/android/view/SurfaceControl.java17
-rw-r--r--core/java/android/view/animation/Animation.java8
-rw-r--r--core/java/android/view/animation/AnimationSet.java11
-rw-r--r--core/java/android/view/animation/ExtendAnimation.java22
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBar.aidl3
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBarService.aidl3
-rw-r--r--core/java/com/android/internal/statusbar/RegisterStatusBarResult.java9
-rw-r--r--core/jni/android_view_SurfaceControl.cpp17
-rw-r--r--core/res/res/values-watch/themes_device_defaults.xml3
-rw-r--r--core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java3
-rw-r--r--libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeFlags.kt4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationAdapter.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java8
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java7
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java9
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java5
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java17
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java27
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometryTests.java53
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java13
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java23
-rw-r--r--packages/SystemUI/src/com/android/systemui/inputdevice/oobe/KeyboardTouchpadOobeTutorialCoreStartable.kt7
-rw-r--r--packages/SystemUI/src/com/android/systemui/inputdevice/oobe/data/model/OobeSchedulerInfo.kt27
-rw-r--r--packages/SystemUI/src/com/android/systemui/inputdevice/oobe/domain/interactor/OobeSchedulerInteractor.kt97
-rw-r--r--packages/SystemUI/src/com/android/systemui/inputdevice/oobe/domain/interactor/OobeTutorialSchedulerInteractor.kt58
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/touchpad/TouchpadModule.kt2
-rw-r--r--packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt97
-rw-r--r--packages/SystemUI/src/com/android/systemui/volume/dagger/AudioModule.kt4
-rw-r--r--packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java5
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java3
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/navigationbar/views/NavigationBarTest.java14
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt11
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java1
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java12
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java5
-rw-r--r--services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java8
-rw-r--r--services/core/java/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategy.java19
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodManagerService.java6
-rw-r--r--services/core/java/com/android/server/inputmethod/InputMethodMenuControllerNew.java2
-rw-r--r--services/core/java/com/android/server/policy/ModifierShortcutManager.java59
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java4
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java12
-rw-r--r--services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.java8
-rw-r--r--services/core/java/com/android/server/power/WakefulnessSessionObserver.java8
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java4
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java21
-rw-r--r--services/core/java/com/android/server/wallpaper/WallpaperCropper.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowAnimationSpec.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerInternal.java7
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java5
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java24
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java9
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategyTest.java195
67 files changed, 683 insertions, 404 deletions
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index 6b8baf8723c1..7a1add3eb57e 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -99,7 +99,6 @@ aconfig_declarations_group {
"framework_graphics_flags_java_lib",
"hwui_flags_java_lib",
"libcore_exported_aconfig_flags_lib",
- "libgui_flags_java_lib",
"power_flags_lib",
"sdk_sandbox_flags_lib",
"surfaceflinger_flags_java_lib",
@@ -1209,12 +1208,6 @@ java_aconfig_library {
defaults: ["framework-minus-apex-aconfig-java-defaults"],
}
-java_aconfig_library {
- name: "libgui_flags_java_lib",
- aconfig_declarations: "libgui_flags",
- defaults: ["framework-minus-apex-aconfig-java-defaults"],
-}
-
// Content Capture
aconfig_declarations {
name: "android.view.contentcapture.flags-aconfig",
diff --git a/apct-tests/perftests/core/src/android/conscrypt/conscrypt/ClientSocketPerfTest.java b/apct-tests/perftests/core/src/android/conscrypt/conscrypt/ClientSocketPerfTest.java
index 2643bae4060f..d7b1c9a2d3a2 100644
--- a/apct-tests/perftests/core/src/android/conscrypt/conscrypt/ClientSocketPerfTest.java
+++ b/apct-tests/perftests/core/src/android/conscrypt/conscrypt/ClientSocketPerfTest.java
@@ -43,6 +43,7 @@ import java.util.concurrent.atomic.AtomicLong;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -196,6 +197,7 @@ public final class ClientSocketPerfTest {
*/
@Test
@Parameters(method = "getParams")
+ @Ignore("b/351034205")
public void time(Config config) throws Exception {
reset();
setup(config);
diff --git a/apct-tests/perftests/core/src/android/conscrypt/conscrypt/ServerSocketPerfTest.java b/apct-tests/perftests/core/src/android/conscrypt/conscrypt/ServerSocketPerfTest.java
index 4f285ff4eb94..8916a3c55a9a 100644
--- a/apct-tests/perftests/core/src/android/conscrypt/conscrypt/ServerSocketPerfTest.java
+++ b/apct-tests/perftests/core/src/android/conscrypt/conscrypt/ServerSocketPerfTest.java
@@ -43,6 +43,7 @@ import androidx.test.filters.LargeTest;
import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -201,6 +202,7 @@ public final class ServerSocketPerfTest {
@Test
@Parameters(method = "getParams")
+ @Ignore("b/351034205")
public void throughput(Config config) throws Exception {
setup(config);
BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
diff --git a/core/java/android/hardware/input/input_framework.aconfig b/core/java/android/hardware/input/input_framework.aconfig
index b4ad050c8b5d..6f1d63d856b4 100644
--- a/core/java/android/hardware/input/input_framework.aconfig
+++ b/core/java/android/hardware/input/input_framework.aconfig
@@ -85,3 +85,10 @@ flag {
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ name: "modifier_shortcut_dump"
+ namespace: "input"
+ description: "Dump keyboard shortcuts in dumpsys window"
+ bug: "351963350"
+}
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index cf329d3b3992..634469dd52ff 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -164,9 +164,6 @@ public final class SurfaceControl implements Parcelable {
float width, float height, float vecX, float vecY,
float maxStretchAmountX, float maxStretchAmountY, float childRelativeLeft,
float childRelativeTop, float childRelativeRight, float childRelativeBottom);
- private static native void nativeSetEdgeExtensionEffect(long transactionObj, long nativeObj,
- boolean leftEdge, boolean rightEdge,
- boolean topEdge, boolean bottomEdge);
private static native void nativeSetTrustedOverlay(long transactionObj, long nativeObject,
int isTrustedOverlay);
private static native void nativeSetDropInputMode(
@@ -3516,19 +3513,6 @@ public final class SurfaceControl implements Parcelable {
/**
* @hide
*/
- public Transaction setEdgeExtensionEffect(SurfaceControl sc, int edge) {
- checkPreconditions(sc);
-
- nativeSetEdgeExtensionEffect(
- mNativeObject, sc.mNativeObject,
- (edge & WindowInsets.Side.LEFT) != 0, (edge & WindowInsets.Side.RIGHT) != 0,
- (edge & WindowInsets.Side.TOP) != 0, (edge & WindowInsets.Side.BOTTOM) != 0);
- return this;
- }
-
- /**
- * @hide
- */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.O)
public Transaction setLayerStack(SurfaceControl sc, int layerStack) {
checkPreconditions(sc);
@@ -4898,5 +4882,4 @@ public final class SurfaceControl implements Parcelable {
public static void notifyShutdown() {
nativeNotifyShutdown();
}
-
}
diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java
index 2af935d5401f..09306c791537 100644
--- a/core/java/android/view/animation/Animation.java
+++ b/core/java/android/view/animation/Animation.java
@@ -28,7 +28,6 @@ import android.os.Handler;
import android.os.SystemProperties;
import android.util.AttributeSet;
import android.util.TypedValue;
-import android.view.WindowInsets;
import dalvik.system.CloseGuard;
@@ -882,13 +881,12 @@ public abstract class Animation implements Cloneable {
}
/**
- * @return the edges to which outsets can be applied to
+ * @return if a window animation has outsets applied to it.
*
* @hide
*/
- @WindowInsets.Side.InsetsSide
- public int getExtensionEdges() {
- return 0x0;
+ public boolean hasExtension() {
+ return false;
}
/**
diff --git a/core/java/android/view/animation/AnimationSet.java b/core/java/android/view/animation/AnimationSet.java
index bbdc9d0392ba..5aaa994f3f8f 100644
--- a/core/java/android/view/animation/AnimationSet.java
+++ b/core/java/android/view/animation/AnimationSet.java
@@ -21,7 +21,6 @@ import android.content.res.TypedArray;
import android.graphics.RectF;
import android.os.Build;
import android.util.AttributeSet;
-import android.view.WindowInsets;
import java.util.ArrayList;
import java.util.List;
@@ -541,12 +540,12 @@ public class AnimationSet extends Animation {
/** @hide */
@Override
- @WindowInsets.Side.InsetsSide
- public int getExtensionEdges() {
- int edge = 0x0;
+ public boolean hasExtension() {
for (Animation animation : mAnimations) {
- edge |= animation.getExtensionEdges();
+ if (animation.hasExtension()) {
+ return true;
+ }
}
- return edge;
+ return false;
}
}
diff --git a/core/java/android/view/animation/ExtendAnimation.java b/core/java/android/view/animation/ExtendAnimation.java
index ed047c744007..210eb8a1ca9d 100644
--- a/core/java/android/view/animation/ExtendAnimation.java
+++ b/core/java/android/view/animation/ExtendAnimation.java
@@ -20,7 +20,6 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Insets;
import android.util.AttributeSet;
-import android.view.WindowInsets;
/**
* An animation that controls the outset of an object.
@@ -51,8 +50,6 @@ public class ExtendAnimation extends Animation {
private float mToRightValue;
private float mToBottomValue;
- private int mExtensionEdges = 0x0;
-
/**
* Constructor used when an ExtendAnimation is loaded from a resource.
*
@@ -154,22 +151,9 @@ public class ExtendAnimation extends Animation {
/** @hide */
@Override
- @WindowInsets.Side.InsetsSide
- public int getExtensionEdges() {
- mExtensionEdges = 0x0;
- if (mFromLeftValue > 0 || mToLeftValue > 0) {
- mExtensionEdges |= WindowInsets.Side.LEFT;
- }
- if (mFromRightValue > 0 || mToRightValue > 0) {
- mExtensionEdges |= WindowInsets.Side.RIGHT;
- }
- if (mFromTopValue > 0 || mToTopValue > 0) {
- mExtensionEdges |= WindowInsets.Side.TOP;
- }
- if (mFromBottomValue > 0 || mToBottomValue > 0) {
- mExtensionEdges |= WindowInsets.Side.BOTTOM;
- }
- return mExtensionEdges;
+ public boolean hasExtension() {
+ return mFromInsets.left < 0 || mFromInsets.top < 0 || mFromInsets.right < 0
+ || mFromInsets.bottom < 0;
}
@Override
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index e29f256146d0..1d43f6f083e6 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -51,8 +51,7 @@ oneway interface IStatusBar
void showWirelessChargingAnimation(int batteryLevel);
- void setImeWindowStatus(int displayId, in IBinder token, int vis, int backDisposition,
- boolean showImeSwitcher);
+ void setImeWindowStatus(int displayId, int vis, int backDisposition, boolean showImeSwitcher);
void setWindowState(int display, int window, int state);
void showRecentApps(boolean triggeredFromAltTab);
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index fc60f065a965..ff08dd27225f 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -61,8 +61,7 @@ interface IStatusBarService
void setIconVisibility(String slot, boolean visible);
@UnsupportedAppUsage
void removeIcon(String slot);
- void setImeWindowStatus(int displayId, in IBinder token, int vis, int backDisposition,
- boolean showImeSwitcher);
+ void setImeWindowStatus(int displayId, int vis, int backDisposition, boolean showImeSwitcher);
void expandSettingsPanel(String subPanel);
// ---- Methods below are for use by the status bar policy services ----
diff --git a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java
index 4f827cda6afa..7240aff022d4 100644
--- a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java
+++ b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java
@@ -16,7 +16,6 @@
package com.android.internal.statusbar;
-import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArrayMap;
@@ -35,7 +34,6 @@ public final class RegisterStatusBarResult implements Parcelable {
public final int mImeBackDisposition; // switch[4]
public final boolean mShowImeSwitcher; // switch[5]
public final int mDisabledFlags2; // switch[6]
- public final IBinder mImeToken;
public final boolean mNavbarColorManagedByIme;
public final int mBehavior;
public final int mRequestedVisibleTypes;
@@ -45,7 +43,7 @@ public final class RegisterStatusBarResult implements Parcelable {
public RegisterStatusBarResult(ArrayMap<String, StatusBarIcon> icons, int disabledFlags1,
int appearance, AppearanceRegion[] appearanceRegions, int imeWindowVis,
- int imeBackDisposition, boolean showImeSwitcher, int disabledFlags2, IBinder imeToken,
+ int imeBackDisposition, boolean showImeSwitcher, int disabledFlags2,
boolean navbarColorManagedByIme, int behavior, int requestedVisibleTypes,
String packageName, int transientBarTypes, LetterboxDetails[] letterboxDetails) {
mIcons = new ArrayMap<>(icons);
@@ -56,7 +54,6 @@ public final class RegisterStatusBarResult implements Parcelable {
mImeBackDisposition = imeBackDisposition;
mShowImeSwitcher = showImeSwitcher;
mDisabledFlags2 = disabledFlags2;
- mImeToken = imeToken;
mNavbarColorManagedByIme = navbarColorManagedByIme;
mBehavior = behavior;
mRequestedVisibleTypes = requestedVisibleTypes;
@@ -80,7 +77,6 @@ public final class RegisterStatusBarResult implements Parcelable {
dest.writeInt(mImeBackDisposition);
dest.writeBoolean(mShowImeSwitcher);
dest.writeInt(mDisabledFlags2);
- dest.writeStrongBinder(mImeToken);
dest.writeBoolean(mNavbarColorManagedByIme);
dest.writeInt(mBehavior);
dest.writeInt(mRequestedVisibleTypes);
@@ -106,7 +102,6 @@ public final class RegisterStatusBarResult implements Parcelable {
final int imeBackDisposition = source.readInt();
final boolean showImeSwitcher = source.readBoolean();
final int disabledFlags2 = source.readInt();
- final IBinder imeToken = source.readStrongBinder();
final boolean navbarColorManagedByIme = source.readBoolean();
final int behavior = source.readInt();
final int requestedVisibleTypes = source.readInt();
@@ -116,7 +111,7 @@ public final class RegisterStatusBarResult implements Parcelable {
source.readParcelableArray(null, LetterboxDetails.class);
return new RegisterStatusBarResult(icons, disabledFlags1, appearance,
appearanceRegions, imeWindowVis, imeBackDisposition, showImeSwitcher,
- disabledFlags2, imeToken, navbarColorManagedByIme, behavior,
+ disabledFlags2, navbarColorManagedByIme, behavior,
requestedVisibleTypes, packageName, transientBarTypes,
letterboxDetails);
}
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 0f531641903a..9ce76583517b 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -22,7 +22,6 @@
#include <android/graphics/properties.h>
#include <android/graphics/region.h>
#include <android/gui/BnWindowInfosReportedListener.h>
-#include <android/gui/EdgeExtensionParameters.h>
#include <android/gui/JankData.h>
#include <android/hardware/display/IDeviceProductInfoConstants.h>
#include <android/os/IInputConstants.h>
@@ -800,20 +799,6 @@ static void nativeSetStretchEffect(JNIEnv* env, jclass clazz, jlong transactionO
transaction->setStretchEffect(ctrl, stretch);
}
-static void nativeSetEdgeExtensionEffect(JNIEnv* env, jclass clazz, jlong transactionObj,
- jlong nativeObj, jboolean leftEdge, jboolean rightEdge,
- jboolean topEdge, jboolean bottomEdge) {
- auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
- auto* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObj);
-
- auto effect = gui::EdgeExtensionParameters();
- effect.extendLeft = leftEdge;
- effect.extendRight = rightEdge;
- effect.extendTop = topEdge;
- effect.extendBottom = bottomEdge;
- transaction->setEdgeExtensionEffect(ctrl, effect);
-}
-
static void nativeSetFlags(JNIEnv* env, jclass clazz, jlong transactionObj,
jlong nativeObject, jint flags, jint mask) {
auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
@@ -2355,8 +2340,6 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeSetBlurRegions },
{"nativeSetStretchEffect", "(JJFFFFFFFFFF)V",
(void*) nativeSetStretchEffect },
- {"nativeSetEdgeExtensionEffect", "(JJZZZZ)V",
- (void*) nativeSetEdgeExtensionEffect },
{"nativeSetShadowRadius", "(JJF)V",
(void*)nativeSetShadowRadius },
{"nativeSetFrameRate", "(JJFII)V",
diff --git a/core/res/res/values-watch/themes_device_defaults.xml b/core/res/res/values-watch/themes_device_defaults.xml
index 85d34e2cf6c6..4d2085bbe0c7 100644
--- a/core/res/res/values-watch/themes_device_defaults.xml
+++ b/core/res/res/values-watch/themes_device_defaults.xml
@@ -548,4 +548,7 @@ a similar way.
<item name="primaryContentAlpha">@dimen/primary_content_alpha_device_default</item>
<item name="secondaryContentAlpha">@dimen/secondary_content_alpha_device_default</item>
</style>
+
+ <!-- Device default theme for the Input Method Switcher dialog. Override to make it dark. -->
+ <style name="Theme.DeviceDefault.InputMethodSwitcherDialog" parent="Theme.DeviceDefault.Dialog.Alert"/>
</resources>
diff --git a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java
index af2a2bbe2893..c733bae53f47 100644
--- a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java
+++ b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java
@@ -21,7 +21,6 @@ import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_B
import static com.google.common.truth.Truth.assertThat;
import android.graphics.Rect;
-import android.os.Binder;
import android.os.Parcel;
import android.os.UserHandle;
import android.util.ArrayMap;
@@ -63,7 +62,6 @@ public class RegisterStatusBarResultTest {
0x10 /* imeBackDisposition */,
false /* showImeSwitcher */,
0x20 /* disabledFlags2 */,
- new Binder() /* imeToken */,
true /* navbarColorManagedByIme */,
BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE,
WindowInsets.Type.defaultVisible(),
@@ -85,7 +83,6 @@ public class RegisterStatusBarResultTest {
assertThat(copy.mImeBackDisposition).isEqualTo(original.mImeBackDisposition);
assertThat(copy.mShowImeSwitcher).isEqualTo(original.mShowImeSwitcher);
assertThat(copy.mDisabledFlags2).isEqualTo(original.mDisabledFlags2);
- assertThat(copy.mImeToken).isSameInstanceAs(original.mImeToken);
assertThat(copy.mNavbarColorManagedByIme).isEqualTo(original.mNavbarColorManagedByIme);
assertThat(copy.mBehavior).isEqualTo(original.mBehavior);
assertThat(copy.mRequestedVisibleTypes).isEqualTo(original.mRequestedVisibleTypes);
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeFlags.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeFlags.kt
index 13049694d3fb..2d55f825692a 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeFlags.kt
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeFlags.kt
@@ -44,7 +44,9 @@ enum class DesktopModeFlags(
TASK_STACK_OBSERVER_IN_SHELL(Flags::enableTaskStackObserverInShell, true),
SIZE_CONSTRAINTS(Flags::enableDesktopWindowingSizeConstraints, true),
DYNAMIC_INITIAL_BOUNDS(Flags::enableWindowingDynamicInitialBounds, true),
- ENABLE_DESKTOP_WINDOWING_TASK_LIMIT(Flags::enableDesktopWindowingTaskLimit, true);
+ ENABLE_DESKTOP_WINDOWING_TASK_LIMIT(Flags::enableDesktopWindowingTaskLimit, true),
+ BACK_NAVIGATION(Flags::enableDesktopWindowingBackNavigation, true),
+ EDGE_DRAG_RESIZE(Flags::enableWindowingEdgeDragResize, true);
/**
* Determines state of flag based on the actual flag and desktop mode developer option overrides.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationAdapter.java b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationAdapter.java
index 86e0f14c5c71..8d30db64a3e5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationAdapter.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationAdapter.java
@@ -146,11 +146,6 @@ class ActivityEmbeddingAnimationAdapter {
/** To be overridden by subclasses to adjust the animation surface change. */
void onAnimationUpdateInner(@NonNull SurfaceControl.Transaction t) {
// Update the surface position and alpha.
- if (com.android.graphics.libgui.flags.Flags.edgeExtensionShader()
- && mAnimation.getExtensionEdges() != 0) {
- t.setEdgeExtensionEffect(mLeash, mAnimation.getExtensionEdges());
- }
-
mTransformation.getMatrix().postTranslate(mContentRelOffset.x, mContentRelOffset.y);
t.setMatrix(mLeash, mTransformation.getMatrix(), mMatrix);
t.setAlpha(mLeash, mTransformation.getAlpha());
@@ -170,7 +165,7 @@ class ActivityEmbeddingAnimationAdapter {
if (!cropRect.intersect(mWholeAnimationBounds)) {
// Hide the surface when it is outside of the animation area.
t.setAlpha(mLeash, 0);
- } else if (mAnimation.getExtensionEdges() != 0) {
+ } else if (mAnimation.hasExtension()) {
// Allow the surface to be shown in its original bounds in case we want to use edge
// extensions.
cropRect.union(mContentBounds);
@@ -185,7 +180,6 @@ class ActivityEmbeddingAnimationAdapter {
@CallSuper
void onAnimationEnd(@NonNull SurfaceControl.Transaction t) {
onAnimationUpdate(t, mAnimation.getDuration());
- t.setEdgeExtensionEffect(mLeash, /* edge */ 0);
}
final long getDurationHint() {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java
index d2cef4baf798..5696a544152c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/activityembedding/ActivityEmbeddingAnimationRunner.java
@@ -144,10 +144,8 @@ class ActivityEmbeddingAnimationRunner {
// ending states.
prepareForJumpCut(info, startTransaction);
} else {
- if (!com.android.graphics.libgui.flags.Flags.edgeExtensionShader()) {
- addEdgeExtensionIfNeeded(startTransaction, finishTransaction,
- postStartTransactionCallbacks, adapters);
- }
+ addEdgeExtensionIfNeeded(startTransaction, finishTransaction,
+ postStartTransactionCallbacks, adapters);
addBackgroundColorIfNeeded(info, startTransaction, finishTransaction, adapters);
for (ActivityEmbeddingAnimationAdapter adapter : adapters) {
duration = Math.max(duration, adapter.getDurationHint());
@@ -343,7 +341,7 @@ class ActivityEmbeddingAnimationRunner {
@NonNull List<ActivityEmbeddingAnimationAdapter> adapters) {
for (ActivityEmbeddingAnimationAdapter adapter : adapters) {
final Animation animation = adapter.mAnimation;
- if (animation.getExtensionEdges() == 0) {
+ if (!animation.hasExtension()) {
continue;
}
if (adapter.mChange.hasFlags(FLAG_TRANSLUCENT)
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
index 271c07d4011d..08de900f83ef 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
@@ -19,8 +19,6 @@ package com.android.wm.shell.compatui;
import static android.view.WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP;
import static android.window.TaskConstants.TASK_CHILD_LAYER_COMPAT_UI;
-import static com.android.wm.shell.shared.desktopmode.DesktopModeFlags.DESKTOP_WINDOWING_MODE;
-
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.TaskInfo;
@@ -40,6 +38,7 @@ import com.android.wm.shell.compatui.CompatUIController.CompatUIHintsState;
import com.android.wm.shell.compatui.api.CompatUIEvent;
import com.android.wm.shell.compatui.impl.CompatUIEvents.SizeCompatRestartButtonAppeared;
import com.android.wm.shell.shared.desktopmode.DesktopModeFlags;
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
import java.util.function.Consumer;
@@ -83,7 +82,7 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
super(context, taskInfo, syncQueue, taskListener, displayLayout);
mCallback = callback;
mHasSizeCompat = taskInfo.appCompatTaskInfo.topActivityInSizeCompat;
- if (DESKTOP_WINDOWING_MODE.isEnabled(mContext)
+ if (DesktopModeStatus.canEnterDesktopMode(context)
&& DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(context)) {
// Don't show the SCM button for freeform tasks
mHasSizeCompat &= !taskInfo.isFreeform();
@@ -139,7 +138,7 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
boolean canShow) {
final boolean prevHasSizeCompat = mHasSizeCompat;
mHasSizeCompat = taskInfo.appCompatTaskInfo.topActivityInSizeCompat;
- if (DESKTOP_WINDOWING_MODE.isEnabled(mContext)
+ if (DesktopModeStatus.canEnterDesktopMode(mContext)
&& DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)) {
// Don't show the SCM button for freeform tasks
mHasSizeCompat &= !taskInfo.isFreeform();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
index 5f838d3adb3c..89c800af3b6e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
@@ -54,7 +54,6 @@ import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELE
import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.policy.ScreenDecorationsUtils
import com.android.internal.protolog.ProtoLog
-import com.android.window.flags.Flags
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.common.DisplayController
@@ -982,7 +981,7 @@ class DesktopTasksController(
}
taskRepository.addClosingTask(task.displayId, task.taskId)
// If a CLOSE or TO_BACK is triggered on a desktop task, remove the task.
- if (Flags.enableDesktopWindowingBackNavigation() &&
+ if (DesktopModeFlags.BACK_NAVIGATION.isEnabled(context) &&
taskRepository.isVisibleTask(task.taskId)) {
wct.removeTask(task.token)
}
@@ -1488,7 +1487,8 @@ class DesktopTasksController(
}
override fun hideStashedDesktopApps(displayId: Int) {
- ProtoLog.w(WM_SHELL_DESKTOP_MODE, "IDesktopModeImpl: hideStashedDesktopApps is deprecated")
+ ProtoLog.w(WM_SHELL_DESKTOP_MODE,
+ "IDesktopModeImpl: hideStashedDesktopApps is deprecated")
}
override fun getVisibleTaskCount(displayId: Int): Int {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
index d8c8c605184c..778478405dda 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java
@@ -502,8 +502,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
backgroundColorForTransition = getTransitionBackgroundColorIfSet(info, change, a,
backgroundColorForTransition);
- if (!com.android.graphics.libgui.flags.Flags.edgeExtensionShader() && !isTask
- && a.getExtensionEdges() != 0) {
+ if (!isTask && a.hasExtension()) {
if (!TransitionUtil.isOpeningType(mode)) {
// Can screenshot now (before startTransaction is applied)
edgeExtendWindow(change, a, startTransaction, finishTransaction);
@@ -513,8 +512,6 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
postStartTransactionCallbacks
.add(t -> edgeExtendWindow(change, a, t, finishTransaction));
}
- } else if (com.android.graphics.libgui.flags.Flags.edgeExtensionShader()) {
- finishTransaction.setEdgeExtensionEffect(change.getLeash(), /* edge */ 0);
}
final Rect clipRect = TransitionUtil.isClosingType(mode)
@@ -1011,10 +1008,6 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
Point position, float cornerRadius, @Nullable Rect immutableClipRect) {
tmpTransformation.clear();
anim.getTransformation(time, tmpTransformation);
- if (anim.getExtensionEdges() != 0
- && com.android.graphics.libgui.flags.Flags.edgeExtensionShader()) {
- t.setEdgeExtensionEffect(leash, anim.getExtensionEdges());
- }
if (position != null) {
tmpTransformation.getMatrix().postTranslate(position.x, position.y);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
index de514f661d01..9de065129e47 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java
@@ -279,7 +279,7 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL
final Resources res = mResult.mRootView.getResources();
mDragResizeListener.setGeometry(new DragResizeWindowGeometry(0 /* taskCornerRadius */,
- new Size(mResult.mWidth, mResult.mHeight), getResizeEdgeHandleSize(res),
+ new Size(mResult.mWidth, mResult.mHeight), getResizeEdgeHandleSize(mContext, res),
getFineResizeCornerSize(res), getLargeResizeCornerSize(res)), touchSlop);
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
index e82990f9fe1d..df41d315fe5f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java
@@ -492,8 +492,9 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
final Resources res = mResult.mRootView.getResources();
if (mDragResizeListener.setGeometry(
new DragResizeWindowGeometry(mRelayoutParams.mCornerRadius,
- new Size(mResult.mWidth, mResult.mHeight), getResizeEdgeHandleSize(res),
- getFineResizeCornerSize(res), getLargeResizeCornerSize(res)), touchSlop)
+ new Size(mResult.mWidth, mResult.mHeight),
+ getResizeEdgeHandleSize(mContext, res), getFineResizeCornerSize(res),
+ getLargeResizeCornerSize(res)), touchSlop)
|| !mTaskInfo.positionInParent.equals(mPositionInParent)) {
updateExclusionRegion();
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
index 32df8b3b2c7c..17295481fba1 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeInputListener.java
@@ -81,6 +81,7 @@ class DragResizeInputListener implements AutoCloseable {
private final InputChannel mInputChannel;
private final TaskResizeInputEventReceiver mInputEventReceiver;
+ private final Context mContext;
private final SurfaceControl mInputSinkSurface;
private final IBinder mSinkClientToken;
private final InputChannel mSinkInputChannel;
@@ -97,6 +98,7 @@ class DragResizeInputListener implements AutoCloseable {
Supplier<SurfaceControl.Builder> surfaceControlBuilderSupplier,
Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier,
DisplayController displayController) {
+ mContext = context;
mSurfaceControlTransactionSupplier = surfaceControlTransactionSupplier;
mDisplayId = displayId;
mDecorationSurface = decorationSurface;
@@ -180,7 +182,7 @@ class DragResizeInputListener implements AutoCloseable {
mTouchRegion.setEmpty();
// Apply the geometry to the touch region.
- geometry.union(mTouchRegion);
+ geometry.union(mContext, mTouchRegion);
mInputEventReceiver.setGeometry(geometry);
mInputEventReceiver.setTouchRegion(mTouchRegion);
@@ -354,7 +356,7 @@ class DragResizeInputListener implements AutoCloseable {
*/
@NonNull Region getCornersRegion() {
Region region = new Region();
- mDragResizeWindowGeometry.union(region);
+ mDragResizeWindowGeometry.union(mContext, region);
return region;
}
@@ -395,7 +397,7 @@ class DragResizeInputListener implements AutoCloseable {
// Touch events are tracked in four corners. Other events are tracked in resize edges.
switch (e.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
- mShouldHandleEvents = mDragResizeWindowGeometry.shouldHandleEvent(e,
+ mShouldHandleEvents = mDragResizeWindowGeometry.shouldHandleEvent(mContext, e,
new Point() /* offset */);
if (mShouldHandleEvents) {
// Save the id of the pointer for this drag interaction; we will use the
@@ -405,8 +407,9 @@ class DragResizeInputListener implements AutoCloseable {
float y = e.getY(0);
float rawX = e.getRawX(0);
float rawY = e.getRawY(0);
- final int ctrlType = mDragResizeWindowGeometry.calculateCtrlType(
- isEventFromTouchscreen(e), isEdgeResizePermitted(e), x, y);
+ final int ctrlType = mDragResizeWindowGeometry.calculateCtrlType(mContext,
+ isEventFromTouchscreen(e), isEdgeResizePermitted(mContext, e), x,
+ y);
ProtoLog.d(WM_SHELL_DESKTOP_MODE,
"%s: Handling action down, update ctrlType to %d", TAG, ctrlType);
mDragStartTaskBounds = mCallback.onDragPositioningStart(ctrlType,
@@ -496,7 +499,7 @@ class DragResizeInputListener implements AutoCloseable {
// Since we are handling cursor, we know that this is not a touchscreen event, and
// that edge resizing should always be allowed.
@DragPositioningCallback.CtrlType int ctrlType =
- mDragResizeWindowGeometry.calculateCtrlType(/* isTouchscreen= */
+ mDragResizeWindowGeometry.calculateCtrlType(mContext, /* isTouchscreen= */
false, /* isEdgeResizePermitted= */ true, x, y);
int cursorType = PointerIcon.TYPE_DEFAULT;
@@ -537,7 +540,7 @@ class DragResizeInputListener implements AutoCloseable {
}
private boolean shouldHandleEvent(MotionEvent e, Point offset) {
- return mDragResizeWindowGeometry.shouldHandleEvent(e, offset);
+ return mDragResizeWindowGeometry.shouldHandleEvent(mContext, e, offset);
}
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java
index ba5f0791a010..014d61d00b9e 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java
@@ -18,7 +18,7 @@ package com.android.wm.shell.windowdecor;
import static android.view.InputDevice.SOURCE_TOUCHSCREEN;
-import static com.android.window.flags.Flags.enableWindowingEdgeDragResize;
+import static com.android.wm.shell.shared.desktopmode.DesktopModeFlags.EDGE_DRAG_RESIZE;
import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_BOTTOM;
import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_LEFT;
import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_RIGHT;
@@ -26,6 +26,7 @@ import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE
import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_UNDEFINED;
import android.annotation.NonNull;
+import android.content.Context;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.Rect;
@@ -69,8 +70,8 @@ final class DragResizeWindowGeometry {
/**
* Returns the resource value to use for the resize handle on the edge of the window.
*/
- static int getResizeEdgeHandleSize(@NonNull Resources res) {
- return enableWindowingEdgeDragResize()
+ static int getResizeEdgeHandleSize(@NonNull Context context, @NonNull Resources res) {
+ return EDGE_DRAG_RESIZE.isEnabled(context)
? res.getDimensionPixelSize(R.dimen.desktop_mode_edge_handle)
: res.getDimensionPixelSize(R.dimen.freeform_resize_handle);
}
@@ -103,11 +104,11 @@ final class DragResizeWindowGeometry {
* Returns the union of all regions that can be touched for drag resizing; the corners window
* and window edges.
*/
- void union(@NonNull Region region) {
+ void union(@NonNull Context context, @NonNull Region region) {
// Apply the edge resize regions.
mTaskEdges.union(region);
- if (enableWindowingEdgeDragResize()) {
+ if (EDGE_DRAG_RESIZE.isEnabled(context)) {
// Apply the corners as well for the larger corners, to ensure we capture all possible
// touches.
mLargeTaskCorners.union(region);
@@ -120,11 +121,12 @@ final class DragResizeWindowGeometry {
/**
* Returns if this MotionEvent should be handled, based on its source and position.
*/
- boolean shouldHandleEvent(@NonNull MotionEvent e, @NonNull Point offset) {
+ boolean shouldHandleEvent(@NonNull Context context, @NonNull MotionEvent e,
+ @NonNull Point offset) {
final float x = e.getX(0) + offset.x;
final float y = e.getY(0) + offset.y;
- if (enableWindowingEdgeDragResize()) {
+ if (EDGE_DRAG_RESIZE.isEnabled(context)) {
// First check if touch falls within a corner.
// Large corner bounds are used for course input like touch, otherwise fine bounds.
boolean result = isEventFromTouchscreen(e)
@@ -132,7 +134,7 @@ final class DragResizeWindowGeometry {
: isInCornerBounds(mFineTaskCorners, x, y);
// Check if touch falls within the edge resize handle. Limit edge resizing to stylus and
// mouse input.
- if (!result && isEdgeResizePermitted(e)) {
+ if (!result && isEdgeResizePermitted(context, e)) {
result = isInEdgeResizeBounds(x, y);
}
return result;
@@ -148,8 +150,8 @@ final class DragResizeWindowGeometry {
return (e.getSource() & SOURCE_TOUCHSCREEN) == SOURCE_TOUCHSCREEN;
}
- static boolean isEdgeResizePermitted(@NonNull MotionEvent e) {
- if (enableWindowingEdgeDragResize()) {
+ static boolean isEdgeResizePermitted(@NonNull Context context, @NonNull MotionEvent e) {
+ if (EDGE_DRAG_RESIZE.isEnabled(context)) {
return e.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS
|| e.getToolType(0) == MotionEvent.TOOL_TYPE_MOUSE;
} else {
@@ -174,8 +176,9 @@ final class DragResizeWindowGeometry {
* resize region.
*/
@DragPositioningCallback.CtrlType
- int calculateCtrlType(boolean isTouchscreen, boolean isEdgeResizePermitted, float x, float y) {
- if (enableWindowingEdgeDragResize()) {
+ int calculateCtrlType(@NonNull Context context, boolean isTouchscreen,
+ boolean isEdgeResizePermitted, float x, float y) {
+ if (EDGE_DRAG_RESIZE.isEnabled(context)) {
// First check if touch falls within a corner.
// Large corner bounds are used for course input like touch, otherwise fine bounds.
int ctrlType = isTouchscreen
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometryTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometryTests.java
index 6a94cd8aa283..77337a03ef55 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometryTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometryTests.java
@@ -25,6 +25,7 @@ import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE
import static com.google.common.truth.Truth.assertThat;
import android.annotation.NonNull;
+import android.content.Context;
import android.graphics.Point;
import android.graphics.Region;
import android.platform.test.annotations.DisableFlags;
@@ -36,6 +37,7 @@ import android.util.Size;
import androidx.test.filters.SmallTest;
import com.android.window.flags.Flags;
+import com.android.wm.shell.ShellTestCase;
import com.google.common.testing.EqualsTester;
@@ -51,7 +53,7 @@ import org.junit.runner.RunWith;
*/
@SmallTest
@RunWith(AndroidTestingRunner.class)
-public class DragResizeWindowGeometryTests {
+public class DragResizeWindowGeometryTests extends ShellTestCase {
private static final Size TASK_SIZE = new Size(500, 1000);
private static final int TASK_CORNER_RADIUS = 10;
private static final int EDGE_RESIZE_THICKNESS = 15;
@@ -107,7 +109,7 @@ public class DragResizeWindowGeometryTests {
@Test
public void testRegionUnionContainsEdges() {
Region region = new Region();
- GEOMETRY.union(region);
+ GEOMETRY.union(mContext, region);
assertThat(region.isComplex()).isTrue();
// Region excludes task area. Note that coordinates start from top left.
assertThat(region.contains(TASK_SIZE.getWidth() / 2, TASK_SIZE.getHeight() / 2)).isFalse();
@@ -147,10 +149,10 @@ public class DragResizeWindowGeometryTests {
@EnableFlags(Flags.FLAG_ENABLE_WINDOWING_EDGE_DRAG_RESIZE)
public void testRegionUnion_edgeDragResizeEnabled_containsLargeCorners() {
Region region = new Region();
- GEOMETRY.union(region);
+ GEOMETRY.union(mContext, region);
final int cornerRadius = LARGE_CORNER_SIZE / 2;
- new TestPoints(TASK_SIZE, cornerRadius).validateRegion(region);
+ new TestPoints(mContext, TASK_SIZE, cornerRadius).validateRegion(region);
}
/**
@@ -161,10 +163,10 @@ public class DragResizeWindowGeometryTests {
@DisableFlags(Flags.FLAG_ENABLE_WINDOWING_EDGE_DRAG_RESIZE)
public void testRegionUnion_edgeDragResizeDisabled_containsFineCorners() {
Region region = new Region();
- GEOMETRY.union(region);
+ GEOMETRY.union(mContext, region);
final int cornerRadius = FINE_CORNER_SIZE / 2;
- new TestPoints(TASK_SIZE, cornerRadius).validateRegion(region);
+ new TestPoints(mContext, TASK_SIZE, cornerRadius).validateRegion(region);
}
@Test
@@ -186,16 +188,16 @@ public class DragResizeWindowGeometryTests {
}
private void validateCtrlTypeForEdges(boolean isTouchscreen, boolean isEdgeResizePermitted) {
- assertThat(GEOMETRY.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(GEOMETRY.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
LEFT_EDGE_POINT.x, LEFT_EDGE_POINT.y)).isEqualTo(
isEdgeResizePermitted ? CTRL_TYPE_LEFT : CTRL_TYPE_UNDEFINED);
- assertThat(GEOMETRY.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(GEOMETRY.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
TOP_EDGE_POINT.x, TOP_EDGE_POINT.y)).isEqualTo(
isEdgeResizePermitted ? CTRL_TYPE_TOP : CTRL_TYPE_UNDEFINED);
- assertThat(GEOMETRY.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(GEOMETRY.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
RIGHT_EDGE_POINT.x, RIGHT_EDGE_POINT.y)).isEqualTo(
isEdgeResizePermitted ? CTRL_TYPE_RIGHT : CTRL_TYPE_UNDEFINED);
- assertThat(GEOMETRY.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(GEOMETRY.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
BOTTOM_EDGE_POINT.x, BOTTOM_EDGE_POINT.y)).isEqualTo(
isEdgeResizePermitted ? CTRL_TYPE_BOTTOM : CTRL_TYPE_UNDEFINED);
}
@@ -203,8 +205,9 @@ public class DragResizeWindowGeometryTests {
@Test
@EnableFlags(Flags.FLAG_ENABLE_WINDOWING_EDGE_DRAG_RESIZE)
public void testCalculateControlType_edgeDragResizeEnabled_corners() {
- final TestPoints fineTestPoints = new TestPoints(TASK_SIZE, FINE_CORNER_SIZE / 2);
- final TestPoints largeCornerTestPoints = new TestPoints(TASK_SIZE, LARGE_CORNER_SIZE / 2);
+ final TestPoints fineTestPoints = new TestPoints(mContext, TASK_SIZE, FINE_CORNER_SIZE / 2);
+ final TestPoints largeCornerTestPoints =
+ new TestPoints(mContext, TASK_SIZE, LARGE_CORNER_SIZE / 2);
// When the flag is enabled, points within fine corners should pass regardless of touch or
// not. Points outside fine corners should not pass when using a course input (non-touch).
@@ -241,8 +244,10 @@ public class DragResizeWindowGeometryTests {
@Test
@DisableFlags(Flags.FLAG_ENABLE_WINDOWING_EDGE_DRAG_RESIZE)
public void testCalculateControlType_edgeDragResizeDisabled_corners() {
- final TestPoints fineTestPoints = new TestPoints(TASK_SIZE, FINE_CORNER_SIZE / 2);
- final TestPoints largeCornerTestPoints = new TestPoints(TASK_SIZE, LARGE_CORNER_SIZE / 2);
+ final TestPoints fineTestPoints =
+ new TestPoints(mContext, TASK_SIZE, FINE_CORNER_SIZE / 2);
+ final TestPoints largeCornerTestPoints =
+ new TestPoints(mContext, TASK_SIZE, LARGE_CORNER_SIZE / 2);
// When the flag is disabled, points within fine corners should pass only from touchscreen.
// Edge resize permitted (indicating the event is from a cursor/stylus) should have no
@@ -284,6 +289,7 @@ public class DragResizeWindowGeometryTests {
* <p>Creates points that are both just within the bounds of each corner, and just outside.
*/
private static final class TestPoints {
+ private final Context mContext;
private final Point mTopLeftPoint;
private final Point mTopLeftPointOutside;
private final Point mTopRightPoint;
@@ -293,7 +299,8 @@ public class DragResizeWindowGeometryTests {
private final Point mBottomRightPoint;
private final Point mBottomRightPointOutside;
- TestPoints(@NonNull Size taskSize, int cornerRadius) {
+ TestPoints(@NonNull Context context, @NonNull Size taskSize, int cornerRadius) {
+ mContext = context;
// Point just inside corner square is included.
mTopLeftPoint = new Point(-cornerRadius + 1, -cornerRadius + 1);
// Point just outside corner square is excluded.
@@ -340,17 +347,17 @@ public class DragResizeWindowGeometryTests {
public void validateCtrlTypeForInnerPoints(@NonNull DragResizeWindowGeometry geometry,
boolean isTouchscreen, boolean isEdgeResizePermitted,
boolean expectedWithinGeometry) {
- assertThat(geometry.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(geometry.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
mTopLeftPoint.x, mTopLeftPoint.y)).isEqualTo(
expectedWithinGeometry ? CTRL_TYPE_LEFT | CTRL_TYPE_TOP : CTRL_TYPE_UNDEFINED);
- assertThat(geometry.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(geometry.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
mTopRightPoint.x, mTopRightPoint.y)).isEqualTo(
expectedWithinGeometry ? CTRL_TYPE_RIGHT | CTRL_TYPE_TOP : CTRL_TYPE_UNDEFINED);
- assertThat(geometry.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(geometry.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
mBottomLeftPoint.x, mBottomLeftPoint.y)).isEqualTo(
expectedWithinGeometry ? CTRL_TYPE_LEFT | CTRL_TYPE_BOTTOM
: CTRL_TYPE_UNDEFINED);
- assertThat(geometry.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(geometry.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
mBottomRightPoint.x, mBottomRightPoint.y)).isEqualTo(
expectedWithinGeometry ? CTRL_TYPE_RIGHT | CTRL_TYPE_BOTTOM
: CTRL_TYPE_UNDEFINED);
@@ -363,17 +370,17 @@ public class DragResizeWindowGeometryTests {
public void validateCtrlTypeForOutsidePoints(@NonNull DragResizeWindowGeometry geometry,
boolean isTouchscreen, boolean isEdgeResizePermitted,
boolean expectedWithinGeometry) {
- assertThat(geometry.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(geometry.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
mTopLeftPointOutside.x, mTopLeftPointOutside.y)).isEqualTo(
expectedWithinGeometry ? CTRL_TYPE_LEFT | CTRL_TYPE_TOP : CTRL_TYPE_UNDEFINED);
- assertThat(geometry.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(geometry.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
mTopRightPointOutside.x, mTopRightPointOutside.y)).isEqualTo(
expectedWithinGeometry ? CTRL_TYPE_RIGHT | CTRL_TYPE_TOP : CTRL_TYPE_UNDEFINED);
- assertThat(geometry.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(geometry.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
mBottomLeftPointOutside.x, mBottomLeftPointOutside.y)).isEqualTo(
expectedWithinGeometry ? CTRL_TYPE_LEFT | CTRL_TYPE_BOTTOM
: CTRL_TYPE_UNDEFINED);
- assertThat(geometry.calculateCtrlType(isTouchscreen, isEdgeResizePermitted,
+ assertThat(geometry.calculateCtrlType(mContext, isTouchscreen, isEdgeResizePermitted,
mBottomRightPointOutside.x, mBottomRightPointOutside.y)).isEqualTo(
expectedWithinGeometry ? CTRL_TYPE_RIGHT | CTRL_TYPE_BOTTOM
: CTRL_TYPE_UNDEFINED);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index d8486029a903..073f33fe5245 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -33,7 +33,6 @@ import com.android.systemui.res.R;
import com.android.systemui.shade.TouchLogger;
import com.android.systemui.statusbar.CrossFadeHelper;
-import java.io.PrintWriter;
import java.util.Set;
/**
@@ -117,18 +116,6 @@ public class KeyguardStatusView extends GridLayout {
return TouchLogger.logDispatchTouch(TAG, ev, super.dispatchTouchEvent(ev));
}
- public void dump(PrintWriter pw, String[] args) {
- pw.println("KeyguardStatusView:");
- pw.println(" mDarkAmount: " + mDarkAmount);
- pw.println(" visibility: " + getVisibility());
- if (mClockView != null) {
- mClockView.dump(pw, args);
- }
- if (mKeyguardSlice != null) {
- mKeyguardSlice.dump(pw, args);
- }
- }
-
@Override
public ViewPropertyAnimator animate() {
if (Build.IS_DEBUGGABLE) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
index 603a47e8d26e..63a4af949c8c 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java
@@ -48,9 +48,7 @@ import com.android.app.animation.Interpolators;
import com.android.internal.jank.InteractionJankMonitor;
import com.android.keyguard.KeyguardClockSwitch.ClockSize;
import com.android.keyguard.logging.KeyguardLogger;
-import com.android.systemui.Dumpable;
import com.android.systemui.animation.ViewHierarchyAnimator;
-import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.MigrateClocksToBlueprint;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.plugins.clocks.ClockController;
@@ -70,15 +68,12 @@ import com.android.systemui.util.ViewController;
import kotlin.coroutines.CoroutineContext;
import kotlin.coroutines.EmptyCoroutineContext;
-import java.io.PrintWriter;
-
import javax.inject.Inject;
/**
* Injectable controller for {@link KeyguardStatusView}.
*/
-public class KeyguardStatusViewController extends ViewController<KeyguardStatusView> implements
- Dumpable {
+public class KeyguardStatusViewController extends ViewController<KeyguardStatusView> {
private static final boolean DEBUG = KeyguardConstants.DEBUG;
@VisibleForTesting static final String TAG = "KeyguardStatusViewController";
private static final long STATUS_AREA_HEIGHT_ANIMATION_MILLIS = 133;
@@ -108,7 +103,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
private Boolean mSplitShadeEnabled = false;
private Boolean mStatusViewCentered = true;
- private DumpManager mDumpManager;
private final TransitionListenerAdapter mKeyguardStatusAlignmentTransitionListener =
new TransitionListenerAdapter() {
@@ -176,7 +170,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
KeyguardLogger logger,
InteractionJankMonitor interactionJankMonitor,
KeyguardInteractor keyguardInteractor,
- DumpManager dumpManager,
PowerInteractor powerInteractor) {
super(keyguardStatusView);
mKeyguardSliceViewController = keyguardSliceViewController;
@@ -188,7 +181,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
dozeParameters, screenOffAnimationController, /* animateYPos= */ true,
logger.getBuffer());
mInteractionJankMonitor = interactionJankMonitor;
- mDumpManager = dumpManager;
mKeyguardInteractor = keyguardInteractor;
mPowerInteractor = powerInteractor;
}
@@ -222,7 +214,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
});
}
- mDumpManager.registerDumpable(getInstanceName(), this);
if (MigrateClocksToBlueprint.isEnabled()) {
startCoroutines(EmptyCoroutineContext.INSTANCE);
mView.setVisibility(View.GONE);
@@ -276,13 +267,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
}
/**
- * Called in notificationPanelViewController to avoid leak
- */
- public void onDestroy() {
- mDumpManager.unregisterDumpable(getInstanceName());
- }
-
- /**
* Updates views on doze time tick.
*/
public void dozeTimeTick() {
@@ -604,11 +588,6 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV
return mKeyguardClockSwitchController.getClock();
}
- @Override
- public void dump(@NonNull PrintWriter pw, @NonNull String[] args) {
- mView.dump(pw, args);
- }
-
String getInstanceName() {
return TAG + "#" + hashCode();
}
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/KeyboardTouchpadOobeTutorialCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/KeyboardTouchpadOobeTutorialCoreStartable.kt
index dbfea7688e0d..701d3da1ee66 100644
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/KeyboardTouchpadOobeTutorialCoreStartable.kt
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/KeyboardTouchpadOobeTutorialCoreStartable.kt
@@ -18,7 +18,7 @@ package com.android.systemui.inputdevice.oobe
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.inputdevice.oobe.domain.interactor.OobeTutorialSchedulerInteractor
+import com.android.systemui.inputdevice.oobe.domain.interactor.OobeSchedulerInteractor
import com.android.systemui.shared.Flags.newTouchpadGesturesTutorial
import dagger.Lazy
import javax.inject.Inject
@@ -27,11 +27,10 @@ import javax.inject.Inject
@SysUISingleton
class KeyboardTouchpadOobeTutorialCoreStartable
@Inject
-constructor(private val oobeTutorialSchedulerInteractor: Lazy<OobeTutorialSchedulerInteractor>) :
- CoreStartable {
+constructor(private val oobeSchedulerInteractor: Lazy<OobeSchedulerInteractor>) : CoreStartable {
override fun start() {
if (newTouchpadGesturesTutorial()) {
- oobeTutorialSchedulerInteractor.get().start()
+ oobeSchedulerInteractor.get().start()
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/data/model/OobeSchedulerInfo.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/data/model/OobeSchedulerInfo.kt
new file mode 100644
index 000000000000..e5aedc031ebe
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/data/model/OobeSchedulerInfo.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2024 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.inputdevice.oobe.data.model
+
+data class OobeSchedulerInfo(
+ val keyboard: DeviceSchedulerInfo = DeviceSchedulerInfo(),
+ val touchpad: DeviceSchedulerInfo = DeviceSchedulerInfo()
+)
+
+data class DeviceSchedulerInfo(var isLaunched: Boolean = false, var connectionTime: Long? = null) {
+ val wasEverConnected: Boolean
+ get() = connectionTime != null
+}
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/domain/interactor/OobeSchedulerInteractor.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/domain/interactor/OobeSchedulerInteractor.kt
new file mode 100644
index 000000000000..b014c08d4564
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/domain/interactor/OobeSchedulerInteractor.kt
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2024 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.inputdevice.oobe.domain.interactor
+
+import android.content.Context
+import android.content.Intent
+import com.android.systemui.dagger.SysUISingleton
+import com.android.systemui.dagger.qualifiers.Application
+import com.android.systemui.inputdevice.oobe.data.model.DeviceSchedulerInfo
+import com.android.systemui.inputdevice.oobe.data.model.OobeSchedulerInfo
+import com.android.systemui.keyboard.data.repository.KeyboardRepository
+import com.android.systemui.touchpad.data.repository.TouchpadRepository
+import java.time.Duration
+import java.time.Instant
+import javax.inject.Inject
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.filter
+import kotlinx.coroutines.flow.first
+import kotlinx.coroutines.launch
+
+/**
+ * When the first time a keyboard or touchpad id connected, wait for [LAUNCH_DELAY], then launch the
+ * tutorial as soon as there's a connected device
+ */
+@SysUISingleton
+class OobeSchedulerInteractor
+@Inject
+constructor(
+ @Application private val context: Context,
+ @Application private val applicationScope: CoroutineScope,
+ private val keyboardRepository: KeyboardRepository,
+ private val touchpadRepository: TouchpadRepository
+) {
+ private val info = OobeSchedulerInfo()
+
+ fun start() {
+ if (!info.keyboard.isLaunched) {
+ applicationScope.launch {
+ schedule(keyboardRepository.isAnyKeyboardConnected, info.keyboard)
+ }
+ }
+ if (!info.touchpad.isLaunched) {
+ applicationScope.launch {
+ schedule(touchpadRepository.isAnyTouchpadConnected, info.touchpad)
+ }
+ }
+ }
+
+ private suspend fun schedule(isAnyDeviceConnected: Flow<Boolean>, info: DeviceSchedulerInfo) {
+ if (!info.wasEverConnected) {
+ waitForDeviceConnection(isAnyDeviceConnected)
+ info.connectionTime = Instant.now().toEpochMilli()
+ }
+ delay(remainingTimeMillis(info.connectionTime!!))
+ waitForDeviceConnection(isAnyDeviceConnected)
+ info.isLaunched = true
+ launchOobe()
+ }
+
+ private suspend fun waitForDeviceConnection(isAnyDeviceConnected: Flow<Boolean>): Boolean {
+ return isAnyDeviceConnected.filter { it }.first()
+ }
+
+ private fun launchOobe() {
+ val intent = Intent(TUTORIAL_ACTION)
+ intent.addCategory(Intent.CATEGORY_DEFAULT)
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ context.startActivity(intent)
+ }
+
+ private fun remainingTimeMillis(start: Long): Long {
+ val elapsed = Instant.now().toEpochMilli() - start
+ return LAUNCH_DELAY - elapsed
+ }
+
+ companion object {
+ const val TAG = "OobeSchedulerInteractor"
+ const val TUTORIAL_ACTION = "com.android.systemui.action.TOUCHPAD_TUTORIAL"
+ private val LAUNCH_DELAY = Duration.ofHours(72).toMillis()
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/domain/interactor/OobeTutorialSchedulerInteractor.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/domain/interactor/OobeTutorialSchedulerInteractor.kt
deleted file mode 100644
index 0d69081adfa4..000000000000
--- a/packages/SystemUI/src/com/android/systemui/inputdevice/oobe/domain/interactor/OobeTutorialSchedulerInteractor.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2024 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.inputdevice.oobe.domain.interactor
-
-import android.content.Context
-import android.content.Intent
-import com.android.systemui.dagger.SysUISingleton
-import com.android.systemui.dagger.qualifiers.Application
-import com.android.systemui.keyboard.data.repository.KeyboardRepository
-import com.android.systemui.touchpad.data.repository.TouchpadRepository
-import javax.inject.Inject
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
-
-/** When keyboards or touchpads are connected, schedule a tutorial after given time has elapsed */
-@SysUISingleton
-class OobeTutorialSchedulerInteractor
-@Inject
-constructor(
- @Application private val context: Context,
- @Application private val applicationScope: CoroutineScope,
- keyboardRepository: KeyboardRepository,
- touchpadRepository: TouchpadRepository
-) {
- private val isAnyKeyboardConnected = keyboardRepository.isAnyKeyboardConnected
- private val isAnyTouchpadConnected = touchpadRepository.isAnyTouchpadConnected
-
- fun start() {
- applicationScope.launch { isAnyKeyboardConnected.collect { startOobe() } }
- applicationScope.launch { isAnyTouchpadConnected.collect { startOobe() } }
- }
-
- private fun startOobe() {
- val intent = Intent(TUTORIAL_ACTION)
- intent.addCategory(Intent.CATEGORY_DEFAULT)
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- context.startActivity(intent)
- }
-
- companion object {
- const val TAG = "OobeSchedulerInteractor"
- const val TUTORIAL_ACTION = "com.android.systemui.action.TOUCHPAD_TUTORIAL"
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java
index 1dbdec99a907..8e46fe4c98b7 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerImpl.java
@@ -406,9 +406,8 @@ public class NavigationBarControllerImpl implements
@Override
public void onViewAttachedToWindow(View v) {
if (result != null) {
- navBar.setImeWindowStatus(display.getDisplayId(), result.mImeToken,
- result.mImeWindowVis, result.mImeBackDisposition,
- result.mShowImeSwitcher);
+ navBar.setImeWindowStatus(display.getDisplayId(), result.mImeWindowVis,
+ result.mImeBackDisposition, result.mShowImeSwitcher);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java
index d022c1c2e948..15b1e4de878a 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java
@@ -42,7 +42,6 @@ import android.content.Context;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.inputmethodservice.InputMethodService;
-import android.os.IBinder;
import android.os.RemoteException;
import android.os.Trace;
import android.util.Log;
@@ -425,7 +424,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks,
}
@Override
- public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
+ public void setImeWindowStatus(int displayId, int vis, int backDisposition,
boolean showImeSwitcher) {
boolean imeShown = mNavBarHelper.isImeShown(vis);
if (!imeShown) {
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java
index afdfa5932162..7b248eb876a8 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java
@@ -71,7 +71,6 @@ import android.graphics.Region;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
-import android.os.IBinder;
import android.os.RemoteException;
import android.os.Trace;
import android.provider.DeviceConfig;
@@ -1095,7 +1094,7 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
// ----- CommandQueue Callbacks -----
@Override
- public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
+ public void setImeWindowStatus(int displayId, int vis, int backDisposition,
boolean showImeSwitcher) {
if (displayId != mDisplayId) {
return;
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt
index 3fe3162cf17d..29450a20b1d3 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt
@@ -26,7 +26,7 @@ import com.android.systemui.screenshot.data.repository.ProfileTypeRepository
import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult
import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult.NotMatched
import com.android.systemui.screenshot.policy.CaptureType.IsolatedTask
-import com.android.wm.shell.shared.desktopmode.DesktopModeFlags
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import javax.inject.Inject
import kotlinx.coroutines.flow.first
@@ -48,7 +48,7 @@ constructor(
return NotMatched(policy = NAME, reason = SHADE_EXPANDED)
}
- if (DesktopModeFlags.DESKTOP_WINDOWING_MODE.isEnabled(context)) {
+ if (DesktopModeStatus.canEnterDesktopMode(context)) {
content.rootTasks.firstOrNull()?.also {
if (it.windowingMode == WINDOWING_MODE_FREEFORM) {
return NotMatched(policy = NAME, reason = DESKTOP_MODE_ENABLED)
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index 91bfae31559a..257390fae048 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -1305,10 +1305,6 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
/** Updates the StatusBarViewController and updates any that depend on it. */
public void updateStatusViewController() {
// Re-associate the KeyguardStatusViewController
- if (mKeyguardStatusViewController != null) {
- mKeyguardStatusViewController.onDestroy();
- }
-
if (MigrateClocksToBlueprint.isEnabled()) {
// Need a shared controller until mKeyguardStatusViewController can be removed from
// here, due to important state being set in that controller. Rebind in order to pick
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index b9d24abc4037..cea97d602236 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -257,12 +257,11 @@ public class CommandQueue extends IStatusBar.Stub implements
* Called to notify IME window status changes.
*
* @param displayId The id of the display to notify.
- * @param token IME token.
* @param vis IME visibility.
* @param backDisposition Disposition mode of back button. It should be one of below flags:
* @param showImeSwitcher {@code true} to show IME switch button.
*/
- default void setImeWindowStatus(int displayId, IBinder token, int vis,
+ default void setImeWindowStatus(int displayId, int vis,
@BackDispositionMode int backDisposition, boolean showImeSwitcher) { }
default void showRecentApps(boolean triggeredFromAltTab) { }
default void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { }
@@ -745,7 +744,7 @@ public class CommandQueue extends IStatusBar.Stub implements
}
@Override
- public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
+ public void setImeWindowStatus(int displayId, int vis, int backDisposition,
boolean showImeSwitcher) {
synchronized (mLock) {
mHandler.removeMessages(MSG_SHOW_IME_BUTTON);
@@ -754,7 +753,6 @@ public class CommandQueue extends IStatusBar.Stub implements
args.argi2 = vis;
args.argi3 = backDisposition;
args.argi4 = showImeSwitcher ? 1 : 0;
- args.arg1 = token;
Message m = mHandler.obtainMessage(MSG_SHOW_IME_BUTTON, args);
m.sendToTarget();
}
@@ -1208,7 +1206,7 @@ public class CommandQueue extends IStatusBar.Stub implements
}
}
- private void handleShowImeButton(int displayId, IBinder token, int vis, int backDisposition,
+ private void handleShowImeButton(int displayId, int vis, int backDisposition,
boolean showImeSwitcher) {
if (displayId == INVALID_DISPLAY) return;
@@ -1224,17 +1222,15 @@ public class CommandQueue extends IStatusBar.Stub implements
sendImeInvisibleStatusForPrevNavBar();
}
for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).setImeWindowStatus(displayId, token, vis, backDisposition,
- showImeSwitcher);
+ mCallbacks.get(i).setImeWindowStatus(displayId, vis, backDisposition, showImeSwitcher);
}
mLastUpdatedImeDisplayId = displayId;
}
private void sendImeInvisibleStatusForPrevNavBar() {
for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).setImeWindowStatus(mLastUpdatedImeDisplayId,
- null /* token */, IME_INVISIBLE, BACK_DISPOSITION_DEFAULT,
- false /* showImeSwitcher */);
+ mCallbacks.get(i).setImeWindowStatus(mLastUpdatedImeDisplayId, IME_INVISIBLE,
+ BACK_DISPOSITION_DEFAULT, false /* showImeSwitcher */);
}
}
@@ -1550,7 +1546,7 @@ public class CommandQueue extends IStatusBar.Stub implements
break;
case MSG_SHOW_IME_BUTTON:
args = (SomeArgs) msg.obj;
- handleShowImeButton(args.argi1 /* displayId */, (IBinder) args.arg1 /* token */,
+ handleShowImeButton(args.argi1 /* displayId */,
args.argi2 /* vis */, args.argi3 /* backDisposition */,
args.argi4 != 0 /* showImeSwitcher */);
break;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
index b6de78e70994..37fdaebc7d6a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java
@@ -913,8 +913,8 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
result.mRequestedVisibleTypes, result.mPackageName, result.mLetterboxDetails);
// StatusBarManagerService has a back up of IME token and it's restored here.
- mCommandQueueCallbacks.setImeWindowStatus(mDisplayId, result.mImeToken,
- result.mImeWindowVis, result.mImeBackDisposition, result.mShowImeSwitcher);
+ mCommandQueueCallbacks.setImeWindowStatus(mDisplayId, result.mImeWindowVis,
+ result.mImeBackDisposition, result.mShowImeSwitcher);
// Set up the initial icon state
int numIcons = result.mIcons.size();
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/TouchpadModule.kt b/packages/SystemUI/src/com/android/systemui/touchpad/TouchpadModule.kt
index c86ac2f99a13..2f74d292f030 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/TouchpadModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/TouchpadModule.kt
@@ -16,6 +16,7 @@
package com.android.systemui.touchpad
+import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.touchpad.data.repository.TouchpadRepository
import com.android.systemui.touchpad.data.repository.TouchpadRepositoryImpl
import dagger.Binds
@@ -25,5 +26,6 @@ import dagger.Module
abstract class TouchpadModule {
@Binds
+ @SysUISingleton
abstract fun bindTouchpadRepository(repository: TouchpadRepositoryImpl): TouchpadRepository
}
diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt
index 51dfef0b6b6a..19169bbe94ad 100644
--- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt
+++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt
@@ -20,10 +20,18 @@ import android.graphics.ColorFilter
import android.graphics.PorterDuff
import android.graphics.PorterDuffColorFilter
import androidx.activity.compose.BackHandler
+import androidx.annotation.RawRes
import androidx.annotation.StringRes
+import androidx.compose.animation.AnimatedContent
+import androidx.compose.animation.EnterTransition
+import androidx.compose.animation.ExitTransition
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.LinearEasing
+import androidx.compose.animation.core.snap
import androidx.compose.animation.core.tween
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.togetherWith
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
@@ -50,7 +58,6 @@ import androidx.compose.ui.input.pointer.pointerInteropFilter
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
-import com.airbnb.lottie.LottieComposition
import com.airbnb.lottie.LottieProperty
import com.airbnb.lottie.compose.LottieAnimation
import com.airbnb.lottie.compose.LottieCompositionSpec
@@ -66,6 +73,7 @@ import com.android.systemui.res.R
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.FINISHED
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.IN_PROGRESS
+import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NOT_STARTED
import com.android.systemui.touchpad.tutorial.ui.gesture.TouchpadGesture.BACK
import com.android.systemui.touchpad.tutorial.ui.gesture.TouchpadGestureHandler
@@ -83,7 +91,7 @@ fun BackGestureTutorialScreen(
) {
val screenColors = rememberScreenColors()
BackHandler(onBack = onBack)
- var gestureState by remember { mutableStateOf(GestureState.NOT_STARTED) }
+ var gestureState by remember { mutableStateOf(NOT_STARTED) }
val swipeDistanceThresholdPx =
LocalContext.current.resources.getDimensionPixelSize(
com.android.internal.R.dimen.system_gestures_distance_threshold
@@ -226,31 +234,74 @@ fun TutorialAnimation(
animationProperties: LottieDynamicProperties,
modifier: Modifier = Modifier
) {
- Column(modifier = modifier.fillMaxWidth()) {
- val resId =
- if (gestureState == FINISHED) R.raw.trackpad_back_success else R.raw.trackpad_back_edu
- val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(resId))
- val progress = progressForGestureState(composition, gestureState)
- LottieAnimation(
- composition = composition,
- progress = progress,
- dynamicProperties = animationProperties
- )
+ Box(modifier = modifier.fillMaxWidth()) {
+ AnimatedContent(
+ targetState = gestureState,
+ transitionSpec = {
+ if (initialState == NOT_STARTED && targetState == IN_PROGRESS) {
+ val transitionDurationMillis = 150
+ fadeIn(
+ animationSpec = tween(transitionDurationMillis, easing = LinearEasing)
+ ) togetherWith
+ fadeOut(animationSpec = snap(delayMillis = transitionDurationMillis))
+ } else {
+ // empty transition works because all remaining transitions are from IN_PROGRESS
+ // state which shares initial animation frame with both FINISHED and NOT_STARTED
+ EnterTransition.None togetherWith ExitTransition.None
+ }
+ }
+ ) { gestureState ->
+ @RawRes val successAnimationId = R.raw.trackpad_back_success
+ @RawRes val educationAnimationId = R.raw.trackpad_back_edu
+ when (gestureState) {
+ NOT_STARTED -> EducationAnimation(educationAnimationId, animationProperties)
+ IN_PROGRESS -> FrozenSuccessAnimation(successAnimationId, animationProperties)
+ FINISHED -> SuccessAnimation(successAnimationId, animationProperties)
+ }
+ }
}
}
@Composable
-private fun progressForGestureState(
- composition: LottieComposition?,
- gestureState: GestureState
-): () -> Float {
- if (gestureState == IN_PROGRESS) {
- return { 0f } // when gesture is in progress, animation should freeze on 1st frame
- } else {
- val iterations = if (gestureState == FINISHED) 1 else LottieConstants.IterateForever
- val animationState by animateLottieCompositionAsState(composition, iterations = iterations)
- return { animationState }
- }
+private fun FrozenSuccessAnimation(
+ @RawRes successAnimationId: Int,
+ animationProperties: LottieDynamicProperties
+) {
+ val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(successAnimationId))
+ LottieAnimation(
+ composition = composition,
+ progress = { 0f }, // animation should freeze on 1st frame
+ dynamicProperties = animationProperties,
+ )
+}
+
+@Composable
+private fun EducationAnimation(
+ @RawRes educationAnimationId: Int,
+ animationProperties: LottieDynamicProperties
+) {
+ val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(educationAnimationId))
+ val progress by
+ animateLottieCompositionAsState(composition, iterations = LottieConstants.IterateForever)
+ LottieAnimation(
+ composition = composition,
+ progress = { progress },
+ dynamicProperties = animationProperties,
+ )
+}
+
+@Composable
+private fun SuccessAnimation(
+ @RawRes successAnimationId: Int,
+ animationProperties: LottieDynamicProperties
+) {
+ val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(successAnimationId))
+ val progress by animateLottieCompositionAsState(composition, iterations = 1)
+ LottieAnimation(
+ composition = composition,
+ progress = { progress },
+ dynamicProperties = animationProperties,
+ )
}
@Composable
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dagger/AudioModule.kt b/packages/SystemUI/src/com/android/systemui/volume/dagger/AudioModule.kt
index efaca7a8239f..5d8b6f144d97 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/dagger/AudioModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/volume/dagger/AudioModule.kt
@@ -19,8 +19,8 @@ package com.android.systemui.volume.dagger
import android.content.ContentResolver
import android.content.Context
import android.media.AudioManager
-import com.android.settingslib.bluetooth.BluetoothUtils
import com.android.settingslib.bluetooth.LocalBluetoothManager
+import com.android.settingslib.flags.Flags
import com.android.settingslib.notification.domain.interactor.NotificationsSoundPolicyInteractor
import com.android.settingslib.volume.data.repository.AudioRepository
import com.android.settingslib.volume.data.repository.AudioRepositoryImpl
@@ -80,7 +80,7 @@ interface AudioModule {
@Application coroutineScope: CoroutineScope,
@Background coroutineContext: CoroutineContext,
): AudioSharingRepository =
- if (BluetoothUtils.isAudioSharingEnabled() && localBluetoothManager != null) {
+ if (Flags.enableLeAudioSharing() && localBluetoothManager != null) {
AudioSharingRepositoryImpl(
contentResolver,
localBluetoothManager,
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
index 14cd202b7ce6..9ca0591f9c5b 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java
@@ -34,7 +34,6 @@ import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.inputmethodservice.InputMethodService;
-import android.os.IBinder;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
@@ -379,8 +378,8 @@ public final class WMShell implements
}
@Override
- public void setImeWindowStatus(int displayId, IBinder token, int vis,
- int backDisposition, boolean showImeSwitcher) {
+ public void setImeWindowStatus(int displayId, int vis, int backDisposition,
+ boolean showImeSwitcher) {
if (displayId == mDisplayTracker.getDefaultDisplayId()
&& (vis & InputMethodService.IME_VISIBLE) != 0) {
oneHanded.stopOneHanded(
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java
index 07504c732bc2..2b4fc5bd5cc5 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerBaseTest.java
@@ -26,7 +26,6 @@ import android.widget.FrameLayout;
import com.android.keyguard.logging.KeyguardLogger;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory;
import com.android.systemui.kosmos.KosmosJavaAdapter;
@@ -59,7 +58,6 @@ public class KeyguardStatusViewControllerBaseTest extends SysuiTestCase {
@Mock protected KeyguardLogger mKeyguardLogger;
@Mock protected KeyguardStatusViewController mControllerMock;
@Mock protected ViewTreeObserver mViewTreeObserver;
- @Mock protected DumpManager mDumpManager;
protected FakeKeyguardRepository mFakeKeyguardRepository;
protected FakePowerRepository mFakePowerRepository;
@@ -90,7 +88,6 @@ public class KeyguardStatusViewControllerBaseTest extends SysuiTestCase {
mKeyguardLogger,
mKosmos.getInteractionJankMonitor(),
deps.getKeyguardInteractor(),
- mDumpManager,
PowerInteractorFactory.create(
mFakePowerRepository
).getPowerInteractor()) {
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
index 0696a4b880d5..8e441a3db242 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewControllerTest.java
@@ -140,14 +140,6 @@ public class KeyguardStatusViewControllerTest extends KeyguardStatusViewControll
}
@Test
- public void correctlyDump() {
- mController.onInit();
- verify(mDumpManager).registerDumpable(eq(mController.getInstanceName()), eq(mController));
- mController.onDestroy();
- verify(mDumpManager, times(1)).unregisterDumpable(eq(mController.getInstanceName()));
- }
-
- @Test
public void onInit_addsOnLayoutChangeListenerToClockSwitch() {
when(mKeyguardStatusView.findViewById(R.id.status_view_media_container)).thenReturn(
mMediaHostContainer);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/views/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/views/NavigationBarTest.java
index 45d77f6d76cd..a8cbbd4178bd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/views/NavigationBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/views/NavigationBarTest.java
@@ -498,7 +498,7 @@ public class NavigationBarTest extends SysuiTestCase {
defaultNavBar.init();
externalNavBar.init();
- defaultNavBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
+ defaultNavBar.setImeWindowStatus(DEFAULT_DISPLAY, IME_VISIBLE,
BACK_DISPOSITION_DEFAULT, true);
// Verify IME window state will be updated in default NavBar & external NavBar state reset.
@@ -510,10 +510,10 @@ public class NavigationBarTest extends SysuiTestCase {
assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SWITCHER_SHOWN)
!= 0);
- externalNavBar.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null, IME_VISIBLE,
+ externalNavBar.setImeWindowStatus(EXTERNAL_DISPLAY_ID, IME_VISIBLE,
BACK_DISPOSITION_DEFAULT, true);
- defaultNavBar.setImeWindowStatus(
- DEFAULT_DISPLAY, null, IME_INVISIBLE, BACK_DISPOSITION_DEFAULT, false);
+ defaultNavBar.setImeWindowStatus(DEFAULT_DISPLAY, IME_INVISIBLE,
+ BACK_DISPOSITION_DEFAULT, false);
// Verify IME window state will be updated in external NavBar & default NavBar state reset.
assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN
| NAVIGATION_HINT_IME_SWITCHER_SHOWN,
@@ -535,7 +535,7 @@ public class NavigationBarTest extends SysuiTestCase {
doReturn(windowInsets).when(mockShadeWindowView).getRootWindowInsets();
// Verify navbar altered back icon when an app is showing IME
- mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
+ mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, IME_VISIBLE,
BACK_DISPOSITION_DEFAULT, true);
assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0);
assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
@@ -545,7 +545,7 @@ public class NavigationBarTest extends SysuiTestCase {
// Verify navbar didn't alter and showing back icon when the keyguard is showing without
// requesting IME insets visible.
doReturn(true).when(mKeyguardStateController).isShowing();
- mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
+ mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, IME_VISIBLE,
BACK_DISPOSITION_DEFAULT, true);
assertFalse((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0);
assertFalse((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
@@ -556,7 +556,7 @@ public class NavigationBarTest extends SysuiTestCase {
// requesting IME insets visible.
windowInsets = new WindowInsets.Builder().setVisible(ime(), true).build();
doReturn(windowInsets).when(mockShadeWindowView).getRootWindowInsets();
- mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE,
+ mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, IME_VISIBLE,
BACK_DISPOSITION_DEFAULT, true);
assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0);
assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
index a5fbfb539354..191a048f5f3f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
@@ -18,11 +18,13 @@ package com.android.systemui.screenshot.policy
import android.content.ComponentName
import android.content.Context
+import android.content.res.Resources
import android.os.UserHandle
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.internal.R
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.screenshot.data.model.DisplayContentModel
import com.android.systemui.screenshot.data.model.DisplayContentScenarios.ActivityNames.FILES
@@ -47,6 +49,7 @@ import com.android.systemui.screenshot.policy.WorkProfilePolicy.Companion.DESKTO
import com.android.systemui.screenshot.policy.WorkProfilePolicy.Companion.SHADE_EXPANDED
import com.android.systemui.screenshot.policy.WorkProfilePolicy.Companion.WORK_TASK_IS_TOP
import com.android.systemui.screenshot.policy.WorkProfilePolicy.Companion.WORK_TASK_NOT_TOP
+import com.android.systemui.util.mockito.whenever
import com.android.window.flags.Flags
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
@@ -55,6 +58,7 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
+import org.mockito.MockitoAnnotations
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
@@ -66,12 +70,19 @@ class WorkProfilePolicyTest {
@JvmField @Rule(order = 2) val mockitoRule: MockitoRule = MockitoJUnit.rule()
@Mock lateinit var mContext: Context
+ @Mock lateinit var mResources: Resources
private val kosmos = Kosmos()
private lateinit var policy: WorkProfilePolicy
@Before
fun setUp() {
+ MockitoAnnotations.initMocks(this)
+
+ // Set desktop mode supported
+ whenever(mContext.resources).thenReturn(mResources)
+ whenever(mResources.getBoolean(R.bool.config_isDesktopModeSupported)).thenReturn(true)
+
policy = WorkProfilePolicy(kosmos.profileTypeRepository, mContext)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
index 56fb43d056a6..2803035f1b82 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
@@ -479,7 +479,6 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
mKeyguardLogger,
mKosmos.getInteractionJankMonitor(),
mKeyguardInteractor,
- mDumpManager,
mPowerInteractor));
when(mAuthController.isUdfpsEnrolled(anyInt())).thenReturn(false);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index 9df46e5047d2..86d21e8081e5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -195,10 +195,9 @@ public class CommandQueueTest extends SysuiTestCase {
@Test
public void testShowImeButton() {
- mCommandQueue.setImeWindowStatus(DEFAULT_DISPLAY, null, 1, 2, true);
+ mCommandQueue.setImeWindowStatus(DEFAULT_DISPLAY, 1, 2, true);
waitForIdleSync();
- verify(mCallbacks).setImeWindowStatus(
- eq(DEFAULT_DISPLAY), eq(null), eq(1), eq(2), eq(true));
+ verify(mCallbacks).setImeWindowStatus(eq(DEFAULT_DISPLAY), eq(1), eq(2), eq(true));
}
@Test
@@ -206,12 +205,11 @@ public class CommandQueueTest extends SysuiTestCase {
// First show in default display to update the "last updated ime display"
testShowImeButton();
- mCommandQueue.setImeWindowStatus(SECONDARY_DISPLAY, null, 1, 2, true);
+ mCommandQueue.setImeWindowStatus(SECONDARY_DISPLAY, 1, 2, true);
waitForIdleSync();
- verify(mCallbacks).setImeWindowStatus(eq(DEFAULT_DISPLAY), eq(null), eq(IME_INVISIBLE),
+ verify(mCallbacks).setImeWindowStatus(eq(DEFAULT_DISPLAY), eq(IME_INVISIBLE),
eq(BACK_DISPOSITION_DEFAULT), eq(false));
- verify(mCallbacks).setImeWindowStatus(
- eq(SECONDARY_DISPLAY), eq(null), eq(1), eq(2), eq(true));
+ verify(mCallbacks).setImeWindowStatus(eq(SECONDARY_DISPLAY), eq(1), eq(2), eq(true));
}
@Test
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 480c370aff86..8bb33ddb84ae 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -17,6 +17,7 @@
package com.android.server.display;
import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF;
import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT;
import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE;
@@ -1393,8 +1394,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
if (mScreenOffBrightnessSensorController != null) {
mScreenOffBrightnessSensorController
.setLightSensorEnabled(displayBrightnessState.getShouldUseAutoBrightness()
- && mIsEnabled && (state == Display.STATE_OFF
- || (state == Display.STATE_DOZE && !allowAutoBrightnessWhileDozing))
+ && mIsEnabled && (mPowerRequest.policy == POLICY_OFF
+ || (mPowerRequest.policy == POLICY_DOZE && !allowAutoBrightnessWhileDozing))
&& mLeadDisplayId == Layout.NO_LEAD_DISPLAY);
}
}
diff --git a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
index c632e77fe685..e157b0560365 100644
--- a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
+++ b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java
@@ -359,11 +359,11 @@ public final class DisplayBrightnessController {
public void setUpAutoBrightness(AutomaticBrightnessController automaticBrightnessController,
SensorManager sensorManager,
DisplayDeviceConfig displayDeviceConfig, Handler handler,
- BrightnessMappingStrategy brightnessMappingStrategy, boolean isEnabled,
+ BrightnessMappingStrategy brightnessMappingStrategy, boolean isDisplayEnabled,
int leadDisplayId) {
setAutomaticBrightnessController(automaticBrightnessController);
setUpAutoBrightnessFallbackStrategy(sensorManager, displayDeviceConfig, handler,
- brightnessMappingStrategy, isEnabled, leadDisplayId);
+ brightnessMappingStrategy, isDisplayEnabled, leadDisplayId);
}
/**
@@ -534,14 +534,14 @@ public final class DisplayBrightnessController {
private void setUpAutoBrightnessFallbackStrategy(SensorManager sensorManager,
DisplayDeviceConfig displayDeviceConfig, Handler handler,
- BrightnessMappingStrategy brightnessMappingStrategy, boolean isEnabled,
+ BrightnessMappingStrategy brightnessMappingStrategy, boolean isDisplayEnabled,
int leadDisplayId) {
AutoBrightnessFallbackStrategy autoBrightnessFallbackStrategy =
getAutoBrightnessFallbackStrategy();
if (autoBrightnessFallbackStrategy != null) {
autoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(
sensorManager, displayDeviceConfig, handler, brightnessMappingStrategy,
- isEnabled, leadDisplayId);
+ isDisplayEnabled, leadDisplayId);
}
}
diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategy.java
index d8b95ec3b5c9..1db9bbe27ecc 100644
--- a/services/core/java/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategy.java
+++ b/services/core/java/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategy.java
@@ -16,6 +16,9 @@
package com.android.server.display.brightness.strategy;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.hardware.Sensor;
@@ -23,7 +26,6 @@ import android.hardware.SensorManager;
import android.os.Handler;
import android.os.SystemClock;
import android.util.IndentingPrintWriter;
-import android.view.Display;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.BrightnessMappingStrategy;
@@ -53,7 +55,7 @@ public final class AutoBrightnessFallbackStrategy implements DisplayBrightnessSt
Sensor mScreenOffBrightnessSensor;
// Indicates if the associated LogicalDisplay is enabled or not.
- private boolean mIsEnabled;
+ private boolean mIsDisplayEnabled;
// Represents if the associated display is a lead display or not. If not, the variable
// represents the lead display ID
@@ -97,7 +99,7 @@ public final class AutoBrightnessFallbackStrategy implements DisplayBrightnessSt
public void dump(PrintWriter writer) {
writer.println("AutoBrightnessFallbackStrategy:");
writer.println(" mLeadDisplayId=" + mLeadDisplayId);
- writer.println(" mIsEnabled=" + mIsEnabled);
+ writer.println(" mIsDisplayEnabled=" + mIsDisplayEnabled);
if (mScreenOffBrightnessSensorController != null) {
IndentingPrintWriter ipw = new IndentingPrintWriter(writer, " ");
mScreenOffBrightnessSensorController.dump(ipw);
@@ -108,11 +110,10 @@ public final class AutoBrightnessFallbackStrategy implements DisplayBrightnessSt
public void strategySelectionPostProcessor(
StrategySelectionNotifyRequest strategySelectionNotifyRequest) {
if (mScreenOffBrightnessSensorController != null) {
- int targetDisplayState = strategySelectionNotifyRequest.getTargetDisplayState();
+ int policy = strategySelectionNotifyRequest.getDisplayPowerRequest().policy;
mScreenOffBrightnessSensorController.setLightSensorEnabled(
- strategySelectionNotifyRequest.isAutoBrightnessEnabled() && mIsEnabled
- && (targetDisplayState == Display.STATE_OFF
- || (targetDisplayState == Display.STATE_DOZE
+ strategySelectionNotifyRequest.isAutoBrightnessEnabled() && mIsDisplayEnabled
+ && (policy == POLICY_OFF || (policy == POLICY_DOZE
&& !strategySelectionNotifyRequest
.isAllowAutoBrightnessWhileDozingConfig()))
&& mLeadDisplayId == Layout.NO_LEAD_DISPLAY);
@@ -132,9 +133,9 @@ public final class AutoBrightnessFallbackStrategy implements DisplayBrightnessSt
*/
public void setupAutoBrightnessFallbackSensor(SensorManager sensorManager,
DisplayDeviceConfig displayDeviceConfig, Handler handler,
- BrightnessMappingStrategy brightnessMappingStrategy, boolean isEnabled,
+ BrightnessMappingStrategy brightnessMappingStrategy, boolean isDisplayEnabled,
int leadDisplayId) {
- mIsEnabled = isEnabled;
+ mIsDisplayEnabled = isDisplayEnabled;
mLeadDisplayId = leadDisplayId;
if (mScreenOffBrightnessSensorController != null) {
mScreenOffBrightnessSensorController.stop();
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 084e11824fa8..b6b6a9be35b2 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -2779,7 +2779,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
}
final IBinder targetWindow = mImeTargetWindowMap.get(startInputToken);
if (targetWindow != null) {
- mWindowManagerInternal.updateInputMethodTargetWindow(token, targetWindow);
+ mWindowManagerInternal.updateInputMethodTargetWindow(targetWindow);
}
mVisibilityStateComputer.setLastImeTargetWindow(targetWindow);
}
@@ -2849,8 +2849,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
}
final boolean needsToShowImeSwitcher = shouldShowImeSwitcherLocked(vis, userId);
if (mStatusBarManagerInternal != null) {
- mStatusBarManagerInternal.setImeWindowStatus(curTokenDisplayId,
- curToken, vis, backDisposition, needsToShowImeSwitcher);
+ mStatusBarManagerInternal.setImeWindowStatus(curTokenDisplayId, vis,
+ backDisposition, needsToShowImeSwitcher);
}
} finally {
Binder.restoreCallingIdentity(ident);
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodMenuControllerNew.java b/services/core/java/com/android/server/inputmethod/InputMethodMenuControllerNew.java
index 045414bde82e..35fae188a1dd 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodMenuControllerNew.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodMenuControllerNew.java
@@ -140,6 +140,8 @@ final class InputMethodMenuControllerNew {
// Indicate that the list can be scrolled.
recyclerView.setScrollIndicators(
hasLanguageSettingsButton ? View.SCROLL_INDICATOR_BOTTOM : 0);
+ // Request focus to enable rotary scrolling on watches.
+ recyclerView.requestFocus();
builder.setOnCancelListener(dialog -> hide(displayId, userId));
mMenuItems = items;
diff --git a/services/core/java/com/android/server/policy/ModifierShortcutManager.java b/services/core/java/com/android/server/policy/ModifierShortcutManager.java
index 40b2ff9cc1a4..cefecbc99bd7 100644
--- a/services/core/java/com/android/server/policy/ModifierShortcutManager.java
+++ b/services/core/java/com/android/server/policy/ModifierShortcutManager.java
@@ -34,6 +34,7 @@ import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
import android.text.TextUtils;
+import android.util.IndentingPrintWriter;
import android.util.Log;
import android.util.LongSparseArray;
import android.util.Slog;
@@ -55,6 +56,7 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -705,4 +707,61 @@ public class ModifierShortcutManager {
}
return context.getString(resid);
};
+
+ void dump(String prefix, PrintWriter pw) {
+ IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ", prefix);
+ ipw.println("ModifierShortcutManager shortcuts:");
+
+ ipw.increaseIndent();
+ ipw.println("Roles");
+ ipw.increaseIndent();
+ for (int i = 0; i < mRoleShortcuts.size(); i++) {
+ String role = mRoleShortcuts.valueAt(i);
+ char shortcutChar = (char) mRoleShortcuts.keyAt(i);
+ Intent intent = getRoleLaunchIntent(role);
+ ipw.println(shortcutChar + " " + role + " " + intent);
+ }
+
+ for (int i = 0; i < mShiftRoleShortcuts.size(); i++) {
+ String role = mShiftRoleShortcuts.valueAt(i);
+ char shortcutChar = (char) mShiftRoleShortcuts.keyAt(i);
+ Intent intent = getRoleLaunchIntent(role);
+ ipw.println("SHIFT+" + shortcutChar + " " + role + " " + intent);
+ }
+
+ ipw.decreaseIndent();
+ ipw.println("Selectors");
+ ipw.increaseIndent();
+ for (int i = 0; i < mIntentShortcuts.size(); i++) {
+ char shortcutChar = (char) mIntentShortcuts.keyAt(i);
+ Intent intent = mIntentShortcuts.valueAt(i);
+ ipw.println(shortcutChar + " " + intent);
+ }
+
+ for (int i = 0; i < mShiftShortcuts.size(); i++) {
+ char shortcutChar = (char) mShiftShortcuts.keyAt(i);
+ Intent intent = mShiftShortcuts.valueAt(i);
+ ipw.println("SHIFT+" + shortcutChar + " " + intent);
+
+ }
+
+ if (modifierShortcutManagerMultiuser()) {
+ ipw.decreaseIndent();
+ ipw.println("ComponentNames");
+ ipw.increaseIndent();
+ for (int i = 0; i < mComponentShortcuts.size(); i++) {
+ char shortcutChar = (char) mComponentShortcuts.keyAt(i);
+ ComponentName component = mComponentShortcuts.valueAt(i);
+ Intent intent = resolveComponentNameIntent(component);
+ ipw.println(shortcutChar + " " + component + " " + intent);
+ }
+
+ for (int i = 0; i < mShiftComponentShortcuts.size(); i++) {
+ char shortcutChar = (char) mShiftComponentShortcuts.keyAt(i);
+ ComponentName component = mShiftComponentShortcuts.valueAt(i);
+ Intent intent = resolveComponentNameIntent(component);
+ ipw.println("SHIFT+" + shortcutChar + " " + component + " " + intent);
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index d0706d22a773..c95be17b0430 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -76,6 +76,7 @@ import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED;
import static android.view.contentprotection.flags.Flags.createAccessibilityOverlayAppOpEnabled;
import static com.android.hardware.input.Flags.emojiAndScreenshotKeycodesAvailable;
+import static com.android.hardware.input.Flags.modifierShortcutDump;
import static com.android.server.flags.Flags.modifierShortcutManagerMultiuser;
import static com.android.server.flags.Flags.newBugreportKeyboardShortcut;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.SCREENSHOT_KEYCHORD_DELAY;
@@ -6663,6 +6664,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pw.print(prefix); pw.println("Looper state:");
mHandler.getLooper().dump(new PrintWriterPrinter(pw), prefix + " ");
+ if (modifierShortcutDump()) {
+ mModifierShortcutManager.dump(prefix, pw);
+ }
}
private static String endcallBehaviorToString(int behavior) {
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index ecb0c30b13e4..699c9b567498 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -35,6 +35,8 @@ import static com.android.internal.util.LatencyTracker.ACTION_TURN_ON_SCREEN;
import static com.android.server.deviceidle.Flags.disableWakelocksInLightIdle;
import static com.android.server.display.DisplayDeviceConfig.INVALID_BRIGHTNESS_IN_CONFIG;
import static com.android.server.display.brightness.BrightnessUtils.isValidBrightnessValue;
+import static com.android.server.power.ScreenTimeoutOverridePolicy.RELEASE_REASON_UNKNOWN;
+import static com.android.server.power.ScreenTimeoutOverridePolicy.RELEASE_REASON_WAKE_LOCK_DEATH;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -1825,7 +1827,7 @@ public final class PowerManagerService extends SystemService
return;
}
- removeWakeLockLocked(wakeLock, index);
+ removeWakeLockDeathLocked(wakeLock, index);
}
}
@@ -1857,6 +1859,12 @@ public final class PowerManagerService extends SystemService
}
@GuardedBy("mLock")
+ private void removeWakeLockDeathLocked(WakeLock wakeLock, int index) {
+ removeWakeLockNoUpdateLocked(wakeLock, index, RELEASE_REASON_WAKE_LOCK_DEATH);
+ updatePowerStateLocked();
+ }
+
+ @GuardedBy("mLock")
private void applyWakeLockFlagsOnReleaseLocked(WakeLock wakeLock) {
if ((wakeLock.mFlags & PowerManager.ON_AFTER_RELEASE) != 0
&& isScreenLock(wakeLock)) {
@@ -2011,7 +2019,7 @@ public final class PowerManagerService extends SystemService
@GuardedBy("mLock")
private void notifyWakeLockReleasedLocked(WakeLock wakeLock) {
- notifyWakeLockReleasedLocked(wakeLock, ScreenTimeoutOverridePolicy.RELEASE_REASON_UNKNOWN);
+ notifyWakeLockReleasedLocked(wakeLock, RELEASE_REASON_UNKNOWN);
}
@GuardedBy("mLock")
diff --git a/services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.java b/services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.java
index dcb3c398db68..8e08ce937ac0 100644
--- a/services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.java
+++ b/services/core/java/com/android/server/power/ScreenTimeoutOverridePolicy.java
@@ -83,6 +83,11 @@ final class ScreenTimeoutOverridePolicy {
public static final int RELEASE_REASON_USER_ACTIVITY_ACCESSIBILITY = 7;
/**
+ * Release reason code: Release because wakelock dies.
+ */
+ public static final int RELEASE_REASON_WAKE_LOCK_DEATH = 8;
+
+ /**
* @hide
*/
@IntDef(prefix = { "RELEASE_REASON_" }, value = {
@@ -93,7 +98,8 @@ final class ScreenTimeoutOverridePolicy {
RELEASE_REASON_USER_ACTIVITY_OTHER,
RELEASE_REASON_USER_ACTIVITY_BUTTON,
RELEASE_REASON_USER_ACTIVITY_TOUCH,
- RELEASE_REASON_USER_ACTIVITY_ACCESSIBILITY
+ RELEASE_REASON_USER_ACTIVITY_ACCESSIBILITY,
+ RELEASE_REASON_WAKE_LOCK_DEATH
})
@Retention(RetentionPolicy.SOURCE)
public @interface ReleaseReason{}
diff --git a/services/core/java/com/android/server/power/WakefulnessSessionObserver.java b/services/core/java/com/android/server/power/WakefulnessSessionObserver.java
index 3546565480ad..c6b260288a88 100644
--- a/services/core/java/com/android/server/power/WakefulnessSessionObserver.java
+++ b/services/core/java/com/android/server/power/WakefulnessSessionObserver.java
@@ -31,6 +31,7 @@ import static com.android.server.power.ScreenTimeoutOverridePolicy.RELEASE_REASO
import static com.android.server.power.ScreenTimeoutOverridePolicy.RELEASE_REASON_USER_ACTIVITY_BUTTON;
import static com.android.server.power.ScreenTimeoutOverridePolicy.RELEASE_REASON_USER_ACTIVITY_OTHER;
import static com.android.server.power.ScreenTimeoutOverridePolicy.RELEASE_REASON_USER_ACTIVITY_TOUCH;
+import static com.android.server.power.ScreenTimeoutOverridePolicy.RELEASE_REASON_WAKE_LOCK_DEATH;
import android.annotation.IntDef;
import android.app.ActivityManager;
@@ -574,10 +575,13 @@ public class WakefulnessSessionObserver {
case RELEASE_REASON_USER_ACTIVITY_ACCESSIBILITY:
outcome = OVERRIDE_OUTCOME_CANCEL_USER_INTERACTION;
break;
- case RELEASE_REASON_SCREEN_LOCK:
- case RELEASE_REASON_NON_INTERACTIVE:
+ case RELEASE_REASON_WAKE_LOCK_DEATH:
outcome = OVERRIDE_OUTCOME_CANCEL_CLIENT_DISCONNECT;
break;
+ case RELEASE_REASON_NON_INTERACTIVE:
+ case RELEASE_REASON_SCREEN_LOCK:
+ outcome = OVERRIDE_OUTCOME_CANCEL_OTHER;
+ break;
default:
outcome = OVERRIDE_OUTCOME_UNKNOWN;
}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
index e4f60ec2cdb8..a4a29a02f362 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
@@ -54,15 +54,13 @@ public interface StatusBarManagerInternal {
* Used by InputMethodManagerService to notify the IME status.
*
* @param displayId The display to which the IME is bound to.
- * @param token The IME token.
* @param vis Bit flags about the IME visibility.
* (e.g. {@link android.inputmethodservice.InputMethodService#IME_ACTIVE})
* @param backDisposition Bit flags about the IME back disposition.
* (e.g. {@link android.inputmethodservice.InputMethodService#BACK_DISPOSITION_DEFAULT})
* @param showImeSwitcher {@code true} when the IME switcher button should be shown.
*/
- void setImeWindowStatus(int displayId, IBinder token, int vis,
- int backDisposition, boolean showImeSwitcher);
+ void setImeWindowStatus(int displayId, int vis, int backDisposition, boolean showImeSwitcher);
/**
* See {@link android.app.StatusBarManager#setIcon(String, int, int, String)}.
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index e9423ce48624..c3601b3c3090 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -534,9 +534,9 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
@Override
- public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
+ public void setImeWindowStatus(int displayId, int vis, int backDisposition,
boolean showImeSwitcher) {
- StatusBarManagerService.this.setImeWindowStatus(displayId, token, vis, backDisposition,
+ StatusBarManagerService.this.setImeWindowStatus(displayId, vis, backDisposition,
showImeSwitcher);
}
@@ -1351,25 +1351,24 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
@Override
- public void setImeWindowStatus(int displayId, final IBinder token, final int vis,
- final int backDisposition, final boolean showImeSwitcher) {
+ public void setImeWindowStatus(int displayId, final int vis, final int backDisposition,
+ final boolean showImeSwitcher) {
enforceStatusBar();
if (SPEW) {
- Slog.d(TAG, "swetImeWindowStatus vis=" + vis + " backDisposition=" + backDisposition);
+ Slog.d(TAG, "setImeWindowStatus vis=" + vis + " backDisposition=" + backDisposition);
}
synchronized(mLock) {
// In case of IME change, we need to call up setImeWindowStatus() regardless of
// mImeWindowVis because mImeWindowVis may not have been set to false when the
// previous IME was destroyed.
- getUiState(displayId).setImeWindowState(vis, backDisposition, showImeSwitcher, token);
+ getUiState(displayId).setImeWindowState(vis, backDisposition, showImeSwitcher);
mHandler.post(() -> {
if (mBar == null) return;
try {
- mBar.setImeWindowStatus(
- displayId, token, vis, backDisposition, showImeSwitcher);
+ mBar.setImeWindowStatus(displayId, vis, backDisposition, showImeSwitcher);
} catch (RemoteException ex) { }
});
}
@@ -1422,7 +1421,6 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
private int mImeWindowVis = 0;
private int mImeBackDisposition = 0;
private boolean mShowImeSwitcher = false;
- private IBinder mImeToken = null;
private LetterboxDetails[] mLetterboxDetails = new LetterboxDetails[0];
private void setBarAttributes(@Appearance int appearance,
@@ -1465,11 +1463,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
}
private void setImeWindowState(final int vis, final int backDisposition,
- final boolean showImeSwitcher, final IBinder token) {
+ final boolean showImeSwitcher) {
mImeWindowVis = vis;
mImeBackDisposition = backDisposition;
mShowImeSwitcher = showImeSwitcher;
- mImeToken = token;
}
}
@@ -1563,7 +1560,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
return new RegisterStatusBarResult(icons, gatherDisableActionsLocked(mCurrentUserId, 1),
state.mAppearance, state.mAppearanceRegions, state.mImeWindowVis,
state.mImeBackDisposition, state.mShowImeSwitcher,
- gatherDisableActionsLocked(mCurrentUserId, 2), state.mImeToken,
+ gatherDisableActionsLocked(mCurrentUserId, 2),
state.mNavbarColorManagedByIme, state.mBehavior, state.mRequestedVisibleTypes,
state.mPackageName, state.mTransientBarTypes, state.mLetterboxDetails);
}
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperCropper.java b/services/core/java/com/android/server/wallpaper/WallpaperCropper.java
index d5bea4adaf8c..5d01bc33bb82 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperCropper.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperCropper.java
@@ -601,8 +601,8 @@ public class WallpaperCropper {
.getDefaultDisplaySizes().get(orientation);
if (displayForThisOrientation == null) continue;
float sampleSizeForThisOrientation = Math.max(1f, Math.min(
- crop.width() / displayForThisOrientation.x,
- crop.height() / displayForThisOrientation.y));
+ (float) crop.width() / displayForThisOrientation.x,
+ (float) crop.height() / displayForThisOrientation.y));
sampleSize = Math.min(sampleSize, sampleSizeForThisOrientation);
}
// If the total crop has more width or height than either the max texture size
diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
index 2c58c61701cc..34b9913c9738 100644
--- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java
+++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
@@ -97,10 +97,10 @@ public class WindowAnimationSpec implements AnimationSpec {
/**
* @return If a window animation has outsets applied to it.
- * @see Animation#getExtensionEdges()
+ * @see Animation#hasExtension()
*/
public boolean hasExtension() {
- return mAnimation.getExtensionEdges() != 0;
+ return mAnimation.hasExtension();
}
@Override
diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java
index 48a5050c08b0..a574845814e8 100644
--- a/services/core/java/com/android/server/wm/WindowManagerInternal.java
+++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java
@@ -690,15 +690,10 @@ public abstract class WindowManagerInternal {
* <p>Only {@link com.android.server.inputmethod.InputMethodManagerService} is the expected and
* tested caller of this method.</p>
*
- * @param imeToken token to track the active input method. Corresponding IME windows can be
- * identified by checking {@link android.view.WindowManager.LayoutParams#token}.
- * Note that there is no guarantee that the corresponding window is already
- * created
* @param imeTargetWindowToken token to identify the target window that the IME is associated
* with
*/
- public abstract void updateInputMethodTargetWindow(@NonNull IBinder imeToken,
- @NonNull IBinder imeTargetWindowToken);
+ public abstract void updateInputMethodTargetWindow(@NonNull IBinder imeTargetWindowToken);
/**
* Returns true when the hardware keyboard is available.
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 464afe003b71..d73d509863ab 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -8094,11 +8094,10 @@ public class WindowManagerService extends IWindowManager.Stub
}
@Override
- public void updateInputMethodTargetWindow(@NonNull IBinder imeToken,
- @NonNull IBinder imeTargetWindowToken) {
+ public void updateInputMethodTargetWindow(@NonNull IBinder imeTargetWindowToken) {
// TODO (b/34628091): Use this method to address the window animation issue.
if (DEBUG_INPUT_METHOD) {
- Slog.w(TAG_WM, "updateInputMethodTargetWindow: imeToken=" + imeToken
+ Slog.w(TAG_WM, "updateInputMethodTargetWindow:"
+ " imeTargetWindowToken=" + imeTargetWindowToken);
}
synchronized (mGlobalLock) {
diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
index 8ed38a6d0cad..b5278a5818a8 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java
@@ -936,6 +936,9 @@ public final class DisplayPowerControllerTest {
@Test
public void testSetScreenOffBrightnessSensorDisabled_DisplayIsOn() {
+ Settings.System.putInt(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
DisplayPowerRequest dpr = new DisplayPowerRequest();
dpr.policy = DisplayPowerRequest.POLICY_BRIGHT;
@@ -948,6 +951,9 @@ public final class DisplayPowerControllerTest {
@Test
public void testSetScreenOffBrightnessSensorDisabled_DisplayIsAFollower() {
+ Settings.System.putInt(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
DisplayPowerRequest dpr = new DisplayPowerRequest();
dpr.policy = DisplayPowerRequest.POLICY_OFF;
@@ -960,6 +966,24 @@ public final class DisplayPowerControllerTest {
}
@Test
+ public void testSetScreenOffBrightnessSensorDisabled_AutoBrightnessInDoze() {
+ Settings.System.putInt(mContext.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+ mContext.getOrCreateTestableResources().addOverride(
+ com.android.internal.R.bool.config_allowAutoBrightnessWhileDozing, true);
+ mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID);
+ DisplayPowerRequest dpr = new DisplayPowerRequest();
+ dpr.policy = DisplayPowerRequest.POLICY_DOZE;
+
+ mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false);
+ advanceTime(1); // Run updatePowerState
+
+ verify(mHolder.screenOffBrightnessSensorController, atLeastOnce())
+ .setLightSensorEnabled(false);
+ }
+
+ @Test
public void testStopScreenOffBrightnessSensorControllerWhenDisplayDeviceChanges() {
// New display device
setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class),
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java
index d7936fece089..c0698756a3d7 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java
@@ -545,17 +545,18 @@ public final class DisplayBrightnessControllerTest {
DisplayDeviceConfig displayDeviceConfig = mock(DisplayDeviceConfig.class);
Handler handler = mock(Handler.class);
BrightnessMappingStrategy brightnessMappingStrategy = mock(BrightnessMappingStrategy.class);
- boolean isEnabled = true;
+ boolean isDisplayEnabled = true;
int leadDisplayId = 2;
mDisplayBrightnessController.setUpAutoBrightness(automaticBrightnessController,
- sensorManager, displayDeviceConfig, handler, brightnessMappingStrategy, isEnabled,
- leadDisplayId);
+ sensorManager, displayDeviceConfig, handler, brightnessMappingStrategy,
+ isDisplayEnabled, leadDisplayId);
assertEquals(automaticBrightnessController,
mDisplayBrightnessController.mAutomaticBrightnessController);
verify(automaticBrightnessStrategy).setAutomaticBrightnessController(
automaticBrightnessController);
verify(autoBrightnessFallbackStrategy).setupAutoBrightnessFallbackSensor(sensorManager,
- displayDeviceConfig, handler, brightnessMappingStrategy, isEnabled, leadDisplayId);
+ displayDeviceConfig, handler, brightnessMappingStrategy, isDisplayEnabled,
+ leadDisplayId);
}
}
diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategyTest.java
index bb24c0f7b18e..99dfa739fb80 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategyTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategyTest.java
@@ -16,15 +16,22 @@
package com.android.server.display.brightness.strategy;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE;
+import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF;
+
+import static com.android.server.display.layout.Layout.NO_LEAD_DISPLAY;
import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.hardware.display.DisplayManagerInternal;
import android.os.Handler;
+import android.os.PowerManager;
+import android.view.Display;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -35,6 +42,7 @@ import com.android.server.display.DisplayDeviceConfig;
import com.android.server.display.ScreenOffBrightnessSensorController;
import com.android.server.display.brightness.BrightnessReason;
import com.android.server.display.brightness.StrategyExecutionRequest;
+import com.android.server.display.brightness.StrategySelectionNotifyRequest;
import org.junit.Before;
import org.junit.Test;
@@ -53,9 +61,24 @@ public class AutoBrightnessFallbackStrategyTest {
@Mock
private ScreenOffBrightnessSensorController mScreenOffBrightnessSensorController;
+ @Mock
+ private SensorManager mSensorManager;
+
+ @Mock
+ private DisplayDeviceConfig mDisplayDeviceConfig;
+
+ @Mock
+ private Handler mHandler;
+
+ @Mock
+ private BrightnessMappingStrategy mBrightnessMappingStrategy;
+
@Before
public void before() {
MockitoAnnotations.initMocks(this);
+ int[] sensorValueToLux = new int[]{50, 100};
+ when(mDisplayDeviceConfig.getScreenOffBrightnessSensorValueToLux())
+ .thenReturn(sensorValueToLux);
mAutoBrightnessFallbackStrategy = new AutoBrightnessFallbackStrategy(
new AutoBrightnessFallbackStrategy.Injector() {
@Override
@@ -78,20 +101,11 @@ public class AutoBrightnessFallbackStrategyTest {
@Test
public void testUpdateBrightnessWhenScreenDozeStateIsRequested() {
- // Setup the argument mocks
- SensorManager sensorManager = mock(SensorManager.class);
- DisplayDeviceConfig displayDeviceConfig = mock(DisplayDeviceConfig.class);
- Handler handler = mock(Handler.class);
- BrightnessMappingStrategy brightnessMappingStrategy = mock(BrightnessMappingStrategy.class);
- boolean isEnabled = true;
+ boolean isDisplayEnabled = true;
int leadDisplayId = 2;
-
- int[] sensorValueToLux = new int[]{50, 100};
- when(displayDeviceConfig.getScreenOffBrightnessSensorValueToLux()).thenReturn(
- sensorValueToLux);
-
- mAutoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(sensorManager,
- displayDeviceConfig, handler, brightnessMappingStrategy, isEnabled, leadDisplayId);
+ mAutoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(mSensorManager,
+ mDisplayDeviceConfig,
+ mHandler, mBrightnessMappingStrategy, isDisplayEnabled, leadDisplayId);
assertEquals(mScreenOffBrightnessSensor,
mAutoBrightnessFallbackStrategy.mScreenOffBrightnessSensor);
@@ -119,4 +133,157 @@ public class AutoBrightnessFallbackStrategyTest {
assertEquals(updatedDisplayBrightnessState, expectedDisplayBrightnessState);
}
+ @Test
+ public void testPostProcess_EnableSensor_PolicyOff() {
+ boolean isDisplayEnabled = true;
+ int leadDisplayId = NO_LEAD_DISPLAY;
+ mAutoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(mSensorManager,
+ mDisplayDeviceConfig,
+ mHandler, mBrightnessMappingStrategy, isDisplayEnabled, leadDisplayId);
+
+ DisplayManagerInternal.DisplayPowerRequest dpr =
+ new DisplayManagerInternal.DisplayPowerRequest();
+ dpr.policy = POLICY_OFF;
+ StrategySelectionNotifyRequest ssnr = new StrategySelectionNotifyRequest(dpr,
+ Display.STATE_OFF, mAutoBrightnessFallbackStrategy,
+ /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT,
+ /* userSetBrightnessChanged= */ false,
+ /* allowAutoBrightnessWhileDozingConfig= */ false,
+ /* isAutoBrightnessEnabled= */ true);
+ mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr);
+
+ verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(true);
+ }
+
+ @Test
+ public void testPostProcess_EnableSensor_PolicyDoze() {
+ boolean isDisplayEnabled = true;
+ int leadDisplayId = NO_LEAD_DISPLAY;
+ mAutoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(mSensorManager,
+ mDisplayDeviceConfig,
+ mHandler, mBrightnessMappingStrategy, isDisplayEnabled, leadDisplayId);
+
+ DisplayManagerInternal.DisplayPowerRequest dpr =
+ new DisplayManagerInternal.DisplayPowerRequest();
+ dpr.policy = POLICY_DOZE;
+ StrategySelectionNotifyRequest ssnr = new StrategySelectionNotifyRequest(dpr,
+ Display.STATE_DOZE, mAutoBrightnessFallbackStrategy,
+ /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT,
+ /* userSetBrightnessChanged= */ false,
+ /* allowAutoBrightnessWhileDozingConfig= */ false,
+ /* isAutoBrightnessEnabled= */ true);
+ mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr);
+
+ verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(true);
+ }
+
+ @Test
+ public void testPostProcess_DisableSensor_AutoBrightnessDisabled() {
+ boolean isDisplayEnabled = true;
+ int leadDisplayId = NO_LEAD_DISPLAY;
+ mAutoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(mSensorManager,
+ mDisplayDeviceConfig,
+ mHandler, mBrightnessMappingStrategy, isDisplayEnabled, leadDisplayId);
+
+ DisplayManagerInternal.DisplayPowerRequest dpr =
+ new DisplayManagerInternal.DisplayPowerRequest();
+ dpr.policy = POLICY_OFF;
+ StrategySelectionNotifyRequest ssnr = new StrategySelectionNotifyRequest(dpr,
+ Display.STATE_OFF, mAutoBrightnessFallbackStrategy,
+ /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT,
+ /* userSetBrightnessChanged= */ false,
+ /* allowAutoBrightnessWhileDozingConfig= */ false,
+ /* isAutoBrightnessEnabled= */ false);
+ mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr);
+
+ verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(false);
+ }
+
+ @Test
+ public void testPostProcess_DisableSensor_DisplayDisabled() {
+ boolean isDisplayEnabled = false;
+ int leadDisplayId = NO_LEAD_DISPLAY;
+ mAutoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(mSensorManager,
+ mDisplayDeviceConfig,
+ mHandler, mBrightnessMappingStrategy, isDisplayEnabled, leadDisplayId);
+
+ DisplayManagerInternal.DisplayPowerRequest dpr =
+ new DisplayManagerInternal.DisplayPowerRequest();
+ dpr.policy = POLICY_OFF;
+ StrategySelectionNotifyRequest ssnr = new StrategySelectionNotifyRequest(dpr,
+ Display.STATE_OFF, mAutoBrightnessFallbackStrategy,
+ /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT,
+ /* userSetBrightnessChanged= */ false,
+ /* allowAutoBrightnessWhileDozingConfig= */ false,
+ /* isAutoBrightnessEnabled= */ true);
+ mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr);
+
+ verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(false);
+ }
+
+ @Test
+ public void testPostProcess_DisableSensor_PolicyBright() {
+ boolean isDisplayEnabled = true;
+ int leadDisplayId = NO_LEAD_DISPLAY;
+ mAutoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(mSensorManager,
+ mDisplayDeviceConfig,
+ mHandler, mBrightnessMappingStrategy, isDisplayEnabled, leadDisplayId);
+
+ DisplayManagerInternal.DisplayPowerRequest dpr =
+ new DisplayManagerInternal.DisplayPowerRequest();
+ dpr.policy = POLICY_BRIGHT;
+ StrategySelectionNotifyRequest ssnr = new StrategySelectionNotifyRequest(dpr,
+ Display.STATE_ON, mAutoBrightnessFallbackStrategy,
+ /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT,
+ /* userSetBrightnessChanged= */ false,
+ /* allowAutoBrightnessWhileDozingConfig= */ false,
+ /* isAutoBrightnessEnabled= */ true);
+ mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr);
+
+ verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(false);
+ }
+
+ @Test
+ public void testPostProcess_DisableSensor_AutoBrightnessInDoze() {
+ boolean isDisplayEnabled = true;
+ int leadDisplayId = NO_LEAD_DISPLAY;
+ mAutoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(mSensorManager,
+ mDisplayDeviceConfig,
+ mHandler, mBrightnessMappingStrategy, isDisplayEnabled, leadDisplayId);
+
+ DisplayManagerInternal.DisplayPowerRequest dpr =
+ new DisplayManagerInternal.DisplayPowerRequest();
+ dpr.policy = POLICY_DOZE;
+ StrategySelectionNotifyRequest ssnr = new StrategySelectionNotifyRequest(dpr,
+ Display.STATE_DOZE, mAutoBrightnessFallbackStrategy,
+ /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT,
+ /* userSetBrightnessChanged= */ false,
+ /* allowAutoBrightnessWhileDozingConfig= */ true,
+ /* isAutoBrightnessEnabled= */ true);
+ mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr);
+
+ verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(false);
+ }
+
+ @Test
+ public void testPostProcess_DisableSensor_DisplayIsFollower() {
+ boolean isDisplayEnabled = true;
+ int leadDisplayId = 3;
+ mAutoBrightnessFallbackStrategy.setupAutoBrightnessFallbackSensor(mSensorManager,
+ mDisplayDeviceConfig,
+ mHandler, mBrightnessMappingStrategy, isDisplayEnabled, leadDisplayId);
+
+ DisplayManagerInternal.DisplayPowerRequest dpr =
+ new DisplayManagerInternal.DisplayPowerRequest();
+ dpr.policy = POLICY_OFF;
+ StrategySelectionNotifyRequest ssnr = new StrategySelectionNotifyRequest(dpr,
+ Display.STATE_OFF, mAutoBrightnessFallbackStrategy,
+ /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT,
+ /* userSetBrightnessChanged= */ false,
+ /* allowAutoBrightnessWhileDozingConfig= */ false,
+ /* isAutoBrightnessEnabled= */ true);
+ mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr);
+
+ verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(false);
+ }
}