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

Commit 2a7f55af authored by Chaohui Wang's avatar Chaohui Wang Committed by Android (Google) Code Review
Browse files

Merge "[Spa] Support dialog in NavHost" into main

parents c1dee6e3 70247aa5
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -24,7 +24,8 @@ import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
import com.android.settingslib.spa.gallery.card.CardPageProvider
import com.android.settingslib.spa.gallery.card.CardPageProvider
import com.android.settingslib.spa.gallery.chart.ChartPageProvider
import com.android.settingslib.spa.gallery.chart.ChartPageProvider
import com.android.settingslib.spa.gallery.dialog.AlertDialogPageProvider
import com.android.settingslib.spa.gallery.dialog.DialogMainPageProvider
import com.android.settingslib.spa.gallery.dialog.NavDialogProvider
import com.android.settingslib.spa.gallery.editor.EditorMainPageProvider
import com.android.settingslib.spa.gallery.editor.EditorMainPageProvider
import com.android.settingslib.spa.gallery.editor.SettingsExposedDropdownMenuBoxPageProvider
import com.android.settingslib.spa.gallery.editor.SettingsExposedDropdownMenuBoxPageProvider
import com.android.settingslib.spa.gallery.editor.SettingsExposedDropdownMenuCheckBoxProvider
import com.android.settingslib.spa.gallery.editor.SettingsExposedDropdownMenuCheckBoxProvider
@@ -91,7 +92,8 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) {
                ProgressBarPageProvider,
                ProgressBarPageProvider,
                LoadingBarPageProvider,
                LoadingBarPageProvider,
                ChartPageProvider,
                ChartPageProvider,
                AlertDialogPageProvider,
                DialogMainPageProvider,
                NavDialogProvider,
                ItemListPageProvider,
                ItemListPageProvider,
                ItemOperatePageProvider,
                ItemOperatePageProvider,
                OperateListPageProvider,
                OperateListPageProvider,
+9 −3
Original line number Original line Diff line number Diff line
@@ -28,10 +28,10 @@ import com.android.settingslib.spa.widget.dialog.rememberAlertDialogPresenter
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.preference.PreferenceModel


private const val TITLE = "AlertDialogPage"
private const val TITLE = "Category: Dialog"


object AlertDialogPageProvider : SettingsPageProvider {
object DialogMainPageProvider : SettingsPageProvider {
    override val name = "AlertDialogPage"
    override val name = "DialogMain"
    private val owner = createSettingsPage()
    private val owner = createSettingsPage()


    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> = listOf(
    override fun buildEntry(arguments: Bundle?): List<SettingsEntry> = listOf(
@@ -47,6 +47,12 @@ object AlertDialogPageProvider : SettingsPageProvider {
                override val onClick = alertDialogPresenter::open
                override val onClick = alertDialogPresenter::open
            })
            })
        }.build(),
        }.build(),
        SettingsEntryBuilder.create("NavDialog", owner).setUiLayoutFn {
            Preference(object : PreferenceModel {
                override val title = "Navigate to Dialog"
                override val onClick = navigator(route = NavDialogProvider.name)
            })
        }.build(),
    )
    )


    fun buildInjectEntry() = SettingsEntryBuilder.createInject(owner)
    fun buildInjectEntry() = SettingsEntryBuilder.createInject(owner)
+32 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2024 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.dialog

import android.os.Bundle
import androidx.compose.runtime.Composable
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.widget.dialog.SettingsDialogCard

object NavDialogProvider : SettingsPageProvider {
    override val name = "NavDialog"
    override val navType = SettingsPageProvider.NavType.Dialog

