From fdc246c8ce5a832714131a25e0b047a1d6f54a34 Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Mon, 12 Jan 2026 10:16:51 +0100 Subject: [PATCH 01/16] Streamline R8 performance optimization configuration Foo --- app/build.gradle.kts | 4 ++-- app/proguard-rules.pro | 21 ------------------- samples/gemini-chatbot/build.gradle.kts | 10 --------- samples/gemini-chatbot/consumer-rules.pro | 0 samples/gemini-chatbot/proguard-rules.pro | 21 ------------------- samples/gemini-image-chat/build.gradle.kts | 10 --------- samples/gemini-image-chat/consumer-rules.pro | 0 samples/gemini-image-chat/proguard-rules.pro | 21 ------------------- samples/gemini-live-todo/build.gradle.kts | 11 +--------- samples/gemini-live-todo/consumer-rules.pro | 0 samples/gemini-live-todo/proguard-rules.pro | 21 ------------------- samples/gemini-multimodal/build.gradle.kts | 10 --------- samples/gemini-multimodal/consumer-rules.pro | 0 samples/gemini-multimodal/proguard-rules.pro | 21 ------------------- .../build.gradle.kts | 9 -------- .../proguard-rules.pro | 21 ------------------- .../build.gradle.kts | 9 -------- .../proguard-rules.pro | 21 ------------------- .../genai-image-description/build.gradle.kts | 10 --------- .../consumer-rules.pro | 0 .../proguard-rules.pro | 21 ------------------- samples/genai-summarization/build.gradle.kts | 10 --------- .../genai-summarization/consumer-rules.pro | 0 .../genai-summarization/proguard-rules.pro | 21 ------------------- .../genai-writing-assistance/build.gradle.kts | 10 --------- .../consumer-rules.pro | 0 .../proguard-rules.pro | 21 ------------------- samples/imagen-editing/build.gradle.kts | 11 ---------- samples/imagen-editing/consumer-rules.pro | 0 samples/imagen-editing/proguard-rules.pro | 21 ------------------- samples/imagen/build.gradle.kts | 11 ---------- samples/imagen/consumer-rules.pro | 0 samples/imagen/proguard-rules.pro | 21 ------------------- samples/magic-selfie/build.gradle.kts | 10 --------- ui-component/build.gradle.kts | 10 --------- 35 files changed, 3 insertions(+), 384 deletions(-) delete mode 100644 app/proguard-rules.pro delete mode 100644 samples/gemini-chatbot/consumer-rules.pro delete mode 100644 samples/gemini-chatbot/proguard-rules.pro delete mode 100644 samples/gemini-image-chat/consumer-rules.pro delete mode 100644 samples/gemini-image-chat/proguard-rules.pro delete mode 100644 samples/gemini-live-todo/consumer-rules.pro delete mode 100644 samples/gemini-live-todo/proguard-rules.pro delete mode 100644 samples/gemini-multimodal/consumer-rules.pro delete mode 100644 samples/gemini-multimodal/proguard-rules.pro delete mode 100644 samples/gemini-video-metadata-creation/proguard-rules.pro delete mode 100644 samples/gemini-video-summarization/proguard-rules.pro delete mode 100644 samples/genai-image-description/consumer-rules.pro delete mode 100644 samples/genai-image-description/proguard-rules.pro delete mode 100644 samples/genai-summarization/consumer-rules.pro delete mode 100644 samples/genai-summarization/proguard-rules.pro delete mode 100644 samples/genai-writing-assistance/consumer-rules.pro delete mode 100644 samples/genai-writing-assistance/proguard-rules.pro delete mode 100644 samples/imagen-editing/consumer-rules.pro delete mode 100644 samples/imagen-editing/proguard-rules.pro delete mode 100644 samples/imagen/consumer-rules.pro delete mode 100644 samples/imagen/proguard-rules.pro diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cb0cef6c..38f12876 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -42,10 +42,10 @@ android { buildTypes { release { - isMinifyEnabled = false + isMinifyEnabled = true + isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", ) } } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/gemini-chatbot/build.gradle.kts b/samples/gemini-chatbot/build.gradle.kts index 517f68c0..3f9f357d 100644 --- a/samples/gemini-chatbot/build.gradle.kts +++ b/samples/gemini-chatbot/build.gradle.kts @@ -33,18 +33,8 @@ android { minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } - } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/samples/gemini-chatbot/consumer-rules.pro b/samples/gemini-chatbot/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/samples/gemini-chatbot/proguard-rules.pro b/samples/gemini-chatbot/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/gemini-chatbot/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/gemini-image-chat/build.gradle.kts b/samples/gemini-image-chat/build.gradle.kts index dec2ae64..6b447c36 100644 --- a/samples/gemini-image-chat/build.gradle.kts +++ b/samples/gemini-image-chat/build.gradle.kts @@ -33,18 +33,8 @@ android { minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } - } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/samples/gemini-image-chat/consumer-rules.pro b/samples/gemini-image-chat/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/samples/gemini-image-chat/proguard-rules.pro b/samples/gemini-image-chat/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/gemini-image-chat/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/gemini-live-todo/build.gradle.kts b/samples/gemini-live-todo/build.gradle.kts index 2eef9bf4..39967e79 100644 --- a/samples/gemini-live-todo/build.gradle.kts +++ b/samples/gemini-live-todo/build.gradle.kts @@ -28,18 +28,9 @@ android { minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } } + compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/samples/gemini-live-todo/consumer-rules.pro b/samples/gemini-live-todo/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/samples/gemini-live-todo/proguard-rules.pro b/samples/gemini-live-todo/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/gemini-live-todo/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/gemini-multimodal/build.gradle.kts b/samples/gemini-multimodal/build.gradle.kts index f59af216..6aba9b5b 100644 --- a/samples/gemini-multimodal/build.gradle.kts +++ b/samples/gemini-multimodal/build.gradle.kts @@ -33,18 +33,8 @@ android { minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } - } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/samples/gemini-multimodal/consumer-rules.pro b/samples/gemini-multimodal/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/samples/gemini-multimodal/proguard-rules.pro b/samples/gemini-multimodal/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/gemini-multimodal/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/gemini-video-metadata-creation/build.gradle.kts b/samples/gemini-video-metadata-creation/build.gradle.kts index 5f25e744..29192f45 100644 --- a/samples/gemini-video-metadata-creation/build.gradle.kts +++ b/samples/gemini-video-metadata-creation/build.gradle.kts @@ -31,15 +31,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } - } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/samples/gemini-video-metadata-creation/proguard-rules.pro b/samples/gemini-video-metadata-creation/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/gemini-video-metadata-creation/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/gemini-video-summarization/build.gradle.kts b/samples/gemini-video-summarization/build.gradle.kts index 8cd50c2f..62d53278 100644 --- a/samples/gemini-video-summarization/build.gradle.kts +++ b/samples/gemini-video-summarization/build.gradle.kts @@ -30,15 +30,6 @@ android { testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } - } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/samples/gemini-video-summarization/proguard-rules.pro b/samples/gemini-video-summarization/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/gemini-video-summarization/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/genai-image-description/build.gradle.kts b/samples/genai-image-description/build.gradle.kts index 246f9daa..0c8ee45c 100644 --- a/samples/genai-image-description/build.gradle.kts +++ b/samples/genai-image-description/build.gradle.kts @@ -33,18 +33,8 @@ android { minSdk = 26 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } - } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/samples/genai-image-description/consumer-rules.pro b/samples/genai-image-description/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/samples/genai-image-description/proguard-rules.pro b/samples/genai-image-description/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/genai-image-description/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/genai-summarization/build.gradle.kts b/samples/genai-summarization/build.gradle.kts index 22d965c2..6dcf98cb 100644 --- a/samples/genai-summarization/build.gradle.kts +++ b/samples/genai-summarization/build.gradle.kts @@ -33,18 +33,8 @@ android { minSdk = 26 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } - } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/samples/genai-summarization/consumer-rules.pro b/samples/genai-summarization/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/samples/genai-summarization/proguard-rules.pro b/samples/genai-summarization/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/genai-summarization/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/genai-writing-assistance/build.gradle.kts b/samples/genai-writing-assistance/build.gradle.kts index aae39550..5a740c44 100644 --- a/samples/genai-writing-assistance/build.gradle.kts +++ b/samples/genai-writing-assistance/build.gradle.kts @@ -33,18 +33,8 @@ android { minSdk = 26 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } - } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/samples/genai-writing-assistance/consumer-rules.pro b/samples/genai-writing-assistance/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/samples/genai-writing-assistance/proguard-rules.pro b/samples/genai-writing-assistance/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/genai-writing-assistance/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/imagen-editing/build.gradle.kts b/samples/imagen-editing/build.gradle.kts index bf26d7b5..121f6ede 100644 --- a/samples/imagen-editing/build.gradle.kts +++ b/samples/imagen-editing/build.gradle.kts @@ -31,17 +31,6 @@ android { defaultConfig { minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } } compileOptions { diff --git a/samples/imagen-editing/consumer-rules.pro b/samples/imagen-editing/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/samples/imagen-editing/proguard-rules.pro b/samples/imagen-editing/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/imagen-editing/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/imagen/build.gradle.kts b/samples/imagen/build.gradle.kts index b2ac122a..93e44e35 100644 --- a/samples/imagen/build.gradle.kts +++ b/samples/imagen/build.gradle.kts @@ -32,17 +32,6 @@ android { minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } } compileOptions { diff --git a/samples/imagen/consumer-rules.pro b/samples/imagen/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/samples/imagen/proguard-rules.pro b/samples/imagen/proguard-rules.pro deleted file mode 100644 index 481bb434..00000000 --- a/samples/imagen/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/samples/magic-selfie/build.gradle.kts b/samples/magic-selfie/build.gradle.kts index 0b5cd2d6..0f3e118f 100644 --- a/samples/magic-selfie/build.gradle.kts +++ b/samples/magic-selfie/build.gradle.kts @@ -32,18 +32,8 @@ android { minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } - } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/ui-component/build.gradle.kts b/ui-component/build.gradle.kts index f4f78fd6..d52ba870 100644 --- a/ui-component/build.gradle.kts +++ b/ui-component/build.gradle.kts @@ -31,18 +31,8 @@ android { minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") } - buildTypes { - release { - isMinifyEnabled = false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - } - } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 From e4d85296ee1f296acbe1646c9a49656b3372822f Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Mon, 12 Jan 2026 10:17:17 +0100 Subject: [PATCH 02/16] Expand spotless * Sort dependencies --- app/build.gradle.kts | 51 ++++---- build.gradle.kts | 7 +- gradle/libs.versions.toml | 122 +++++++++--------- gradle/wrapper/gradle-wrapper.properties | 2 +- samples/gemini-chatbot/build.gradle.kts | 23 ++-- samples/gemini-image-chat/build.gradle.kts | 25 ++-- samples/gemini-live-todo/build.gradle.kts | 26 ++-- .../ai/samples/geminilivetodo/data/Todo.kt | 1 - .../geminilivetodo/data/TodoRepository.kt | 2 +- .../geminilivetodo/ui/TodoScreenViewModel.kt | 5 +- samples/gemini-multimodal/build.gradle.kts | 27 ++-- .../build.gradle.kts | 41 +++--- .../build.gradle.kts | 34 +++-- .../genai-image-description/build.gradle.kts | 21 ++- samples/genai-summarization/build.gradle.kts | 17 ++- .../genai-writing-assistance/build.gradle.kts | 16 +-- samples/imagen-editing/build.gradle.kts | 17 ++- samples/imagen/build.gradle.kts | 21 ++- samples/magic-selfie/build.gradle.kts | 24 ++-- ui-component/build.gradle.kts | 14 +- 20 files changed, 234 insertions(+), 262 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 38f12876..ab33b1ae 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,12 +15,12 @@ */ plugins { alias(libs.plugins.android.application) - alias(libs.plugins.jetbrains.kotlin.android) - alias(libs.plugins.jetbrains.kotlin.serialization) + alias(libs.plugins.compose.compiler) alias(libs.plugins.google.gms.google.services) alias(libs.plugins.hilt.plugin) + alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.jetbrains.kotlin.serialization) alias(libs.plugins.ksp) - alias(libs.plugins.compose.compiler) } android { @@ -62,43 +62,40 @@ android { } dependencies { - + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.ui.test.junit4) + androidTestImplementation(platform(libs.androidx.compose.bom)) + debugImplementation(libs.androidx.ui.test.manifest) + debugImplementation(libs.androidx.ui.tooling) + implementation(libs.androidx.activity.compose) implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) - implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.ui) - implementation(libs.androidx.ui.graphics) - implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) implementation(libs.androidx.navigation.compose) - implementation(libs.kotlinx.serialization.json) implementation(libs.androidx.navigation.runtime.ktx) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.firebase.ai) implementation(libs.hilt.android) implementation(libs.hilt.navigation.compose) + implementation(libs.kotlinx.serialization.json) + implementation(platform(libs.androidx.compose.bom)) implementation(platform(libs.firebase.bom)) - implementation(libs.firebase.ai) - ksp(libs.hilt.compiler) - - implementation(project(":ui-component")) - implementation(project(":samples:gemini-multimodal")) implementation(project(":samples:gemini-chatbot")) - implementation(project(":samples:genai-summarization")) + implementation(project(":samples:gemini-image-chat")) + implementation(project(":samples:gemini-live-todo")) + implementation(project(":samples:gemini-multimodal")) + implementation(project(":samples:gemini-video-metadata-creation")) + implementation(project(":samples:gemini-video-summarization")) implementation(project(":samples:genai-image-description")) + implementation(project(":samples:genai-summarization")) implementation(project(":samples:genai-writing-assistance")) implementation(project(":samples:imagen")) implementation(project(":samples:imagen-editing")) implementation(project(":samples:magic-selfie")) - implementation(project(":samples:gemini-video-summarization")) - implementation(project(":samples:gemini-live-todo")) - implementation(project(":samples:gemini-video-metadata-creation")) - implementation(project(":samples:gemini-image-chat")) - + implementation(project(":ui-component")) + ksp(libs.hilt.compiler) testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(libs.androidx.ui.test.junit4) - debugImplementation(libs.androidx.ui.tooling) - debugImplementation(libs.androidx.ui.test.manifest) } diff --git a/build.gradle.kts b/build.gradle.kts index dd6161b7..90ce1932 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -43,5 +43,10 @@ subprojects { // Look for the first line that doesn't have a block comment (assumed to be the license) licenseHeaderFile(rootProject.file("spotless/copyright.kt"), "(^(?![\\/ ]\\*).*$)") } + format("toml") { + target("gradle/libs.versions.toml") + prettier(mapOf("prettier" to "3.2.5", "prettier-plugin-toml" to "2.0.1")) + .config(mapOf("plugins" to listOf("prettier-plugin-toml"))) + } } -} \ No newline at end of file +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 19f57495..a0db7851 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,97 +1,97 @@ [versions] -agp = "8.8.2" +activityCompose = "1.10.1" +agp = "8.13.2" +appcompat = "1.7.0" coilCompose = "3.1.0" -firebaseBom = "34.5.0" -lifecycleRuntimeCompose = "2.9.1" -mlkitGenAi = "1.0.0-beta1" -kotlin = "2.1.0" +composeBom = "2025.06.01" coreKtx = "1.15.0" +espressoCore = "3.6.1" +exifinterface = "1.4.1" +firebaseBom = "34.5.0" +firebaseCommonKtx = "21.0.0" +googleGmsGoogleServices = "4.4.2" +hilt = "2.56.2" +hiltNavigationCompose = "1.2.0" junit = "4.13.2" junitVersion = "1.2.1" -espressoCore = "3.6.1" +kotlin = "2.1.0" kotlinxCoroutinesGuava = "1.10.2" kotlinxSerializationJson = "1.6.2" +ksp = "2.1.0-1.0.29" +lifecycleRuntimeCompose = "2.9.1" lifecycleRuntimeKtx = "2.8.7" -activityCompose = "1.10.1" -composeBom = "2025.06.01" +lifecycleViewmodelAndroid = "2.8.7" +material3 = "1.5.0-alpha01" +material3WindowSizeClass = "1.3.2" +media3 = "1.8.0" +mlkitGenAi = "1.0.0-beta1" +mlkitSegmentation = "16.0.0-beta1" navigationCompose = "2.9.0" navigationRuntimeKtx = "2.9.0" -appcompat = "1.7.0" -googleGmsGoogleServices = "4.4.2" -hilt = "2.56.2" -hiltNavigationCompose = "1.2.0" -ksp = "2.1.0-1.0.29" -mlkitSegmentation = "16.0.0-beta1" +richtext = "1.0.0-alpha02" runtimeLivedata = "1.7.6" -media3 = "1.8.0" -firebaseCommonKtx = "21.0.0" -uiToolingPreviewAndroid = "1.8.1" spotless = "7.0.4" -uiToolingPreview = "1.8.3" -uiTooling = "1.8.3" -lifecycleViewmodelAndroid = "2.8.7" -material3 = "1.5.0-alpha01" uiTextGoogleFonts = "1.8.1" -exifinterface = "1.4.1" -material3WindowSizeClass = "1.3.2" -richtext = "1.0.0-alpha02" +uiTooling = "1.8.3" +uiToolingPreview = "1.8.3" +uiToolingPreviewAndroid = "1.8.1" [libraries] +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } +androidx-exifinterface = { group = "androidx.exifinterface", name = "exifinterface", version.ref = "exifinterface" } +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "lifecycleRuntimeCompose" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } +androidx-lifecycle-viewmodel-android = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-android", version.ref = "lifecycleViewmodelAndroid" } +androidx-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" } +androidx-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3" } +androidx-material3-window = { group = "androidx.compose.material3", name = "material3-window-size-class", version.ref = "material3WindowSizeClass" } +androidx-media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3" } +androidx-media3-transformer = { module = "androidx.media3:media3-transformer", version.ref = "media3" } +androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "media3" } +androidx-media3-ui-compose = { module = "androidx.media3:media3-ui-compose", version.ref = "media3"} +androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } +androidx-navigation-runtime-ktx = { group = "androidx.navigation", name = "navigation-runtime-ktx", version.ref = "navigationRuntimeKtx" } +androidx-runtime-livedata = { group = "androidx.compose.runtime", name = "runtime-livedata", version.ref = "runtimeLivedata" } +androidx-ui = { group = "androidx.compose.ui", name = "ui" } +androidx-ui-google-fonts = { group = "androidx.compose.ui", name = "ui-text-google-fonts", version.ref = "uiTextGoogleFonts" } +androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } +androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +androidx-ui-tooling-preview-android = { group = "androidx.compose.ui", name = "ui-tooling-preview-android", version.ref = "uiToolingPreviewAndroid" } coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coilCompose" } -firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" } firebase-ai = { group = "com.google.firebase", name = "firebase-ai" } +firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" } firebase-common-ktx = { group = "com.google.firebase", name = "firebase-common-ktx", version.ref = "firebaseCommonKtx" } genai-image-description = { module = "com.google.mlkit:genai-image-description", version.ref = "mlkitGenAi" } genai-proofreading = { module = "com.google.mlkit:genai-proofreading", version.ref = "mlkitGenAi" } genai-rewrite = { module = "com.google.mlkit:genai-rewriting", version.ref = "mlkitGenAi" } genai-summarization = { module = "com.google.mlkit:genai-summarization", version.ref = "mlkitGenAi" } -junit = { group = "junit", name = "junit", version.ref = "junit" } -androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } -androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } -androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } -androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } -androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } -androidx-ui = { group = "androidx.compose.ui", name = "ui" } -androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } -androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } -androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } -androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } -androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } -androidx-ui-google-fonts = { group = "androidx.compose.ui", name = "ui-text-google-fonts", version.ref = "uiTextGoogleFonts" } -androidx-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3" } -androidx-material3-window = { group = "androidx.compose.material3", name = "material3-window-size-class", version.ref = "material3WindowSizeClass" } -richtext-material3 = { group = "com.halilibo.compose-richtext", name = "richtext-ui-material3", version.ref = "richtext" } -richtext-commonmark = { group = "com.halilibo.compose-richtext", name = "richtext-commonmark", version.ref = "richtext" } -androidx-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" } -androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } -androidx-navigation-runtime-ktx = { group = "androidx.navigation", name = "navigation-runtime-ktx", version.ref = "navigationRuntimeKtx" } -kotlinx-coroutines-guava = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-guava", version.ref = "kotlinxCoroutinesGuava" } -kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } -androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt"} hilt-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt"} hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltNavigationCompose" } -androidx-runtime-livedata = { group = "androidx.compose.runtime", name = "runtime-livedata", version.ref = "runtimeLivedata" } -androidx-media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3" } -androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "media3" } -androidx-media3-ui-compose = { module = "androidx.media3:media3-ui-compose", version.ref = "media3"} -androidx-media3-transformer = { module = "androidx.media3:media3-transformer", version.ref = "media3" } -androidx-ui-tooling-preview-android = { group = "androidx.compose.ui", name = "ui-tooling-preview-android", version.ref = "uiToolingPreviewAndroid" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +kotlinx-coroutines-guava = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-guava", version.ref = "kotlinxCoroutinesGuava" } +kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } mlkit-segmentation = { module = "com.google.android.gms:play-services-mlkit-subject-segmentation", version.ref = "mlkitSegmentation" } -ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "uiToolingPreview" } +richtext-commonmark = { group = "com.halilibo.compose-richtext", name = "richtext-commonmark", version.ref = "richtext" } +richtext-material3 = { group = "com.halilibo.compose-richtext", name = "richtext-ui-material3", version.ref = "richtext" } ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "uiTooling" } -androidx-lifecycle-viewmodel-android = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-android", version.ref = "lifecycleViewmodelAndroid" } -androidx-exifinterface = { group = "androidx.exifinterface", name = "exifinterface", version.ref = "exifinterface" } +ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "uiToolingPreview" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } -jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } -jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } android-library = { id = "com.android.library", version.ref = "agp" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } google-gms-google-services = { id = "com.google.gms.google-services", version.ref = "googleGmsGoogleServices" } hilt-plugin = { id = "com.google.dagger.hilt.android", version.ref = "hilt"} +jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } -compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } -spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } \ No newline at end of file +spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cea7a793..d4081da4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/samples/gemini-chatbot/build.gradle.kts b/samples/gemini-chatbot/build.gradle.kts index 3f9f357d..0f820fdf 100644 --- a/samples/gemini-chatbot/build.gradle.kts +++ b/samples/gemini-chatbot/build.gradle.kts @@ -16,9 +16,9 @@ plugins { alias(libs.plugins.android.library) + alias(libs.plugins.compose.compiler) alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.ksp) - alias(libs.plugins.compose.compiler) } android { @@ -45,25 +45,22 @@ android { } dependencies { - - implementation(libs.androidx.core.ktx) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) + debugImplementation(libs.ui.tooling) implementation(libs.androidx.appcompat) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.material.icons.extended) implementation(libs.androidx.material3) - implementation(platform(libs.firebase.bom)) + implementation(libs.androidx.runtime.livedata) implementation(libs.firebase.ai) implementation(libs.hilt.android) implementation(libs.hilt.navigation.compose) - implementation(libs.androidx.runtime.livedata) - implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.ui.tooling.preview) - debugImplementation(libs.ui.tooling) - ksp(libs.hilt.compiler) - + implementation(platform(libs.androidx.compose.bom)) + implementation(platform(libs.firebase.bom)) implementation(project(":ui-component")) - + ksp(libs.hilt.compiler) testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) } diff --git a/samples/gemini-image-chat/build.gradle.kts b/samples/gemini-image-chat/build.gradle.kts index 6b447c36..52fdb6bd 100644 --- a/samples/gemini-image-chat/build.gradle.kts +++ b/samples/gemini-image-chat/build.gradle.kts @@ -16,9 +16,9 @@ plugins { alias(libs.plugins.android.library) + alias(libs.plugins.compose.compiler) alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.ksp) - alias(libs.plugins.compose.compiler) } android { @@ -45,25 +45,22 @@ android { } dependencies { - - implementation(libs.androidx.core.ktx) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) implementation(libs.androidx.appcompat) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.exifinterface) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.material.icons.extended) - implementation(platform(libs.firebase.bom)) + implementation(libs.androidx.material3) + implementation(libs.coil.compose) implementation(libs.firebase.ai) implementation(libs.hilt.android) implementation(libs.hilt.navigation.compose) - implementation(libs.androidx.lifecycle.runtime.compose) - implementation(libs.androidx.material3) - implementation(libs.coil.compose) - implementation(libs.androidx.exifinterface) - ksp(libs.hilt.compiler) implementation(libs.ui.tooling.preview) - + implementation(platform(libs.androidx.compose.bom)) + implementation(platform(libs.firebase.bom)) implementation(project(":ui-component")) - + ksp(libs.hilt.compiler) testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) } diff --git a/samples/gemini-live-todo/build.gradle.kts b/samples/gemini-live-todo/build.gradle.kts index 39967e79..17bcf715 100644 --- a/samples/gemini-live-todo/build.gradle.kts +++ b/samples/gemini-live-todo/build.gradle.kts @@ -15,9 +15,9 @@ */ plugins { alias(libs.plugins.android.library) + alias(libs.plugins.compose.compiler) alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.ksp) - alias(libs.plugins.compose.compiler) } android { @@ -28,7 +28,6 @@ android { minSdk = 24 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } compileOptions { @@ -41,23 +40,22 @@ android { } dependencies { - - implementation(libs.androidx.core.ktx) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) + implementation(libs.androidx.activity.compose) implementation(libs.androidx.appcompat) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.material.icons.extended) - implementation(platform(libs.firebase.bom)) - implementation(libs.firebase.ai) + implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.viewmodel.android) + implementation(libs.androidx.material.icons.extended) implementation(libs.androidx.material3) + implementation(libs.firebase.ai) implementation(libs.hilt.android) - implementation(libs.ui.tooling.preview) - ksp(libs.hilt.compiler) - implementation(project(":ui-component")) implementation(libs.hilt.navigation.compose) - implementation(libs.androidx.activity.compose) implementation(libs.kotlinx.serialization.json) + implementation(libs.ui.tooling.preview) + implementation(platform(libs.androidx.compose.bom)) + implementation(platform(libs.firebase.bom)) + implementation(project(":ui-component")) + ksp(libs.hilt.compiler) testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) } diff --git a/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/data/Todo.kt b/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/data/Todo.kt index 953ec7fc..755d72d5 100644 --- a/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/data/Todo.kt +++ b/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/data/Todo.kt @@ -17,7 +17,6 @@ package com.android.ai.samples.geminilivetodo.data import kotlin.random.Random - data class Todo( val id: Int = Random.nextInt(), val task: String, diff --git a/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/data/TodoRepository.kt b/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/data/TodoRepository.kt index 8729e1b6..160e9441 100644 --- a/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/data/TodoRepository.kt +++ b/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/data/TodoRepository.kt @@ -41,7 +41,7 @@ class TodoRepository @Inject constructor() { fun getTodoList(): List = _todos.value - fun addTodo(taskDescription: String) : Int? { + fun addTodo(taskDescription: String): Int? { if (taskDescription.isNotBlank()) { val newTodo = Todo(task = taskDescription) _todos.update { currentList -> diff --git a/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt b/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt index 05dbd7ab..0fb1ddb1 100644 --- a/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt +++ b/samples/gemini-live-todo/src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt @@ -52,7 +52,6 @@ import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.int import kotlinx.serialization.json.jsonPrimitive -import kotlinx.serialization.json.long @OptIn(PublicPreviewAPI::class) @HiltViewModel @@ -198,7 +197,7 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe val taskDescription = functionCall.args["taskDescription"]!!.jsonPrimitive.content val id = todoRepository.addTodo(taskDescription) - if (id!=null) { + if (id != null) { val response = JsonObject( mapOf( "success" to JsonPrimitive(true), @@ -215,7 +214,6 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe ) FunctionResponsePart(functionCall.name, response, functionCall.id) } - } "removeTodo" -> { try { @@ -237,7 +235,6 @@ class TodoScreenViewModel @Inject constructor(private val todoRepository: TodoRe ) FunctionResponsePart(functionCall.name, response, functionCall.id) } - } "toggleTodoStatus" -> { val taskId = functionCall.args["todoId"]!!.jsonPrimitive.int diff --git a/samples/gemini-multimodal/build.gradle.kts b/samples/gemini-multimodal/build.gradle.kts index 6aba9b5b..97bfe2c8 100644 --- a/samples/gemini-multimodal/build.gradle.kts +++ b/samples/gemini-multimodal/build.gradle.kts @@ -48,26 +48,25 @@ android { } dependencies { - - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.appcompat) - implementation(libs.androidx.material3) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core.ktx) implementation(libs.androidx.material.icons.extended) implementation(libs.androidx.material.icons.extended) - implementation(platform(libs.firebase.bom)) + implementation(libs.androidx.material3) + implementation(libs.androidx.material3.window) + implementation(libs.androidx.runtime.livedata) + implementation(libs.androidx.runtime.livedata) + implementation(libs.coil.compose) implementation(libs.firebase.ai) implementation(libs.hilt.android) implementation(libs.hilt.navigation.compose) - implementation(libs.coil.compose) - implementation(libs.androidx.runtime.livedata) - implementation(libs.androidx.runtime.livedata) - implementation(libs.androidx.material3.window) - debugImplementation(libs.ui.tooling) - ksp(libs.hilt.compiler) + implementation(libs.ui.tooling) + implementation(platform(libs.androidx.compose.bom)) + implementation(platform(libs.firebase.bom)) implementation(project(":ui-component")) + ksp(libs.hilt.compiler) testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) } diff --git a/samples/gemini-video-metadata-creation/build.gradle.kts b/samples/gemini-video-metadata-creation/build.gradle.kts index 29192f45..3a66bda2 100644 --- a/samples/gemini-video-metadata-creation/build.gradle.kts +++ b/samples/gemini-video-metadata-creation/build.gradle.kts @@ -44,33 +44,30 @@ android { } dependencies { - implementation(project(":ui-component")) - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.appcompat) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.ui.test.junit4) + androidTestImplementation(platform(libs.androidx.compose.bom)) + debugImplementation(libs.androidx.ui.tooling) implementation(libs.androidx.activity.compose) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.material.icons.extended) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.hilt.android) - implementation(libs.hilt.navigation.compose) implementation(libs.androidx.material3) - implementation(libs.firebase.common.ktx) - implementation(libs.androidx.lifecycle.runtime.compose) - implementation(libs.androidx.ui.tooling.preview.android) - ksp(libs.hilt.compiler) - implementation(platform(libs.firebase.bom)) - implementation(libs.firebase.ai) - implementation(libs.kotlinx.serialization.json) - debugImplementation(libs.androidx.ui.tooling) - - // Media3 ExoPlayer implementation(libs.androidx.media3.exoplayer) - implementation(libs.androidx.media3.ui) implementation(libs.androidx.media3.transformer) + implementation(libs.androidx.media3.ui) implementation(libs.androidx.media3.ui.compose) + implementation(libs.androidx.ui.tooling.preview.android) + implementation(libs.firebase.ai) + implementation(libs.firebase.common.ktx) + implementation(libs.hilt.android) + implementation(libs.hilt.navigation.compose) implementation(libs.kotlinx.coroutines.guava) - - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(libs.androidx.ui.test.junit4) + implementation(libs.kotlinx.serialization.json) + implementation(platform(libs.androidx.compose.bom)) + implementation(platform(libs.firebase.bom)) + implementation(project(":ui-component")) + ksp(libs.hilt.compiler) } diff --git a/samples/gemini-video-summarization/build.gradle.kts b/samples/gemini-video-summarization/build.gradle.kts index 62d53278..b92bca45 100644 --- a/samples/gemini-video-summarization/build.gradle.kts +++ b/samples/gemini-video-summarization/build.gradle.kts @@ -43,29 +43,25 @@ android { } dependencies { - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.appcompat) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.ui.test.junit4) + androidTestImplementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.activity.compose) - implementation(libs.androidx.material3) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.material.icons.extended) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.material3) + implementation(libs.androidx.media3.exoplayer) + implementation(libs.androidx.media3.ui) + implementation(libs.androidx.ui.tooling.preview.android) + implementation(libs.firebase.ai) + implementation(libs.firebase.common.ktx) implementation(libs.hilt.android) implementation(libs.hilt.navigation.compose) - implementation(libs.firebase.common.ktx) - implementation(libs.androidx.lifecycle.runtime.compose) - implementation(libs.androidx.ui.tooling.preview.android) - ksp(libs.hilt.compiler) + implementation(platform(libs.androidx.compose.bom)) implementation(platform(libs.firebase.bom)) - implementation(libs.firebase.ai) - - // Media3 ExoPlayer - implementation(libs.androidx.media3.exoplayer) - implementation(libs.androidx.media3.ui) - implementation(project(":ui-component")) - - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(libs.androidx.ui.test.junit4) + ksp(libs.hilt.compiler) } diff --git a/samples/genai-image-description/build.gradle.kts b/samples/genai-image-description/build.gradle.kts index 0c8ee45c..e2c5d9ef 100644 --- a/samples/genai-image-description/build.gradle.kts +++ b/samples/genai-image-description/build.gradle.kts @@ -48,23 +48,22 @@ android { } dependencies { - - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.appcompat) - implementation(libs.androidx.material3) + debugImplementation(libs.ui.tooling) implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.material.icons.extended) implementation(libs.androidx.material.icons.extended) - implementation(libs.hilt.android) - implementation(libs.hilt.navigation.compose) + implementation(libs.androidx.material3) implementation(libs.androidx.runtime.livedata) - implementation(libs.genai.image.description) implementation(libs.coil.compose) + implementation(libs.genai.image.description) + implementation(libs.hilt.android) + implementation(libs.hilt.navigation.compose) implementation(libs.kotlinx.coroutines.guava) - implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.ui.tooling.preview) - debugImplementation(libs.ui.tooling) - ksp(libs.hilt.compiler) + implementation(platform(libs.androidx.compose.bom)) implementation(project(":ui-component")) + ksp(libs.hilt.compiler) } diff --git a/samples/genai-summarization/build.gradle.kts b/samples/genai-summarization/build.gradle.kts index 6dcf98cb..ebc0f044 100644 --- a/samples/genai-summarization/build.gradle.kts +++ b/samples/genai-summarization/build.gradle.kts @@ -48,21 +48,20 @@ android { } dependencies { - - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.appcompat) - implementation(libs.androidx.material3) implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.material.icons.extended) implementation(libs.androidx.material.icons.extended) - implementation(libs.hilt.android) - implementation(libs.hilt.navigation.compose) + implementation(libs.androidx.material3) implementation(libs.androidx.runtime.livedata) implementation(libs.genai.summarization) + implementation(libs.hilt.android) + implementation(libs.hilt.navigation.compose) implementation(libs.kotlinx.coroutines.guava) - implementation(libs.androidx.lifecycle.runtime.compose) + implementation(libs.ui.tooling) + implementation(platform(libs.androidx.compose.bom)) implementation(project(":ui-component")) - debugImplementation(libs.ui.tooling) ksp(libs.hilt.compiler) } diff --git a/samples/genai-writing-assistance/build.gradle.kts b/samples/genai-writing-assistance/build.gradle.kts index 5a740c44..c43ebf7b 100644 --- a/samples/genai-writing-assistance/build.gradle.kts +++ b/samples/genai-writing-assistance/build.gradle.kts @@ -46,21 +46,21 @@ android { } dependencies { - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.appcompat) - implementation(libs.androidx.material3) implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.androidx.material.icons.extended) implementation(libs.androidx.material.icons.extended) - implementation(libs.hilt.android) - implementation(libs.hilt.navigation.compose) + implementation(libs.androidx.material3) implementation(libs.androidx.runtime.livedata) implementation(libs.genai.proofreading) implementation(libs.genai.rewrite) + implementation(libs.hilt.android) + implementation(libs.hilt.navigation.compose) implementation(libs.kotlinx.coroutines.guava) - implementation(libs.androidx.lifecycle.runtime.compose) + implementation(libs.ui.tooling) + implementation(platform(libs.androidx.compose.bom)) implementation(project(":ui-component")) - debugImplementation(libs.ui.tooling) ksp(libs.hilt.compiler) } diff --git a/samples/imagen-editing/build.gradle.kts b/samples/imagen-editing/build.gradle.kts index 121f6ede..729fb48a 100644 --- a/samples/imagen-editing/build.gradle.kts +++ b/samples/imagen-editing/build.gradle.kts @@ -48,22 +48,21 @@ android { } dependencies { - implementation(libs.androidx.core.ktx) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) + debugImplementation(libs.ui.tooling) implementation(libs.androidx.appcompat) - implementation(libs.androidx.material3) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.core.ktx) implementation(libs.androidx.material.icons.extended) - implementation(platform(libs.firebase.bom)) + implementation(libs.androidx.material3) + implementation(libs.androidx.runtime.livedata) implementation(libs.firebase.ai) implementation(libs.hilt.android) implementation(libs.hilt.navigation.compose) - implementation(libs.androidx.runtime.livedata) implementation(libs.ui.tooling.preview) + implementation(platform(libs.androidx.compose.bom)) + implementation(platform(libs.firebase.bom)) implementation(project(":ui-component")) - debugImplementation(libs.ui.tooling) ksp(libs.hilt.compiler) - testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) } diff --git a/samples/imagen/build.gradle.kts b/samples/imagen/build.gradle.kts index 93e44e35..cc11620c 100644 --- a/samples/imagen/build.gradle.kts +++ b/samples/imagen/build.gradle.kts @@ -49,24 +49,21 @@ android { } dependencies { - - implementation(libs.androidx.core.ktx) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) + debugImplementation(libs.ui.tooling) implementation(libs.androidx.appcompat) - implementation(libs.androidx.material3) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.core.ktx) implementation(libs.androidx.material.icons.extended) - implementation(platform(libs.firebase.bom)) + implementation(libs.androidx.material3) + implementation(libs.androidx.runtime.livedata) implementation(libs.firebase.ai) implementation(libs.hilt.android) implementation(libs.hilt.navigation.compose) - implementation(libs.androidx.runtime.livedata) implementation(libs.ui.tooling.preview) - debugImplementation(libs.ui.tooling) - ksp(libs.hilt.compiler) - + implementation(platform(libs.androidx.compose.bom)) + implementation(platform(libs.firebase.bom)) implementation(project(":ui-component")) - + ksp(libs.hilt.compiler) testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) } diff --git a/samples/magic-selfie/build.gradle.kts b/samples/magic-selfie/build.gradle.kts index 0f3e118f..514d2e44 100644 --- a/samples/magic-selfie/build.gradle.kts +++ b/samples/magic-selfie/build.gradle.kts @@ -47,27 +47,23 @@ android { } dependencies { - - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.appcompat) - implementation(libs.androidx.material3) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(libs.androidx.junit) + debugImplementation(libs.ui.tooling) implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core.ktx) implementation(libs.androidx.material.icons.extended) - implementation(platform(libs.firebase.bom)) + implementation(libs.androidx.material3) + implementation(libs.androidx.runtime.livedata) implementation(libs.firebase.ai) implementation(libs.hilt.android) implementation(libs.hilt.navigation.compose) - implementation(libs.androidx.runtime.livedata) implementation(libs.mlkit.segmentation) implementation(libs.ui.tooling.preview) - debugImplementation(libs.ui.tooling) - - ksp(libs.hilt.compiler) - + implementation(platform(libs.androidx.compose.bom)) + implementation(platform(libs.firebase.bom)) implementation(project(":ui-component")) - + ksp(libs.hilt.compiler) testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) } diff --git a/ui-component/build.gradle.kts b/ui-component/build.gradle.kts index d52ba870..0c52d2cb 100644 --- a/ui-component/build.gradle.kts +++ b/ui-component/build.gradle.kts @@ -43,18 +43,18 @@ android { } dependencies { - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.material3) - implementation(libs.androidx.material.icons.extended) + debugImplementation(libs.ui.tooling) implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.compose) - implementation(libs.androidx.ui.google.fonts) + implementation(libs.androidx.material.icons.extended) + implementation(libs.androidx.material3) implementation(libs.androidx.media3.exoplayer) implementation(libs.androidx.media3.ui.compose) + implementation(libs.androidx.ui.google.fonts) implementation(libs.coil.compose) - implementation(libs.richtext.material3) implementation(libs.richtext.commonmark) + implementation(libs.richtext.material3) implementation(libs.ui.tooling.preview) - debugImplementation(libs.ui.tooling) + implementation(platform(libs.androidx.compose.bom)) } From 055d0357803c441436799f1279552e8f33f49282 Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Mon, 12 Jan 2026 16:59:37 +0100 Subject: [PATCH 03/16] Remove zero byte pngs that failed release builds --- app/src/main/res/drawable-xhdpi/img_keyart_chatbot.png | 0 app/src/main/res/drawable-xhdpi/img_keyart_imagen.png | 0 app/src/main/res/drawable-xhdpi/img_keyart_img_desc.png | 0 app/src/main/res/drawable-xhdpi/img_keyart_magic_selfie.png | 0 app/src/main/res/drawable-xhdpi/img_keyart_metadata.png | 0 app/src/main/res/drawable-xhdpi/img_keyart_multimodal.png | 0 app/src/main/res/drawable-xhdpi/img_keyart_summary.png | 0 app/src/main/res/drawable-xhdpi/img_keyart_text.png | 0 app/src/main/res/drawable-xhdpi/img_keyart_todo.png | 0 app/src/main/res/drawable-xhdpi/img_keyart_video_summary.png | 0 10 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/res/drawable-xhdpi/img_keyart_chatbot.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_keyart_imagen.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_keyart_img_desc.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_keyart_magic_selfie.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_keyart_metadata.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_keyart_multimodal.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_keyart_summary.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_keyart_text.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_keyart_todo.png delete mode 100644 app/src/main/res/drawable-xhdpi/img_keyart_video_summary.png diff --git a/app/src/main/res/drawable-xhdpi/img_keyart_chatbot.png b/app/src/main/res/drawable-xhdpi/img_keyart_chatbot.png deleted file mode 100644 index e69de29b..00000000 diff --git a/app/src/main/res/drawable-xhdpi/img_keyart_imagen.png b/app/src/main/res/drawable-xhdpi/img_keyart_imagen.png deleted file mode 100644 index e69de29b..00000000 diff --git a/app/src/main/res/drawable-xhdpi/img_keyart_img_desc.png b/app/src/main/res/drawable-xhdpi/img_keyart_img_desc.png deleted file mode 100644 index e69de29b..00000000 diff --git a/app/src/main/res/drawable-xhdpi/img_keyart_magic_selfie.png b/app/src/main/res/drawable-xhdpi/img_keyart_magic_selfie.png deleted file mode 100644 index e69de29b..00000000 diff --git a/app/src/main/res/drawable-xhdpi/img_keyart_metadata.png b/app/src/main/res/drawable-xhdpi/img_keyart_metadata.png deleted file mode 100644 index e69de29b..00000000 diff --git a/app/src/main/res/drawable-xhdpi/img_keyart_multimodal.png b/app/src/main/res/drawable-xhdpi/img_keyart_multimodal.png deleted file mode 100644 index e69de29b..00000000 diff --git a/app/src/main/res/drawable-xhdpi/img_keyart_summary.png b/app/src/main/res/drawable-xhdpi/img_keyart_summary.png deleted file mode 100644 index e69de29b..00000000 diff --git a/app/src/main/res/drawable-xhdpi/img_keyart_text.png b/app/src/main/res/drawable-xhdpi/img_keyart_text.png deleted file mode 100644 index e69de29b..00000000 diff --git a/app/src/main/res/drawable-xhdpi/img_keyart_todo.png b/app/src/main/res/drawable-xhdpi/img_keyart_todo.png deleted file mode 100644 index e69de29b..00000000 diff --git a/app/src/main/res/drawable-xhdpi/img_keyart_video_summary.png b/app/src/main/res/drawable-xhdpi/img_keyart_video_summary.png deleted file mode 100644 index e69de29b..00000000 From 3ee7821d44f2a6d51caa10014fb9c649423f3070 Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Mon, 12 Jan 2026 17:10:49 +0100 Subject: [PATCH 04/16] Upgrade dependencies --- gradle/libs.versions.toml | 60 +++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a0db7851..07bef330 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,40 +1,40 @@ [versions] -activityCompose = "1.10.1" +activityCompose = "1.12.2" agp = "8.13.2" -appcompat = "1.7.0" -coilCompose = "3.1.0" -composeBom = "2025.06.01" -coreKtx = "1.15.0" -espressoCore = "3.6.1" -exifinterface = "1.4.1" -firebaseBom = "34.5.0" +appcompat = "1.7.1" +coilCompose = "3.3.0" +composeBom = "2025.12.01" +coreKtx = "1.17.0" +espressoCore = "3.7.0" +exifinterface = "1.4.2" +firebaseBom = "34.7.0" firebaseCommonKtx = "21.0.0" -googleGmsGoogleServices = "4.4.2" -hilt = "2.56.2" -hiltNavigationCompose = "1.2.0" +googleGmsGoogleServices = "4.4.4" +hilt = "2.57.2" +hiltNavigationCompose = "1.3.0" junit = "4.13.2" -junitVersion = "1.2.1" -kotlin = "2.1.0" +junitVersion = "1.3.0" +kotlin = "2.2.20" kotlinxCoroutinesGuava = "1.10.2" -kotlinxSerializationJson = "1.6.2" -ksp = "2.1.0-1.0.29" -lifecycleRuntimeCompose = "2.9.1" -lifecycleRuntimeKtx = "2.8.7" -lifecycleViewmodelAndroid = "2.8.7" -material3 = "1.5.0-alpha01" -material3WindowSizeClass = "1.3.2" -media3 = "1.8.0" +kotlinxSerializationJson = "1.9.0" +ksp = "2.2.0-2.0.2" +lifecycleRuntimeCompose = "2.10.0" +lifecycleRuntimeKtx = "2.10.0" +lifecycleViewmodelAndroid = "2.10.0" +material3 = "1.5.0-alpha11" +material3WindowSizeClass = "1.4.0" +media3 = "1.9.0" mlkitGenAi = "1.0.0-beta1" mlkitSegmentation = "16.0.0-beta1" -navigationCompose = "2.9.0" -navigationRuntimeKtx = "2.9.0" -richtext = "1.0.0-alpha02" -runtimeLivedata = "1.7.6" -spotless = "7.0.4" -uiTextGoogleFonts = "1.8.1" -uiTooling = "1.8.3" -uiToolingPreview = "1.8.3" -uiToolingPreviewAndroid = "1.8.1" +navigationCompose = "2.9.6" +navigationRuntimeKtx = "2.9.6" +richtext = "1.0.0-alpha03" +runtimeLivedata = "1.10.0" +spotless = "8.0.0" +uiTextGoogleFonts = "1.10.0" +uiTooling = "1.10.0" +uiToolingPreview = "1.10.0" +uiToolingPreviewAndroid = "1.10.0" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } From f7494762e76417282712dc4592af7e47d2f741ef Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Mon, 12 Jan 2026 17:13:10 +0100 Subject: [PATCH 05/16] compileSdk = 36 --- samples/gemini-chatbot/build.gradle.kts | 2 +- samples/gemini-image-chat/build.gradle.kts | 2 +- samples/gemini-live-todo/build.gradle.kts | 2 +- samples/gemini-multimodal/build.gradle.kts | 2 +- samples/gemini-video-summarization/build.gradle.kts | 2 +- samples/genai-image-description/build.gradle.kts | 2 +- samples/genai-summarization/build.gradle.kts | 2 +- samples/genai-writing-assistance/build.gradle.kts | 2 +- samples/imagen/build.gradle.kts | 2 +- samples/magic-selfie/build.gradle.kts | 2 +- ui-component/build.gradle.kts | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/samples/gemini-chatbot/build.gradle.kts b/samples/gemini-chatbot/build.gradle.kts index 0f820fdf..f361db1e 100644 --- a/samples/gemini-chatbot/build.gradle.kts +++ b/samples/gemini-chatbot/build.gradle.kts @@ -23,7 +23,7 @@ plugins { android { namespace = "com.android.ai.samples.geminichatbot" - compileSdk = 35 + compileSdk = 36 buildFeatures { compose = true diff --git a/samples/gemini-image-chat/build.gradle.kts b/samples/gemini-image-chat/build.gradle.kts index 52fdb6bd..b61b1724 100644 --- a/samples/gemini-image-chat/build.gradle.kts +++ b/samples/gemini-image-chat/build.gradle.kts @@ -23,7 +23,7 @@ plugins { android { namespace = "com.android.ai.samples.geminiimagechat" - compileSdk = 35 + compileSdk = 36 buildFeatures { compose = true diff --git a/samples/gemini-live-todo/build.gradle.kts b/samples/gemini-live-todo/build.gradle.kts index 17bcf715..9ad6272d 100644 --- a/samples/gemini-live-todo/build.gradle.kts +++ b/samples/gemini-live-todo/build.gradle.kts @@ -22,7 +22,7 @@ plugins { android { namespace = "com.android.ai.samples.geminilivetodo" - compileSdk = 35 + compileSdk = 36 defaultConfig { minSdk = 24 diff --git a/samples/gemini-multimodal/build.gradle.kts b/samples/gemini-multimodal/build.gradle.kts index 97bfe2c8..8be065bb 100644 --- a/samples/gemini-multimodal/build.gradle.kts +++ b/samples/gemini-multimodal/build.gradle.kts @@ -23,7 +23,7 @@ plugins { android { namespace = "com.android.ai.samples.geminimultimodal" - compileSdk = 35 + compileSdk = 36 buildFeatures { compose = true diff --git a/samples/gemini-video-summarization/build.gradle.kts b/samples/gemini-video-summarization/build.gradle.kts index b92bca45..600cb7c8 100644 --- a/samples/gemini-video-summarization/build.gradle.kts +++ b/samples/gemini-video-summarization/build.gradle.kts @@ -23,7 +23,7 @@ plugins { android { namespace = "com.google.com.android.ai.samples.geminivideosummary" - compileSdk = 35 + compileSdk = 36 defaultConfig { minSdk = 24 diff --git a/samples/genai-image-description/build.gradle.kts b/samples/genai-image-description/build.gradle.kts index e2c5d9ef..c832b91d 100644 --- a/samples/genai-image-description/build.gradle.kts +++ b/samples/genai-image-description/build.gradle.kts @@ -23,7 +23,7 @@ plugins { android { namespace = "com.android.ai.samples.geminimultimodal" - compileSdk = 35 + compileSdk = 36 buildFeatures { compose = true diff --git a/samples/genai-summarization/build.gradle.kts b/samples/genai-summarization/build.gradle.kts index ebc0f044..d4e7f229 100644 --- a/samples/genai-summarization/build.gradle.kts +++ b/samples/genai-summarization/build.gradle.kts @@ -23,7 +23,7 @@ plugins { android { namespace = "com.android.ai.samples.geminimultimodal" - compileSdk = 35 + compileSdk = 36 buildFeatures { compose = true diff --git a/samples/genai-writing-assistance/build.gradle.kts b/samples/genai-writing-assistance/build.gradle.kts index c43ebf7b..b4169402 100644 --- a/samples/genai-writing-assistance/build.gradle.kts +++ b/samples/genai-writing-assistance/build.gradle.kts @@ -23,7 +23,7 @@ plugins { android { namespace = "com.android.ai.samples.geminimultimodal" - compileSdk = 35 + compileSdk = 36 buildFeatures { compose = true diff --git a/samples/imagen/build.gradle.kts b/samples/imagen/build.gradle.kts index cc11620c..6ef55b13 100644 --- a/samples/imagen/build.gradle.kts +++ b/samples/imagen/build.gradle.kts @@ -22,7 +22,7 @@ plugins { android { namespace = "com.android.ai.samples.imagen" - compileSdk = 35 + compileSdk = 36 buildFeatures { compose = true diff --git a/samples/magic-selfie/build.gradle.kts b/samples/magic-selfie/build.gradle.kts index 514d2e44..560716a9 100644 --- a/samples/magic-selfie/build.gradle.kts +++ b/samples/magic-selfie/build.gradle.kts @@ -22,7 +22,7 @@ plugins { android { namespace = "com.android.ai.samples.magicselfie" - compileSdk = 35 + compileSdk = 36 buildFeatures { compose = true diff --git a/ui-component/build.gradle.kts b/ui-component/build.gradle.kts index 0c52d2cb..4cc24f15 100644 --- a/ui-component/build.gradle.kts +++ b/ui-component/build.gradle.kts @@ -21,7 +21,7 @@ plugins { android { namespace = "com.android.ai.uicomponent" - compileSdk = 35 + compileSdk = 36 buildFeatures { compose = true From 9644c33ca497d0ad22c6b00a4c774bef442ed516 Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Tue, 13 Jan 2026 16:19:09 +0100 Subject: [PATCH 06/16] Update kotlin gradle configuration --- app/build.gradle.kts | 7 +++++-- .../java/com/android/ai/catalog/domain/SampleCatalog.kt | 6 +++--- gradle/libs.versions.toml | 2 +- samples/gemini-chatbot/build.gradle.kts | 6 ++++-- samples/gemini-image-chat/build.gradle.kts | 7 +++++-- samples/gemini-live-todo/build.gradle.kts | 7 +++++-- samples/gemini-multimodal/build.gradle.kts | 6 ++++-- samples/gemini-video-metadata-creation/build.gradle.kts | 7 +++++-- .../viewmodel/VideoMetadataCreationViewModel.kt | 4 ++-- samples/gemini-video-summarization/build.gradle.kts | 7 +++++-- samples/genai-image-description/build.gradle.kts | 6 ++++-- samples/genai-summarization/build.gradle.kts | 6 ++++-- samples/genai-writing-assistance/build.gradle.kts | 6 ++++-- .../GenAIWritingAssistanceViewModel.kt | 2 +- samples/imagen-editing/build.gradle.kts | 7 +++++-- samples/imagen/build.gradle.kts | 7 +++++-- samples/magic-selfie/build.gradle.kts | 7 +++++-- ui-component/build.gradle.kts | 7 +++++-- .../main/java/com/android/ai/uicomponent/VideoPlayer.kt | 2 +- 19 files changed, 73 insertions(+), 36 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ab33b1ae..d2185ecd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.application) alias(libs.plugins.compose.compiler) @@ -53,8 +56,8 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } buildFeatures { compose = true diff --git a/app/src/main/java/com/android/ai/catalog/domain/SampleCatalog.kt b/app/src/main/java/com/android/ai/catalog/domain/SampleCatalog.kt index c4b10287..a063f7da 100644 --- a/app/src/main/java/com/android/ai/catalog/domain/SampleCatalog.kt +++ b/app/src/main/java/com/android/ai/catalog/domain/SampleCatalog.kt @@ -151,14 +151,14 @@ val sampleCatalog = listOf( ) data class SampleCatalogItem( - @StringRes val title: Int, - @StringRes val description: Int, + @param:StringRes val title: Int, + @param:StringRes val description: Int, val route: String, val sampleEntryScreen: @Composable () -> Unit, val tags: List = emptyList(), val needsFirebase: Boolean = false, val isFeatured: Boolean = false, - @DrawableRes val keyArt: Int? = null, + @param:DrawableRes val keyArt: Int? = null, ) enum class SampleTags( diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 07bef330..aa4a3d59 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ hilt = "2.57.2" hiltNavigationCompose = "1.3.0" junit = "4.13.2" junitVersion = "1.3.0" -kotlin = "2.2.20" +kotlin = "2.2.0" kotlinxCoroutinesGuava = "1.10.2" kotlinxSerializationJson = "1.9.0" ksp = "2.2.0-2.0.2" diff --git a/samples/gemini-chatbot/build.gradle.kts b/samples/gemini-chatbot/build.gradle.kts index f361db1e..ef30fb9f 100644 --- a/samples/gemini-chatbot/build.gradle.kts +++ b/samples/gemini-chatbot/build.gradle.kts @@ -14,6 +14,8 @@ * limitations under the License. */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.compose.compiler) @@ -39,8 +41,8 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } } diff --git a/samples/gemini-image-chat/build.gradle.kts b/samples/gemini-image-chat/build.gradle.kts index b61b1724..96481aa9 100644 --- a/samples/gemini-image-chat/build.gradle.kts +++ b/samples/gemini-image-chat/build.gradle.kts @@ -14,6 +14,8 @@ * limitations under the License. */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.compose.compiler) @@ -39,8 +41,9 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } } diff --git a/samples/gemini-live-todo/build.gradle.kts b/samples/gemini-live-todo/build.gradle.kts index 9ad6272d..f1d5ea2d 100644 --- a/samples/gemini-live-todo/build.gradle.kts +++ b/samples/gemini-live-todo/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.compose.compiler) @@ -34,8 +37,8 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } } diff --git a/samples/gemini-multimodal/build.gradle.kts b/samples/gemini-multimodal/build.gradle.kts index 8be065bb..fa3ce0a8 100644 --- a/samples/gemini-multimodal/build.gradle.kts +++ b/samples/gemini-multimodal/build.gradle.kts @@ -14,6 +14,8 @@ * limitations under the License. */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -42,8 +44,8 @@ android { composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } } diff --git a/samples/gemini-video-metadata-creation/build.gradle.kts b/samples/gemini-video-metadata-creation/build.gradle.kts index 3a66bda2..59aa8944 100644 --- a/samples/gemini-video-metadata-creation/build.gradle.kts +++ b/samples/gemini-video-metadata-creation/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -35,8 +38,8 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } buildFeatures { compose = true diff --git a/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/viewmodel/VideoMetadataCreationViewModel.kt b/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/viewmodel/VideoMetadataCreationViewModel.kt index 09097d66..d06b6f37 100644 --- a/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/viewmodel/VideoMetadataCreationViewModel.kt +++ b/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/viewmodel/VideoMetadataCreationViewModel.kt @@ -144,8 +144,8 @@ class VideoMetadataCreationViewModel @Inject constructor(private val application } enum class MetadataType( - @DrawableRes val iconRes: Int, - @StringRes val titleRes: Int, + @param:DrawableRes val iconRes: Int, + @param:StringRes val titleRes: Int, ) { THUMBNAILS(com.android.ai.uicomponent.R.drawable.ic_ai_img, R.string.thumbnails), DESCRIPTION(com.android.ai.uicomponent.R.drawable.ic_ai_summary, R.string.description), diff --git a/samples/gemini-video-summarization/build.gradle.kts b/samples/gemini-video-summarization/build.gradle.kts index 600cb7c8..d4f27561 100644 --- a/samples/gemini-video-summarization/build.gradle.kts +++ b/samples/gemini-video-summarization/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -34,8 +37,8 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } buildFeatures { compose = true diff --git a/samples/genai-image-description/build.gradle.kts b/samples/genai-image-description/build.gradle.kts index c832b91d..248a1666 100644 --- a/samples/genai-image-description/build.gradle.kts +++ b/samples/genai-image-description/build.gradle.kts @@ -14,6 +14,8 @@ * limitations under the License. */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -42,8 +44,8 @@ android { composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } } diff --git a/samples/genai-summarization/build.gradle.kts b/samples/genai-summarization/build.gradle.kts index d4e7f229..0842bd2e 100644 --- a/samples/genai-summarization/build.gradle.kts +++ b/samples/genai-summarization/build.gradle.kts @@ -14,6 +14,8 @@ * limitations under the License. */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -42,8 +44,8 @@ android { composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } } diff --git a/samples/genai-writing-assistance/build.gradle.kts b/samples/genai-writing-assistance/build.gradle.kts index b4169402..6fc022d1 100644 --- a/samples/genai-writing-assistance/build.gradle.kts +++ b/samples/genai-writing-assistance/build.gradle.kts @@ -14,6 +14,8 @@ * limitations under the License. */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -40,8 +42,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } } diff --git a/samples/genai-writing-assistance/src/main/java/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt b/samples/genai-writing-assistance/src/main/java/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt index c4b17e0f..6f47ab7d 100644 --- a/samples/genai-writing-assistance/src/main/java/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt +++ b/samples/genai-writing-assistance/src/main/java/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt @@ -50,7 +50,7 @@ sealed class GenAIWritingAssistanceUiState { data object Generating : GenAIWritingAssistanceUiState() data class Success(val generatedOutput: String) : GenAIWritingAssistanceUiState() - data class Error(@StringRes val errorMessageStringRes: Int) : GenAIWritingAssistanceUiState() + data class Error(@param:StringRes val errorMessageStringRes: Int) : GenAIWritingAssistanceUiState() } class GenAIWritingAssistanceViewModel @Inject constructor(context: Application) : AndroidViewModel(context) { diff --git a/samples/imagen-editing/build.gradle.kts b/samples/imagen-editing/build.gradle.kts index 729fb48a..5073de3a 100644 --- a/samples/imagen-editing/build.gradle.kts +++ b/samples/imagen-editing/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -38,8 +41,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } lint { diff --git a/samples/imagen/build.gradle.kts b/samples/imagen/build.gradle.kts index 6ef55b13..af38a7ba 100644 --- a/samples/imagen/build.gradle.kts +++ b/samples/imagen/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -39,8 +42,8 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } lint { diff --git a/samples/magic-selfie/build.gradle.kts b/samples/magic-selfie/build.gradle.kts index 560716a9..e3ace0d8 100644 --- a/samples/magic-selfie/build.gradle.kts +++ b/samples/magic-selfie/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -41,8 +44,8 @@ android { composeOptions { kotlinCompilerExtensionVersion = "1.5.15" } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } } diff --git a/ui-component/build.gradle.kts b/ui-component/build.gradle.kts index 4cc24f15..bd7e129b 100644 --- a/ui-component/build.gradle.kts +++ b/ui-component/build.gradle.kts @@ -13,6 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + plugins { alias(libs.plugins.android.library) alias(libs.plugins.jetbrains.kotlin.android) @@ -37,8 +40,8 @@ android { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } } diff --git a/ui-component/src/main/java/com/android/ai/uicomponent/VideoPlayer.kt b/ui-component/src/main/java/com/android/ai/uicomponent/VideoPlayer.kt index b41b002a..7149fe02 100644 --- a/ui-component/src/main/java/com/android/ai/uicomponent/VideoPlayer.kt +++ b/ui-component/src/main/java/com/android/ai/uicomponent/VideoPlayer.kt @@ -220,7 +220,7 @@ fun VideoPickerDropdown( val iconBg = MaterialTheme.colorScheme.surfaceContainerHighest Icon( imageVector = Icons.Filled.ArrowDropDown, - contentDescription = context.getString(R.string.select_video_dropdown), + contentDescription = stringResource(R.string.select_video_dropdown), tint = MaterialTheme.colorScheme.onSurface, modifier = Modifier.drawBehind { drawCircle(iconBg) From e9982d6394c1392796f9d1b7e199975c28bba8ff Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Tue, 13 Jan 2026 16:32:14 +0100 Subject: [PATCH 07/16] Address existing lint findings --- .../ui/VideoMetadataCreationScreen.kt | 8 ++++---- .../imagenediting/ui/ImagenEditingScreen.kt | 5 +++-- .../android/ai/samples/imagen/ui/ImagenScreen.kt | 5 +++-- .../samples/magicselfie/ui/MagicSelfieScreen.kt | 16 +++++++++++++--- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/ui/VideoMetadataCreationScreen.kt b/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/ui/VideoMetadataCreationScreen.kt index 14021175..2ff74764 100644 --- a/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/ui/VideoMetadataCreationScreen.kt +++ b/samples/gemini-video-metadata-creation/src/main/java/com/android/ai/samples/geminivideometadatacreation/ui/VideoMetadataCreationScreen.kt @@ -44,11 +44,11 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.LifecycleStartEffect import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.media3.common.Player @@ -107,7 +107,7 @@ private fun VideoMetadataCreationScreen( onMetadataTypeClicked: (MetadataType) -> Unit, ) { var isDropdownExpanded by remember { mutableStateOf(false) } - val context = LocalContext.current + val resources = LocalResources.current val backDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher Scaffold( topBar = { @@ -130,7 +130,7 @@ private fun VideoMetadataCreationScreen( player = player, videoPicker = { VideoPickerDropdown( - videoItems = sampleVideoList.map { VideoPickerData(context.getString(it.titleResId), it.uri) }, + videoItems = sampleVideoList.map { VideoPickerData(resources.getString(it.titleResId), it.uri) }, selectedVideo = selectedVideoUri, isExpanded = isDropdownExpanded, onDropdownExpandedChanged = { isDropdownExpanded = it }, diff --git a/samples/imagen-editing/src/main/java/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt b/samples/imagen-editing/src/main/java/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt index 9699e7aa..a4565c8d 100644 --- a/samples/imagen-editing/src/main/java/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt +++ b/samples/imagen-editing/src/main/java/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt @@ -55,6 +55,7 @@ import androidx.compose.ui.graphics.TileMode import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.SoftwareKeyboardController import androidx.compose.ui.res.painterResource @@ -113,9 +114,9 @@ private fun ImagenEditingScreenContent( }, modifier = Modifier.fillMaxWidth(), ) { innerPadding -> - val context = LocalContext.current + val resources = LocalResources.current val imageBitmap = remember { - val bitmap = BitmapFactory.decodeResource(context.resources, com.android.ai.uicomponent.R.drawable.img_fill) + val bitmap = BitmapFactory.decodeResource(resources, com.android.ai.uicomponent.R.drawable.img_fill) bitmap.asImageBitmap() } val imageShader = remember { diff --git a/samples/imagen/src/main/java/com/android/ai/samples/imagen/ui/ImagenScreen.kt b/samples/imagen/src/main/java/com/android/ai/samples/imagen/ui/ImagenScreen.kt index 10afed0e..255393ed 100644 --- a/samples/imagen/src/main/java/com/android/ai/samples/imagen/ui/ImagenScreen.kt +++ b/samples/imagen/src/main/java/com/android/ai/samples/imagen/ui/ImagenScreen.kt @@ -50,6 +50,7 @@ import androidx.compose.ui.graphics.TileMode import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -96,9 +97,9 @@ private fun ImagenScreen(uiState: ImagenUIState, onGenerateClick: (String) -> Un modifier = Modifier.fillMaxWidth(), ) { innerPadding -> - val context = LocalContext.current + val resources = LocalResources.current val imageBitmap = remember { - val bitmap = BitmapFactory.decodeResource(context.resources, com.android.ai.uicomponent.R.drawable.img_fill) + val bitmap = BitmapFactory.decodeResource(resources, com.android.ai.uicomponent.R.drawable.img_fill) bitmap.asImageBitmap() } diff --git a/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt b/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt index bd08381f..a67c96d0 100644 --- a/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt +++ b/samples/magic-selfie/src/main/java/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt @@ -20,6 +20,8 @@ import android.app.Activity import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory +import android.graphics.ImageDecoder +import android.os.Build import android.provider.MediaStore import androidx.activity.compose.LocalOnBackPressedDispatcherOwner import androidx.activity.compose.rememberLauncherForActivityResult @@ -62,13 +64,14 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import androidx.core.content.FileProvider -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import com.android.ai.samples.magicselfie.R import com.android.ai.theme.AISampleCatalogTheme import com.android.ai.uicomponent.GenerateButton @@ -85,6 +88,7 @@ fun MagicSelfieScreen(viewModel: MagicSelfieViewModel = hiltViewModel()) { val uiState by viewModel.uiState.collectAsState() val snackbarHostState = remember { SnackbarHostState() } val context = LocalContext.current + val resources = LocalResources.current var selfieBitmap by remember { mutableStateOf(null) } var tempSelfiePhotoFile by remember { mutableStateOf(null) } @@ -101,7 +105,13 @@ fun MagicSelfieScreen(viewModel: MagicSelfieViewModel = hiltViewModel()) { if (result.resultCode == Activity.RESULT_OK) { tempSelfiePhotoFile?.let { file -> val uri = FileProvider.getUriForFile(context, context.packageName + ".provider", file) - val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, uri) + val bitmap = if (Build.VERSION.SDK_INT < 28) { + @Suppress("DEPRECATION") + MediaStore.Images.Media.getBitmap(context.contentResolver, uri) + } else { + val source = ImageDecoder.createSource(context.contentResolver, uri) + ImageDecoder.decodeBitmap(source) + } selfieBitmap = rotateImageIfRequired( file, bitmap, @@ -111,7 +121,7 @@ fun MagicSelfieScreen(viewModel: MagicSelfieViewModel = hiltViewModel()) { } if (uiState is MagicSelfieUiState.Error) { - val errorMessage = (uiState as MagicSelfieUiState.Error).message ?: context.getString(R.string.unknown_error) + val errorMessage = (uiState as MagicSelfieUiState.Error).message ?: resources.getString(R.string.unknown_error) LaunchedEffect(uiState) { snackbarHostState.showSnackbar(errorMessage) viewModel.resetError() From bd0611fd1ce3d117342a5e58f718aed8890c0b35 Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Tue, 13 Jan 2026 16:41:10 +0100 Subject: [PATCH 08/16] Move source to src/kotlin where possible --- app/src/main/AndroidManifest.xml | 16 ++++++++++------ .../com/android/ai/catalog/CatalogApplication.kt | 0 .../com/android/ai/catalog/MainActivity.kt | 0 .../android/ai/catalog/domain/SampleCatalog.kt | 0 .../com/android/ai/catalog/ui/CatalogApp.kt | 0 .../com/android/ai/catalog/ui/CatalogRowCard.kt | 0 .../com/android/ai/catalog/ui/CatalogWideCard.kt | 0 build.gradle.kts | 1 + gradle/libs.versions.toml | 5 +++++ .../samples/geminichatbot/GeminiChatbotScreen.kt | 0 .../geminichatbot/GeminiChatbotViewModel.kt | 0 .../geminiimagechat/GeminiImageChatScreen.kt | 0 .../geminiimagechat/GeminiImageChatViewModel.kt | 0 .../com/android/ai/samples/util/BitmapUtils.kt | 0 .../ai/samples/geminilivetodo/data/Todo.kt | 0 .../geminilivetodo/data/TodoRepository.kt | 0 .../ai/samples/geminilivetodo/ui/TodoScreen.kt | 0 .../geminilivetodo/ui/TodoScreenUiState.kt | 0 .../geminilivetodo/ui/TodoScreenViewModel.kt | 0 .../geminimultimodal/data/GeminiDataSource.kt | 0 .../ui/GeminiMultimodalScreen.kt | 0 .../ui/GeminiMultimodalUiState.kt | 0 .../ui/GeminiMultimodalViewModel.kt | 0 .../GenerateAccountTags.kt | 0 .../GenerateChapters.kt | 0 .../GenerateDescription.kt | 0 .../GenerateHashtags.kt | 0 .../geminivideometadatacreation/GenerateLinks.kt | 0 .../GenerateThumbnails.kt | 0 .../player/ExtractHDRThumbnails.kt | 0 .../player/VideoPlayer.kt | 0 .../player/VideoSelectionDropdown.kt | 0 .../ui/MetadataButtonRow.kt | 0 .../ui/MetadataComponents.kt | 0 .../ui/VideoMetadataCreationScreen.kt | 0 .../util/VideoList.kt | 0 .../viewmodel/VideoMetadataCreationViewModel.kt | 0 .../geminivideosummary/ui/OutputTextDisplay.kt | 0 .../geminivideosummary/ui/SummarizationSheet.kt | 0 .../ui/TextToSpeechControls.kt | 0 .../ui/VideoSummarizationScreen.kt | 0 .../samples/geminivideosummary/util/VideoList.kt | 0 .../viewmodel/VideoSummarizationViewModel.kt | 0 .../GenAIImageDescriptionScreen.kt | 0 .../GenAIImageDescriptionViewModel.kt | 0 .../GenAISummarizationScreen.kt | 0 .../GenAISummarizationViewModel.kt | 0 .../GenAIWritingAssistanceScreen.kt | 0 .../GenAIWritingAssistanceViewModel.kt | 0 .../data/ImagenEditingDataSource.kt | 0 .../imagenediting/ui/ImagenEditingMaskEditor.kt | 0 .../imagenediting/ui/ImagenEditingScreen.kt | 0 .../imagenediting/ui/ImagenEditingUIState.kt | 0 .../imagenediting/ui/ImagenEditingViewModel.kt | 0 .../ai/samples/imagen/data/ImagenDataSource.kt | 0 .../ai/samples/imagen/ui/GeneratedContent.kt | 0 .../ai/samples/imagen/ui/GenerationInput.kt | 0 .../android/ai/samples/imagen/ui/ImagenScreen.kt | 0 .../ai/samples/imagen/ui/ImagenUIState.kt | 0 .../ai/samples/imagen/ui/ImagenViewModel.kt | 0 .../magicselfie/data/MagicSelfieRepository.kt | 0 .../ai/samples/magicselfie/ui/ImageUtils.kt | 0 .../samples/magicselfie/ui/MagicSelfieScreen.kt | 0 .../samples/magicselfie/ui/MagicSelfieUiState.kt | 0 .../magicselfie/ui/MagicSelfieViewModel.kt | 0 settings.gradle.kts | 1 + .../com/android/ai/theme/Color.kt | 0 .../com/android/ai/theme/Theme.kt | 0 .../com/android/ai/theme/Type.kt | 0 .../com/android/ai/uicomponent/Buttons.kt | 0 .../com/android/ai/uicomponent/ImageInput.kt | 0 .../com/android/ai/uicomponent/MarkdownText.kt | 0 .../com/android/ai/uicomponent/Message.kt | 0 .../ai/uicomponent/SampleDetailTopAppBar.kt | 0 .../com/android/ai/uicomponent/SeeCodeButton.kt | 0 .../android/ai/uicomponent/SelectionDropdown.kt | 0 .../com/android/ai/uicomponent/Tag.kt | 0 .../com/android/ai/uicomponent/TextInput.kt | 0 .../com/android/ai/uicomponent/VideoPlayer.kt | 0 79 files changed, 17 insertions(+), 6 deletions(-) rename app/src/main/{java => kotlin}/com/android/ai/catalog/CatalogApplication.kt (100%) rename app/src/main/{java => kotlin}/com/android/ai/catalog/MainActivity.kt (100%) rename app/src/main/{java => kotlin}/com/android/ai/catalog/domain/SampleCatalog.kt (100%) rename app/src/main/{java => kotlin}/com/android/ai/catalog/ui/CatalogApp.kt (100%) rename app/src/main/{java => kotlin}/com/android/ai/catalog/ui/CatalogRowCard.kt (100%) rename app/src/main/{java => kotlin}/com/android/ai/catalog/ui/CatalogWideCard.kt (100%) rename samples/gemini-chatbot/src/main/{java => kotlin}/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt (100%) rename samples/gemini-chatbot/src/main/{java => kotlin}/com/android/ai/samples/geminichatbot/GeminiChatbotViewModel.kt (100%) rename samples/gemini-image-chat/src/main/{java => kotlin}/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt (100%) rename samples/gemini-image-chat/src/main/{java => kotlin}/com/android/ai/samples/geminiimagechat/GeminiImageChatViewModel.kt (100%) rename samples/gemini-image-chat/src/main/{java => kotlin}/com/android/ai/samples/util/BitmapUtils.kt (100%) rename samples/gemini-live-todo/src/main/{java => kotlin}/com/android/ai/samples/geminilivetodo/data/Todo.kt (100%) rename samples/gemini-live-todo/src/main/{java => kotlin}/com/android/ai/samples/geminilivetodo/data/TodoRepository.kt (100%) rename samples/gemini-live-todo/src/main/{java => kotlin}/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt (100%) rename samples/gemini-live-todo/src/main/{java => kotlin}/com/android/ai/samples/geminilivetodo/ui/TodoScreenUiState.kt (100%) rename samples/gemini-live-todo/src/main/{java => kotlin}/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt (100%) rename samples/gemini-multimodal/src/main/{java => kotlin}/com/android/ai/samples/geminimultimodal/data/GeminiDataSource.kt (100%) rename samples/gemini-multimodal/src/main/{java => kotlin}/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt (100%) rename samples/gemini-multimodal/src/main/{java => kotlin}/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalUiState.kt (100%) rename samples/gemini-multimodal/src/main/{java => kotlin}/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalViewModel.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/GenerateAccountTags.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/GenerateChapters.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/GenerateDescription.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/GenerateHashtags.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/GenerateLinks.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/GenerateThumbnails.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/player/ExtractHDRThumbnails.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/player/VideoPlayer.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/player/VideoSelectionDropdown.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/ui/MetadataButtonRow.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/ui/MetadataComponents.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/ui/VideoMetadataCreationScreen.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/util/VideoList.kt (100%) rename samples/gemini-video-metadata-creation/src/main/{java => kotlin}/com/android/ai/samples/geminivideometadatacreation/viewmodel/VideoMetadataCreationViewModel.kt (100%) rename samples/gemini-video-summarization/src/main/{java => kotlin}/com/android/ai/samples/geminivideosummary/ui/OutputTextDisplay.kt (100%) rename samples/gemini-video-summarization/src/main/{java => kotlin}/com/android/ai/samples/geminivideosummary/ui/SummarizationSheet.kt (100%) rename samples/gemini-video-summarization/src/main/{java => kotlin}/com/android/ai/samples/geminivideosummary/ui/TextToSpeechControls.kt (100%) rename samples/gemini-video-summarization/src/main/{java => kotlin}/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt (100%) rename samples/gemini-video-summarization/src/main/{java => kotlin}/com/android/ai/samples/geminivideosummary/util/VideoList.kt (100%) rename samples/gemini-video-summarization/src/main/{java => kotlin}/com/android/ai/samples/geminivideosummary/viewmodel/VideoSummarizationViewModel.kt (100%) rename samples/genai-image-description/src/main/{java => kotlin}/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt (100%) rename samples/genai-image-description/src/main/{java => kotlin}/com/android/ai/samples/genai_image_description/GenAIImageDescriptionViewModel.kt (100%) rename samples/genai-summarization/src/main/{java => kotlin}/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt (100%) rename samples/genai-summarization/src/main/{java => kotlin}/com/android/ai/samples/genai_summarization/GenAISummarizationViewModel.kt (100%) rename samples/genai-writing-assistance/src/main/{java => kotlin}/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt (100%) rename samples/genai-writing-assistance/src/main/{java => kotlin}/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt (100%) rename samples/imagen-editing/src/main/{java => kotlin}/com/android/ai/samples/imagenediting/data/ImagenEditingDataSource.kt (100%) rename samples/imagen-editing/src/main/{java => kotlin}/com/android/ai/samples/imagenediting/ui/ImagenEditingMaskEditor.kt (100%) rename samples/imagen-editing/src/main/{java => kotlin}/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt (100%) rename samples/imagen-editing/src/main/{java => kotlin}/com/android/ai/samples/imagenediting/ui/ImagenEditingUIState.kt (100%) rename samples/imagen-editing/src/main/{java => kotlin}/com/android/ai/samples/imagenediting/ui/ImagenEditingViewModel.kt (100%) rename samples/imagen/src/main/{java => kotlin}/com/android/ai/samples/imagen/data/ImagenDataSource.kt (100%) rename samples/imagen/src/main/{java => kotlin}/com/android/ai/samples/imagen/ui/GeneratedContent.kt (100%) rename samples/imagen/src/main/{java => kotlin}/com/android/ai/samples/imagen/ui/GenerationInput.kt (100%) rename samples/imagen/src/main/{java => kotlin}/com/android/ai/samples/imagen/ui/ImagenScreen.kt (100%) rename samples/imagen/src/main/{java => kotlin}/com/android/ai/samples/imagen/ui/ImagenUIState.kt (100%) rename samples/imagen/src/main/{java => kotlin}/com/android/ai/samples/imagen/ui/ImagenViewModel.kt (100%) rename samples/magic-selfie/src/main/{java => kotlin}/com/android/ai/samples/magicselfie/data/MagicSelfieRepository.kt (100%) rename samples/magic-selfie/src/main/{java => kotlin}/com/android/ai/samples/magicselfie/ui/ImageUtils.kt (100%) rename samples/magic-selfie/src/main/{java => kotlin}/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt (100%) rename samples/magic-selfie/src/main/{java => kotlin}/com/android/ai/samples/magicselfie/ui/MagicSelfieUiState.kt (100%) rename samples/magic-selfie/src/main/{java => kotlin}/com/android/ai/samples/magicselfie/ui/MagicSelfieViewModel.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/theme/Color.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/theme/Theme.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/theme/Type.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/uicomponent/Buttons.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/uicomponent/ImageInput.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/uicomponent/MarkdownText.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/uicomponent/Message.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/uicomponent/SampleDetailTopAppBar.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/uicomponent/SeeCodeButton.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/uicomponent/SelectionDropdown.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/uicomponent/Tag.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/uicomponent/TextInput.kt (100%) rename ui-component/src/main/{java => kotlin}/com/android/ai/uicomponent/VideoPlayer.kt (100%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2db16161..60e7f7a4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,27 +5,31 @@ + tools:targetApi="31"> + + + android:theme="@style/Theme.AISampleCatalog" + android:windowSoftInputMode="adjustResize"> + Date: Tue, 13 Jan 2026 16:52:35 +0100 Subject: [PATCH 09/16] Add basic startup benchmark --- app/build.gradle.kts | 6 ++ benchmark/build.gradle.kts | 70 +++++++++++++++++++ benchmark/src/main/AndroidManifest.xml | 1 + .../ai/catalog/benchmark/StartupBenchmark.kt | 40 +++++++++++ gradle/libs.versions.toml | 10 +-- 5 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 benchmark/build.gradle.kts create mode 100644 benchmark/src/main/AndroidManifest.xml create mode 100644 benchmark/src/main/kotlin/com/android/ai/catalog/benchmark/StartupBenchmark.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d2185ecd..c111dba6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -51,6 +51,12 @@ android { getDefaultProguardFile("proguard-android-optimize.txt"), ) } + create("benchmark") { + initWith(buildTypes.getByName("release")) + signingConfig = signingConfigs.getByName("debug") + matchingFallbacks += listOf("release") + isDebuggable = false + } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 diff --git a/benchmark/build.gradle.kts b/benchmark/build.gradle.kts new file mode 100644 index 00000000..f73e49d0 --- /dev/null +++ b/benchmark/build.gradle.kts @@ -0,0 +1,70 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +plugins { + alias(libs.plugins.android.test) + alias(libs.plugins.jetbrains.kotlin.android) +} + +android { + namespace = "com.android.ai.catalog.benchmark" + compileSdk { + version = release(36) + } + + defaultConfig { + minSdk = 24 + targetSdk = 36 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + // This benchmark buildType is used for benchmarking, and should function like your + // release build (for example, with minification on). It"s signed with a debug key + // for easy local/CI testing. + create("benchmark") { + isDebuggable = true + signingConfig = getByName("debug").signingConfig + matchingFallbacks += listOf("release") + } + } + + targetProjectPath = ":app" + experimentalProperties["android.experimental.self-instrumenting"] = true + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlin { + compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } + } +} + +dependencies { + implementation(libs.androidx.junit) + implementation(libs.androidx.espresso.core) + implementation(libs.androidx.uiautomator) + implementation(libs.androidx.benchmark.macro.junit4) +} + +androidComponents { + beforeVariants(selector().all()) { + it.enable = it.buildType == "benchmark" + } +} diff --git a/benchmark/src/main/AndroidManifest.xml b/benchmark/src/main/AndroidManifest.xml new file mode 100644 index 00000000..227314ee --- /dev/null +++ b/benchmark/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/benchmark/src/main/kotlin/com/android/ai/catalog/benchmark/StartupBenchmark.kt b/benchmark/src/main/kotlin/com/android/ai/catalog/benchmark/StartupBenchmark.kt new file mode 100644 index 00000000..fe230ce7 --- /dev/null +++ b/benchmark/src/main/kotlin/com/android/ai/catalog/benchmark/StartupBenchmark.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.ai.catalog.benchmark + +import androidx.benchmark.macro.StartupMode +import androidx.benchmark.macro.StartupTimingMetric +import androidx.benchmark.macro.junit4.MacrobenchmarkRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class StartupBenchmark { + @get:Rule + val benchmarkRule = MacrobenchmarkRule() + + @Test + fun startup() = benchmarkRule.measureRepeated( + packageName = "com.android.ai.catalog", + metrics = listOf(StartupTimingMetric()), + iterations = 5, + startupMode = StartupMode.COLD, + ) { + startApp(packageName) + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9ee94171..4b016b99 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,6 +2,7 @@ activityCompose = "1.12.2" agp = "8.13.2" appcompat = "1.7.1" +benchmarkMacroJunit4 = "1.5.0-alpha01" coilCompose = "3.3.0" composeBom = "2025.12.01" coreKtx = "1.17.0" @@ -35,12 +36,12 @@ uiTextGoogleFonts = "1.10.0" uiTooling = "1.10.0" uiToolingPreview = "1.10.0" uiToolingPreviewAndroid = "1.10.0" -uiautomator = "2.2.0" -benchmarkMacroJunit4 = "1.2.0-beta01" +uiautomator = "2.4.0-alpha07" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +androidx-benchmark-macro-junit4 = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "benchmarkMacroJunit4" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } @@ -67,6 +68,7 @@ androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-man androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } androidx-ui-tooling-preview-android = { group = "androidx.compose.ui", name = "ui-tooling-preview-android", version.ref = "uiToolingPreviewAndroid" } +androidx-uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" } coil-compose = { module = "io.coil-kt.coil3:coil-compose", version.ref = "coilCompose" } firebase-ai = { group = "com.google.firebase", name = "firebase-ai" } firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" } @@ -86,12 +88,11 @@ richtext-commonmark = { group = "com.halilibo.compose-richtext", name = "richtex richtext-material3 = { group = "com.halilibo.compose-richtext", name = "richtext-ui-material3", version.ref = "richtext" } ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "uiTooling" } ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "uiToolingPreview" } -androidx-uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" } -androidx-benchmark-macro-junit4 = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "benchmarkMacroJunit4" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } +android-test = { id = "com.android.test", version.ref = "agp" } compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } google-gms-google-services = { id = "com.google.gms.google-services", version.ref = "googleGmsGoogleServices" } hilt-plugin = { id = "com.google.dagger.hilt.android", version.ref = "hilt"} @@ -99,4 +100,3 @@ jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } -android-test = { id = "com.android.test", version.ref = "agp" } From 992fd5f30703864df2a24802609f804dcd809576 Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Tue, 13 Jan 2026 16:59:25 +0100 Subject: [PATCH 10/16] Unique namespaces for all modules --- samples/genai-image-description/build.gradle.kts | 2 +- .../genai_image_description/GenAIImageDescriptionScreen.kt | 3 +-- .../genai_image_description/GenAIImageDescriptionViewModel.kt | 2 +- samples/genai-summarization/build.gradle.kts | 2 +- .../ai/samples/genai_summarization/GenAISummarizationScreen.kt | 2 +- .../samples/genai_summarization/GenAISummarizationViewModel.kt | 2 +- samples/genai-writing-assistance/build.gradle.kts | 2 +- .../genai_writing_assistance/GenAIWritingAssistanceScreen.kt | 2 +- .../GenAIWritingAssistanceViewModel.kt | 2 +- 9 files changed, 9 insertions(+), 10 deletions(-) diff --git a/samples/genai-image-description/build.gradle.kts b/samples/genai-image-description/build.gradle.kts index 248a1666..9a8c992f 100644 --- a/samples/genai-image-description/build.gradle.kts +++ b/samples/genai-image-description/build.gradle.kts @@ -24,7 +24,7 @@ plugins { } android { - namespace = "com.android.ai.samples.geminimultimodal" + namespace = "com.android.ai.samples.imagedescription" compileSdk = 36 buildFeatures { diff --git a/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt b/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt index 3018fc43..7bdafef6 100644 --- a/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt +++ b/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt @@ -56,9 +56,8 @@ import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.lifecycle.viewmodel.compose.viewModel import coil3.compose.AsyncImage -import com.android.ai.samples.geminimultimodal.R +import com.android.ai.samples.imagedescription.R import com.android.ai.theme.AISampleCatalogTheme import com.android.ai.theme.extendedColorScheme import com.android.ai.uicomponent.GenerateButton diff --git a/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionViewModel.kt b/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionViewModel.kt index 6e5ef445..06297d69 100644 --- a/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionViewModel.kt +++ b/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionViewModel.kt @@ -22,7 +22,7 @@ import android.util.Log import androidx.annotation.StringRes import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope -import com.android.ai.samples.geminimultimodal.R +import com.android.ai.samples.imagedescription.R import com.google.mlkit.genai.common.DownloadCallback import com.google.mlkit.genai.common.FeatureStatus import com.google.mlkit.genai.common.GenAiException diff --git a/samples/genai-summarization/build.gradle.kts b/samples/genai-summarization/build.gradle.kts index 0842bd2e..584e851f 100644 --- a/samples/genai-summarization/build.gradle.kts +++ b/samples/genai-summarization/build.gradle.kts @@ -24,7 +24,7 @@ plugins { } android { - namespace = "com.android.ai.samples.geminimultimodal" + namespace = "com.android.ai.samples.summarization" compileSdk = 36 buildFeatures { diff --git a/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt b/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt index 00a33940..6b08bb89 100644 --- a/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt +++ b/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt @@ -53,7 +53,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.android.ai.samples.geminimultimodal.R +import com.android.ai.samples.summarization.R import com.android.ai.theme.AISampleCatalogTheme import com.android.ai.theme.surfaceContainerHighestLight import com.android.ai.uicomponent.BackButton diff --git a/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationViewModel.kt b/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationViewModel.kt index e3f30e43..310f15fd 100644 --- a/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationViewModel.kt +++ b/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationViewModel.kt @@ -19,7 +19,7 @@ import android.app.Application import android.util.Log import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope -import com.android.ai.samples.geminimultimodal.R +import com.android.ai.samples.summarization.R import com.google.mlkit.genai.common.DownloadCallback import com.google.mlkit.genai.common.FeatureStatus import com.google.mlkit.genai.common.GenAiException diff --git a/samples/genai-writing-assistance/build.gradle.kts b/samples/genai-writing-assistance/build.gradle.kts index 6fc022d1..3b1dc04a 100644 --- a/samples/genai-writing-assistance/build.gradle.kts +++ b/samples/genai-writing-assistance/build.gradle.kts @@ -24,7 +24,7 @@ plugins { } android { - namespace = "com.android.ai.samples.geminimultimodal" + namespace = "com.android.ai.samples.writingassistance" compileSdk = 36 buildFeatures { diff --git a/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt b/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt index 33f525bb..e8037c6f 100644 --- a/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt +++ b/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt @@ -63,7 +63,7 @@ import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.android.ai.samples.geminimultimodal.R +import com.android.ai.samples.writingassistance.R import com.android.ai.theme.AISampleCatalogTheme import com.android.ai.theme.surfaceContainerHighestLight import com.android.ai.uicomponent.GenerateButton diff --git a/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt b/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt index 6f47ab7d..16e8a966 100644 --- a/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt +++ b/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt @@ -21,7 +21,7 @@ import android.util.Log import androidx.annotation.StringRes import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope -import com.android.ai.samples.geminimultimodal.R +import com.android.ai.samples.writingassistance.R import com.google.mlkit.genai.common.DownloadCallback import com.google.mlkit.genai.common.FeatureStatus import com.google.mlkit.genai.common.GenAiException From 4fe2c461005daa15e452e5ae1fd40aa97d6520e4 Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Wed, 14 Jan 2026 17:03:35 +0100 Subject: [PATCH 11/16] Address CI findings --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 7374a015..285b75e3 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -48,7 +48,7 @@ jobs: uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: 🤖 Apply Spotless formatting - file_pattern: '**/*.kt **/*.kts **/*.java **/*.xml' + file_pattern: '**/*.kt **/*.kts **/*.xml' - name: Build debug APK run: ./gradlew assembleDebug --no-configuration-cache From abb1ac99cf34f5774fdd8261192c247b771a0434 Mon Sep 17 00:00:00 2001 From: keyboardsurfer <336005+keyboardsurfer@users.noreply.github.com> Date: Wed, 14 Jan 2026 16:17:07 +0000 Subject: [PATCH 12/16] =?UTF-8?q?=F0=9F=A4=96=20Apply=20Spotless=20formatt?= =?UTF-8?q?ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- benchmark/build.gradle.kts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/benchmark/build.gradle.kts b/benchmark/build.gradle.kts index f73e49d0..278c1017 100644 --- a/benchmark/build.gradle.kts +++ b/benchmark/build.gradle.kts @@ -1,3 +1,18 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ import org.jetbrains.kotlin.gradle.dsl.JvmTarget /* From b0f5c1be63bcf3675ec43906e0e7f0416bb1cdad Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Thu, 15 Jan 2026 10:34:28 +0100 Subject: [PATCH 13/16] Update README source links --- samples/gemini-live-todo/README.md | 2 +- samples/gemini-multimodal/README.md | 4 ++-- samples/gemini-video-metadata-creation/README.md | 2 +- samples/gemini-video-summarization/README.md | 2 +- samples/genai-image-description/README.md | 2 +- samples/genai-summarization/README.md | 2 +- samples/genai-writing-assistance/README.md | 4 ++-- samples/imagen-editing/README.md | 4 ++-- samples/imagen/README.md | 4 ++-- samples/magic-selfie/README.md | 4 ++-- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/samples/gemini-live-todo/README.md b/samples/gemini-live-todo/README.md index 617c226e..4a90bbbb 100644 --- a/samples/gemini-live-todo/README.md +++ b/samples/gemini-live-todo/README.md @@ -12,7 +12,7 @@ This sample demonstrates how to use the Gemini Live API for real-time, voice-bas ## How it works -The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Gemini Flash. The core logic is in the [`TodoScreenViewModel.kt`](./src/main/java/com/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt) file. A `liveModel` is initialized with a set of function declarations (`addTodo`, `removeTodo`, `toggleTodoStatus`, `getTodoList`) that allow the model to interact with the ToDo list. When the user starts a voice conversation, the model processes the spoken commands and executes the corresponding functions to manage the tasks. +The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Gemini Flash. The core logic is in the [`TodoScreenViewModel.kt`](./src/main/kotlincom/android/ai/samples/geminilivetodo/ui/TodoScreenViewModel.kt) file. A `liveModel` is initialized with a set of function declarations (`addTodo`, `removeTodo`, `toggleTodoStatus`, `getTodoList`) that allow the model to interact with the ToDo list. When the user starts a voice conversation, the model processes the spoken commands and executes the corresponding functions to manage the tasks. Here is the key snippet of code that initializes the model and connects to a live session: diff --git a/samples/gemini-multimodal/README.md b/samples/gemini-multimodal/README.md index 58ca3459..0de50595 100644 --- a/samples/gemini-multimodal/README.md +++ b/samples/gemini-multimodal/README.md @@ -12,7 +12,7 @@ This sample demonstrates a multimodal (image and text) prompt, using the Gemini ## How it works -The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Gemini Flash. The core logic is in the [`GeminiDataSource.kt`](./src/main/java/com/android/ai/samples/geminimultimodal/data/GeminiDataSource.kt) file. A `generativeModel` is initialized, and then a `chat` session is started from it. When a user provides an image and a text prompt, they are combined into a multimodal prompt and sent to the model, which then generates a text response. +The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Gemini Flash. The core logic is in the [`GeminiDataSource.kt`](./src/main/kotlincom/android/ai/samples/geminimultimodal/data/GeminiDataSource.kt) file. A `generativeModel` is initialized, and then a `chat` session is started from it. When a user provides an image and a text prompt, they are combined into a multimodal prompt and sent to the model, which then generates a text response. Here is the key snippet of code that initializes the generative model: @@ -36,7 +36,7 @@ private val generativeModel by lazy { } ``` -Here is the key snippet of code that calls the [`generateText`](./src/main/java/com/android/ai/samples/geminimultimodal/data/GeminiDataSource.kt) function: +Here is the key snippet of code that calls the [`generateText`](./src/main/kotlincom/android/ai/samples/geminimultimodal/data/GeminiDataSource.kt) function: ```kotlin suspend fun generateText(bitmap: Bitmap, prompt: String): String { diff --git a/samples/gemini-video-metadata-creation/README.md b/samples/gemini-video-metadata-creation/README.md index 2fd9c2ba..15acfe66 100644 --- a/samples/gemini-video-metadata-creation/README.md +++ b/samples/gemini-video-metadata-creation/README.md @@ -12,7 +12,7 @@ This sample demonstrates how to generate various types of video metadata (descri ## How it works -The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Gemini Flash. The core logic involves several functions (e.g., [`generateDescription`](./src/main/java/com/android/ai/samples/geminivideometadatacreation/GenerateDescription.kt), `generateHashtags`, `generateChapters`, `generateAccountTags`, `generateLinks`, `generateThumbnails`) that send video content to the Gemini API for analysis. The model processes the video and returns structured metadata based on the specific prompt. +The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Gemini Flash. The core logic involves several functions (e.g., [`generateDescription`](./src/main/kotlincom/android/ai/samples/geminivideometadatacreation/GenerateDescription.kt), `generateHashtags`, `generateChapters`, `generateAccountTags`, `generateLinks`, `generateThumbnails`) that send video content to the Gemini API for analysis. The model processes the video and returns structured metadata based on the specific prompt. Here is a key snippet of code that generates a video description: diff --git a/samples/gemini-video-summarization/README.md b/samples/gemini-video-summarization/README.md index 23c54b57..4b6cc79e 100644 --- a/samples/gemini-video-summarization/README.md +++ b/samples/gemini-video-summarization/README.md @@ -12,7 +12,7 @@ This sample demonstrates how to generate a text summary of a video using Gemini ## How it works -The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Gemini Flash. The core logic is in the [`VideoSummarizationViewModel.kt`](./src/main/java/com/android/ai/samples/geminivideosummary/viewmodel/VideoSummarizationViewModel.kt) file. A `generativeModel` is initialized. When a user requests a summary, the video content and a text prompt are sent to the model, which then generates a text summary. +The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Gemini Flash. The core logic is in the [`VideoSummarizationViewModel.kt`](./src/main/kotlincom/android/ai/samples/geminivideosummary/viewmodel/VideoSummarizationViewModel.kt) file. A `generativeModel` is initialized. When a user requests a summary, the video content and a text prompt are sent to the model, which then generates a text summary. Here is the key snippet of code that calls the generative model: diff --git a/samples/genai-image-description/README.md b/samples/genai-image-description/README.md index 7737c232..a16657a7 100644 --- a/samples/genai-image-description/README.md +++ b/samples/genai-image-description/README.md @@ -12,7 +12,7 @@ This sample demonstrates how to generate short descriptions of images on-device ## How it works -The application uses the ML Kit GenAI Image Description API to interact with the on-device Gemini Nano model. The core logic is in the [`GenAIImageDescriptionViewModel.kt`](https://github.com/android/ai-samples/blob/main/samples/genai-image-description/src/main/java/com/android/ai/samples/genai_image_description/GenAIImageDescriptionViewModel.kt) file. An `ImageDescriber` client is initialized. When a user provides an image, it's converted to a bitmap and sent to the `runInference` method, which streams back the generated description. +The application uses the ML Kit GenAI Image Description API to interact with the on-device Gemini Nano model. The core logic is in the [`GenAIImageDescriptionViewModel.kt`](https://github.com/android/ai-samples/blob/main/samples/genai-image-description/src/main/kotlincom/android/ai/samples/genai_image_description/GenAIImageDescriptionViewModel.kt) file. An `ImageDescriber` client is initialized. When a user provides an image, it's converted to a bitmap and sent to the `runInference` method, which streams back the generated description. Here is the key snippet of code that calls the generative model: diff --git a/samples/genai-summarization/README.md b/samples/genai-summarization/README.md index f5d07bd2..28f6eba1 100644 --- a/samples/genai-summarization/README.md +++ b/samples/genai-summarization/README.md @@ -14,7 +14,7 @@ This sample demonstrates how to summarize articles and conversations on-device u The application uses the ML Kit GenAI Summarization API to interact with the on-device Gemini Nano model. The core logic is in the `GenAISummarizationViewModel.kt` file. A `Summarizer` client is initialized. When a user provides text, it's passed to the `runInference` method, which streams back the generated summary. -Here is the key snippet of code that calls the generative model from [`GenAISummarizationViewModel.kt`](./src/main/java/com/android/ai/samples/genai_summarization/GenAISummarizationViewModel.kt): +Here is the key snippet of code that calls the generative model from [`GenAISummarizationViewModel.kt`](./src/main/kotlincom/android/ai/samples/genai_summarization/GenAISummarizationViewModel.kt): ```kotlin private suspend fun generateSummarization(summarizer: Summarizer, textToSummarize: String) { diff --git a/samples/genai-writing-assistance/README.md b/samples/genai-writing-assistance/README.md index f1dfff24..2e247921 100644 --- a/samples/genai-writing-assistance/README.md +++ b/samples/genai-writing-assistance/README.md @@ -12,9 +12,9 @@ This sample demonstrates how to proofread and rewrite short content on-device us ## How it works -The application uses the ML Kit GenAI Proofreading and Rewriting APIs to interact with the on-device Gemini Nano model. The core logic is in the [`GenAIWritingAssistanceViewModel.kt`](https://github.com/android/ai-samples/blob/main/samples/genai-writing-assistance/src/main/java/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt) file. `Proofreader` and `Rewriter` clients are initialized. When a user provides text, it's passed to either the `runProofreadingInference` or `runRewritingInference` method, which then returns the polished text. +The application uses the ML Kit GenAI Proofreading and Rewriting APIs to interact with the on-device Gemini Nano model. The core logic is in the [`GenAIWritingAssistanceViewModel.kt`](https://github.com/android/ai-samples/blob/main/samples/genai-writing-assistance/src/main/kotlincom/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt) file. `Proofreader` and `Rewriter` clients are initialized. When a user provides text, it's passed to either the `runProofreadingInference` or `runRewritingInference` method, which then returns the polished text. -Here is the key snippet of code that runs the proofreading inference from [`GenAIWritingAssistanceViewModel.kt`](.src/main/java/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt): +Here is the key snippet of code that runs the proofreading inference from [`GenAIWritingAssistanceViewModel.kt`](.src/main/kotlincom/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceViewModel.kt): ```kotlin private suspend fun runProofreadingInference(textToProofread: String) { diff --git a/samples/imagen-editing/README.md b/samples/imagen-editing/README.md index 04cf41b2..396da0ff 100644 --- a/samples/imagen-editing/README.md +++ b/samples/imagen-editing/README.md @@ -12,9 +12,9 @@ This sample demonstrates how to edit images using the Imagen editing model. User ## How it works -The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Imagen. The core logic is in the [`ImagenEditingDataSource.kt`](https://github.com/android/ai-samples/blob/main/samples/imagen-editing/src/main/java/com/android/ai/samples/imagenediting/data/ImagenEditingDataSource.kt) file. It first generates a base image using the generation model. Then, for editing, it takes the source image, a user-drawn mask, and a text prompt, and sends them to the editing model's `editImage` method to perform inpainting. +The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Imagen. The core logic is in the [`ImagenEditingDataSource.kt`](https://github.com/android/ai-samples/blob/main/samples/imagen-editing/src/main/kotlincom/android/ai/samples/imagenediting/data/ImagenEditingDataSource.kt) file. It first generates a base image using the generation model. Then, for editing, it takes the source image, a user-drawn mask, and a text prompt, and sends them to the editing model's `editImage` method to perform inpainting. -Here is the key snippet of code that performs inpainting from [`ImagenEditingDataSource.kt`](./src/main/java/com/android/ai/samples/imagenediting/data/ImagenEditingDataSource.kt): +Here is the key snippet of code that performs inpainting from [`ImagenEditingDataSource.kt`](./src/main/kotlincom/android/ai/samples/imagenediting/data/ImagenEditingDataSource.kt): ```kotlin @OptIn(PublicPreviewAPI::class) diff --git a/samples/imagen/README.md b/samples/imagen/README.md index 9adfa02e..393269d1 100644 --- a/samples/imagen/README.md +++ b/samples/imagen/README.md @@ -12,9 +12,9 @@ This sample demonstrates how to generate images from text prompts using the Imag ## How it works -The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Imagen. The core logic is in the [`ImagenDataSource.kt`](./src/main/java/com/android/ai/samples/imagen/data/ImagenDataSource.kt) file. An `imagenModel` is initialized with specific generation configurations (e.g., number of images, aspect ratio, image format). When a user provides a text prompt, it's passed to the `generateImages` method, which returns the generated image as a bitmap. +The application uses the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android to interact with Imagen. The core logic is in the [`ImagenDataSource.kt`](./src/main/kotlincom/android/ai/samples/imagen/data/ImagenDataSource.kt) file. An `imagenModel` is initialized with specific generation configurations (e.g., number of images, aspect ratio, image format). When a user provides a text prompt, it's passed to the `generateImages` method, which returns the generated image as a bitmap. -Here is the key snippet of code that calls the generative model from [`ImagenDataSource.kt`](./src/main/java/com/android/ai/samples/imagen/data/ImagenDataSource.kt): +Here is the key snippet of code that calls the generative model from [`ImagenDataSource.kt`](./src/main/kotlincom/android/ai/samples/imagen/data/ImagenDataSource.kt): ```kotlin @OptIn(PublicPreviewAPI::class) diff --git a/samples/magic-selfie/README.md b/samples/magic-selfie/README.md index ef6dcd9c..6b59decf 100644 --- a/samples/magic-selfie/README.md +++ b/samples/magic-selfie/README.md @@ -12,9 +12,9 @@ This sample demonstrates how to create a "magic selfie" by replacing the backgro ## How it works -The application uses two main components. First, the ML Kit Subject Segmentation API processes the user's selfie to create a bitmap containing only the foreground (the person). Second, the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android interacts with the Imagen model to generate a new background image from a user-provided text prompt. Finally, the application combines the foreground bitmap with the newly generated background to create the final magic selfie. The core logic for this process is in the [`MagicSelfieViewModel.kt`](./src/main/java/com/android/ai/samples/magicselfie/ui/MagicSelfieViewModel.kt) and [`MagicSelfieRepository.kt`](./src/main/java/com/android/ai/samples/magicselfie/data/MagicSelfieRepository.kt) files. +The application uses two main components. First, the ML Kit Subject Segmentation API processes the user's selfie to create a bitmap containing only the foreground (the person). Second, the Firebase AI SDK (see [How to run](../../#how-to-run)) for Android interacts with the Imagen model to generate a new background image from a user-provided text prompt. Finally, the application combines the foreground bitmap with the newly generated background to create the final magic selfie. The core logic for this process is in the [`MagicSelfieViewModel.kt`](./src/main/kotlincom/android/ai/samples/magicselfie/ui/MagicSelfieViewModel.kt) and [`MagicSelfieRepository.kt`](./src/main/kotlincom/android/ai/samples/magicselfie/data/MagicSelfieRepository.kt) files. -Here is the key snippet of code that orchestrates the magic selfie creation from [`MagicSelfieViewModel.kt`](./src/main/java/com/android/ai/samples/magicselfie/ui/MagicSelfieViewModel.kt): +Here is the key snippet of code that orchestrates the magic selfie creation from [`MagicSelfieViewModel.kt`](./src/main/kotlincom/android/ai/samples/magicselfie/ui/MagicSelfieViewModel.kt): ```kotlin fun createMagicSelfie(bitmap: Bitmap, prompt: String) { From 4463f8fa8fe15e17962f22c185c2c567be0e5503 Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Thu, 15 Jan 2026 16:18:52 +0100 Subject: [PATCH 14/16] Document StartupBenchmark --- .../android/ai/catalog/benchmark/StartupBenchmark.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/benchmark/src/main/kotlin/com/android/ai/catalog/benchmark/StartupBenchmark.kt b/benchmark/src/main/kotlin/com/android/ai/catalog/benchmark/StartupBenchmark.kt index fe230ce7..ed0220ba 100644 --- a/benchmark/src/main/kotlin/com/android/ai/catalog/benchmark/StartupBenchmark.kt +++ b/benchmark/src/main/kotlin/com/android/ai/catalog/benchmark/StartupBenchmark.kt @@ -23,11 +23,23 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +/** + * Benchmark class to measure the startup timing of the application. + * + * This benchmark uses [MacrobenchmarkRule] to measure the time it takes for the application + * to start up in [StartupMode.COLD] mode. + */ @RunWith(AndroidJUnit4::class) class StartupBenchmark { @get:Rule val benchmarkRule = MacrobenchmarkRule() + /** + * Measures the application startup time. + * + * It runs the benchmark for 5 iterations using [StartupTimingMetric]. + * The application is started in [StartupMode.COLD] mode, ensuring a fresh start for each iteration. + */ @Test fun startup() = benchmarkRule.measureRepeated( packageName = "com.android.ai.catalog", From 36e7a05bd9297090cc2903407499370cfc322bfe Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Thu, 15 Jan 2026 16:21:18 +0100 Subject: [PATCH 15/16] New hilt view model imports --- .../android/ai/samples/geminichatbot/GeminiChatbotScreen.kt | 2 +- .../ai/samples/geminiimagechat/GeminiImageChatScreen.kt | 2 +- .../com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt | 2 +- .../ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt | 2 +- .../samples/geminivideosummary/ui/VideoSummarizationScreen.kt | 2 +- .../genai_image_description/GenAIImageDescriptionScreen.kt | 2 +- .../ai/samples/genai_summarization/GenAISummarizationScreen.kt | 2 +- .../genai_writing_assistance/GenAIWritingAssistanceScreen.kt | 2 +- .../android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt | 3 +-- .../kotlin/com/android/ai/samples/imagen/ui/ImagenScreen.kt | 2 +- 10 files changed, 10 insertions(+), 11 deletions(-) diff --git a/samples/gemini-chatbot/src/main/kotlin/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt b/samples/gemini-chatbot/src/main/kotlin/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt index 9055f74a..ae0bc883 100644 --- a/samples/gemini-chatbot/src/main/kotlin/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt +++ b/samples/gemini-chatbot/src/main/kotlin/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt @@ -47,7 +47,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.ai.theme.AISampleCatalogTheme import com.android.ai.uicomponent.ChatMessage diff --git a/samples/gemini-image-chat/src/main/kotlin/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt b/samples/gemini-image-chat/src/main/kotlin/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt index 2df8f2c4..8c9df6ee 100644 --- a/samples/gemini-image-chat/src/main/kotlin/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt +++ b/samples/gemini-image-chat/src/main/kotlin/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt @@ -61,7 +61,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil3.compose.AsyncImage import com.android.ai.samples.util.loadBitmapWithCorrectOrientation diff --git a/samples/gemini-live-todo/src/main/kotlin/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt b/samples/gemini-live-todo/src/main/kotlin/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt index 17abc4c1..251bc593 100644 --- a/samples/gemini-live-todo/src/main/kotlin/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt +++ b/samples/gemini-live-todo/src/main/kotlin/com/android/ai/samples/geminilivetodo/ui/TodoScreen.kt @@ -60,7 +60,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.ai.samples.geminilivetodo.R import com.android.ai.samples.geminilivetodo.data.Todo diff --git a/samples/gemini-multimodal/src/main/kotlin/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt b/samples/gemini-multimodal/src/main/kotlin/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt index af9e4139..b9bfd2e5 100644 --- a/samples/gemini-multimodal/src/main/kotlin/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt +++ b/samples/gemini-multimodal/src/main/kotlin/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt @@ -60,7 +60,7 @@ import androidx.compose.ui.tooling.preview.Devices.PHONE import androidx.compose.ui.tooling.preview.Devices.TABLET import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.ai.samples.geminimultimodal.R import com.android.ai.theme.AISampleCatalogTheme diff --git a/samples/gemini-video-summarization/src/main/kotlin/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt b/samples/gemini-video-summarization/src/main/kotlin/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt index ad2d53fb..f1df8455 100644 --- a/samples/gemini-video-summarization/src/main/kotlin/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt +++ b/samples/gemini-video-summarization/src/main/kotlin/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt @@ -48,7 +48,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.media3.common.MediaItem import androidx.media3.exoplayer.ExoPlayer diff --git a/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt b/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt index 7bdafef6..fab994f7 100644 --- a/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt +++ b/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt @@ -54,7 +54,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil3.compose.AsyncImage import com.android.ai.samples.imagedescription.R diff --git a/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt b/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt index 6b08bb89..39f57a0b 100644 --- a/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt +++ b/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt @@ -51,7 +51,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.ai.samples.summarization.R import com.android.ai.theme.AISampleCatalogTheme diff --git a/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt b/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt index e8037c6f..6e7828b8 100644 --- a/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt +++ b/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt @@ -61,7 +61,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.ai.samples.writingassistance.R import com.android.ai.theme.AISampleCatalogTheme diff --git a/samples/imagen-editing/src/main/kotlin/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt b/samples/imagen-editing/src/main/kotlin/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt index a4565c8d..a827e250 100644 --- a/samples/imagen-editing/src/main/kotlin/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt +++ b/samples/imagen-editing/src/main/kotlin/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt @@ -54,14 +54,13 @@ import androidx.compose.ui.graphics.ShaderBrush import androidx.compose.ui.graphics.TileMode import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.SoftwareKeyboardController import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.ai.samples.imagenediting.R import com.android.ai.uicomponent.GenerateButton diff --git a/samples/imagen/src/main/kotlin/com/android/ai/samples/imagen/ui/ImagenScreen.kt b/samples/imagen/src/main/kotlin/com/android/ai/samples/imagen/ui/ImagenScreen.kt index 255393ed..5d512293 100644 --- a/samples/imagen/src/main/kotlin/com/android/ai/samples/imagen/ui/ImagenScreen.kt +++ b/samples/imagen/src/main/kotlin/com/android/ai/samples/imagen/ui/ImagenScreen.kt @@ -56,7 +56,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.ai.samples.imagen.R import com.android.ai.theme.AISampleCatalogTheme From 08e7560bc5180fbbd12190ae4f3e98247544a29f Mon Sep 17 00:00:00 2001 From: Ben Weiss Date: Thu, 15 Jan 2026 16:24:04 +0100 Subject: [PATCH 16/16] Remove unneeded annotations and imports --- .../android/ai/samples/geminichatbot/GeminiChatbotScreen.kt | 2 -- .../ai/samples/geminiimagechat/GeminiImageChatScreen.kt | 2 -- .../samples/geminimultimodal/ui/GeminiMultimodalScreen.kt | 4 +--- .../player/ExtractHDRThumbnails.kt | 4 ++-- .../geminivideometadatacreation/player/VideoPlayer.kt | 5 ++--- .../ui/VideoMetadataCreationScreen.kt | 2 -- .../viewmodel/VideoMetadataCreationViewModel.kt | 1 - .../geminivideosummary/ui/VideoSummarizationScreen.kt | 4 +--- .../genai_image_description/GenAIImageDescriptionScreen.kt | 2 -- .../samples/genai_summarization/GenAISummarizationScreen.kt | 3 --- .../GenAIWritingAssistanceScreen.kt | 3 --- .../ai/samples/imagenediting/ui/ImagenEditingScreen.kt | 1 - .../kotlin/com/android/ai/samples/imagen/ui/ImagenScreen.kt | 2 -- .../android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt | 2 -- .../src/main/kotlin/com/android/ai/uicomponent/Buttons.kt | 1 - .../com/android/ai/uicomponent/SampleDetailTopAppBar.kt | 6 +++--- 16 files changed, 9 insertions(+), 35 deletions(-) diff --git a/samples/gemini-chatbot/src/main/kotlin/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt b/samples/gemini-chatbot/src/main/kotlin/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt index ae0bc883..b192d508 100644 --- a/samples/gemini-chatbot/src/main/kotlin/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt +++ b/samples/gemini-chatbot/src/main/kotlin/com/android/ai/samples/geminichatbot/GeminiChatbotScreen.kt @@ -56,7 +56,6 @@ import com.android.ai.uicomponent.MessageList import com.android.ai.uicomponent.SampleDetailTopAppBar import com.android.ai.uicomponent.TextInput -@OptIn(ExperimentalMaterial3Api::class) @Composable fun GeminiChatbotScreen(viewModel: GeminiChatbotViewModel = hiltViewModel()) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -163,7 +162,6 @@ private fun GeminiChatbotScreen(uiState: GeminiChatbotUiState, onSendMessage: (S @PreviewScreenSizes @Composable -@OptIn(ExperimentalMaterial3Api::class) private fun GeminiChatbotScreenPreview() { AISampleCatalogTheme { GeminiChatbotScreen( diff --git a/samples/gemini-image-chat/src/main/kotlin/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt b/samples/gemini-image-chat/src/main/kotlin/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt index 8c9df6ee..2a603e6d 100644 --- a/samples/gemini-image-chat/src/main/kotlin/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt +++ b/samples/gemini-image-chat/src/main/kotlin/com/android/ai/samples/geminiimagechat/GeminiImageChatScreen.kt @@ -76,7 +76,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -@OptIn(ExperimentalMaterial3Api::class) @Composable fun GeminiImageChatScreen(viewModel: GeminiImageChatViewModel = hiltViewModel()) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -243,7 +242,6 @@ private fun GeminiImageChatScreen( @PreviewScreenSizes @Composable -@OptIn(ExperimentalMaterial3Api::class) private fun GeminiImageChatScreenPreview() { AISampleCatalogTheme { GeminiImageChatScreen( diff --git a/samples/gemini-multimodal/src/main/kotlin/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt b/samples/gemini-multimodal/src/main/kotlin/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt index b9bfd2e5..feeb4e40 100644 --- a/samples/gemini-multimodal/src/main/kotlin/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt +++ b/samples/gemini-multimodal/src/main/kotlin/com/android/ai/samples/geminimultimodal/ui/GeminiMultimodalScreen.kt @@ -256,8 +256,8 @@ private fun PromptInput( enabled = uiState !is GeminiMultimodalUiState.Loading && imageUri != null, onClick = { if (imageUri != null) { + @Suppress("DEPRECATION") val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, imageUri) -// val bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(context.contentResolver, imageUri)) onGenerateClick(bitmap, textFieldState.text.toString()) } keyboardController?.hide() @@ -285,7 +285,6 @@ private fun PromptInput( @Preview(name = "Phone", device = PHONE) @Composable -@OptIn(ExperimentalMaterial3Api::class) private fun GeminiMultimodalScreenPreview() { AISampleCatalogTheme { GeminiMultimodalScreen( @@ -301,7 +300,6 @@ private fun GeminiMultimodalScreenPreview() { @Preview(name = "Tablet", device = TABLET) @Composable -@OptIn(ExperimentalMaterial3Api::class) private fun GeminiMultimodalScreenTabletPreview() { AISampleCatalogTheme { GeminiMultimodalScreen( diff --git a/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/player/ExtractHDRThumbnails.kt b/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/player/ExtractHDRThumbnails.kt index 485a5864..e1b5694b 100644 --- a/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/player/ExtractHDRThumbnails.kt +++ b/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/player/ExtractHDRThumbnails.kt @@ -21,7 +21,6 @@ import android.graphics.Bitmap import android.net.Uri import android.os.Build import android.util.Log -import androidx.annotation.OptIn import androidx.media3.common.MediaItem import androidx.media3.common.util.UnstableApi import androidx.media3.transformer.ExperimentalFrameExtractor @@ -38,6 +37,7 @@ import kotlinx.coroutines.withContext * * */ @UnstableApi +@Suppress("DEPRECATION") @SuppressLint("UnsafeOptInUsageError", "NewApi") suspend fun extractFrame(context: Context, videoUri: Uri, timestamps: Long): Bitmap? { val mediaItem = MediaItem.fromUri(videoUri) @@ -71,10 +71,10 @@ suspend fun extractFrame(context: Context, videoUri: Uri, timestamps: Long): Bit } } -@OptIn(UnstableApi::class) suspend fun extractListOfThumbnails(context: Context, videoUri: Uri, timestamps: List): List { return withContext(Dispatchers.IO) { timestamps.mapNotNull { timestamp -> + @UnstableApi extractFrame(context, videoUri, timestamp) } } diff --git a/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/player/VideoPlayer.kt b/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/player/VideoPlayer.kt index 44f28cec..2124f27c 100644 --- a/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/player/VideoPlayer.kt +++ b/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/player/VideoPlayer.kt @@ -15,7 +15,6 @@ */ package com.android.ai.samples.geminivideometadatacreation.player -import androidx.annotation.OptIn import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding @@ -42,7 +41,7 @@ import com.android.ai.samples.geminivideometadatacreation.R /* * A Composable function that displays video using ExoPlayer within a PlayerView in Jetpack Compose. */ -@OptIn(UnstableApi::class) // New Media3 Compose artifact is currently experimental +@UnstableApi @Composable fun VideoPlayer(player: Player?, modifier: Modifier = Modifier) { @@ -72,7 +71,7 @@ fun VideoPlayer(player: Player?, modifier: Modifier = Modifier) { } } -@OptIn(UnstableApi::class) // New Media3 Compose artifact is currently experimental +@UnstableApi @Composable fun PlayPauseButton(player: Player?, modifier: Modifier = Modifier) { if (player == null) return diff --git a/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/ui/VideoMetadataCreationScreen.kt b/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/ui/VideoMetadataCreationScreen.kt index 2ff74764..81315407 100644 --- a/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/ui/VideoMetadataCreationScreen.kt +++ b/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/ui/VideoMetadataCreationScreen.kt @@ -68,7 +68,6 @@ import com.android.ai.uicomponent.VideoPlayer * This screen allows users to select a video, play it, and generate metadata of its content * using Firebase AI. It also provides text-to-speech functionality to read out */ -@OptIn(ExperimentalMaterial3Api::class) @Composable fun VideoMetadataCreationScreen(viewModel: VideoMetadataCreationViewModel = hiltViewModel()) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -213,7 +212,6 @@ private fun MetadataCreationSection( } @Preview -@OptIn(ExperimentalMaterial3Api::class) @Composable fun VideoMetadataCreationScreenPreview() { VideoMetadataCreationScreen( diff --git a/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/viewmodel/VideoMetadataCreationViewModel.kt b/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/viewmodel/VideoMetadataCreationViewModel.kt index d06b6f37..88ca4a32 100644 --- a/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/viewmodel/VideoMetadataCreationViewModel.kt +++ b/samples/gemini-video-metadata-creation/src/main/kotlin/com/android/ai/samples/geminivideometadatacreation/viewmodel/VideoMetadataCreationViewModel.kt @@ -57,7 +57,6 @@ class VideoMetadataCreationViewModel @Inject constructor(private val application private val _uiState = MutableStateFlow(VideoMetadataCreationState()) val uiState: StateFlow = _uiState.asStateFlow() - @OptIn(UnstableApi::class) fun generateMetadata(metadataType: MetadataType) { val videoUri = _uiState.value.selectedVideoUri ?: return // Since we will start an async call, show a progressbar diff --git a/samples/gemini-video-summarization/src/main/kotlin/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt b/samples/gemini-video-summarization/src/main/kotlin/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt index f1df8455..e7cfdc93 100644 --- a/samples/gemini-video-summarization/src/main/kotlin/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt +++ b/samples/gemini-video-summarization/src/main/kotlin/com/android/ai/samples/geminivideosummary/ui/VideoSummarizationScreen.kt @@ -73,7 +73,7 @@ import com.google.com.android.ai.samples.geminivideosummary.R * This screen allows users to select a video, play it, and generate a summary of its content * using Firebase AI. It also provides text-to-speech functionality to read out */ -@OptIn(ExperimentalMaterial3Api::class) + @Composable fun VideoSummarizationScreen(viewModel: VideoSummarizationViewModel = hiltViewModel()) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -192,7 +192,6 @@ private fun VideoSummarizationScreen( } } -@OptIn(ExperimentalMaterial3Api::class) @Composable private fun SummarizationSection( uiState: VideoSummarizationState, @@ -284,7 +283,6 @@ private fun SummarizationSection( @PreviewScreenSizes @Composable -@OptIn(ExperimentalMaterial3Api::class) private fun VideoSummarizationScreenPreview() { AISampleCatalogTheme { VideoSummarizationScreen( diff --git a/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt b/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt index fab994f7..5770a874 100644 --- a/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt +++ b/samples/genai-image-description/src/main/kotlin/com/android/ai/samples/genai_image_description/GenAIImageDescriptionScreen.kt @@ -65,7 +65,6 @@ import com.android.ai.uicomponent.PrimaryButton import com.android.ai.uicomponent.SampleDetailTopAppBar import com.android.ai.uicomponent.UndoButton -@OptIn(ExperimentalMaterial3Api::class) @Composable fun GenAIImageDescriptionScreen(viewModel: GenAIImageDescriptionViewModel = hiltViewModel()) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -232,7 +231,6 @@ private fun GenAIImageDescriptionScreen( @PreviewScreenSizes @Composable -@OptIn(ExperimentalMaterial3Api::class) private fun GenAIImageDescriptionScreenPreview() { AISampleCatalogTheme { GenAIImageDescriptionScreen( diff --git a/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt b/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt index 39f57a0b..03d26c16 100644 --- a/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt +++ b/samples/genai-summarization/src/main/kotlin/com/android/ai/samples/genai_summarization/GenAISummarizationScreen.kt @@ -30,7 +30,6 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Undo import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text @@ -61,7 +60,6 @@ import com.android.ai.uicomponent.GenerateButton import com.android.ai.uicomponent.SampleDetailTopAppBar import com.android.ai.uicomponent.SecondaryButton -@OptIn(ExperimentalMaterial3Api::class) @Composable fun GenAISummarizationScreen(viewModel: GenAISummarizationViewModel = hiltViewModel()) { val sampleTextOptions = stringArrayResource(R.array.summarization_sample_text) @@ -215,7 +213,6 @@ fun GenAISummarizationContent( } } -@OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun DisplayedText(textToDisplay: String, modifier: Modifier = Modifier, isStatusText: Boolean = false) { Text( diff --git a/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt b/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt index 6e7828b8..4dc0eca9 100644 --- a/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt +++ b/samples/genai-writing-assistance/src/main/kotlin/com/android/ai/samples/genai_writing_assistance/GenAIWritingAssistanceScreen.kt @@ -34,7 +34,6 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Scaffold @@ -72,7 +71,6 @@ import com.android.ai.uicomponent.SecondaryButton import com.android.ai.uicomponent.UndoButton import com.google.mlkit.genai.rewriting.RewriterOptions -@OptIn(ExperimentalMaterial3Api::class) @Composable fun GenAIWritingAssistanceScreen(viewModel: GenAIWritingAssistanceViewModel = hiltViewModel()) { var showRewriteOptionsDialog by rememberSaveable { mutableStateOf(false) } @@ -319,7 +317,6 @@ fun RewriteOptionsDialog(onConfirm: (rewriteStyle: RewriteStyle) -> Unit, onDism } } -@OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun DisplayedText(textToDisplay: String, modifier: Modifier = Modifier, isStatusText: Boolean = false) { Text( diff --git a/samples/imagen-editing/src/main/kotlin/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt b/samples/imagen-editing/src/main/kotlin/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt index a827e250..9114bcc1 100644 --- a/samples/imagen-editing/src/main/kotlin/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt +++ b/samples/imagen-editing/src/main/kotlin/com/android/ai/samples/imagenediting/ui/ImagenEditingScreen.kt @@ -67,7 +67,6 @@ import com.android.ai.uicomponent.GenerateButton import com.android.ai.uicomponent.SampleDetailTopAppBar import com.android.ai.uicomponent.TextInput -@OptIn(ExperimentalMaterial3Api::class) @Composable fun ImagenEditingScreen(viewModel: ImagenEditingViewModel = hiltViewModel()) { val uiState: ImagenEditingUIState by viewModel.uiState.collectAsStateWithLifecycle() diff --git a/samples/imagen/src/main/kotlin/com/android/ai/samples/imagen/ui/ImagenScreen.kt b/samples/imagen/src/main/kotlin/com/android/ai/samples/imagen/ui/ImagenScreen.kt index 5d512293..1b1019bb 100644 --- a/samples/imagen/src/main/kotlin/com/android/ai/samples/imagen/ui/ImagenScreen.kt +++ b/samples/imagen/src/main/kotlin/com/android/ai/samples/imagen/ui/ImagenScreen.kt @@ -64,7 +64,6 @@ import com.android.ai.uicomponent.GenerateButton import com.android.ai.uicomponent.SampleDetailTopAppBar import com.android.ai.uicomponent.TextInput -@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) @Composable fun ImagenScreen(viewModel: ImagenViewModel = hiltViewModel()) { val uiState: ImagenUIState by viewModel.uiState.collectAsStateWithLifecycle() @@ -182,7 +181,6 @@ private fun ImagenScreen(uiState: ImagenUIState, onGenerateClick: (String) -> Un @PreviewScreenSizes @Composable -@OptIn(ExperimentalMaterial3Api::class) private fun ImagenScreenPreview() { AISampleCatalogTheme { ImagenScreen( diff --git a/samples/magic-selfie/src/main/kotlin/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt b/samples/magic-selfie/src/main/kotlin/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt index a67c96d0..6d893f53 100644 --- a/samples/magic-selfie/src/main/kotlin/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt +++ b/samples/magic-selfie/src/main/kotlin/com/android/ai/samples/magicselfie/ui/MagicSelfieScreen.kt @@ -81,7 +81,6 @@ import com.android.ai.uicomponent.SecondaryButton import com.android.ai.uicomponent.TextInput import java.io.File -@OptIn(ExperimentalMaterial3Api::class) @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun MagicSelfieScreen(viewModel: MagicSelfieViewModel = hiltViewModel()) { @@ -269,7 +268,6 @@ private fun MagicSelfieScreen( @PreviewScreenSizes @Composable -@OptIn(ExperimentalMaterial3Api::class) private fun MagicSelfieScreenPreview() { AISampleCatalogTheme { MagicSelfieScreen( diff --git a/ui-component/src/main/kotlin/com/android/ai/uicomponent/Buttons.kt b/ui-component/src/main/kotlin/com/android/ai/uicomponent/Buttons.kt index 20e2e7cd..93a37d81 100644 --- a/ui-component/src/main/kotlin/com/android/ai/uicomponent/Buttons.kt +++ b/ui-component/src/main/kotlin/com/android/ai/uicomponent/Buttons.kt @@ -57,7 +57,6 @@ import androidx.compose.ui.unit.dp import com.android.ai.theme.AISampleCatalogTheme import com.android.ai.theme.Contrast -@OptIn(ExperimentalMaterial3ExpressiveApi::class) @Composable fun PrimaryButton( modifier: Modifier = Modifier diff --git a/ui-component/src/main/kotlin/com/android/ai/uicomponent/SampleDetailTopAppBar.kt b/ui-component/src/main/kotlin/com/android/ai/uicomponent/SampleDetailTopAppBar.kt index 12ed888d..4ee6babd 100644 --- a/ui-component/src/main/kotlin/com/android/ai/uicomponent/SampleDetailTopAppBar.kt +++ b/ui-component/src/main/kotlin/com/android/ai/uicomponent/SampleDetailTopAppBar.kt @@ -96,7 +96,7 @@ fun SampleDetailTopAppBar( ) } -@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Preview(backgroundColor = 0XFF000000, showBackground = true) @Composable fun SampleDetailTopAppBarPreview() { @@ -110,7 +110,7 @@ fun SampleDetailTopAppBarPreview() { } } -@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Preview @Composable fun SampleDetailTopAppBarPreview_CollapseWhenContentIsScrolled() { @@ -143,7 +143,7 @@ fun SampleDetailTopAppBarPreview_CollapseWhenContentIsScrolled() { } } -@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Preview @Composable fun SampleDetailTopAppBarPreview_CollapseWhenToolbarIsScrolled() {