/* * SearchActivity on android that renders states emitted by the StateMachine */ class SearchActivity : BaseBetaActivity() { companion object { fun launch(activity: Activity) { val intent = Intent(activity, SearchActivity::class.java) activity.startActivity(intent) } } private val filterView: FilterView by lazy { FilterView(this@SearchActivity) } private val adapter: SearchAdapter = SearchAdapter(items = emptyList()) private lateinit var viewModel: SearchViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.search) viewModel = ViewModelProviders.of( this, SearchViewModel.SearchViewModelFactory( application ) ).get(SearchViewModel::class.java) initViews() lifecycleScope.launch { viewModel.viewState.collect { state -> render(state) } } } override fun onBackPressed() { viewModel.dispatchAction(Search.Action.BackButtonTapAction) } private fun render(state: Search.State) { when(state.type) { Search.StateType.InitialState -> { showInstructionsView() } Search.StateType.FilterOptionsLoaded -> { filterView.updateCountryList(state.filterOptions.filterCountryList) } Search.StateType.ShowResultsState -> { adapter.setItems(state.items) state.diffResult!!.dispatchUpdatesTo(adapter) search_results_list.visibility = View.VISIBLE instructions.visibility = View.GONE } Search.StateType.OpenFilterState -> { filterView.open() } Search.StateType.CloseFilterState -> { filterView.close() } Search.StateType.ClosePageState -> { finish() } } } private fun initViews() { filterView.attachViewModel(viewModel) filterView.showSortBySection(true) search_container.addView(filterView, FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)) search_input.background.setColorFilter(resources.getColor(R.color.off_white), PorterDuff.Mode.SRC_IN) val context = this val layoutManager = LinearLayoutManager(context) search_results_list.layoutManager = layoutManager search_results_list.adapter = adapter search_results_list.addItemDecoration(DividerItemDecoration(context, layoutManager.orientation)) search_results_list.addOnItemTouchListener(RecyclerItemClickListener(context, object : RecyclerItemClickListener.OnItemClickListener { override fun onItemClick(childView: View, position: Int) { ExitActivity.launch(this@SearchActivity, adapter.getItem(position)._id) } override fun onItemLongPress(childView: View, position: Int) { } })) back_btn.setOnClickListener { viewModel.dispatchAction(Search.Action.BackButtonTapAction) } filter_icon.setOnClickListener { this.closeKeyboard() viewModel.dispatchAction(Search.Action.TapOpenFilterIcon) } search_input.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) { } override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} override fun afterTextChanged(editable: Editable) { viewModel.dispatchAction( Search.Action.QueryChangeAction( filterState = filterView.generateFilterState(), query = editable.toString() ) ) } }) } private fun showInstructionsView() { progress_bar.visibility = View.GONE instructions.visibility = View.VISIBLE search_results_list.visibility = View.GONE } }