diff options
8 files changed, 42 insertions, 433 deletions
diff --git a/core/java/android/window/SnapshotDrawerUtils.java b/core/java/android/window/SnapshotDrawerUtils.java index 5397da11eb36..435c8c79122f 100644 --- a/core/java/android/window/SnapshotDrawerUtils.java +++ b/core/java/android/window/SnapshotDrawerUtils.java @@ -44,20 +44,16 @@ import static com.android.internal.policy.DecorView.NAVIGATION_BAR_COLOR_VIEW_AT import static com.android.internal.policy.DecorView.STATUS_BAR_COLOR_VIEW_ATTRIBUTES; import static com.android.internal.policy.DecorView.getNavigationBarRect; -import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityThread; import android.content.Context; import android.graphics.Canvas; -import android.graphics.GraphicBuffer; import android.graphics.Paint; -import android.graphics.PixelFormat; import android.graphics.Rect; import android.hardware.HardwareBuffer; import android.os.IBinder; import android.util.Log; -import android.view.InsetsState; import android.view.SurfaceControl; import android.view.ViewGroup; import android.view.WindowInsets; @@ -66,7 +62,6 @@ import android.view.WindowManager; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.policy.DecorView; -import com.android.window.flags.Flags; /** * Utils class to help draw a snapshot on a surface. @@ -103,8 +98,6 @@ public class SnapshotDrawerUtils { | FLAG_SECURE | FLAG_DIM_BEHIND; - private static final Paint sBackgroundPaint = new Paint(); - /** * The internal object to hold the surface and drawing on it. */ @@ -115,54 +108,29 @@ public class SnapshotDrawerUtils { private final TaskSnapshot mSnapshot; private final CharSequence mTitle; - private SystemBarBackgroundPainter mSystemBarBackgroundPainter; - private final Rect mFrame = new Rect(); - private final Rect mSystemBarInsets = new Rect(); private final int mSnapshotW; private final int mSnapshotH; - private boolean mSizeMismatch; + private final int mContainerW; + private final int mContainerH; public SnapshotSurface(SurfaceControl rootSurface, TaskSnapshot snapshot, - CharSequence title) { + Rect windowBounds, CharSequence title) { mRootSurface = rootSurface; mSnapshot = snapshot; mTitle = title; final HardwareBuffer hwBuffer = snapshot.getHardwareBuffer(); mSnapshotW = hwBuffer.getWidth(); mSnapshotH = hwBuffer.getHeight(); + mContainerW = windowBounds.width(); + mContainerH = windowBounds.height(); } - /** - * Initiate system bar painter to draw the system bar background. - */ - @VisibleForTesting - public void initiateSystemBarPainter(int windowFlags, int windowPrivateFlags, - int appearance, ActivityManager.TaskDescription taskDescription, - @WindowInsets.Type.InsetsType int requestedVisibleTypes) { - mSystemBarBackgroundPainter = new SystemBarBackgroundPainter(windowFlags, - windowPrivateFlags, appearance, taskDescription, 1f, requestedVisibleTypes); - int backgroundColor = taskDescription.getBackgroundColor(); - sBackgroundPaint.setColor(backgroundColor != 0 ? backgroundColor : WHITE); - } - - /** - * Set frame size that the snapshot should fill. It is the bounds of a task or activity. - */ - @VisibleForTesting - public void setFrames(Rect frame, Rect systemBarInsets) { - mFrame.set(frame); + private void drawSnapshot(boolean releaseAfterDraw) { final Rect letterboxInsets = mSnapshot.getLetterboxInsets(); - mSizeMismatch = (mFrame.width() != mSnapshotW || mFrame.height() != mSnapshotH) + final boolean sizeMismatch = mContainerW != mSnapshotW || mContainerH != mSnapshotH || letterboxInsets.left != 0 || letterboxInsets.top != 0; - if (!Flags.drawSnapshotAspectRatioMatch() && systemBarInsets != null) { - mSystemBarInsets.set(systemBarInsets); - mSystemBarBackgroundPainter.setInsets(systemBarInsets); - } - } - - private void drawSnapshot(boolean releaseAfterDraw) { - Log.v(TAG, "Drawing snapshot surface sizeMismatch=" + mSizeMismatch); - if (mSizeMismatch) { + Log.v(TAG, "Drawing snapshot surface sizeMismatch=" + sizeMismatch); + if (sizeMismatch) { // The dimensions of the buffer and the window don't match, so attaching the buffer // will fail. Better create a child window with the exact dimensions and fill the // parent window with the background color! @@ -189,11 +157,6 @@ public class SnapshotDrawerUtils { private void drawSizeMismatchSnapshot() { final HardwareBuffer buffer = mSnapshot.getHardwareBuffer(); - // We consider nearly matched dimensions as there can be rounding errors and the user - // won't notice very minute differences from scaling one dimension more than the other - boolean aspectRatioMismatch = !isAspectRatioMatch(mFrame, mSnapshotW, mSnapshotH) - && !Flags.drawSnapshotAspectRatioMatch(); - // Keep a reference to it such that it doesn't get destroyed when finalized. SurfaceControl childSurfaceControl = new SurfaceControl.Builder() .setName(mTitle + " - task-snapshot-surface") @@ -203,166 +166,28 @@ public class SnapshotDrawerUtils { .setCallsite("TaskSnapshotWindow.drawSizeMismatchSnapshot") .build(); - final Rect frame; final Rect letterboxInsets = mSnapshot.getLetterboxInsets(); float offsetX = letterboxInsets.left; float offsetY = letterboxInsets.top; // We can just show the surface here as it will still be hidden as the parent is // still hidden. mTransaction.show(childSurfaceControl); - if (aspectRatioMismatch) { - Rect crop = null; - if (letterboxInsets.left != 0 || letterboxInsets.top != 0 - || letterboxInsets.right != 0 || letterboxInsets.bottom != 0) { - // Clip off letterbox. - crop = calculateSnapshotCrop(letterboxInsets); - // If the snapshot can cover the frame, then no need to draw background. - aspectRatioMismatch = !isAspectRatioMatch(mFrame, crop); - } - // if letterbox doesn't match window frame, try crop by content insets - if (aspectRatioMismatch) { - // Clip off ugly navigation bar. - final Rect contentInsets = mSnapshot.getContentInsets(); - crop = calculateSnapshotCrop(contentInsets); - offsetX = contentInsets.left; - offsetY = contentInsets.top; - } - frame = calculateSnapshotFrame(crop); - mTransaction.setCrop(childSurfaceControl, crop); - } else { - frame = null; - } // Align the snapshot with content area. if (offsetX != 0f || offsetY != 0f) { mTransaction.setPosition(childSurfaceControl, - -offsetX * mFrame.width() / mSnapshot.getTaskSize().x, - -offsetY * mFrame.height() / mSnapshot.getTaskSize().y); + -offsetX * mContainerW / mSnapshot.getTaskSize().x, + -offsetY * mContainerH / mSnapshot.getTaskSize().y); } // Scale the mismatch dimensions to fill the target frame. - final float scaleX = (float) mFrame.width() / mSnapshotW; - final float scaleY = (float) mFrame.height() / mSnapshotH; + final float scaleX = (float) mContainerW / mSnapshotW; + final float scaleY = (float) mContainerH / mSnapshotH; mTransaction.setScale(childSurfaceControl, scaleX, scaleY); mTransaction.setColorSpace(childSurfaceControl, mSnapshot.getColorSpace()); mTransaction.setBuffer(childSurfaceControl, mSnapshot.getHardwareBuffer()); - - if (aspectRatioMismatch) { - GraphicBuffer background = GraphicBuffer.create(mFrame.width(), mFrame.height(), - PixelFormat.RGBA_8888, - GraphicBuffer.USAGE_HW_TEXTURE | GraphicBuffer.USAGE_HW_COMPOSER - | GraphicBuffer.USAGE_SW_WRITE_RARELY); - final Canvas c = background != null ? background.lockCanvas() : null; - if (c == null) { - Log.e(TAG, "Unable to draw snapshot: failed to allocate graphic buffer for " - + mTitle); - mTransaction.clear(); - childSurfaceControl.release(); - return; - } - drawBackgroundAndBars(c, frame); - background.unlockCanvasAndPost(c); - mTransaction.setBuffer(mRootSurface, - HardwareBuffer.createFromGraphicBuffer(background)); - } mTransaction.apply(); childSurfaceControl.release(); } - - /** - * Calculates the snapshot crop in snapshot coordinate space. - * @param insets Content insets or Letterbox insets - * @return crop rect in snapshot coordinate space. - */ - @VisibleForTesting - public Rect calculateSnapshotCrop(@NonNull Rect insets) { - final Rect rect = new Rect(); - rect.set(0, 0, mSnapshotW, mSnapshotH); - - final float scaleX = (float) mSnapshotW / mSnapshot.getTaskSize().x; - final float scaleY = (float) mSnapshotH / mSnapshot.getTaskSize().y; - - // Let's remove all system decorations except the status bar, but only if the task is at - // the very top of the screen. - final boolean isTop = mFrame.top == 0; - rect.inset((int) (insets.left * scaleX), - isTop ? 0 : (int) (insets.top * scaleY), - (int) (insets.right * scaleX), - (int) (insets.bottom * scaleY)); - return rect; - } - - /** - * Calculates the snapshot frame in window coordinate space from crop. - * - * @param crop rect that is in snapshot coordinate space. - */ - @VisibleForTesting - public Rect calculateSnapshotFrame(Rect crop) { - final float scaleX = (float) mSnapshotW / mSnapshot.getTaskSize().x; - final float scaleY = (float) mSnapshotH / mSnapshot.getTaskSize().y; - - // Rescale the frame from snapshot to window coordinate space - final Rect frame = new Rect(0, 0, - (int) (crop.width() / scaleX + 0.5f), - (int) (crop.height() / scaleY + 0.5f) - ); - - // However, we also need to make space for the navigation bar on the left side. - frame.offset(mSystemBarInsets.left, 0); - return frame; - } - - /** - * Draw status bar and navigation bar background. - */ - @VisibleForTesting - public void drawBackgroundAndBars(Canvas c, Rect frame) { - final int statusBarHeight = mSystemBarBackgroundPainter.getStatusBarColorViewHeight(); - final boolean fillHorizontally = c.getWidth() > frame.right; - final boolean fillVertically = c.getHeight() > frame.bottom; - if (fillHorizontally) { - c.drawRect(frame.right, alpha(mSystemBarBackgroundPainter.mStatusBarColor) == 0xFF - ? statusBarHeight : 0, c.getWidth(), fillVertically - ? frame.bottom : c.getHeight(), sBackgroundPaint); - } - if (fillVertically) { - c.drawRect(0, frame.bottom, c.getWidth(), c.getHeight(), sBackgroundPaint); - } - mSystemBarBackgroundPainter.drawDecors(c, frame); - } - - /** - * Ask system bar background painter to draw status bar background. - */ - @VisibleForTesting - public void drawStatusBarBackground(Canvas c, @Nullable Rect alreadyDrawnFrame) { - mSystemBarBackgroundPainter.drawStatusBarBackground(c, alreadyDrawnFrame, - mSystemBarBackgroundPainter.getStatusBarColorViewHeight()); - } - - /** - * Ask system bar background painter to draw navigation bar background. - */ - @VisibleForTesting - public void drawNavigationBarBackground(Canvas c) { - mSystemBarBackgroundPainter.drawNavigationBarBackground(c); - } - } - - private static boolean isAspectRatioMatch(Rect frame, int w, int h) { - if (frame.isEmpty()) { - return false; - } - return Math.abs(((float) w / h) - ((float) frame.width() / frame.height())) <= 0.01f; - } - - private static boolean isAspectRatioMatch(Rect frame1, Rect frame2) { - if (frame1.isEmpty() || frame2.isEmpty()) { - return false; - } - return Math.abs( - ((float) frame2.width() / frame2.height()) - - ((float) frame1.width() / frame1.height())) <= 0.01f; } /** @@ -383,28 +208,15 @@ public class SnapshotDrawerUtils { /** * Help method to draw the snapshot on a surface. */ - public static void drawSnapshotOnSurface(StartingWindowInfo info, WindowManager.LayoutParams lp, + public static void drawSnapshotOnSurface(WindowManager.LayoutParams lp, SurfaceControl rootSurface, TaskSnapshot snapshot, - Rect windowBounds, InsetsState topWindowInsetsState, - boolean releaseAfterDraw) { + Rect windowBounds, boolean releaseAfterDraw) { if (windowBounds.isEmpty()) { Log.e(TAG, "Unable to draw snapshot on an empty windowBounds"); return; } final SnapshotSurface drawSurface = new SnapshotSurface( - rootSurface, snapshot, lp.getTitle()); - final WindowManager.LayoutParams attrs = Flags.drawSnapshotAspectRatioMatch() - ? info.mainWindowLayoutParams : info.topOpaqueWindowLayoutParams; - final ActivityManager.RunningTaskInfo runningTaskInfo = info.taskInfo; - final ActivityManager.TaskDescription taskDescription = - getOrCreateTaskDescription(runningTaskInfo); - Rect systemBarInsets = null; - if (!Flags.drawSnapshotAspectRatioMatch()) { - drawSurface.initiateSystemBarPainter(lp.flags, lp.privateFlags, - attrs.insetsFlags.appearance, taskDescription, info.requestedVisibleTypes); - systemBarInsets = getSystemBarInsets(windowBounds, topWindowInsetsState); - } - drawSurface.setFrames(windowBounds, systemBarInsets); + rootSurface, snapshot, windowBounds, lp.getTitle()); drawSurface.drawSnapshot(releaseAfterDraw); } @@ -414,10 +226,8 @@ public class SnapshotDrawerUtils { public static WindowManager.LayoutParams createLayoutParameters(StartingWindowInfo info, CharSequence title, @WindowManager.LayoutParams.WindowType int windowType, int pixelFormat, IBinder token) { - final WindowManager.LayoutParams attrs = Flags.drawSnapshotAspectRatioMatch() - ? info.mainWindowLayoutParams : info.topOpaqueWindowLayoutParams; - final WindowManager.LayoutParams mainWindowParams = info.mainWindowLayoutParams; - if (attrs == null || mainWindowParams == null) { + final WindowManager.LayoutParams attrs = info.mainWindowLayoutParams; + if (attrs == null) { Log.w(TAG, "unable to create taskSnapshot surface "); return null; } @@ -427,9 +237,9 @@ public class SnapshotDrawerUtils { final int windowFlags = attrs.flags; final int windowPrivateFlags = attrs.privateFlags; - layoutParams.packageName = mainWindowParams.packageName; - layoutParams.windowAnimations = mainWindowParams.windowAnimations; - layoutParams.dimAmount = mainWindowParams.dimAmount; + layoutParams.packageName = attrs.packageName; + layoutParams.windowAnimations = attrs.windowAnimations; + layoutParams.dimAmount = attrs.dimAmount; layoutParams.type = windowType; layoutParams.format = pixelFormat; layoutParams.flags = (windowFlags & ~FLAG_INHERIT_EXCLUDES) @@ -460,14 +270,6 @@ public class SnapshotDrawerUtils { return layoutParams; } - static Rect getSystemBarInsets(Rect frame, @Nullable InsetsState state) { - if (state == null) { - return new Rect(); - } - return state.calculateInsets(frame, WindowInsets.Type.systemBars(), - false /* ignoreVisibility */).toRect(); - } - /** * Helper class to draw the background of the system bars in regions the task snapshot isn't * filling the window. diff --git a/core/java/android/window/StartingWindowInfo.java b/core/java/android/window/StartingWindowInfo.java index 72df343a2dbe..80ccbddbd1d9 100644 --- a/core/java/android/window/StartingWindowInfo.java +++ b/core/java/android/window/StartingWindowInfo.java @@ -27,7 +27,6 @@ import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; -import android.view.InsetsState; import android.view.SurfaceControl; import android.view.WindowInsets; import android.view.WindowInsets.Type.InsetsType; @@ -100,20 +99,6 @@ public final class StartingWindowInfo implements Parcelable { public ActivityInfo targetActivityInfo; /** - * InsetsState of TopFullscreenOpaqueWindow - * @hide - */ - @Nullable - public InsetsState topOpaqueWindowInsetsState; - - /** - * LayoutParams of TopFullscreenOpaqueWindow - * @hide - */ - @Nullable - public WindowManager.LayoutParams topOpaqueWindowLayoutParams; - - /** * LayoutParams of MainWindow * @hide */ @@ -263,8 +248,6 @@ public final class StartingWindowInfo implements Parcelable { taskBounds.writeToParcel(dest, flags); dest.writeTypedObject(targetActivityInfo, flags); dest.writeInt(startingWindowTypeParameter); - dest.writeTypedObject(topOpaqueWindowInsetsState, flags); - dest.writeTypedObject(topOpaqueWindowLayoutParams, flags); dest.writeTypedObject(mainWindowLayoutParams, flags); dest.writeInt(splashScreenThemeResId); dest.writeBoolean(isKeyguardOccluded); @@ -280,9 +263,6 @@ public final class StartingWindowInfo implements Parcelable { taskBounds.readFromParcel(source); targetActivityInfo = source.readTypedObject(ActivityInfo.CREATOR); startingWindowTypeParameter = source.readInt(); - topOpaqueWindowInsetsState = source.readTypedObject(InsetsState.CREATOR); - topOpaqueWindowLayoutParams = source.readTypedObject( - WindowManager.LayoutParams.CREATOR); mainWindowLayoutParams = source.readTypedObject(WindowManager.LayoutParams.CREATOR); splashScreenThemeResId = source.readInt(); isKeyguardOccluded = source.readBoolean(); @@ -302,8 +282,6 @@ public final class StartingWindowInfo implements Parcelable { + " topActivityType=" + taskInfo.topActivityType + " preferredStartingWindowType=" + Integer.toHexString(startingWindowTypeParameter) - + " insetsState=" + topOpaqueWindowInsetsState - + " topWindowLayoutParams=" + topOpaqueWindowLayoutParams + " mainWindowLayoutParams=" + mainWindowLayoutParams + " splashScreenThemeResId " + Integer.toHexString(splashScreenThemeResId); } diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig index 30f0c7371270..a384b0f8b6cc 100644 --- a/core/java/android/window/flags/windowing_frontend.aconfig +++ b/core/java/android/window/flags/windowing_frontend.aconfig @@ -273,17 +273,6 @@ flag { } flag { - name: "draw_snapshot_aspect_ratio_match" - namespace: "windowing_frontend" - description: "The aspect ratio should always match when drawing snapshot" - bug: "341020277" - is_fixed_read_only: true - metadata { - purpose: PURPOSE_BUGFIX - } -} - -flag { name: "system_ui_post_animation_end" namespace: "windowing_frontend" description: "Run AnimatorListener#onAnimationEnd on next frame for SystemUI" diff --git a/core/tests/coretests/src/android/window/SnapshotDrawerUtilsTest.java b/core/tests/coretests/src/android/window/SnapshotDrawerUtilsTest.java index fdc00ba65255..610758d378de 100644 --- a/core/tests/coretests/src/android/window/SnapshotDrawerUtilsTest.java +++ b/core/tests/coretests/src/android/window/SnapshotDrawerUtilsTest.java @@ -16,8 +16,6 @@ package android.window; -import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; -import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; import static org.junit.Assert.assertEquals; @@ -30,15 +28,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.ActivityManager.TaskDescription; -import android.content.ComponentName; import android.graphics.Canvas; import android.graphics.Color; -import android.graphics.ColorSpace; -import android.graphics.Point; import android.graphics.Rect; -import android.hardware.HardwareBuffer; -import android.view.Surface; -import android.view.SurfaceControl; import android.view.WindowInsets; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -54,7 +46,7 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class SnapshotDrawerUtilsTest { - private SnapshotDrawerUtils.SnapshotSurface mSnapshotSurface; + private SnapshotDrawerUtils.SystemBarBackgroundPainter mSystemBarBackgroundPainter; private void setupSurface(int width, int height) { setupSurface(width, height, new Rect(), FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, @@ -70,31 +62,14 @@ public class SnapshotDrawerUtilsTest { // taskBounds assertEquals(width, taskBounds.width()); assertEquals(height, taskBounds.height()); - Point taskSize = new Point(taskBounds.width(), taskBounds.height()); - final TaskSnapshot snapshot = createTaskSnapshot(width, height, taskSize, contentInsets); TaskDescription taskDescription = createTaskDescription(Color.WHITE, Color.RED, Color.BLUE); - mSnapshotSurface = new SnapshotDrawerUtils.SnapshotSurface( - new SurfaceControl(), snapshot, "Test"); - mSnapshotSurface.initiateSystemBarPainter(windowFlags, 0, 0, - taskDescription, WindowInsets.Type.defaultVisible()); - } - - private TaskSnapshot createTaskSnapshot(int width, int height, Point taskSize, - Rect contentInsets) { - final HardwareBuffer buffer = HardwareBuffer.create(width, height, HardwareBuffer.RGBA_8888, - 1, HardwareBuffer.USAGE_CPU_READ_RARELY); - return new TaskSnapshot( - System.currentTimeMillis(), - 0 /* captureTime */, - new ComponentName("", ""), buffer, - ColorSpace.get(ColorSpace.Named.SRGB), ORIENTATION_PORTRAIT, - Surface.ROTATION_0, taskSize, contentInsets, new Rect() /* letterboxInsets */, - false, true /* isRealSnapshot */, WINDOWING_MODE_FULLSCREEN, - 0 /* systemUiVisibility */, false /* isTranslucent */, false /* hasImeSurface */, - 0 /* uiMode */); + mSystemBarBackgroundPainter = new SnapshotDrawerUtils.SystemBarBackgroundPainter( + windowFlags, 0 /* windowPrivateFlags */, 0 /* appearance */, + taskDescription, 1f /* scale */, WindowInsets.Type.defaultVisible()); + mSystemBarBackgroundPainter.setInsets(contentInsets); } private static TaskDescription createTaskDescription(int background, @@ -107,134 +82,14 @@ public class SnapshotDrawerUtilsTest { } @Test - public void fillEmptyBackground_fillHorizontally() { - setupSurface(200, 100); - final Canvas mockCanvas = mock(Canvas.class); - when(mockCanvas.getWidth()).thenReturn(200); - when(mockCanvas.getHeight()).thenReturn(100); - mSnapshotSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 200)); - verify(mockCanvas).drawRect(eq(100.0f), eq(0.0f), eq(200.0f), eq(100.0f), any()); - } - - @Test - public void fillEmptyBackground_fillVertically() { - setupSurface(100, 200); - final Canvas mockCanvas = mock(Canvas.class); - when(mockCanvas.getWidth()).thenReturn(100); - when(mockCanvas.getHeight()).thenReturn(200); - mSnapshotSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 200, 100)); - verify(mockCanvas).drawRect(eq(0.0f), eq(100.0f), eq(100.0f), eq(200.0f), any()); - } - - @Test - public void fillEmptyBackground_fillBoth() { - setupSurface(200, 200); - final Canvas mockCanvas = mock(Canvas.class); - when(mockCanvas.getWidth()).thenReturn(200); - when(mockCanvas.getHeight()).thenReturn(200); - mSnapshotSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 100)); - verify(mockCanvas).drawRect(eq(100.0f), eq(0.0f), eq(200.0f), eq(100.0f), any()); - verify(mockCanvas).drawRect(eq(0.0f), eq(100.0f), eq(200.0f), eq(200.0f), any()); - } - - @Test - public void fillEmptyBackground_dontFill_sameSize() { - setupSurface(100, 100); - final Canvas mockCanvas = mock(Canvas.class); - when(mockCanvas.getWidth()).thenReturn(100); - when(mockCanvas.getHeight()).thenReturn(100); - mSnapshotSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 100)); - verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any()); - } - - @Test - public void fillEmptyBackground_dontFill_bitmapLarger() { - setupSurface(100, 100); - final Canvas mockCanvas = mock(Canvas.class); - when(mockCanvas.getWidth()).thenReturn(100); - when(mockCanvas.getHeight()).thenReturn(100); - mSnapshotSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 200, 200)); - verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any()); - } - - @Test - public void testCalculateSnapshotCrop() { - final Rect contentInsets = new Rect(0, 10, 0, 10); - setupSurface(100, 100, contentInsets, 0, new Rect(0, 0, 100, 100)); - assertEquals(new Rect(0, 0, 100, 90), - mSnapshotSurface.calculateSnapshotCrop(contentInsets)); - } - - @Test - public void testCalculateSnapshotCrop_taskNotOnTop() { - final Rect contentInsets = new Rect(0, 10, 0, 10); - final Rect bounds = new Rect(0, 50, 100, 150); - setupSurface(100, 100, contentInsets, 0, bounds); - mSnapshotSurface.setFrames(bounds, contentInsets); - assertEquals(new Rect(0, 10, 100, 90), - mSnapshotSurface.calculateSnapshotCrop(contentInsets)); - } - - @Test - public void testCalculateSnapshotCrop_navBarLeft() { - final Rect contentInsets = new Rect(10, 0, 0, 0); - setupSurface(100, 100, contentInsets, 0, new Rect(0, 0, 100, 100)); - assertEquals(new Rect(10, 0, 100, 100), - mSnapshotSurface.calculateSnapshotCrop(contentInsets)); - } - - @Test - public void testCalculateSnapshotCrop_navBarRight() { - final Rect contentInsets = new Rect(0, 10, 10, 0); - setupSurface(100, 100, contentInsets, 0, new Rect(0, 0, 100, 100)); - assertEquals(new Rect(0, 0, 90, 100), - mSnapshotSurface.calculateSnapshotCrop(contentInsets)); - } - - @Test - public void testCalculateSnapshotCrop_waterfall() { - final Rect contentInsets = new Rect(5, 10, 5, 10); - setupSurface(100, 100, contentInsets, 0, new Rect(0, 0, 100, 100)); - assertEquals(new Rect(5, 0, 95, 90), - mSnapshotSurface.calculateSnapshotCrop(contentInsets)); - } - - @Test - public void testCalculateSnapshotFrame() { - setupSurface(100, 100); - final Rect insets = new Rect(0, 10, 0, 10); - mSnapshotSurface.setFrames(new Rect(0, 0, 100, 100), insets); - assertEquals(new Rect(0, 0, 100, 80), - mSnapshotSurface.calculateSnapshotFrame(new Rect(0, 10, 100, 90))); - } - - @Test - public void testCalculateSnapshotFrame_navBarLeft() { - setupSurface(100, 100); - final Rect insets = new Rect(10, 10, 0, 0); - mSnapshotSurface.setFrames(new Rect(0, 0, 100, 100), insets); - assertEquals(new Rect(10, 0, 100, 90), - mSnapshotSurface.calculateSnapshotFrame(new Rect(10, 10, 100, 100))); - } - - @Test - public void testCalculateSnapshotFrame_waterfall() { - setupSurface(100, 100, new Rect(5, 10, 5, 10), 0, new Rect(0, 0, 100, 100)); - final Rect insets = new Rect(0, 10, 0, 10); - mSnapshotSurface.setFrames(new Rect(5, 0, 95, 100), insets); - assertEquals(new Rect(0, 0, 90, 90), - mSnapshotSurface.calculateSnapshotFrame(new Rect(5, 0, 95, 90))); - } - - @Test public void testDrawStatusBarBackground() { setupSurface(100, 100); final Rect insets = new Rect(0, 10, 10, 0); - mSnapshotSurface.setFrames(new Rect(0, 0, 100, 100), insets); + mSystemBarBackgroundPainter.setInsets(insets); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(100); when(mockCanvas.getHeight()).thenReturn(100); - mSnapshotSurface.drawStatusBarBackground(mockCanvas, new Rect(0, 0, 50, 100)); + mSystemBarBackgroundPainter.drawDecors(mockCanvas, new Rect(0, 0, 50, 100)); verify(mockCanvas).drawRect(eq(50.0f), eq(0.0f), eq(90.0f), eq(10.0f), any()); } @@ -242,11 +97,11 @@ public class SnapshotDrawerUtilsTest { public void testDrawStatusBarBackground_nullFrame() { setupSurface(100, 100); final Rect insets = new Rect(0, 10, 10, 0); - mSnapshotSurface.setFrames(new Rect(0, 0, 100, 100), insets); + mSystemBarBackgroundPainter.setInsets(insets); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(100); when(mockCanvas.getHeight()).thenReturn(100); - mSnapshotSurface.drawStatusBarBackground(mockCanvas, null); + mSystemBarBackgroundPainter.drawDecors(mockCanvas, null /* alreadyDrawnFrame */); verify(mockCanvas).drawRect(eq(0.0f), eq(0.0f), eq(90.0f), eq(10.0f), any()); } @@ -254,11 +109,11 @@ public class SnapshotDrawerUtilsTest { public void testDrawStatusBarBackground_nope() { setupSurface(100, 100); final Rect insets = new Rect(0, 10, 10, 0); - mSnapshotSurface.setFrames(new Rect(0, 0, 100, 100), insets); + mSystemBarBackgroundPainter.setInsets(insets); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(100); when(mockCanvas.getHeight()).thenReturn(100); - mSnapshotSurface.drawStatusBarBackground(mockCanvas, new Rect(0, 0, 100, 100)); + mSystemBarBackgroundPainter.drawDecors(mockCanvas, new Rect(0, 0, 100, 100)); verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any()); } @@ -267,11 +122,11 @@ public class SnapshotDrawerUtilsTest { final Rect insets = new Rect(0, 10, 0, 10); setupSurface(100, 100, insets, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, new Rect(0, 0, 100, 100)); - mSnapshotSurface.setFrames(new Rect(0, 0, 100, 100), insets); + mSystemBarBackgroundPainter.setInsets(insets); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(100); when(mockCanvas.getHeight()).thenReturn(100); - mSnapshotSurface.drawNavigationBarBackground(mockCanvas); + mSystemBarBackgroundPainter.drawDecors(mockCanvas, null /* alreadyDrawnFrame */); verify(mockCanvas).drawRect(eq(new Rect(0, 90, 100, 100)), any()); } @@ -280,11 +135,11 @@ public class SnapshotDrawerUtilsTest { final Rect insets = new Rect(10, 10, 0, 0); setupSurface(100, 100, insets, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, new Rect(0, 0, 100, 100)); - mSnapshotSurface.setFrames(new Rect(0, 0, 100, 100), insets); + mSystemBarBackgroundPainter.setInsets(insets); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(100); when(mockCanvas.getHeight()).thenReturn(100); - mSnapshotSurface.drawNavigationBarBackground(mockCanvas); + mSystemBarBackgroundPainter.drawDecors(mockCanvas, null /* alreadyDrawnFrame */); verify(mockCanvas).drawRect(eq(new Rect(0, 0, 10, 100)), any()); } @@ -293,11 +148,11 @@ public class SnapshotDrawerUtilsTest { final Rect insets = new Rect(0, 10, 10, 0); setupSurface(100, 100, insets, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, new Rect(0, 0, 100, 100)); - mSnapshotSurface.setFrames(new Rect(0, 0, 100, 100), insets); + mSystemBarBackgroundPainter.setInsets(insets); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(100); when(mockCanvas.getHeight()).thenReturn(100); - mSnapshotSurface.drawNavigationBarBackground(mockCanvas); + mSystemBarBackgroundPainter.drawDecors(mockCanvas, null /* alreadyDrawnFrame */); verify(mockCanvas).drawRect(eq(new Rect(90, 0, 100, 100)), any()); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java index 27472493a8bc..0519a5e055be 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java @@ -89,8 +89,6 @@ public class TaskSnapshotWindow { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_STARTING_WINDOW, "create taskSnapshot surface for task: %d", taskId); - final InsetsState topWindowInsetsState = info.topOpaqueWindowInsetsState; - final WindowManager.LayoutParams layoutParams = SnapshotDrawerUtils.createLayoutParameters( info, TITLE_FORMAT + taskId, TYPE_APPLICATION_STARTING, snapshot.getHardwareBuffer().getFormat(), appToken); @@ -152,8 +150,8 @@ public class TaskSnapshotWindow { return null; } - SnapshotDrawerUtils.drawSnapshotOnSurface(info, layoutParams, surfaceControl, snapshot, - info.taskBounds, topWindowInsetsState, true /* releaseAfterDraw */); + SnapshotDrawerUtils.drawSnapshotOnSurface(layoutParams, surfaceControl, snapshot, + info.taskBounds, true /* releaseAfterDraw */); snapshotSurface.mHasDrawn = true; snapshotSurface.reportDrawn(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/WindowlessSnapshotWindowCreator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/WindowlessSnapshotWindowCreator.java index 2a22d4dd0cb5..34d1011bac0e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/WindowlessSnapshotWindowCreator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/WindowlessSnapshotWindowCreator.java @@ -26,7 +26,6 @@ import android.content.Context; import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.view.Display; -import android.view.InsetsState; import android.view.SurfaceControl; import android.view.SurfaceControlViewHost; import android.view.WindowManager; @@ -77,12 +76,11 @@ class WindowlessSnapshotWindowCreator { final SurfaceControlViewHost mViewHost = new SurfaceControlViewHost( mContext, display, wlw, "WindowlessSnapshotWindowCreator"); final Rect windowBounds = runningTaskInfo.configuration.windowConfiguration.getBounds(); - final InsetsState topWindowInsetsState = info.topOpaqueWindowInsetsState; final FrameLayout rootLayout = new FrameLayout( mSplashscreenContentDrawer.createViewContextWrapper(mContext)); mViewHost.setView(rootLayout, lp); - SnapshotDrawerUtils.drawSnapshotOnSurface(info, lp, wlw.mChildSurface, snapshot, - windowBounds, topWindowInsetsState, false /* releaseAfterDraw */); + SnapshotDrawerUtils.drawSnapshotOnSurface(lp, wlw.mChildSurface, snapshot, + windowBounds, false /* releaseAfterDraw */); final ActivityManager.TaskDescription taskDescription = SnapshotDrawerUtils.getOrCreateTaskDescription(runningTaskInfo); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java index ce482cdd9944..4b01d841b824 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawerTests.java @@ -55,7 +55,6 @@ import android.os.IBinder; import android.os.Looper; import android.os.UserHandle; import android.testing.TestableContext; -import android.view.InsetsState; import android.view.Surface; import android.view.WindowManager; import android.view.WindowMetrics; @@ -338,9 +337,7 @@ public class StartingSurfaceDrawerTests extends ShellTestCase { windowInfo.appToken = appToken; windowInfo.targetActivityInfo = info; windowInfo.taskInfo = taskInfo; - windowInfo.topOpaqueWindowInsetsState = new InsetsState(); windowInfo.mainWindowLayoutParams = new WindowManager.LayoutParams(); - windowInfo.topOpaqueWindowLayoutParams = new WindowManager.LayoutParams(); return windowInfo; } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 810aa0454246..47589b80739f 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3593,14 +3593,6 @@ class Task extends TaskFragment { // If the developer has persist a different configuration, we need to override it to the // starting window because persisted configuration does not effect to Task. info.taskInfo.configuration.setTo(activity.getConfiguration()); - if (!Flags.drawSnapshotAspectRatioMatch()) { - final WindowState mainWindow = getTopFullscreenMainWindow(); - if (mainWindow != null) { - info.topOpaqueWindowInsetsState = - mainWindow.getInsetsStateWithVisibilityOverride(); - info.topOpaqueWindowLayoutParams = mainWindow.getAttrs(); - } - } return info; } |