    @Composable
    override fun Page(arguments: Bundle?) {
        SettingsDialogCard("Example Nav Dialog") {}
    }
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -30,7 +30,7 @@ import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
import com.android.settingslib.spa.gallery.card.CardPageProvider
import com.android.settingslib.spa.gallery.card.CardPageProvider
import com.android.settingslib.spa.gallery.chart.ChartPageProvider
import com.android.settingslib.spa.gallery.chart.ChartPageProvider
import com.android.settingslib.spa.gallery.dialog.AlertDialogPageProvider
import com.android.settingslib.spa.gallery.dialog.DialogMainPageProvider
import com.android.settingslib.spa.gallery.editor.EditorMainPageProvider
import com.android.settingslib.spa.gallery.editor.EditorMainPageProvider
import com.android.settingslib.spa.gallery.itemList.OperateListPageProvider
import com.android.settingslib.spa.gallery.itemList.OperateListPageProvider
import com.android.settingslib.spa.gallery.page.ArgumentPageModel
import com.android.settingslib.spa.gallery.page.ArgumentPageModel
@@ -71,7 +71,7 @@ object HomePageProvider : SettingsPageProvider {
            ProgressBarPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            ProgressBarPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            LoadingBarPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            LoadingBarPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            ChartPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            ChartPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            AlertDialogPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            DialogMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            EditorMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            EditorMainPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            CardPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            CardPageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            CopyablePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
            CopyablePageProvider.buildInjectEntry().setLink(fromPage = owner).build(),
+24 −17
Original line number Original line Diff line number Diff line
@@ -22,7 +22,6 @@ import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.compose.setContent
import androidx.annotation.VisibleForTesting
import androidx.annotation.VisibleForTesting
import androidx.compose.foundation.layout.Box
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.LaunchedEffect
@@ -30,15 +29,19 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.core.view.WindowCompat
import androidx.core.view.WindowCompat
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavGraph.Companion.findStartDestination
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.composable
import androidx.navigation.compose.dialog
import androidx.navigation.compose.rememberNavController
import androidx.navigation.compose.rememberNavController
import com.android.settingslib.spa.R
import com.android.settingslib.spa.R
import com.android.settingslib.spa.framework.common.LogCategory
import com.android.settingslib.spa.framework.common.LogCategory
import com.android.settingslib.spa.framework.common.NullPageProvider
import com.android.settingslib.spa.framework.common.NullPageProvider
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SettingsPage
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.common.SettingsPageProvider.NavType
import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository
import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.common.SpaEnvironmentFactory
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.framework.common.createSettingsPage
@@ -127,25 +130,29 @@ private fun NavControllerWrapperImpl.NavContent(
    allProvider: Collection<SettingsPageProvider>,
    allProvider: Collection<SettingsPageProvider>,
    content: @Composable (SettingsPage) -> Unit,
    content: @Composable (SettingsPage) -> Unit,
) {
) {
    // TODO(b/298520326): Remove Box after the issue is fixed.
    // Wrap the top level node into a Box to workaround an issue of Compose 1.6.0-alpha03.
    Box {
    NavHost(
    NavHost(
        navController = navController,
        navController = navController,
        startDestination = NullPageProvider.name,
        startDestination = NullPageProvider.name,
    ) {
    ) {
        composable(NullPageProvider.name) {}
        composable(NullPageProvider.name) {}
        for (spp in allProvider) {
        for (spp in allProvider) {
                animatedComposable(
            destination(spp) { navBackStackEntry ->
                    route = spp.name + spp.parameter.navRoute(),
                    arguments = spp.parameter,
                ) { navBackStackEntry ->
                val page = remember { spp.createSettingsPage(navBackStackEntry.arguments) }
                val page = remember { spp.createSettingsPage(navBackStackEntry.arguments) }
                content(page)
                content(page)
            }
            }
        }
        }
    }
    }
}
}

private fun NavGraphBuilder.destination(
    spp: SettingsPageProvider,
    content: @Composable (NavBackStackEntry) -> Unit,
) {
    val route = spp.name + spp.parameter.navRoute()
    when (spp.navType) {
        NavType.Page -> animatedComposable(route, spp.parameter) { content(it) }
        NavType.Dialog -> dialog(route, spp.parameter) { content(it) }
    }
}
}


@Composable
@Composable
Loading