Skip to content

Commit a258794

Browse files
authored
Merge branch 'main' into introduce_screenshot_a11y_tests
2 parents 92c5d4b + e36b7ab commit a258794

File tree

34 files changed

+202
-104
lines changed

34 files changed

+202
-104
lines changed

.editorconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,13 @@
55
ij_kotlin_allow_trailing_comma=true
66
ij_kotlin_allow_trailing_comma_on_call_site=true
77
ktlint_function_naming_ignore_when_annotated_with=Composable, Test
8+
ktlint_standard_backing-property-naming = disabled
9+
ktlint_standard_binary-expression-wrapping = disabled
10+
ktlint_standard_chain-method-continuation = disabled
11+
ktlint_standard_class-signature = disabled
12+
ktlint_standard_condition-wrapping = disabled
13+
ktlint_standard_function-expression-body = disabled
14+
ktlint_standard_function-literal = disabled
15+
ktlint_standard_function-type-modifier-spacing = disabled
16+
ktlint_standard_multiline-loop = disabled
17+
ktlint_standard_function-signature = disabled

.github/workflows/Build.yaml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,9 @@ jobs:
9393
continue-on-error: false
9494
if: steps.screenshotsverify.outcome == 'failure' && github.event.pull_request.head.repo.full_name != github.repository
9595
run: |
96-
echo "::error::Screenshot tests failed, please create a PR in your fork first." && exit 1
96+
echo "::error::Screenshot tests failed, please create a PR in your fork first."
97+
echo "Your fork's CI will take screenshots for your fork."
98+
exit 1
9799
98100
# Runs if previous job failed
99101
- name: Generate new screenshots if verification failed and it's a PR
@@ -166,7 +168,7 @@ jobs:
166168
timeout-minutes: 55
167169
strategy:
168170
matrix:
169-
api-level: [26, 30]
171+
api-level: [26, 34]
170172

171173
steps:
172174
- name: Delete unnecessary tools 🔧
@@ -235,7 +237,7 @@ jobs:
235237
- name: Display local test coverage (only API 30)
236238
if: matrix.api-level == 30
237239
id: jacoco
238-
uses: madrapps/[email protected].0
240+
uses: madrapps/[email protected].1
239241
with:
240242
title: Combined test coverage report
241243
min-coverage-overall: 40

app/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,14 @@ dependencies {
123123
testDemoImplementation(libs.roborazzi)
124124
testDemoImplementation(projects.core.screenshotTesting)
125125

126-
androidTestImplementation(kotlin("test"))
127126
androidTestImplementation(projects.core.testing)
128127
androidTestImplementation(projects.core.dataTest)
129128
androidTestImplementation(projects.core.datastoreTest)
130129
androidTestImplementation(libs.androidx.test.espresso.core)
131130
androidTestImplementation(libs.androidx.navigation.testing)
132131
androidTestImplementation(libs.androidx.compose.ui.test)
133132
androidTestImplementation(libs.hilt.android.testing)
133+
androidTestImplementation(libs.kotlin.test)
134134

135135
baselineProfile(projects.benchmarks)
136136
}

app/dependencies/prodReleaseRuntimeClasspath.txt

