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

Commit f1fc5d21 authored by Milton Wu's avatar Milton Wu
Browse files

Move color and display info into DecorProvider

Original tint color and display info are handled inside
ScreenDecorations like specific cases. Move these info into interface of
DecorProvider.

Bug: 232874879
Test: atest ScreenDecorationsTest ScreenDecorHwcLayerTest \
            OverlayWindowTest RoundedCornerResDelegateTest
Test: fold/unfold/rotate/debugRoundedCornerSize/debugFlag on sw-layer
      devices
Test: rotate/debugRoundedCornerSize/debugFlag/resolutionChange/faceAnim
      on hw-layer devices
Change-Id: I1fdcbe4c5e8ee0a54eba03f59b9066e76e5c9a03
Merged-In: I1fdcbe4c5e8ee0a54eba03f59b9066e76e5c9a03
(cherry picked from commit 3353759e)
parent 9d16d9da
Loading
Loading
Loading
Loading
+32 −21
Original line number Original line Diff line number Diff line
@@ -47,7 +47,8 @@ import com.android.systemui.animation.Interpolators
open class DisplayCutoutBaseView : View, RegionInterceptableView {
open class DisplayCutoutBaseView : View, RegionInterceptableView {


    private var shouldDrawCutout: Boolean = DisplayCutout.getFillBuiltInDisplayCutout(
    private var shouldDrawCutout: Boolean = DisplayCutout.getFillBuiltInDisplayCutout(
            context.resources, context.display?.uniqueId)
        context.resources, context.display?.uniqueId
    )
    private var displayUniqueId: String? = null
    private var displayUniqueId: String? = null
    private var displayMode: Display.Mode? = null
    private var displayMode: Display.Mode? = null
    protected val location = IntArray(2)
    protected val location = IntArray(2)
@@ -74,8 +75,8 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {


    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)


    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
            : super(context, attrs, defStyleAttr)
        super(context, attrs, defStyleAttr)


    override fun onAttachedToWindow() {
    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        super.onAttachedToWindow()
@@ -85,7 +86,7 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
        onUpdate()
        onUpdate()
    }
    }


