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

Commit 469146fc authored by Jacky Wang's avatar Jacky Wang
Browse files

[Catalyst] Provide getPreferenceHierarchy with CoroutineScope

Prerequisite to support async hierarchy.

Bug: 421105115
Flag: EXEMPT refactor
Test: atest
Change-Id: Ic669b0d0ffc5aefa7e0c34cc27da4e188fb56ad5
parent ccf86e2b
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.settingslib.ipc.MessageCodec
import com.android.settingslib.metadata.PreferenceRemoteOpMetricsLogger
import com.android.settingslib.metadata.PreferenceScreenCoordinate
import com.android.settingslib.metadata.PreferenceScreenRegistry
import com.android.settingslib.metadata.usePreferenceHierarchyScope
import com.android.settingslib.preference.PreferenceScreenProvider
import java.util.Locale

@@ -54,11 +55,12 @@ class GetPreferenceGraphApiHandler(
        callingPid: Int,
        callingUid: Int,
        request: GetPreferenceGraphRequest,
    ): PreferenceGraphProto {
    ): PreferenceGraphProto = usePreferenceHierarchyScope {
        val elapsedRealtime = SystemClock.elapsedRealtime()
        var success = false
        try {
            val builder = PreferenceGraphBuilder.of(application, callingPid, callingUid, request)
            val builder =
                PreferenceGraphBuilder.of(application, callingPid, callingUid, request, this)
            if (request.screens.isEmpty()) {
                val factories = PreferenceScreenRegistry.preferenceScreenMetadataFactories
                factories.forEachAsync { _, factory -> builder.addPreferenceScreen(factory) }
@@ -68,7 +70,7 @@ class GetPreferenceGraphApiHandler(
            }
            val result = builder.build()
            success = true
            return result
            result
        } finally {
            metricsLogger?.logGraphApi(
                application,
+4 −3
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import com.android.settingslib.metadata.PreferenceHierarchyNode
import com.android.settingslib.metadata.PreferenceRemoteOpMetricsLogger
import com.android.settingslib.metadata.PreferenceScreenCoordinate
import com.android.settingslib.metadata.PreferenceScreenRegistry
import com.android.settingslib.metadata.usePreferenceHierarchyScope

/**
 * Request to get preference information.
@@ -101,7 +102,7 @@ class PreferenceGetterApiHandler(
        callingPid: Int,
        callingUid: Int,
        request: PreferenceGetterRequest,
    ): PreferenceGetterResponse {
    ): PreferenceGetterResponse = usePreferenceHierarchyScope {
        val elapsedRealtime = SystemClock.elapsedRealtime()
        val errors = mutableMapOf<PreferenceCoordinate, Int>()
        val preferences = mutableMapOf<PreferenceCoordinate, PreferenceProto>()
@@ -128,7 +129,7 @@ class PreferenceGetterApiHandler(
            }
            val nodes = mutableMapOf<String, PreferenceHierarchyNode?>()
            for (coordinate in coordinates) nodes[coordinate.key] = null
            screenMetadata.getPreferenceHierarchy(application).forEachRecursively {
            screenMetadata.getPreferenceHierarchy(application, this).forEachRecursively {
                val metadata = it.metadata
                val key = metadata.key
                if (nodes.containsKey(key)) nodes[key] = it
@@ -181,7 +182,7 @@ class PreferenceGetterApiHandler(
                )
            }
        }
        return PreferenceGetterResponse(errors, preferences)
        PreferenceGetterResponse(errors, preferences)
    }

    override val requestCodec = PreferenceGetterRequestCodec()
+14 −4
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ import com.android.settingslib.preference.PreferenceScreenCreator
import com.android.settingslib.preference.PreferenceScreenFactory
import com.android.settingslib.preference.PreferenceScreenProvider
import java.util.Locale
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext

@@ -76,6 +77,7 @@ private constructor(
    private val callingPid: Int,
    private val callingUid: Int,
    private val request: GetPreferenceGraphRequest,
    private val coroutineScope: CoroutineScope,
) {
    private val preferenceScreenFactory by lazy {
        PreferenceScreenFactory(context.ofLocale(request.locale))
@@ -179,7 +181,10 @@ private constructor(
                val instance = newInstance()
                Log.d(TAG, "createPreferenceScreen $instance")
                if (instance is PreferenceScreenProvider) {
                    return@withContext instance.createPreferenceScreen(preferenceScreenFactory)
                    return@withContext instance.createPreferenceScreen(
                        preferenceScreenFactory,
                        coroutineScope,
                    )
                } else {
                    Log.w(TAG, "$instance is not PreferenceScreenProvider")
                }
@@ -221,7 +226,7 @@ private constructor(
        if (!checkScreenFlag(metadata)) return false
        return addPreferenceScreen(metadata.key, metadata.arguments) {
            completeHierarchy = metadata.hasCompleteHierarchy()
            root = metadata.getPreferenceHierarchy(context).toProto(metadata, true)
            root = metadata.getPreferenceHierarchy(context, coroutineScope).toProto(metadata, true)
        }
    }

@@ -375,7 +380,8 @@ private constructor(
        }
        if (fragment is PreferenceScreenProvider) {
            try {
                val screen = fragment.createPreferenceScreen(preferenceScreenFactory)
                val screen =
                    fragment.createPreferenceScreen(preferenceScreenFactory, coroutineScope)
                val screenKey = screen?.key
                if (!screenKey.isNullOrEmpty()) {
                    @Suppress("CheckReturnValue")
@@ -404,7 +410,11 @@ private constructor(
            callingPid: Int,
            callingUid: Int,
            request: GetPreferenceGraphRequest,
        ) = PreferenceGraphBuilder(context, callingPid, callingUid, request).also { it.init() }
            coroutineScope: CoroutineScope,
        ) =
            PreferenceGraphBuilder(context, callingPid, callingUid, request, coroutineScope).also {
                it.init()
            }
    }
}

+4 −1
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import com.android.settingslib.metadata.PreferenceRemoteOpMetricsLogger
import com.android.settingslib.metadata.PreferenceRestrictionProvider
import com.android.settingslib.metadata.PreferenceScreenRegistry
import com.android.settingslib.metadata.ReadWritePermit
import com.android.settingslib.metadata.usePreferenceHierarchyScope

/** Request to set preference value. */
class PreferenceSetterRequest(
@@ -130,7 +131,9 @@ class PreferenceSetterApiHandler(
            PreferenceScreenRegistry.create(application, request) ?: return notFound()
        val key = request.key
        val metadata =
            screenMetadata.getPreferenceHierarchy(application).find(key) ?: return notFound()
            usePreferenceHierarchyScope {
                screenMetadata.getPreferenceHierarchy(application, this).find(key)
            } ?: return notFound()

        fun <T> PreferenceMetadata.checkWritePermit(value: T): Int {
            @Suppress("UNCHECKED_CAST") val preference = (this as PersistentPreference<T>)
+2 −3
Original line number Diff line number Diff line
@@ -209,11 +209,10 @@ internal constructor(private val context: Context, metadata: PreferenceMetadata)
 * Builder function to create [PreferenceHierarchy] in
 * [DSL](https://kotlinlang.org/docs/type-safe-builders.html) manner.
 */
fun preferenceHierarchy(
fun PreferenceScreenMetadata.preferenceHierarchy(
    context: Context,
    metadata: PreferenceMetadata,
    init: PreferenceHierarchy.() -> Unit,
) = PreferenceHierarchy(context, metadata).also(init)
) = PreferenceHierarchy(context, this).also(init)

/**
 * Builder function to create [PreferenceHierarchy] with coroutine in
Loading