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

Commit 5397ddb4 authored by Behnam Heydarshahi's avatar Behnam Heydarshahi
Browse files

Do not synchronize tile state callbacks

Instead, use a CopyOnWriteArray to hold callbacks.
This saves a few milliseconds, which saves a frame being dropped when
expanding the shade.

Flag: com.android.systemui.qs_new_tiles
Bug: 343622531
Test: atest QSTileViewModelAdapterTest
Change-Id: I5b3e635717549bb1078450457688736a5d33aba2
parent 93d3f9a9
Loading
Loading
Loading
Loading
+24 −32
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.systemui.qs.tiles.viewmodel
import android.content.Context
import android.os.UserHandle
import android.util.Log
import androidx.annotation.GuardedBy
import com.android.internal.logging.InstanceId
import com.android.systemui.Dumpable
import com.android.systemui.animation.Expandable
@@ -34,6 +33,7 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import java.io.PrintWriter
import java.util.concurrent.CopyOnWriteArraySet
import java.util.function.Supplier
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
@@ -57,10 +57,8 @@ constructor(
    private val context
        get() = qsHost.context

    @GuardedBy("callbacks")
    private val callbacks: MutableCollection<QSTile.Callback> = mutableSetOf()
    @GuardedBy("listeningClients")
    private val listeningClients: MutableCollection<Any> = mutableSetOf()
    private val callbacks = CopyOnWriteArraySet<QSTile.Callback>()
    private val listeningClients = CopyOnWriteArraySet<Any>()

    // Cancels the jobs when the adapter is no longer alive
    private var tileAdapterJob: Job? = null
@@ -113,19 +111,17 @@ constructor(

    override fun addCallback(callback: QSTile.Callback?) {
        callback ?: return
        synchronized(callbacks) {
        callbacks.add(callback)
        state?.let(callback::onStateChanged)
    }
    }

    override fun removeCallback(callback: QSTile.Callback?) {
        callback ?: return
        synchronized(callbacks) { callbacks.remove(callback) }
        callbacks.remove(callback)
    }

    override fun removeCallbacks() {
        synchronized(callbacks) { callbacks.clear() }
        callbacks.clear()
    }

    override fun click(expandable: Expandable?) {
@@ -163,7 +159,6 @@ constructor(

    override fun setListening(client: Any?, listening: Boolean) {
        client ?: return
        synchronized(listeningClients) {
        if (listening) {
            listeningClients.add(client)
            if (listeningClients.size == 1) {
@@ -172,10 +167,8 @@ constructor(
                        .filterNotNull()
                        .map { mapState(context, it, qsTileViewModel.config) }
                        .onEach { legacyState ->
                                synchronized(callbacks) {
                            callbacks.forEach { it.onStateChanged(legacyState) }
                        }
                            }
                        .launchIn(applicationScope)
            }
        } else {
@@ -185,10 +178,9 @@ constructor(
            }
        }
    }
    }

    override fun isListening(): Boolean =
        synchronized(listeningClients) { listeningClients.isNotEmpty() }
        listeningClients.isNotEmpty()

    override fun setDetailListening(show: Boolean) {
        // do nothing like QSTileImpl