https://github.com/timtbdev/Android-Portfolio-App-2
๐ค Portfolio App 2.0 | Kotlin | MVVM | Android Jetpack
https://github.com/timtbdev/Android-Portfolio-App-2
Last synced: 11 months ago
JSON representation
๐ค Portfolio App 2.0 | Kotlin | MVVM | Android Jetpack
- Host: GitHub
- URL: https://github.com/timtbdev/Android-Portfolio-App-2
- Owner: timtbdev
- Created: 2019-07-21T19:07:39.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2019-10-26T18:11:00.000Z (over 6 years ago)
- Last Synced: 2025-04-02T08:22:49.929Z (12 months ago)
- Language: Kotlin
- Homepage: https://ioco-5c746.web.app/a/
- Size: 35.3 MB
- Stars: 51
- Watchers: 1
- Forks: 18
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Portfolio [](https://kotlinlang.org) [](https://android-arsenal.com/api?level=21) [](https://github.com/pinterest/ktlint) [](https://opensource.org/licenses/Apache-2.0)
๐Hello, My name is Tumur Bazarragchaa and you can call me Alex.
I'm an Android Developer, specializing in the user interface, and with three years of experience in Kotlin, Java.
I've published two Kotlin Android apps and up to date with the latest technologies such as Android Jetpack Components and Kotlin Coroutines. I built this app to show my skills and passion for design and development.
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.
## ๐ฝ๏ธ PREVIEW
[](https://youtu.be/YjVJyqcv5I8 "Portfolio App 2.0 - Click to Watch!")
## ๐ธ SCREENSHOTS

## ๐ ANDROID JETPACK COMPONENTS

| Android Foundation | Architecture Components | Behavior | UI |
|:-------------------|:------------------------|:---------|:---------|
|[Appcompat](https://bit.ly/2NuMMK8)|[Data Binding](https://bit.ly/2GIx8KE)|[Media & Playback](https://bit.ly/2IAx3tY)|[Animations and Transitions](https://bit.ly/2N029tx)|
|[Android KTX](https://bit.ly/2EtrEB6)|[LiveData](https://bit.ly/2IAnewp)|[Notifications](https://bit.ly/2BQyjmZ)|[Emoji](https://bit.ly/2GZqSgQ)|
|[Multidex](https://bit.ly/2qnmlL1)|[Lifecycles](https://bit.ly/2E7ackq)|[Permissions](https://bit.ly/2x4HKiW)|[Constraint Layout](https://bit.ly/2tBwOVu)|
|[Test](https://bit.ly/2GIIOgo)|[Navigation](https://bit.ly/2NLl1MC)|[Preferences](https://bit.ly/2TcvKWl)|[Motion Layout](https://bit.ly/2Nsdsec)|
||[Paging](https://bit.ly/2IAnVWx)|[Sharing](https://bit.ly/2N6AhTX)|[Fragment](https://bit.ly/2LKTfPd)|
||[Room](https://bit.ly/2lXfwOX)|[Slices](https://bit.ly/2tALpjL)|[View Pager](https://bit.ly/2ThCMJm)|
||[ViewModel](https://bit.ly/2H0vRh3)||[Material Theming](https://bit.ly/2NpMeVH)|
||[Work Manager](https://bit.ly/2EtEaAm)||[Material Design Guideline](https://bit.ly/2VdJ6io)|
||||[Android Accessibility Guideline](https://bit.ly/2AfIFvN)|
||||[Google Play Instant App](https://bit.ly/2OEkwVy)|
## ๐ ARCHITECTURE

## ๐ FEATURES
| 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.|
## ๐ฆ THIRD PARTY LIBRARIES
| Third party libraries | Firebase | Design tools | Gradle |
|:-------------------|:------------------------|:------------------------|:------------------------|
|[Koin](https://bit.ly/2GIqyDE)|[Cloud Firestore](https://bit.ly/2U1Z9iZ)|[Sketch](https://bit.ly/23L9Cj0)| [Gradle Kotlin DSL](http://bit.ly/2Njua1r)|
|[Kotlin Coroutines](https://bit.ly/2wTru3E)|[Cloud Functions](https://bit.ly/2TfAkTE)|[Shape Shifter](https://bit.ly/2IuQzrQ)|[Ktlint](http://bit.ly/2Z9rGJB)|
|[Retrofit](https://bit.ly/2pSxHbb)|[Hosting](https://bit.ly/2H5qbSW)|[Adobe Photoshop](https://adobe.ly/1Z5LVOp)|[Detekt](http://bit.ly/31T7r0l)|
|[OkHttp](https://bit.ly/2fVF6OA)|[Cloud Storage](https://bit.ly/2EuLtb6)|[Adobe Illustrator](https://adobe.ly/1G6wY8i)|[Versions](http://bit.ly/31P7Xwj)|
|[Glide](https://bit.ly/1RIHiKz)|[Crashlytics](https://bit.ly/2GIM9fq)|[Adobe After Effects](https://adobe.ly/1B8kNrh)|[SafeArgs](http://bit.ly/2KSkf04)|
|[Leak Canary](https://bit.ly/1Mz1RV4)|[Performance Monitoring](https://bit.ly/2Es0b2s)|||
|[Timber](https://bit.ly/1zQNWqd)|[Test Lab](https://bit.ly/2C1h3Mb)|||
|[ThreenTenABP](https://bit.ly/2GIykxt)|[App Indexing](https://bit.ly/2Tcy9jP)|||
|[Stetho](https://bit.ly/2eZ3YI7)||||
|[Chrome Custom Tab](http://bit.ly/2XQsjYy)||||
|[CircleImageView](https://bit.ly/1MlTaA6)||||
|[SDP - Scalable Size Unit](https://bit.ly/2T9wlYZ)||||
|[Gradle Versions Plugin](https://bit.ly/1FtgBgA)||||
|[Moshi](https://bit.ly/2TLu7za)||||
|[InkPageIndicator](http://bit.ly/2CKlcnW)||||
|[ShapeOfView](http://bit.ly/2MQdFtD)||||
|[Toasty](http://bit.ly/2McNZYu)||||
|[COIL](http://bit.ly/2MZRhy1)||||
## ๐ฆ DOWNLOAD APK
You can download the apk from:
1. [Google Playstore](https://play.google.com/store/apps/details?id=me.tumur.portfolio)
## ๐ REQUIREMENTS
* JDK Version 1.7 & above
* [Android SDK.](http://developer.android.com/sdk/index.html)
* Android SDK Tools
* Android SDK Build tools 29
* Android Support Repository
* Android Support library
## ๐ BACKEND
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.
## ๐ฅ FIREBASE SETUP
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
1. [Setup Firebase setup](https://firebase.google.com/docs/android/setup)
2. [Setup Firebase Crashlytics](https://firebase.google.com/docs/crashlytics/get-started/)
3. [Setup Firebase Cloud Firestore](https://firebase.google.com/docs/firestore/quickstart/)
4. [Setup Firebase Storage](https://firebase.google.com/docs/storage/android/start)
5. [Setup Firebase Cloud Functions](https://firebase.google.com/docs/functions/get-started)
6. [Setup Firebase Hosting](https://firebase.google.com/docs/hosting/quickstart)
7. [Setup Firebase Peformance Monitoring](https://firebase.google.com/docs/perf-mon/get-started-android)
8. [Setup Firebase Test Lab ](https://firebase.google.com/docs/test-lab/)
9. [Setup Firebase App Indexing ](https://firebase.google.com/docs/app-indexing/android/app)
## โ๏ธ PROJECT SETUP
This project is built with Gradle, the [Android Gradle plugin](http://tools.android.com/tech-docs/new-build-system/user-guide) 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!
## ๐ค CONTRIBUTING
### Would you like to contribute code?
1. [Fork Portfolio](https://github.com/tumurb/Portfolio/).
2. Create a new branch ([using GitHub](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/)) or the command `git checkout -b branch-name develop`).
3. [Start a pull request](https://github.com/tumurb/Portfolio/compare). Reference [existing issues](https://github.com/tumurb/Portfolio/issues) when possible.
### No code!
* You can [discuss a bug](https://github.com/tumurb/Bio/issues) or if it was not reported yet [submit a bug](https://github.com/tumurb/Bio/issues/new).
## ๐ RESSOURCES & CREDENTIALS
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. ๐๐ป
### Android & Kotlin
1. Developing Android Apps with Kotlin by Google ๐ฅ๐ฅ๐ฅ
2. Android Documentation & Guides | All in one Place ๐ฅ๐ฅ๐ฅ
3. Kotlin Bootcamp for Programmers by Google ๐ฅ
4. Kotlin for Android Developers ๐ฅ
5. Kotlin Null Safety Best Practices
6. Scope Functions in Kotlin - let run apply also with
### Architecture
1. Best practices for a modularized app ๐ฅ
2. Android Architecture: A Journey Looking For The Perfect Design
### Navigation Controller: Single Activity
1. Jetpack Navigation (Google I/O'19) ๐ฅ
2. Add Shared Element Transitions between destinations ๐ฅ
3. Principles of navigation
4. Update UI components with NavigationUI
5. Migrate to the Navigation component
6. Android Jetpack: manage UI navigation with Navigation Controller (Google I/O '18)
7. Single Activity: Why, When, and How (Android Dev Summit '18)
8. Advanced Navigation Sample
9. Master-Detail views with Navigation Components
10. Scroll your Bottom Navigation View away with 10 lines of code
### Live Data & ViewModel
1. ViewModels with Saved State, Jetpack Navigation, Data Binding and Coroutines ๐ฅ๐ฅ๐ฅ
2. Use Kotlin coroutines with Architecture components ๐ฅ๐ฅ๐ฅ
3. Fun with LiveData (Android Dev Summit '18)
4. ViewModels and LiveData: Patterns + AntiPatterns
5. LiveData with SnackBar, Navigation and other events
6. LiveData beyond the ViewModel
7. LiveData with single events
8. An Early Look at ViewModel SavedState
9. Locale changes and the AndroidViewModel antipattern
### Room
1. Course: Storing Data in Android with Room(Caster.io) ๐ฅ๐ฅ๐ฅ
2. 7 Pro-tips for Room ๐ฅ๐ฅ๐ฅ
3. Room ๐ Coroutines ๐ฅ๐ฅ๐ฅ
4. Packing the Room: Pre-populate your database with this one method ๐ฅ๐ฅ๐ฅ
5. The Room in the House (Android Dev Summit '18)
6. Populating Room Database with WorkManager sample app
7. Room Persistence Library with Coroutines
8. Dependency Injection with KOIN to Androidx Jetpack
9. Upgrade to Room 2.1.0-alpha05, use withTransaction
10. Defining data using Room entities
11. Android Room Library Relations
12. Android Room with nested relationships
13. Room Persistence Library Part 2: Room Relationships
### DataBinding
1. Modern Data Binding(Droidcon Italy 2018)
2. Level Up with Data Binding
3. Data BindingโโโLessons Learnt
4. Databinding in Kotlin World (Video)
5. Databinding in Kotlin World (Slides)
6. Leveraging Android Data Binding with Kotlin
7. Simplifying UI States with Kotlin Sealed Classes and Data Binding
8. Advanced Data Binding
### Constraintlayouts & Motionlayout
1. Introduction to MotionLayout (part I) ๐ฅ
2. Introduction to MotionLayout (part II) ๐ฅ
3. Introduction to MotionLayout (part III) ๐ฅ
4. Introduction to MotionLayout (part IV) ๐ฅ
5. What's New in ConstraintLayout (Google I/O'19) ๐ฅ
6. Android Fundamentals: ConstraintLayout(Pluralsight) ๐ฅ
7. MotionLayout Tutorial For Android: Getting Started ๐ฅ
8. ConstraintLayout Deep Dive (Android Dev Summit '18)
9. MotionLayout & ConstraintLayout 2.0 (Droidcon SF 2018)
10. Deep dive into MotionLayout (DroidKaigi 2019)
11. MotionLayout / Constraint Layout Samples
12. Pull the KeyTrigger with MotionLayout
13. Android Motion Layout tutorial โ Collapsing view
14. Say goodbye to LinearLayout with Flow
15. Exploring MotionLayout: Touch Regions
16. ConstraintLayout 2.0
17. ConstraintLayout 2.0.0 alpha 5
### Koin
1. Course: Koin(Caster.io) ๐ฅ๐ฅ๐ฅ
2. Painless Android testing with Room & Koin
3. Unlock your Android ViewModel power with Koin
### Kotlin Coroutines
1. Coroutines on Android (part I): Getting the background ๐ฅ๐ฅ๐ฅ
2. Coroutines on Android (part II): Getting the background ๐ฅ๐ฅ๐ฅ
3. Coroutines on Android (part III): Getting the background ๐ฅ๐ฅ๐ฅ
4. Understand Kotlin Coroutines on Android (Google I/O'19) ๐ฅ๐ฅ๐ฅ
5. Android Suspenders (Android Dev Summit '18)
6. Kotlin Coroutines: Beyond async/await (Droidcon NYC 2018)
7. Android Coroutine Recipes
8. Kotlin Coroutines patterns & anti-patterns
9. Android Networking in 2019โโโRetrofit with Kotlinโs Coroutines
10. The reason to avoid GlobalScope
11. Launching a Kotlin Coroutine for immediate execution on the Main thread
12. Coroutine Support in ViewModels
13. Managing exceptions in nested coroutine scopes
14. Cold flows, hot channels
### WorkManager
1. WorkManager meets Kotlin ๐ฅ
2. WorkManager Periodicity ๐ฅ
3. Workout your tasks with WorkManager โ Basics ๐ฅ
4. Working with WorkManager (Android Dev Summit '18)
5. Introducing WorkManager
6. WorkManager Basics
7. Android Jetpack WorkManager Stable Release
8. Working With WorkManager in Android Like A Pro
### Animation
1. Motional Intelligence: Build Smarter Animations (Google I/O'19) ๐ฅ
2. Re-animation
3. Using vector assets in Android apps
4. Creating AnimatedVectorDrawables with Shape Shifter
5. Introduction to MotionLayout
6. Defining motion paths in MotionLayout
### Paging
1. Android Jetpack: manage infinite lists with RecyclerView and Paging (Google I/O '18) ๐ฅ
2. First Java MVVM project that includes: Paging library, ViewModel, LiveData, Room and Retrofit ๐ฅ
3. Paging Library for Android With Kotlin: Creating Infinite Lists ๐ฅ
4. Playing with Paging Library, Retrofit, Coroutines, Koin & Testing.
5. 7 steps to implement Paging library in Android
6. Simple intro for Rest-Api loading of json data into recyclerview using Kotlin
7. The Movie Datbase
8. Android RecyclerView Tutorial with Kotlin
9. Migrating to Paging library
10. Android Data Binding + ListAdapter
11. Android Data Binding + RecyclerView + Multiple View Type
12. Android Data Binding for RecyclerView With LiveData (Kotlin)
13. Android Paging Library with multiple view types
### ViewPager
1. ViewPager Tutorial: Getting Started in Kotlin
2. Exploring the View Pager 2
### Android Accessibility
1. Course: Android App Development: Accessibility(LinkedIn Learning) ๐ฅ๐ฅ๐ฅ
2. Making Android Accessibility Easy (Android Dev Summit '18)
3. Demystifying Android Accessibility Development (Google I/O'19)
### Preferences
1. Preferential Practices for Preferences (Android Dev Summit '18)
2. How to Code a Settings Screen in an Android App
### Material Design & Theme
1. Dark Theme & Gesture Navigation (Google I/O'19) ๐ฅ
2. Moving to the Dark Side: Dark Theme Recap ๐ฅ
3. DayNight โ Adding a dark theme to your app ๐ฅ
4. Gesture Navigation: Going edge-to-edge ๐ฅ
5. Gesture Navigation: Handling visual overlaps ๐ฅ
6. Gesture Navigation: A Backstory ๐ฅ
7. Material Design: Getting started
8. The Components of Material Design (Android Dev Summit '18)
9. Best Practices for Themes and Styles (Android Dev Summit '18)
10. Use Android Text Like a Pro (Android Dev Summit '18)
11. DayNightโโโAdding a dark theme to your app
12. Styles, Themes, Material Theming, Oh My!
13. Seven best practices for inclusive product design
14. WindowInsetsโโโListeners to layouts
15. Styles, Themes, Material Theming, Oh My!
16. Playing with Material Design Transitions
17. Mastering the Coordinator Layout
18. Integrate CoordinatorLayout + BottomNavigationView + Toolbar + TabLayout + ViewPager + Fragment + DrawerLayout
19. Google+ Android Sample App demo
20. Android DesignโโโCollapsing Toolbar: ScrollFlags Illustrated
21. AppBarLayout scroll behavior with layout_scrollFlags
22. Hands-on with Material Components for Android: Bottom Sheets
23. Full-screen BottomSheetDialog DIY
24. Hands-on with Material Components for Android: Buttons
25. Android PโโโWhatโs New in Material Design
26. Android: An Introduction to Material Design with Kotlin
### Sample Data
1. What's new with ConstraintLayout and Android Studio design tools
2. Tool Time โ Part 1
3. Tool Time โ Part 2
### Instant App
1. A simpler experience for instant apps
2. 5 tips for using showInstallPrompt in your instant experience
### Test
1. Leveling Up Your UI Tests With MockWebServer
### Firebase Cloud Functions
1. Building a โServerlessโ RESTful API with Cloud Functions
2. Build a Serverless full stack app using firebase cloud functions
3. How Firebase Cloud Functions support custom domains
4. Serve dynamic content and host microservices with Cloud Functions
### Firebase security rules
1. Introduction to Firebase security rules (Firecasts) ๐ฅ
2. Perform simple and compound queries in Cloud Firestore
3. Firebase Auth REST API
4. Writing conditions for Cloud Firestore Security Rules
5. Five tips to secure your app (Firebase Summit 2018)
6. Firestore Security Rules
### Network
1. Making Android Networking Pretty with Kotlin Coroutines
2. Improving App Network Architecture With Retrofit And Kotlin Coroutine Call Adapter
3. Sealed Classes Instead of Exceptions in Kotlin
4. Suspend what youโre doing: Retrofit has now Coroutines support!
### Retrofit & OkHttp, Moshi, ThreeTenABP
1. Android Networking with Coroutines and Retrofit
2. Handle Complex Network Call with Kotlin Coroutine + Retrofit 2
3. Retrofit Kotlin coroutines
4. Kotlin CoroutinesโHandling concurrency like a pro (Retrofit2+Coroutines)
5. Modern concurrency on Android with Kotlin
6. Networking the Kotlin way: Retrofit + Coroutines
7. Migrate from GSON to Moshi in Android
8. Modern DateTimes on Android
### Other
1. Kotlin + buildSrc for Better Gradle Dependency Management
2. Sharing Gradle Configuration in Multi-Module Android Projects
3. android-youtube-player, an open source alternative to the official YouTube Player API
4. Android RecyclerView adding Search Filter
5. Responding to a Refresh Request
6. Create swipe views with tabs
7. Introduction to Google Maps API for Android with Kotlin
## Project Maintained By
Tumur.B (Alex)
Android Developer

## License
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
http://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.