From f96dd83ba49c66d3b85c16429287a744ebc41e71 Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Fri, 12 May 2023 17:38:43 +0800 Subject: [PATCH] Correct the page title for TalkBack Update the activity title so TalkBack can read correctly. Fix: 282093840 Test: Manually with TalkBack Test: Unit test Change-Id: I9aa31b210a183562c52aa3617a23a1ffcca93bc2 --- .../spa/widget/scaffold/SearchScaffold.kt | 1 + .../spa/widget/scaffold/SettingsScaffold.kt | 25 ++++++++++++++++++ .../widget/scaffold/SettingsScaffoldTest.kt | 26 ++++++++++++++++++- 3 files changed, 51 insertions(+), 1 deletion(-) 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 f6ca0c4fd5c45..67c4cdcc12908 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 @@ -73,6 +73,7 @@ fun SearchScaffold( actions: @Composable RowScope.() -> Unit = {}, content: @Composable (bottomPadding: Dp, searchQuery: State) -> Unit, ) { + ActivityTitle(title) var isSearchMode by rememberSaveable { mutableStateOf(false) } val viewModel: SearchScaffoldViewModel = viewModel() diff --git a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffold.kt b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffold.kt index f4e504a954a2c..89194021ecd56 100644 --- a/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffold.kt +++ b/packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffold.kt @@ -16,6 +16,9 @@ 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.Column import androidx.compose.foundation.layout.PaddingValues @@ -25,8 +28,10 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Scaffold import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import com.android.settingslib.spa.framework.compose.horizontalValues import com.android.settingslib.spa.framework.compose.verticalValues @@ -44,6 +49,7 @@ fun SettingsScaffold( actions: @Composable RowScope.() -> Unit = {}, content: @Composable (PaddingValues) -> Unit, ) { + ActivityTitle(title) val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior() Scaffold( 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 @Composable private fun SettingsScaffoldPreview() { diff --git a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffoldTest.kt b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffoldTest.kt index f04240485386b..872d957a6a248 100644 --- a/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffoldTest.kt +++ b/packages/SettingsLib/Spa/tests/src/com/android/settingslib/spa/widget/scaffold/SettingsScaffoldTest.kt @@ -16,9 +16,12 @@ package com.android.settingslib.spa.widget.scaffold +import android.app.Activity import androidx.compose.foundation.layout.PaddingValues import androidx.compose.material3.Text +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.SideEffect +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText @@ -29,12 +32,22 @@ import com.google.common.truth.Truth.assertThat import org.junit.Rule import org.junit.Test 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) class SettingsScaffoldTest { @get:Rule val composeTestRule = createComposeRule() + @get:Rule + val mockito: MockitoRule = MockitoJUnit.rule() + + @Mock + private lateinit var activity: Activity + @Test fun settingsScaffold_titleIsDisplayed() { composeTestRule.setContent { @@ -78,7 +91,18 @@ class SettingsScaffoldTest { 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 { - const val TITLE = "title" + const val TITLE = "Title" } }