Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProvider.kt +15 −0 Original line number Diff line number Diff line Loading @@ -17,11 +17,14 @@ package com.android.systemui.statusbar.phone import android.annotation.ColorInt import android.app.WallpaperManager import android.graphics.Color import android.os.Handler import android.os.RemoteException import android.view.IWindowManager import com.android.systemui.Dumpable import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope Loading @@ -37,6 +40,8 @@ constructor( private val windowManager: IWindowManager, @Background private val backgroundExecutor: Executor, private val dumpManager: DumpManager, private val wallpaperManager: WallpaperManager, @Main private val mainHandler: Handler, ) : CentralSurfacesComponent.Startable, Dumpable { @ColorInt Loading @@ -46,9 +51,18 @@ constructor( var isLetterboxBackgroundMultiColored: Boolean = false private set private val wallpaperColorsListener = WallpaperManager.OnColorsChangedListener { _, _ -> fetchBackgroundColorInfo() } override fun start() { dumpManager.registerDumpable(javaClass.simpleName, this) fetchBackgroundColorInfo() wallpaperManager.addOnColorsChangedListener(wallpaperColorsListener, mainHandler) } private fun fetchBackgroundColorInfo() { // Using a background executor, as binder calls to IWindowManager are blocking backgroundExecutor.execute { try { Loading @@ -62,6 +76,7 @@ constructor( override fun stop() { dumpManager.unregisterDumpable(javaClass.simpleName) wallpaperManager.removeOnColorsChangedListener(wallpaperColorsListener) } override fun dump(pw: PrintWriter, args: Array<out String>) { Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProviderTest.kt +59 −1 Original line number Diff line number Diff line Loading @@ -16,19 +16,28 @@ package com.android.systemui.statusbar.phone import android.app.WallpaperManager import android.app.WallpaperManager.OnColorsChangedListener import android.graphics.Color import android.os.Handler import android.os.Looper import android.testing.AndroidTestingRunner import android.view.IWindowManager import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Expect 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.any import org.mockito.Mockito.doAnswer import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations Loading @@ -38,17 +47,41 @@ class LetterboxBackgroundProviderTest : SysuiTestCase() { private val fakeSystemClock = 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 dumpManager: DumpManager @Mock private lateinit var wallpaperManager: WallpaperManager private lateinit var provider: LetterboxBackgroundProvider private var wallpaperColorsListener: OnColorsChangedListener? = null @Before fun setUp() { 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 Loading @@ -75,6 +108,31 @@ class LetterboxBackgroundProviderTest : SysuiTestCase() { 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 fun isLetterboxBackgroundMultiColored_defaultValue_returnsFalse() { assertThat(provider.isLetterboxBackgroundMultiColored).isEqualTo(false) Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProvider.kt +15 −0 Original line number Diff line number Diff line Loading @@ -17,11 +17,14 @@ package com.android.systemui.statusbar.phone import android.annotation.ColorInt import android.app.WallpaperManager import android.graphics.Color import android.os.Handler import android.os.RemoteException import android.view.IWindowManager import com.android.systemui.Dumpable import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope Loading @@ -37,6 +40,8 @@ constructor( private val windowManager: IWindowManager, @Background private val backgroundExecutor: Executor, private val dumpManager: DumpManager, private val wallpaperManager: WallpaperManager, @Main private val mainHandler: Handler, ) : CentralSurfacesComponent.Startable, Dumpable { @ColorInt Loading @@ -46,9 +51,18 @@ constructor( var isLetterboxBackgroundMultiColored: Boolean = false private set private val wallpaperColorsListener = WallpaperManager.OnColorsChangedListener { _, _ -> fetchBackgroundColorInfo() } override fun start() { dumpManager.registerDumpable(javaClass.simpleName, this) fetchBackgroundColorInfo() wallpaperManager.addOnColorsChangedListener(wallpaperColorsListener, mainHandler) } private fun fetchBackgroundColorInfo() { // Using a background executor, as binder calls to IWindowManager are blocking backgroundExecutor.execute { try { Loading @@ -62,6 +76,7 @@ constructor( override fun stop() { dumpManager.unregisterDumpable(javaClass.simpleName) wallpaperManager.removeOnColorsChangedListener(wallpaperColorsListener) } override fun dump(pw: PrintWriter, args: Array<out String>) { Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LetterboxBackgroundProviderTest.kt +59 −1 Original line number Diff line number Diff line Loading @@ -16,19 +16,28 @@ package com.android.systemui.statusbar.phone import android.app.WallpaperManager import android.app.WallpaperManager.OnColorsChangedListener import android.graphics.Color import android.os.Handler import android.os.Looper import android.testing.AndroidTestingRunner import android.view.IWindowManager import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Expect 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.any import org.mockito.Mockito.doAnswer import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations Loading @@ -38,17 +47,41 @@ class LetterboxBackgroundProviderTest : SysuiTestCase() { private val fakeSystemClock = 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 dumpManager: DumpManager @Mock private lateinit var wallpaperManager: WallpaperManager private lateinit var provider: LetterboxBackgroundProvider private var wallpaperColorsListener: OnColorsChangedListener? = null @Before fun setUp() { 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 Loading @@ -75,6 +108,31 @@ class LetterboxBackgroundProviderTest : SysuiTestCase() { 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 fun isLetterboxBackgroundMultiColored_defaultValue_returnsFalse() { assertThat(provider.isLetterboxBackgroundMultiColored).isEqualTo(false) Loading