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

Commit d3a94cf4 authored by Zekan Qian's avatar Zekan Qian
Browse files

Add debug page in gallery to show page & entry debug information.

Bug: 244122804
Test: manual - build Spa gallery
Change-Id: I4853e17028dfe0eed4342b4691962b508bc87357
parent 834c811c
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -29,6 +29,10 @@
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

        <activity
            android:name=".GalleryDebugActivity"
            android:exported="true">
        </activity>
    </application>
</manifest>
+21 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settingslib.spa.gallery

import com.android.settingslib.spa.framework.DebugActivity

class GalleryDebugActivity : DebugActivity(SpaEnvironment.EntryRepository)
+1 −1
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@ object SpaEnvironment {
                IllustrationPageProvider,
            ),
            rootPages = listOf(
                SettingsPage(HomePageProvider.name)
                SettingsPage.create(HomePageProvider.name)
            ) + ArgumentPageProvider.buildRootPages()
        )
    }
+0 −14
Original line number Diff line number Diff line
@@ -17,15 +17,12 @@
package com.android.settingslib.spa.gallery.home

import android.os.Bundle
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.gallery.R
import com.android.settingslib.spa.gallery.SpaEnvironment
import com.android.settingslib.spa.gallery.page.ArgumentPageProvider
import com.android.settingslib.spa.gallery.page.FooterPageProvider
import com.android.settingslib.spa.gallery.page.IllustrationPageProvider
@@ -55,17 +52,6 @@ private fun HomePage() {
        SettingsPagerPageProvider.EntryItem()
        FooterPageProvider.EntryItem()
        IllustrationPageProvider.EntryItem()

        /**
         * A test button to generate hierarchy.
         * TODO: remove it once the content provider is ready.
         */
        Button(onClick = {
            SpaEnvironment.EntryRepository.printAllPages()
            SpaEnvironment.EntryRepository.printAllEntries()
        }) {
            Text(text = "Generate Entry")
        }
    }
}

+155 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settingslib.spa.framework

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.android.settingslib.spa.R
import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsEntryRepository
import com.android.settingslib.spa.framework.compose.localNavController
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.scaffold.HomeScaffold
import com.android.settingslib.spa.widget.scaffold.RegularScaffold

private const val ROUTE_ROOT = "root"
private const val ROUTE_All_PAGES = "pages"
private const val ROUTE_All_ENTRIES = "entries"
private const val ROUTE_PAGE = "page"
private const val ROUTE_ENTRY = "entry"
private const val PARAM_NAME_PAGE_ID = "pid"
private const val PARAM_NAME_ENTRY_ID = "eid"

open class DebugActivity(
    private val entryRepository: SettingsEntryRepository
) : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.Theme_SpaLib_DayNight)
        super.onCreate(savedInstanceState)

        setContent {
            SettingsTheme {
                MainContent()
            }
        }
    }

    @Composable
    private fun MainContent() {
        val navController = rememberNavController()
        CompositionLocalProvider(navController.localNavController()) {
            NavHost(navController, ROUTE_ROOT) {
                composable(route = ROUTE_ROOT) { RootPage() }
                composable(route = ROUTE_All_PAGES) { AllPages() }
                composable(route = ROUTE_All_ENTRIES) { AllEntries() }
                composable(
                    route = "$ROUTE_PAGE/{$PARAM_NAME_PAGE_ID}",
                    arguments = listOf(
                        navArgument(PARAM_NAME_PAGE_ID) { type = NavType.IntType },
                    )
                ) { navBackStackEntry -> OnePage(navBackStackEntry.arguments) }
                composable(
                    route = "$ROUTE_ENTRY/{$PARAM_NAME_ENTRY_ID}",
                    arguments = listOf(
                        navArgument(PARAM_NAME_ENTRY_ID) { type = NavType.IntType },
                    )
                ) { navBackStackEntry -> OneEntry(navBackStackEntry.arguments) }
            }
        }
    }

    @Composable
    fun RootPage() {
        HomeScaffold(title = "Entry Debug") {
            Preference(object : PreferenceModel {
                override val title = "List All Pages"
                override val onClick = navigator(route = ROUTE_All_PAGES)
            })
            Preference(object : PreferenceModel {
                override val title = "List All Entries"
                override val onClick = navigator(route = ROUTE_All_ENTRIES)
            })
        }
    }

    @Composable
    fun AllPages() {
        RegularScaffold(title = "All Pages") {
            for (pageWithEntry in entryRepository.getAllPageWithEntry()) {
                Preference(object : PreferenceModel {
                    override val title =
                        "${pageWithEntry.page.displayName} (${pageWithEntry.entries.size})"
                    override val summary = pageWithEntry.page.formatArguments().toState()
                    override val onClick =
                        navigator(route = ROUTE_PAGE + "/${pageWithEntry.page.id}")
                })
            }
        }
    }

    @Composable
    fun AllEntries() {
        RegularScaffold(title = "All Entries") {
            EntryList(entryRepository.getAllEntries())
        }
    }

    @Composable
    fun OnePage(arguments: Bundle?) {
        val id = arguments!!.getInt(PARAM_NAME_PAGE_ID)
        val pageWithEntry = entryRepository.getPageWithEntry(id)!!
        RegularScaffold(title = "Page ${pageWithEntry.page.displayName}") {
            Text(text = pageWithEntry.page.formatArguments())
            Text(text = "Entry size: ${pageWithEntry.entries.size}")
            EntryList(pageWithEntry.entries)
        }
    }

    @Composable
    fun OneEntry(arguments: Bundle?) {
        val id = arguments!!.getInt(PARAM_NAME_ENTRY_ID)
        val entry = entryRepository.getEntry(id)!!
        RegularScaffold(title = "Entry ${entry.displayName}") {
            Text (text = entry.formatAll())
        }
    }

    @Composable
    private fun EntryList(entries: Collection<SettingsEntry>) {
        for (entry in entries) {
            Preference(object : PreferenceModel {
                override val title = entry.displayName
                override val summary =
                    "${entry.fromPage?.displayName} -> ${entry.toPage?.displayName}".toState()
                override val onClick = navigator(route = ROUTE_ENTRY + "/${entry.id}")
            })
        }
    }
}
Loading