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

Commit 2d9a153b authored by Hawkwood Glazier's avatar Hawkwood Glazier Committed by Android (Google) Code Review
Browse files

Merge "Modify clock message buffers for improved logging" into main

parents a6dc194d 6e34d791
Loading
Loading
Loading
Loading
+33 −26
Original line number Original line Diff line number Diff line
@@ -33,6 +33,8 @@ import com.android.internal.annotations.VisibleForTesting
import com.android.systemui.animation.GlyphCallback
import com.android.systemui.animation.GlyphCallback
import com.android.systemui.animation.TextAnimator
import com.android.systemui.animation.TextAnimator
import com.android.systemui.customization.R
import com.android.systemui.customization.R
import com.android.systemui.log.core.LogcatOnlyMessageBuffer
import com.android.systemui.log.core.LogLevel
import com.android.systemui.log.core.Logger
import com.android.systemui.log.core.Logger
import com.android.systemui.log.core.MessageBuffer
import com.android.systemui.log.core.MessageBuffer
import java.io.PrintWriter
import java.io.PrintWriter
@@ -51,12 +53,13 @@ class AnimatableClockView @JvmOverloads constructor(
    defStyleAttr: Int = 0,
    defStyleAttr: Int = 0,
    defStyleRes: Int = 0
    defStyleRes: Int = 0
) : TextView(context, attrs, defStyleAttr, defStyleRes) {
) : TextView(context, attrs, defStyleAttr, defStyleRes) {
    var messageBuffer: MessageBuffer? = null
    // To protect us from issues from this being null while the TextView constructor is running, we
        set(value) {
    // implement the get method and ensure a value is returned before initialization is complete.
            logger = if (value != null) Logger(value, TAG) else null
    private var logger = DEFAULT_LOGGER
        }
        get() = field ?: DEFAULT_LOGGER

    var messageBuffer: MessageBuffer
    private var logger: Logger? = null
        get() = logger.buffer
        set(value) { logger = Logger(value, TAG) }


    private val time = Calendar.getInstance()
    private val time = Calendar.getInstance()


@@ -133,8 +136,8 @@ class AnimatableClockView @JvmOverloads constructor(
    }
    }


    override fun onAttachedToWindow() {
    override fun onAttachedToWindow() {
        logger.d("onAttachedToWindow")
        super.onAttachedToWindow()
        super.onAttachedToWindow()
        logger?.d("onAttachedToWindow")
        refreshFormat()
        refreshFormat()
    }
    }


