Loading services/core/java/com/android/server/wm/TaskDisplayArea.java +22 −24 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import android.app.ActivityOptions; import android.app.WindowConfiguration; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Color; import android.os.UserHandle; import android.util.IntArray; import android.util.Slog; Loading Loading @@ -81,9 +82,9 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { DisplayContent mDisplayContent; /** * A color layer that serves as a solid color background to certain animations. * Keeps track of the last set color layer so that it can be reset during surface migrations. */ private SurfaceControl mColorBackgroundLayer; private @ColorInt int mBackgroundColor = 0; /** * This counter is used to make sure we don't prematurely clear the background color in the Loading Loading @@ -356,6 +357,14 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } } @Override void setInitialSurfaceControlProperties(SurfaceControl.Builder b) { // We want an effect layer instead of the default container layer so that we can set a // background color on it for task animations. b.setEffectLayer(); super.setInitialSurfaceControlProperties(b); } @Override void addChild(WindowContainer child, int position) { if (child.asTaskDisplayArea() != null) { Loading Loading @@ -875,11 +884,6 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { void onParentChanged(ConfigurationContainer newParent, ConfigurationContainer oldParent) { if (getParent() != null) { super.onParentChanged(newParent, oldParent, () -> { mColorBackgroundLayer = makeChildSurface(null) .setColorLayer() .setName("colorBackgroundLayer") .setCallsite("TaskDisplayArea.onParentChanged") .build(); mSplitScreenDividerAnchor = makeChildSurface(null) .setName("splitScreenDividerAnchor") .setCallsite("TaskDisplayArea.onParentChanged") Loading @@ -891,28 +895,18 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } else { super.onParentChanged(newParent, oldParent); mWmService.mTransactionFactory.get() .remove(mColorBackgroundLayer) .remove(mSplitScreenDividerAnchor) .apply(); mColorBackgroundLayer = null; mSplitScreenDividerAnchor = null; } } void setBackgroundColor(@ColorInt int color) { if (mColorBackgroundLayer == null) { return; } float r = ((color >> 16) & 0xff) / 255.0f; float g = ((color >> 8) & 0xff) / 255.0f; float b = ((color >> 0) & 0xff) / 255.0f; void setBackgroundColor(@ColorInt int colorInt) { mBackgroundColor = colorInt; Color color = Color.valueOf(colorInt); mColorLayerCounter++; getPendingTransaction() .setColor(mColorBackgroundLayer, new float[]{r, g, b}) .show(mColorBackgroundLayer); .setColor(mSurfaceControl, new float[]{color.red(), color.green(), color.blue()}); scheduleAnimation(); } Loading @@ -923,7 +917,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { // Only clear the color layer if we have received the same amounts of clear as set // requests. if (mColorLayerCounter == 0) { getPendingTransaction().hide(mColorBackgroundLayer); getPendingTransaction().unsetColor(mSurfaceControl); scheduleAnimation(); } } Loading @@ -931,12 +925,16 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { @Override void migrateToNewSurfaceControl(SurfaceControl.Transaction t) { super.migrateToNewSurfaceControl(t); if (mColorBackgroundLayer == null) { if (mColorLayerCounter > 0) { setBackgroundColor(mBackgroundColor); } if (mSplitScreenDividerAnchor == null) { return; } // As TaskDisplayArea is getting a new surface, reparent and reorder the child surfaces. t.reparent(mColorBackgroundLayer, mSurfaceControl); t.reparent(mSplitScreenDividerAnchor, mSurfaceControl); reassignLayer(t); scheduleAnimation(); Loading Loading
services/core/java/com/android/server/wm/TaskDisplayArea.java +22 −24 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import android.app.ActivityOptions; import android.app.WindowConfiguration; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Color; import android.os.UserHandle; import android.util.IntArray; import android.util.Slog; Loading Loading @@ -81,9 +82,9 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { DisplayContent mDisplayContent; /** * A color layer that serves as a solid color background to certain animations. * Keeps track of the last set color layer so that it can be reset during surface migrations. */ private SurfaceControl mColorBackgroundLayer; private @ColorInt int mBackgroundColor = 0; /** * This counter is used to make sure we don't prematurely clear the background color in the Loading Loading @@ -356,6 +357,14 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } } @Override void setInitialSurfaceControlProperties(SurfaceControl.Builder b) { // We want an effect layer instead of the default container layer so that we can set a // background color on it for task animations. b.setEffectLayer(); super.setInitialSurfaceControlProperties(b); } @Override void addChild(WindowContainer child, int position) { if (child.asTaskDisplayArea() != null) { Loading Loading @@ -875,11 +884,6 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { void onParentChanged(ConfigurationContainer newParent, ConfigurationContainer oldParent) { if (getParent() != null) { super.onParentChanged(newParent, oldParent, () -> { mColorBackgroundLayer = makeChildSurface(null) .setColorLayer() .setName("colorBackgroundLayer") .setCallsite("TaskDisplayArea.onParentChanged") .build(); mSplitScreenDividerAnchor = makeChildSurface(null) .setName("splitScreenDividerAnchor") .setCallsite("TaskDisplayArea.onParentChanged") Loading @@ -891,28 +895,18 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } else { super.onParentChanged(newParent, oldParent); mWmService.mTransactionFactory.get() .remove(mColorBackgroundLayer) .remove(mSplitScreenDividerAnchor) .apply(); mColorBackgroundLayer = null; mSplitScreenDividerAnchor = null; } } void setBackgroundColor(@ColorInt int color) { if (mColorBackgroundLayer == null) { return; } float r = ((color >> 16) & 0xff) / 255.0f; float g = ((color >> 8) & 0xff) / 255.0f; float b = ((color >> 0) & 0xff) / 255.0f; void setBackgroundColor(@ColorInt int colorInt) { mBackgroundColor = colorInt; Color color = Color.valueOf(colorInt); mColorLayerCounter++; getPendingTransaction() .setColor(mColorBackgroundLayer, new float[]{r, g, b}) .show(mColorBackgroundLayer); .setColor(mSurfaceControl, new float[]{color.red(), color.green(), color.blue()}); scheduleAnimation(); } Loading @@ -923,7 +917,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { // Only clear the color layer if we have received the same amounts of clear as set // requests. if (mColorLayerCounter == 0) { getPendingTransaction().hide(mColorBackgroundLayer); getPendingTransaction().unsetColor(mSurfaceControl); scheduleAnimation(); } } Loading @@ -931,12 +925,16 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { @Override void migrateToNewSurfaceControl(SurfaceControl.Transaction t) { super.migrateToNewSurfaceControl(t); if (mColorBackgroundLayer == null) { if (mColorLayerCounter > 0) { setBackgroundColor(mBackgroundColor); } if (mSplitScreenDividerAnchor == null) { return; } // As TaskDisplayArea is getting a new surface, reparent and reorder the child surfaces. t.reparent(mColorBackgroundLayer, mSurfaceControl); t.reparent(mSplitScreenDividerAnchor, mSurfaceControl); reassignLayer(t); scheduleAnimation(); Loading