Merge "Add a open isPageEnabled() to BrowseActivity" into udc-dev
This commit is contained in:
@@ -20,6 +20,7 @@ package com.android.settingslib.spa.framework
|
|||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
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
|
||||||
@@ -40,6 +41,7 @@ import androidx.navigation.NavGraph.Companion.findStartDestination
|
|||||||
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.SettingsPageProvider
|
import com.android.settingslib.spa.framework.common.SettingsPageProvider
|
||||||
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
|
||||||
@@ -51,7 +53,7 @@ import com.android.settingslib.spa.framework.compose.composable
|
|||||||
import com.android.settingslib.spa.framework.compose.localNavController
|
import com.android.settingslib.spa.framework.compose.localNavController
|
||||||
import com.android.settingslib.spa.framework.compose.rememberAnimatedNavController
|
import com.android.settingslib.spa.framework.compose.rememberAnimatedNavController
|
||||||
import com.android.settingslib.spa.framework.theme.SettingsTheme
|
import com.android.settingslib.spa.framework.theme.SettingsTheme
|
||||||
import com.android.settingslib.spa.framework.util.PageWithEvent
|
import com.android.settingslib.spa.framework.util.PageLogger
|
||||||
import com.android.settingslib.spa.framework.util.getDestination
|
import com.android.settingslib.spa.framework.util.getDestination
|
||||||
import com.android.settingslib.spa.framework.util.getEntryId
|
import com.android.settingslib.spa.framework.util.getEntryId
|
||||||
import com.android.settingslib.spa.framework.util.getSessionName
|
import com.android.settingslib.spa.framework.util.getSessionName
|
||||||
@@ -87,25 +89,50 @@ open class BrowseActivity : ComponentActivity() {
|
|||||||
setContent {
|
setContent {
|
||||||
SettingsTheme {
|
SettingsTheme {
|
||||||
val sppRepository by spaEnvironment.pageProviderRepository
|
val sppRepository by spaEnvironment.pageProviderRepository
|
||||||
BrowseContent(sppRepository, intent)
|
BrowseContent(
|
||||||
}
|
sppRepository = sppRepository,
|
||||||
|
isPageEnabled = ::isPageEnabled,
|
||||||
|
initialIntent = intent,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun isPageEnabled(page: SettingsPage) = page.isEnabled()
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@Composable
|
@Composable
|
||||||
fun BrowseContent(sppRepository: SettingsPageProviderRepository, initialIntent: Intent? = null) {
|
internal fun BrowseContent(
|
||||||
|
sppRepository: SettingsPageProviderRepository,
|
||||||
|
isPageEnabled: (SettingsPage) -> Boolean,
|
||||||
|
initialIntent: Intent?,
|
||||||
|
) {
|
||||||
val navController = rememberAnimatedNavController()
|
val navController = rememberAnimatedNavController()
|
||||||
CompositionLocalProvider(navController.localNavController()) {
|
CompositionLocalProvider(navController.localNavController()) {
|
||||||
val controller = LocalNavController.current as NavControllerWrapperImpl
|
val controller = LocalNavController.current as NavControllerWrapperImpl
|
||||||
controller.NavContent(sppRepository.getAllProviders())
|
controller.NavContent(sppRepository.getAllProviders()) { page ->
|
||||||
|
if (remember { isPageEnabled(page) }) {
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
|
Log.d(TAG, "Launching page ${page.sppName}")
|
||||||
|
}
|
||||||
|
page.PageLogger()
|
||||||
|
page.UiLayout()
|
||||||
|
} else {
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
|
controller.navigateBack()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
controller.InitialDestination(initialIntent, sppRepository.getDefaultStartPage())
|
controller.InitialDestination(initialIntent, sppRepository.getDefaultStartPage())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun NavControllerWrapperImpl.NavContent(allProvider: Collection<SettingsPageProvider>) {
|
private fun NavControllerWrapperImpl.NavContent(
|
||||||
|
allProvider: Collection<SettingsPageProvider>,
|
||||||
|
content: @Composable (SettingsPage) -> Unit,
|
||||||
|
) {
|
||||||
AnimatedNavHost(
|
AnimatedNavHost(
|
||||||
navController = navController,
|
navController = navController,
|
||||||
startDestination = NullPageProvider.name,
|
startDestination = NullPageProvider.name,
|
||||||
@@ -139,7 +166,7 @@ private fun NavControllerWrapperImpl.NavContent(allProvider: Collection<Settings
|
|||||||
},
|
},
|
||||||
) { navBackStackEntry ->
|
) { navBackStackEntry ->
|
||||||
val page = remember { spp.createSettingsPage(navBackStackEntry.arguments) }
|
val page = remember { spp.createSettingsPage(navBackStackEntry.arguments) }
|
||||||
page.PageWithEvent()
|
content(page)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,14 +29,12 @@ import com.android.settingslib.spa.framework.compose.LocalNavController
|
|||||||
import com.android.settingslib.spa.framework.compose.NavControllerWrapper
|
import com.android.settingslib.spa.framework.compose.NavControllerWrapper
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
internal fun SettingsPage.PageWithEvent() {
|
internal fun SettingsPage.PageLogger() {
|
||||||
if (!isEnabled()) return
|
|
||||||
val navController = LocalNavController.current
|
val navController = LocalNavController.current
|
||||||
LifecycleEffect(
|
LifecycleEffect(
|
||||||
onStart = { logPageEvent(LogEvent.PAGE_ENTER, navController) },
|
onStart = { logPageEvent(LogEvent.PAGE_ENTER, navController) },
|
||||||
onStop = { logPageEvent(LogEvent.PAGE_LEAVE, navController) },
|
onStop = { logPageEvent(LogEvent.PAGE_LEAVE, navController) },
|
||||||
)
|
)
|
||||||
UiLayout()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun SettingsPage.logPageEvent(event: LogEvent, navController: NavControllerWrapper) {
|
private fun SettingsPage.logPageEvent(event: LogEvent, navController: NavControllerWrapper) {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import androidx.test.core.app.ApplicationProvider
|
|||||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
import com.android.settingslib.spa.framework.common.LogCategory
|
import com.android.settingslib.spa.framework.common.LogCategory
|
||||||
import com.android.settingslib.spa.framework.common.LogEvent
|
import com.android.settingslib.spa.framework.common.LogEvent
|
||||||
|
import com.android.settingslib.spa.framework.common.SettingsPage
|
||||||
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
|
||||||
import com.android.settingslib.spa.tests.testutils.SpaEnvironmentForTest
|
import com.android.settingslib.spa.tests.testutils.SpaEnvironmentForTest
|
||||||
@@ -38,8 +39,6 @@ import org.junit.Rule
|
|||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.junit.runner.RunWith
|
import org.junit.runner.RunWith
|
||||||
|
|
||||||
const val WAIT_UNTIL_TIMEOUT = 1000L
|
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
class BrowseActivityTest {
|
class BrowseActivityTest {
|
||||||
@get:Rule
|
@get:Rule
|
||||||
@@ -49,19 +48,26 @@ class BrowseActivityTest {
|
|||||||
private val spaLogger = SpaLoggerForTest()
|
private val spaLogger = SpaLoggerForTest()
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testBrowsePage() {
|
fun browseContent_onNavigate_logPageEvent() {
|
||||||
spaLogger.reset()
|
val spaEnvironment = SpaEnvironmentForTest(
|
||||||
val spaEnvironment =
|
context = context,
|
||||||
SpaEnvironmentForTest(context, listOf(SppHome.createSettingsPage()), logger = spaLogger)
|
rootPages = listOf(SppHome.createSettingsPage()),
|
||||||
|
logger = spaLogger,
|
||||||
|
)
|
||||||
SpaEnvironmentFactory.reset(spaEnvironment)
|
SpaEnvironmentFactory.reset(spaEnvironment)
|
||||||
|
|
||||||
val sppRepository by spaEnvironment.pageProviderRepository
|
val sppRepository by spaEnvironment.pageProviderRepository
|
||||||
val sppHome = sppRepository.getProviderOrNull("SppHome")!!
|
val sppHome = sppRepository.getProviderOrNull("SppHome")!!
|
||||||
val pageHome = sppHome.createSettingsPage()
|
val pageHome = sppHome.createSettingsPage()
|
||||||
val sppLayer1 = sppRepository.getProviderOrNull("SppLayer1")!!
|
val sppLayer1 = sppRepository.getProviderOrNull("SppLayer1")!!
|
||||||
val pageLayer1 = sppLayer1.createSettingsPage()
|
val pageLayer1 = sppLayer1.createSettingsPage()
|
||||||
|
|
||||||
composeTestRule.setContent { BrowseContent(sppRepository) }
|
composeTestRule.setContent {
|
||||||
|
BrowseContent(
|
||||||
|
sppRepository = sppRepository,
|
||||||
|
isPageEnabled = SettingsPage::isEnabled,
|
||||||
|
initialIntent = null,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
composeTestRule.onNodeWithText(sppHome.getTitle(null)).assertIsDisplayed()
|
composeTestRule.onNodeWithText(sppHome.getTitle(null)).assertIsDisplayed()
|
||||||
spaLogger.verifyPageEvent(pageHome.id, 1, 0)
|
spaLogger.verifyPageEvent(pageHome.id, 1, 0)
|
||||||
@@ -69,7 +75,7 @@ class BrowseActivityTest {
|
|||||||
|
|
||||||
// click to layer1 page
|
// click to layer1 page
|
||||||
composeTestRule.onNodeWithText("SppHome to Layer1").assertIsDisplayed().performClick()
|
composeTestRule.onNodeWithText("SppHome to Layer1").assertIsDisplayed().performClick()
|
||||||
waitUntil(WAIT_UNTIL_TIMEOUT) {
|
waitUntil {
|
||||||
composeTestRule.onAllNodesWithText(sppLayer1.getTitle(null))
|
composeTestRule.onAllNodesWithText(sppLayer1.getTitle(null))
|
||||||
.fetchSemanticsNodes().size == 1
|
.fetchSemanticsNodes().size == 1
|
||||||
}
|
}
|
||||||
@@ -78,18 +84,24 @@ class BrowseActivityTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testBrowseDisabledPage() {
|
fun browseContent_whenDisabled_noLogPageEvent() {
|
||||||
spaLogger.reset()
|
|
||||||
val spaEnvironment = SpaEnvironmentForTest(
|
val spaEnvironment = SpaEnvironmentForTest(
|
||||||
context, listOf(SppDisabled.createSettingsPage()), logger = spaLogger
|
context = context,
|
||||||
|
rootPages = listOf(SppDisabled.createSettingsPage()),
|
||||||
|
logger = spaLogger,
|
||||||
)
|
)
|
||||||
SpaEnvironmentFactory.reset(spaEnvironment)
|
SpaEnvironmentFactory.reset(spaEnvironment)
|
||||||
|
|
||||||
val sppRepository by spaEnvironment.pageProviderRepository
|
val sppRepository by spaEnvironment.pageProviderRepository
|
||||||
val sppDisabled = sppRepository.getProviderOrNull("SppDisabled")!!
|
val sppDisabled = sppRepository.getProviderOrNull("SppDisabled")!!
|
||||||
val pageDisabled = sppDisabled.createSettingsPage()
|
val pageDisabled = sppDisabled.createSettingsPage()
|
||||||
|
|
||||||
composeTestRule.setContent { BrowseContent(sppRepository) }
|
composeTestRule.setContent {
|
||||||
|
BrowseContent(
|
||||||
|
sppRepository = sppRepository,
|
||||||
|
isPageEnabled = SettingsPage::isEnabled,
|
||||||
|
initialIntent = null,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
composeTestRule.onNodeWithText(sppDisabled.getTitle(null)).assertDoesNotExist()
|
composeTestRule.onNodeWithText(sppDisabled.getTitle(null)).assertDoesNotExist()
|
||||||
spaLogger.verifyPageEvent(pageDisabled.id, 0, 0)
|
spaLogger.verifyPageEvent(pageDisabled.id, 0, 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user