Merge "LS Wallpaper Sampling for Clock" into udc-qpr-dev

This commit is contained in:
Florence Yang
2023-05-30 21:47:24 +00:00
committed by Android (Google) Code Review
4 changed files with 70 additions and 40 deletions

View File

@@ -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()
} }

View File

@@ -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
@@ -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()
@@ -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?) {
@@ -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 -> smallRegionSampler?.let {
if (regionSampler.sampledView == clock.smallClock.view) { smallClockIsDark = it.currentRegionDarkness().isDark
smallClockIsDark = regionSampler.currentRegionDarkness().isDark clock.smallClock.events.onRegionDarknessChanged(smallClockIsDark)
clock.smallClock.events.onRegionDarknessChanged(smallClockIsDark) }
return@updateColors
} else if (regionSampler.sampledView == clock.largeClock.view) { largeRegionSampler?.let {
largeClockIsDark = regionSampler.currentRegionDarkness().isDark largeClockIsDark = it.currentRegionDarkness().isDark
clock.largeClock.events.onRegionDarknessChanged(largeClockIsDark) clock.largeClock.events.onRegionDarknessChanged(largeClockIsDark)
return@updateColors
}
} }
} }
return
} }
val isLightTheme = TypedValue() val isLightTheme = TypedValue()
@@ -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?,
@@ -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
@@ -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()
} }

View File

@@ -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);
} }
} }

View File

@@ -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
@@ -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))