Skip to content

Instantly share code, notes, and snippets.

// :feature:stock_list:demo/build.gradle.kts
plugins {
id("com.android.application")
id("kotlin-android")
}
android { }
dependencies {
internal class StockListDemoActivity : AppCompatActivity() {
@Inject lateinit var stockListAdapter: StockListAdapter
@Inject lateinit var factory: StockListViewModelFactory
private val binding by viewBindings(StockActivityDemoBinding::inflate)
private val viewModel by viewModels<StockListViewModel> { factory }
override fun onCreate(savedInstanceState: Bundle?) {
// HERE !
DaggerStockListDemoActivityComponent.factory()
@Component(
dependencies = [
StockListFeatureApi::class
]
)
internal interface StockListDemoActivityComponent {
fun inject(target: StockListDemoActivity)
@Component.Factory
override fun onCreate(savedInstanceState: Bundle?) {
DaggerStockListDemoActivityComponent.factory()
.create(featureApi = DaggerFakeStockListFeatureComponent.create()) // HERE !
.inject(this)
super.onCreate(savedInstanceState)
}
internal class StockListViewModel @Inject constructor(
private val interactor: StockListInteractor
) : ViewModel() {
private val _stocks by lazy {
val data = MutableLiveData<List<Stock>>()
interactor
.stocks()
.subscribe({ data.value = it }, Timber::e)
data
class DefaultStockListInteractor @Inject constructor(
private val getStocksUseCase: GetStocksUseCase,
private val getStockByTickerUseCase: GetStockByTickerUseCase
) : StockListInteractor {
override fun stocks(): Single<List<Stock>> = getStocksUseCase.source()
override fun stock(ticker: String): Maybe<Stock> =
getStockByTickerUseCase.source {
GetStockByTickerUseCase.PARAM_TICKER of ticker
class GetStockByTickerUseCase @Inject constructor(
private val repository: StockListRepository,
schedulersFactory: SchedulersFactory
) : MaybeUseCase<Stock>(schedulersFactory) {
override fun sourceImpl(params: Params): Maybe<Stock> =
params.processMaybe(PARAM_TICKER, repository::stock)
companion object {
const val PARAM_TICKER = "ticker"
abstract class MaybeUseCase<T>(
private val schedulersFactory: SchedulersFactory
) {
abstract fun sourceImpl(params: Params = Params.EMPTY): Maybe<T>
fun source(params: Params = Params.EMPTY): Maybe<T> =
sourceImpl(params)
.subscribeOn(schedulersFactory.useCase())
.observeOn(schedulersFactory.main())
interface StockListDataApi : Api {
val repository: StockListRepository
}
interface StockListRepository {
fun stocks(): Single<List<Stock>>
fun stock(ticker: String): Maybe<Stock>
}