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

Commit d2fa6733 authored by Jacky Wang's avatar Jacky Wang
Browse files

[Catalyst] Provide launch intent for preference graph

Bug: 373895400
Flag: com.android.settings.flags.catalyst
Test: manual
Change-Id: I9dd9b25082192eb0c91fd5205d938fef8be1fa81
parent 3f492ab2
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -74,6 +74,9 @@ message PreferenceProto {
  optional ActionTarget action_target = 12;
  // Preference value (if present, it means `persistent` is true).
  optional PreferenceValueProto value = 13;
  // Intent to show and locate the preference (might have highlight animation on
  // the preference).
  optional IntentProto launch_intent = 14;

  // Target of an Intent
  message ActionTarget {
+23 −16
Original line number Diff line number Diff line
@@ -51,9 +51,9 @@ import com.android.settingslib.metadata.PreferenceSummaryProvider
import com.android.settingslib.metadata.PreferenceTitleProvider
import com.android.settingslib.preference.PreferenceScreenFactory
import com.android.settingslib.preference.PreferenceScreenProvider
import java.util.Locale
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.util.Locale

private const val TAG = "PreferenceGraphBuilder"

@@ -140,7 +140,7 @@ private constructor(private val context: Context, private val request: GetPrefer
        addPreferenceScreen(metadata.key) {
            preferenceScreenProto {
                completeHierarchy = metadata.hasCompleteHierarchy()
                root = metadata.getPreferenceHierarchy(context).toProto(true)
                root = metadata.getPreferenceHierarchy(context).toProto(metadata, true)
            }
        }

@@ -237,23 +237,29 @@ private constructor(private val context: Context, private val request: GetPrefer
        this@toProto.intent?.let { actionTarget = it.toActionTarget() }
    }

    private suspend fun PreferenceHierarchy.toProto(isRoot: Boolean): PreferenceGroupProto =
        preferenceGroupProto {
            preference = toProto(this@toProto, isRoot)
    private suspend fun PreferenceHierarchy.toProto(
        screenMetadata: PreferenceScreenMetadata,
        isRoot: Boolean,
    ): PreferenceGroupProto = preferenceGroupProto {
        preference = toProto(screenMetadata, this@toProto, isRoot)
        forEachAsync {
            addPreferences(
                preferenceOrGroupProto {
                    if (it is PreferenceHierarchy) {
                            group = it.toProto(false)
                        group = it.toProto(screenMetadata, false)
                    } else {
                            preference = toProto(it, false)
                        preference = toProto(screenMetadata, it, false)
                    }
                }
            )
        }
    }

    private suspend fun toProto(node: PreferenceHierarchyNode, isRoot: Boolean) = preferenceProto {
    private suspend fun toProto(
        screenMetadata: PreferenceScreenMetadata,
        node: PreferenceHierarchyNode,
        isRoot: Boolean,
    ) = preferenceProto {
        val metadata = node.metadata
        key = metadata.key
        metadata.getTitleTextProto(isRoot)?.let { title = it }
@@ -291,6 +297,7 @@ private constructor(private val context: Context, private val request: GetPrefer
            @Suppress("CheckReturnValue") addPreferenceScreenMetadata(metadata)
        }
        metadata.intent(context)?.let { actionTarget = it.toActionTarget() }
        screenMetadata.getLaunchIntent(context, metadata)?.let { launchIntent = it.toProto() }
    }

    private fun PreferenceMetadata.getTitleTextProto(isRoot: Boolean): TextProto? {
+9 −2
Original line number Diff line number Diff line
@@ -162,8 +162,8 @@ interface PreferenceMetadata {
    /**
     * Returns the preference icon.
     *
     * Implement [PreferenceIconProvider] interface if icon content is provided dynamically
     * (e.g. icon is provided based on flag value).
     * Implement [PreferenceIconProvider] interface if icon is provided dynamically (e.g. icon is
     * provided based on flag value).
     */
    fun getPreferenceIcon(context: Context): Int =
        when {
@@ -212,4 +212,11 @@ interface PreferenceScreenMetadata : PreferenceMetadata {
     * conditions. DO NOT check any condition (except compile time flag) before adding a preference.
     */
    fun getPreferenceHierarchy(context: Context): PreferenceHierarchy

    /**
     * Returns the [Intent] to show current preference screen.
     *
     * @param metadata the preference to locate when show the screen
     */
    fun getLaunchIntent(context: Context, metadata: PreferenceMetadata?): Intent? = null
}