Merge "Fixed an issue where the statusbar was made opaque even though it wasnt" into sc-qpr1-dev am: f1eb5cc17a
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15583241 Change-Id: I0979a9554f34766e860dd949c4ebdb1156b58c13
This commit is contained in:
@@ -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
|
||||
@@ -161,7 +164,7 @@ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context,
|
||||
field = value
|
||||
|
||||
revealEffect.setRevealAmountOnScrim(value, this)
|
||||
revealAmountListener.accept(value)
|
||||
updateScrimOpaque()
|
||||
invalidate()
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user