- Developed using MVVM architecture (with usecase)
- Kotlin coroutines used as concurrency design pattern
- Hilt for dependecy injection
- Datastore preferences used for user data storing
- Kotlin Flows (and State Flows)
- Navigation Component
- View binding
- Glide (Image loading library)
- afollestad.materialdialogs library used for a generic dialog
- Unit tests for SignUpUseCaseTest SignUpViewModelTest (more detailed than UI test)
- Expresso for ui testing (because of tight schedule, I gave an example implementation MainFragmentTest and MainActivityTest)
# This multi module application is implemented using single Activity mutiple fragment.
# "app" module is our application module which keeps Application class and MainActivity class. Navigation component is inialized and navigation controller provided to BaseActivity by MainActivity. Base activity and Base Fragment communicates between each other using ActivityListener for navigation. (We may add more functionality for this listener but for now it is sufficient)
# "uimodule" is where we implement ui elements to use in our features. We hold everthing that is related with UI(colors, dimensions, styles, custom UI...) that can be reused in here. We reduce boiler plate code and create less resources by this structure.
# "core" module contain core base elements such as data store instance, extensions, base network classes, file operations... (And also it can provide base instances such as base okhttp which should(must) be reused by different feature modules.)
# "signup" module where the feature is implemented. There is 2 fragment, 2 viewmodel, 1 usecase and 1 adapter. Data and domain models separated. A mapper used to map data model to ui model. UI states checked using coroutines. There is a Generic BaseAdapter(uimodule) implementation which reduce boiler plate code for recyclerview adapters. Glide used as an image loading library. User can take photo or pick photo from gallery.
# "common" module includes just strings for now. Common will never include any module. It will be used for preventing dependecy cycles.