You can read more about me here
Ps: This is a result of what I've learned during my learning of Kotlin, Android Jetpack, Material Design components, and Firebase, Google Cloud Functions. I tried to implement as many as possible best practices from the Android community and I'm very thankful to everyone who shared their valuable knowledge and experience through social media and blog posts.
Features | Description |
---|---|
Kotlin | 100% Kotlin. |
MVVM architecture | Using the lifecycle aware viewmodels, the view observes changes in the model / repository. |
Android Architecture Components | Lifecycle awareness has been achieved using a combination of LiveData, ViewModels and Room. |
Backend | Used Google Cloud Functions and Firebase Firestore for backend and REST API |
Dependency Injection | Common elements like context, networking interface are injected using Koin. |
Offline first architecture | All the data is loaded from the Room database and it's updated from the network. This ensures that the app is usable even in an offline mode. |
Effective Networking | Using a combination of Retrofit, Room, LiveData, Coroutines to handle networking in the most effective way. |
Intelligent sync | Intelligent hybrid syncing logic makes sure your Android app does not make repeated calls to the same back-end API for the same data in a particular time period. |
Feature based packaging | This screen-wise / feature-wise packaging makes code really easy to read and debug. |
You can download the apk from:
- JDK Version 1.7 & above
- Android SDK.
- Android SDK Tools
- Android SDK Build tools 29
- Android Support Repository
- Android Support library
Firebase Cloud Storage used as a backend server and Firebase Cloud Hosting and Google Cloud Functions for providing REST API. You can find the code here.
This project uses Firebases Analytics and Crashlytics, Cloud Firestore, Remote Config, etc. You will need to generate the configuration file (google-services.json
) and copy it to your /app
dir. See links below
- Setup Firebase setup
- Setup Firebase Crashlytics
- Setup Firebase Cloud Firestore
- Setup Firebase Storage
- Setup Firebase Cloud Functions
- Setup Firebase Hosting
- Setup Firebase Peformance Monitoring
- Setup Firebase Test Lab
- Setup Firebase App Indexing
This project is built with Gradle, the Android Gradle plugin Clone this repository inside your working folder. Import the settings.gradle
file in the root folder into e.g. Android Studio. (You can also have a look at the build.gradle
files on how the projects depend on another.)
- Start Android Studio
- Select "Open Project" and select the generated root Project folder
- You may be prompted with "Unlinked gradle project" -> Select "Import gradle project" and select the option to use the gradle wrapper
- You may also be prompted to change to the appropriate SDK folder for your local machine
- Once the project has compiled -> run the project!
- Fork Portfolio.
- Create a new branch (using GitHub) or the command
git checkout -b branch-name develop
). - Start a pull request. Reference existing issues when possible.
- You can discuss a bug or if it was not reported yet submit a bug.
Applied number of best practices from the Android community, and I'm thankful to everyone who shared their knowledge and experience through social media and blog posts. 🙌🏻
- Developing Android Apps with Kotlin by Google 🔥🔥🔥
- Android Documentation & Guides | All in one Place 🔥🔥🔥
- Kotlin Bootcamp for Programmers by Google 🔥
- Kotlin for Android Developers 🔥
- Kotlin Null Safety Best Practices
- Scope Functions in Kotlin - let run apply also with
- Best practices for a modularized app 🔥
- Android Architecture: A Journey Looking For The Perfect Design
- Jetpack Navigation (Google I/O'19) 🔥
- Add Shared Element Transitions between destinations 🔥
- Principles of navigation
- Update UI components with NavigationUI
- Migrate to the Navigation component
- Android Jetpack: manage UI navigation with Navigation Controller (Google I/O '18)
- Single Activity: Why, When, and How (Android Dev Summit '18)
- Advanced Navigation Sample
- Master-Detail views with Navigation Components
- Scroll your Bottom Navigation View away with 10 lines of code
- ViewModels with Saved State, Jetpack Navigation, Data Binding and Coroutines 🔥🔥🔥
- Use Kotlin coroutines with Architecture components 🔥🔥🔥
- Fun with LiveData (Android Dev Summit '18)
- ViewModels and LiveData: Patterns + AntiPatterns
- LiveData with SnackBar, Navigation and other events
- LiveData beyond the ViewModel
- LiveData with single events
- An Early Look at ViewModel SavedState
- Locale changes and the AndroidViewModel antipattern
- Course: Storing Data in Android with Room(Caster.io) 🔥🔥🔥
- 7 Pro-tips for Room 🔥🔥🔥
- Room 🔗 Coroutines 🔥🔥🔥
- Packing the Room: Pre-populate your database with this one method 🔥🔥🔥
- The Room in the House (Android Dev Summit '18)
- Populating Room Database with WorkManager sample app
- Room Persistence Library with Coroutines
- Dependency Injection with KOIN to Androidx Jetpack
- Upgrade to Room 2.1.0-alpha05, use withTransaction
- Defining data using Room entities
- Android Room Library Relations
- Android Room with nested relationships
- Room Persistence Library Part 2: Room Relationships
- Modern Data Binding(Droidcon Italy 2018)
- Level Up with Data Binding
- Data Binding — Lessons Learnt
- Databinding in Kotlin World (Video)
- Databinding in Kotlin World (Slides)
- Leveraging Android Data Binding with Kotlin
- Simplifying UI States with Kotlin Sealed Classes and Data Binding
- Advanced Data Binding
- Introduction to MotionLayout (part I) 🔥
- Introduction to MotionLayout (part II) 🔥
- Introduction to MotionLayout (part III) 🔥
- Introduction to MotionLayout (part IV) 🔥
- What's New in ConstraintLayout (Google I/O'19) 🔥
- Android Fundamentals: ConstraintLayout(Pluralsight) 🔥
- MotionLayout Tutorial For Android: Getting Started 🔥
- ConstraintLayout Deep Dive (Android Dev Summit '18)
- MotionLayout & ConstraintLayout 2.0 (Droidcon SF 2018)
- Deep dive into MotionLayout (DroidKaigi 2019)
- MotionLayout / Constraint Layout Samples
- Pull the KeyTrigger with MotionLayout
- Android Motion Layout tutorial – Collapsing view
- Say goodbye to LinearLayout with Flow
- Exploring MotionLayout: Touch Regions
- ConstraintLayout 2.0
- ConstraintLayout 2.0.0 alpha 5
- Course: Koin(Caster.io) 🔥🔥🔥
- Painless Android testing with Room & Koin
- Unlock your Android ViewModel power with Koin
- Coroutines on Android (part I): Getting the background 🔥🔥🔥
- Coroutines on Android (part II): Getting the background 🔥🔥🔥
- Coroutines on Android (part III): Getting the background 🔥🔥🔥
- Understand Kotlin Coroutines on Android (Google I/O'19) 🔥🔥🔥
- Android Suspenders (Android Dev Summit '18)
- Kotlin Coroutines: Beyond async/await (Droidcon NYC 2018)
- Android Coroutine Recipes
- Kotlin Coroutines patterns & anti-patterns
- Android Networking in 2019 — Retrofit with Kotlin’s Coroutines
- The reason to avoid GlobalScope
- Launching a Kotlin Coroutine for immediate execution on the Main thread
- Coroutine Support in ViewModels
- Managing exceptions in nested coroutine scopes
- Cold flows, hot channels
- WorkManager meets Kotlin 🔥
- WorkManager Periodicity 🔥
- Workout your tasks with WorkManager — Basics 🔥
- Working with WorkManager (Android Dev Summit '18)
- Introducing WorkManager
- WorkManager Basics
- Android Jetpack WorkManager Stable Release
- Working With WorkManager in Android Like A Pro
- Motional Intelligence: Build Smarter Animations (Google I/O'19) 🔥
- Re-animation
- Using vector assets in Android apps
- Creating AnimatedVectorDrawables with Shape Shifter
- Introduction to MotionLayout
- Defining motion paths in MotionLayout
- Android Jetpack: manage infinite lists with RecyclerView and Paging (Google I/O '18) 🔥
- First Java MVVM project that includes: Paging library, ViewModel, LiveData, Room and Retrofit 🔥
- Paging Library for Android With Kotlin: Creating Infinite Lists 🔥
- Playing with Paging Library, Retrofit, Coroutines, Koin & Testing.
- 7 steps to implement Paging library in Android
- Simple intro for Rest-Api loading of json data into recyclerview using Kotlin
- The Movie Datbase
- Android RecyclerView Tutorial with Kotlin
- Migrating to Paging library
- Android Data Binding + ListAdapter
- Android Data Binding + RecyclerView + Multiple View Type
- Android Data Binding for RecyclerView With LiveData (Kotlin)
- Android Paging Library with multiple view types
- Course: Android App Development: Accessibility(LinkedIn Learning) 🔥🔥🔥
- Making Android Accessibility Easy (Android Dev Summit '18)
- Demystifying Android Accessibility Development (Google I/O'19)
- Preferential Practices for Preferences (Android Dev Summit '18)
- How to Code a Settings Screen in an Android App
- Dark Theme & Gesture Navigation (Google I/O'19) 🔥
- Moving to the Dark Side: Dark Theme Recap 🔥
- DayNight — Adding a dark theme to your app 🔥
- Gesture Navigation: Going edge-to-edge 🔥
- Gesture Navigation: Handling visual overlaps 🔥
- Gesture Navigation: A Backstory 🔥
- Material Design: Getting started
- The Components of Material Design (Android Dev Summit '18)
- Best Practices for Themes and Styles (Android Dev Summit '18)
- Use Android Text Like a Pro (Android Dev Summit '18)
- DayNight — Adding a dark theme to your app
- Styles, Themes, Material Theming, Oh My!
- Seven best practices for inclusive product design
- WindowInsets — Listeners to layouts
- Styles, Themes, Material Theming, Oh My!
- Playing with Material Design Transitions
- Mastering the Coordinator Layout
- Integrate CoordinatorLayout + BottomNavigationView + Toolbar + TabLayout + ViewPager + Fragment + DrawerLayout
- Google+ Android Sample App demo
- Android Design — Collapsing Toolbar: ScrollFlags Illustrated
- AppBarLayout scroll behavior with layout_scrollFlags
- Hands-on with Material Components for Android: Bottom Sheets
- Full-screen BottomSheetDialog DIY
- Hands-on with Material Components for Android: Buttons
- Android P — What’s New in Material Design
- Android: An Introduction to Material Design with Kotlin
- What's new with ConstraintLayout and Android Studio design tools
- Tool Time – Part 1
- Tool Time – Part 2
- Building a “Serverless” RESTful API with Cloud Functions
- Build a Serverless full stack app using firebase cloud functions
- How Firebase Cloud Functions support custom domains
- Serve dynamic content and host microservices with Cloud Functions
- Introduction to Firebase security rules (Firecasts) 🔥
- Perform simple and compound queries in Cloud Firestore
- Firebase Auth REST API
- Writing conditions for Cloud Firestore Security Rules
- Five tips to secure your app (Firebase Summit 2018)
- Firestore Security Rules
- Making Android Networking Pretty with Kotlin Coroutines
- Improving App Network Architecture With Retrofit And Kotlin Coroutine Call Adapter
- Sealed Classes Instead of Exceptions in Kotlin
- Suspend what you’re doing: Retrofit has now Coroutines support!
- Android Networking with Coroutines and Retrofit
- Handle Complex Network Call with Kotlin Coroutine + Retrofit 2
- Retrofit Kotlin coroutines
- Kotlin Coroutines—Handling concurrency like a pro (Retrofit2+Coroutines)
- Modern concurrency on Android with Kotlin
- Networking the Kotlin way: Retrofit + Coroutines
- Migrate from GSON to Moshi in Android
- Modern DateTimes on Android
- Kotlin + buildSrc for Better Gradle Dependency Management
- Sharing Gradle Configuration in Multi-Module Android Projects
- android-youtube-player, an open source alternative to the official YouTube Player API
- Android RecyclerView adding Search Filter
- Responding to a Refresh Request
- Create swipe views with tabs
- Introduction to Google Maps API for Android with Kotlin
Android Developer
Copyright 2019 Tumur.B (Alex)
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.