Skip to content

Instantly share code, notes, and snippets.

DealerPro

Welcome to the DealerPro Android app walk-through. Please read this file very carefully before doing any work.

This project uses a lot of good libraries designed specifically for android, like Hilt for dependency injection, Data Binding, Retrofit, Room, Paging, etc. and one library made specifically for TELE2 for recognizing text on National Ids, passports, and SIM-cards. It is based on clean architecture principles, meaning it separates View classes (fragments and activities), ViewModels (contains logic for the screen), repositories (decides whether to query from local database or from remote service), DAOs (local database

@BlogsScope
@Subcomponent(
modules = [
BlogsViewModelsModule::class
]
)
interface BlogsComponent {
@Subcomponent.Factory
interface Factory {
@Reusable
class ViewModelProviderFactory @Inject constructor(
private val assistedFactories: Map<Class<out ViewModel>, @JvmSuppressWildcards ViewModelAssistedFactory<out ViewModel>>,
private val viewModelProviders: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) {
/**
* Creates instance of ViewModel either annotated with @AssistedInject or @Inject and passes dependencies it needs.
*/
fun create(owner: SavedStateRegistryOwner, defaultArgs: Bundle? = null) =
@Module
abstract class EmptyMapProviderModule {
@Multibinds
abstract fun viewModels(): Map<Class<out ViewModel>, @JvmSuppressWildcards ViewModel>
@Multibinds
abstract fun assistedViewModels(): Map<Class<out ViewModel>, @JvmSuppressWildcards ViewModelAssistedFactory<out ViewModel>>
}
@Module
public abstract class BlogsViewModelsModule {
@BlogsScope
@Binds
@IntoMap
@ViewModelKey(BlogsViewModel.class)
public abstract ViewModel bindBlogsViewModel(BlogsViewModel viewModel);
@BlogsScope
class BlogViewModel @AssistedInject constructor(
@Assisted private val savedStateHandle: SavedStateHandle,
blogsRepository: BlogsRepository
) : ViewModel() {
@AssistedInject.Factory
interface Factory : ViewModelAssistedFactory<BlogViewModel>
val blog = blogsRepository.getBlog(savedStateHandle.get("blog_id")!!)
}
@Module
public abstract class BlogsViewModelsModule {
}
@Module
public abstract class SecondViewModelsModule {
}
@Singleton
@Component(modules = [SubComponentsModule::class])
interface AppComponent {
fun inject(app: BaseApplication)
@Component.Factory
interface Factory {
fun create(@BindsInstance context: Context): AppComponent
}
fun blogsComponent(): BlogsComponent.Factory
fun secondComponent(): SecondComponent.Factory
@BlogsScope
@Subcomponent(modules = [BlogsViewModelsModule::class])
interface BlogsComponent {
@Subcomponent.Factory
interface Factory {
fun create(): BlogsComponent
}
fun inject(fragment: BlogsFragment)
fun inject(fragment: BlogFragment)
}