diff options
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); + } } |