# Android Manifesto ## What do we do? We develop effective native Android applications using [Kotlin](https://kotlinlang.org) programming language, version 1.4, and building upon MVVM architecture. ## Tools #### IDE The default IDE is Android Studio, version 4.1; upgrading to major releases are always agreed within the team, because some resources are shared with other team members. #### Gradle [Gradle](https://gradle.org) is the foundation of Android build system, currently we are using version 6.5 and 4.1 for its plugin. Even though Gradle updates are frequent we recommend using always the latest stable version. #### AndroidX Libraries Using [AndroidX libraries](https://developer.android.com/jetpack/androidx) is mandatory for every new project. They provide consistence within different Android versions and devices, in addition to libraries to follow best practices and write more readable code. #### Common Libraries ##### Koin [Koin](https://github.com/InsertKoinIO/koin) is a framework to help developers with dependency injection. It is written in pure Kotlin, using functional resolution only: no proxy, no code generation, no reflection. ##### Kotlin Flow [Kotlin Flow](https://kotlinlang.org/docs/reference/coroutines/flow.html) is a new stream processing API. It’s an implementation of the Reactive Stream specification, an initiative whose goal is to provide a standard for asynchronous stream processing. By using Flow to handle streams of values, you can easily transform data in complex multi-threaded ways. ##### Apollo [Apollo](https://github.com/apollographql/apollo-android) is a GraphQL client that generates Java and Kotlin models from GraphQL queries. These models give you a type-safe API to perform requests to GraphQL servers. ##### Picasso [Picasso](https://github.com/square/picasso) is a powerful image download and caching library, it's mostly written in Java. ##### Glide [Glide](https://github.com/bumptech/glide) is an image loading framework, it also handles memory and disk caching between its many features. Just like Picasso, Glide is written using Java language as well. ##### Espresso [Espresso](https://developer.android.com/training/testing/espresso) is a testing framework for Android to make it easy to write reliable user interface tests. It automatically synchronizes your test actions with the user interface of your application. The framework also ensures that your activity is started before the tests run. It also let the test wait until all observed background activities have finished. ## Other Tools ##### Fastlane [Fastlane](https://github.com/fastlane/fastlane) is a tool to automate repetitive tasks such as code signing and app releases. It has other features, for example screenshots generating, but we mostly use Fastlane to release apps. To install it on your Mac use this `brew` command `brew install fastlane`. To initialize a project using Fastlane from the command line type `fastlane init` from your project's directory. ## CI/CD CI/CD is a key part of mobile development, as we leverage on it to deliver version of the apps to the respective stakeholders. Continuous Integration and Continuous Delivery are achieved using a combination of tools and services; as explained before we use Fastlane to automate code signing and app release, Firebase App Distribution and Testflight are the services used to deliver builds to the stakeholders. To setup CI/CD for your project follow [this](https://tracker.vidiemme.it/projects/vdm181/knowledgebase/categories/9) guide.