package me.sargunvohra.android.pokesource.app.gridlist import android.os.Bundle import android.support.design.widget.Snackbar import android.support.v4.content.ContextCompat import android.support.v7.widget.GridLayoutManager import android.support.v7.widget.RecyclerView import android.view.* import android.widget.ImageView import android.widget.ProgressBar import com.bumptech.glide.Glide import com.github.nitrico.lastadapter.LastAdapter import com.github.salomonbrys.kodein.instance import me.sargunvohra.android.pokesource.app.BR import me.sargunvohra.android.pokesource.app.R import me.sargunvohra.android.pokesource.app.exception.ErrorMessageFactory import me.sargunvohra.android.pokesource.app.navigation.Navigator import me.sargunvohra.skaffold.base.BaseFragment abstract class GridListFragment : GridListContract.View, BaseFragment() { val errorMessageFactory: ErrorMessageFactory by injector.instance() val navigator: Navigator by injector.instance() val contentView: RecyclerView by binder.bind(R.id.contentView) val loadingView: ProgressBar by binder.bind(R.id.loadingView) val rootView: View by binder.bind(R.id.rootView) val content = mutableListOf() var errorSnackbar: Snackbar? = null override val layout = R.layout.fragment_grid_list override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { val view = super.onCreateView(inflater, container, savedInstanceState) contentView.layoutManager = GridLayoutManager(context, 3) LastAdapter.with(content, BR.item) .map(R.layout.fragment_grid_list_item) .onBind { bindListItem() } .onClick { presenter.onPressedItem(position) } .into(contentView) return view } private fun LastAdapter.ItemViewPosition.bindListItem() { val imageView = view.findViewById(R.id.iconImage) as ImageView val content = item as GridListItem if (content.imageUrl == null) { imageView.setImageResource(content.imageRes) } else { Glide.with(context).load(content.imageUrl).into(imageView) } } override fun navigateToGridList(type: GridListType) = navigator.navigateToGridList(context, type) override fun showLoading() { hideContent() hideError() loadingView.visibility = View.VISIBLE } override fun hideLoading() { loadingView.visibility = View.GONE } override fun showContent(newContent: List) { hideLoading() hideError() content.clear() content.addAll(newContent) contentView.adapter.notifyDataSetChanged() contentView.visibility = View.VISIBLE } override fun hideContent() { contentView.visibility = View.GONE } override fun showError(error: Throwable) { val message = errorMessageFactory.create(context, error) val snackbar = Snackbar.make(rootView, message, Snackbar.LENGTH_INDEFINITE) snackbar.view.setBackgroundColor(ContextCompat.getColor(context, R.color.errorSnackBar)) snackbar.setAction(R.string.retry) { hideError() presenter.onPressedRetry() } snackbar.setActionTextColor(ContextCompat.getColor(context, R.color.snackbarActionText)) snackbar.show() errorSnackbar = snackbar } override fun hideError() { errorSnackbar?.dismiss() errorSnackbar = null } }