Merge "[Letterbox][Status Bar] Re-fetch background info on wallpaper changes" into tm-qpr-dev

This commit is contained in:
Christian Göllner
2022-08-11 14:06:36 +00:00
committed by Android (Google) Code Review
2 changed files with 74 additions and 1 deletions

View File

@@ -17,11 +17,14 @@
package com.android.systemui.statusbar.phone package com.android.systemui.statusbar.phone
import android.annotation.ColorInt import android.annotation.ColorInt
import android.app.WallpaperManager
import android.graphics.Color import android.graphics.Color
import android.os.Handler
import android.os.RemoteException import android.os.RemoteException
import android.view.IWindowManager import android.view.IWindowManager
import com.android.systemui.Dumpable import com.android.systemui.Dumpable
import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent
import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope
@@ -37,6 +40,8 @@ constructor(
private val windowManager: IWindowManager, private val windowManager: IWindowManager,
@Background private val backgroundExecutor: Executor, @Background private val backgroundExecutor: Executor,
private val dumpManager: DumpManager, private val dumpManager: DumpManager,
private val wallpaperManager: WallpaperManager,
@Main private val mainHandler: Handler,
) : CentralSurfacesComponent.Startable, Dumpable { ) : CentralSurfacesComponent.Startable, Dumpable {
@ColorInt @ColorInt
@@ -46,9 +51,18 @@ constructor(
var isLetterboxBackgroundMultiColored: Boolean = false var isLetterboxBackgroundMultiColored: Boolean = false
private set private set
private val wallpaperColorsListener =
WallpaperManager.OnColorsChangedListener { _, _ ->
fetchBackgroundColorInfo()
}
override fun start() { override fun start() {
dumpManager.registerDumpable(javaClass.simpleName, this) dumpManager.registerDumpable(javaClass.simpleName, this)
fetchBackgroundColorInfo()
wallpaperManager.addOnColorsChangedListener(wallpaperColorsListener, mainHandler)
}
private fun fetchBackgroundColorInfo() {
// Using a background executor, as binder calls to IWindowManager are blocking // Using a background executor, as binder calls to IWindowManager are blocking
backgroundExecutor.execute { backgroundExecutor.execute {
try { try {
@@ -62,6 +76,7 @@ constructor(
override fun stop() { override fun stop() {
dumpManager.unregisterDumpable(javaClass.simpleName) dumpManager.unregisterDumpable(javaClass.simpleName)
wallpaperManager.removeOnColorsChangedListener(wallpaperColorsListener)
} }
override fun dump(pw: PrintWriter, args: Array<out String>) { override fun dump(pw: PrintWriter, args: Array<out String>) {

View File

@@ -16,19 +16,28 @@
package com.android.systemui.statusbar.phone package com.android.systemui.statusbar.phone
import android.app.WallpaperManager
import android.app.WallpaperManager.OnColorsChangedListener
import android.graphics.Color import android.graphics.Color
import android.os.Handler
import android.os.Looper
import android.testing.AndroidTestingRunner import android.testing.AndroidTestingRunner
import android.view.IWindowManager import android.view.IWindowManager
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.time.FakeSystemClock import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Expect
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import org.junit.Before import org.junit.Before
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.Mock import org.mockito.Mock
import org.mockito.Mockito.any
import org.mockito.Mockito.doAnswer
import org.mockito.Mockito.`when` as whenever import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
@@ -38,17 +47,41 @@ class LetterboxBackgroundProviderTest : SysuiTestCase() {
private val fakeSystemClock = FakeSystemClock() private val fakeSystemClock = FakeSystemClock()
private val fakeExecutor = FakeExecutor(fakeSystemClock) private val fakeExecutor = FakeExecutor(fakeSystemClock)
private val mainHandler = Handler(Looper.getMainLooper())
@get:Rule var expect: Expect = Expect.create()
@Mock private lateinit var windowManager: IWindowManager @Mock private lateinit var windowManager: IWindowManager
@Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var dumpManager: DumpManager
@Mock private lateinit var wallpaperManager: WallpaperManager
private lateinit var provider: LetterboxBackgroundProvider private lateinit var provider: LetterboxBackgroundProvider
private var wallpaperColorsListener: OnColorsChangedListener? = null
@Before @Before
fun setUp() { fun setUp() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
provider = LetterboxBackgroundProvider(windowManager, fakeExecutor, dumpManager) setUpWallpaperManager()
provider =
LetterboxBackgroundProvider(
windowManager, fakeExecutor, dumpManager, wallpaperManager, mainHandler)
}
private fun setUpWallpaperManager() {
doAnswer { invocation ->
wallpaperColorsListener = invocation.arguments[0] as OnColorsChangedListener
return@doAnswer Unit
}
.`when`(wallpaperManager)
.addOnColorsChangedListener(any(), eq(mainHandler))
doAnswer {
wallpaperColorsListener = null
return@doAnswer Unit
}
.`when`(wallpaperManager)
.removeOnColorsChangedListener(any(OnColorsChangedListener::class.java))
} }
@Test @Test
@@ -75,6 +108,31 @@ class LetterboxBackgroundProviderTest : SysuiTestCase() {
assertThat(provider.letterboxBackgroundColor).isEqualTo(Color.RED) assertThat(provider.letterboxBackgroundColor).isEqualTo(Color.RED)
} }
@Test
fun letterboxBackgroundColor_returnsValueFromWindowManagerOnlyOnce() {
whenever(windowManager.letterboxBackgroundColorInArgb).thenReturn(Color.RED)
provider.start()
fakeExecutor.runAllReady()
expect.that(provider.letterboxBackgroundColor).isEqualTo(Color.RED)
whenever(windowManager.letterboxBackgroundColorInArgb).thenReturn(Color.GREEN)
fakeExecutor.runAllReady()
expect.that(provider.letterboxBackgroundColor).isEqualTo(Color.RED)
}
@Test
fun letterboxBackgroundColor_afterWallpaperChanges_returnsUpdatedColor() {
whenever(windowManager.letterboxBackgroundColorInArgb).thenReturn(Color.RED)
provider.start()
fakeExecutor.runAllReady()
whenever(windowManager.letterboxBackgroundColorInArgb).thenReturn(Color.GREEN)
wallpaperColorsListener!!.onColorsChanged(null, 0)
fakeExecutor.runAllReady()
assertThat(provider.letterboxBackgroundColor).isEqualTo(Color.GREEN)
}
@Test @Test
fun isLetterboxBackgroundMultiColored_defaultValue_returnsFalse() { fun isLetterboxBackgroundMultiColored_defaultValue_returnsFalse() {
assertThat(provider.isLetterboxBackgroundMultiColored).isEqualTo(false) assertThat(provider.isLetterboxBackgroundMultiColored).isEqualTo(false)