package com.simplecity.amp_library.search; import android.annotation.SuppressLint; import android.app.SearchManager; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.view.WindowManager; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.bumptech.glide.Glide; import com.bumptech.glide.RequestManager; import com.jakewharton.rxbinding.support.v7.widget.RxSearchView; import com.readystatesoftware.systembartint.SystemBarTintManager; import com.simplecity.amp_library.R; import com.simplecity.amp_library.ShuttleApplication; import com.simplecity.amp_library.format.PrefixHighlighter; import com.simplecity.amp_library.model.AdaptableItem; import com.simplecity.amp_library.tagger.TaggerDialog; import com.simplecity.amp_library.ui.activities.BaseActivity; import com.simplecity.amp_library.ui.adapters.SearchAdapter; import com.simplecity.amp_library.ui.modelviews.EmptyView; import com.simplecity.amp_library.ui.modelviews.LoadingView; import com.simplecity.amp_library.utils.ColorUtils; import com.simplecity.amp_library.utils.ResourceUtils; import com.simplecity.amp_library.utils.SettingsManager; import com.simplecity.amp_library.utils.ShuttleUtils; import com.simplecity.amp_library.utils.ThemeUtils; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; import rx.Subscription; import rx.subscriptions.CompositeSubscription; public class SearchActivity extends BaseActivity implements com.simplecity.amp_library.search.SearchView { private static final String TAG = "SearchActivity"; private SystemBarTintManager tintManager; private Toolbar toolbar; private FastScrollRecyclerView recyclerView; private SearchAdapter adapter; private LoadingView loadingView; private EmptyView emptyView; private SearchPresenter searchPresenter; private CompositeSubscription compositeSubscription = new CompositeSubscription(); @SuppressLint("InlinedApi") @Override protected void onCreate(Bundle savedInstanceState) { loadingView = new LoadingView(); emptyView = new EmptyView(R.string.empty_search); emptyView.setHeight(ResourceUtils.toPixels(96)); ThemeUtils.setTheme(this); if (!ShuttleUtils.hasLollipop() && ShuttleUtils.hasKitKat()) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); tintManager = new SystemBarTintManager(this); } if (!ShuttleUtils.hasKitKat()) { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); } if (SettingsManager.getInstance().canTintNavBar()) { getWindow().setNavigationBarColor(ColorUtils.getPrimaryColorDark(this)); } super.onCreate(savedInstanceState); overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); setContentView(R.layout.activity_search); toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setBackgroundColor(ColorUtils.getPrimaryColor()); toolbar.inflateMenu(R.menu.menu_search_activity); toolbar.setOnMenuItemClickListener(item -> { switch (item.getItemId()) { case R.id.search_fuzzy: item.setChecked(!item.isChecked()); searchPresenter.setSearchFuzzy(item.isChecked()); break; case R.id.search_artist: item.setChecked(!item.isChecked()); searchPresenter.setSearchArtists(item.isChecked()); break; case R.id.search_album: item.setChecked(!item.isChecked()); searchPresenter.setSearchAlbums(item.isChecked()); break; } return false; }); adapter = new SearchAdapter(); SearchView searchView = (SearchView) findViewById(R.id.searchView); searchView.setIconifiedByDefault(false); compositeSubscription.add(RxSearchView.queryTextChangeEvents(searchView) .skip(1) .debounce(200, TimeUnit.MILLISECONDS) .onBackpressureLatest() .subscribe(searchViewQueryTextEvent -> searchPresenter.queryChanged(searchViewQueryTextEvent.queryText().toString()))); recyclerView = (FastScrollRecyclerView) findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(adapter); recyclerView.setThumbColor(ColorUtils.getAccentColor()); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { ThemeUtils.themeRecyclerView(recyclerView); super.onScrollStateChanged(recyclerView, newState); } }); ThemeUtils.themeStatusBar(this, tintManager); ThemeUtils.themeSearchView(this, searchView); ThemeUtils.themeRecyclerView(recyclerView); PrefixHighlighter prefixHighlighter = new PrefixHighlighter(this); RequestManager requestManager = Glide.with(this); searchPresenter = new SearchPresenter(prefixHighlighter, requestManager); searchPresenter.bindView(this); adapter.setListener(searchPresenter); final String query = getIntent().getStringExtra(SearchManager.QUERY); searchPresenter.queryChanged(query); } @Override protected void onDestroy() { super.onDestroy(); compositeSubscription.unsubscribe(); searchPresenter.unbindView(this); } @Override protected String screenName() { return TAG; } @Override public void setLoading(boolean loading) { adapter.setItems(Collections.singletonList(loadingView)); } @Override public void setEmpty(boolean empty) { adapter.setItems(Collections.singletonList(emptyView)); } @Override public Subscription setItems(@NonNull List<AdaptableItem> items) { Subscription subscription = adapter.setItems(items); recyclerView.scrollToPosition(0); return subscription; } @Override public void setFilterFuzzyChecked(boolean checked) { toolbar.getMenu().findItem(R.id.search_fuzzy).setChecked(checked); } @Override public void setFilterArtistsChecked(boolean checked) { toolbar.getMenu().findItem(R.id.search_artist).setChecked(checked); } @Override public void setFilterAlbumsChecked(boolean checked) { toolbar.getMenu().findItem(R.id.search_album).setChecked(checked); } @Override public void showEmptyPlaylistToast() { Toast.makeText(this, (ShuttleApplication.getInstance().getString(R.string.emptyplaylist)), Toast.LENGTH_SHORT).show(); } @Override public void showTaggerDialog(@NonNull TaggerDialog taggerDialog) { taggerDialog.show(getSupportFragmentManager()); } @Override public void showDeleteDialog(@NonNull MaterialDialog deleteDialog) { deleteDialog.show(); } @Override public void finish(int resultCode, Intent data) { setResult(resultCode, data); this.finish(); } }