Loading packages/SystemUI/shared/src/com/android/systemui/shared/regionsampling/RegionSampler.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -263,6 +263,8 @@ constructor( (colors?.colorHints?.and(WallpaperColors.HINT_SUPPORTS_DARK_TEXT)) != (colors?.colorHints?.and(WallpaperColors.HINT_SUPPORTS_DARK_TEXT)) != WallpaperColors.HINT_SUPPORTS_DARK_TEXT WallpaperColors.HINT_SUPPORTS_DARK_TEXT ) ) if (DEBUG) Log.d(TAG, "onColorsChanged() | region darkness = $regionDarkness for region $area") updateForegroundColor() updateForegroundColor() } } Loading packages/SystemUI/src/com/android/keyguard/ClockEventController.kt +58 −34 Original line number Original line Diff line number Diff line Loading @@ -15,18 +15,18 @@ */ */ package com.android.keyguard package com.android.keyguard import android.app.WallpaperManager import android.content.BroadcastReceiver import android.content.BroadcastReceiver import android.content.Context import android.content.Context import android.content.Intent import android.content.Intent import android.content.IntentFilter import android.content.IntentFilter import android.content.res.Resources import android.content.res.Resources import android.text.format.DateFormat import android.text.format.DateFormat import android.util.TypedValue import android.util.Log import android.util.Log import android.util.TypedValue import android.view.View import android.view.View import android.view.View.OnAttachStateChangeListener import android.view.View.OnAttachStateChangeListener import android.view.ViewTreeObserver import android.view.ViewTreeObserver import android.widget.FrameLayout import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle Loading Loading @@ -99,6 +99,28 @@ constructor( if (!regionSamplingEnabled) { if (!regionSamplingEnabled) { updateColors() updateColors() } else { clock?.let { smallRegionSampler = createRegionSampler( it.smallClock.view, mainExecutor, bgExecutor, regionSamplingEnabled, isLockscreen = true, ::updateColors )?.apply { startRegionSampler() } largeRegionSampler = createRegionSampler( it.largeClock.view, mainExecutor, bgExecutor, regionSamplingEnabled, isLockscreen = true, ::updateColors )?.apply { startRegionSampler() } updateColors() } } } updateFontSizes() updateFontSizes() updateTimeListeners() updateTimeListeners() Loading @@ -110,8 +132,25 @@ constructor( } } value.smallClock.view.addOnAttachStateChangeListener( value.smallClock.view.addOnAttachStateChangeListener( object : OnAttachStateChangeListener { object : OnAttachStateChangeListener { override fun onViewAttachedToWindow(p0: View?) { var pastVisibility: Int? = null override fun onViewAttachedToWindow(view: View?) { value.events.onTimeFormatChanged(DateFormat.is24HourFormat(context)) value.events.onTimeFormatChanged(DateFormat.is24HourFormat(context)) if (view != null) { val smallClockFrame = view.parent as FrameLayout pastVisibility = smallClockFrame.visibility smallClockFrame.viewTreeObserver.addOnGlobalLayoutListener( ViewTreeObserver.OnGlobalLayoutListener { val currentVisibility = smallClockFrame.visibility if (pastVisibility != currentVisibility) { pastVisibility = currentVisibility // when small clock visible, recalculate bounds and sample if (currentVisibility == View.VISIBLE) { smallRegionSampler?.stopRegionSampler() smallRegionSampler?.startRegionSampler() } } }) } } } override fun onViewDetachedFromWindow(p0: View?) { override fun onViewDetachedFromWindow(p0: View?) { Loading Loading @@ -141,21 +180,19 @@ constructor( private fun updateColors() { private fun updateColors() { val wallpaperManager = WallpaperManager.getInstance(context) if (regionSamplingEnabled) { if (regionSamplingEnabled) { regionSampler?.let { regionSampler -> clock?.let { clock -> clock?.let { clock -> if (regionSampler.sampledView == clock.smallClock.view) { smallRegionSampler?.let { smallClockIsDark = regionSampler.currentRegionDarkness().isDark smallClockIsDark = it.currentRegionDarkness().isDark clock.smallClock.events.onRegionDarknessChanged(smallClockIsDark) clock.smallClock.events.onRegionDarknessChanged(smallClockIsDark) return@updateColors } else if (regionSampler.sampledView == clock.largeClock.view) { largeClockIsDark = regionSampler.currentRegionDarkness().isDark clock.largeClock.events.onRegionDarknessChanged(largeClockIsDark) return@updateColors } } largeRegionSampler?.let { largeClockIsDark = it.currentRegionDarkness().isDark clock.largeClock.events.onRegionDarknessChanged(largeClockIsDark) } } } } return } } val isLightTheme = TypedValue() val isLightTheme = TypedValue() Loading @@ -168,23 +205,6 @@ constructor( largeClock.events.onRegionDarknessChanged(largeClockIsDark) largeClock.events.onRegionDarknessChanged(largeClockIsDark) } } } } private fun updateRegionSampler(sampledRegion: View) { regionSampler?.stopRegionSampler() regionSampler = createRegionSampler( sampledRegion, mainExecutor, bgExecutor, regionSamplingEnabled, isLockscreen = true, ::updateColors ) ?.apply { startRegionSampler() } updateColors() } protected open fun createRegionSampler( protected open fun createRegionSampler( sampledView: View, sampledView: View, mainExecutor: Executor?, mainExecutor: Executor?, Loading @@ -202,7 +222,10 @@ constructor( ) { updateColors() } ) { updateColors() } } } var regionSampler: RegionSampler? = null var smallRegionSampler: RegionSampler? = null private set var largeRegionSampler: RegionSampler? = null private set var smallTimeListener: TimeListener? = null var smallTimeListener: TimeListener? = null var largeTimeListener: TimeListener? = null var largeTimeListener: TimeListener? = null val shouldTimeListenerRun: Boolean val shouldTimeListenerRun: Boolean Loading Loading @@ -319,7 +342,8 @@ constructor( configurationController.removeCallback(configListener) configurationController.removeCallback(configListener) batteryController.removeCallback(batteryCallback) batteryController.removeCallback(batteryCallback) keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback) keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback) regionSampler?.stopRegionSampler() smallRegionSampler?.stopRegionSampler() largeRegionSampler?.stopRegionSampler() smallTimeListener?.stop() smallTimeListener?.stop() largeTimeListener?.stop() largeTimeListener?.stop() } } Loading packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +7 −3 Original line number Original line Diff line number Diff line Loading @@ -531,9 +531,13 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS if (clock != null) { if (clock != null) { clock.dump(pw); clock.dump(pw); } } final RegionSampler regionSampler = mClockEventController.getRegionSampler(); final RegionSampler smallRegionSampler = mClockEventController.getSmallRegionSampler(); if (regionSampler != null) { if (smallRegionSampler != null) { regionSampler.dump(pw); smallRegionSampler.dump(pw); } final RegionSampler largeRegionSampler = mClockEventController.getLargeRegionSampler(); if (largeRegionSampler != null) { largeRegionSampler.dump(pw); } } } } Loading packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt +3 −3 Original line number Original line Diff line number Diff line Loading @@ -53,6 +53,7 @@ import org.junit.Before import org.junit.Rule 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.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyFloat import org.mockito.ArgumentMatchers.anyFloat import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.Mock Loading Loading @@ -157,9 +158,8 @@ class ClockEventControllerTest : SysuiTestCase() { @Test @Test fun themeChanged_verifyClockPaletteUpdated() = runBlocking(IMMEDIATE) { fun themeChanged_verifyClockPaletteUpdated() = runBlocking(IMMEDIATE) { // TODO(b/266103601): delete this test and add more coverage for updateColors() verify(smallClockEvents).onRegionDarknessChanged(anyBoolean()) // verify(smallClockEvents).onRegionDarknessChanged(anyBoolean()) verify(largeClockEvents).onRegionDarknessChanged(anyBoolean()) // verify(largeClockEvents).onRegionDarknessChanged(anyBoolean()) val captor = argumentCaptor<ConfigurationController.ConfigurationListener>() val captor = argumentCaptor<ConfigurationController.ConfigurationListener>() verify(configurationController).addCallback(capture(captor)) verify(configurationController).addCallback(capture(captor)) Loading Loading
packages/SystemUI/shared/src/com/android/systemui/shared/regionsampling/RegionSampler.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -263,6 +263,8 @@ constructor( (colors?.colorHints?.and(WallpaperColors.HINT_SUPPORTS_DARK_TEXT)) != (colors?.colorHints?.and(WallpaperColors.HINT_SUPPORTS_DARK_TEXT)) != WallpaperColors.HINT_SUPPORTS_DARK_TEXT WallpaperColors.HINT_SUPPORTS_DARK_TEXT ) ) if (DEBUG) Log.d(TAG, "onColorsChanged() | region darkness = $regionDarkness for region $area") updateForegroundColor() updateForegroundColor() } } Loading
packages/SystemUI/src/com/android/keyguard/ClockEventController.kt +58 −34 Original line number Original line Diff line number Diff line Loading @@ -15,18 +15,18 @@ */ */ package com.android.keyguard package com.android.keyguard import android.app.WallpaperManager import android.content.BroadcastReceiver import android.content.BroadcastReceiver import android.content.Context import android.content.Context import android.content.Intent import android.content.Intent import android.content.IntentFilter import android.content.IntentFilter import android.content.res.Resources import android.content.res.Resources import android.text.format.DateFormat import android.text.format.DateFormat import android.util.TypedValue import android.util.Log import android.util.Log import android.util.TypedValue import android.view.View import android.view.View import android.view.View.OnAttachStateChangeListener import android.view.View.OnAttachStateChangeListener import android.view.ViewTreeObserver import android.view.ViewTreeObserver import android.widget.FrameLayout import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import androidx.lifecycle.repeatOnLifecycle Loading Loading @@ -99,6 +99,28 @@ constructor( if (!regionSamplingEnabled) { if (!regionSamplingEnabled) { updateColors() updateColors() } else { clock?.let { smallRegionSampler = createRegionSampler( it.smallClock.view, mainExecutor, bgExecutor, regionSamplingEnabled, isLockscreen = true, ::updateColors )?.apply { startRegionSampler() } largeRegionSampler = createRegionSampler( it.largeClock.view, mainExecutor, bgExecutor, regionSamplingEnabled, isLockscreen = true, ::updateColors )?.apply { startRegionSampler() } updateColors() } } } updateFontSizes() updateFontSizes() updateTimeListeners() updateTimeListeners() Loading @@ -110,8 +132,25 @@ constructor( } } value.smallClock.view.addOnAttachStateChangeListener( value.smallClock.view.addOnAttachStateChangeListener( object : OnAttachStateChangeListener { object : OnAttachStateChangeListener { override fun onViewAttachedToWindow(p0: View?) { var pastVisibility: Int? = null override fun onViewAttachedToWindow(view: View?) { value.events.onTimeFormatChanged(DateFormat.is24HourFormat(context)) value.events.onTimeFormatChanged(DateFormat.is24HourFormat(context)) if (view != null) { val smallClockFrame = view.parent as FrameLayout pastVisibility = smallClockFrame.visibility smallClockFrame.viewTreeObserver.addOnGlobalLayoutListener( ViewTreeObserver.OnGlobalLayoutListener { val currentVisibility = smallClockFrame.visibility if (pastVisibility != currentVisibility) { pastVisibility = currentVisibility // when small clock visible, recalculate bounds and sample if (currentVisibility == View.VISIBLE) { smallRegionSampler?.stopRegionSampler() smallRegionSampler?.startRegionSampler() } } }) } } } override fun onViewDetachedFromWindow(p0: View?) { override fun onViewDetachedFromWindow(p0: View?) { Loading Loading @@ -141,21 +180,19 @@ constructor( private fun updateColors() { private fun updateColors() { val wallpaperManager = WallpaperManager.getInstance(context) if (regionSamplingEnabled) { if (regionSamplingEnabled) { regionSampler?.let { regionSampler -> clock?.let { clock -> clock?.let { clock -> if (regionSampler.sampledView == clock.smallClock.view) { smallRegionSampler?.let { smallClockIsDark = regionSampler.currentRegionDarkness().isDark smallClockIsDark = it.currentRegionDarkness().isDark clock.smallClock.events.onRegionDarknessChanged(smallClockIsDark) clock.smallClock.events.onRegionDarknessChanged(smallClockIsDark) return@updateColors } else if (regionSampler.sampledView == clock.largeClock.view) { largeClockIsDark = regionSampler.currentRegionDarkness().isDark clock.largeClock.events.onRegionDarknessChanged(largeClockIsDark) return@updateColors } } largeRegionSampler?.let { largeClockIsDark = it.currentRegionDarkness().isDark clock.largeClock.events.onRegionDarknessChanged(largeClockIsDark) } } } } return } } val isLightTheme = TypedValue() val isLightTheme = TypedValue() Loading @@ -168,23 +205,6 @@ constructor( largeClock.events.onRegionDarknessChanged(largeClockIsDark) largeClock.events.onRegionDarknessChanged(largeClockIsDark) } } } } private fun updateRegionSampler(sampledRegion: View) { regionSampler?.stopRegionSampler() regionSampler = createRegionSampler( sampledRegion, mainExecutor, bgExecutor, regionSamplingEnabled, isLockscreen = true, ::updateColors ) ?.apply { startRegionSampler() } updateColors() } protected open fun createRegionSampler( protected open fun createRegionSampler( sampledView: View, sampledView: View, mainExecutor: Executor?, mainExecutor: Executor?, Loading @@ -202,7 +222,10 @@ constructor( ) { updateColors() } ) { updateColors() } } } var regionSampler: RegionSampler? = null var smallRegionSampler: RegionSampler? = null private set var largeRegionSampler: RegionSampler? = null private set var smallTimeListener: TimeListener? = null var smallTimeListener: TimeListener? = null var largeTimeListener: TimeListener? = null var largeTimeListener: TimeListener? = null val shouldTimeListenerRun: Boolean val shouldTimeListenerRun: Boolean Loading Loading @@ -319,7 +342,8 @@ constructor( configurationController.removeCallback(configListener) configurationController.removeCallback(configListener) batteryController.removeCallback(batteryCallback) batteryController.removeCallback(batteryCallback) keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback) keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback) regionSampler?.stopRegionSampler() smallRegionSampler?.stopRegionSampler() largeRegionSampler?.stopRegionSampler() smallTimeListener?.stop() smallTimeListener?.stop() largeTimeListener?.stop() largeTimeListener?.stop() } } Loading
packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +7 −3 Original line number Original line Diff line number Diff line Loading @@ -531,9 +531,13 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS if (clock != null) { if (clock != null) { clock.dump(pw); clock.dump(pw); } } final RegionSampler regionSampler = mClockEventController.getRegionSampler(); final RegionSampler smallRegionSampler = mClockEventController.getSmallRegionSampler(); if (regionSampler != null) { if (smallRegionSampler != null) { regionSampler.dump(pw); smallRegionSampler.dump(pw); } final RegionSampler largeRegionSampler = mClockEventController.getLargeRegionSampler(); if (largeRegionSampler != null) { largeRegionSampler.dump(pw); } } } } Loading
packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt +3 −3 Original line number Original line Diff line number Diff line Loading @@ -53,6 +53,7 @@ import org.junit.Before import org.junit.Rule 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.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyFloat import org.mockito.ArgumentMatchers.anyFloat import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.Mock Loading Loading @@ -157,9 +158,8 @@ class ClockEventControllerTest : SysuiTestCase() { @Test @Test fun themeChanged_verifyClockPaletteUpdated() = runBlocking(IMMEDIATE) { fun themeChanged_verifyClockPaletteUpdated() = runBlocking(IMMEDIATE) { // TODO(b/266103601): delete this test and add more coverage for updateColors() verify(smallClockEvents).onRegionDarknessChanged(anyBoolean()) // verify(smallClockEvents).onRegionDarknessChanged(anyBoolean()) verify(largeClockEvents).onRegionDarknessChanged(anyBoolean()) // verify(largeClockEvents).onRegionDarknessChanged(anyBoolean()) val captor = argumentCaptor<ConfigurationController.ConfigurationListener>() val captor = argumentCaptor<ConfigurationController.ConfigurationListener>() verify(configurationController).addCallback(capture(captor)) verify(configurationController).addCallback(capture(captor)) Loading