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

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

Merge "[Spa] Fix State<T> as a parameter of SearchScaffold" into main

parents 65d77e93 b58fca39
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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()}")
    }
}
+0 −6
Original line number Diff line number Diff line
@@ -28,12 +28,6 @@ fun <T> rememberContext(constructor: (Context) -> T): T {
    return remember(context) { constructor(context) }
}

/**
 * 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].
 */
+5 −5
Original line number Diff line number Diff line
@@ -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
        }
    }
}
+4 −9
Original line number Diff line number Diff line
@@ -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 ""
            }
        }
    }
}
+1 −2
Original line number Diff line number Diff line
@@ -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()
Loading