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

Commit 4bb7e51f authored by Ming-Shin Lu's avatar Ming-Shin Lu
Browse files

Show the warning toast when the brightness slider unable to control

As the top app can use WindowManager.LayoutParams.screenBrightness to
set the preferred brightness value on the foreground window, in that
case the user won't be aware the brightness slider will no-op when the
brightness value has been controlled by the application side.

With this CL, SystemUI will show the warning toast to better
understanding the reason of why unable controlling brightness value
through the brightness slider.

Flag: com.android.systemui.show_toast_when_app_control_brightness
Bug: 363225340
Test: atest -d PlatformScenarioTests:SwipeBrightnessShowToast
Test: atest SystemUITests:BrightnessControllerTest
Test: atest BrightnessClamperControllerTest
Test: manual as the issue step:
    1) Open Netflix and starts a video playback
    2. Swipe the brightness slider, expect a warning toast will
       be shown when the app controls screenBrightness value.

Change-Id: I57eb1371c2e7e637dc8a01813029a29046ef83f5
parent 4a3ff7a9
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -113,16 +113,24 @@ public final class BrightnessInfo implements Parcelable {
     */
    public final int brightnessMaxReason;

    /**
     * Whether the current brightness value is overridden by the application window via
     * {@link android.view.WindowManager.LayoutParams#screenBrightness}.
     */
    public final boolean isBrightnessOverrideByWindow;

    public BrightnessInfo(float brightness, float brightnessMinimum, float brightnessMaximum,
            @HighBrightnessMode int highBrightnessMode, float highBrightnessTransitionPoint,
            @BrightnessMaxReason int brightnessMaxReason) {
        this(brightness, brightness, brightnessMinimum, brightnessMaximum, highBrightnessMode,
                highBrightnessTransitionPoint, brightnessMaxReason);
                highBrightnessTransitionPoint, brightnessMaxReason,
                false /* isBrightnessOverrideByWindow */);
    }

    public BrightnessInfo(float brightness, float adjustedBrightness, float brightnessMinimum,
            float brightnessMaximum, @HighBrightnessMode int highBrightnessMode,
            float highBrightnessTransitionPoint, @BrightnessMaxReason int brightnessMaxReason) {
            float highBrightnessTransitionPoint, @BrightnessMaxReason int brightnessMaxReason,
            boolean isBrightnessOverrideByWindow) {
        this.brightness = brightness;
        this.adjustedBrightness = adjustedBrightness;
        this.brightnessMinimum = brightnessMinimum;
@@ -130,6 +138,7 @@ public final class BrightnessInfo implements Parcelable {
        this.highBrightnessMode = highBrightnessMode;
        this.highBrightnessTransitionPoint = highBrightnessTransitionPoint;
        this.brightnessMaxReason =  brightnessMaxReason;
        this.isBrightnessOverrideByWindow = isBrightnessOverrideByWindow;
    }

    /**
@@ -178,6 +187,7 @@ public final class BrightnessInfo implements Parcelable {
        dest.writeInt(highBrightnessMode);
        dest.writeFloat(highBrightnessTransitionPoint);
        dest.writeInt(brightnessMaxReason);
        dest.writeBoolean(isBrightnessOverrideByWindow);
    }

    public static final @android.annotation.NonNull Creator<BrightnessInfo> CREATOR =
@@ -201,6 +211,7 @@ public final class BrightnessInfo implements Parcelable {
        highBrightnessMode = source.readInt();
        highBrightnessTransitionPoint = source.readFloat();
        brightnessMaxReason = source.readInt();
        isBrightnessOverrideByWindow = source.readBoolean();
    }

}
+10 −0
Original line number Diff line number Diff line
@@ -1632,6 +1632,16 @@ flag {
  }
}

flag {
   name: "show_toast_when_app_control_brightness"
   namespace: "systemui"
   description: "Showing the warning toast if the current running app window has controlled the brightness value."
   bug: "363225340"
   metadata {
       purpose: PURPOSE_BUGFIX
   }
}

flag {
  name: "home_controls_dream_hsum"
  namespace: "systemui"
+2 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.shared.model.Text
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.haptics.slider.sliderHapticsViewModelFactory
import com.android.systemui.kosmos.brightnessWarningToast
import com.android.systemui.kosmos.testScope
import com.android.systemui.lifecycle.activateIn
import com.android.systemui.res.R
@@ -61,6 +62,7 @@ class BrightnessSliderViewModelTest : SysuiTestCase() {
                sliderHapticsViewModelFactory,
                brightnessMirrorShowingInteractor,
                supportsMirroring = true,
                brightnessWarningToast,
            )
        }
    }
+32 −2
Original line number Diff line number Diff line
@@ -16,13 +16,19 @@

package com.android.systemui.settings.brightness

import android.hardware.display.BrightnessInfo
import android.hardware.display.DisplayManager
import android.os.Handler
import android.platform.test.annotations.RequiresFlagsEnabled
import android.platform.test.flag.junit.CheckFlagsRule
import android.platform.test.flag.junit.DeviceFlagsValueProvider
import android.service.vr.IVrManager
import android.testing.TestableLooper
import android.testing.TestableLooper.RunWithLooper
import android.view.Display
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.log.LogBuffer
import com.android.systemui.settings.DisplayTracker
@@ -30,13 +36,16 @@ import com.android.systemui.settings.UserTracker
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.FakeSettings
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations

@@ -44,7 +53,8 @@ import org.mockito.MockitoAnnotations
@RunWith(AndroidJUnit4::class)
@RunWithLooper
class BrightnessControllerTest : SysuiTestCase() {

    @get:Rule
    public val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
    private val executor = FakeExecutor(FakeSystemClock())
    private val secureSettings = FakeSettings()
    @Mock private lateinit var toggleSlider: ToggleSlider
@@ -53,6 +63,7 @@ class BrightnessControllerTest : SysuiTestCase() {
    @Mock private lateinit var displayManager: DisplayManager
    @Mock private lateinit var iVrManager: IVrManager
    @Mock private lateinit var logger: LogBuffer
    @Mock private lateinit var display: Display

    private lateinit var testableLooper: TestableLooper

@@ -63,9 +74,11 @@ class BrightnessControllerTest : SysuiTestCase() {
        MockitoAnnotations.initMocks(this)
        testableLooper = TestableLooper.get(this)

        val contextSpy = spy(context)
        whenever(contextSpy.getDisplay()).thenReturn(display)
        underTest =
            BrightnessController(
                context,
                contextSpy,
                toggleSlider,
                userTracker,
                displayTracker,
@@ -105,4 +118,21 @@ class BrightnessControllerTest : SysuiTestCase() {

        assertThat(messagesProcessed).isEqualTo(1)
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_SHOW_TOAST_WHEN_APP_CONTROL_BRIGHTNESS)
    fun testOnChange_showToastWhenAppOverridesBrightness() {
        val brightnessInfo = BrightnessInfo(
            0.45f, 0.45f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
            1.0f /* highBrightnessTransitionPoint */,
            BrightnessInfo.BRIGHTNESS_MAX_REASON_NONE,
            true /* isBrightnessOverrideByWindow */
        )
        whenever(display.brightnessInfo).thenReturn(brightnessInfo)
        underTest.registerCallbacks()
        testableLooper.processAllMessages()

        underTest.onChanged(true /* tracking */, 100 /* value */, false /* stopTracking */)
        verify(toggleSlider).showToast(any())
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.systemui.classifier.FalsingManagerFake
import com.android.systemui.haptics.slider.HapticSlider
import com.android.systemui.haptics.slider.HapticSliderPlugin
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.settings.brightness.ui.BrightnessWarningToast
import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.statusbar.policy.BrightnessMirrorController
import com.android.systemui.util.mockito.any
@@ -64,6 +65,7 @@ class BrightnessSliderControllerTest : SysuiTestCase() {
    @Mock private lateinit var vibratorHelper: VibratorHelper
    @Mock private lateinit var msdlPlayer: MSDLPlayer
    @Mock private lateinit var activityStarter: ActivityStarter
    @Mock private lateinit var brightnessWarningToast: BrightnessWarningToast

    @Captor
    private lateinit var seekBarChangeCaptor: ArgumentCaptor<SeekBar.OnSeekBarChangeListener>
@@ -94,6 +96,7 @@ class BrightnessSliderControllerTest : SysuiTestCase() {
                    HapticSlider.SeekBar(seekBar),
                ),
                activityStarter,
                brightnessWarningToast,
            )
        mController.init()
        mController.setOnChangedListener(listener)
Loading