Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 417feefd authored by Grace's avatar Grace Committed by Hawkwood Glazier
Browse files

[DO NOT MERGE] Moving Text Protection to Clock Event Controller

This change moves text protection from the Animatable Clock Controller
to the Clock Event Controller.

Bug: 202758428
Fixes: 241260493
Test: atest ClockEventControllerTest
Change-Id: I33b8f69c1a5b7b915bb020be16593ef68c46281d
Merged-In: I33b8f69c1a5b7b915bb020be16593ef68c46281d
parent 13c1e7ef
Loading
Loading
Loading
Loading
+19 −2
Original line number Original line Diff line number Diff line
@@ -61,7 +61,11 @@ interface Clock {


    /** Initializes various rendering parameters. If never called, provides reasonable defaults. */
    /** Initializes various rendering parameters. If never called, provides reasonable defaults. */
    fun initialize(resources: Resources, dozeFraction: Float, foldFraction: Float) {
    fun initialize(resources: Resources, dozeFraction: Float, foldFraction: Float) {
        events.onColorPaletteChanged(resources)
        events.onColorPaletteChanged(
                resources,
                ClockDarkness.DEFAULT,
                ClockDarkness.DEFAULT
        )
        animations.doze(dozeFraction)
        animations.doze(dozeFraction)
        animations.fold(foldFraction)
        animations.fold(foldFraction)
        events.onTimeTick()
        events.onTimeTick()
@@ -89,7 +93,11 @@ interface ClockEvents {
    fun onFontSettingChanged() { }
    fun onFontSettingChanged() { }


    /** Call whenever the color palette should update */
    /** Call whenever the color palette should update */
    fun onColorPaletteChanged(resources: Resources) { }
    fun onColorPaletteChanged(
            resources: Resources,
            smallClockIsDark: ClockDarkness,
            largeClockIsDark: ClockDarkness
    ) { }
}
}


/** Methods which trigger various clock animations */
/** Methods which trigger various clock animations */
@@ -112,3 +120,12 @@ data class ClockMetadata(
    val clockId: ClockId,
    val clockId: ClockId,
    val name: String
    val name: String
)
)

/**
 * Enum for whether clock region is dark or light.
 */
enum class ClockDarkness(val isDark: Boolean) {
    DEFAULT(true),
    DARK(true),
    LIGHT(false)
}
+25 −6
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import android.view.LayoutInflater
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.plugins.Clock
import com.android.systemui.plugins.Clock
import com.android.systemui.plugins.ClockAnimations
import com.android.systemui.plugins.ClockAnimations
import com.android.systemui.plugins.ClockDarkness
import com.android.systemui.plugins.ClockEvents
import com.android.systemui.plugins.ClockEvents
import com.android.systemui.plugins.ClockId
import com.android.systemui.plugins.ClockId
import com.android.systemui.plugins.ClockMetadata
import com.android.systemui.plugins.ClockMetadata
@@ -83,6 +84,16 @@ class DefaultClock(
        resources.getFloat(R.dimen.keyguard_clock_line_spacing_scale_burmese)
        resources.getFloat(R.dimen.keyguard_clock_line_spacing_scale_burmese)
    private val defaultLineSpacing = resources.getFloat(R.dimen.keyguard_clock_line_spacing_scale)
    private val defaultLineSpacing = resources.getFloat(R.dimen.keyguard_clock_line_spacing_scale)


    private fun updateClockColor(clock: AnimatableClockView, darkValue: ClockDarkness) {
        val color = if (darkValue.isDark) {
            resources.getColor(android.R.color.system_accent2_600)
        } else {
            resources.getColor(android.R.color.system_accent1_100)
        }
        clock.setColors(DOZE_COLOR, color)
        clock.animateAppearOnLockscreen()
    }

    override val events = object : ClockEvents {
    override val events = object : ClockEvents {
        override fun onTimeTick() = clocks.forEach { it.refreshTime() }
        override fun onTimeTick() = clocks.forEach { it.refreshTime() }


@@ -104,9 +115,13 @@ class DefaultClock(
            recomputePadding()
            recomputePadding()
        }
        }


        override fun onColorPaletteChanged(resources: Resources) {
        override fun onColorPaletteChanged(
            val color = resources.getColor(android.R.color.system_accent1_100)
                resources: Resources,
            clocks.forEach { it.setColors(DOZE_COLOR, color) }
                smallClockIsDark: ClockDarkness,
                largeClockIsDark: ClockDarkness
        ) {
            updateClockColor(smallClock, smallClockIsDark)
            updateClockColor(largeClock, largeClockIsDark)
        }
        }


        override fun onLocaleChanged(locale: Locale) {
        override fun onLocaleChanged(locale: Locale) {
@@ -187,7 +202,11 @@ class DefaultClock(
    override fun initialize(resources: Resources, dozeFraction: Float, foldFraction: Float) {
    override fun initialize(resources: Resources, dozeFraction: Float, foldFraction: Float) {
        recomputePadding()
        recomputePadding()
        animations = DefaultClockAnimations(dozeFraction, foldFraction)
        animations = DefaultClockAnimations(dozeFraction, foldFraction)
        events.onColorPaletteChanged(resources)
        events.onColorPaletteChanged(
                resources,
                ClockDarkness.DEFAULT,
                ClockDarkness.DEFAULT
        )
        events.onTimeTick()
        events.onTimeTick()
    }
    }


+112 −8
Original line number Original line Diff line number Diff line
@@ -20,17 +20,24 @@ 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.graphics.Rect
import android.text.format.DateFormat
import android.text.format.DateFormat
import android.view.View
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.plugins.Clock
import com.android.systemui.plugins.Clock
import com.android.systemui.plugins.ClockDarkness
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.shared.navigationbar.RegionSamplingHelper
import com.android.systemui.statusbar.policy.BatteryController
import com.android.systemui.statusbar.policy.BatteryController
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.ConfigurationController
import java.io.PrintWriter
import java.io.PrintWriter
import java.util.Locale
import java.util.Locale
import java.util.TimeZone
import java.util.TimeZone
import java.util.concurrent.Executor
import javax.inject.Inject
import javax.inject.Inject


/**
/**
@@ -44,7 +51,10 @@ class ClockEventController @Inject constructor(
        private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
        private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
        private val configurationController: ConfigurationController,
        private val configurationController: ConfigurationController,
        @Main private val resources: Resources,
        @Main private val resources: Resources,
    private val context: Context
        private val context: Context,
        @Main private val mainExecutor: Executor,
        @Background private val bgExecutor: Executor,
        private val featureFlags: FeatureFlags
) {
) {
    var clock: Clock? = null
    var clock: Clock? = null
        set(value) {
        set(value) {
@@ -61,9 +71,94 @@ class ClockEventController @Inject constructor(
    private var dozeAmount = 0f
    private var dozeAmount = 0f
    private var isKeyguardShowing = false
    private var isKeyguardShowing = false


    private var smallClockIsDark = ClockDarkness.DEFAULT
    private var largeClockIsDark = ClockDarkness.DEFAULT
    private var smallSamplingBounds = Rect()
    private var largeSamplingBounds = Rect()

    private val regionSamplingEnabled =
            featureFlags.isEnabled(com.android.systemui.flags.Flags.REGION_SAMPLING)

    private fun setClockDarkness(isRegionDark: Boolean): ClockDarkness {
        return if (isRegionDark) {
            ClockDarkness.DARK
        } else {
            ClockDarkness.LIGHT
        }
    }

    // TODO: Abstract out the creation of RegionSampler and its fields
    var smallRegionSampling: RegionSamplingHelper? =
            if (!regionSamplingEnabled || clock == null) {
                null
            } else {
                RegionSamplingHelper(clock?.smallClock,
                        object : RegionSamplingHelper.SamplingCallback {
                            override fun onRegionDarknessChanged(isRegionDark: Boolean) {
                                smallClockIsDark = setClockDarkness(isRegionDark)
                                clock?.events?.onColorPaletteChanged(
                                        resources,
                                        smallClockIsDark,
                                        largeClockIsDark
                                )
                            }

                            override fun getSampledRegion(sampledView: View): Rect {
                                smallSamplingBounds = Rect(
                                        sampledView.left,
                                        sampledView.top,
                                        sampledView.right,
                                        sampledView.bottom
                                )
                                return smallSamplingBounds
                            }

                            override fun isSamplingEnabled(): Boolean {
                                return regionSamplingEnabled
                            }
                        },
                        mainExecutor, bgExecutor)
            }

    var largeRegionSampling: RegionSamplingHelper? =
            if (!regionSamplingEnabled || clock == null) {
                null
            } else {
                RegionSamplingHelper(clock?.largeClock,
                        object : RegionSamplingHelper.SamplingCallback {
                            override fun onRegionDarknessChanged(isRegionDark: Boolean) {
                                largeClockIsDark = setClockDarkness(isRegionDark)
                                clock?.events?.onColorPaletteChanged(
                                        resources,
                                        smallClockIsDark,
                                        largeClockIsDark
                                )
                            }

                            override fun getSampledRegion(sampledView: View): Rect {
                                largeSamplingBounds = Rect(
                                        sampledView.left,
                                        sampledView.top,
                                        sampledView.right,
                                        sampledView.bottom
                                )
                                return largeSamplingBounds
                            }

                            override fun isSamplingEnabled(): Boolean {
                                return regionSamplingEnabled
                            }
                        },
                        mainExecutor, bgExecutor)
            }

    private val configListener = object : ConfigurationController.ConfigurationListener {
    private val configListener = object : ConfigurationController.ConfigurationListener {
        override fun onThemeChanged() {
        override fun onThemeChanged() {
            clock?.events?.onColorPaletteChanged(resources)
            clock?.events?.onColorPaletteChanged(
                    resources,
                    smallClockIsDark,
                    largeClockIsDark
            )
        }
        }
    }
    }


@@ -114,6 +209,9 @@ class ClockEventController @Inject constructor(


    init {
    init {
        isDozing = statusBarStateController.isDozing
        isDozing = statusBarStateController.isDozing
        smallRegionSampling?.setWindowVisible(true)
        largeRegionSampling?.setWindowVisible(true)
        clock?.events?.onColorPaletteChanged(resources, smallClockIsDark, largeClockIsDark)
    }
    }


    fun registerListeners() {
    fun registerListeners() {
@@ -128,6 +226,8 @@ class ClockEventController @Inject constructor(
        batteryController.addCallback(batteryCallback)
        batteryController.addCallback(batteryCallback)
        keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
        keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback)
        statusBarStateController.addCallback(statusBarStateListener)
        statusBarStateController.addCallback(statusBarStateListener)
        smallRegionSampling?.start(smallSamplingBounds)
        largeRegionSampling?.start(largeSamplingBounds)
    }
    }


    fun unregisterListeners() {
    fun unregisterListeners() {
@@ -136,6 +236,8 @@ class ClockEventController @Inject constructor(
        batteryController.removeCallback(batteryCallback)
        batteryController.removeCallback(batteryCallback)
        keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback)
        keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback)
        statusBarStateController.removeCallback(statusBarStateListener)
        statusBarStateController.removeCallback(statusBarStateListener)
        smallRegionSampling?.stop()
        largeRegionSampling?.stop()
    }
    }


    /**
    /**
@@ -144,6 +246,8 @@ class ClockEventController @Inject constructor(
    fun dump(pw: PrintWriter) {
    fun dump(pw: PrintWriter) {
        pw.println(this)
        pw.println(this)
        clock?.dump(pw)
        clock?.dump(pw)
        smallRegionSampling?.dump(pw)
        largeRegionSampling?.dump(pw)
    }
    }


    companion object {
    companion object {
+10 −2
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ import android.widget.TextView
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.plugins.Clock
import com.android.systemui.plugins.Clock
import com.android.systemui.plugins.ClockAnimations
import com.android.systemui.plugins.ClockAnimations
import com.android.systemui.plugins.ClockEvents
import com.android.systemui.plugins.ClockEvents
@@ -33,6 +34,7 @@ import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.mock
import java.util.TimeZone
import java.util.TimeZone
import java.util.concurrent.Executor
import org.junit.Assert.assertEquals
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Before
import org.junit.Rule
import org.junit.Rule
@@ -60,6 +62,9 @@ class ClockEventControllerTest : SysuiTestCase() {
    @Mock private lateinit var animations: ClockAnimations
    @Mock private lateinit var animations: ClockAnimations
    @Mock private lateinit var events: ClockEvents
    @Mock private lateinit var events: ClockEvents
    @Mock private lateinit var clock: Clock
    @Mock private lateinit var clock: Clock
    @Mock private lateinit var mainExecutor: Executor
    @Mock private lateinit var bgExecutor: Executor
    @Mock private lateinit var featureFlags: FeatureFlags


    private lateinit var clockEventController: ClockEventController
    private lateinit var clockEventController: ClockEventController


@@ -77,7 +82,10 @@ class ClockEventControllerTest : SysuiTestCase() {
            keyguardUpdateMonitor,
            keyguardUpdateMonitor,
            configurationController,
            configurationController,
            context.resources,
            context.resources,
            context
            context,
            mainExecutor,
            bgExecutor,
            featureFlags
        )
        )
    }
    }


@@ -105,7 +113,7 @@ class ClockEventControllerTest : SysuiTestCase() {
        verify(configurationController).addCallback(capture(captor))
        verify(configurationController).addCallback(capture(captor))
        captor.value.onThemeChanged()
        captor.value.onThemeChanged()


        verify(events).onColorPaletteChanged(any())
        verify(events).onColorPaletteChanged(any(), any(), any())
    }
    }


    @Test
    @Test