Merge "Add Region Sampler to Lockscreen Smartspace"

This commit is contained in:
Grace Han
2022-07-20 13:06:12 +00:00
committed by Android (Google) Code Review
4 changed files with 101 additions and 40 deletions

View File

@@ -15,10 +15,8 @@
*/
package com.android.systemui.shared.regionsampling
import android.content.res.Resources
import android.graphics.Rect
import android.view.View
import com.android.systemui.plugins.Clock
import com.android.systemui.plugins.RegionDarkness
import com.android.systemui.shared.navigationbar.RegionSamplingHelper
import com.android.systemui.shared.navigationbar.RegionSamplingHelper.SamplingCallback
@@ -33,13 +31,23 @@ class RegionSamplingInstance(
mainExecutor: Executor?,
bgExecutor: Executor?,
regionSamplingEnabled: Boolean,
clock: Clock?,
resources: Resources
updateFun: UpdateColorCallback
) {
private var isDark = RegionDarkness.DEFAULT
private var samplingBounds = Rect()
private var regionSampler: RegionSamplingHelper? = null
/**
* Interface for method to be passed into RegionSamplingHelper
*/
@FunctionalInterface
interface UpdateColorCallback {
/**
* Method to update the text colors after clock darkness changed.
*/
fun updateColors()
}
private fun convertToClockDarkness(isRegionDark: Boolean): RegionDarkness {
return if (isRegionDark) {
RegionDarkness.DARK
@@ -48,7 +56,7 @@ class RegionSamplingInstance(
}
}
fun currentClockDarkness(): RegionDarkness {
fun currentRegionDarkness(): RegionDarkness {
return isDark
}
@@ -86,7 +94,7 @@ class RegionSamplingInstance(
object : SamplingCallback {
override fun onRegionDarknessChanged(isRegionDark: Boolean) {
isDark = convertToClockDarkness(isRegionDark)
clock?.events?.onColorPaletteChanged(resources, isDark, isDark)
updateFun.updateColors()
}
override fun getSampledRegion(sampledView: View): Rect {

View File

@@ -72,11 +72,13 @@ class ClockEventController @Inject constructor(
private val regionSamplingEnabled =
featureFlags.isEnabled(com.android.systemui.flags.Flags.REGION_SAMPLING)
private fun updateColors(currentClock: Clock?) {
smallClockIsDark = smallRegionSamplingInstance.currentClockDarkness()
largeClockIsDark = largeRegionSamplingInstance.currentClockDarkness()
private val updateFun = object : RegionSamplingInstance.UpdateColorCallback {
override fun updateColors() {
smallClockIsDark = smallRegionSamplingInstance.currentRegionDarkness()
largeClockIsDark = largeRegionSamplingInstance.currentRegionDarkness()
currentClock?.events?.onColorPaletteChanged(resources, smallClockIsDark, largeClockIsDark)
clock?.events?.onColorPaletteChanged(resources, smallClockIsDark, largeClockIsDark)
}
}
fun updateRegionSamplers(currentClock: Clock?) {
@@ -88,8 +90,7 @@ class ClockEventController @Inject constructor(
mainExecutor,
bgExecutor,
regionSamplingEnabled,
currentClock,
resources
updateFun
)
largeRegionSamplingInstance = RegionSamplingInstance(
@@ -97,14 +98,13 @@ class ClockEventController @Inject constructor(
mainExecutor,
bgExecutor,
regionSamplingEnabled,
currentClock,
resources
updateFun
)
smallRegionSamplingInstance.startRegionSampler()
largeRegionSamplingInstance.startRegionSampler()
updateColors(currentClock)
updateFun.updateColors()
}
var smallRegionSamplingInstance: RegionSamplingInstance = RegionSamplingInstance(
@@ -112,8 +112,7 @@ class ClockEventController @Inject constructor(
mainExecutor,
bgExecutor,
regionSamplingEnabled,
clock,
resources
updateFun
)
var largeRegionSamplingInstance: RegionSamplingInstance = RegionSamplingInstance(
@@ -121,16 +120,15 @@ class ClockEventController @Inject constructor(
mainExecutor,
bgExecutor,
regionSamplingEnabled,
clock,
resources
updateFun
)
private var smallClockIsDark = smallRegionSamplingInstance.currentClockDarkness()
private var largeClockIsDark = largeRegionSamplingInstance.currentClockDarkness()
private var smallClockIsDark = smallRegionSamplingInstance.currentRegionDarkness()
private var largeClockIsDark = largeRegionSamplingInstance.currentRegionDarkness()
private val configListener = object : ConfigurationController.ConfigurationListener {
override fun onThemeChanged() {
updateColors(clock)
updateFun.updateColors()
}
}

View File

@@ -31,11 +31,13 @@ import android.os.UserHandle
import android.provider.Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS
import android.provider.Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS
import android.util.Log
import android.view.ContextThemeWrapper
import android.view.View
import android.view.ViewGroup
import com.android.settingslib.Utils
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
@@ -46,6 +48,7 @@ import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceView
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.settings.UserTracker
import com.android.systemui.shared.regionsampling.RegionSamplingInstance
import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.DeviceProvisionedController
@@ -60,22 +63,23 @@ import javax.inject.Inject
*/
@SysUISingleton
class LockscreenSmartspaceController @Inject constructor(
private val context: Context,
private val featureFlags: FeatureFlags,
private val smartspaceManager: SmartspaceManager,
private val activityStarter: ActivityStarter,
private val falsingManager: FalsingManager,
private val secureSettings: SecureSettings,
private val userTracker: UserTracker,
private val contentResolver: ContentResolver,
private val configurationController: ConfigurationController,
private val statusBarStateController: StatusBarStateController,
private val deviceProvisionedController: DeviceProvisionedController,
private val bypassController: KeyguardBypassController,
private val execution: Execution,
@Main private val uiExecutor: Executor,
@Main private val handler: Handler,
optionalPlugin: Optional<BcSmartspaceDataPlugin>
private val context: Context,
private val featureFlags: FeatureFlags,
private val smartspaceManager: SmartspaceManager,
private val activityStarter: ActivityStarter,
private val falsingManager: FalsingManager,
private val secureSettings: SecureSettings,
private val userTracker: UserTracker,
private val contentResolver: ContentResolver,
private val configurationController: ConfigurationController,
private val statusBarStateController: StatusBarStateController,
private val deviceProvisionedController: DeviceProvisionedController,
private val bypassController: KeyguardBypassController,
private val execution: Execution,
@Main private val uiExecutor: Executor,
@Background private val bgExecutor: Executor,
@Main private val handler: Handler,
optionalPlugin: Optional<BcSmartspaceDataPlugin>
) {
companion object {
private const val TAG = "LockscreenSmartspaceController"
@@ -86,15 +90,37 @@ class LockscreenSmartspaceController @Inject constructor(
// Smartspace can be used on multiple displays, such as when the user casts their screen
private var smartspaceViews = mutableSetOf<SmartspaceView>()
private var regionSamplingInstances =
mutableMapOf<SmartspaceView, RegionSamplingInstance>()
private val regionSamplingEnabled =
featureFlags.isEnabled(Flags.REGION_SAMPLING)
private var showNotifications = false
private var showSensitiveContentForCurrentUser = false
private var showSensitiveContentForManagedUser = false
private var managedUserHandle: UserHandle? = null
private val updateFun = object : RegionSamplingInstance.UpdateColorCallback {
override fun updateColors() {
updateTextColorFromRegionSampler()
}
}
// TODO: Move logic into SmartspaceView
var stateChangeListener = object : View.OnAttachStateChangeListener {
override fun onViewAttachedToWindow(v: View) {
smartspaceViews.add(v as SmartspaceView)
var regionSamplingInstance = RegionSamplingInstance(
v,
uiExecutor,
bgExecutor,
regionSamplingEnabled,
updateFun
)
regionSamplingInstance.startRegionSampler()
regionSamplingInstances.put(v, regionSamplingInstance)
connectSession()
updateTextColorFromWallpaper()
@@ -104,6 +130,10 @@ class LockscreenSmartspaceController @Inject constructor(
override fun onViewDetachedFromWindow(v: View) {
smartspaceViews.remove(v as SmartspaceView)
var regionSamplingInstance = regionSamplingInstances.getValue(v)
regionSamplingInstance.stopRegionSampler()
regionSamplingInstances.remove(v)
if (smartspaceViews.isEmpty()) {
disconnect()
}
@@ -332,9 +362,29 @@ class LockscreenSmartspaceController @Inject constructor(
}
}
private fun updateTextColorFromRegionSampler() {
smartspaceViews.forEach {
val isRegionDark = regionSamplingInstances.getValue(it).currentRegionDarkness()
val themeID = if (isRegionDark.isDark) {
R.style.Theme_SystemUI
} else {
R.style.Theme_SystemUI_LightWallpaper
}
val themedContext = ContextThemeWrapper(context, themeID)
val wallpaperTextColor =
Utils.getColorAttrDefaultColor(themedContext, R.attr.wallpaperTextColor)
it.setPrimaryTextColor(wallpaperTextColor)
}
}
private fun updateTextColorFromWallpaper() {
val wallpaperTextColor = Utils.getColorAttrDefaultColor(context, R.attr.wallpaperTextColor)
smartspaceViews.forEach { it.setPrimaryTextColor(wallpaperTextColor) }
if (!regionSamplingEnabled) {
val wallpaperTextColor =
Utils.getColorAttrDefaultColor(context, R.attr.wallpaperTextColor)
smartspaceViews.forEach { it.setPrimaryTextColor(wallpaperTextColor) }
} else {
updateTextColorFromRegionSampler()
}
}
private fun reloadSmartspace() {

View File

@@ -56,6 +56,7 @@ import com.android.systemui.util.mockito.eq
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.time.FakeSystemClock
import java.util.Optional
import java.util.concurrent.Executor
import org.junit.Before
import org.junit.Test
import org.mockito.ArgumentCaptor
@@ -104,6 +105,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
@Mock
private lateinit var deviceProvisionedController: DeviceProvisionedController
@Mock
private lateinit var bgExecutor: Executor
@Mock
private lateinit var handler: Handler
@@ -203,6 +207,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
keyguardBypassController,
execution,
executor,
bgExecutor,
handler,
Optional.of(plugin)
)