diff options
10 files changed, 31 insertions, 43 deletions
diff --git a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt index a1ab35b14749..eac06e3eb52b 100644 --- a/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt +++ b/packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/scaffold/SearchScaffoldPageProvider.kt @@ -50,7 +50,7 @@ object SearchScaffoldPageProvider : SettingsPageProvider { @Composable private fun Page() { - SearchScaffold(title = TITLE) { bottomPadding, searchQuery -> - PlaceholderTitle("Search query: ${searchQuery.value}") + SearchScaffold(title = TITLE) { _, searchQuery -> + PlaceholderTitle("Search query: ${searchQuery()}") } } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/RuntimeUtils.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/RuntimeUtils.kt index ba8854653b0b..b97fb9ca960e 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/RuntimeUtils.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/compose/RuntimeUtils.kt @@ -29,12 +29,6 @@ fun <T> rememberContext(constructor: (Context) -> T): T { } /** - * Remember the [State] initialized with the [this]. - */ -@Composable -fun <T> T.toState(): State<T> = remember { stateOf(this) } - -/** * Return a new [State] initialized with the passed in [value]. */ fun <T> stateOf(value: T) = object : State<T> { diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/StateFlowBridge.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/StateFlowBridge.kt index 494e69b657ca..7842948baadb 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/StateFlowBridge.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/framework/util/StateFlowBridge.kt @@ -18,11 +18,10 @@ package com.android.settingslib.spa.framework.util import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.State import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.filterNotNull -/** A StateFlow holder which value could be set or sync from [State]. */ +/** A StateFlow holder which value could be set or sync from callback. */ class StateFlowBridge<T> { private val stateFlow = MutableStateFlow<T?>(null) val flow = stateFlow.filterNotNull() @@ -34,9 +33,10 @@ class StateFlowBridge<T> { } @Composable - fun Sync(state: State<T>) { - LaunchedEffect(state.value) { - stateFlow.value = state.value + fun Sync(callback: () -> T) { + val value = callback() + LaunchedEffect(value) { + stateFlow.value = value } } } diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt index 696e8776ccd7..c87178db8ffa 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SearchScaffold.kt @@ -37,8 +37,6 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.State -import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -72,7 +70,7 @@ import com.android.settingslib.spa.widget.preference.PreferenceModel fun SearchScaffold( title: String, actions: @Composable RowScope.() -> Unit = {}, - content: @Composable (bottomPadding: Dp, searchQuery: State<String>) -> Unit, + content: @Composable (bottomPadding: Dp, searchQuery: () -> String) -> Unit, ) { ActivityTitle(title) var isSearchMode by rememberSaveable { mutableStateOf(false) } @@ -100,12 +98,9 @@ fun SearchScaffold( .focusable() .fillMaxSize() ) { - content( - paddingValues.calculateBottomPadding(), - remember { - derivedStateOf { if (isSearchMode) viewModel.searchQuery.text else "" } - }, - ) + content(paddingValues.calculateBottomPadding()) { + if (isSearchMode) viewModel.searchQuery.text else "" + } } } } diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/util/StateFlowBridgeTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/util/StateFlowBridgeTest.kt index f0e57b95263c..9b7ef08c8269 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/util/StateFlowBridgeTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/framework/util/StateFlowBridgeTest.kt @@ -18,7 +18,6 @@ package com.android.settingslib.spa.framework.util import androidx.compose.ui.test.junit4.createComposeRule import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest @@ -56,7 +55,7 @@ class StateFlowBridgeTest { val stateFlowBridge = StateFlowBridge<String>() composeTestRule.setContent { - stateFlowBridge.Sync(stateOf("A")) + stateFlowBridge.Sync { "A" } } val first = stateFlowBridge.flow.firstWithTimeoutOrNull() diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SearchScaffoldTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SearchScaffoldTest.kt index c3e1d544a6ab..826a0d461c8c 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SearchScaffoldTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SearchScaffoldTest.kt @@ -19,7 +19,6 @@ package com.android.settingslib.spa.widget.scaffold import android.content.Context import androidx.appcompat.R import androidx.compose.runtime.SideEffect -import androidx.compose.runtime.State import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithContentDescription @@ -60,7 +59,7 @@ class SearchScaffoldTest { fun initialState_searchQueryIsEmpty() { val searchQuery = setContent() - assertThat(searchQuery.value).isEqualTo("") + assertThat(searchQuery()).isEqualTo("") } @Test @@ -72,7 +71,7 @@ class SearchScaffoldTest { composeTestRule.onNodeWithText(TITLE).assertDoesNotExist() onSearchHint().assertIsDisplayed() onClearButton().assertDoesNotExist() - assertThat(searchQuery.value).isEqualTo("") + assertThat(searchQuery()).isEqualTo("") } @Test @@ -87,7 +86,7 @@ class SearchScaffoldTest { composeTestRule.onNodeWithText(TITLE).assertIsDisplayed() onSearchHint().assertDoesNotExist() onClearButton().assertDoesNotExist() - assertThat(searchQuery.value).isEqualTo("") + assertThat(searchQuery()).isEqualTo("") } @Test @@ -98,7 +97,7 @@ class SearchScaffoldTest { onSearchHint().performTextInput(QUERY) onClearButton().assertIsDisplayed() - assertThat(searchQuery.value).isEqualTo(QUERY) + assertThat(searchQuery()).isEqualTo(QUERY) } @Test @@ -110,11 +109,11 @@ class SearchScaffoldTest { onClearButton().performClick() onClearButton().assertDoesNotExist() - assertThat(searchQuery.value).isEqualTo("") + assertThat(searchQuery()).isEqualTo("") } - private fun setContent(): State<String> { - lateinit var actualSearchQuery: State<String> + private fun setContent(): () -> String { + lateinit var actualSearchQuery: () -> String composeTestRule.setContent { SearchScaffold(title = TITLE) { _, searchQuery -> SideEffect { diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt index 7c45b64233b2..68da1431c594 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppList.kt @@ -65,8 +65,8 @@ data class AppListConfig( ) data class AppListState( - val showSystem: State<Boolean>, - val searchQuery: State<String>, + val showSystem: () -> Boolean, + val searchQuery: () -> String, ) data class AppListInput<T : AppRecord>( diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListPage.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListPage.kt index 07e42350233c..c69b5dffcd8c 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListPage.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppListPage.kt @@ -17,8 +17,10 @@ package com.android.settingslib.spaprivileged.template.app import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.res.stringResource import com.android.settingslib.spa.widget.scaffold.MoreOptionsAction import com.android.settingslib.spa.widget.scaffold.MoreOptionsScope @@ -47,13 +49,13 @@ fun <T : AppRecord> AppListPage( header: @Composable () -> Unit = {}, appList: @Composable AppListInput<T>.() -> Unit = { AppList() }, ) { - val showSystem = rememberSaveable { mutableStateOf(false) } + var showSystem by rememberSaveable { mutableStateOf(false) } SearchScaffold( title = title, actions = { if (!noMoreOptions) { MoreOptionsAction { - ShowSystemAction(showSystem.value) { showSystem.value = it } + ShowSystemAction(showSystem) { showSystem = it } moreOptions() } } @@ -68,7 +70,7 @@ fun <T : AppRecord> AppListPage( ), listModel = listModel, state = AppListState( - showSystem = showSystem, + showSystem = { showSystem }, searchQuery = searchQuery, ), header = header, diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt index 82fbee9a8c43..4d90076f060e 100644 --- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt @@ -55,8 +55,8 @@ class AppListPageTest { val inputState by setContent() val state = inputState!!.state - assertThat(state.showSystem.value).isFalse() - assertThat(state.searchQuery.value).isEqualTo("") + assertThat(state.showSystem()).isFalse() + assertThat(state.searchQuery()).isEqualTo("") } @Test @@ -67,7 +67,7 @@ class AppListPageTest { composeTestRule.onNodeWithText(context.getString(R.string.menu_show_system)).performClick() val state = inputState!!.state - assertThat(state.showSystem.value).isTrue() + assertThat(state.showSystem()).isTrue() } @Test @@ -94,7 +94,7 @@ class AppListPageTest { val inputState by setContent(noMoreOptions = true) val state = inputState!!.state - assertThat(state.showSystem.value).isFalse() + assertThat(state.showSystem()).isFalse() } private fun setContent( diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt index 124ced6f88db..c6409e7738d6 100644 --- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt @@ -30,7 +30,6 @@ import androidx.compose.ui.test.performClick import androidx.compose.ui.unit.dp import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.widget.ui.SpinnerOption import com.android.settingslib.spaprivileged.R import com.android.settingslib.spaprivileged.model.app.AppEntry @@ -140,7 +139,7 @@ class AppListTest { matchAnyUserForAdmin = false, ), listModel = TestAppListModel(enableGrouping = enableGrouping), - state = AppListState(showSystem = stateOf(false), searchQuery = stateOf("")), + state = AppListState(showSystem = { false }, searchQuery = { "" }), header = header, bottomPadding = 0.dp, ) |