From 93e23c58dc0c7dd997f20734dafdf37802854f2c Mon Sep 17 00:00:00 2001 From: Hawkwood Glazier Date: Thu, 11 May 2023 23:02:45 +0000 Subject: [PATCH] Prevent alpha transitions from clipping out-of-bounds clocks In order to do this, we bypass the default alpha mechaism used by views, and call saveLayerAlpha ourselves on several views. This allows us to set bounds for this area outside of the measured bounds. Clipping still appears to occur after a user switch. b/282226587 will track that follow up issue. This is effectively a revert of Ia73ea00920ca0147e0acc5d2919b457203b7575e Bug: 280113068 Bug: 281697986 Test: Manually checked several transitions Change-Id: I9112efab88facd0f32daa5cd7377b8184658c159 --- .../layout/keyguard_clock_switch.xml | 4 +- .../layout/keyguard_status_view.xml | 4 +- .../android/keyguard/KeyguardClockFrame.kt | 39 +++++++++++++++++++ .../android/keyguard/KeyguardClockSwitch.java | 20 ++++++++-- .../KeyguardClockSwitchController.java | 14 ------- .../keyguard/KeyguardStatusContainer.kt | 24 ++++++++++++ .../android/keyguard/KeyguardStatusView.java | 38 +++++++----------- .../KeyguardStatusViewController.java | 3 +- .../KeyguardClockSwitchControllerTest.java | 14 +------ .../keyguard/KeyguardStatusViewTest.kt | 27 ++++--------- 10 files changed, 107 insertions(+), 80 deletions(-) create mode 100644 packages/SystemUI/src/com/android/keyguard/KeyguardClockFrame.kt create mode 100644 packages/SystemUI/src/com/android/keyguard/KeyguardStatusContainer.kt diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml index 4b9470728dc64..3fc0965f4a813 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml @@ -25,7 +25,7 @@ android:layout_height="wrap_content" android:clipChildren="false" android:layout_gravity="center_horizontal|top"> - - - - + diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockFrame.kt b/packages/SystemUI/src/com/android/keyguard/KeyguardClockFrame.kt new file mode 100644 index 0000000000000..d821d309adde7 --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockFrame.kt @@ -0,0 +1,39 @@ +package com.android.keyguard + +import android.content.Context +import android.graphics.Canvas +import android.util.AttributeSet +import android.view.View +import android.widget.FrameLayout + +class KeyguardClockFrame( + context: Context, + attrs: AttributeSet, +) : FrameLayout(context, attrs) { + private var drawAlpha: Int = 255 + + protected override fun onSetAlpha(alpha: Int): Boolean { + drawAlpha = alpha + return true + } + + protected override fun dispatchDraw(canvas: Canvas) { + val restoreTo = saveCanvasAlpha(this, canvas, drawAlpha) + super.dispatchDraw(canvas) + canvas.restoreToCount(restoreTo) + } + + companion object { + @JvmStatic + fun saveCanvasAlpha(view: View, canvas: Canvas, alpha: Int): Int { + var (x, y) = + run { + val locationOnScreen = IntArray(2) + view.getLocationOnScreen(locationOnScreen) + Pair(locationOnScreen[0].toFloat(), locationOnScreen[1].toFloat()) + } + + return canvas.saveLayerAlpha(-1f * x, -1f * y, x + view.width, y + view.height, alpha) + } + } +} diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index 644a9bcdd588f..05a8f9fc9ae2d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -5,11 +5,11 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; +import android.graphics.Canvas; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; import android.widget.RelativeLayout; import androidx.annotation.IntDef; @@ -69,12 +69,13 @@ public class KeyguardClockSwitch extends RelativeLayout { /** * Frame for small/large clocks */ - private FrameLayout mSmallClockFrame; - private FrameLayout mLargeClockFrame; + private KeyguardClockFrame mSmallClockFrame; + private KeyguardClockFrame mLargeClockFrame; private ClockController mClock; private View mStatusArea; private int mSmartspaceTopOffset; + private int mDrawAlpha = 255; /** * Maintain state so that a newly connected plugin can be initialized. @@ -121,6 +122,19 @@ public class KeyguardClockSwitch extends RelativeLayout { onDensityOrFontScaleChanged(); } + @Override + protected boolean onSetAlpha(int alpha) { + mDrawAlpha = alpha; + return true; + } + + @Override + protected void dispatchDraw(Canvas canvas) { + int restoreTo = KeyguardClockFrame.saveCanvasAlpha(this, canvas, mDrawAlpha); + super.dispatchDraw(canvas); + canvas.restoreToCount(restoreTo); + } + public void setLogBuffer(LogBuffer logBuffer) { mLogBuffer = logBuffer; } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java index 676f342775efa..d8bf570954df6 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java @@ -178,20 +178,6 @@ public class KeyguardClockSwitchController extends ViewController