theapache64 / tracktor

A GitHub user tracking app, inspired from a GIF. πŸ•΅οΈ Can be considered as a demo project to showcase MVVM with latest android development tools
https://github.com/theapache64/tracktor/blob/master/extras/dog_stalks_cat.gif
63 stars 7 forks source link
android-arch-testing barista coroutines coroutines-flow dagger-mock dagger2 espresso expekt glide junit livedata material-components mockito mockito-kotlin moshi retrofit robolectric room view-binding view-model

tracktor πŸ•΅οΈ

GitHub issues GitHub forks GitHub stars GitHub license Twitter

If you've got someone you truly admire for their fiery passion in programming, hitting that 'follow' button on GitHub might not be enough. Don't settle for the minimal info on your feed! That's where this app comes in πŸ˜‰

Can be considered as a demo project to showcase MVVM with latest android development tools

Dark Mode Available πŸŒ™

dark_screenshots

How to use? πŸ€”

Now you can see whatever he does 😜

Built With πŸ› 

Core 😍

Testing πŸ₯Ό

Instrumentation Testing πŸ›‘οΈ

Architecture πŸ—Ό

This project follows the famous MVVM architecture and best practices from Google's GithubBrowserSample

Project Structure πŸ“‚

.
β”œβ”€β”€ androidTest
β”‚Β Β  └── java
β”‚Β Β      └── com
β”‚Β Β          └── theapache64
β”‚Β Β              └── tracktor
β”‚Β Β                  β”œβ”€β”€ ui
β”‚Β Β                  β”‚Β Β  └── activities
β”‚Β Β                  β”‚Β Β      β”œβ”€β”€ splash
β”‚Β Β                  β”‚Β Β      β”‚Β Β  └── SplashActivityTest.kt
β”‚Β Β                  β”‚Β Β      β”œβ”€β”€ userdetail
β”‚Β Β                  β”‚Β Β      β”‚Β Β  └── UserDetailActivityTest.kt
β”‚Β Β                  β”‚Β Β      └── users
β”‚Β Β                  β”‚Β Β          └── UsersActivityTest.kt
β”‚Β Β                  └── utils
β”‚Β Β                      └── DaggerMockRules.kt
β”œβ”€β”€ main
β”‚Β Β  β”œβ”€β”€ AndroidManifest.xml
β”‚Β Β  β”œβ”€β”€ ic_launcher-playstore.png
β”‚Β Β  β”œβ”€β”€ java
β”‚Β Β  β”‚Β Β  └── com
β”‚Β Β  β”‚Β Β      └── theapache64
β”‚Β Β  β”‚Β Β          └── tracktor
β”‚Β Β  β”‚Β Β              β”œβ”€β”€ App.kt
β”‚Β Β  β”‚Β Β              β”œβ”€β”€ core
β”‚Β Β  β”‚Β Β              β”‚Β Β  └── events
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ BaseEventSupport.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ EventManager.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ issuecomment
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”‚Β Β  β”œβ”€β”€ IssueCommentEventPayload.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”‚Β Β  └── IssueCommentEventSupport.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ issues
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”‚Β Β  β”œβ”€β”€ IssuesEventPayload.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”‚Β Β  └── IssuesEventSupport.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ push
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”‚Β Β  β”œβ”€β”€ PushEventPayload.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”‚Β Β  └── PushEventSupport.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      └── watch
β”‚Β Β  β”‚Β Β              β”‚Β Β          └── WatchEventSupport.kt
β”‚Β Β  β”‚Β Β              β”œβ”€β”€ data
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”œβ”€β”€ local
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”œβ”€β”€ AppDatabase.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”œβ”€β”€ daos
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”‚Β Β  └── UserDao.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  └── entities
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β      └── UserEntity.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”œβ”€β”€ remote
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”œβ”€β”€ ApiInterface.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”œβ”€β”€ events
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”‚Β Β  └── Event.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  └── user
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β      └── User.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  └── repositories
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ EventsRepo.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ PrefRepo.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      └── UserRepo.kt
β”‚Β Β  β”‚Β Β              β”œβ”€β”€ di
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”œβ”€β”€ components
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  └── AppComponent.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  └── modules
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ ActivitiesBuilderModule.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ AppModule.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ DatabaseModule.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ NetworkModule.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ RepoModule.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      └── ViewModelModule.kt
β”‚Β Β  β”‚Β Β              β”œβ”€β”€ models
β”‚Β Β  β”‚Β Β              β”‚Β Β  └── UserEvent.kt
β”‚Β Β  β”‚Β Β              β”œβ”€β”€ ui
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”œβ”€β”€ activities
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”œβ”€β”€ splash
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ SplashActivity.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”‚Β Β  └── SplashViewModel.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”œβ”€β”€ userdetail
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ UserDetailActivity.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  β”‚Β Β  └── UserDetailViewModel.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β  └── users
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β      β”œβ”€β”€ UsersActivity.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  β”‚Β Β      └── UsersViewModel.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β  └── adapters
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ EventDetailsAdapter.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      β”œβ”€β”€ UserEventsAdapter.kt
β”‚Β Β  β”‚Β Β              β”‚Β Β      └── UsersAdapter.kt
β”‚Β Β  β”‚Β Β              └── utils
β”‚Β Β  β”‚Β Β                  β”œβ”€β”€ DateTimeUtils.kt
β”‚Β Β  β”‚Β Β                  β”œβ”€β”€ EventRepoUtils.kt
β”‚Β Β  β”‚Β Β                  β”œβ”€β”€ NightModeUtils.kt
β”‚Β Β  β”‚Β Β                  β”œβ”€β”€ StringUtils.kt
β”‚Β Β  β”‚Β Β                  └── test
β”‚Β Β  β”‚Β Β                      └── OpenForTesting.kt
β”‚Β Β  └── res
β”‚Β Β      β”œβ”€β”€ drawable
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_baseline_add_24.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_baseline_close_24.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_baseline_delete_outline_24.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_hacker_100.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_launcher_foreground.xml
β”‚Β Β      β”‚Β Β  └── ic_night_mode_24.xml
β”‚Β Β      β”œβ”€β”€ drawable-night
β”‚Β Β      β”‚Β Β  └── ic_night_mode_24.xml
β”‚Β Β      β”œβ”€β”€ layout
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ activity_splash.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ activity_user_detail.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ activity_users.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ item_event_detail.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ item_user_event.xml
β”‚Β Β      β”‚Β Β  └── item_user.xml
β”‚Β Β      β”œβ”€β”€ mipmap-anydpi-v26
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_launcher_round.xml
β”‚Β Β      β”‚Β Β  └── ic_launcher.xml
β”‚Β Β      β”œβ”€β”€ mipmap-hdpi
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_launcher.png
β”‚Β Β      β”‚Β Β  └── ic_launcher_round.png
β”‚Β Β      β”œβ”€β”€ mipmap-mdpi
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_launcher.png
β”‚Β Β      β”‚Β Β  └── ic_launcher_round.png
β”‚Β Β      β”œβ”€β”€ mipmap-xhdpi
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_launcher.png
β”‚Β Β      β”‚Β Β  └── ic_launcher_round.png
β”‚Β Β      β”œβ”€β”€ mipmap-xxhdpi
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_launcher.png
β”‚Β Β      β”‚Β Β  └── ic_launcher_round.png
β”‚Β Β      β”œβ”€β”€ mipmap-xxxhdpi
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_launcher.png
β”‚Β Β      β”‚Β Β  └── ic_launcher_round.png
β”‚Β Β      β”œβ”€β”€ values
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ colors.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ dimens.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ic_launcher_background.xml
β”‚Β Β      β”‚Β Β  β”œβ”€β”€ strings.xml
β”‚Β Β      β”‚Β Β  └── styles.xml
β”‚Β Β      └── values-night
β”‚Β Β          β”œβ”€β”€ colors.xml
β”‚Β Β          └── styles.xml
β”œβ”€β”€ sharedTest
β”‚Β Β  └── java
β”‚Β Β      └── com
β”‚Β Β          └── theapache64
β”‚Β Β              └── tracktor
β”‚Β Β                  └── utils
β”‚Β Β                      └── test
β”‚Β Β                          └── observeForTesting.kt
└── test
    β”œβ”€β”€ java
    β”‚Β Β  └── com
    β”‚Β Β      └── theapache64
    β”‚Β Β          └── tracktor
    β”‚Β Β              β”œβ”€β”€ data
    β”‚Β Β              β”‚Β Β  β”œβ”€β”€ local
    β”‚Β Β              β”‚Β Β  β”‚Β Β  └── daos
    β”‚Β Β              β”‚Β Β  β”‚Β Β      └── UserDaoTest.kt
    β”‚Β Β              β”‚Β Β  └── repositories
    β”‚Β Β              β”‚Β Β      └── EventsRepoTest.kt
    β”‚Β Β              β”œβ”€β”€ ui
    β”‚Β Β              β”‚Β Β  └── activities
    β”‚Β Β              β”‚Β Β      β”œβ”€β”€ splash
    β”‚Β Β              β”‚Β Β      β”‚Β Β  └── SplashViewModelTest.kt
    β”‚Β Β              β”‚Β Β      β”œβ”€β”€ userdetail
    β”‚Β Β              β”‚Β Β      β”‚Β Β  └── UserDetailViewModelTest.kt
    β”‚Β Β              β”‚Β Β      └── users
    β”‚Β Β              β”‚Β Β          └── UsersViewModelTest.kt
    β”‚Β Β              └── utils
    β”‚Β Β                  β”œβ”€β”€ DateTimeUtilsTest.kt
    β”‚Β Β                  └── StringUtilsKtTest.kt
    └── resources
        └── robolectric.properties

77 directories, 88 files

Credits πŸ€—

TODO πŸ—’οΈ

Author ✍️