    fun onDisplayChanged(displayId: Int) {
    fun onDisplayChanged(newDisplayUniqueId: String?) {
        val oldMode: Display.Mode? = displayMode
        val oldMode: Display.Mode? = displayMode
        val display: Display? = context.display
        val display: Display? = context.display
        displayMode = display?.mode
        displayMode = display?.mode
@@ -93,7 +94,8 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
        if (displayUniqueId != display?.uniqueId) {
        if (displayUniqueId != display?.uniqueId) {
            displayUniqueId = display?.uniqueId
            displayUniqueId = display?.uniqueId
            shouldDrawCutout = DisplayCutout.getFillBuiltInDisplayCutout(
            shouldDrawCutout = DisplayCutout.getFillBuiltInDisplayCutout(
                    context.resources, displayUniqueId)
                context.resources, displayUniqueId
            )
        }
        }


        // Skip if display mode or cutout hasn't changed.
        // Skip if display mode or cutout hasn't changed.
@@ -101,7 +103,7 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
                display?.cutout == displayInfo.displayCutout) {
                display?.cutout == displayInfo.displayCutout) {
            return
            return
        }
        }
        if (displayId == display?.displayId) {
        if (newDisplayUniqueId == display?.uniqueId) {
            updateCutout()
            updateCutout()
            updateProtectionBoundingPath()
            updateProtectionBoundingPath()
            onUpdate()
            onUpdate()
@@ -147,8 +149,9 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
        cutoutBounds.translate(-location[0], -location[1])
        cutoutBounds.translate(-location[0], -location[1])


        // Intersect with window's frame
        // Intersect with window's frame
        cutoutBounds.op(rootView.left, rootView.top, rootView.right, rootView.bottom,
        cutoutBounds.op(
                Region.Op.INTERSECT)
            rootView.left, rootView.top, rootView.right, rootView.bottom, Region.Op.INTERSECT
        )
        return cutoutBounds
        return cutoutBounds
    }
    }


@@ -171,9 +174,12 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {


    protected open fun drawCutoutProtection(canvas: Canvas) {
    protected open fun drawCutoutProtection(canvas: Canvas) {
        if (cameraProtectionProgress > HIDDEN_CAMERA_PROTECTION_SCALE &&
        if (cameraProtectionProgress > HIDDEN_CAMERA_PROTECTION_SCALE &&
                !protectionRect.isEmpty) {
            !protectionRect.isEmpty
            canvas.scale(cameraProtectionProgress, cameraProtectionProgress,
        ) {
                    protectionRect.centerX(), protectionRect.centerY())
            canvas.scale(
                cameraProtectionProgress, cameraProtectionProgress, protectionRect.centerX(),
                protectionRect.centerY()
            )
            canvas.drawPath(protectionPath, paint)
            canvas.drawPath(protectionPath, paint)
        }
        }
    }
    }
@@ -205,14 +211,17 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
            requestLayout()
            requestLayout()
        }
        }
        cameraProtectionAnimator?.cancel()
        cameraProtectionAnimator?.cancel()
        cameraProtectionAnimator = ValueAnimator.ofFloat(cameraProtectionProgress,
        cameraProtectionAnimator = ValueAnimator.ofFloat(
                if (showProtection) 1.0f else HIDDEN_CAMERA_PROTECTION_SCALE).setDuration(750)
            cameraProtectionProgress,
            if (showProtection) 1.0f else HIDDEN_CAMERA_PROTECTION_SCALE
        ).setDuration(750)
        cameraProtectionAnimator?.interpolator = Interpolators.DECELERATE_QUINT
        cameraProtectionAnimator?.interpolator = Interpolators.DECELERATE_QUINT
        cameraProtectionAnimator?.addUpdateListener(ValueAnimator.AnimatorUpdateListener {
        cameraProtectionAnimator?.addUpdateListener(
            animation: ValueAnimator ->
            ValueAnimator.AnimatorUpdateListener { animation: ValueAnimator ->
                cameraProtectionProgress = animation.animatedValue as Float
                cameraProtectionProgress = animation.animatedValue as Float
                invalidate()
                invalidate()
        })
            }
        )
        cameraProtectionAnimator?.addListener(object : AnimatorListenerAdapter() {
        cameraProtectionAnimator?.addListener(object : AnimatorListenerAdapter() {
            override fun onAnimationEnd(animation: Animator) {
            override fun onAnimationEnd(animation: Animator) {
                cameraProtectionAnimator = null
                cameraProtectionAnimator = null
@@ -245,8 +254,10 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
        // Apply rotation.
        // Apply rotation.
        val lw: Int = displayInfo.logicalWidth
        val lw: Int = displayInfo.logicalWidth
        val lh: Int = displayInfo.logicalHeight
        val lh: Int = displayInfo.logicalHeight
        val flipped = (displayInfo.rotation == Surface.ROTATION_90 ||
        val flipped = (
                displayInfo.rotation == Surface.ROTATION_270)
            displayInfo.rotation == Surface.ROTATION_90 ||
                displayInfo.rotation == Surface.ROTATION_270
            )
        val dw = if (flipped) lh else lw
        val dw = if (flipped) lh else lw
        val dh = if (flipped) lw else lh
        val dh = if (flipped) lw else lh
        transformPhysicalToLogicalCoordinates(displayInfo.rotation, dw, dh, m)
        transformPhysicalToLogicalCoordinates(displayInfo.rotation, dw, dh, m)
+27 −49
Original line number Original line Diff line number Diff line
@@ -32,7 +32,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Color;
@@ -92,10 +91,8 @@ import com.android.systemui.util.settings.SecureSettings;


import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.List;
import java.util.Objects;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.Executor;


import javax.inject.Inject;
import javax.inject.Inject;
@@ -448,6 +445,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
                    }
                    }
                }
                }


                boolean needToUpdateProviderViews = false;
                final String newUniqueId = mDisplayInfo.uniqueId;
                final String newUniqueId = mDisplayInfo.uniqueId;
                if (!Objects.equals(newUniqueId, mDisplayUniqueId)) {
                if (!Objects.equals(newUniqueId, mDisplayUniqueId)) {
                    mDisplayUniqueId = newUniqueId;
                    mDisplayUniqueId = newUniqueId;
@@ -470,8 +468,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
                        updateHwLayerRoundedCornerDrawable();
                        updateHwLayerRoundedCornerDrawable();
                        updateHwLayerRoundedCornerExistAndSize();
                        updateHwLayerRoundedCornerExistAndSize();
                    }
                    }

                    needToUpdateProviderViews = true;
                    updateOverlayProviderViews();
                }
                }


                final float newRatio = getPhysicalPixelDisplaySizeRatio();
                final float newRatio = getPhysicalPixelDisplaySizeRatio();
