Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48fd462b authored by Jorge Gil's avatar Jorge Gil
Browse files

Use material3's dynamic color schemes in Resize Veil

Bug: 328668781
Test: resize freeform app, veil color follows app theme regardless of
system theme; atest ResizeVeilTest

Change-Id: I48a28f0e379e2e10a10b51a1e0282df068517dd6
parent 736591ce
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -515,8 +515,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
    private void createResizeVeilIfNeeded() {
        if (mResizeVeil != null) return;
        loadAppInfoIfNeeded();
        mResizeVeil = new ResizeVeil(mContext, mDisplayController, mResizeVeilBitmap, mTaskInfo,
                mTaskSurface, mSurfaceControlTransactionSupplier);
        mResizeVeil = new ResizeVeil(mContext, mDisplayController, mResizeVeilBitmap,
                mTaskSurface, mSurfaceControlTransactionSupplier, mTaskInfo);
    }

    /**
@@ -524,7 +524,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
     */
    public void showResizeVeil(Rect taskBounds) {
        createResizeVeilIfNeeded();
        mResizeVeil.showVeil(mTaskSurface, taskBounds);
        mResizeVeil.showVeil(mTaskSurface, taskBounds, mTaskInfo);
    }

    /**
@@ -532,7 +532,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin
     */
    public void showResizeVeil(SurfaceControl.Transaction tx, Rect taskBounds) {
        createResizeVeilIfNeeded();
        mResizeVeil.showVeil(tx, mTaskSurface, taskBounds, false /* fadeIn */);
        mResizeVeil.showVeil(tx, mTaskSurface, taskBounds, mTaskInfo, false /* fadeIn */);
    }

    /**
+26 −26
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.app.ActivityManager.RunningTaskInfo
import android.content.Context
import android.content.res.Configuration
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.PixelFormat
@@ -36,10 +35,15 @@ import android.view.WindowManager
import android.view.WindowlessWindowManager
import android.widget.ImageView
import android.window.TaskConstants
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.ui.graphics.toArgb
import com.android.wm.shell.R
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.DisplayController.OnDisplaysChangedListener
import com.android.wm.shell.windowdecor.WindowDecoration.SurfaceControlViewHostFactory
import com.android.wm.shell.windowdecor.common.DecorThemeUtil
import com.android.wm.shell.windowdecor.common.Theme
import java.util.function.Supplier

/**
@@ -49,14 +53,18 @@ class ResizeVeil @JvmOverloads constructor(
        private val context: Context,
        private val displayController: DisplayController,
        private val appIcon: Bitmap,
        private val taskInfo: RunningTaskInfo,
        private var parentSurface: SurfaceControl,
        private val surfaceControlTransactionSupplier: Supplier<SurfaceControl.Transaction>,
        private val surfaceControlBuilderFactory: SurfaceControlBuilderFactory =
                object : SurfaceControlBuilderFactory {},
        private val surfaceControlViewHostFactory: SurfaceControlViewHostFactory =
                object : SurfaceControlViewHostFactory {}
                object : SurfaceControlViewHostFactory {},
        taskInfo: RunningTaskInfo,
) {
    private val decorThemeUtil = DecorThemeUtil(context)
    private val lightColors = dynamicLightColorScheme(context)
    private val darkColors = dynamicDarkColorScheme(context)

    private val surfaceSession = SurfaceSession()
    private lateinit var iconView: ImageView
    private var iconSize = 0
@@ -86,18 +94,7 @@ class ResizeVeil @JvmOverloads constructor(
                        return
                    }
                    displayController.removeDisplayWindowListener(this)
                    setupResizeVeil()
                }
            }

    private val backgroundColorId: Int
        get() {
            val configuration = context.resources.configuration
            return if (configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
                    == Configuration.UI_MODE_NIGHT_YES) {
                R.color.desktop_mode_resize_veil_dark
            } else {
                R.color.desktop_mode_resize_veil_light
                    setupResizeVeil(taskInfo)
                }
            }

@@ -108,14 +105,14 @@ class ResizeVeil @JvmOverloads constructor(
        get() = viewHost != null

    init {
        setupResizeVeil()
        setupResizeVeil(taskInfo)
    }

    /**
     * Create the veil in its default invisible state.
     */
    private fun setupResizeVeil() {
        if (!obtainDisplayOrRegisterListener()) {
    private fun setupResizeVeil(taskInfo: RunningTaskInfo) {
        if (!obtainDisplayOrRegisterListener(taskInfo.displayId)) {
            // Display may not be available yet, skip this until then.
            return
        }
@@ -162,8 +159,8 @@ class ResizeVeil @JvmOverloads constructor(
        Trace.endSection()
    }

    private fun obtainDisplayOrRegisterListener(): Boolean {
        display = displayController.getDisplay(taskInfo.displayId)
    private fun obtainDisplayOrRegisterListener(displayId: Int): Boolean {
        display = displayController.getDisplay(displayId)
        if (display == null) {
            displayController.addDisplayWindowListener(onDisplaysChangedListener)
            return false
@@ -184,7 +181,8 @@ class ResizeVeil @JvmOverloads constructor(
            t: SurfaceControl.Transaction,
            parent: SurfaceControl,
            taskBounds: Rect,
            fadeIn: Boolean
            taskInfo: RunningTaskInfo,
            fadeIn: Boolean,
    ) {
        if (!isReady || isVisible) {
            t.apply()
@@ -202,13 +200,15 @@ class ResizeVeil @JvmOverloads constructor(
            parentSurface = parent
        }


        val backgroundColor = when (decorThemeUtil.getAppTheme(taskInfo)) {
            Theme.LIGHT -> lightColors.surfaceContainer
            Theme.DARK -> darkColors.surfaceContainer
        }
        t.show(veil)
                .setLayer(veil, VEIL_CONTAINER_LAYER)
                .setLayer(icon, VEIL_ICON_LAYER)
                .setLayer(background, VEIL_BACKGROUND_LAYER)
                .setColor(background,
                        Color.valueOf(context.getColor(backgroundColorId)).components)
                .setColor(background, Color.valueOf(backgroundColor.toArgb()).components)
        relayout(taskBounds, t)
        if (fadeIn) {
            cancelAnimation()
@@ -270,12 +270,12 @@ class ResizeVeil @JvmOverloads constructor(
    /**
     * Animate veil's alpha to 1, fading it in.
     */
    fun showVeil(parentSurface: SurfaceControl, taskBounds: Rect) {
    fun showVeil(parentSurface: SurfaceControl, taskBounds: Rect, taskInfo: RunningTaskInfo) {
        if (!isReady || isVisible) {
            return
        }
        val t = surfaceControlTransactionSupplier.get()
        showVeil(t, parentSurface, taskBounds, true /* fadeIn */)
        showVeil(t, parentSurface, taskBounds, taskInfo, true /* fadeIn */)
    }

    /**
+13 −7
Original line number Diff line number Diff line
@@ -150,7 +150,7 @@ class ResizeVeilTest : ShellTestCase() {
    fun showVeil() {
        val veil = createResizeVeil()

        veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), false /* fadeIn */)
        veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), taskInfo, false /* fadeIn */)

        verify(mockTransaction).show(mockResizeVeilSurface)
        verify(mockTransaction).show(mockBackgroundSurface)
@@ -162,7 +162,7 @@ class ResizeVeilTest : ShellTestCase() {
    fun showVeil_displayUnavailable_doesNotShow() {
        val veil = createResizeVeil(withDisplayAvailable = false)

        veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), false /* fadeIn */)
        veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), taskInfo, false /* fadeIn */)

        verify(mockTransaction, never()).show(mockResizeVeilSurface)
        verify(mockTransaction, never()).show(mockBackgroundSurface)
@@ -174,8 +174,8 @@ class ResizeVeilTest : ShellTestCase() {
    fun showVeil_alreadyVisible_doesNotShowAgain() {
        val veil = createResizeVeil()

        veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), false /* fadeIn */)
        veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), false /* fadeIn */)
        veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), taskInfo, false /* fadeIn */)
        veil.showVeil(mockTransaction, mock(), Rect(0, 0, 100, 100), taskInfo, false /* fadeIn */)

        verify(mockTransaction, times(1)).show(mockResizeVeilSurface)
        verify(mockTransaction, times(1)).show(mockBackgroundSurface)
@@ -188,7 +188,13 @@ class ResizeVeilTest : ShellTestCase() {
        val veil = createResizeVeil(parent = mock())

        val newParent = mock<SurfaceControl>()
        veil.showVeil(mockTransaction, newParent, Rect(0, 0, 100, 100), false /* fadeIn */)
        veil.showVeil(
            mockTransaction,
            newParent,
            Rect(0, 0, 100, 100),
            taskInfo,
            false /* fadeIn */
        )

        verify(mockTransaction).reparent(mockResizeVeilSurface, newParent)
    }
@@ -212,11 +218,11 @@ class ResizeVeilTest : ShellTestCase() {
            context,
            mockDisplayController,
            mockAppIcon,
            taskInfo,
            parent,
            { mockTransaction },
            mockSurfaceControlBuilderFactory,
            mockSurfaceControlViewHostFactory
            mockSurfaceControlViewHostFactory,
            taskInfo
        )
    }
}