Merge "Make the header INVISIBLE when alpha is 0" into tm-qpr-dev am: 8486154984

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

Change-Id: I9b1a4fb4305316699effe9a723670226867ee834
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Fabian Kozynski
2023-01-10 21:00:54 +00:00
committed by Automerger Merge Worker
4 changed files with 64 additions and 4 deletions

View File

@@ -24,6 +24,7 @@ import android.util.AttributeSet;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.Toolbar; import android.widget.Toolbar;
@@ -74,8 +75,8 @@ public class QSCustomizer extends LinearLayout {
toolbar.setNavigationIcon( toolbar.setNavigationIcon(
getResources().getDrawable(value.resourceId, mContext.getTheme())); getResources().getDrawable(value.resourceId, mContext.getTheme()));
toolbar.getMenu().add(Menu.NONE, MENU_RESET, 0, toolbar.getMenu().add(Menu.NONE, MENU_RESET, 0, com.android.internal.R.string.reset)
mContext.getString(com.android.internal.R.string.reset)); .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
toolbar.setTitle(R.string.qs_edit); toolbar.setTitle(R.string.qs_edit);
mRecyclerView = findViewById(android.R.id.list); mRecyclerView = findViewById(android.R.id.list);
mTransparentView = findViewById(R.id.customizer_transparent_view); mTransparentView = findViewById(R.id.customizer_transparent_view);

View File

@@ -175,9 +175,10 @@ class LargeScreenShadeHeaderController @Inject constructor(
*/ */
var shadeExpandedFraction = -1f var shadeExpandedFraction = -1f
set(value) { set(value) {
if (visible && field != value) { if (field != value) {
header.alpha = ShadeInterpolation.getContentAlpha(value) header.alpha = ShadeInterpolation.getContentAlpha(value)
field = value field = value
updateVisibility()
} }
} }
@@ -331,6 +332,9 @@ class LargeScreenShadeHeaderController @Inject constructor(
.setDuration(duration) .setDuration(duration)
.alpha(if (show) 0f else 1f) .alpha(if (show) 0f else 1f)
.setInterpolator(if (show) Interpolators.ALPHA_OUT else Interpolators.ALPHA_IN) .setInterpolator(if (show) Interpolators.ALPHA_OUT else Interpolators.ALPHA_IN)
.setUpdateListener {
updateVisibility()
}
.start() .start()
} }
@@ -414,7 +418,7 @@ class LargeScreenShadeHeaderController @Inject constructor(
private fun updateVisibility() { private fun updateVisibility() {
val visibility = if (!largeScreenActive && !combinedHeaders || qsDisabled) { val visibility = if (!largeScreenActive && !combinedHeaders || qsDisabled) {
View.GONE View.GONE
} else if (qsVisible) { } else if (qsVisible && header.alpha > 0f) {
View.VISIBLE View.VISIBLE
} else { } else {
View.INVISIBLE View.INVISIBLE

View File

@@ -182,6 +182,7 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() {
null null
} }
whenever(view.visibility).thenAnswer { _ -> viewVisibility } whenever(view.visibility).thenAnswer { _ -> viewVisibility }
whenever(view.alpha).thenReturn(1f)
whenever(iconManagerFactory.create(any(), any())).thenReturn(iconManager) whenever(iconManagerFactory.create(any(), any())).thenReturn(iconManager)

View File

@@ -1,5 +1,6 @@
package com.android.systemui.shade package com.android.systemui.shade
import android.animation.ValueAnimator
import android.app.StatusBarManager import android.app.StatusBarManager
import android.content.Context import android.content.Context
import android.testing.AndroidTestingRunner import android.testing.AndroidTestingRunner
@@ -30,6 +31,7 @@ import com.android.systemui.statusbar.policy.VariableDateViewController
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.argumentCaptor
import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import org.junit.After import org.junit.After
import org.junit.Before import org.junit.Before
@@ -37,6 +39,7 @@ import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Answers import org.mockito.Answers
import org.mockito.ArgumentMatchers.anyFloat
import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.mock import org.mockito.Mockito.mock
@@ -75,6 +78,7 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() {
@JvmField @Rule val mockitoRule = MockitoJUnit.rule() @JvmField @Rule val mockitoRule = MockitoJUnit.rule()
var viewVisibility = View.GONE var viewVisibility = View.GONE
var viewAlpha = 1f
private lateinit var mLargeScreenShadeHeaderController: LargeScreenShadeHeaderController private lateinit var mLargeScreenShadeHeaderController: LargeScreenShadeHeaderController
private lateinit var carrierIconSlots: List<String> private lateinit var carrierIconSlots: List<String>
@@ -101,6 +105,13 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() {
null null
} }
whenever(view.visibility).thenAnswer { _ -> viewVisibility } whenever(view.visibility).thenAnswer { _ -> viewVisibility }
whenever(view.setAlpha(anyFloat())).then {
viewAlpha = it.arguments[0] as Float
null
}
whenever(view.alpha).thenAnswer { _ -> viewAlpha }
whenever(variableDateViewControllerFactory.create(any())) whenever(variableDateViewControllerFactory.create(any()))
.thenReturn(variableDateViewController) .thenReturn(variableDateViewController)
whenever(iconManagerFactory.create(any(), any())).thenReturn(iconManager) whenever(iconManagerFactory.create(any(), any())).thenReturn(iconManager)
@@ -154,6 +165,16 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() {
verify(view).setAlpha(ShadeInterpolation.getContentAlpha(0.5f)) verify(view).setAlpha(ShadeInterpolation.getContentAlpha(0.5f))
} }
@Test
fun alphaChangesUpdateVisibility() {
makeShadeVisible()
mLargeScreenShadeHeaderController.shadeExpandedFraction = 0f
assertThat(viewVisibility).isEqualTo(View.INVISIBLE)
mLargeScreenShadeHeaderController.shadeExpandedFraction = 1f
assertThat(viewVisibility).isEqualTo(View.VISIBLE)
}
@Test @Test
fun singleCarrier_enablesCarrierIconsInStatusIcons() { fun singleCarrier_enablesCarrierIconsInStatusIcons() {
whenever(qsCarrierGroupController.isSingleCarrier).thenReturn(true) whenever(qsCarrierGroupController.isSingleCarrier).thenReturn(true)
@@ -238,6 +259,39 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() {
verify(animator).start() verify(animator).start()
} }
@Test
fun testShadeExpanded_true_alpha_zero_invisible() {
view.alpha = 0f
mLargeScreenShadeHeaderController.largeScreenActive = true
mLargeScreenShadeHeaderController.qsVisible = true
assertThat(viewVisibility).isEqualTo(View.INVISIBLE)
}
@Test
fun animatorCallsUpdateVisibilityOnUpdate() {
val animator = mock(ViewPropertyAnimator::class.java, Answers.RETURNS_SELF)
whenever(view.animate()).thenReturn(animator)
mLargeScreenShadeHeaderController.startCustomizingAnimation(show = false, 0L)
val updateCaptor = argumentCaptor<ValueAnimator.AnimatorUpdateListener>()
verify(animator).setUpdateListener(capture(updateCaptor))
mLargeScreenShadeHeaderController.largeScreenActive = true
mLargeScreenShadeHeaderController.qsVisible = true
view.alpha = 1f
updateCaptor.value.onAnimationUpdate(mock())
assertThat(viewVisibility).isEqualTo(View.VISIBLE)
view.alpha = 0f
updateCaptor.value.onAnimationUpdate(mock())
assertThat(viewVisibility).isEqualTo(View.INVISIBLE)
}
@Test @Test
fun demoMode_attachDemoMode() { fun demoMode_attachDemoMode() {
val cb = argumentCaptor<DemoMode>() val cb = argumentCaptor<DemoMode>()