Lines changed: 44 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -89,38 +89,38 @@ androidx.hilt:hilt-navigation:1.2.0
8989
androidx.hilt:hilt-work:1.2.0
9090
androidx.interpolator:interpolator:1.0.0
9191
androidx.legacy:legacy-support-core-utils:1.0.0
92-
androidx.lifecycle:lifecycle-common-java8:2.8.6
93-
androidx.lifecycle:lifecycle-common-jvm:2.8.6
94-
androidx.lifecycle:lifecycle-common:2.8.6
95-
androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.6
96-
androidx.lifecycle:lifecycle-livedata-core:2.8.6
97-
androidx.lifecycle:lifecycle-livedata:2.8.6
98-
androidx.lifecycle:lifecycle-process:2.8.6
99-
androidx.lifecycle:lifecycle-runtime-android:2.8.6
100-
androidx.lifecycle:lifecycle-runtime-compose-android:2.8.6
101-
androidx.lifecycle:lifecycle-runtime-compose:2.8.6
102-
androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.6
103-
androidx.lifecycle:lifecycle-runtime-ktx:2.8.6
104-
androidx.lifecycle:lifecycle-runtime:2.8.6
105-
androidx.lifecycle:lifecycle-service:2.8.6
106-
androidx.lifecycle:lifecycle-viewmodel-android:2.8.6
107-
androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.6
108-
androidx.lifecycle:lifecycle-viewmodel-compose:2.8.6
109-
androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6
110-
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.6
111-
androidx.lifecycle:lifecycle-viewmodel:2.8.6
92+
androidx.lifecycle:lifecycle-common-java8:2.8.7
93+
androidx.lifecycle:lifecycle-common-jvm:2.8.7
94+
androidx.lifecycle:lifecycle-common:2.8.7
95+
androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7
96+
androidx.lifecycle:lifecycle-livedata-core:2.8.7
97+
androidx.lifecycle:lifecycle-livedata:2.8.7
98+
androidx.lifecycle:lifecycle-process:2.8.7
99+
androidx.lifecycle:lifecycle-runtime-android:2.8.7
100+
androidx.lifecycle:lifecycle-runtime-compose-android:2.8.7
101+
androidx.lifecycle:lifecycle-runtime-compose:2.8.7
102+
androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7
103+
androidx.lifecycle:lifecycle-runtime-ktx:2.8.7
104+
androidx.lifecycle:lifecycle-runtime:2.8.7
105+
androidx.lifecycle:lifecycle-service:2.8.7
106+
androidx.lifecycle:lifecycle-viewmodel-android:2.8.7
107+
androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7
108+
androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7
109+
androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7
110+
androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7
111+
androidx.lifecycle:lifecycle-viewmodel:2.8.7
112112
androidx.loader:loader:1.0.0
113113
androidx.localbroadcastmanager:localbroadcastmanager:1.0.0
114114
androidx.metrics:metrics-performance:1.0.0-beta01
115-
androidx.navigation:navigation-common-ktx:2.8.0
116-
androidx.navigation:navigation-common:2.8.0
117-
androidx.navigation:navigation-compose:2.8.0
118-
androidx.navigation:navigation-runtime-ktx:2.8.0
119-
androidx.navigation:navigation-runtime:2.8.0
115+
androidx.navigation:navigation-common-ktx:2.8.4
116+
androidx.navigation:navigation-common:2.8.4
117+
androidx.navigation:navigation-compose:2.8.4
118+
androidx.navigation:navigation-runtime-ktx:2.8.4
119+
androidx.navigation:navigation-runtime:2.8.4
120120
androidx.print:print:1.0.0
121121
androidx.privacysandbox.ads:ads-adservices-java:1.0.0-beta05
122122
androidx.privacysandbox.ads:ads-adservices:1.0.0-beta05
123-
androidx.profileinstaller:profileinstaller:1.3.1
123+
androidx.profileinstaller:profileinstaller:1.4.1
124124
androidx.resourceinspection:resourceinspection-annotation:1.0.1
125125
androidx.room:room-common:2.6.1
126126
androidx.room:room-ktx:2.6.1
@@ -141,24 +141,24 @@ androidx.window.extensions.core:core:1.0.0
141141
androidx.window:window-core-android:1.3.0
142142
androidx.window:window-core:1.3.0
143143
androidx.window:window:1.3.0
144-
androidx.work:work-runtime-ktx:2.9.0
145-
androidx.work:work-runtime:2.9.0
144+
androidx.work:work-runtime-ktx:2.9.1
145+
androidx.work:work-runtime:2.9.1
146146
com.caverock:androidsvg-aar:1.4
147147
com.google.accompanist:accompanist-drawablepainter:0.32.0
148-
com.google.accompanist:accompanist-permissions:0.34.0
148+
com.google.accompanist:accompanist-permissions:0.36.0
149149
com.google.android.datatransport:transport-api:3.2.0
150150
com.google.android.datatransport:transport-backend-cct:3.3.0
151151
com.google.android.datatransport:transport-runtime:3.3.0
152152
com.google.android.gms:play-services-ads-identifier:18.0.0
153153
com.google.android.gms:play-services-base:18.5.0
154154
com.google.android.gms:play-services-basement:18.4.0
155155
com.google.android.gms:play-services-cloud-messaging:17.2.0
156-
com.google.android.gms:play-services-measurement-api:22.1.0
157-
com.google.android.gms:play-services-measurement-base:22.1.0
158-
com.google.android.gms:play-services-measurement-impl:22.1.0
159-
com.google.android.gms:play-services-measurement-sdk-api:22.1.0
160-
com.google.android.gms:play-services-measurement-sdk:22.1.0
161-
com.google.android.gms:play-services-measurement:22.1.0
156+
com.google.android.gms:play-services-measurement-api:22.1.2
157+
com.google.android.gms:play-services-measurement-base:22.1.2
158+
com.google.android.gms:play-services-measurement-impl:22.1.2
159+
com.google.android.gms:play-services-measurement-sdk-api:22.1.2
160+
com.google.android.gms:play-services-measurement-sdk:22.1.2
161+
com.google.android.gms:play-services-measurement:22.1.2
162162
com.google.android.gms:play-services-oss-licenses:17.1.0
163163
com.google.android.gms:play-services-stats:17.0.2
164164
com.google.android.gms:play-services-tasks:18.2.0
@@ -169,15 +169,15 @@ com.google.dagger:hilt-android:2.52
169169
com.google.dagger:hilt-core:2.52
170170
com.google.errorprone:error_prone_annotations:2.26.0
171171
com.google.firebase:firebase-abt:21.1.1
172-
com.google.firebase:firebase-analytics:22.1.0
172+
com.google.firebase:firebase-analytics:22.1.2
173173
com.google.firebase:firebase-annotations:16.2.0
174-
com.google.firebase:firebase-bom:33.3.0
174+
com.google.firebase:firebase-bom:33.7.0
175175
com.google.firebase:firebase-common-ktx:21.0.0
176176
com.google.firebase:firebase-common:21.0.0
177177
com.google.firebase:firebase-components:18.0.0
178178
com.google.firebase:firebase-config-interop:16.0.1
179-
com.google.firebase:firebase-config:22.0.0
180-
com.google.firebase:firebase-crashlytics:19.1.0
179+
com.google.firebase:firebase-config:22.0.1
180+
com.google.firebase:firebase-crashlytics:19.3.0
181181
com.google.firebase:firebase-datatransport:19.0.0
182182
com.google.firebase:firebase-encoders-json:18.0.1
183183
com.google.firebase:firebase-encoders-proto:16.0.0
@@ -186,16 +186,15 @@ com.google.firebase:firebase-iid-interop:17.1.0
186186
com.google.firebase:firebase-installations-interop:17.2.0
187187
com.google.firebase:firebase-installations:18.0.0
188188
com.google.firebase:firebase-measurement-connector:20.0.1
189-
com.google.firebase:firebase-messaging:24.0.1
190-
com.google.firebase:firebase-perf:21.0.1
191-
com.google.firebase:firebase-sessions:2.0.4
192-
com.google.firebase:protolite-well-known-types:18.0.0
189+
com.google.firebase:firebase-messaging:24.1.0
190+
com.google.firebase:firebase-perf:21.0.3
191+
com.google.firebase:firebase-sessions:2.0.7
193192
com.google.guava:failureaccess:1.0.1
194193
com.google.guava:guava:31.1-android
195194
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
196195
com.google.j2objc:j2objc-annotations:1.3
197-
com.google.protobuf:protobuf-javalite:4.26.1
198-
com.google.protobuf:protobuf-kotlin-lite:4.26.1
196+
com.google.protobuf:protobuf-javalite:4.28.2
197+
com.google.protobuf:protobuf-kotlin-lite:4.28.2
199198
com.squareup.okhttp3:logging-interceptor:4.12.0
200199
com.squareup.okhttp3:okhttp:4.12.0
201200
com.squareup.okio:okio-jvm:3.9.0

