Merge "Add Region Sampler to Lockscreen Smartspace"
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user