Skip to content

Instantly share code, notes, and snippets.

@Popalay
Created July 21, 2017 10:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Popalay/133a9e16184c938d7172530a2a0f1823 to your computer and use it in GitHub Desktop.
Save Popalay/133a9e16184c938d7172530a2a0f1823 to your computer and use it in GitHub Desktop.
KotlinSample
import android.arch.lifecycle.ViewModelProvider
import android.arch.lifecycle.ViewModelProviders
import android.content.Context
import android.content.Intent
import android.databinding.DataBindingUtil
import android.graphics.Color
import android.os.Bundle
import android.view.View
import com.popalay.cardme.R
import com.popalay.cardme.databinding.ActivityHolderDetailsBinding
import com.popalay.cardme.presentation.base.SlidingActivity
import com.popalay.cardme.utils.ShareUtils
import com.popalay.cardme.utils.recycler.decoration.SpacingItemDecoration
import io.reactivex.rxkotlin.addTo
import javax.inject.Inject
class HolderDetailsActivity : SlidingActivity() {
@Inject lateinit var factory: ViewModelProvider.Factory
private lateinit var b: ActivityHolderDetailsBinding
private lateinit var viewModelFacade: HolderDetailsViewModelFacade
private var isExpanded: Boolean = false
companion object {
const val KEY_HOLDER_DETAILS = "KEY_HOLDER_DETAILS"
fun getIntent(context: Context, id: String): Intent {
val intent = Intent(context, HolderDetailsActivity::class.java)
intent.putExtra(KEY_HOLDER_DETAILS, id)
return intent
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
b = DataBindingUtil.setContentView<ActivityHolderDetailsBinding>(this, R.layout.activity_holder_details)
ViewModelProviders.of(this, factory).get(HolderDetailsViewModel::class.java).let {
b.vm = it
viewModelFacade = it
}
initUI()
}
override fun getRootView(): View = b.root
override fun canSlideDown() = isExpanded && b.listDebts.scrollY == 0
private fun initUI() {
setSupportActionBar(b.toolbar)
b.collapsingToolbar.isTitleEnabled = false
b.toolbar.setNavigationOnClickListener { onBackPressed() }
viewModelFacade.doOnShareCard()
.subscribe {
ShareUtils.shareText(this, R.string.share_card, it)
}.addTo(disposables)
b.listCards.addItemDecoration(SpacingItemDecoration.Builder(this)
.onSides(true)
.betweenItems(true)
.build())
b.toolbar.navigationIcon?.alpha = 255
b.appBar.addOnOffsetChangedListener { appBarLayout, verticalOffset ->
isExpanded = verticalOffset == 0
if (appBarLayout.totalScrollRange == 0) {
return@addOnOffsetChangedListener
}
val alpha = Math.min(-verticalOffset, 255)
b.toolbar.setTitleTextColor(Color.argb(alpha, 255, 255, 255))
b.toolbar.navigationIcon?.alpha = alpha
}
}
}
import android.databinding.ObservableBoolean
import com.jakewharton.rxrelay2.PublishRelay
import com.popalay.cardme.business.cards.CardInteractor
import com.popalay.cardme.business.debts.DebtsInteractor
import com.popalay.cardme.business.holders.HolderInteractor
import com.popalay.cardme.business.settings.SettingsInteractor
import com.popalay.cardme.data.models.Card
import com.popalay.cardme.data.models.Debt
import com.popalay.cardme.presentation.base.BaseViewModel
import com.popalay.cardme.utils.extensions.applyThrottling
import com.popalay.cardme.utils.extensions.setTo
import com.popalay.cardme.utils.recycler.DiffObservableList
import com.stepango.rxdatabindings.ObservableString
import com.stepango.rxdatabindings.setTo
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.rxkotlin.addTo
import io.reactivex.rxkotlin.subscribeBy
import javax.inject.Inject
import javax.inject.Named
class HolderDetailsViewModel @Inject constructor(
@Named(HolderDetailsActivity.KEY_HOLDER_DETAILS) holderId: String,
cardInteractor: CardInteractor,
holderInteractor: HolderInteractor,
debtsInteractor: DebtsInteractor,
settingsInteractor: SettingsInteractor
) : BaseViewModel(), HolderDetailsViewModelFacade {
val debts = DiffObservableList<Debt>()
val cards = DiffObservableList<Card>()
val holderName = ObservableString()
val showImage = ObservableBoolean()
val cardClickPublisher: PublishRelay<Card> = PublishRelay.create<Card>()
init {
cardInteractor.getCardsByHolder(holderId)
.observeOn(AndroidSchedulers.mainThread())
.setTo(cards)
.subscribeBy()
.addTo(disposables)
debtsInteractor.getDebtsByHolder(holderId)
.observeOn(AndroidSchedulers.mainThread())
.setTo(debts)
.subscribeBy()
.addTo(disposables)
holderInteractor.getHolderName(holderId)
.observeOn(AndroidSchedulers.mainThread())
.setTo(holderName)
.subscribeBy()
.addTo(disposables)
settingsInteractor.listenShowCardsBackground()
.observeOn(AndroidSchedulers.mainThread())
.setTo(showImage)
.subscribeBy()
.addTo(disposables)
}
override fun doOnShareCard(): Observable<String> = cardClickPublisher
.applyThrottling()
.map { it.number }
}
import android.arch.lifecycle.ViewModel
import android.arch.lifecycle.ViewModelProvider
import javax.inject.Inject
import javax.inject.Provider
class ViewModelFactory @Inject constructor(
private val creators: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
var creator: Provider<out ViewModel>? = creators[modelClass]
creator ?: creators.keys.filter(modelClass::isAssignableFrom).firstOrNull()?.apply { creator = creators[this] }
creator ?: throw IllegalArgumentException("unknown model class " + modelClass)
try {
return creator?.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment