This sample Android app presents the Giphy trending animated gifs for sharing or download. You can now also search animated gifs by keyword. It was elaborated from the work by Fahri Can in Nov 2021. I migrated the codebase from RxJava to Coroutines, and then from XML Views to Jetpack Compose. The current release is completely different from the original version after these years.
The XML View version is no longer being maintained. You can check out the XML View version branch for that. It was using XML with Data-binding, which we generally believe it to be a bad coding practice by tightly coupling the business logic with the UI.
If you want to try out the app without building it, check out the Releases section where you can find the APK and App Bundles for each major version. A working Giphy API key was applied when building the app, therefore you can test it by just installing it.
Planned enhancements are now logged as issues.
- Kotlin
- MVVM & clean architecture
- Jetpack Compose - Single Activity
- Kotlin Coroutines and Flow
- Dependency Injection using Dagger Hilt
- Material 3 dynamic colour theming supporting light and dark modes
- Dynamic screen layout support using Windows Size Class
- Gradle Kotlin DSL and Version Catalog
- Macrobenchmark and Baseline Profile
- Full unit test and UI (Journey) test suite
- AndroidX Core KTX - Apache 2.0 - Kotlin extensions for core Android APIs
- JUnit - EPL-1.0 - A simple framework to write repeatable tests
- AndroidX Espresso - Apache 2.0 - UI testing framework for Android
- AndroidX Activity Compose - Apache 2.0 - Compose integration with Activity
- Jetpack Compose BOM - Apache 2.0 - BOM for consistent Jetpack Compose dependencies
- Jetpack Compose UI - Apache 2.0 - Core UI components for Compose
- Material3 - Apache 2.0 - Material Design 3 components for Compose
- AndroidX Benchmark - Apache 2.0 - Benchmarking tools for performance analysis
- AndroidX Splashscreen - Apache 2.0 - Splash screen API
- AndroidX DataStore - Apache 2.0 - Data storage solution
- AndroidX Legacy Support - Apache 2.0 - Legacy support library
- AndroidX Lifecycle - Apache 2.0 - Lifecycle-aware components
- AndroidX Room - Apache 2.0 - SQLite abstraction with LiveData and Coroutines support
- Kotlinx DateTime - Apache 2.0 - Date and time utilities for Kotlin
- Timber - Apache 2.0 - A logger with a small, extensible API
- Coil - Apache 2.0 - Image loading for Android backed by Kotlin Coroutines
- MockK - Apache 2.0 - Mocking library for Kotlin
- Kotlinx Coroutines - Apache 2.0 - Support for asynchronous programming in Kotlin
- Robolectric - Apache 2.0 - Unit test Android apps on the JVM
- AndroidX Test - Apache 2.0 - Tools for Android testing including JUnit extensions and rules
- Hilt - Apache 2.0 - Dependency injection framework built on top of Dagger
- LeakCanary - Apache 2.0 - Memory leak detection library for Android
- Ktor - Apache 2.0 - Asynchronous networking library for Kotlin
- Android Application Plugin - Google - Plugin for building Android applications
- Kotlin Android Plugin - JetBrains - Plugin for Kotlin Android support
- Compose Compiler Plugin - JetBrains - Compiler plugin for Jetpack Compose
- Hilt Android Plugin - Google - Plugin for Hilt dependency injection
- Kover Plugin - JetBrains - Code coverage tool for Kotlin
- KSP Plugin - Google - Kotlin Symbol Processing API
- Android Test Plugin - Google - Plugin for setting up Android test modules
- Baseline Profile Plugin - AndroidX - Plugin for generating performance profiles
- Serialization Plugin - JetBrains - Plugin for Kotlin serialization
- Detekt Plugin - Artur Bosch - Static code analysis tool for Kotlin
- Kotlinter Plugin - Jeremy Lichtenstein - Kotlin linter for Gradle
- To build the app by yourself, you need your own Giphy API Key
Release builds will be signed if either the keystore file or environment variables are set. Otherwise, the app will be built unsigned and without the Giphy API key installed, which will not pull any data from the endpoint.
-
Android Keystore is not being stored in this repository. You need your own Keystore to generate the apk / App Bundle
-
If your project folder is at
/app/giphy-trending/
, the Keystore file andkeystore.properties
should be placed at/app/
-
The format of
keystore.properties
is:store=/app/release-key.keystore alias=<alias> pass=<alias password> storePass=<keystore password> giphyApiKey="<your API Key here>"
-
This project has been configured to support automated CI builds.
-
The following environment variables have been set to provide the keystore:
CI = true HOME = <the home directory of the bitrise environment> CI_ANDROID_KEYSTORE_PASSWORD = <your keystore password> CI_ANDROID_KEYSTORE_ALIAS = <your keystore alias> CI_ANDROID_KEYSTORE_PRIVATE_KEY_PASSWORD = <your keystore private key password> GIPHYAPIKEY= <your API Key>
This app has two build variants: Debug
and Release
. The most common build commands are:
./gradlew clean installDebug
./gradlew clean instal
./gradlew clean bundleRelease
./gradlew clean assembleRelease
The generated apk(s) will be stored under app/build/outputs/
Nothing is free in this world. RW MobiMedia UK Limited, a fully tax-paying entity in the UK, sponsors the infrastructure and development costs of this project.
Copyright 2024 RW MobiMedia UK Limited
This project is licensed under the Creative Commons Attribution-NonCommercial 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
Under the terms of this license, you are free to:
- Share — copy and redistribute the material in any medium or format.
- Adapt — remix, transform, and build upon the material.
The licensing terms include the following stipulations:
- Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
- NonCommercial — You may not use the material for commercial purposes. Any commercial use is strictly prohibited without prior permission from RW MobiMedia UK Limited.
This work is provided "as is" without any warranties, and the licensing coverage is only applicable as long as the distribution or use is for non-commercial purposes.
For permissions beyond the scope of this license, please contact RW MobiMedia UK Limited.