app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaApp.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import androidx.compose.material3.SnackbarHostState
3737
import androidx.compose.material3.SnackbarResult.ActionPerformed
3838
import androidx.compose.material3.Text
3939
import androidx.compose.material3.TopAppBarDefaults
40-
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
4140
import androidx.compose.material3.adaptive.WindowAdaptiveInfo
4241
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
4342
import androidx.compose.runtime.Composable
@@ -76,7 +75,6 @@ import com.google.samples.apps.nowinandroid.navigation.TopLevelDestination
7675
import kotlin.reflect.KClass
7776
import com.google.samples.apps.nowinandroid.feature.settings.R as settingsR
7877

79-
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
8078
@Composable
8179
fun NiaApp(
8280
appState: NiaAppState,
@@ -126,7 +124,6 @@ fun NiaApp(
126124
@OptIn(
127125
ExperimentalMaterial3Api::class,
128126
ExperimentalComposeUiApi::class,
129-
ExperimentalMaterial3AdaptiveApi::class,
130127
)
131128
internal fun NiaApp(
132129
appState: NiaAppState,

app/src/main/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppState.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@ package com.google.samples.apps.nowinandroid.ui
1818

1919
import androidx.compose.runtime.Composable
2020
import androidx.compose.runtime.Stable
21+
import androidx.compose.runtime.collectAsState
22+
import androidx.compose.runtime.mutableStateOf
2123
import androidx.compose.runtime.remember
2224
import androidx.compose.runtime.rememberCoroutineScope
2325
import androidx.navigation.NavController
2426
import androidx.navigation.NavDestination
2527
import androidx.navigation.NavDestination.Companion.hasRoute
2628
import androidx.navigation.NavGraph.Companion.findStartDestination
2729
import androidx.navigation.NavHostController
28-
import androidx.navigation.compose.currentBackStackEntryAsState
2930
import androidx.navigation.compose.rememberNavController
3031
import androidx.navigation.navOptions
3132
import androidx.tracing.trace
@@ -83,9 +84,21 @@ class NiaAppState(
8384
userNewsResourceRepository: UserNewsResourceRepository,
8485
timeZoneMonitor: TimeZoneMonitor,
8586
) {
87+
private val previousDestination = mutableStateOf<NavDestination?>(null)
88+
8689
val currentDestination: NavDestination?
87-
@Composable get() = navController
88-
.currentBackStackEntryAsState().value?.destination
90+
@Composable get() {
91+
// Collect the currentBackStackEntryFlow as a state
92+
val currentEntry = navController.currentBackStackEntryFlow
93+
.collectAsState(initial = null)
94+
95+
// Fallback to previousDestination if currentEntry is null
96+
return currentEntry.value?.destination.also { destination ->
97+
if (destination != null) {
98+
previousDestination.value = destination
99+
}
100+
} ?: previousDestination.value
101+
}
89102

90103
val currentTopLevelDestination: TopLevelDestination?
91104
@Composable get() {

app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/NiaAppScreenSizesScreenshotTests.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package com.google.samples.apps.nowinandroid.ui
1818

19-
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
2019
import androidx.compose.material3.adaptive.Posture
2120
import androidx.compose.material3.adaptive.WindowAdaptiveInfo
2221
import androidx.compose.runtime.CompositionLocalProvider
@@ -113,7 +112,6 @@ class NiaAppScreenSizesScreenshotTests {
113112
TimeZone.setDefault(TimeZone.getTimeZone("UTC"))
114113
}
115114

116-
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
117115
private fun testNiaAppScreenshotWithSize(width: Dp, height: Dp, screenshotName: String) {
118116
composeTestRule.setContent {
119117
CompositionLocalProvider(

app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/SnackbarInsetsScreenshotTests.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import androidx.compose.foundation.layout.windowInsetsStartWidth
3434
import androidx.compose.foundation.layout.windowInsetsTopHeight
3535
import androidx.compose.material3.SnackbarDuration.Indefinite
3636
import androidx.compose.material3.SnackbarHostState
37-
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
3837
import androidx.compose.material3.adaptive.Posture
3938
import androidx.compose.material3.adaptive.WindowAdaptiveInfo
4039
import androidx.compose.runtime.Composable
@@ -209,7 +208,6 @@ class SnackbarInsetsScreenshotTests {
209208
}
210209
}
211210

212-
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
213211
private fun testSnackbarScreenshotWithSize(
214212
snackbarHostState: SnackbarHostState,
215213
width: Dp,

app/src/testDemo/kotlin/com/google/samples/apps/nowinandroid/ui/SnackbarScreenshotTests.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package com.google.samples.apps.nowinandroid.ui
1919
import androidx.compose.foundation.layout.BoxWithConstraints
2020
import androidx.compose.material3.SnackbarDuration.Indefinite
2121
import androidx.compose.material3.SnackbarHostState
22-
import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
2322
import androidx.compose.material3.adaptive.Posture
2423
import androidx.compose.material3.adaptive.WindowAdaptiveInfo
2524
import androidx.compose.runtime.CompositionLocalProvider
@@ -182,7 +181,6 @@ class SnackbarScreenshotTests {
182181
}
183182
}
184183

185-
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
186184
private fun testSnackbarScreenshotWithSize(
187185
snackbarHostState: SnackbarHostState,
188186
width: Dp,

build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import org.gradle.api.Plugin
2121
import org.gradle.api.Project
2222
import org.gradle.kotlin.dsl.configure
2323
import org.gradle.kotlin.dsl.dependencies
24+
import org.gradle.kotlin.dsl.exclude
2425

2526
class AndroidApplicationFirebaseConventionPlugin : Plugin<Project> {
2627
override fun apply(target: Project) {
@@ -35,7 +36,16 @@ class AndroidApplicationFirebaseConventionPlugin : Plugin<Project> {
3536
val bom = libs.findLibrary("firebase-bom").get()
3637
add("implementation", platform(bom))
3738
"implementation"(libs.findLibrary("firebase.analytics").get())
38-
"implementation"(libs.findLibrary("firebase.performance").get())
39+
"implementation"(libs.findLibrary("firebase.performance").get()) {
40+
/*
41+
Exclusion of protobuf / protolite dependencies is necessary as the
42+
datastore-proto brings in protobuf dependencies. These are the source of truth
43+
for Now in Android.
44+
That's why the duplicate classes from below dependencies are excluded.
45+
*/
46+
exclude(group = "com.google.protobuf", module = "protobuf-javalite")
47+
exclude(group = "com.google.firebase", module = "protolite-well-known-types")
48+
}
3949
"implementation"(libs.findLibrary("firebase.crashlytics").get())
4050
}
4151

0 commit comments

Comments
 (0)