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

Commit 3cac9f47 authored by Zekan Qian's avatar Zekan Qian Committed by Android (Google) Code Review
Browse files

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

parents e08b5020 d3a94cf4
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