diff --git a/AGENT.md b/AGENT.md deleted file mode 100644 index efb39ef19..000000000 --- a/AGENT.md +++ /dev/null @@ -1,58 +0,0 @@ -# Now in Android Project - -Now in Android is a native Android mobile application written in Kotlin. It provides regular news -about Android development. Users can choose to follow topics, be notified when new content is -available, and bookmark items. - -## Architecture - -This project is a modern Android application that follows the official architecture guidance from Google. It is a reactive, single-activity app that uses the following: - -- **UI:** Built entirely with Jetpack Compose, including Material 3 components and adaptive layouts for different screen sizes. -- **State Management:** Unidirectional Data Flow (UDF) is implemented using Kotlin Coroutines and `Flow`s. `ViewModel`s act as state holders, exposing UI state as streams of data. -- **Dependency Injection:** Hilt is used for dependency injection throughout the app, simplifying the management of dependencies and improving testability. -- **Navigation:** Navigation is handled by Jetpack Navigation 2 for Compose, allowing for a declarative and type-safe way to navigate between screens. -- **Data:** The data layer is implemented using the repository pattern. - - **Local Data:** Room and DataStore are used for local data persistence. - - **Remote Data:** Retrofit and OkHttp are used for fetching data from the network. -- **Background Processing:** WorkManager is used for deferrable background tasks. - -## Modules - -The main Android app lives in the `app/` folder. Feature modules live in `feature/` and core and shared modules in `core/`. - -## Commands to Build & Test - -The app and Android libraries have two product flavors: `demo` and `prod`, and two build types: `debug` and `release`. - -- Build: `./gradlew assemble{Variant}`. Typically `assembleDemoDebug`. -- Fix linting/formatting: `./gradlew --init-script gradle/init.gradle.kts spotlessApply` -- Run local tests: `./gradlew {variant}Test` -- Run single test: `./gradlew {variant}Test --tests "com.example.myapp.MyTestClass"` -- Run local screenshot tests: `./gradlew verifyRoborazziDemoDebug` - -### Instrumented tests - -- Gradle-managed devices to run on device tests: `./gradlew pixel6api31aospDebugAndroidTest`. Also `pixel4api30aospatdDebugAndroidTest` and `pixelcapi30aospatdDebugAndroidTest`. - -### Creating tests - -#### Instrumented tests - -- Tests for UI features should only use `ComposeTestRule` with a `ComponentActivity`. -- Bigger tests live in the `:app` module and they can start activities like `MainActivity`. - -#### Local tests - -- [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) for most assertions -- [cashapp/turbine](https://github.com/cashapp/turbine) for complex coroutine tests -- [google/truth](https://github.com/google/truth) for assertions - -## Continuous integration - -- The workflows are defined in `.github/workflows/*.yaml` and they contain various checks. -- Screenshot tests are generated by CI, so they shouldn't be checked into the repo from a workstation. - -## Version control and code location - -- The project uses git and is hosted in https://github.com/android/nowinandroid. diff --git a/AGENT.md b/AGENT.md new file mode 120000 index 000000000..47dc3e3d8 --- /dev/null +++ b/AGENT.md @@ -0,0 +1 @@ +AGENTS.md \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..efb39ef19 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,58 @@ +# Now in Android Project + +Now in Android is a native Android mobile application written in Kotlin. It provides regular news +about Android development. Users can choose to follow topics, be notified when new content is +available, and bookmark items. + +## Architecture + +This project is a modern Android application that follows the official architecture guidance from Google. It is a reactive, single-activity app that uses the following: + +- **UI:** Built entirely with Jetpack Compose, including Material 3 components and adaptive layouts for different screen sizes. +- **State Management:** Unidirectional Data Flow (UDF) is implemented using Kotlin Coroutines and `Flow`s. `ViewModel`s act as state holders, exposing UI state as streams of data. +- **Dependency Injection:** Hilt is used for dependency injection throughout the app, simplifying the management of dependencies and improving testability. +- **Navigation:** Navigation is handled by Jetpack Navigation 2 for Compose, allowing for a declarative and type-safe way to navigate between screens. +- **Data:** The data layer is implemented using the repository pattern. + - **Local Data:** Room and DataStore are used for local data persistence. + - **Remote Data:** Retrofit and OkHttp are used for fetching data from the network. +- **Background Processing:** WorkManager is used for deferrable background tasks. + +## Modules + +The main Android app lives in the `app/` folder. Feature modules live in `feature/` and core and shared modules in `core/`. + +## Commands to Build & Test + +The app and Android libraries have two product flavors: `demo` and `prod`, and two build types: `debug` and `release`. + +- Build: `./gradlew assemble{Variant}`. Typically `assembleDemoDebug`. +- Fix linting/formatting: `./gradlew --init-script gradle/init.gradle.kts spotlessApply` +- Run local tests: `./gradlew {variant}Test` +- Run single test: `./gradlew {variant}Test --tests "com.example.myapp.MyTestClass"` +- Run local screenshot tests: `./gradlew verifyRoborazziDemoDebug` + +### Instrumented tests + +- Gradle-managed devices to run on device tests: `./gradlew pixel6api31aospDebugAndroidTest`. Also `pixel4api30aospatdDebugAndroidTest` and `pixelcapi30aospatdDebugAndroidTest`. + +### Creating tests + +#### Instrumented tests + +- Tests for UI features should only use `ComposeTestRule` with a `ComponentActivity`. +- Bigger tests live in the `:app` module and they can start activities like `MainActivity`. + +#### Local tests + +- [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines) for most assertions +- [cashapp/turbine](https://github.com/cashapp/turbine) for complex coroutine tests +- [google/truth](https://github.com/google/truth) for assertions + +## Continuous integration + +- The workflows are defined in `.github/workflows/*.yaml` and they contain various checks. +- Screenshot tests are generated by CI, so they shouldn't be checked into the repo from a workstation. + +## Version control and code location + +- The project uses git and is hosted in https://github.com/android/nowinandroid. diff --git a/app-nia-catalog/dependencies/releaseRuntimeClasspath.txt b/app-nia-catalog/dependencies/releaseRuntimeClasspath.txt index 587e4feba..bc48da7a7 100644 --- a/app-nia-catalog/dependencies/releaseRuntimeClasspath.txt +++ b/app-nia-catalog/dependencies/releaseRuntimeClasspath.txt @@ -1,7 +1,7 @@ androidx.activity:activity-compose:1.9.3 androidx.activity:activity-ktx:1.9.3 androidx.activity:activity:1.9.3 -androidx.annotation:annotation-experimental:1.4.1 +androidx.annotation:annotation-experimental:1.5.1 androidx.annotation:annotation-jvm:1.9.1 androidx.annotation:annotation:1.9.1 androidx.appcompat:appcompat-resources:1.6.1 @@ -9,53 +9,58 @@ androidx.arch.core:core-common:2.2.0 androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 androidx.browser:browser:1.8.0 -androidx.collection:collection-jvm:1.5.0-beta03 -androidx.collection:collection-ktx:1.5.0-beta03 -androidx.collection:collection:1.5.0-beta03 -androidx.compose.animation:animation-android:1.8.0-beta02 -androidx.compose.animation:animation-core-android:1.8.0-beta02 -androidx.compose.animation:animation-core:1.8.0-beta02 -androidx.compose.animation:animation:1.8.0-beta02 -androidx.compose.foundation:foundation-android:1.8.0-beta02 -androidx.compose.foundation:foundation-layout-android:1.8.0-beta02 -androidx.compose.foundation:foundation-layout:1.8.0-beta02 -androidx.compose.foundation:foundation:1.8.0-beta02 -androidx.compose.material3.adaptive:adaptive-android:1.1.0-rc01 -androidx.compose.material3.adaptive:adaptive:1.1.0-rc01 -androidx.compose.material3:material3-adaptive-navigation-suite-android:1.4.0-alpha08 -androidx.compose.material3:material3-adaptive-navigation-suite:1.4.0-alpha08 -androidx.compose.material3:material3-android:1.4.0-alpha08 -androidx.compose.material3:material3:1.4.0-alpha08 +androidx.collection:collection-jvm:1.5.0 +androidx.collection:collection-ktx:1.5.0 +androidx.collection:collection:1.5.0 +androidx.compose.animation:animation-android:1.10.0-alpha02 +androidx.compose.animation:animation-core-android:1.10.0-alpha02 +androidx.compose.animation:animation-core:1.10.0-alpha02 +androidx.compose.animation:animation:1.10.0-alpha02 +androidx.compose.foundation:foundation-android:1.10.0-alpha02 +androidx.compose.foundation:foundation-layout-android:1.10.0-alpha02 +androidx.compose.foundation:foundation-layout:1.10.0-alpha02 +androidx.compose.foundation:foundation:1.10.0-alpha02 +androidx.compose.material3.adaptive:adaptive-android:1.2.0-beta01 +androidx.compose.material3.adaptive:adaptive:1.2.0-beta01 +androidx.compose.material3:material3-adaptive-navigation-suite-android:1.5.0-alpha03 +androidx.compose.material3:material3-adaptive-navigation-suite:1.5.0-alpha03 +androidx.compose.material3:material3-android:1.5.0-alpha03 +androidx.compose.material3:material3:1.5.0-alpha03 androidx.compose.material:material-icons-core-android:1.7.8 androidx.compose.material:material-icons-core:1.7.8 androidx.compose.material:material-icons-extended-android:1.7.8 androidx.compose.material:material-icons-extended:1.7.8 -androidx.compose.material:material-ripple-android:1.8.0-beta02 -androidx.compose.material:material-ripple:1.8.0-beta02 -androidx.compose.runtime:runtime-android:1.8.0-beta02 -androidx.compose.runtime:runtime-saveable-android:1.8.0-beta02 -androidx.compose.runtime:runtime-saveable:1.8.0-beta02 -androidx.compose.runtime:runtime:1.8.0-beta02 -androidx.compose.ui:ui-android:1.8.0-beta02 -androidx.compose.ui:ui-geometry-android:1.8.0-beta02 -androidx.compose.ui:ui-geometry:1.8.0-beta02 -androidx.compose.ui:ui-graphics-android:1.8.0-beta02 -androidx.compose.ui:ui-graphics:1.8.0-beta02 -androidx.compose.ui:ui-text-android:1.8.0-beta02 -androidx.compose.ui:ui-text:1.8.0-beta02 -androidx.compose.ui:ui-tooling-preview-android:1.8.0-beta02 -androidx.compose.ui:ui-tooling-preview:1.8.0-beta02 -androidx.compose.ui:ui-unit-android:1.8.0-beta02 -androidx.compose.ui:ui-unit:1.8.0-beta02 -androidx.compose.ui:ui-util-android:1.8.0-beta02 -androidx.compose.ui:ui-util:1.8.0-beta02 -androidx.compose.ui:ui:1.8.0-beta02 -androidx.compose:compose-bom-alpha:2025.02.00 +androidx.compose.material:material-ripple-android:1.10.0-alpha02 +androidx.compose.material:material-ripple:1.10.0-alpha02 +androidx.compose.runtime:runtime-android:1.10.0-alpha02 +androidx.compose.runtime:runtime-annotation-android:1.10.0-alpha02 +androidx.compose.runtime:runtime-annotation:1.10.0-alpha02 +androidx.compose.runtime:runtime-saveable-android:1.10.0-alpha02 +androidx.compose.runtime:runtime-saveable:1.10.0-alpha02 +androidx.compose.runtime:runtime:1.10.0-alpha02 +androidx.compose.ui:ui-android:1.10.0-alpha02 +androidx.compose.ui:ui-geometry-android:1.10.0-alpha02 +androidx.compose.ui:ui-geometry:1.10.0-alpha02 +androidx.compose.ui:ui-graphics-android:1.10.0-alpha02 +androidx.compose.ui:ui-graphics:1.10.0-alpha02 +androidx.compose.ui:ui-text-android:1.10.0-alpha02 +androidx.compose.ui:ui-text:1.10.0-alpha02 +androidx.compose.ui:ui-tooling-preview-android:1.10.0-alpha02 +androidx.compose.ui:ui-tooling-preview:1.10.0-alpha02 +androidx.compose.ui:ui-unit-android:1.10.0-alpha02 +androidx.compose.ui:ui-unit:1.10.0-alpha02 +androidx.compose.ui:ui-util-android:1.10.0-alpha02 +androidx.compose.ui:ui-util:1.10.0-alpha02 +androidx.compose.ui:ui:1.10.0-alpha02 +androidx.compose:compose-bom-alpha:2025.08.01 androidx.concurrent:concurrent-futures:1.1.0 -androidx.core:core-ktx:1.13.1 -androidx.core:core:1.13.1 +androidx.core:core-ktx:1.16.0 +androidx.core:core-viewtree:1.0.0 +androidx.core:core:1.16.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.0.0 +androidx.documentfile:documentfile:1.0.0 +androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2:1.4.0 androidx.exifinterface:exifinterface:1.3.7 androidx.fragment:fragment:1.5.1 @@ -63,39 +68,46 @@ androidx.graphics:graphics-path:1.0.1 androidx.graphics:graphics-shapes-android:1.0.1 androidx.graphics:graphics-shapes:1.0.1 androidx.interpolator:interpolator:1.0.0 -androidx.lifecycle:lifecycle-common-java8:2.8.7 -androidx.lifecycle:lifecycle-common-jvm:2.8.7 -androidx.lifecycle:lifecycle-common:2.8.7 -androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 -androidx.lifecycle:lifecycle-livedata-core:2.8.7 -androidx.lifecycle:lifecycle-livedata:2.8.7 -androidx.lifecycle:lifecycle-process:2.8.7 -androidx.lifecycle:lifecycle-runtime-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-compose-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-compose:2.8.7 -androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 -androidx.lifecycle:lifecycle-runtime:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-android:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 -androidx.lifecycle:lifecycle-viewmodel:2.8.7 +androidx.legacy:legacy-support-core-utils:1.0.0 +androidx.lifecycle:lifecycle-common-java8:2.10.0-alpha03 +androidx.lifecycle:lifecycle-common-jvm:2.10.0-alpha03 +androidx.lifecycle:lifecycle-common:2.10.0-alpha03 +androidx.lifecycle:lifecycle-livedata-core-ktx:2.10.0-alpha03 +androidx.lifecycle:lifecycle-livedata-core:2.10.0-alpha03 +androidx.lifecycle:lifecycle-livedata:2.10.0-alpha03 +androidx.lifecycle:lifecycle-process:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime-compose-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime-compose:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime-ktx-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime-ktx:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel-ktx:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel-savedstate-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel:2.10.0-alpha03 androidx.loader:loader:1.0.0 +androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 +androidx.print:print:1.0.0 androidx.profileinstaller:profileinstaller:1.4.0 -androidx.savedstate:savedstate-ktx:1.2.1 -androidx.savedstate:savedstate:1.2.1 +androidx.savedstate:savedstate-android:1.4.0-alpha03 +androidx.savedstate:savedstate-compose-android:1.4.0-alpha03 +androidx.savedstate:savedstate-compose:1.4.0-alpha03 +androidx.savedstate:savedstate-ktx:1.4.0-alpha03 +androidx.savedstate:savedstate:1.4.0-alpha03 androidx.startup:startup-runtime:1.1.1 androidx.tracing:tracing-ktx:1.3.0-alpha02 androidx.tracing:tracing:1.3.0-alpha02 +androidx.transition:transition:1.6.0 androidx.vectordrawable:vectordrawable-animated:1.1.0 androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager:viewpager:1.0.0 -androidx.window.extensions.core:core:1.0.0 -androidx.window:window-core-android:1.3.0 -androidx.window:window-core:1.3.0 -androidx.window:window:1.3.0 +androidx.window:window-core-android:1.4.0 +androidx.window:window-core:1.4.0 +androidx.window:window:1.4.0 com.google.accompanist:accompanist-drawablepainter:0.32.0 com.google.code.findbugs:jsr305:3.0.2 com.google.dagger:dagger-lint-aar:2.56 @@ -122,5 +134,8 @@ org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.1 org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1 org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.6.1 org.jetbrains.kotlinx:kotlinx-datetime:0.6.1 +org.jetbrains.kotlinx:kotlinx-serialization-bom:1.7.3 +org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.7.3 +org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3 org.jetbrains:annotations:23.0.0 org.jspecify:jspecify:1.0.0 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fe3e2ec49..5b32add3e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -22,7 +22,7 @@ plugins { alias(libs.plugins.nowinandroid.android.application.jacoco) alias(libs.plugins.nowinandroid.android.application.firebase) alias(libs.plugins.nowinandroid.hilt) - id("com.google.android.gms.oss-licenses-plugin") + alias(libs.plugins.google.osslicenses) alias(libs.plugins.baselineprofile) alias(libs.plugins.roborazzi) alias(libs.plugins.kotlin.serialization) diff --git a/app/dependencies/prodReleaseRuntimeClasspath.txt b/app/dependencies/prodReleaseRuntimeClasspath.txt index 8457feb9f..7c112c7fe 100644 --- a/app/dependencies/prodReleaseRuntimeClasspath.txt +++ b/app/dependencies/prodReleaseRuntimeClasspath.txt @@ -1,7 +1,7 @@ -androidx.activity:activity-compose:1.9.3 -androidx.activity:activity-ktx:1.9.3 -androidx.activity:activity:1.9.3 -androidx.annotation:annotation-experimental:1.4.1 +androidx.activity:activity-compose:1.10.1 +androidx.activity:activity-ktx:1.10.1 +androidx.activity:activity:1.10.1 +androidx.annotation:annotation-experimental:1.5.1 androidx.annotation:annotation-jvm:1.9.1 androidx.annotation:annotation:1.9.1 androidx.appcompat:appcompat-resources:1.7.0 @@ -10,60 +10,63 @@ androidx.arch.core:core-common:2.2.0 androidx.arch.core:core-runtime:2.2.0 androidx.autofill:autofill:1.0.0 androidx.browser:browser:1.8.0 -androidx.collection:collection-jvm:1.5.0-beta03 -androidx.collection:collection-ktx:1.5.0-beta03 -androidx.collection:collection:1.5.0-beta03 -androidx.compose.animation:animation-android:1.8.0-beta02 -androidx.compose.animation:animation-core-android:1.8.0-beta02 -androidx.compose.animation:animation-core:1.8.0-beta02 -androidx.compose.animation:animation:1.8.0-beta02 -androidx.compose.foundation:foundation-android:1.8.0-beta02 -androidx.compose.foundation:foundation-layout-android:1.8.0-beta02 -androidx.compose.foundation:foundation-layout:1.8.0-beta02 -androidx.compose.foundation:foundation:1.8.0-beta02 -androidx.compose.material3.adaptive:adaptive-android:1.1.0-rc01 -androidx.compose.material3.adaptive:adaptive-layout-android:1.1.0-rc01 -androidx.compose.material3.adaptive:adaptive-layout:1.1.0-rc01 -androidx.compose.material3.adaptive:adaptive-navigation-android:1.1.0-rc01 -androidx.compose.material3.adaptive:adaptive-navigation:1.1.0-rc01 -androidx.compose.material3.adaptive:adaptive:1.1.0-rc01 -androidx.compose.material3:material3-adaptive-navigation-suite-android:1.4.0-alpha08 -androidx.compose.material3:material3-adaptive-navigation-suite:1.4.0-alpha08 -androidx.compose.material3:material3-android:1.4.0-alpha08 -androidx.compose.material3:material3-window-size-class-android:1.4.0-alpha08 -androidx.compose.material3:material3-window-size-class:1.4.0-alpha08 -androidx.compose.material3:material3:1.4.0-alpha08 +androidx.collection:collection-jvm:1.5.0 +androidx.collection:collection-ktx:1.5.0 +androidx.collection:collection:1.5.0 +androidx.compose.animation:animation-android:1.10.0-alpha02 +androidx.compose.animation:animation-core-android:1.10.0-alpha02 +androidx.compose.animation:animation-core:1.10.0-alpha02 +androidx.compose.animation:animation:1.10.0-alpha02 +androidx.compose.foundation:foundation-android:1.10.0-alpha02 +androidx.compose.foundation:foundation-layout-android:1.10.0-alpha02 +androidx.compose.foundation:foundation-layout:1.10.0-alpha02 +androidx.compose.foundation:foundation:1.10.0-alpha02 +androidx.compose.material3.adaptive:adaptive-android:1.2.0-beta01 +androidx.compose.material3.adaptive:adaptive-layout-android:1.2.0-beta01 +androidx.compose.material3.adaptive:adaptive-layout:1.2.0-beta01 +androidx.compose.material3.adaptive:adaptive-navigation-android:1.2.0-beta01 +androidx.compose.material3.adaptive:adaptive-navigation:1.2.0-beta01 +androidx.compose.material3.adaptive:adaptive:1.2.0-beta01 +androidx.compose.material3:material3-adaptive-navigation-suite-android:1.5.0-alpha03 +androidx.compose.material3:material3-adaptive-navigation-suite:1.5.0-alpha03 +androidx.compose.material3:material3-android:1.5.0-alpha03 +androidx.compose.material3:material3-window-size-class-android:1.5.0-alpha03 +androidx.compose.material3:material3-window-size-class:1.5.0-alpha03 +androidx.compose.material3:material3:1.5.0-alpha03 androidx.compose.material:material-icons-core-android:1.7.8 androidx.compose.material:material-icons-core:1.7.8 androidx.compose.material:material-icons-extended-android:1.7.8 androidx.compose.material:material-icons-extended:1.7.8 -androidx.compose.material:material-ripple-android:1.8.0-beta02 -androidx.compose.material:material-ripple:1.8.0-beta02 -androidx.compose.runtime:runtime-android:1.8.0-beta02 -androidx.compose.runtime:runtime-saveable-android:1.8.0-beta02 -androidx.compose.runtime:runtime-saveable:1.8.0-beta02 -androidx.compose.runtime:runtime-tracing:1.8.0-beta02 -androidx.compose.runtime:runtime:1.8.0-beta02 -androidx.compose.ui:ui-android:1.8.0-beta02 -androidx.compose.ui:ui-geometry-android:1.8.0-beta02 -androidx.compose.ui:ui-geometry:1.8.0-beta02 -androidx.compose.ui:ui-graphics-android:1.8.0-beta02 -androidx.compose.ui:ui-graphics:1.8.0-beta02 -androidx.compose.ui:ui-text-android:1.8.0-beta02 -androidx.compose.ui:ui-text:1.8.0-beta02 -androidx.compose.ui:ui-tooling-preview-android:1.8.0-beta02 -androidx.compose.ui:ui-tooling-preview:1.8.0-beta02 -androidx.compose.ui:ui-unit-android:1.8.0-beta02 -androidx.compose.ui:ui-unit:1.8.0-beta02 -androidx.compose.ui:ui-util-android:1.8.0-beta02 -androidx.compose.ui:ui-util:1.8.0-beta02 -androidx.compose.ui:ui:1.8.0-beta02 -androidx.compose:compose-bom-alpha:2025.02.00 +androidx.compose.material:material-ripple-android:1.10.0-alpha02 +androidx.compose.material:material-ripple:1.10.0-alpha02 +androidx.compose.runtime:runtime-android:1.10.0-alpha02 +androidx.compose.runtime:runtime-annotation-android:1.10.0-alpha02 +androidx.compose.runtime:runtime-annotation:1.10.0-alpha02 +androidx.compose.runtime:runtime-saveable-android:1.10.0-alpha02 +androidx.compose.runtime:runtime-saveable:1.10.0-alpha02 +androidx.compose.runtime:runtime-tracing:1.10.0-alpha02 +androidx.compose.runtime:runtime:1.10.0-alpha02 +androidx.compose.ui:ui-android:1.10.0-alpha02 +androidx.compose.ui:ui-geometry-android:1.10.0-alpha02 +androidx.compose.ui:ui-geometry:1.10.0-alpha02 +androidx.compose.ui:ui-graphics-android:1.10.0-alpha02 +androidx.compose.ui:ui-graphics:1.10.0-alpha02 +androidx.compose.ui:ui-text-android:1.10.0-alpha02 +androidx.compose.ui:ui-text:1.10.0-alpha02 +androidx.compose.ui:ui-tooling-preview-android:1.10.0-alpha02 +androidx.compose.ui:ui-tooling-preview:1.10.0-alpha02 +androidx.compose.ui:ui-unit-android:1.10.0-alpha02 +androidx.compose.ui:ui-unit:1.10.0-alpha02 +androidx.compose.ui:ui-util-android:1.10.0-alpha02 +androidx.compose.ui:ui-util:1.10.0-alpha02 +androidx.compose.ui:ui:1.10.0-alpha02 +androidx.compose:compose-bom-alpha:2025.08.01 androidx.concurrent:concurrent-futures-ktx:1.1.0 androidx.concurrent:concurrent-futures:1.1.0 -androidx.core:core-ktx:1.15.0 +androidx.core:core-ktx:1.16.0 androidx.core:core-splashscreen:1.0.1 -androidx.core:core:1.15.0 +androidx.core:core-viewtree:1.0.0 +androidx.core:core:1.16.0 androidx.cursoradapter:cursoradapter:1.0.0 androidx.customview:customview-poolingcontainer:1.0.0 androidx.customview:customview:1.0.0 @@ -79,6 +82,7 @@ androidx.datastore:datastore-preferences:1.1.1 androidx.datastore:datastore:1.1.1 androidx.documentfile:documentfile:1.0.0 androidx.drawerlayout:drawerlayout:1.0.0 +androidx.dynamicanimation:dynamicanimation:1.0.0 androidx.emoji2:emoji2-views-helper:1.4.0 androidx.emoji2:emoji2:1.4.0 androidx.exifinterface:exifinterface:1.3.7 @@ -92,26 +96,27 @@ androidx.hilt:hilt-navigation:1.2.0 androidx.hilt:hilt-work:1.2.0 androidx.interpolator:interpolator:1.0.0 androidx.legacy:legacy-support-core-utils:1.0.0 -androidx.lifecycle:lifecycle-common-java8:2.8.7 -androidx.lifecycle:lifecycle-common-jvm:2.8.7 -androidx.lifecycle:lifecycle-common:2.8.7 -androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.7 -androidx.lifecycle:lifecycle-livedata-core:2.8.7 -androidx.lifecycle:lifecycle-livedata:2.8.7 -androidx.lifecycle:lifecycle-process:2.8.7 -androidx.lifecycle:lifecycle-runtime-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-compose-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-compose:2.8.7 -androidx.lifecycle:lifecycle-runtime-ktx-android:2.8.7 -androidx.lifecycle:lifecycle-runtime-ktx:2.8.7 -androidx.lifecycle:lifecycle-runtime:2.8.7 -androidx.lifecycle:lifecycle-service:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-android:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-compose-android:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7 -androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.7 -androidx.lifecycle:lifecycle-viewmodel:2.8.7 +androidx.lifecycle:lifecycle-common-java8:2.10.0-alpha03 +androidx.lifecycle:lifecycle-common-jvm:2.10.0-alpha03 +androidx.lifecycle:lifecycle-common:2.10.0-alpha03 +androidx.lifecycle:lifecycle-livedata-core-ktx:2.10.0-alpha03 +androidx.lifecycle:lifecycle-livedata-core:2.10.0-alpha03 +androidx.lifecycle:lifecycle-livedata:2.10.0-alpha03 +androidx.lifecycle:lifecycle-process:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime-compose-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime-compose:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime-ktx-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime-ktx:2.10.0-alpha03 +androidx.lifecycle:lifecycle-runtime:2.10.0-alpha03 +androidx.lifecycle:lifecycle-service:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel-compose-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel-compose:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel-ktx:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel-savedstate-android:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.10.0-alpha03 +androidx.lifecycle:lifecycle-viewmodel:2.10.0-alpha03 androidx.loader:loader:1.0.0 androidx.localbroadcastmanager:localbroadcastmanager:1.0.0 androidx.metrics:metrics-performance:1.0.0-beta01 @@ -130,8 +135,11 @@ androidx.room:room-common:2.7.2 androidx.room:room-ktx:2.7.2 androidx.room:room-runtime-android:2.7.2 androidx.room:room-runtime:2.7.2 -androidx.savedstate:savedstate-ktx:1.2.1 -androidx.savedstate:savedstate:1.2.1 +androidx.savedstate:savedstate-android:1.4.0-alpha03 +androidx.savedstate:savedstate-compose-android:1.4.0-alpha03 +androidx.savedstate:savedstate-compose:1.4.0-alpha03 +androidx.savedstate:savedstate-ktx:1.4.0-alpha03 +androidx.savedstate:savedstate:1.4.0-alpha03 androidx.sqlite:sqlite-android:2.5.1 androidx.sqlite:sqlite-framework-android:2.5.1 androidx.sqlite:sqlite-framework:2.5.1 @@ -140,14 +148,14 @@ androidx.startup:startup-runtime:1.1.1 androidx.tracing:tracing-ktx:1.3.0-alpha02 androidx.tracing:tracing-perfetto:1.0.0 androidx.tracing:tracing:1.3.0-alpha02 +androidx.transition:transition:1.6.0 androidx.vectordrawable:vectordrawable-animated:1.1.0 androidx.vectordrawable:vectordrawable:1.1.0 androidx.versionedparcelable:versionedparcelable:1.1.1 androidx.viewpager:viewpager:1.0.0 -androidx.window.extensions.core:core:1.0.0 -androidx.window:window-core-android:1.3.0 -androidx.window:window-core:1.3.0 -androidx.window:window:1.3.0 +androidx.window:window-core-android:1.4.0 +androidx.window:window-core:1.4.0 +androidx.window:window:1.4.0 androidx.work:work-runtime-ktx:2.10.0 androidx.work:work-runtime:2.10.0 com.caverock:androidsvg-aar:1.4 diff --git a/app/prodRelease-badging.txt b/app/prodRelease-badging.txt index ca03c1088..640949857 100644 --- a/app/prodRelease-badging.txt +++ b/app/prodRelease-badging.txt @@ -1,5 +1,5 @@ package: name='com.google.samples.apps.nowinandroid' versionCode='8' versionName='0.1.2' platformBuildVersionName='15' platformBuildVersionCode='35' compileSdkVersion='35' compileSdkVersionCodename='15' -minSdkVersion:'21' +minSdkVersion:'23' targetSdkVersion:'35' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.ACCESS_NETWORK_STATE' @@ -105,9 +105,9 @@ application-icon-640:'res/mipmap-anydpi-v26/ic_launcher.xml' application-icon-65534:'res/mipmap-anydpi-v26/ic_launcher.xml' application: label='Now in Android' icon='res/mipmap-anydpi-v26/ic_launcher.xml' launchable-activity: name='com.google.samples.apps.nowinandroid.MainActivity' label='' icon='' -uses-library-not-required:'android.ext.adservices' uses-library-not-required:'androidx.window.extensions' uses-library-not-required:'androidx.window.sidecar' +uses-library-not-required:'android.ext.adservices' feature-group: label='' uses-feature: name='android.hardware.faketouch' uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' diff --git a/benchmarks/build.gradle.kts b/benchmarks/build.gradle.kts index e36f021b0..258993913 100644 --- a/benchmarks/build.gradle.kts +++ b/benchmarks/build.gradle.kts @@ -45,8 +45,8 @@ android { ) } - testOptions.managedDevices.devices { - create("pixel6Api33") { + testOptions.managedDevices.localDevices { + create("pixel6Api33") { device = "Pixel 6" apiLevel = 33 systemImageSource = "aosp" diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 6d0237010..958ae82f5 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -37,7 +37,7 @@ kotlin { } dependencies { - compileOnly(libs.android.gradlePlugin) + compileOnly(libs.android.gradleApiPlugin) compileOnly(libs.android.tools.common) compileOnly(libs.compose.gradlePlugin) compileOnly(libs.firebase.crashlytics.gradlePlugin) diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt index 9cddabaf6..4fa7a7afa 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt @@ -16,7 +16,6 @@ import com.android.build.api.dsl.ApplicationExtension import com.android.build.api.variant.ApplicationAndroidComponentsExtension -import com.android.build.gradle.BaseExtension import com.google.samples.apps.nowinandroid.configureBadgingTasks import com.google.samples.apps.nowinandroid.configureGradleManagedDevices import com.google.samples.apps.nowinandroid.configureGraphTasks @@ -45,7 +44,7 @@ class AndroidApplicationConventionPlugin : Plugin { } extensions.configure { configurePrintApksTask(this) - configureBadgingTasks(extensions.getByType(), this) + configureBadgingTasks(extensions.getByType(), this) } configureGraphTasks() } diff --git a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt index 1af5523c5..343bd4859 100644 --- a/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidFeatureConventionPlugin.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -import com.android.build.gradle.LibraryExtension +import com.android.build.api.dsl.LibraryExtension import com.google.samples.apps.nowinandroid.configureGradleManagedDevices import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt index 19fabf549..63a992b05 100644 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -import com.android.build.gradle.LibraryExtension +import com.android.build.api.dsl.LibraryExtension import com.google.samples.apps.nowinandroid.configureAndroidCompose import org.gradle.api.Plugin import org.gradle.api.Project diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt index 7524678bc..c4f464101 100644 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt @@ -14,8 +14,8 @@ * limitations under the License. */ +import com.android.build.api.dsl.LibraryExtension import com.android.build.api.variant.LibraryAndroidComponentsExtension -import com.android.build.gradle.LibraryExtension import com.google.samples.apps.nowinandroid.configureFlavors import com.google.samples.apps.nowinandroid.configureGradleManagedDevices import com.google.samples.apps.nowinandroid.configureGraphTasks @@ -38,7 +38,8 @@ class AndroidLibraryConventionPlugin : Plugin { extensions.configure { configureKotlinAndroid(this) - defaultConfig.targetSdk = 35 + testOptions.targetSdk = 35 + lint.targetSdk = 35 defaultConfig.testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testOptions.animationsDisabled = true configureFlavors(this) diff --git a/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt index 933327b2d..9221cbf08 100644 --- a/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidTestConventionPlugin.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -import com.android.build.gradle.TestExtension +import com.android.build.api.dsl.TestExtension import com.google.samples.apps.nowinandroid.configureGradleManagedDevices import com.google.samples.apps.nowinandroid.configureGraphTasks import com.google.samples.apps.nowinandroid.configureKotlinAndroid diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Badging.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Badging.kt index 886c70625..229388001 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Badging.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Badging.kt @@ -18,8 +18,8 @@ package com.google.samples.apps.nowinandroid import com.android.SdkConstants import com.android.build.api.artifact.SingleArtifact +import com.android.build.api.dsl.ApplicationExtension import com.android.build.api.variant.ApplicationAndroidComponentsExtension -import com.android.build.gradle.BaseExtension import com.google.common.truth.Truth.assertWithMessage import org.gradle.api.DefaultTask import org.gradle.api.Project @@ -110,7 +110,7 @@ private fun String.capitalized() = replaceFirstChar { } fun Project.configureBadgingTasks( - baseExtension: BaseExtension, + baseExtension: ApplicationExtension, componentsExtension: ApplicationAndroidComponentsExtension, ) { // Registers a callback to be called, when a new variant is configured diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt index 5d396d2a4..2ac96e556 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt @@ -38,7 +38,7 @@ internal fun Project.configureKotlinAndroid( compileSdk = 35 defaultConfig { - minSdk = 21 + minSdk = 23 } compileOptions { diff --git a/build.gradle.kts b/build.gradle.kts index c61794f1f..0981b8920 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,28 +14,6 @@ * limitations under the License. */ -buildscript { - repositories { - google { - content { - includeGroupByRegex("com\\.android.*") - includeGroupByRegex("com\\.google.*") - includeGroupByRegex("androidx.*") - } - } - mavenCentral() - - // This is used only for internal Google builds. - maven { url = uri("../nowinandroid-prebuilts/m2repository") } - } - dependencies { - classpath(libs.google.oss.licenses.plugin) { - exclude(group = "com.google.protobuf") - } - } - -} - /* * By listing all the plugins used throughout all subprojects in the root project build script, it * ensures that the build script classpath remains the same for all projects. This avoids potential @@ -58,6 +36,6 @@ plugins { alias(libs.plugins.hilt) apply false alias(libs.plugins.ksp) apply false alias(libs.plugins.roborazzi) apply false - alias(libs.plugins.secrets) apply false + alias(libs.plugins.google.osslicenses) apply false alias(libs.plugins.room) apply false } diff --git a/core/designsystem/src/test/screenshots/Navigation/Navigation_fontScale2.png b/core/designsystem/src/test/screenshots/Navigation/Navigation_fontScale2.png index b2dff990a..16df296d5 100644 Binary files a/core/designsystem/src/test/screenshots/Navigation/Navigation_fontScale2.png and b/core/designsystem/src/test/screenshots/Navigation/Navigation_fontScale2.png differ diff --git a/core/network/build.gradle.kts b/core/network/build.gradle.kts index 1a902d5d6..edc28ea23 100644 --- a/core/network/build.gradle.kts +++ b/core/network/build.gradle.kts @@ -53,15 +53,12 @@ val backendUrl = providers.fileContents( ).asText.map { text -> val properties = Properties() properties.load(StringReader(text)) - if (properties.containsKey("BACKEND_URL")) - (properties["BACKEND_URL"] as String) - else "http://example.com" - // Move to returning `properties["BACKEND_URL"] as String?` after upgrading to Gradle 9.0.0 + properties["BACKEND_URL"] }.orElse("http://example.com") androidComponents { onVariants { - it.buildConfigFields.put("BACKEND_URL", backendUrl.map { value -> + it.buildConfigFields!!.put("BACKEND_URL", backendUrl.map { value -> BuildConfigField(type = "String", value = """"$value"""", comment = null) }) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b5cd7df15..6f75a2aca 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,12 +2,12 @@ accompanist = "0.37.0" androidDesugarJdkLibs = "2.1.4" # AGP and tools should be updated together -androidGradlePlugin = "8.9.0" -androidTools = "31.9.0" +androidGradlePlugin = "8.12.2" +androidTools = "31.12.2" androidxActivity = "1.9.3" androidxAppCompat = "1.7.0" androidxBrowser = "1.8.0" -androidxComposeBom = "2025.02.00" +androidxComposeBom = "2025.08.01" androidxComposeFoundation = "1.8.0-alpha07" androidxComposeMaterial3Adaptive = "1.1.0-rc01" androidxComposeRuntimeTracing = "1.7.6" @@ -37,7 +37,7 @@ firebaseCrashlyticsPlugin = "3.0.6" firebasePerfPlugin = "2.0.1" gmsPlugin = "4.4.2" googleOss = "17.1.0" -googleOssPlugin = "0.10.7" +googleOssPlugin = "0.10.8" hilt = "2.56" hiltExt = "1.2.0" jacoco = "0.8.12" @@ -55,7 +55,6 @@ retrofitKotlinxSerializationJson = "1.0.0" robolectric = "4.14.1" roborazzi = "1.39.0" room = "2.7.2" -secrets = "2.0.1" truth = "1.4.4" turbine = "1.2.0" @@ -118,7 +117,6 @@ firebase-cloud-messaging = { group = "com.google.firebase", name = "firebase-mes firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics" } firebase-performance = { group = "com.google.firebase", name = "firebase-perf" } google-oss-licenses = { group = "com.google.android.gms", name = "play-services-oss-licenses", version.ref = "googleOss" } -google-oss-licenses-plugin = { group = "com.google.android.gms", name = "oss-licenses-plugin", version.ref = "googleOssPlugin" } hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" } hilt-android-testing = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" } hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" } @@ -152,7 +150,7 @@ truth = { group = "com.google.truth", name = "truth", version.ref = "truth" } turbine = { group = "app.cash.turbine", name = "turbine", version.ref = "turbine" } # Dependencies of the included build-logic -android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" } +android-gradleApiPlugin = { group = "com.android.tools.build", name = "gradle-api", version.ref = "androidGradlePlugin" } android-tools-common = { group = "com.android.tools", name = "common", version.ref = "androidTools" } compose-gradlePlugin = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" } firebase-crashlytics-gradlePlugin = { group = "com.google.firebase", name = "firebase-crashlytics-gradle", version.ref = "firebaseCrashlyticsPlugin" } @@ -176,10 +174,10 @@ hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +google-osslicenses = { id = "com.google.android.gms.oss-licenses-plugin", version.ref = "googleOssPlugin" } protobuf = { id = "com.google.protobuf", version.ref = "protobufPlugin" } roborazzi = { id = "io.github.takahirom.roborazzi", version.ref = "roborazzi" } room = { id = "androidx.room", version.ref = "room" } -secrets = { id = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin", version.ref = "secrets" } # Plugins defined by this project nowinandroid-android-application = { id = "nowinandroid.android.application" }