diff options
14 files changed, 113 insertions, 120 deletions
diff --git a/core/java/android/view/InsetsSource.java b/core/java/android/view/InsetsSource.java index 17ab83c0df16..e02e600f53c8 100644 --- a/core/java/android/view/InsetsSource.java +++ b/core/java/android/view/InsetsSource.java @@ -133,7 +133,7 @@ public class InsetsSource implements Parcelable { return mVisibleFrame == null || !mVisibleFrame.isEmpty(); } - public boolean getInsetsRoundedCornerFrame() { + public boolean insetsRoundedCornerFrame() { return mInsetsRoundedCornerFrame; } diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java index ba7d823750a3..997e4a553063 100644 --- a/core/java/android/view/InsetsState.java +++ b/core/java/android/view/InsetsState.java @@ -275,7 +275,7 @@ public class InsetsState implements Parcelable { final Rect roundedCornerFrame = new Rect(mRoundedCornerFrame); for (int i = mSources.size() - 1; i >= 0; i--) { final InsetsSource source = mSources.valueAt(i); - if (source.getInsetsRoundedCornerFrame()) { + if (source.insetsRoundedCornerFrame()) { final Insets insets = source.calculateInsets(roundedCornerFrame, false); roundedCornerFrame.inset(insets); } diff --git a/core/java/android/view/TaskTransitionSpec.java b/core/java/android/view/TaskTransitionSpec.java index 5f498a19f196..9a2d3ba048fb 100644 --- a/core/java/android/view/TaskTransitionSpec.java +++ b/core/java/android/view/TaskTransitionSpec.java @@ -18,9 +18,6 @@ package android.view; import android.os.Parcel; import android.os.Parcelable; -import android.util.ArraySet; - -import java.util.Set; /** * Holds information about how to execute task transition animations. @@ -36,32 +33,12 @@ public class TaskTransitionSpec implements Parcelable { */ public final int backgroundColor; - /** - * TEMPORARY FIELD (b/202383002) - * TODO: Remove once we use surfaceflinger rounded corners on tasks rather than taskbar overlays - * or when shell transitions are fully enabled - * - * A set of {@InsetsState.InternalInsetsType}s we want to use as the source to set the bounds - * of the task during the animation. Used to make sure that task animate above the taskbar. - * Will also be used to crop to the frame size of the inset source to the inset size to prevent - * the taskbar rounded corners overlay from being invisible during task transition animation. - */ - public final Set<Integer> animationBoundInsets; - - public TaskTransitionSpec( - int backgroundColor, Set<Integer> animationBoundInsets) { + public TaskTransitionSpec(int backgroundColor) { this.backgroundColor = backgroundColor; - this.animationBoundInsets = animationBoundInsets; } public TaskTransitionSpec(Parcel in) { this.backgroundColor = in.readInt(); - - int animationBoundInsetsSize = in.readInt(); - this.animationBoundInsets = new ArraySet<>(animationBoundInsetsSize); - for (int i = 0; i < animationBoundInsetsSize; i++) { - this.animationBoundInsets.add(in.readInt()); - } } @Override @@ -72,11 +49,6 @@ public class TaskTransitionSpec implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(backgroundColor); - - dest.writeInt(animationBoundInsets.size()); - for (int insetType : animationBoundInsets) { - dest.writeInt(insetType); - } } public static final @android.annotation.NonNull Parcelable.Creator<TaskTransitionSpec> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java index 5933ac22dd83..713dd39201a4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java @@ -59,9 +59,6 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { public static final long TOUCH_ANIMATION_DURATION = 150; public static final long TOUCH_RELEASE_ANIMATION_DURATION = 200; - /** The task bar expanded height. Used to determine whether to insets divider bounds or not. */ - private float mExpandedTaskBarHeight; - private final int mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); private SplitLayout mSplitLayout; @@ -216,17 +213,19 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { void onInsetsChanged(InsetsState insetsState, boolean animate) { mSplitLayout.getDividerBounds(mTempRect); - final InsetsSource taskBarInsetsSource = - insetsState.peekSource(InsetsState.ITYPE_EXTRA_NAVIGATION_BAR); // Only insets the divider bar with task bar when it's expanded so that the rounded corners // will be drawn against task bar. // But there is no need to do it when IME showing because there are no rounded corners at // the bottom. This also avoids the problem of task bar height not changing when IME // floating. - if (!insetsState.isSourceOrDefaultVisible(InsetsSource.ID_IME, WindowInsets.Type.ime()) - && taskBarInsetsSource != null - && taskBarInsetsSource.getFrame().height() >= mExpandedTaskBarHeight) { - mTempRect.inset(taskBarInsetsSource.calculateVisibleInsets(mTempRect)); + if (!insetsState.isSourceOrDefaultVisible(InsetsSource.ID_IME, WindowInsets.Type.ime())) { + for (int i = insetsState.sourceSize() - 1; i >= 0; i--) { + final InsetsSource source = insetsState.sourceAt(i); + if (source.getType() == WindowInsets.Type.navigationBars() + && source.insetsRoundedCornerFrame()) { + mTempRect.inset(source.calculateVisibleInsets(mTempRect)); + } + } } if (!mTempRect.equals(mDividerBounds)) { @@ -251,8 +250,6 @@ public class DividerView extends FrameLayout implements View.OnTouchListener { mDividerBar = findViewById(R.id.divider_bar); mHandle = findViewById(R.id.docked_divider_handle); mBackground = findViewById(R.id.docked_divider_background); - mExpandedTaskBarHeight = getResources().getDimensionPixelSize( - com.android.internal.R.dimen.taskbar_frame_height); mTouchElevation = getResources().getDimensionPixelSize( R.dimen.docked_stack_divider_lift_elevation); mDoubleTapDetector = new GestureDetector(getContext(), new DoubleTapListener()); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/kidsmode/KidsModeTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/kidsmode/KidsModeTaskOrganizer.java index ac13f96585b6..9796e4c29352 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/kidsmode/KidsModeTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/kidsmode/KidsModeTaskOrganizer.java @@ -36,6 +36,7 @@ import android.os.IBinder; import android.view.InsetsSource; import android.view.InsetsState; import android.view.SurfaceControl; +import android.view.WindowInsets; import android.window.ITaskOrganizerController; import android.window.TaskAppearedInfo; import android.window.WindowContainerToken; @@ -57,7 +58,6 @@ import com.android.wm.shell.unfold.UnfoldAnimationController; import java.io.PrintWriter; import java.util.List; -import java.util.Objects; import java.util.Optional; /** @@ -130,14 +130,34 @@ public class KidsModeTaskOrganizer extends ShellTaskOrganizer { new DisplayInsetsController.OnInsetsChangedListener() { @Override public void insetsChanged(InsetsState insetsState) { - // Update bounds only when the insets of navigation bar or task bar is changed. - if (Objects.equals(insetsState.peekSource(InsetsState.ITYPE_NAVIGATION_BAR), - mInsetsState.peekSource(InsetsState.ITYPE_NAVIGATION_BAR)) - && Objects.equals(insetsState.peekSource( - InsetsState.ITYPE_EXTRA_NAVIGATION_BAR), - mInsetsState.peekSource(InsetsState.ITYPE_EXTRA_NAVIGATION_BAR))) { + final boolean[] navigationBarChanged = {false}; + InsetsState.traverse(insetsState, mInsetsState, new InsetsState.OnTraverseCallbacks() { + @Override + public void onIdMatch(InsetsSource source1, InsetsSource source2) { + if (source1.getType() == WindowInsets.Type.navigationBars() + && !source1.equals(source2)) { + navigationBarChanged[0] = true; + } + } + + @Override + public void onIdNotFoundInState1(int index2, InsetsSource source2) { + if (source2.getType() == WindowInsets.Type.navigationBars()) { + navigationBarChanged[0] = true; + } + } + + @Override + public void onIdNotFoundInState2(int index1, InsetsSource source1) { + if (source1.getType() == WindowInsets.Type.navigationBars()) { + navigationBarChanged[0] = true; + } + } + }); + if (!navigationBarChanged[0]) { return; } + // Update bounds only when the insets of navigation bar or task bar is changed. mInsetsState.set(insetsState); updateBounds(); } @@ -344,16 +364,8 @@ public class KidsModeTaskOrganizer extends ShellTaskOrganizer { private Rect calculateBounds() { final Rect bounds = new Rect(0, 0, mDisplayWidth, mDisplayHeight); - final InsetsSource navBarSource = mInsetsState.peekSource(InsetsState.ITYPE_NAVIGATION_BAR); - final InsetsSource taskBarSource = mInsetsState.peekSource( - InsetsState.ITYPE_EXTRA_NAVIGATION_BAR); - if (navBarSource != null && !navBarSource.getFrame().isEmpty()) { - bounds.inset(navBarSource.calculateInsets(bounds, false /* ignoreVisibility */)); - } else if (taskBarSource != null && !taskBarSource.getFrame().isEmpty()) { - bounds.inset(taskBarSource.calculateInsets(bounds, false /* ignoreVisibility */)); - } else { - bounds.setEmpty(); - } + bounds.inset(mInsetsState.calculateInsets( + bounds, WindowInsets.Type.navigationBars(), false /* ignoreVisibility */)); return bounds; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/animation/FullscreenUnfoldTaskAnimator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/animation/FullscreenUnfoldTaskAnimator.java index 06a8438a3a25..f81fc6fbea49 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/animation/FullscreenUnfoldTaskAnimator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/animation/FullscreenUnfoldTaskAnimator.java @@ -35,6 +35,7 @@ import android.view.InsetsSource; import android.view.InsetsState; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; +import android.view.WindowInsets; import com.android.internal.policy.ScreenDecorationsUtils; import com.android.wm.shell.common.DisplayInsetsController; @@ -66,13 +67,12 @@ public class FullscreenUnfoldTaskAnimator implements UnfoldTaskAnimator, private static final float START_SCALE = END_SCALE - VERTICAL_START_MARGIN * 2; private final SparseArray<AnimationContext> mAnimationContextByTaskId = new SparseArray<>(); - private final int mExpandedTaskBarHeight; private final DisplayInsetsController mDisplayInsetsController; private final UnfoldBackgroundController mBackgroundController; private final Context mContext; private final ShellController mShellController; - private InsetsSource mTaskbarInsetsSource; + private InsetsSource mExpandedTaskbarInsetsSource; private float mWindowCornerRadiusPx; public FullscreenUnfoldTaskAnimator(Context context, @@ -82,8 +82,6 @@ public class FullscreenUnfoldTaskAnimator implements UnfoldTaskAnimator, mDisplayInsetsController = displayInsetsController; mBackgroundController = backgroundController; mShellController = shellController; - mExpandedTaskBarHeight = context.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.taskbar_frame_height); mWindowCornerRadiusPx = ScreenDecorationsUtils.getWindowCornerRadius(context); } @@ -101,21 +99,32 @@ public class FullscreenUnfoldTaskAnimator implements UnfoldTaskAnimator, @Override public void insetsChanged(InsetsState insetsState) { - mTaskbarInsetsSource = insetsState.peekSource(InsetsState.ITYPE_EXTRA_NAVIGATION_BAR); + mExpandedTaskbarInsetsSource = getExpandedTaskbarSource(insetsState); for (int i = mAnimationContextByTaskId.size() - 1; i >= 0; i--) { AnimationContext context = mAnimationContextByTaskId.valueAt(i); - context.update(mTaskbarInsetsSource, context.mTaskInfo); + context.update(mExpandedTaskbarInsetsSource, context.mTaskInfo); } } + private static InsetsSource getExpandedTaskbarSource(InsetsState state) { + for (int i = state.sourceSize() - 1; i >= 0; i--) { + final InsetsSource source = state.sourceAt(i); + if (source.getType() == WindowInsets.Type.navigationBars() + && source.insetsRoundedCornerFrame()) { + return source; + } + } + return null; + } + public boolean hasActiveTasks() { return mAnimationContextByTaskId.size() > 0; } @Override public void onTaskAppeared(TaskInfo taskInfo, SurfaceControl leash) { - AnimationContext animationContext = new AnimationContext(leash, mTaskbarInsetsSource, - taskInfo); + AnimationContext animationContext = new AnimationContext( + leash, mExpandedTaskbarInsetsSource, taskInfo); mAnimationContextByTaskId.put(taskInfo.taskId, animationContext); } @@ -123,7 +132,7 @@ public class FullscreenUnfoldTaskAnimator implements UnfoldTaskAnimator, public void onTaskChanged(TaskInfo taskInfo) { AnimationContext animationContext = mAnimationContextByTaskId.get(taskInfo.taskId); if (animationContext != null) { - animationContext.update(mTaskbarInsetsSource, taskInfo); + animationContext.update(mExpandedTaskbarInsetsSource, taskInfo); } } @@ -222,11 +231,7 @@ public class FullscreenUnfoldTaskAnimator implements UnfoldTaskAnimator, mStartCropRect.set(mTaskInfo.getConfiguration().windowConfiguration.getBounds()); if (taskBarInsetsSource != null) { - // Only insets the cropping window with task bar when it's expanded - if (taskBarInsetsSource.getFrame().height() >= mExpandedTaskBarHeight) { - mStartCropRect.inset(taskBarInsetsSource - .calculateVisibleInsets(mStartCropRect)); - } + mStartCropRect.inset(taskBarInsetsSource.calculateVisibleInsets(mStartCropRect)); } mEndCropRect.set(mStartCropRect); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/animation/SplitTaskUnfoldAnimator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/animation/SplitTaskUnfoldAnimator.java index f835c7bbd810..2f0c96487d68 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/animation/SplitTaskUnfoldAnimator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/unfold/animation/SplitTaskUnfoldAnimator.java @@ -37,6 +37,7 @@ import android.view.InsetsSource; import android.view.InsetsState; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; +import android.view.WindowInsets; import com.android.internal.policy.ScreenDecorationsUtils; import com.android.wm.shell.common.DisplayInsetsController; @@ -76,7 +77,6 @@ public class SplitTaskUnfoldAnimator implements UnfoldTaskAnimator, private final Executor mExecutor; private final DisplayInsetsController mDisplayInsetsController; private final SparseArray<AnimationContext> mAnimationContextByTaskId = new SparseArray<>(); - private final int mExpandedTaskBarHeight; private final ShellController mShellController; private final Lazy<Optional<SplitScreenController>> mSplitScreenController; private final UnfoldBackgroundController mUnfoldBackgroundController; @@ -86,7 +86,7 @@ public class SplitTaskUnfoldAnimator implements UnfoldTaskAnimator, private final Rect mRootStageBounds = new Rect(); private float mWindowCornerRadiusPx; - private InsetsSource mTaskbarInsetsSource; + private InsetsSource mExpandedTaskbarInsetsSource; @SplitPosition private int mMainStagePosition = SPLIT_POSITION_UNDEFINED; @@ -103,8 +103,6 @@ public class SplitTaskUnfoldAnimator implements UnfoldTaskAnimator, mShellController = shellController; mUnfoldBackgroundController = unfoldBackgroundController; mSplitScreenController = splitScreenController; - mExpandedTaskBarHeight = context.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.taskbar_frame_height); mWindowCornerRadiusPx = ScreenDecorationsUtils.getWindowCornerRadius(context); } @@ -143,10 +141,21 @@ public class SplitTaskUnfoldAnimator implements UnfoldTaskAnimator, @Override public void insetsChanged(InsetsState insetsState) { - mTaskbarInsetsSource = insetsState.peekSource(InsetsState.ITYPE_EXTRA_NAVIGATION_BAR); + mExpandedTaskbarInsetsSource = getExpandedTaskbarSource(insetsState); updateContexts(); } + private static InsetsSource getExpandedTaskbarSource(InsetsState state) { + for (int i = state.sourceSize() - 1; i >= 0; i--) { + final InsetsSource source = state.sourceAt(i); + if (source.getType() == WindowInsets.Type.navigationBars() + && source.insetsRoundedCornerFrame()) { + return source; + } + } + return null; + } + @Override public void onTaskStageChanged(int taskId, int stage, boolean visible) { final AnimationContext context = mAnimationContextByTaskId.get(taskId); @@ -307,7 +316,8 @@ public class SplitTaskUnfoldAnimator implements UnfoldTaskAnimator, boolean taskbarExpanded = isTaskbarExpanded(); if (taskbarExpanded) { // Only insets the cropping window with taskbar when taskbar is expanded - mStartCropRect.inset(mTaskbarInsetsSource.calculateVisibleInsets(mStartCropRect)); + mStartCropRect.inset(mExpandedTaskbarInsetsSource.calculateVisibleInsets( + mStartCropRect)); } // Offset to surface coordinates as layout bounds are in screen coordinates @@ -360,8 +370,7 @@ public class SplitTaskUnfoldAnimator implements UnfoldTaskAnimator, } private boolean isTaskbarExpanded() { - return mTaskbarInsetsSource != null - && mTaskbarInsetsSource.getFrame().height() >= mExpandedTaskBarHeight; + return mExpandedTaskbarInsetsSource != null; } } } diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index a0d8dfb2a034..9aa7e56f8877 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -19,7 +19,6 @@ package com.android.server.wm; import static android.accessibilityservice.AccessibilityTrace.FLAGS_MAGNIFICATION_CALLBACK; import static android.accessibilityservice.AccessibilityTrace.FLAGS_WINDOWS_FOR_ACCESSIBILITY_CALLBACK; import static android.os.Build.IS_USER; -import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_EXCLUDE_FROM_SCREEN_MAGNIFICATION; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CORNERS_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY; @@ -85,7 +84,6 @@ import android.util.SparseBooleanArray; import android.util.TypedValue; import android.util.proto.ProtoOutputStream; import android.view.Display; -import android.view.InsetsSource; import android.view.MagnificationSpec; import android.view.Surface; import android.view.Surface.OutOfResourcesException; diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 7aeebbc2c585..b203cdcd785e 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -931,7 +931,7 @@ public class DisplayPolicy { } final InsetsSourceProvider provider = win.getControllableInsetProvider(); - if (provider != null && provider.getSource().getInsetsRoundedCornerFrame() + if (provider != null && provider.getSource().insetsRoundedCornerFrame() != attrs.insetsRoundedCornerFrame) { provider.getSource().setInsetsRoundedCornerFrame(attrs.insetsRoundedCornerFrame); } diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index e3437683e957..9eea6a1583b4 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -97,6 +97,7 @@ import android.view.InsetsState; import android.view.RoundedCorner; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; +import android.view.WindowInsets; import android.view.WindowManager; import com.android.internal.R; @@ -131,12 +132,6 @@ final class LetterboxUiController { private final ActivityRecord mActivityRecord; - /** - * Taskbar expanded height. Used to determine when to crop an app window to display the - * rounded corners above the expanded taskbar. - */ - private final float mExpandedTaskBarHeight; - // TODO(b/265576778): Cache other overrides as well. // Corresponds to OVERRIDE_ANY_ORIENTATION @@ -259,9 +254,6 @@ final class LetterboxUiController { /* checkDeviceConfig */ true), PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE); - mExpandedTaskBarHeight = - getResources().getDimensionPixelSize(R.dimen.taskbar_frame_height); - mBooleanPropertyAllowOrientationOverride = readComponentProperty(packageManager, mActivityRecord.packageName, /* gatingCondition */ null, @@ -1131,11 +1123,13 @@ final class LetterboxUiController { @VisibleForTesting @Nullable InsetsSource getExpandedTaskbarOrNull(final WindowState mainWindow) { - final InsetsSource taskbar = mainWindow.getInsetsState().peekSource( - InsetsState.ITYPE_EXTRA_NAVIGATION_BAR); - if (taskbar != null && taskbar.isVisible() - && taskbar.getFrame().height() >= mExpandedTaskBarHeight) { - return taskbar; + final InsetsState state = mainWindow.getInsetsState(); + for (int i = state.sourceSize() - 1; i >= 0; i--) { + final InsetsSource source = state.sourceAt(i); + if (source.getType() == WindowInsets.Type.navigationBars() + && source.insetsRoundedCornerFrame() && source.isVisible()) { + return source; + } } return null; } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index c7d855360df9..87aab0f700d2 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -2825,19 +2825,23 @@ class Task extends TaskFragment { * Account for specified insets to crop the animation bounds by to avoid the animation * occurring over "out of bounds" regions * - * For example this is used to make sure the tasks are cropped to be fully above the + * For example this is used to make sure the tasks are cropped to be fully above the expanded * taskbar when animating. * - * @param animationBounds The animations bounds to adjust to account for the custom spec insets. + * TEMPORARY FIELD (b/202383002) + * TODO: Remove once we use surfaceflinger rounded corners on tasks rather than taskbar overlays + * or when shell transitions are fully enabled + * + * @param animationBounds The animation bounds to adjust to account for the custom spec insets. */ void adjustAnimationBoundsForTransition(Rect animationBounds) { TaskTransitionSpec spec = mWmService.mTaskTransitionSpec; if (spec != null) { final InsetsState state = getDisplayContent().getInsetsStateController().getRawInsetsState(); - for (int id : spec.animationBoundInsets) { - final InsetsSource source = state.peekSource(id); - if (source != null) { + for (int i = state.sourceSize() - 1; i >= 0; i--) { + final InsetsSource source = state.sourceAt(i); + if (source.insetsRoundedCornerFrame()) { animationBounds.inset(source.calculateVisibleInsets(animationBounds)); } } diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index bb706ecafa64..da7400c64b40 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -123,7 +123,6 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedList; import java.util.List; -import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiFunction; import java.util.function.Consumer; @@ -3193,8 +3192,7 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< animationRunnerBuilder.setTaskBackgroundColor(getTaskAnimationBackgroundColor()); // TODO: Remove when we migrate to shell (b/202383002) if (mWmService.mTaskTransitionSpec != null) { - animationRunnerBuilder.hideInsetSourceViewOverflows( - mWmService.mTaskTransitionSpec.animationBoundInsets); + animationRunnerBuilder.hideInsetSourceViewOverflows(); } } @@ -4115,11 +4113,12 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< } } - private void hideInsetSourceViewOverflows(Set<Integer> sourceIds) { - final InsetsStateController controller = getDisplayContent().getInsetsStateController(); - for (int id : sourceIds) { - final InsetsSourceProvider insetProvider = controller.peekSourceProvider(id); - if (insetProvider == null) { + private void hideInsetSourceViewOverflows() { + final SparseArray<WindowContainerInsetsSourceProvider> providers = + getDisplayContent().getInsetsStateController().getSourceProviders(); + for (int i = providers.size(); i >= 0; i--) { + final InsetsSourceProvider insetProvider = providers.valueAt(i); + if (!insetProvider.getSource().insetsRoundedCornerFrame()) { return; } diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java index 6f633d766af7..06b6ed83d28c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java @@ -68,6 +68,7 @@ import android.view.InsetsSource; import android.view.InsetsState; import android.view.RoundedCorner; import android.view.RoundedCorners; +import android.view.WindowInsets; import android.view.WindowManager; import androidx.test.filters.SmallTest; @@ -353,7 +354,7 @@ public class LetterboxUiControllerTest extends WindowTestsBase { @Test public void testGetCropBoundsIfNeeded_noCrop() { final InsetsSource taskbar = new InsetsSource(/*id=*/ 0, - InsetsState.ITYPE_EXTRA_NAVIGATION_BAR); + WindowInsets.Type.navigationBars()); final WindowState mainWindow = mockForGetCropBoundsAndRoundedCorners(taskbar); // Do not apply crop if taskbar is collapsed @@ -374,7 +375,8 @@ public class LetterboxUiControllerTest extends WindowTestsBase { @Test public void testGetCropBoundsIfNeeded_appliesCrop() { final InsetsSource taskbar = new InsetsSource(/*id=*/ 0, - InsetsState.ITYPE_EXTRA_NAVIGATION_BAR); + WindowInsets.Type.navigationBars()); + taskbar.setInsetsRoundedCornerFrame(true); final WindowState mainWindow = mockForGetCropBoundsAndRoundedCorners(taskbar); // Apply crop if taskbar is expanded @@ -396,7 +398,8 @@ public class LetterboxUiControllerTest extends WindowTestsBase { @Test public void testGetCropBoundsIfNeeded_appliesCropWithSizeCompatScaling() { final InsetsSource taskbar = new InsetsSource(/*id=*/ 0, - InsetsState.ITYPE_EXTRA_NAVIGATION_BAR); + WindowInsets.Type.navigationBars()); + taskbar.setInsetsRoundedCornerFrame(true); final WindowState mainWindow = mockForGetCropBoundsAndRoundedCorners(taskbar); final float scaling = 2.0f; @@ -440,7 +443,7 @@ public class LetterboxUiControllerTest extends WindowTestsBase { configurationRadius * 2 /*2 is to test selection of the min radius*/, /*centerX=*/ 1, /*centerY=*/ 1) ); - doReturn(roundedCorners).when(insets).getRoundedCorners(); + insets.setRoundedCorners(roundedCorners); mLetterboxConfiguration.setLetterboxActivityCornersRadius(-1); assertEquals(expectedRadius, mController.getRoundedCornersRadius(mainWindow)); @@ -479,7 +482,7 @@ public class LetterboxUiControllerTest extends WindowTestsBase { private WindowState mockForGetCropBoundsAndRoundedCorners(@Nullable InsetsSource taskbar) { final WindowState mainWindow = mock(WindowState.class); - final InsetsState insets = mock(InsetsState.class); + final InsetsState insets = new InsetsState(); final Resources resources = mWm.mContext.getResources(); final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(); @@ -489,7 +492,7 @@ public class LetterboxUiControllerTest extends WindowTestsBase { if (taskbar != null) { taskbar.setVisible(true); - doReturn(taskbar).when(insets).peekSource(taskbar.getType()); + insets.addSource(taskbar); } doReturn(mLetterboxedPortraitTaskBounds).when(mActivity).getBounds(); doReturn(true).when(mActivity).isVisible(); diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index c9f758ce1f55..d55ab2f683da 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -28,7 +28,6 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.provider.DeviceConfig.NAMESPACE_CONSTRAIN_DISPLAY_APIS; -import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.InsetsState.ITYPE_TOP_MANDATORY_GESTURES; import static android.view.InsetsState.ITYPE_TOP_TAPPABLE_ELEMENT; @@ -2987,8 +2986,9 @@ public class SizeCompatTests extends WindowTestsBase { organizer.mPrimary.setBounds(0, screenHeight / 2, screenWidth, screenHeight); organizer.putTaskToPrimary(mTask, true); - final InsetsSource navSource = - new InsetsSource(ITYPE_EXTRA_NAVIGATION_BAR, navigationBars()); + final InsetsSource navSource = new InsetsSource( + InsetsSource.createId(null, 0, navigationBars()), navigationBars()); + navSource.setInsetsRoundedCornerFrame(true); navSource.setFrame(new Rect(0, screenHeight - taskbarHeight, screenWidth, screenHeight)); mActivity.mWmService.mLetterboxConfiguration.setLetterboxActivityCornersRadius(15); |