@@ -480,7 +477,13 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
                    if (mScreenDecorHwcLayer != null) {
                    if (mScreenDecorHwcLayer != null) {
                        updateHwLayerRoundedCornerExistAndSize();
                        updateHwLayerRoundedCornerExistAndSize();
                    }
                    }
                    updateOverlayProviderViews();
                    needToUpdateProviderViews = true;
                }

                if (needToUpdateProviderViews) {
                    updateOverlayProviderViews(null);
                } else {
                    updateOverlayProviderViews(new Integer[] { mFaceScanningViewId });
                }
                }


                if (mCutoutViews != null) {
                if (mCutoutViews != null) {
@@ -490,18 +493,12 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
                        if (cutoutView == null) {
                        if (cutoutView == null) {
                            continue;
                            continue;
                        }
                        }
                        cutoutView.onDisplayChanged(displayId);
                        cutoutView.onDisplayChanged(newUniqueId);
                    }
                    }
                    }

                DisplayCutoutView overlay = (DisplayCutoutView) getOverlayView(mFaceScanningViewId);
                if (overlay != null) {
                    // handle display resolution changes
                    overlay.onDisplayChanged(displayId);
                }
                }


                if (mScreenDecorHwcLayer != null) {
                if (mScreenDecorHwcLayer != null) {
                    mScreenDecorHwcLayer.onDisplayChanged(displayId);
                    mScreenDecorHwcLayer.onDisplayChanged(newUniqueId);
                }
                }
            }
            }
        };
        };
@@ -804,7 +801,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
                    return;
                    return;
                }
                }
                removeOverlayView(provider.getViewId());
                removeOverlayView(provider.getViewId());
                overlay.addDecorProvider(provider, mRotation);
                overlay.addDecorProvider(provider, mRotation, mTintColor);
            });
            });
        }
        }
        // Use visibility of privacy dot views & face scanning view to determine the overlay's
        // Use visibility of privacy dot views & face scanning view to determine the overlay's
@@ -955,24 +952,6 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
            return;
            return;
        }
        }


        // When the hwc supports screen decorations, the layer will use the A8 color mode which
        // won't be affected by the color inversion. If the composition goes the client composition
        // route, the color inversion will be handled by the RenderEngine.
        final Set<Integer> viewsMayNeedColorUpdate = new HashSet<>();
        if (mHwcScreenDecorationSupport == null) {
            ColorStateList tintList = ColorStateList.valueOf(mTintColor);
            mRoundedCornerResDelegate.setColorTintList(tintList);
            viewsMayNeedColorUpdate.add(R.id.rounded_corner_top_left);
            viewsMayNeedColorUpdate.add(R.id.rounded_corner_top_right);
            viewsMayNeedColorUpdate.add(R.id.rounded_corner_bottom_left);
            viewsMayNeedColorUpdate.add(R.id.rounded_corner_bottom_right);
            viewsMayNeedColorUpdate.add(R.id.display_cutout);
        }
        if (getOverlayView(mFaceScanningViewId) != null) {
            viewsMayNeedColorUpdate.add(mFaceScanningViewId);
        }
        final Integer[] views = new Integer[viewsMayNeedColorUpdate.size()];
        viewsMayNeedColorUpdate.toArray(views);
        for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) {
        for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) {
            if (mOverlays[i] == null) {
            if (mOverlays[i] == null) {
                continue;
                continue;
@@ -982,14 +961,19 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
            View child;
            View child;
            for (int j = 0; j < size; j++) {
            for (int j = 0; j < size; j++) {
                child = overlayView.getChildAt(j);
                child = overlayView.getChildAt(j);
                if (viewsMayNeedColorUpdate.contains(child.getId())
                if (child instanceof DisplayCutoutView && child.getId() == R.id.display_cutout) {
                        && child instanceof DisplayCutoutView) {
                    ((DisplayCutoutView) child).setColor(mTintColor);
                    ((DisplayCutoutView) child).setColor(mTintColor);
                }
                }
            }
            }
            mOverlays[i].onReloadResAndMeasure(views, mProviderRefreshToken,
                    mRotation, mDisplayUniqueId);
        }
        }

        updateOverlayProviderViews(new Integer[] {
                mFaceScanningViewId,
                R.id.rounded_corner_top_left,
                R.id.rounded_corner_top_right,
                R.id.rounded_corner_bottom_left,
                R.id.rounded_corner_bottom_right
        });
    }
    }


    @VisibleForTesting
    @VisibleForTesting
