Merge "Draw background color above display area..." into udc-dev

This commit is contained in:
Wei Sheng Shih
2023-06-07 02:09:56 +00:00
committed by Android (Google) Code Review
3 changed files with 51 additions and 21 deletions

View File

@@ -70,6 +70,8 @@ import com.android.wm.shell.draganddrop.DragAndDropController;
import com.android.wm.shell.freeform.FreeformComponents; import com.android.wm.shell.freeform.FreeformComponents;
import com.android.wm.shell.fullscreen.FullscreenTaskListener; import com.android.wm.shell.fullscreen.FullscreenTaskListener;
import com.android.wm.shell.hidedisplaycutout.HideDisplayCutoutController; import com.android.wm.shell.hidedisplaycutout.HideDisplayCutoutController;
import com.android.wm.shell.keyguard.KeyguardTransitionHandler;
import com.android.wm.shell.keyguard.KeyguardTransitions;
import com.android.wm.shell.onehanded.OneHanded; import com.android.wm.shell.onehanded.OneHanded;
import com.android.wm.shell.onehanded.OneHandedController; import com.android.wm.shell.onehanded.OneHandedController;
import com.android.wm.shell.pip.Pip; import com.android.wm.shell.pip.Pip;
@@ -77,8 +79,6 @@ import com.android.wm.shell.pip.PipMediaController;
import com.android.wm.shell.pip.PipSurfaceTransactionHelper; import com.android.wm.shell.pip.PipSurfaceTransactionHelper;
import com.android.wm.shell.pip.PipUiEventLogger; import com.android.wm.shell.pip.PipUiEventLogger;
import com.android.wm.shell.pip.phone.PipTouchHandler; import com.android.wm.shell.pip.phone.PipTouchHandler;
import com.android.wm.shell.keyguard.KeyguardTransitionHandler;
import com.android.wm.shell.keyguard.KeyguardTransitions;
import com.android.wm.shell.recents.RecentTasks; import com.android.wm.shell.recents.RecentTasks;
import com.android.wm.shell.recents.RecentTasksController; import com.android.wm.shell.recents.RecentTasksController;
import com.android.wm.shell.recents.RecentsTransitionHandler; import com.android.wm.shell.recents.RecentsTransitionHandler;
@@ -102,13 +102,13 @@ import com.android.wm.shell.unfold.UnfoldAnimationController;
import com.android.wm.shell.unfold.UnfoldTransitionHandler; import com.android.wm.shell.unfold.UnfoldTransitionHandler;
import com.android.wm.shell.windowdecor.WindowDecorViewModel; import com.android.wm.shell.windowdecor.WindowDecorViewModel;
import java.util.Optional;
import dagger.BindsOptionalOf; import dagger.BindsOptionalOf;
import dagger.Lazy; import dagger.Lazy;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import java.util.Optional;
/** /**
* Provides basic dependencies from {@link com.android.wm.shell}, these dependencies are only * Provides basic dependencies from {@link com.android.wm.shell}, these dependencies are only
* accessible from components within the WM subcomponent (can be explicitly exposed to the * accessible from components within the WM subcomponent (can be explicitly exposed to the
@@ -548,13 +548,15 @@ public abstract class WMShellBaseModule {
@ShellMainThread ShellExecutor mainExecutor, @ShellMainThread ShellExecutor mainExecutor,
@ShellMainThread Handler mainHandler, @ShellMainThread Handler mainHandler,
@ShellAnimationThread ShellExecutor animExecutor, @ShellAnimationThread ShellExecutor animExecutor,
ShellCommandHandler shellCommandHandler) { ShellCommandHandler shellCommandHandler,
RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer) {
if (!context.getResources().getBoolean(R.bool.config_registerShellTransitionsOnInit)) { if (!context.getResources().getBoolean(R.bool.config_registerShellTransitionsOnInit)) {
// TODO(b/238217847): Force override shell init if registration is disabled // TODO(b/238217847): Force override shell init if registration is disabled
shellInit = new ShellInit(mainExecutor); shellInit = new ShellInit(mainExecutor);
} }
return new Transitions(context, shellInit, shellController, organizer, pool, return new Transitions(context, shellInit, shellController, organizer, pool,
displayController, mainExecutor, mainHandler, animExecutor, shellCommandHandler); displayController, mainExecutor, mainHandler, animExecutor, shellCommandHandler,
rootTaskDisplayAreaOrganizer);
} }
@WMSingleton @WMSingleton

View File

@@ -58,7 +58,6 @@ import static com.android.internal.policy.TransitionAnimation.WALLPAPER_TRANSITI
import static com.android.internal.policy.TransitionAnimation.WALLPAPER_TRANSITION_INTRA_OPEN; import static com.android.internal.policy.TransitionAnimation.WALLPAPER_TRANSITION_INTRA_OPEN;
import static com.android.internal.policy.TransitionAnimation.WALLPAPER_TRANSITION_NONE; import static com.android.internal.policy.TransitionAnimation.WALLPAPER_TRANSITION_NONE;
import static com.android.internal.policy.TransitionAnimation.WALLPAPER_TRANSITION_OPEN; import static com.android.internal.policy.TransitionAnimation.WALLPAPER_TRANSITION_OPEN;
import static com.android.wm.shell.transition.TransitionAnimationHelper.addBackgroundToTransition;
import static com.android.wm.shell.transition.TransitionAnimationHelper.edgeExtendWindow; import static com.android.wm.shell.transition.TransitionAnimationHelper.edgeExtendWindow;
import static com.android.wm.shell.transition.TransitionAnimationHelper.getTransitionBackgroundColorIfSet; import static com.android.wm.shell.transition.TransitionAnimationHelper.getTransitionBackgroundColorIfSet;
import static com.android.wm.shell.transition.TransitionAnimationHelper.loadAttributeAnimation; import static com.android.wm.shell.transition.TransitionAnimationHelper.loadAttributeAnimation;
@@ -76,6 +75,7 @@ import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.graphics.Color;
import android.graphics.Insets; import android.graphics.Insets;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
@@ -103,6 +103,7 @@ import com.android.internal.policy.AttributeCache;
import com.android.internal.policy.ScreenDecorationsUtils; import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.internal.policy.TransitionAnimation; import com.android.internal.policy.TransitionAnimation;
import com.android.internal.protolog.common.ProtoLog; import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
@@ -137,6 +138,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
private final Rect mInsets = new Rect(0, 0, 0, 0); private final Rect mInsets = new Rect(0, 0, 0, 0);
private float mTransitionAnimationScaleSetting = 1.0f; private float mTransitionAnimationScaleSetting = 1.0f;
private final RootTaskDisplayAreaOrganizer mRootTDAOrganizer;
private final int mCurrentUserId; private final int mCurrentUserId;
private Drawable mEnterpriseThumbnailDrawable; private Drawable mEnterpriseThumbnailDrawable;
@@ -157,7 +159,8 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
@NonNull DisplayController displayController, @NonNull DisplayController displayController,
@NonNull TransactionPool transactionPool, @NonNull TransactionPool transactionPool,
@NonNull ShellExecutor mainExecutor, @NonNull Handler mainHandler, @NonNull ShellExecutor mainExecutor, @NonNull Handler mainHandler,
@NonNull ShellExecutor animExecutor) { @NonNull ShellExecutor animExecutor,
@NonNull RootTaskDisplayAreaOrganizer rootTDAOrganizer) {
mDisplayController = displayController; mDisplayController = displayController;
mTransactionPool = transactionPool; mTransactionPool = transactionPool;
mContext = context; mContext = context;
@@ -168,6 +171,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
mCurrentUserId = UserHandle.myUserId(); mCurrentUserId = UserHandle.myUserId();
mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class); mDevicePolicyManager = mContext.getSystemService(DevicePolicyManager.class);
shellInit.addInitCallback(this::onInit, this); shellInit.addInitCallback(this::onInit, this);
mRootTDAOrganizer = rootTDAOrganizer;
} }
private void onInit() { private void onInit() {
@@ -510,10 +514,8 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
} }
if (backgroundColorForTransition != 0) { if (backgroundColorForTransition != 0) {
for (int i = 0; i < info.getRootCount(); ++i) { addBackgroundColorOnTDA(info, backgroundColorForTransition, startTransaction,
addBackgroundToTransition(info.getRoot(i).getLeash(), backgroundColorForTransition, finishTransaction);
startTransaction, finishTransaction);
}
} }
if (postStartTransactionCallbacks.size() > 0) { if (postStartTransactionCallbacks.size() > 0) {
@@ -543,6 +545,28 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
return true; return true;
} }
private void addBackgroundColorOnTDA(@NonNull TransitionInfo info,
@ColorInt int color, @NonNull SurfaceControl.Transaction startTransaction,
@NonNull SurfaceControl.Transaction finishTransaction) {
final Color bgColor = Color.valueOf(color);
final float[] colorArray = new float[] { bgColor.red(), bgColor.green(), bgColor.blue() };
for (int i = 0; i < info.getRootCount(); ++i) {
final int displayId = info.getRoot(i).getDisplayId();
final SurfaceControl.Builder colorLayerBuilder = new SurfaceControl.Builder()
.setName("animation-background")
.setCallsite("DefaultTransitionHandler")
.setColorLayer();
mRootTDAOrganizer.attachToDisplayArea(displayId, colorLayerBuilder);
final SurfaceControl backgroundSurface = colorLayerBuilder.build();
startTransaction.setColor(backgroundSurface, colorArray)
.setLayer(backgroundSurface, -1)
.show(backgroundSurface);
finishTransaction.remove(backgroundSurface);
}
}
private static boolean isDreamTransition(@NonNull TransitionInfo info) { private static boolean isDreamTransition(@NonNull TransitionInfo info) {
for (int i = info.getChanges().size() - 1; i >= 0; --i) { for (int i = info.getChanges().size() - 1; i >= 0; --i) {
final TransitionInfo.Change change = info.getChanges().get(i); final TransitionInfo.Change change = info.getChanges().get(i);
@@ -886,17 +910,18 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
} }
private static void applyTransformation(long time, SurfaceControl.Transaction t, private static void applyTransformation(long time, SurfaceControl.Transaction t,
SurfaceControl leash, Animation anim, Transformation transformation, float[] matrix, SurfaceControl leash, Animation anim, Transformation tmpTransformation, float[] matrix,
Point position, float cornerRadius, @Nullable Rect immutableClipRect) { Point position, float cornerRadius, @Nullable Rect immutableClipRect) {
anim.getTransformation(time, transformation); tmpTransformation.clear();
anim.getTransformation(time, tmpTransformation);
if (position != null) { if (position != null) {
transformation.getMatrix().postTranslate(position.x, position.y); tmpTransformation.getMatrix().postTranslate(position.x, position.y);
} }
t.setMatrix(leash, transformation.getMatrix(), matrix); t.setMatrix(leash, tmpTransformation.getMatrix(), matrix);
t.setAlpha(leash, transformation.getAlpha()); t.setAlpha(leash, tmpTransformation.getAlpha());
final Rect clipRect = immutableClipRect == null ? null : new Rect(immutableClipRect); final Rect clipRect = immutableClipRect == null ? null : new Rect(immutableClipRect);
Insets extensionInsets = Insets.min(transformation.getInsets(), Insets.NONE); Insets extensionInsets = Insets.min(tmpTransformation.getInsets(), Insets.NONE);
if (!extensionInsets.equals(Insets.NONE) && clipRect != null && !clipRect.isEmpty()) { if (!extensionInsets.equals(Insets.NONE) && clipRect != null && !clipRect.isEmpty()) {
// Clip out any overflowing edge extension // Clip out any overflowing edge extension
clipRect.inset(extensionInsets); clipRect.inset(extensionInsets);

View File

@@ -69,6 +69,7 @@ import androidx.annotation.BinderThread;
import com.android.internal.R; import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.common.ProtoLog; import com.android.internal.protolog.common.ProtoLog;
import com.android.wm.shell.RootTaskDisplayAreaOrganizer;
import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ExternalInterfaceBinder; import com.android.wm.shell.common.ExternalInterfaceBinder;
import com.android.wm.shell.common.RemoteCallable; import com.android.wm.shell.common.RemoteCallable;
@@ -265,7 +266,8 @@ public class Transitions implements RemoteCallable<Transitions>,
@NonNull Handler mainHandler, @NonNull Handler mainHandler,
@NonNull ShellExecutor animExecutor) { @NonNull ShellExecutor animExecutor) {
this(context, shellInit, shellController, organizer, pool, displayController, mainExecutor, this(context, shellInit, shellController, organizer, pool, displayController, mainExecutor,
mainHandler, animExecutor, null); mainHandler, animExecutor, null,
new RootTaskDisplayAreaOrganizer(mainExecutor, context));
} }
public Transitions(@NonNull Context context, public Transitions(@NonNull Context context,
@@ -277,7 +279,8 @@ public class Transitions implements RemoteCallable<Transitions>,
@NonNull ShellExecutor mainExecutor, @NonNull ShellExecutor mainExecutor,
@NonNull Handler mainHandler, @NonNull Handler mainHandler,
@NonNull ShellExecutor animExecutor, @NonNull ShellExecutor animExecutor,
@Nullable ShellCommandHandler shellCommandHandler) { @Nullable ShellCommandHandler shellCommandHandler,
@NonNull RootTaskDisplayAreaOrganizer rootTDAOrganizer) {
mOrganizer = organizer; mOrganizer = organizer;
mContext = context; mContext = context;
mMainExecutor = mainExecutor; mMainExecutor = mainExecutor;
@@ -285,7 +288,7 @@ public class Transitions implements RemoteCallable<Transitions>,
mDisplayController = displayController; mDisplayController = displayController;
mPlayerImpl = new TransitionPlayerImpl(); mPlayerImpl = new TransitionPlayerImpl();
mDefaultTransitionHandler = new DefaultTransitionHandler(context, shellInit, mDefaultTransitionHandler = new DefaultTransitionHandler(context, shellInit,
displayController, pool, mainExecutor, mainHandler, animExecutor); displayController, pool, mainExecutor, mainHandler, animExecutor, rootTDAOrganizer);
mRemoteTransitionHandler = new RemoteTransitionHandler(mMainExecutor); mRemoteTransitionHandler = new RemoteTransitionHandler(mMainExecutor);
mShellController = shellController; mShellController = shellController;
// The very last handler (0 in the list) should be the default one. // The very last handler (0 in the list) should be the default one.