package com.kickstarter.ui.activities; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Pair; import com.jakewharton.rxbinding.support.v7.widget.RxRecyclerView; import com.kickstarter.R; import com.kickstarter.libs.BaseActivity; import com.kickstarter.libs.RecyclerViewPaginator; import com.kickstarter.libs.RefTag; import com.kickstarter.libs.qualifiers.RequiresActivityViewModel; import com.kickstarter.libs.utils.InputUtils; import com.kickstarter.models.Project; import com.kickstarter.ui.IntentKey; import com.kickstarter.ui.adapters.SearchAdapter; import com.kickstarter.ui.toolbars.SearchToolbar; import com.kickstarter.ui.viewholders.ProjectSearchResultViewHolder; import com.kickstarter.viewmodels.SearchViewModel; import butterknife.Bind; import butterknife.ButterKnife; import rx.android.schedulers.AndroidSchedulers; @RequiresActivityViewModel(SearchViewModel.ViewModel.class) public final class SearchActivity extends BaseActivity<SearchViewModel.ViewModel> implements SearchAdapter.Delegate { private SearchAdapter adapter; private RecyclerViewPaginator paginator; protected @Bind(R.id.search_recycler_view) RecyclerView recyclerView; protected @Bind(R.id.search_toolbar) SearchToolbar toolbar; @Override protected void onCreate(final @Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.search_layout); ButterKnife.bind(this); this.adapter = new SearchAdapter(this); this.recyclerView.setLayoutManager(new LinearLayoutManager(this)); this.recyclerView.setAdapter(this.adapter); this.paginator = new RecyclerViewPaginator(this.recyclerView, this.viewModel.inputs::nextPage); RxRecyclerView.scrollEvents(this.recyclerView) .compose(bindToLifecycle()) .filter(scrollEvent -> scrollEvent.dy() != 0) // Skip scroll events when y is 0, usually indicates new data .observeOn(AndroidSchedulers.mainThread()) .subscribe(__ -> InputUtils.hideKeyboard(this, getCurrentFocus())); this.viewModel.outputs.popularProjects() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this.adapter::loadPopularProjects); this.viewModel.outputs.searchProjects() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this.adapter::loadSearchProjects); this.viewModel.outputs.startProjectActivity() .compose(bindToLifecycle()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::startProjectActivity); } private void startProjectActivity(final @NonNull Pair<Project, RefTag> projectAndRefTag) { final Intent intent = new Intent(this, ProjectActivity.class) .putExtra(IntentKey.PROJECT, projectAndRefTag.first) .putExtra(IntentKey.REF_TAG, projectAndRefTag.second); startActivity(intent); overridePendingTransition(R.anim.slide_in_right, R.anim.fade_out_slide_out_left); } @Override protected void onDestroy() { super.onDestroy(); this.paginator.stop(); this.recyclerView.setAdapter(null); } public void projectSearchResultClick(final @NonNull ProjectSearchResultViewHolder viewHolder, final @NonNull Project project) { this.viewModel.inputs.projectClicked(project); } }