@@ -1120,7 +1104,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
            }
            }


            // update all provider views inside overlay
            // update all provider views inside overlay
            updateOverlayProviderViews();
            updateOverlayProviderViews(null);
        }
        }


        FaceScanningOverlay faceScanningOverlay =
        FaceScanningOverlay faceScanningOverlay =
@@ -1192,7 +1176,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
                context.getResources(), context.getDisplay().getUniqueId());
                context.getResources(), context.getDisplay().getUniqueId());
    }
    }


    private void updateOverlayProviderViews() {
    private void updateOverlayProviderViews(@Nullable Integer[] filterIds) {
        if (mOverlays == null) {
        if (mOverlays == null) {
            return;
            return;
        }
        }
@@ -1201,7 +1185,8 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
            if (overlay == null) {
            if (overlay == null) {
                continue;
                continue;
            }
            }
            overlay.onReloadResAndMeasure(null, mProviderRefreshToken, mRotation, mDisplayUniqueId);
            overlay.onReloadResAndMeasure(filterIds, mProviderRefreshToken, mRotation, mTintColor,
                    mDisplayUniqueId);
        }
        }
    }
    }


@@ -1240,19 +1225,12 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
            } catch (NumberFormatException e) {
            } catch (NumberFormatException e) {
                mRoundedCornerResDelegate.setTuningSizeFactor(null);
                mRoundedCornerResDelegate.setTuningSizeFactor(null);
            }
            }
            Integer[] filterIds = {
            updateOverlayProviderViews(new Integer[] {
                    R.id.rounded_corner_top_left,
                    R.id.rounded_corner_top_left,
                    R.id.rounded_corner_top_right,
                    R.id.rounded_corner_top_right,
                    R.id.rounded_corner_bottom_left,
                    R.id.rounded_corner_bottom_left,
                    R.id.rounded_corner_bottom_right
                    R.id.rounded_corner_bottom_right
            };
            });
            for (final OverlayWindow overlay: mOverlays) {
                if (overlay == null) {
                    continue;
                }
                overlay.onReloadResAndMeasure(filterIds, mProviderRefreshToken, mRotation,
                        mDisplayUniqueId);
            }
            updateHwLayerRoundedCornerExistAndSize();
            updateHwLayerRoundedCornerExistAndSize();
        });
        });
    }
    }
+5 −3
Original line number Original line Diff line number Diff line
@@ -46,14 +46,16 @@ abstract class DecorProvider {
        view: View,
        view: View,
        reloadToken: Int,
        reloadToken: Int,
        @Surface.Rotation rotation: Int,
        @Surface.Rotation rotation: Int,
        displayUniqueId: String? = null
        tintColor: Int,
        displayUniqueId: String?
    )
    )


    /** Inflate view into parent as current rotation */
    /** Inflate view into parent as current rotation */
    abstract fun inflateView(
    abstract fun inflateView(
        context: Context,
        context: Context,
        parent: ViewGroup,
        parent: ViewGroup,
        @Surface.Rotation rotation: Int
        @Surface.Rotation rotation: Int,
        tintColor: Int
    ): View
    ): View
}
}


