From 250850cf9b1138c75b7ccd013a822d35b32bc33e Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Thu, 27 Jul 2023 20:31:42 +0100 Subject: [PATCH 1/8] Remove hardcoded topic names in `NavigationTest.kt` --- .../apps/nowinandroid/ui/NavigationTest.kt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt index 036a2955c..0cc8f4d4f 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt @@ -33,13 +33,17 @@ import androidx.test.espresso.Espresso import androidx.test.espresso.NoActivityResumedException import com.google.samples.apps.nowinandroid.MainActivity import com.google.samples.apps.nowinandroid.R +import com.google.samples.apps.nowinandroid.core.network.fake.FakeNiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.rules.GrantPostNotificationsPermissionRule import dagger.hilt.android.testing.BindValue import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest +import kotlinx.coroutines.test.runTest +import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import javax.inject.Inject import kotlin.properties.ReadOnlyProperty import com.google.samples.apps.nowinandroid.feature.bookmarks.R as BookmarksR import com.google.samples.apps.nowinandroid.feature.foryou.R as FeatureForyouR @@ -78,6 +82,9 @@ class NavigationTest { @get:Rule(order = 3) val composeTestRule = createAndroidComposeRule() + @Inject + lateinit var datasource: FakeNiaNetworkDataSource + private fun AndroidComposeTestRule<*, *>.stringResource(@StringRes resId: Int) = ReadOnlyProperty { _, _ -> activity.getString(resId) } @@ -92,6 +99,9 @@ class NavigationTest { private val brand by composeTestRule.stringResource(SettingsR.string.brand_android) private val ok by composeTestRule.stringResource(SettingsR.string.dismiss_dialog_button_text) + @Before + fun setup() = hiltRule.inject() + @Test fun firstScreen_isForYou() { composeTestRule.apply { @@ -251,11 +261,11 @@ class NavigationTest { } @Test - fun navigationBar_multipleBackStackInterests() { + fun navigationBar_multipleBackStackInterests() = runTest { + suspend fun randomTopicName() = datasource.getTopics(ids = null).random().name composeTestRule.apply { onNodeWithText(interests).performClick() - // TODO: Grab string from fake data - onNodeWithText("Android Studio & Tools").performClick() + onNodeWithText(randomTopicName()).performClick() // Switch tab onNodeWithText(forYou).performClick() @@ -264,7 +274,7 @@ class NavigationTest { onNodeWithText(interests).performClick() // Verify we're not in the list of interests - onNodeWithText("Android Auto").assertDoesNotExist() // TODO: Grab string from fake data + onNodeWithText(randomTopicName()).assertDoesNotExist() } } } From bf5fdb4cf8f2b41de690d94623cb21a12863d6d9 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Thu, 27 Jul 2023 20:36:42 +0100 Subject: [PATCH 2/8] Update NavigationTest.kt --- .../samples/apps/nowinandroid/ui/NavigationTest.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt index 0cc8f4d4f..a5241a9db 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt @@ -33,7 +33,7 @@ import androidx.test.espresso.Espresso import androidx.test.espresso.NoActivityResumedException import com.google.samples.apps.nowinandroid.MainActivity import com.google.samples.apps.nowinandroid.R -import com.google.samples.apps.nowinandroid.core.network.fake.FakeNiaNetworkDataSource +import com.google.samples.apps.nowinandroid.core.network.NiaNetworkDataSource import com.google.samples.apps.nowinandroid.core.rules.GrantPostNotificationsPermissionRule import dagger.hilt.android.testing.BindValue import dagger.hilt.android.testing.HiltAndroidRule @@ -83,7 +83,7 @@ class NavigationTest { val composeTestRule = createAndroidComposeRule() @Inject - lateinit var datasource: FakeNiaNetworkDataSource + lateinit var datasource: NiaNetworkDataSource private fun AndroidComposeTestRule<*, *>.stringResource(@StringRes resId: Int) = ReadOnlyProperty { _, _ -> activity.getString(resId) } @@ -262,10 +262,10 @@ class NavigationTest { @Test fun navigationBar_multipleBackStackInterests() = runTest { - suspend fun randomTopicName() = datasource.getTopics(ids = null).random().name + val topics = datasource.getTopics(ids = null) composeTestRule.apply { onNodeWithText(interests).performClick() - onNodeWithText(randomTopicName()).performClick() + onNodeWithText(topics.random().name).performClick() // Switch tab onNodeWithText(forYou).performClick() @@ -274,7 +274,7 @@ class NavigationTest { onNodeWithText(interests).performClick() // Verify we're not in the list of interests - onNodeWithText(randomTopicName()).assertDoesNotExist() + onNodeWithText(topics.random().name).assertDoesNotExist() } } } From 0a1f333fc64ec75b8a794d587a7c9764f148d8bd Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Thu, 27 Jul 2023 20:58:30 +0100 Subject: [PATCH 3/8] Update NavigationTest.kt --- .../samples/apps/nowinandroid/ui/NavigationTest.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt index a5241a9db..3d14eedd6 100644 --- a/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt +++ b/app/src/androidTest/java/com/google/samples/apps/nowinandroid/ui/NavigationTest.kt @@ -27,8 +27,10 @@ import androidx.compose.ui.test.junit4.AndroidComposeTestRule import androidx.compose.ui.test.junit4.createAndroidComposeRule import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollToNode import androidx.test.espresso.Espresso import androidx.test.espresso.NoActivityResumedException import com.google.samples.apps.nowinandroid.MainActivity @@ -262,10 +264,13 @@ class NavigationTest { @Test fun navigationBar_multipleBackStackInterests() = runTest { - val topics = datasource.getTopics(ids = null) composeTestRule.apply { onNodeWithText(interests).performClick() - onNodeWithText(topics.random().name).performClick() + + // Select a random topic + val topic = datasource.getTopics().random().name + onNodeWithTag("interests:topics").performScrollToNode(hasText(topic)) + onNodeWithText(topic).performClick() // Switch tab onNodeWithText(forYou).performClick() @@ -274,7 +279,7 @@ class NavigationTest { onNodeWithText(interests).performClick() // Verify we're not in the list of interests - onNodeWithText(topics.random().name).assertDoesNotExist() + onNodeWithTag("interests:topics").assertDoesNotExist() } } } From 995d7b643f78a76b33a4009f0980bd3f15b2e9f2 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Thu, 27 Jul 2023 21:13:26 +0100 Subject: [PATCH 4/8] Add missing full stop in `search_not_ready` string --- feature/search/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feature/search/src/main/res/values/strings.xml b/feature/search/src/main/res/values/strings.xml index 62db1da1d..2a824653e 100644 --- a/feature/search/src/main/res/values/strings.xml +++ b/feature/search/src/main/res/values/strings.xml @@ -18,7 +18,7 @@ Search Clear search text Sorry, there is no content found for your search \"%1$s\" - Sorry, we are still processing the search index. Please come back later + Sorry, we are still processing the search index. Please come back later. Try another search or explorer Interests to browse topics @@ -26,4 +26,4 @@ Updates Recent searches Clear searches - \ No newline at end of file + From 2b218b97d959d79268bb0883a9e31ebcea18cb82 Mon Sep 17 00:00:00 2001 From: Alex Vanyo Date: Fri, 14 Apr 2023 11:39:56 -0700 Subject: [PATCH 5/8] Switch to new Activity.enableEdgeToEdge Change-Id: I9bbb7b2d116099524525619714ef18448e707c4f --- app/build.gradle.kts | 1 - .../samples/apps/nowinandroid/MainActivity.kt | 40 +++++++++++++++---- app/src/main/res/values-night/themes.xml | 5 +-- app/src/main/res/values-v23/themes.xml | 22 ---------- app/src/main/res/values-v27/themes.xml | 23 ----------- app/src/main/res/values/themes.xml | 13 +----- gradle/libs.versions.toml | 3 +- 7 files changed, 36 insertions(+), 71 deletions(-) delete mode 100644 app/src/main/res/values-v23/themes.xml delete mode 100644 app/src/main/res/values-v27/themes.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 38cb7efe2..df5cfa296 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -106,7 +106,6 @@ dependencies { debugImplementation(libs.androidx.compose.ui.testManifest) debugImplementation(project(":ui-test-hilt-manifest")) - implementation(libs.accompanist.systemuicontroller) implementation(libs.androidx.activity.compose) implementation(libs.androidx.appcompat) implementation(libs.androidx.core.ktx) diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt index e107fd88c..7fe1bc674 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt @@ -19,7 +19,9 @@ package com.google.samples.apps.nowinandroid import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity +import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi @@ -31,13 +33,11 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.core.view.WindowCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.metrics.performance.JankStats import androidx.profileinstaller.ProfileVerifier -import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.google.samples.apps.nowinandroid.MainActivityUiState.Loading import com.google.samples.apps.nowinandroid.MainActivityUiState.Success import com.google.samples.apps.nowinandroid.core.analytics.AnalyticsHelper @@ -108,16 +108,28 @@ class MainActivity : ComponentActivity() { } // Turn off the decor fitting system windows, which allows us to handle insets, - // including IME animations - WindowCompat.setDecorFitsSystemWindows(window, false) + // including IME animations, and go edge-to-edge + // This also sets up the initial system bar style based on the platform theme + enableEdgeToEdge() setContent { - val systemUiController = rememberSystemUiController() val darkTheme = shouldUseDarkTheme(uiState) - // Update the dark content of the system bars to match the theme - DisposableEffect(systemUiController, darkTheme) { - systemUiController.systemBarsDarkContentEnabled = !darkTheme + // Update the edge to edge configuration to match the theme + // This is the same parameters as the default enableEdgeToEdge call, but we manually + // resolve whether or not to show dark theme using uiState, since it can be different + // than the configuration's dark theme value based on the user preference. + DisposableEffect(darkTheme) { + enableEdgeToEdge( + statusBarStyle = SystemBarStyle.auto( + android.graphics.Color.TRANSPARENT, + android.graphics.Color.TRANSPARENT, + ) { darkTheme }, + navigationBarStyle = SystemBarStyle.auto( + lightScrim, + darkScrim, + ) { darkTheme }, + ) onDispose {} } @@ -224,3 +236,15 @@ private fun shouldUseDarkTheme( DarkThemeConfig.DARK -> true } } + +/** + * The default light scrim, as defined by androidx and the platform: + * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt;l=35-38;drc=27e7d52e8604a080133e8b842db10c89b4482598 + */ +private val lightScrim = android.graphics.Color.argb(0xe6, 0xFF, 0xFF, 0xFF) + +/** + * The default dark scrim, as defined by androidx and the platform: + * https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:activity/activity/src/main/java/androidx/activity/EdgeToEdge.kt;l=40-44;drc=27e7d52e8604a080133e8b842db10c89b4482598 + */ +private val darkScrim = android.graphics.Color.argb(0x80, 0x1b, 0x1b, 0x1b) diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index b014ff647..2cf4177e6 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -16,10 +16,7 @@ --> - + - diff --git a/app/src/main/res/values-v27/themes.xml b/app/src/main/res/values-v27/themes.xml deleted file mode 100644 index 969e51914..000000000 --- a/app/src/main/res/values-v27/themes.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 82456f53a..7cdd25527 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -18,19 +18,10 @@ - - - - +