blob: 5636530366686ffd516900acf79cb5621b5e86b1 [file] [log] [blame]
package com.airbnb.lottie.samples
import android.content.Intent
import com.airbnb.epoxy.EpoxyController
import com.airbnb.lottie.samples.model.AnimationResponseV2
import com.airbnb.lottie.samples.model.CompositionArgs
import com.airbnb.lottie.samples.model.ShowcaseItem
import com.airbnb.lottie.samples.views.animationItemView
import com.airbnb.lottie.samples.views.loadingView
import com.airbnb.lottie.samples.views.marquee
import com.airbnb.lottie.samples.views.showcaseCarousel
import com.airbnb.mvrx.Async
import com.airbnb.mvrx.MvRxState
import com.airbnb.mvrx.MvRxViewModelFactory
import com.airbnb.mvrx.Uninitialized
import com.airbnb.mvrx.ViewModelContext
import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState
import io.reactivex.schedulers.Schedulers
data class ShowcaseState(val response: Async<AnimationResponseV2> = Uninitialized) : MvRxState
class ShowcaseViewModel(initialState: ShowcaseState, api: LottiefilesApi) : MvRxViewModel<ShowcaseState>(initialState) {
init {
api.getCollection()
.subscribeOn(Schedulers.io())
.retry(3)
.execute { copy(response = it) }
}
companion object : MvRxViewModelFactory<ShowcaseViewModel, ShowcaseState> {
override fun create(viewModelContext: ViewModelContext, state: ShowcaseState): ShowcaseViewModel? {
val service = viewModelContext.app<LottieApplication>().lottiefilesService
return ShowcaseViewModel(state, service)
}
}
}
class ShowcaseFragment : BaseEpoxyFragment() {
private val showcaseItems = listOf(
ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_app_intro) {
startActivity(Intent(requireContext(), AppIntroActivity::class.java))
},
ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_dynamic_properties) {
startActivity(Intent(requireContext(), DynamicActivity::class.java))
},
ShowcaseItem(R.drawable.gilbert_animated, R.string.showcase_item_animated_text) {
startActivity(Intent(requireContext(), TypographyDemoActivity::class.java))
},
ShowcaseItem(R.drawable.gilbert_animated, R.string.showcase_item_dynamic_text) {
startActivity(Intent(requireContext(), DynamicTextActivity::class.java))
},
ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_bullseye) {
startActivity(Intent(requireContext(), BullseyeActivity::class.java))
},
ShowcaseItem(R.drawable.showcase_preview_lottie, R.string.showcase_item_recycler_view) {
startActivity(Intent(requireContext(), ListActivity::class.java))
}
)
private val viewModel: ShowcaseViewModel by fragmentViewModel()
override fun EpoxyController.buildModels() = withState(viewModel) { state ->
marquee {
id("showcase")
title("Showcase")
}
showcaseCarousel {
id("carousel")
showcaseItems(showcaseItems)
}
val collectionItems = state.response()?.data
if (collectionItems == null) {
loadingView {
id("loading")
}
} else {
collectionItems.forEach {
animationItemView {
id(it.id)
title(it.title)
previewUrl("https://assets9.lottiefiles.com/${it.preview}")
previewBackgroundColor(it.bgColorInt)
onClickListener { _ -> startActivity(PlayerActivity.intent(requireContext(), CompositionArgs(animationDataV2 = it))) }
}
}
}
}
}