Merge "Fixed an issue where the statusbar was made opaque even though it wasnt" into sc-qpr1-dev am: f1eb5cc17a am: 1d7b08c9a4

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15583241

Change-Id: I6e336d33c4a77108d4f2d89c17985791cd91af60
This commit is contained in:
TreeHugger Robot
2021-08-19 18:46:46 +00:00
committed by Automerger Merge Worker
6 changed files with 116 additions and 12 deletions

View File

@@ -178,7 +178,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
@@ -190,7 +193,7 @@ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context,
field = value
revealEffect.setRevealAmountOnScrim(value, this)
revealAmountListener.accept(value)
updateScrimOpaque()
invalidate()
}
}
@@ -229,6 +232,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.

View File

@@ -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

View File

@@ -606,12 +606,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);
}

View File

@@ -1256,8 +1256,19 @@ public class StatusBar extends SystemUI implements
mScrimController.attachViews(scrimBehind, notificationsScrim, scrimInFront);
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();

View File

@@ -0,0 +1,66 @@
/*
* 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)
}
}

View File

@@ -146,7 +146,7 @@ public class NotificationShadeWindowControllerImplTest extends SysuiTestCase {
mNotificationShadeWindowController.attach();
clearInvocations(mWindowManager);
mNotificationShadeWindowController.setLightRevealScrimAmount(0f);
mNotificationShadeWindowController.setLightRevealScrimOpaque(true);
verify(mWindowManager).updateViewLayout(any(), mLayoutParameters.capture());
assertThat((mLayoutParameters.getValue().flags & FLAG_SHOW_WALLPAPER) == 0).isTrue();
}