Merge "Correct the page title for TalkBack" into udc-dev

This commit is contained in:
Treehugger Robot
2023-05-12 19:14:35 +00:00
committed by Android (Google) Code Review
3 changed files with 51 additions and 1 deletions

View File

@@ -73,6 +73,7 @@ fun SearchScaffold(
actions: @Composable RowScope.() -> Unit = {}, actions: @Composable RowScope.() -> Unit = {},
content: @Composable (bottomPadding: Dp, searchQuery: State<String>) -> Unit, content: @Composable (bottomPadding: Dp, searchQuery: State<String>) -> Unit,
) { ) {
ActivityTitle(title)
var isSearchMode by rememberSaveable { mutableStateOf(false) } var isSearchMode by rememberSaveable { mutableStateOf(false) }
val viewModel: SearchScaffoldViewModel = viewModel() val viewModel: SearchScaffoldViewModel = viewModel()

View File

@@ -16,6 +16,9 @@
package com.android.settingslib.spa.widget.scaffold package com.android.settingslib.spa.widget.scaffold
import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
@@ -25,8 +28,10 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.compose.horizontalValues import com.android.settingslib.spa.framework.compose.horizontalValues
import com.android.settingslib.spa.framework.compose.verticalValues import com.android.settingslib.spa.framework.compose.verticalValues
@@ -44,6 +49,7 @@ fun SettingsScaffold(
actions: @Composable RowScope.() -> Unit = {}, actions: @Composable RowScope.() -> Unit = {},
content: @Composable (PaddingValues) -> Unit, content: @Composable (PaddingValues) -> Unit,
) { ) {
ActivityTitle(title)
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior()
Scaffold( Scaffold(
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
@@ -55,6 +61,25 @@ fun SettingsScaffold(
} }
} }
/**
* Sets a title for the activity.
*
* So the TalkBack can read out the correct page title.
*/
@Composable
internal fun ActivityTitle(title: String) {
val context = LocalContext.current
LaunchedEffect(true) {
context.getActivity()?.title = title
}
}
private fun Context.getActivity(): Activity? = when (this) {
is Activity -> this
is ContextWrapper -> baseContext.getActivity()
else -> null
}
@Preview @Preview
@Composable @Composable
private fun SettingsScaffoldPreview() { private fun SettingsScaffoldPreview() {

View File

@@ -16,9 +16,12 @@
package com.android.settingslib.spa.widget.scaffold package com.android.settingslib.spa.widget.scaffold
import android.app.Activity
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.SideEffect import androidx.compose.runtime.SideEffect
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText
@@ -29,12 +32,22 @@ import com.google.common.truth.Truth.assertThat
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.verify
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class SettingsScaffoldTest { class SettingsScaffoldTest {
@get:Rule @get:Rule
val composeTestRule = createComposeRule() val composeTestRule = createComposeRule()
@get:Rule
val mockito: MockitoRule = MockitoJUnit.rule()
@Mock
private lateinit var activity: Activity
@Test @Test
fun settingsScaffold_titleIsDisplayed() { fun settingsScaffold_titleIsDisplayed() {
composeTestRule.setContent { composeTestRule.setContent {
@@ -78,7 +91,18 @@ class SettingsScaffoldTest {
assertThat(actualPaddingValues.calculateRightPadding(LayoutDirection.Rtl)).isEqualTo(0.dp) assertThat(actualPaddingValues.calculateRightPadding(LayoutDirection.Rtl)).isEqualTo(0.dp)
} }
@Test
fun activityTitle() {
composeTestRule.setContent {
CompositionLocalProvider(LocalContext provides activity) {
ActivityTitle(title = TITLE)
}
}
verify(activity).title = TITLE
}
private companion object { private companion object {
const val TITLE = "title" const val TITLE = "Title"
} }
} }