+9 −2
Original line number Original line Diff line number Diff line
@@ -115,19 +115,25 @@ class FaceScanningOverlayProviderImpl(
    override fun onReloadResAndMeasure(
    override fun onReloadResAndMeasure(
        view: View,
        view: View,
        reloadToken: Int,
        reloadToken: Int,
        rotation: Int,
        @Surface.Rotation rotation: Int,
        tintColor: Int,
        displayUniqueId: String?
        displayUniqueId: String?
    ) {
    ) {
        (view.layoutParams as FrameLayout.LayoutParams).let {
        (view.layoutParams as FrameLayout.LayoutParams).let {
            updateLayoutParams(it, rotation)
            updateLayoutParams(it, rotation)
            view.layoutParams = it
            view.layoutParams = it
            (view as? FaceScanningOverlay)?.let { overlay ->
                overlay.setColor(tintColor)
                overlay.onDisplayChanged(displayUniqueId)
            }
        }
        }
    }
    }


    override fun inflateView(
    override fun inflateView(
        context: Context,
        context: Context,
        parent: ViewGroup,
        parent: ViewGroup,
        @Surface.Rotation rotation: Int
        @Surface.Rotation rotation: Int,
        tintColor: Int
    ): View {
    ): View {
        val view = FaceScanningOverlay(
        val view = FaceScanningOverlay(
                context,
                context,
@@ -137,6 +143,7 @@ class FaceScanningOverlayProviderImpl(
                mainExecutor
                mainExecutor
        )
        )
        view.id = viewId
        view.id = viewId
        view.setColor(tintColor)
        FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
        FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT).let {
                ViewGroup.LayoutParams.MATCH_PARENT).let {
            updateLayoutParams(it, rotation)
            updateLayoutParams(it, rotation)
+18 −12
Original line number Original line Diff line number Diff line
@@ -34,9 +34,10 @@ class OverlayWindow(private val context: Context) {


    fun addDecorProvider(
    fun addDecorProvider(
        decorProvider: DecorProvider,
        decorProvider: DecorProvider,
        @Surface.Rotation rotation: Int
        @Surface.Rotation rotation: Int,
        tintColor: Int
    ) {
    ) {
        val view = decorProvider.inflateView(context, rootView, rotation)
        val view = decorProvider.inflateView(context, rootView, rotation, tintColor)
        viewProviderMap[decorProvider.viewId] = Pair(view, decorProvider)
        viewProviderMap[decorProvider.viewId] = Pair(view, decorProvider)
    }
    }


@@ -82,6 +83,7 @@ class OverlayWindow(private val context: Context) {
        filterIds: Array<Int>? = null,
        filterIds: Array<Int>? = null,
        reloadToken: Int,
        reloadToken: Int,
        @Surface.Rotation rotation: Int,
        @Surface.Rotation rotation: Int,
        tintColor: Int,
        displayUniqueId: String? = null
        displayUniqueId: String? = null
    ) {
    ) {
        filterIds?.forEach { id ->
        filterIds?.forEach { id ->
@@ -89,16 +91,20 @@ class OverlayWindow(private val context: Context) {
                it.second.onReloadResAndMeasure(
                it.second.onReloadResAndMeasure(
                    view = it.first,
                    view = it.first,
                    reloadToken = reloadToken,
                    reloadToken = reloadToken,
                        displayUniqueId = displayUniqueId,
                    rotation = rotation,
                        rotation = rotation)
                    tintColor = tintColor,
                    displayUniqueId = displayUniqueId
                )
            }
            }
        } ?: run {
        } ?: run {
            viewProviderMap.values.forEach {
            viewProviderMap.values.forEach {
                it.second.onReloadResAndMeasure(
                it.second.onReloadResAndMeasure(
                    view = it.first,
                    view = it.first,
                    reloadToken = reloadToken,
                    reloadToken = reloadToken,
                        displayUniqueId = displayUniqueId,
                    rotation = rotation,
                        rotation = rotation)
                    tintColor = tintColor,
                    displayUniqueId = displayUniqueId
                )
            }
            }
        }
        }
    }
    }
Loading