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

Commit 71e66c9f authored by Zekan Qian's avatar Zekan Qian
Browse files

Add entryPath support.

Add getTitle API in SPP.
Generate two types of entry path: by displayName of each entry, and by Title of each entry's container page.

Bug: 244122804
Test: manual - build gallery
Change-Id: I405def96fa1b2be0e4638ef5e97a058fdc970f49
parent 1d98a8de
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.android.settingslib.spa.R
import com.android.settingslib.spa.framework.common.LogCategory
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.compose.LocalNavController
@@ -44,7 +45,6 @@ import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.framework.util.navRoute

private const val TAG = "BrowseActivity"
private const val NULL_PAGE_NAME = "NULL"

/**
 * The Activity to render ALL SPA pages, and handles jumps between SPA pages.
@@ -81,9 +81,10 @@ open class BrowseActivity : ComponentActivity() {
    private fun MainContent() {
        val sppRepository by spaEnvironment.pageProviderRepository
        val navController = rememberNavController()
        val nullPage = SettingsPage.createNull()
        CompositionLocalProvider(navController.localNavController()) {
            NavHost(navController, NULL_PAGE_NAME) {
                composable(NULL_PAGE_NAME) {}
            NavHost(navController, nullPage.sppName) {
                composable(nullPage.sppName) {}
                for (spp in sppRepository.getAllProviders()) {
                    composable(
                        route = spp.name + spp.parameter.navRoute(),
+2 −1
Original line number Diff line number Diff line
@@ -169,7 +169,8 @@ open class EntryProvider : ContentProvider() {
            .add(ColumnEnum.ENTRY_INTENT_URI.id, intent.toUri(Intent.URI_INTENT_SCHEME))
            .add(ColumnEnum.SEARCH_TITLE.id, searchData.title)
            .add(ColumnEnum.SEARCH_KEYWORD.id, searchData.keyword)
            .add(ColumnEnum.SEARCH_PATH.id, entryRepository.getEntryPath(entry.id))
            .add(ColumnEnum.SEARCH_PATH.id,
                entryRepository.getEntryPathWithTitle(entry.id, searchData.title))
    }

    private fun fetchStatusData(entry: SettingsEntry, cursor: MatrixCursor) {
+0 −11
Original line number Diff line number Diff line
@@ -99,17 +99,6 @@ data class SettingsEntry(
     */
    private val uiLayoutImpl: (@Composable (arguments: Bundle?) -> Unit) = {},
) {
    fun formatContent(): String {
        val content = listOf(
            "id = $id",
            "owner = ${owner.formatDisplayTitle()}",
            "linkFrom = ${fromPage?.formatDisplayTitle()}",
            "linkTo = ${toPage?.formatDisplayTitle()}",
            "${getSearchData()?.format()}",
        )
        return content.joinToString("\n")
    }

    fun displayTitle(): String {
        return "${owner.displayName}:$displayName"
    }
+35 −4
Original line number Diff line number Diff line
@@ -21,10 +21,13 @@ import java.util.LinkedList

private const val TAG = "EntryRepository"
private const val MAX_ENTRY_SIZE = 5000
private const val MAX_ENTRY_DEPTH = 10

data class SettingsPageWithEntry(
    val page: SettingsPage,
    val entries: List<SettingsEntry>,
    // The inject entry, which to-page is current page.
    val injectEntry: SettingsEntry,
)

/**
@@ -42,9 +45,11 @@ class SettingsEntryRepository(sppRepository: SettingsPageProviderRepository) {
        entryMap = mutableMapOf()
        pageWithEntryMap = mutableMapOf()

        val nullPage = SettingsPage.createNull()
        val entryQueue = LinkedList<SettingsEntry>()
        for (page in sppRepository.getAllRootPages()) {
            val rootEntry = SettingsEntryBuilder.createRoot(owner = page).build()
            val rootEntry =
                SettingsEntryBuilder.createRoot(owner = page).setLink(fromPage = nullPage).build()
            if (!entryMap.containsKey(rootEntry.id)) {
                entryQueue.push(rootEntry)
                entryMap.put(rootEntry.id, rootEntry)
@@ -57,7 +62,11 @@ class SettingsEntryRepository(sppRepository: SettingsPageProviderRepository) {
            if (page == null || pageWithEntryMap.containsKey(page.id)) continue
            val spp = sppRepository.getProviderOrNull(page.sppName) ?: continue
            val newEntries = spp.buildEntry(page.arguments)
            pageWithEntryMap[page.id] = SettingsPageWithEntry(page, newEntries)
            pageWithEntryMap[page.id] = SettingsPageWithEntry(
                page = page,
                entries = newEntries,
                injectEntry = entry
            )
            for (newEntry in newEntries) {
                if (!entryMap.containsKey(newEntry.id)) {
                    entryQueue.push(newEntry)
@@ -88,7 +97,29 @@ class SettingsEntryRepository(sppRepository: SettingsPageProviderRepository) {
        return entryMap[entryId]
    }

    fun getEntryPath(entryId: String): String {
        return "TODO(path_of_$entryId)"
    private fun getEntryPath(entryId: String): List<SettingsEntry> {
        val entryPath = ArrayList<SettingsEntry>()
        var currentEntry = entryMap[entryId]
        while (currentEntry != null && entryPath.size < MAX_ENTRY_DEPTH) {
            entryPath.add(currentEntry)
            val currentPage = currentEntry.containerPage()
            currentEntry = pageWithEntryMap[currentPage.id]?.injectEntry
        }
        return entryPath
    }

    fun getEntryPathWithDisplayName(entryId: String): List<String> {
        val entryPath = getEntryPath(entryId)
        return entryPath.map { it.displayName }
    }

    fun getEntryPathWithTitle(entryId: String, defaultTitle: String): List<String> {
        val entryPath = getEntryPath(entryId)
        return entryPath.map {
            if (it.toPage == null)
                defaultTitle
            else
                it.toPage.getTitle()!!
        }
    }
}
+12 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ import com.android.settingslib.spa.framework.util.isRuntimeParam
import com.android.settingslib.spa.framework.util.navLink
import com.android.settingslib.spa.framework.util.normalize

private const val NULL_PAGE_NAME = "NULL"

/**
 * Defines data to identify a Settings page.
 */
@@ -47,6 +49,10 @@ data class SettingsPage(
    val arguments: Bundle? = null,
) {
    companion object {
        fun createNull(): SettingsPage {
            return create(NULL_PAGE_NAME)
        }

        fun create(
            name: String,
            displayName: String? = null,
@@ -99,6 +105,11 @@ data class SettingsPage(
        return false
    }

    fun getTitle(): String? {
        val sppRepository by SpaEnvironmentFactory.instance.pageProviderRepository
        return sppRepository.getProviderOrNull(sppName)?.getTitle(arguments)
    }

    fun enterPage() {
        SpaEnvironmentFactory.instance.logger.event(
            id,
@@ -149,6 +160,7 @@ data class SettingsPage(
    fun isBrowsable(context: Context?, browseActivityClass: Class<out Activity>?): Boolean {
        return context != null &&
            browseActivityClass != null &&
            !isCreateBy(NULL_PAGE_NAME) &&
            !hasRuntimeParam()
    }
}
Loading