├── .editorconfig ├── .github ├── ci-gradle.properties └── workflows │ └── build_and_test.yml ├── .gitignore ├── .run └── spotlessApply.run.xml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── google-services.json ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── java │ └── com │ │ └── android │ │ └── developers │ │ └── androidify │ │ ├── AndroidifyApplication.kt │ │ ├── MainActivity.kt │ │ └── navigation │ │ ├── ListSaver.kt │ │ ├── MainNavigation.kt │ │ └── NavigationRoutes.kt │ └── res │ ├── drawable │ ├── ic_launcher_background.xml │ ├── ic_launcher_monochrome.xml │ └── splash_androidify.xml │ ├── ic_launcher.png │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.webp │ ├── ic_launcher_foreground.webp │ └── ic_launcher_round.webp │ ├── mipmap-mdpi │ ├── ic_launcher.webp │ ├── ic_launcher_foreground.webp │ └── ic_launcher_round.webp │ ├── mipmap-xhdpi │ ├── ic_launcher.webp │ ├── ic_launcher_foreground.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxhdpi │ ├── ic_launcher.webp │ ├── ic_launcher_foreground.webp │ └── ic_launcher_round.webp │ ├── mipmap-xxxhdpi │ ├── ic_launcher.webp │ ├── ic_launcher_foreground.webp │ └── ic_launcher_round.webp │ ├── mythemedicon.svg │ ├── play_graphic.png │ ├── values-v32 │ └── themes.xml │ ├── values │ ├── colors.xml │ ├── strings.xml │ └── themes.xml │ └── xml │ ├── backup_rules.xml │ ├── data_extraction_rules.xml │ └── file_paths.xml ├── art └── androidify_banner.webp ├── benchmark ├── .gitignore ├── build.gradle.kts └── src │ └── main │ ├── AndroidManifest.xml │ └── kotlin │ └── com │ └── android │ └── developers │ └── androidify │ ├── Utils.kt │ ├── baselineprofile │ └── BaselineProfileGenerator.kt │ └── benchmark │ ├── PromptBenchmark.kt │ └── StartupBenchmark.kt ├── build.gradle.kts ├── core ├── network │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── android │ │ │ └── developers │ │ │ └── androidify │ │ │ ├── RemoteConfigDataSource.kt │ │ │ ├── di │ │ │ └── NetworkModule.kt │ │ │ ├── model │ │ │ └── ImageGenerationModels.kt │ │ │ ├── startup │ │ │ ├── FirebaseAppCheckInitializer.kt │ │ │ ├── FirebaseAppInitializer.kt │ │ │ └── FirebaseRemoteConfigInitializer.kt │ │ │ └── vertexai │ │ │ └── FirebaseAiDataSource.kt │ │ └── res │ │ └── xml │ │ ├── remote_config_defaults.xml │ │ └── startup_initializers.xml ├── testing │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── android │ │ └── developers │ │ └── testing │ │ ├── AndroidifyTestRunner.kt │ │ ├── data │ │ ├── TestFileProvider.kt │ │ ├── TestGeminiNanoGenerationDataSource.kt │ │ └── TestInternetConnectivityManager.kt │ │ ├── network │ │ ├── TestFirebaseAiDataSource.kt │ │ └── TestRemoteConfigDataSource.kt │ │ ├── repository │ │ ├── FakeImageGenerationRepository.kt │ │ └── TestTextGenerationRepository.kt │ │ └── util │ │ └── MainDispatcherRule.kt ├── theme │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── android │ │ │ └── developers │ │ │ └── androidify │ │ │ └── theme │ │ │ ├── Color.kt │ │ │ ├── Motion.kt │ │ │ ├── SharedElementsConfig.kt │ │ │ ├── Theme.kt │ │ │ ├── Type.kt │ │ │ ├── components │ │ │ ├── AnimatingGradientBrush.kt │ │ │ ├── Backgrounds.kt │ │ │ ├── Button.kt │ │ │ ├── GradientAssistElevatedChip.kt │ │ │ ├── ScaleIndication.kt │ │ │ ├── TopAppBar.kt │ │ │ └── VerticalMarquee.kt │ │ │ └── transitions │ │ │ └── ColorSplashTransition.kt │ │ └── res │ │ ├── drawable │ │ ├── decorative_squiggle.xml │ │ ├── decorative_squiggle_2.xml │ │ ├── outline_info_24.xml │ │ ├── photo_camera.xml │ │ ├── rounded_arrow_back_24.xml │ │ ├── rounded_arrow_forward_24.xml │ │ ├── rounded_close_24.xml │ │ ├── shape_home_bg.xml │ │ ├── shape_result_bg.xml │ │ ├── sharp_share_24.xml │ │ └── squiggle.xml │ │ ├── values-v23 │ │ └── font_certs.xml │ │ └── values │ │ └── strings.xml └── util │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── android │ └── developers │ └── androidify │ └── util │ ├── AdaptivePreview.kt │ ├── AnimationUtils.kt │ ├── GraphicsUtils.kt │ ├── LayoutUtils.kt │ └── LocalFileProvider.kt ├── data ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── android │ └── developers │ └── androidify │ └── data │ ├── ConfigProvider.kt │ ├── DataModule.kt │ ├── Exceptions.kt │ ├── GeminiNanoDownloader.kt │ ├── GeminiNanoGenerationDataSource.kt │ ├── ImageGenerationRepository.kt │ ├── InternetConnectivityManager.kt │ └── TextGenerationRepository.kt ├── feature ├── camera │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── android │ │ │ └── developers │ │ │ └── androidify │ │ │ └── camera │ │ │ └── CameraScreenTest.kt │ │ ├── debug │ │ └── screenshotTest │ │ │ └── reference │ │ │ └── com │ │ │ └── android │ │ │ └── developers │ │ │ └── androidify │ │ │ └── camera │ │ │ └── CameraScreenScreenshotTest │ │ │ ├── CameraScreenCannotFlipScreenshot_Cannot Flip Camera_24a71026_0.png │ │ │ ├── CameraScreenMediumHorizontalScreenshot_Medium Horizontal_d8421eca_0.png │ │ │ ├── CameraScreenPoseNotDetectedScreenshot_Pose Not Detected_02190099_0.png │ │ │ ├── CameraScreenRearCamDisabledScreenshot_Rear Camera Button (Disabled)_c5370fe4_0.png │ │ │ ├── CameraScreenRearCamEnabledScreenshot_Rear Camera Button (Enabled)_5de4fe84_0.png │ │ │ ├── CameraScreenScreenshot_Default State_32838ce9_0.png │ │ │ ├── CameraScreenSubcompactHorizontalScreenshot_Subcompact Horizontal_096b7a06_0.png │ │ │ └── CameraScreenTabletopScreenshot_Tabletop Mode_046c4d4b_0.png │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── android │ │ │ │ └── developers │ │ │ │ └── androidify │ │ │ │ └── camera │ │ │ │ ├── CameraCaptureButton.kt │ │ │ │ ├── CameraControls.kt │ │ │ │ ├── CameraDirectionButton.kt │ │ │ │ ├── CameraGuide.kt │ │ │ │ ├── CameraGuideText.kt │ │ │ │ ├── CameraLayout.kt │ │ │ │ ├── CameraScreen.kt │ │ │ │ ├── CameraViewModel.kt │ │ │ │ ├── CameraViewfinder.kt │ │ │ │ ├── CameraZoomToolbar.kt │ │ │ │ ├── CoroutineCameraProvider.kt │ │ │ │ ├── ImageAnalysisExt.kt │ │ │ │ ├── RearCameraButton.kt │ │ │ │ ├── RearCameraUseCase.kt │ │ │ │ └── ZoomState.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── outline_cameraswitch_24.xml │ │ │ └── outline_rear_camera.xml │ │ │ └── values │ │ │ └── strings.xml │ │ └── screenshotTest │ │ └── java │ │ └── com │ │ └── android │ │ └── developers │ │ └── androidify │ │ └── camera │ │ └── CameraScreenScreenshotTest.kt ├── creation │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── android │ │ │ └── developers │ │ │ └── androidify │ │ │ └── creation │ │ │ └── CreationScreenTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── android │ │ │ │ └── developers │ │ │ │ └── androidify │ │ │ │ └── creation │ │ │ │ ├── AndroidBotColorPicker.kt │ │ │ │ ├── CreationScreen.kt │ │ │ │ ├── CreationViewModel.kt │ │ │ │ └── LoadingScreen.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── choose_picture_image.xml │ │ │ ├── gemini_24dp.xml │ │ │ ├── pen_spark_24.xml │ │ │ ├── rounded_check_24.xml │ │ │ ├── rounded_draw_24.xml │ │ │ ├── rounded_photo_24.xml │ │ │ └── rounded_redo_24.xml │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── kotlin │ │ └── com │ │ └── android │ │ └── developers │ │ └── androidify │ │ └── creation │ │ └── CreationViewModelTest.kt ├── home │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── android │ │ │ └── developers │ │ │ └── androidify │ │ │ └── home │ │ │ └── HomeScreenTest.kt │ │ ├── debug │ │ └── screenshotTest │ │ │ └── reference │ │ │ └── com │ │ │ └── android │ │ │ └── developers │ │ │ └── androidify │ │ │ └── home │ │ │ └── HomeScreenScreenshotTest │ │ │ ├── HomeScreenScreenshot_748aa731_0.png │ │ │ ├── HomeScreenScreenshot_Desktop preview_995fc4f1_0.png │ │ │ ├── HomeScreenScreenshot_Foldable preview_aaa67744_0.png │ │ │ ├── HomeScreenScreenshot_Phone preview_d57eb7c3_0.png │ │ │ └── HomeScreenScreenshot_Tablet preview_deda3981_0.png │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── android │ │ │ │ └── developers │ │ │ │ └── androidify │ │ │ │ └── home │ │ │ │ ├── AboutScreen.kt │ │ │ │ ├── AppInactiveScreen.kt │ │ │ │ ├── HomeScreen.kt │ │ │ │ └── HomeViewModel.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── rounded_pause_24.xml │ │ │ └── rounded_play_arrow_24.xml │ │ │ └── values │ │ │ └── strings.xml │ │ └── screenshotTest │ │ └── java │ │ └── com │ │ └── android │ │ └── developers │ │ └── androidify │ │ └── home │ │ └── HomeScreenScreenshotTest.kt └── results │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ ├── androidTest │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── android │ │ └── developers │ │ └── androidify │ │ └── results │ │ └── ResultsScreenTest.kt │ ├── debug │ └── screenshotTest │ │ └── reference │ │ └── com │ │ └── android │ │ └── developers │ │ └── androidify │ │ └── results │ │ └── ResultsScreenScreenshotTest │ │ ├── ResultsScreen_AdaptivePreview_748aa731_0.png │ │ ├── ResultsScreen_AdaptivePreview_Desktop preview_995fc4f1_0.png │ │ ├── ResultsScreen_AdaptivePreview_Foldable preview_aaa67744_0.png │ │ ├── ResultsScreen_AdaptivePreview_Phone preview_d57eb7c3_0.png │ │ ├── ResultsScreen_AdaptivePreview_Tablet preview_deda3981_0.png │ │ ├── ResultsScreen_OriginalInputPreview_748aa731_0.png │ │ ├── ResultsScreen_SmallPreview_748aa731_0.png │ │ └── ResultsScreen_SmallPreview_Phone small preview_d6ff5f5b_0.png │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── android │ │ │ └── developers │ │ │ └── androidify │ │ │ └── results │ │ │ ├── BotResultCard.kt │ │ │ ├── FlippableCard.kt │ │ │ ├── Permissions.kt │ │ │ ├── ResultOption.kt │ │ │ ├── ResultsScreen.kt │ │ │ ├── ResultsViewModel.kt │ │ │ └── ShareAction.kt │ └── res │ │ ├── drawable-nodpi │ │ └── placeholderbot.png │ │ ├── drawable │ │ ├── pen_spark.xml │ │ ├── placeholderbot.png │ │ ├── rounded_download_24.xml │ │ └── shape_result_bg.xml │ │ └── values │ │ └── strings.xml │ ├── screenshotTest │ └── java │ │ └── com │ │ └── android │ │ └── developers │ │ └── androidify │ │ └── results │ │ └── ResultsScreenScreenshotTest.kt │ └── test │ └── kotlin │ └── com │ └── android │ └── developers │ └── androidify │ ├── data │ └── TextGenerationRepositoryImplTest.kt │ └── results │ └── ResultsViewModelTest.kt ├── gradle.properties ├── gradle ├── init.gradle.kts ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── settings.gradle.kts └── spotless ├── copyright.kt ├── copyright.kts └── copyright.xml /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org/ 2 | # This configuration is used by ktlint when spotless invokes it 3 | 4 | [*.{kt,kts}] 5 | ij_kotlin_allow_trailing_comma=true 6 | ij_kotlin_allow_trailing_comma_on_call_site=true 7 | ktlint_function_naming_ignore_when_annotated_with=Composable, Test 8 | ktlint_standard_backing-property-naming = disabled 9 | ktlint_standard_binary-expression-wrapping = disabled 10 | ktlint_standard_chain-method-continuation = disabled 11 | ktlint_standard_class-signature = disabled 12 | ktlint_standard_condition-wrapping = disabled 13 | ktlint_standard_function-expression-body = disabled 14 | ktlint_standard_function-literal = disabled 15 | ktlint_standard_function-type-modifier-spacing = disabled 16 | ktlint_standard_multiline-loop = disabled 17 | ktlint_standard_function-signature = disabled -------------------------------------------------------------------------------- /.github/ci-gradle.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2020 The Android Open Source Project 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # 16 | 17 | org.gradle.daemon=false 18 | org.gradle.parallel=true 19 | org.gradle.jvmargs=-Xmx5120m 20 | org.gradle.workers.max=2 21 | 22 | kotlin.incremental=false 23 | kotlin.compiler.execution.strategy=in-process -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.gradle/buildOutputCleanup/* 2 | /.idea/* 3 | /.gradle/* 4 | /build 5 | /local.properties 6 | .DS_Store 7 | /.kotlin/ 8 | /app/release.keystore 9 | /baselineprofile/build/* 10 | /app/src/release/generated/* 11 | /core/build/ 12 | /feature/build/ 13 | -------------------------------------------------------------------------------- /.run/spotlessApply.run.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 26 | 31 | 33 | true 34 | true 35 | false 36 | 37 | 38 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to contribute 2 | 3 | We'd love to accept your patches and contributions to this project. 4 | Please create a bug report before you begin work on large code changes. 5 | 6 | ## Before you begin 7 | 8 | ### Sign our Contributor License Agreement 9 | 10 | Contributions to this project must be accompanied by a 11 | [Contributor License Agreement](https://cla.developers.google.com/about) (CLA). 12 | You (or your employer) retain the copyright to your contribution; this simply 13 | gives us permission to use and redistribute your contributions as part of the 14 | project. 15 | 16 | If you or your current employer have already signed the Google CLA (even if it 17 | was for a different project), you probably don't need to do it again. 18 | 19 | Visit to see your current agreements or to 20 | sign a new one. 21 | 22 | ### Review our community guidelines 23 | 24 | This project follows 25 | [Google's Open Source Community Guidelines](https://opensource.google/conduct/). 26 | 27 | ## Contribution process 28 | 29 | ### Code reviews 30 | 31 | All submissions, including submissions by project members, require review. We 32 | use GitHub pull requests for this purpose. Consult 33 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more 34 | information on using pull requests. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Androidify on Android 2 | 3 | ![androidify banner](/art/androidify_banner.webp) 4 | 5 | The Android bot is a beloved mascot for Android users and developers, with previous versions of the 6 | bot builder being very popular - we decided that this year we’d rebuild the bot maker from the 7 | ground up, using the latest technology backed by Gemini. Today we are releasing a new open source 8 | app, Androidify, for learning how to build powerful AI driven experiences on Android using the 9 | latest technologies such as Jetpack Compose, Gemini API through Firebase AI Logic SDK, CameraX, and 10 | Navigation 3. 11 | 12 | Note: This app is still under development. This sample app is currently using a standard Imagen 13 | model, but we've been working on a fine-tuned model that's trained specifically on all of the pieces 14 | that make the Android bot cute and fun; we'll share that version later this summer. In the meantime, 15 | don't be surprised if the sample app puts out some interesting looking examples! 16 | 17 | For the full blog post on app, [read here](https://android-developers.googleblog.com/2025/05/androidify-building-ai-driven-experiences-jetpack-compose-gemini-camerax.html). 18 | 19 | ## Under the hood 20 | The app combines a variety of different Google technologies, such as: 21 | * Gemini API - through Firebase AI Logic SDK, for accessing the underlying Imagen and Gemini models. 22 | * Jetpack Compose - for building the UI with delightful animations and making the app adapt to different screen sizes. 23 | * Navigation 3 - the latest navigation library for building up Navigation graphs with Compose. 24 | * CameraX and Media3 Compose - for building up a custom camera with custom UI controls (rear camera support, zoom support, tap-to-focus) and playing the promotional video. 25 | 26 | ## Setup and installation 27 | 28 | 1. Clone the repository. 29 | 2. Create a [Firebase project](https://firebase.google.com/products/firebase-ai-logic) and 30 | generate a `google-services.json` file. 31 | Replace the current placeholder app/google-services.json file with your own json file created 32 | above. Be sure to enable Vertex AI SDK. 33 | Ensure to also enable AppCheck on your Firebase project to prevent API abuse. 34 | 35 | 3. This project makes use of remote config on Firebase too, you can import the [Firebase Remote config](https://firebase.google.com/docs/remote-config) settings from 36 | [`remote_config_defaults.xml`](core/network/src/main/res/xml/remote_config_defaults.xml) 37 | 38 | 4. If you'd like to change the font that the app renders with, an optional spec can be placed in 39 | `~/gradlew/gradle.properties` file: 40 | 41 | ``` 42 | fontName="Roboto Flex" 43 | ``` 44 | 45 | For Googlers, get this info from go/androidify-api-setup 46 | 47 | ## Contributing 48 | 49 | See [Contributing](CONTRIBUTING.md). 50 | 51 | ## License 52 | 53 | Androidify 2.0 is licensed under the [Apache License 2.0](LICENSE). See the `LICENSE` file for 54 | details. 55 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "abc", 4 | "project_id": "YourProjectId", 5 | "storage_bucket": "abc" 6 | }, 7 | "client": [ 8 | { 9 | "client_info": { 10 | "mobilesdk_app_id": "APlaceholderAPIKeyWith-ThirtyNineCharsX", 11 | "android_client_info": { 12 | "package_name": "com.android.developers.androidify" 13 | } 14 | }, 15 | "oauth_client": [], 16 | "api_key": [ 17 | { 18 | "current_key": "APlaceholderAPIKeyWith-ThirtyNineCharsX" 19 | } 20 | ], 21 | "services": { 22 | "appinvite_service": { 23 | "other_platform_oauth_client": [] 24 | } 25 | } 26 | } 27 | ], 28 | "configuration_version": "1" 29 | } 30 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -keep class com.firebase.** { *; } 23 | -keep interface com.firebase.** { *; } 24 | -keep class org.apache.** { *; } 25 | -keepnames class com.fasterxml.jackson.** { *; } 26 | -keepnames class javax.servlet.** { *; } 27 | -keepnames class org.ietf.jgss.** { *; } 28 | -dontwarn org.w3c.dom.** 29 | -dontwarn org.joda.time.** 30 | -dontwarn org.shaded.apache.** 31 | -dontwarn org.ietf.jgss.** 32 | 33 | -keepattributes Signature 34 | -keepattributes *Annotation* 35 | -keepattributes InnerClasses -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/com/android/developers/androidify/AndroidifyApplication.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2025 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.android.developers.androidify 17 | 18 | import android.app.Application 19 | import android.content.pm.ApplicationInfo 20 | import android.os.StrictMode 21 | import android.os.StrictMode.ThreadPolicy.Builder 22 | import coil3.ImageLoader 23 | import coil3.PlatformContext 24 | import coil3.SingletonImageLoader 25 | import dagger.hilt.android.HiltAndroidApp 26 | import javax.inject.Inject 27 | @HiltAndroidApp 28 | class AndroidifyApplication : Application(), SingletonImageLoader.Factory { 29 | 30 | @Inject 31 | lateinit var imageLoader: dagger.Lazy 32 | 33 | override fun onCreate() { 34 | super.onCreate() 35 | setStrictModePolicy() 36 | } 37 | 38 | /** 39 | * Return true if the application is debuggable. 40 | */ 41 | private fun isDebuggable(): Boolean { 42 | return 0 != applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE 43 | } 44 | 45 | /** 46 | * Set a thread policy that detects all potential problems on the main thread, such as network 47 | * and disk access. 48 | * 49 | * If a problem is found, the offending call will be logged and the application will be killed. 50 | */ 51 | private fun setStrictModePolicy() { 52 | if (isDebuggable()) { 53 | StrictMode.setThreadPolicy( 54 | Builder().detectAll().penaltyLog().build(), 55 | ) 56 | } 57 | } 58 | 59 | override fun newImageLoader(context: PlatformContext): ImageLoader { 60 | return imageLoader.get() 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/developers/androidify/MainActivity.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2025 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.android.developers.androidify 17 | 18 | import android.os.Bundle 19 | import androidx.activity.ComponentActivity 20 | import androidx.activity.SystemBarStyle 21 | import androidx.activity.compose.setContent 22 | import androidx.activity.enableEdgeToEdge 23 | import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi 24 | import androidx.compose.ui.graphics.Color 25 | import androidx.compose.ui.graphics.toArgb 26 | import com.android.developers.androidify.navigation.MainNavigation 27 | import com.android.developers.androidify.theme.AndroidifyTheme 28 | import dagger.hilt.android.AndroidEntryPoint 29 | 30 | @ExperimentalMaterial3ExpressiveApi 31 | @AndroidEntryPoint 32 | class MainActivity : ComponentActivity() { 33 | 34 | override fun onCreate(savedInstanceState: Bundle?) { 35 | super.onCreate(savedInstanceState) 36 | 37 | setContent { 38 | AndroidifyTheme { 39 | enableEdgeToEdge( 40 | statusBarStyle = SystemBarStyle.light( 41 | Color.Transparent.toArgb(), 42 | Color.Transparent.toArgb(), 43 | ), 44 | navigationBarStyle = SystemBarStyle.light( 45 | Color.Transparent.toArgb(), 46 | Color.Transparent.toArgb(), 47 | ), 48 | ) 49 | MainNavigation() 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/developers/androidify/navigation/NavigationRoutes.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2025 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * https://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | @file:OptIn(ExperimentalSerializationApi::class) 17 | 18 | package com.android.developers.androidify.navigation 19 | 20 | import kotlinx.serialization.ExperimentalSerializationApi 21 | import kotlinx.serialization.Serializable 22 | 23 | interface NavigationRoute 24 | 25 | @Serializable 26 | data object Home : NavigationRoute 27 | 28 | @Serializable 29 | data class Create(val fileName: String? = null, val prompt: String? = null) : NavigationRoute 30 | 31 | @Serializable 32 | object Camera : NavigationRoute 33 | 34 | @Serializable 35 | object About : NavigationRoute 36 | -------------------------------------------------------------------------------- /app/src/main/res/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/play_graphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/android/androidify/f84eab31ec32e51f2929e846650700f16d3a2687/app/src/main/res/play_graphic.png -------------------------------------------------------------------------------- /app/src/main/res/values-v32/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | #FFBB86FC 19 | #FF6200EE 20 | #FF3700B3 21 | #FF03DAC5 22 | #FF018786 23 | #FF000000 24 | #FFFFFFFF 25 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | Androidify 19 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 |