@@ -150,13 +153,13 @@ class AnimatableClockView @JvmOverloads constructor(
        time.timeInMillis = timeOverrideInMillis ?: System.currentTimeMillis()
        time.timeInMillis = timeOverrideInMillis ?: System.currentTimeMillis()
        contentDescription = DateFormat.format(descFormat, time)
        contentDescription = DateFormat.format(descFormat, time)
        val formattedText = DateFormat.format(format, time)
        val formattedText = DateFormat.format(format, time)
        logger?.d({ "refreshTime: new formattedText=$str1" }) { str1 = formattedText?.toString() }
        logger.d({ "refreshTime: new formattedText=$str1" }) { str1 = formattedText?.toString() }
        // Setting text actually triggers a layout pass (because the text view is set to
        // Setting text actually triggers a layout pass (because the text view is set to
        // wrap_content width and TextView always relayouts for this). Avoid needless
        // wrap_content width and TextView always relayouts for this). Avoid needless
        // relayout if the text didn't actually change.
        // relayout if the text didn't actually change.
        if (!TextUtils.equals(text, formattedText)) {
        if (!TextUtils.equals(text, formattedText)) {
            text = formattedText
            text = formattedText
            logger?.d({ "refreshTime: done setting new time text to: $str1" }) {
            logger.d({ "refreshTime: done setting new time text to: $str1" }) {
                str1 = formattedText?.toString()
                str1 = formattedText?.toString()
            }
            }
            // Because the TextLayout may mutate under the hood as a result of the new text, we
            // Because the TextLayout may mutate under the hood as a result of the new text, we
@@ -165,21 +168,22 @@ class AnimatableClockView @JvmOverloads constructor(
            // without being notified TextInterpolator being notified.
            // without being notified TextInterpolator being notified.
            if (layout != null) {
            if (layout != null) {
                textAnimator?.updateLayout(layout)
                textAnimator?.updateLayout(layout)
                logger?.d("refreshTime: done updating textAnimator layout")
                logger.d("refreshTime: done updating textAnimator layout")
            }
            }
            requestLayout()
            requestLayout()
            logger?.d("refreshTime: after requestLayout")
            logger.d("refreshTime: after requestLayout")
        }
        }
    }
    }


    fun onTimeZoneChanged(timeZone: TimeZone?) {
    fun onTimeZoneChanged(timeZone: TimeZone?) {
        logger.d({ "onTimeZoneChanged($str1)" }) { str1 = timeZone?.toString() }
        time.timeZone = timeZone
        time.timeZone = timeZone
        refreshFormat()
        refreshFormat()
        logger?.d({ "onTimeZoneChanged newTimeZone=$str1" }) { str1 = timeZone?.toString() }
    }
    }


    @SuppressLint("DrawAllocation")
    @SuppressLint("DrawAllocation")
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        logger.d("onMeasure")
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
        val animator = textAnimator
        val animator = textAnimator
        if (animator == null) {
        if (animator == null) {
@@ -189,10 +193,10 @@ class AnimatableClockView @JvmOverloads constructor(
        } else {
        } else {
            animator.updateLayout(layout)
            animator.updateLayout(layout)
        }
        }
        logger?.d("onMeasure")
    }
    }


    override fun onDraw(canvas: Canvas) {
    override fun onDraw(canvas: Canvas) {
        logger.d({ "onDraw($str1)"}) { str1 = text.toString() }
        // Use textAnimator to render text if animation is enabled.
        // Use textAnimator to render text if animation is enabled.
        // Otherwise default to using standard draw functions.
        // Otherwise default to using standard draw functions.
        if (isAnimationEnabled) {
        if (isAnimationEnabled) {
@@ -201,12 +205,13 @@ class AnimatableClockView @JvmOverloads constructor(
        } else {
        } else {
            super.onDraw(canvas)
            super.onDraw(canvas)
        }
        }
        logger?.d("onDraw")
    }
    }


    override fun invalidate() {
    override fun invalidate() {
        @Suppress("UNNECESSARY_SAFE_CALL")
        // logger won't be initialized when called by TextView's constructor
        logger.d("invalidate")
        super.invalidate()
        super.invalidate()
        logger?.d("invalidate")
    }
    }


    override fun onTextChanged(
    override fun onTextChanged(
@@ -215,8 +220,8 @@ class AnimatableClockView @JvmOverloads constructor(
        lengthBefore: Int,
        lengthBefore: Int,
        lengthAfter: Int
        lengthAfter: Int
    ) {
    ) {
        logger.d({ "onTextChanged($str1)" }) { str1 = text.toString() }
        super.onTextChanged(text, start, lengthBefore, lengthAfter)
        super.onTextChanged(text, start, lengthBefore, lengthAfter)
        logger?.d({ "onTextChanged text=$str1" }) { str1 = text.toString() }
    }
    }


    fun setLineSpacingScale(scale: Float) {
    fun setLineSpacingScale(scale: Float) {
@@ -230,7 +235,7 @@ class AnimatableClockView @JvmOverloads constructor(
    }
    }


    fun animateColorChange() {
    fun animateColorChange() {
        logger?.d("animateColorChange")
        logger.d("animateColorChange")
        setTextStyle(
        setTextStyle(
            weight = lockScreenWeight,
            weight = lockScreenWeight,
            textSize = -1f,
            textSize = -1f,
@@ -252,7 +257,7 @@ class AnimatableClockView @JvmOverloads constructor(
    }
    }


    fun animateAppearOnLockscreen() {
    fun animateAppearOnLockscreen() {
        logger?.d("animateAppearOnLockscreen")
        logger.d("animateAppearOnLockscreen")
        setTextStyle(
        setTextStyle(
            weight = dozingWeight,
            weight = dozingWeight,
            textSize = -1f,
            textSize = -1f,
@@ -278,7 +283,7 @@ class AnimatableClockView @JvmOverloads constructor(
        if (isAnimationEnabled && textAnimator == null) {
        if (isAnimationEnabled && textAnimator == null) {
            return
            return
        }
        }
        logger?.d("animateFoldAppear")
        logger.d("animateFoldAppear")
        setTextStyle(
        setTextStyle(
            weight = lockScreenWeightInternal,
            weight = lockScreenWeightInternal,
            textSize = -1f,
            textSize = -1f,
@@ -305,7 +310,7 @@ class AnimatableClockView @JvmOverloads constructor(
            // Skip charge animation if dozing animation is already playing.
            // Skip charge animation if dozing animation is already playing.
            return
            return
        }
        }
        logger?.d("animateCharge")
        logger.d("animateCharge")
        val startAnimPhase2 = Runnable {
        val startAnimPhase2 = Runnable {
            setTextStyle(
            setTextStyle(
                weight = if (isDozing()) dozingWeight else lockScreenWeight,
                weight = if (isDozing()) dozingWeight else lockScreenWeight,
@@ -329,7 +334,7 @@ class AnimatableClockView @JvmOverloads constructor(
    }
    }


    fun animateDoze(isDozing: Boolean, animate: Boolean) {
    fun animateDoze(isDozing: Boolean, animate: Boolean) {
        logger?.d("animateDoze")
        logger.d("animateDoze")
        setTextStyle(
        setTextStyle(
            weight = if (isDozing) dozingWeight else lockScreenWeight,
            weight = if (isDozing) dozingWeight else lockScreenWeight,
            textSize = -1f,
            textSize = -1f,
@@ -448,7 +453,7 @@ class AnimatableClockView @JvmOverloads constructor(
            isSingleLineInternal && !use24HourFormat -> Patterns.sClockView12
            isSingleLineInternal && !use24HourFormat -> Patterns.sClockView12
            else -> DOUBLE_LINE_FORMAT_12_HOUR
            else -> DOUBLE_LINE_FORMAT_12_HOUR
        }
        }
        logger?.d({ "refreshFormat format=$str1" }) { str1 = format?.toString() }
        logger.d({ "refreshFormat($str1)" }) { str1 = format?.toString() }


        descFormat = if (use24HourFormat) Patterns.sClockView24 else Patterns.sClockView12
        descFormat = if (use24HourFormat) Patterns.sClockView24 else Patterns.sClockView12
        refreshTime()
        refreshTime()
@@ -552,6 +557,8 @@ class AnimatableClockView @JvmOverloads constructor(


    companion object {
    companion object {
        private val TAG = AnimatableClockView::class.simpleName!!
        private val TAG = AnimatableClockView::class.simpleName!!
        private val DEFAULT_LOGGER = Logger(LogcatOnlyMessageBuffer(LogLevel.WARNING), TAG)

        const val ANIMATION_DURATION_FOLD_TO_AOD: Int = 600
        const val ANIMATION_DURATION_FOLD_TO_AOD: Int = 600
        private const val DOUBLE_LINE_FORMAT_12_HOUR = "hh\nmm"
        private const val DOUBLE_LINE_FORMAT_12_HOUR = "hh\nmm"
        private const val DOUBLE_LINE_FORMAT_24_HOUR = "HH\nmm"
        private const val DOUBLE_LINE_FORMAT_24_HOUR = "HH\nmm"
+73 −157
Original line number Original line Diff line number Diff line
@@ -21,20 +21,16 @@ import android.graphics.drawable.Drawable
import android.net.Uri
import android.net.Uri
import android.os.UserHandle
import android.os.UserHandle
import android.provider.Settings
import android.provider.Settings
import android.util.Log
import androidx.annotation.OpenForTesting
import androidx.annotation.OpenForTesting
import com.android.systemui.log.LogMessageImpl
import com.android.systemui.log.core.LogLevel
import com.android.systemui.log.core.LogLevel
import com.android.systemui.log.core.LogMessage
import com.android.systemui.log.core.LogcatOnlyMessageBuffer
import com.android.systemui.log.core.Logger
import com.android.systemui.log.core.Logger
import com.android.systemui.log.core.MessageBuffer
import com.android.systemui.log.core.MessageInitializer
import com.android.systemui.log.core.MessagePrinter
import com.android.systemui.plugins.PluginLifecycleManager
import com.android.systemui.plugins.PluginLifecycleManager
import com.android.systemui.plugins.PluginListener
import com.android.systemui.plugins.PluginListener
import com.android.systemui.plugins.PluginManager
import com.android.systemui.plugins.PluginManager
import com.android.systemui.plugins.clocks.ClockController
import com.android.systemui.plugins.clocks.ClockController
import com.android.systemui.plugins.clocks.ClockId
import com.android.systemui.plugins.clocks.ClockId
import com.android.systemui.plugins.clocks.ClockMessageBuffers
import com.android.systemui.plugins.clocks.ClockMetadata
import com.android.systemui.plugins.clocks.ClockMetadata
import com.android.systemui.plugins.clocks.ClockProvider
import com.android.systemui.plugins.clocks.ClockProvider
import com.android.systemui.plugins.clocks.ClockProviderPlugin
import com.android.systemui.plugins.clocks.ClockProviderPlugin
@@ -77,32 +73,6 @@ private fun <TKey : Any, TVal : Any> ConcurrentHashMap<TKey, TVal>.concurrentGet
    return result ?: value
    return result ?: value
}
}


private val TMP_MESSAGE: LogMessage by lazy { LogMessageImpl.Factory.create() }

private inline fun Logger?.tryLog(
    tag: String,
    level: LogLevel,
    messageInitializer: MessageInitializer,
    noinline messagePrinter: MessagePrinter,
    ex: Throwable? = null,
) {
    if (this != null) {
        // Wrap messagePrinter to convert it from crossinline to noinline
        this.log(level, messagePrinter, ex, messageInitializer)
    } else {
        messageInitializer(TMP_MESSAGE)
        val msg = messagePrinter(TMP_MESSAGE)
        when (level) {
            LogLevel.VERBOSE -> Log.v(tag, msg, ex)
            LogLevel.DEBUG -> Log.d(tag, msg, ex)
            LogLevel.INFO -> Log.i(tag, msg, ex)
            LogLevel.WARNING -> Log.w(tag, msg, ex)
            LogLevel.ERROR -> Log.e(tag, msg, ex)
            LogLevel.WTF -> Log.wtf(tag, msg, ex)
        }
    }
}

/** ClockRegistry aggregates providers and plugins */
/** ClockRegistry aggregates providers and plugins */
open class ClockRegistry(
open class ClockRegistry(
    val context: Context,
    val context: Context,
@@ -114,12 +84,15 @@ open class ClockRegistry(
    val handleAllUsers: Boolean,
    val handleAllUsers: Boolean,
    defaultClockProvider: ClockProvider,
    defaultClockProvider: ClockProvider,
    val fallbackClockId: ClockId = DEFAULT_CLOCK_ID,
    val fallbackClockId: ClockId = DEFAULT_CLOCK_ID,
    messageBuffer: MessageBuffer? = null,
    val clockBuffers: ClockMessageBuffers? = null,
    val keepAllLoaded: Boolean,
    val keepAllLoaded: Boolean,
    subTag: String,
    subTag: String,
    var isTransitClockEnabled: Boolean = false,
    var isTransitClockEnabled: Boolean = false,
) {
) {
    private val TAG = "${ClockRegistry::class.simpleName} ($subTag)"
    private val TAG = "${ClockRegistry::class.simpleName} ($subTag)"
    private val logger: Logger =
        Logger(clockBuffers?.infraMessageBuffer ?: LogcatOnlyMessageBuffer(LogLevel.DEBUG), TAG)

    interface ClockChangeListener {
    interface ClockChangeListener {
        // Called when the active clock changes
        // Called when the active clock changes
        fun onCurrentClockChanged() {}
        fun onCurrentClockChanged() {}
@@ -128,7 +101,6 @@ open class ClockRegistry(
        fun onAvailableClocksChanged() {}
        fun onAvailableClocksChanged() {}
    }
    }


    private val logger: Logger? = if (messageBuffer != null) Logger(messageBuffer, TAG) else null
    private val availableClocks = ConcurrentHashMap<ClockId, ClockInfo>()
    private val availableClocks = ConcurrentHashMap<ClockId, ClockInfo>()
    private val clockChangeListeners = mutableListOf<ClockChangeListener>()
    private val clockChangeListeners = mutableListOf<ClockChangeListener>()
    private val settingObserver =
    private val settingObserver =
@@ -157,21 +129,15 @@ open class ClockRegistry(


                val knownClocks = KNOWN_PLUGINS.get(manager.getPackage())
                val knownClocks = KNOWN_PLUGINS.get(manager.getPackage())
                if (knownClocks == null) {
                if (knownClocks == null) {
                    logger.tryLog(
                    logger.w({ "Loading unrecognized clock package: $str1" }) {
                        TAG,
                        str1 = manager.getPackage()
                        LogLevel.WARNING,
                    }
                        { str1 = manager.getPackage() },
                        { "Loading unrecognized clock package: $str1" }
                    )
                    return true
                    return true
                }
                }


                logger.tryLog(
                logger.i({ "Skipping initial load of known clock package package: $str1" }) {
                    TAG,
                    str1 = manager.getPackage()
                    LogLevel.INFO,
                }
                    { str1 = manager.getPackage() },
                    { "Skipping initial load of known clock package package: $str1" }
                )


                var isCurrentClock = false
                var isCurrentClock = false
                var isClockListChanged = false
                var isClockListChanged = false
@@ -185,19 +151,14 @@ open class ClockRegistry(
                        }
                        }


                    if (manager != info.manager) {
                    if (manager != info.manager) {
                        logger.tryLog(
                        logger.e({
                            TAG,
                            "Clock Id conflict on attach: " +
                            LogLevel.ERROR,
                                "$str1 is double registered by $str2 and $str3"
                            {
                        }) {
                            str1 = id
                            str1 = id
                            str2 = info.manager.toString()
                            str2 = info.manager.toString()
                            str3 = manager.toString()
                            str3 = manager.toString()
                            },
                            {
                                "Clock Id conflict on attach: " +
                                    "$str1 is double registered by $str2 and $str3"
                        }
                        }
                        )
                        continue
                        continue
                    }
                    }


@@ -219,6 +180,8 @@ open class ClockRegistry(
                pluginContext: Context,
                pluginContext: Context,
                manager: PluginLifecycleManager<ClockProviderPlugin>
                manager: PluginLifecycleManager<ClockProviderPlugin>
            ) {
            ) {
                plugin.initialize(clockBuffers)

                var isClockListChanged = false
                var isClockListChanged = false
                for (clock in plugin.getClocks()) {
                for (clock in plugin.getClocks()) {
                    val id = clock.clockId
                    val id = clock.clockId
@@ -233,19 +196,14 @@ open class ClockRegistry(
                        }
                        }


                    if (manager != info.manager) {
                    if (manager != info.manager) {
                        logger.tryLog(
                        logger.e({
                            TAG,
                            "Clock Id conflict on load: " +
                            LogLevel.ERROR,
                                "$str1 is double registered by $str2 and $str3"
                            {
                        }) {
                            str1 = id
                            str1 = id
                            str2 = info.manager.toString()
                            str2 = info.manager.toString()
                            str3 = manager.toString()
                            str3 = manager.toString()
                            },
                            {
                                "Clock Id conflict on load: " +
                                    "$str1 is double registered by $str2 and $str3"
                        }
                        }
                        )
                        manager.unloadPlugin()
                        manager.unloadPlugin()
                        continue
                        continue
                    }
                    }
@@ -268,19 +226,14 @@ open class ClockRegistry(
                    val id = clock.clockId
                    val id = clock.clockId
                    val info = availableClocks[id]
                    val info = availableClocks[id]
                    if (info?.manager != manager) {
                    if (info?.manager != manager) {
                        logger.tryLog(
                        logger.e({
                            TAG,
                            "Clock Id conflict on unload: " +
                            LogLevel.ERROR,
                                "$str1 is double registered by $str2 and $str3"
                            {
                        }) {
                            str1 = id
                            str1 = id
                            str2 = info?.manager.toString()
                            str2 = info?.manager.toString()
                            str3 = manager.toString()
                            str3 = manager.toString()
                            },
                            {
                                "Clock Id conflict on unload: " +
                                    "$str1 is double registered by $str2 and $str3"
                        }
                        }
                        )
                        continue
                        continue
                    }
                    }
                    info.provider = null
                    info.provider = null
@@ -350,7 +303,7 @@ open class ClockRegistry(


                ClockSettings.deserialize(json)
                ClockSettings.deserialize(json)
            } catch (ex: Exception) {
            } catch (ex: Exception) {
                logger.tryLog(TAG, LogLevel.ERROR, {}, { "Failed to parse clock settings" }, ex)
                logger.e("Failed to parse clock settings", ex)
                null
                null
            }
            }
        settings = result
        settings = result
@@ -379,7 +332,7 @@ open class ClockRegistry(
                )
                )
            }
            }
        } catch (ex: Exception) {
        } catch (ex: Exception) {
            logger.tryLog(TAG, LogLevel.ERROR, {}, { "Failed to set clock settings" }, ex)
            logger.e("Failed to set clock settings", ex)
        }
        }
        settings = value
        settings = value
    }
    }
@@ -451,7 +404,8 @@ open class ClockRegistry(
        }
        }


    init {
    init {
        // Register default clock designs
        // Initialize & register default clock designs
        defaultClockProvider.initialize(clockBuffers)
        for (clock in defaultClockProvider.getClocks()) {
        for (clock in defaultClockProvider.getClocks()) {
            availableClocks[clock.clockId] = ClockInfo(clock, defaultClockProvider, null)
            availableClocks[clock.clockId] = ClockInfo(clock, defaultClockProvider, null)
        }
        }
@@ -514,12 +468,7 @@ open class ClockRegistry(
    fun verifyLoadedProviders() {
    fun verifyLoadedProviders() {
        val shouldSchedule = isQueued.compareAndSet(false, true)
        val shouldSchedule = isQueued.compareAndSet(false, true)
        if (!shouldSchedule) {
        if (!shouldSchedule) {
            logger.tryLog(
            logger.v("verifyLoadedProviders: shouldSchedule=false")
                TAG,
                LogLevel.VERBOSE,
                {},
                { "verifyLoadedProviders: shouldSchedule=false" }
            )
            return
            return
        }
        }


@@ -528,12 +477,7 @@ open class ClockRegistry(
            synchronized(availableClocks) {
            synchronized(availableClocks) {
                isQueued.set(false)
                isQueued.set(false)
                if (keepAllLoaded) {
                if (keepAllLoaded) {
                    logger.tryLog(
                    logger.i("verifyLoadedProviders: keepAllLoaded=true")
                        TAG,
                        LogLevel.INFO,
                        {},
                        { "verifyLoadedProviders: keepAllLoaded=true" }
                    )
                    // Enforce that all plugins are loaded if requested
                    // Enforce that all plugins are loaded if requested
                    for ((_, info) in availableClocks) {
                    for ((_, info) in availableClocks) {
                        info.manager?.loadPlugin()
                        info.manager?.loadPlugin()
@@ -543,12 +487,7 @@ open class ClockRegistry(


                val currentClock = availableClocks[currentClockId]
                val currentClock = availableClocks[currentClockId]
                if (currentClock == null) {
                if (currentClock == null) {
                    logger.tryLog(
                    logger.i("verifyLoadedProviders: currentClock=null")
                        TAG,
                        LogLevel.INFO,
                        {},
                        { "verifyLoadedProviders: currentClock=null" }
                    )
                    // Current Clock missing, load no plugins and use default
                    // Current Clock missing, load no plugins and use default
                    for ((_, info) in availableClocks) {
                    for ((_, info) in availableClocks) {
                        info.manager?.unloadPlugin()
                        info.manager?.unloadPlugin()
@@ -556,12 +495,7 @@ open class ClockRegistry(
                    return@launch
                    return@launch
                }
                }


                logger.tryLog(
                logger.i("verifyLoadedProviders: load currentClock")
                    TAG,
                    LogLevel.INFO,
                    {},
                    { "verifyLoadedProviders: load currentClock" }
                )
                val currentManager = currentClock.manager
                val currentManager = currentClock.manager
                currentManager?.loadPlugin()
                currentManager?.loadPlugin()


@@ -577,30 +511,26 @@ open class ClockRegistry(


    private fun onConnected(info: ClockInfo) {
    private fun onConnected(info: ClockInfo) {
        val isCurrent = currentClockId == info.metadata.clockId
        val isCurrent = currentClockId == info.metadata.clockId
        logger.tryLog(
        logger.log(
            TAG,
            if (isCurrent) LogLevel.INFO else LogLevel.DEBUG,
            if (isCurrent) LogLevel.INFO else LogLevel.DEBUG,
            {
            { "Connected $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
        ) {
            str1 = info.metadata.clockId
            str1 = info.metadata.clockId
            str2 = info.manager.toString()
            str2 = info.manager.toString()
            bool1 = isCurrent
            bool1 = isCurrent
            },
        }
            { "Connected $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
        )
    }
    }


    private fun onLoaded(info: ClockInfo) {
    private fun onLoaded(info: ClockInfo) {
        val isCurrent = currentClockId == info.metadata.clockId
        val isCurrent = currentClockId == info.metadata.clockId
        logger.tryLog(
        logger.log(
            TAG,
            if (isCurrent) LogLevel.INFO else LogLevel.DEBUG,
            if (isCurrent) LogLevel.INFO else LogLevel.DEBUG,
            {
            { "Loaded $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
        ) {
            str1 = info.metadata.clockId
            str1 = info.metadata.clockId
            str2 = info.manager.toString()
            str2 = info.manager.toString()
            bool1 = isCurrent
            bool1 = isCurrent
            },
        }
            { "Loaded $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
        )


        if (isCurrent) {
        if (isCurrent) {
            triggerOnCurrentClockChanged()
            triggerOnCurrentClockChanged()
@@ -609,16 +539,14 @@ open class ClockRegistry(


    private fun onUnloaded(info: ClockInfo) {
    private fun onUnloaded(info: ClockInfo) {
        val isCurrent = currentClockId == info.metadata.clockId
        val isCurrent = currentClockId == info.metadata.clockId
        logger.tryLog(
        logger.log(
            TAG,
            if (isCurrent) LogLevel.WARNING else LogLevel.DEBUG,
            if (isCurrent) LogLevel.WARNING else LogLevel.DEBUG,
            {
            { "Unloaded $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
        ) {
            str1 = info.metadata.clockId
            str1 = info.metadata.clockId
            str2 = info.manager.toString()
            str2 = info.manager.toString()
            bool1 = isCurrent
            bool1 = isCurrent
            },
        }
            { "Unloaded $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
        )


        if (isCurrent) {
        if (isCurrent) {
            triggerOnCurrentClockChanged()
            triggerOnCurrentClockChanged()
@@ -627,16 +555,14 @@ open class ClockRegistry(


    private fun onDisconnected(info: ClockInfo) {
    private fun onDisconnected(info: ClockInfo) {
        val isCurrent = currentClockId == info.metadata.clockId
        val isCurrent = currentClockId == info.metadata.clockId
        logger.tryLog(
        logger.log(
            TAG,
            if (isCurrent) LogLevel.INFO else LogLevel.DEBUG,
            if (isCurrent) LogLevel.INFO else LogLevel.DEBUG,
            {
            { "Disconnected $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
        ) {
            str1 = info.metadata.clockId
            str1 = info.metadata.clockId
            str2 = info.manager.toString()
            str2 = info.manager.toString()
            bool1 = isCurrent
            bool1 = isCurrent
            },
        }
            { "Disconnected $str1 @$str2" + if (bool1) " (Current Clock)" else "" }
        )
    }
    }


    fun getClocks(): List<ClockMetadata> {
    fun getClocks(): List<ClockMetadata> {
@@ -676,23 +602,13 @@ open class ClockRegistry(
        if (isEnabled && clockId.isNotEmpty()) {
        if (isEnabled && clockId.isNotEmpty()) {
            val clock = createClock(clockId)
            val clock = createClock(clockId)
            if (clock != null) {
            if (clock != null) {
                logger.tryLog(TAG, LogLevel.INFO, { str1 = clockId }, { "Rendering clock $str1" })
                logger.i({ "Rendering clock $str1" }) { str1 = clockId }
                return clock
                return clock
            } else if (availableClocks.containsKey(clockId)) {
            } else if (availableClocks.containsKey(clockId)) {
                logger.tryLog(
                logger.w({ "Clock $str1 not loaded; using default" }) { str1 = clockId }
                    TAG,
                    LogLevel.WARNING,
                    { str1 = clockId },
                    { "Clock $str1 not loaded; using default" }
                )
                verifyLoadedProviders()
                verifyLoadedProviders()
            } else {
            } else {
                logger.tryLog(
                logger.e({ "Clock $str1 not found; using default" }) { str1 = clockId }
                    TAG,
                    LogLevel.ERROR,
                    { str1 = clockId },
                    { "Clock $str1 not found; using default" }
                )
            }
            }
        }
        }


+10 −11
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@ import com.android.systemui.plugins.clocks.ClockEvents
import com.android.systemui.plugins.clocks.ClockFaceConfig
import com.android.systemui.plugins.clocks.ClockFaceConfig
import com.android.systemui.plugins.clocks.ClockFaceController
import com.android.systemui.plugins.clocks.ClockFaceController
import com.android.systemui.plugins.clocks.ClockFaceEvents
import com.android.systemui.plugins.clocks.ClockFaceEvents
import com.android.systemui.plugins.clocks.ClockMessageBuffers
import com.android.systemui.plugins.clocks.ClockSettings
import com.android.systemui.plugins.clocks.ClockSettings
import com.android.systemui.plugins.clocks.DefaultClockFaceLayout
import com.android.systemui.plugins.clocks.DefaultClockFaceLayout
import com.android.systemui.plugins.clocks.WeatherData
import com.android.systemui.plugins.clocks.WeatherData
@@ -41,8 +42,6 @@ import java.io.PrintWriter
import java.util.Locale
import java.util.Locale
import java.util.TimeZone
import java.util.TimeZone


private val TAG = DefaultClockController::class.simpleName

/**
/**
 * Controls the default clock visuals.
 * Controls the default clock visuals.
 *
 *
@@ -56,6 +55,7 @@ class DefaultClockController(
    private val settings: ClockSettings?,
    private val settings: ClockSettings?,
    private val hasStepClockAnimation: Boolean = false,
    private val hasStepClockAnimation: Boolean = false,
    private val migratedClocks: Boolean = false,
    private val migratedClocks: Boolean = false,
    messageBuffers: ClockMessageBuffers? = null,
) : ClockController {
) : ClockController {
    override val smallClock: DefaultClockFaceController
    override val smallClock: DefaultClockFaceController
    override val largeClock: LargeClockFaceController
    override val largeClock: LargeClockFaceController
@@ -83,13 +83,15 @@ class DefaultClockController(
            DefaultClockFaceController(
            DefaultClockFaceController(
                layoutInflater.inflate(R.layout.clock_default_small, parent, false)
                layoutInflater.inflate(R.layout.clock_default_small, parent, false)
                    as AnimatableClockView,
                    as AnimatableClockView,
                settings?.seedColor
                settings?.seedColor,
                messageBuffers?.smallClockMessageBuffer
            )
            )
        largeClock =
        largeClock =
            LargeClockFaceController(
            LargeClockFaceController(
                layoutInflater.inflate(R.layout.clock_default_large, parent, false)
                layoutInflater.inflate(R.layout.clock_default_large, parent, false)
                    as AnimatableClockView,
                    as AnimatableClockView,
                settings?.seedColor
                settings?.seedColor,
                messageBuffers?.largeClockMessageBuffer
            )
            )
        clocks = listOf(smallClock.view, largeClock.view)
        clocks = listOf(smallClock.view, largeClock.view)


@@ -110,6 +112,7 @@ class DefaultClockController(
    open inner class DefaultClockFaceController(
    open inner class DefaultClockFaceController(
        override val view: AnimatableClockView,
        override val view: AnimatableClockView,
        var seedColor: Int?,
        var seedColor: Int?,
        messageBuffer: MessageBuffer?,
    ) : ClockFaceController {
    ) : ClockFaceController {


        // MAGENTA is a placeholder, and will be assigned correctly in initialize
        // MAGENTA is a placeholder, and will be assigned correctly in initialize
@@ -120,12 +123,6 @@ class DefaultClockController(
        override val config = ClockFaceConfig()
        override val config = ClockFaceConfig()
        override val layout = DefaultClockFaceLayout(view)
        override val layout = DefaultClockFaceLayout(view)


        override var messageBuffer: MessageBuffer?
            get() = view.messageBuffer
            set(value) {
                view.messageBuffer = value
            }

        override var animations: DefaultClockAnimations = DefaultClockAnimations(view, 0f, 0f)
        override var animations: DefaultClockAnimations = DefaultClockAnimations(view, 0f, 0f)
            internal set
            internal set


@@ -134,6 +131,7 @@ class DefaultClockController(
                currentColor = seedColor!!
                currentColor = seedColor!!
            }
            }
            view.setColors(DOZE_COLOR, currentColor)
            view.setColors(DOZE_COLOR, currentColor)
            messageBuffer?.let { view.messageBuffer = it }
        }
        }


        override val events =
        override val events =
@@ -188,7 +186,8 @@ class DefaultClockController(
    inner class LargeClockFaceController(
    inner class LargeClockFaceController(
        view: AnimatableClockView,
        view: AnimatableClockView,
        seedColor: Int?,
        seedColor: Int?,
    ) : DefaultClockFaceController(view, seedColor) {
        messageBuffer: MessageBuffer?,
    ) : DefaultClockFaceController(view, seedColor, messageBuffer) {
        override val layout = DefaultClockFaceLayout(view)
        override val layout = DefaultClockFaceLayout(view)
        override val config =
        override val config =
            ClockFaceConfig(hasCustomPositionUpdatedAnimation = hasStepClockAnimation)
            ClockFaceConfig(hasCustomPositionUpdatedAnimation = hasStepClockAnimation)
+8 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.view.LayoutInflater
import com.android.systemui.customization.R
import com.android.systemui.customization.R
import com.android.systemui.plugins.clocks.ClockController
import com.android.systemui.plugins.clocks.ClockController
import com.android.systemui.plugins.clocks.ClockId
import com.android.systemui.plugins.clocks.ClockId
import com.android.systemui.plugins.clocks.ClockMessageBuffers
import com.android.systemui.plugins.clocks.ClockMetadata
import com.android.systemui.plugins.clocks.ClockMetadata
import com.android.systemui.plugins.clocks.ClockProvider
import com.android.systemui.plugins.clocks.ClockProvider
import com.android.systemui.plugins.clocks.ClockSettings
import com.android.systemui.plugins.clocks.ClockSettings
@@ -35,6 +36,12 @@ class DefaultClockProvider(
    val hasStepClockAnimation: Boolean = false,
    val hasStepClockAnimation: Boolean = false,
    val migratedClocks: Boolean = false
    val migratedClocks: Boolean = false
) : ClockProvider {
) : ClockProvider {
    private var messageBuffers: ClockMessageBuffers? = null

    override fun initialize(buffers: ClockMessageBuffers?) {
        messageBuffers = buffers
    }

    override fun getClocks(): List<ClockMetadata> = listOf(ClockMetadata(DEFAULT_CLOCK_ID))
    override fun getClocks(): List<ClockMetadata> = listOf(ClockMetadata(DEFAULT_CLOCK_ID))


    override fun createClock(settings: ClockSettings): ClockController {
    override fun createClock(settings: ClockSettings): ClockController {
@@ -49,6 +56,7 @@ class DefaultClockProvider(
            settings,
            settings,
            hasStepClockAnimation,
            hasStepClockAnimation,
            migratedClocks,
            migratedClocks,
            messageBuffers,
        )
        )
    }
    }


+76 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading