Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d4e7a81 authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Make the header INVISIBLE when alpha is 0

That way, clicks are not relayed to children.

Also, make the Reset menu item surface as action if it fits, for better
discoverability.

Test: manual
Test: atest LargeScreenShadeHeaderControllerTest
Fixes: 255708561
Change-Id: I853736f48ea97560f4b9ff438832d1372e0c59cc
parent a9a57f05
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toolbar;
@@ -74,8 +75,8 @@ public class QSCustomizer extends LinearLayout {
        toolbar.setNavigationIcon(
                getResources().getDrawable(value.resourceId, mContext.getTheme()));

        toolbar.getMenu().add(Menu.NONE, MENU_RESET, 0,
                mContext.getString(com.android.internal.R.string.reset));
        toolbar.getMenu().add(Menu.NONE, MENU_RESET, 0, com.android.internal.R.string.reset)
                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        toolbar.setTitle(R.string.qs_edit);
        mRecyclerView = findViewById(android.R.id.list);
        mTransparentView = findViewById(R.id.customizer_transparent_view);
+6 −2
Original line number Diff line number Diff line
@@ -175,9 +175,10 @@ class LargeScreenShadeHeaderController @Inject constructor(
     */
    var shadeExpandedFraction = -1f
        set(value) {
            if (visible && field != value) {
            if (field != value) {
                header.alpha = ShadeInterpolation.getContentAlpha(value)
                field = value
                updateVisibility()
            }
        }

@@ -331,6 +332,9 @@ class LargeScreenShadeHeaderController @Inject constructor(
                .setDuration(duration)
                .alpha(if (show) 0f else 1f)
                .setInterpolator(if (show) Interpolators.ALPHA_OUT else Interpolators.ALPHA_IN)
                .setUpdateListener {
                    updateVisibility()
                }
                .start()
    }

@@ -414,7 +418,7 @@ class LargeScreenShadeHeaderController @Inject constructor(
    private fun updateVisibility() {
        val visibility = if (!largeScreenActive && !combinedHeaders || qsDisabled) {
            View.GONE
        } else if (qsVisible) {
        } else if (qsVisible && header.alpha > 0f) {
            View.VISIBLE
        } else {
            View.INVISIBLE
+1 −0
Original line number Diff line number Diff line
@@ -182,6 +182,7 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() {
            null
        }
        whenever(view.visibility).thenAnswer { _ -> viewVisibility }
        whenever(view.alpha).thenReturn(1f)

        whenever(iconManagerFactory.create(any(), any())).thenReturn(iconManager)

+54 −0
Original line number Diff line number Diff line
package com.android.systemui.shade

import android.animation.ValueAnimator
import android.app.StatusBarManager
import android.content.Context
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.argumentCaptor
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
@@ -37,6 +39,7 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Answers
import org.mockito.ArgumentMatchers.anyFloat
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock
import org.mockito.Mockito.mock
@@ -75,6 +78,7 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() {

    @JvmField @Rule val mockitoRule = MockitoJUnit.rule()
    var viewVisibility = View.GONE
    var viewAlpha = 1f

    private lateinit var mLargeScreenShadeHeaderController: LargeScreenShadeHeaderController
    private lateinit var carrierIconSlots: List<String>
@@ -101,6 +105,13 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() {
            null
        }
        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()))
            .thenReturn(variableDateViewController)
        whenever(iconManagerFactory.create(any(), any())).thenReturn(iconManager)
@@ -154,6 +165,16 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() {
        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
    fun singleCarrier_enablesCarrierIconsInStatusIcons() {
        whenever(qsCarrierGroupController.isSingleCarrier).thenReturn(true)
@@ -238,6 +259,39 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() {
        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
    fun demoMode_attachDemoMode() {
        val cb = argumentCaptor<DemoMode>()