Loading packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt +30 −2 Original line number Diff line number Diff line Loading @@ -149,7 +149,10 @@ class PowerButtonReveal( */ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context, attrs) { lateinit var revealAmountListener: Consumer<Float> /** * Listener that is called if the scrim's opaqueness changes */ lateinit var isScrimOpaqueChangedListener: Consumer<Boolean> /** * How much of the underlying views are revealed, in percent. 0 means they will be completely Loading @@ -161,7 +164,7 @@ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context, field = value revealEffect.setRevealAmountOnScrim(value, this) revealAmountListener.accept(value) updateScrimOpaque() invalidate() } } Loading Loading @@ -200,6 +203,31 @@ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context, } } /** * Is the scrim currently fully opaque */ var isScrimOpaque = false private set(value) { if (field != value) { field = value isScrimOpaqueChangedListener.accept(field) } } private fun updateScrimOpaque() { isScrimOpaque = revealAmount == 0.0f && alpha == 1.0f && visibility == VISIBLE } override fun setAlpha(alpha: Float) { super.setAlpha(alpha) updateScrimOpaque() } override fun setVisibility(visibility: Int) { super.setVisibility(visibility) updateScrimOpaque() } /** * Paint used to draw a transparent-to-white radial gradient. This will be scaled and translated * via local matrix in [onDraw] so we never need to construct a new shader. Loading packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeWindowController.java +3 −3 Original line number Diff line number Diff line Loading @@ -182,10 +182,10 @@ public interface NotificationShadeWindowController extends RemoteInputController default void setFaceAuthDisplayBrightness(float brightness) {} /** * How much {@link LightRevealScrim} obscures the UI. * @param amount 0 when opaque, 1 when not transparent * If {@link LightRevealScrim} obscures the UI. * @param opaque if the scrim is opaque */ default void setLightRevealScrimAmount(float amount) {} default void setLightRevealScrimOpaque(boolean opaque) {} /** * Custom listener to pipe data back to plugins about whether or not the status bar would be Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java +3 −4 Original line number Diff line number Diff line Loading @@ -605,12 +605,11 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW } @Override public void setLightRevealScrimAmount(float amount) { boolean lightRevealScrimOpaque = amount == 0; if (mCurrentState.mLightRevealScrimOpaque == lightRevealScrimOpaque) { public void setLightRevealScrimOpaque(boolean opaque) { if (mCurrentState.mLightRevealScrimOpaque == opaque) { return; } mCurrentState.mLightRevealScrimOpaque = lightRevealScrimOpaque; mCurrentState.mLightRevealScrimOpaque = opaque; apply(mCurrentState); } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +13 −2 Original line number Diff line number Diff line Loading @@ -1258,8 +1258,19 @@ public class StatusBar extends SystemUI implements DemoMode, mScrimController.attachViews(scrimBehind, notificationsScrim, scrimInFront, scrimForBubble); mLightRevealScrim = mNotificationShadeWindowView.findViewById(R.id.light_reveal_scrim); mLightRevealScrim.setRevealAmountListener( mNotificationShadeWindowController::setLightRevealScrimAmount); mLightRevealScrim.setScrimOpaqueChangedListener((opaque) -> { Runnable updateOpaqueness = () -> { mNotificationShadeWindowController.setLightRevealScrimOpaque( mLightRevealScrim.isScrimOpaque()); }; if (opaque) { // Delay making the view opaque for a frame, because it needs some time to render // otherwise this can lead to a flicker where the scrim doesn't cover the screen mLightRevealScrim.post(updateOpaqueness); } else { updateOpaqueness.run(); } }); mUnlockedScreenOffAnimationController.initialize(this, mLightRevealScrim); updateLightRevealScrimVisibility(); Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/LightRevealScrimTest.kt 0 → 100644 +66 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.systemui.statusbar import android.testing.AndroidTestingRunner import android.view.View import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import java.util.function.Consumer @RunWith(AndroidTestingRunner::class) @SmallTest class LightRevealScrimTest : SysuiTestCase() { private lateinit var scrim: LightRevealScrim private var isOpaque = false @Before fun setUp() { scrim = LightRevealScrim(context, null) scrim.isScrimOpaqueChangedListener = Consumer { opaque -> isOpaque = opaque } scrim.revealAmount = 0f assertTrue("Scrim is not opaque in initial setup", scrim.isScrimOpaque) } @Test fun testAlphaSetsOpaque() { scrim.alpha = 0.5f assertFalse("Scrim is opaque even though alpha is set", scrim.isScrimOpaque) } @Test fun testVisibilitySetsOpaque() { scrim.visibility = View.INVISIBLE assertFalse("Scrim is opaque even though it's invisible", scrim.isScrimOpaque) scrim.visibility = View.GONE assertFalse("Scrim is opaque even though it's gone", scrim.isScrimOpaque) } @Test fun testRevealSetsOpaque() { scrim.revealAmount = 0.5f assertFalse("Scrim is opaque even though it's revealed", scrim.isScrimOpaque) } } No newline at end of file Loading
packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt +30 −2 Original line number Diff line number Diff line Loading @@ -149,7 +149,10 @@ class PowerButtonReveal( */ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context, attrs) { lateinit var revealAmountListener: Consumer<Float> /** * Listener that is called if the scrim's opaqueness changes */ lateinit var isScrimOpaqueChangedListener: Consumer<Boolean> /** * How much of the underlying views are revealed, in percent. 0 means they will be completely Loading @@ -161,7 +164,7 @@ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context, field = value revealEffect.setRevealAmountOnScrim(value, this) revealAmountListener.accept(value) updateScrimOpaque() invalidate() } } Loading Loading @@ -200,6 +203,31 @@ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context, } } /** * Is the scrim currently fully opaque */ var isScrimOpaque = false private set(value) { if (field != value) { field = value isScrimOpaqueChangedListener.accept(field) } } private fun updateScrimOpaque() { isScrimOpaque = revealAmount == 0.0f && alpha == 1.0f && visibility == VISIBLE } override fun setAlpha(alpha: Float) { super.setAlpha(alpha) updateScrimOpaque() } override fun setVisibility(visibility: Int) { super.setVisibility(visibility) updateScrimOpaque() } /** * Paint used to draw a transparent-to-white radial gradient. This will be scaled and translated * via local matrix in [onDraw] so we never need to construct a new shader. Loading
packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeWindowController.java +3 −3 Original line number Diff line number Diff line Loading @@ -182,10 +182,10 @@ public interface NotificationShadeWindowController extends RemoteInputController default void setFaceAuthDisplayBrightness(float brightness) {} /** * How much {@link LightRevealScrim} obscures the UI. * @param amount 0 when opaque, 1 when not transparent * If {@link LightRevealScrim} obscures the UI. * @param opaque if the scrim is opaque */ default void setLightRevealScrimAmount(float amount) {} default void setLightRevealScrimOpaque(boolean opaque) {} /** * Custom listener to pipe data back to plugins about whether or not the status bar would be Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java +3 −4 Original line number Diff line number Diff line Loading @@ -605,12 +605,11 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW } @Override public void setLightRevealScrimAmount(float amount) { boolean lightRevealScrimOpaque = amount == 0; if (mCurrentState.mLightRevealScrimOpaque == lightRevealScrimOpaque) { public void setLightRevealScrimOpaque(boolean opaque) { if (mCurrentState.mLightRevealScrimOpaque == opaque) { return; } mCurrentState.mLightRevealScrimOpaque = lightRevealScrimOpaque; mCurrentState.mLightRevealScrimOpaque = opaque; apply(mCurrentState); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +13 −2 Original line number Diff line number Diff line Loading @@ -1258,8 +1258,19 @@ public class StatusBar extends SystemUI implements DemoMode, mScrimController.attachViews(scrimBehind, notificationsScrim, scrimInFront, scrimForBubble); mLightRevealScrim = mNotificationShadeWindowView.findViewById(R.id.light_reveal_scrim); mLightRevealScrim.setRevealAmountListener( mNotificationShadeWindowController::setLightRevealScrimAmount); mLightRevealScrim.setScrimOpaqueChangedListener((opaque) -> { Runnable updateOpaqueness = () -> { mNotificationShadeWindowController.setLightRevealScrimOpaque( mLightRevealScrim.isScrimOpaque()); }; if (opaque) { // Delay making the view opaque for a frame, because it needs some time to render // otherwise this can lead to a flicker where the scrim doesn't cover the screen mLightRevealScrim.post(updateOpaqueness); } else { updateOpaqueness.run(); } }); mUnlockedScreenOffAnimationController.initialize(this, mLightRevealScrim); updateLightRevealScrimVisibility(); Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/LightRevealScrimTest.kt 0 → 100644 +66 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.systemui.statusbar import android.testing.AndroidTestingRunner import android.view.View import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import java.util.function.Consumer @RunWith(AndroidTestingRunner::class) @SmallTest class LightRevealScrimTest : SysuiTestCase() { private lateinit var scrim: LightRevealScrim private var isOpaque = false @Before fun setUp() { scrim = LightRevealScrim(context, null) scrim.isScrimOpaqueChangedListener = Consumer { opaque -> isOpaque = opaque } scrim.revealAmount = 0f assertTrue("Scrim is not opaque in initial setup", scrim.isScrimOpaque) } @Test fun testAlphaSetsOpaque() { scrim.alpha = 0.5f assertFalse("Scrim is opaque even though alpha is set", scrim.isScrimOpaque) } @Test fun testVisibilitySetsOpaque() { scrim.visibility = View.INVISIBLE assertFalse("Scrim is opaque even though it's invisible", scrim.isScrimOpaque) scrim.visibility = View.GONE assertFalse("Scrim is opaque even though it's gone", scrim.isScrimOpaque) } @Test fun testRevealSetsOpaque() { scrim.revealAmount = 0.5f assertFalse("Scrim is opaque even though it's revealed", scrim.isScrimOpaque) } } No newline at end of file