package com.kabouzeid.gramophone.ui.activities; import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.view.MenuItemCompat; 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.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.widget.TextView; import com.kabouzeid.appthemehelper.ThemeStore; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.SearchAdapter; import com.kabouzeid.gramophone.interfaces.LoaderIds; import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.loader.ArtistLoader; import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader; import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity; import com.kabouzeid.gramophone.util.Util; import java.util.ArrayList; import java.util.Collections; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; public class SearchActivity extends AbsMusicServiceActivity implements SearchView.OnQueryTextListener, LoaderManager.LoaderCallbacks<List<Object>> { public static final String TAG = SearchActivity.class.getSimpleName(); public static final String QUERY = "query"; private static final int LOADER_ID = LoaderIds.SEARCH_ACTIVITY; @BindView(R.id.recycler_view) RecyclerView recyclerView; @BindView(R.id.toolbar) Toolbar toolbar; @BindView(android.R.id.empty) TextView empty; SearchView searchView; private SearchAdapter adapter; private String query; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); setDrawUnderStatusbar(true); ButterKnife.bind(this); setStatusbarColorAuto(); setNavigationbarColorAuto(); setTaskDescriptionColorAuto(); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new SearchAdapter(this, Collections.emptyList()); adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { super.onChanged(); empty.setVisibility(adapter.getItemCount() < 1 ? View.VISIBLE : View.GONE); } }); recyclerView.setAdapter(adapter); recyclerView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { hideSoftKeyboard(); return false; } }); setUpToolBar(); if (savedInstanceState != null) { query = savedInstanceState.getString(QUERY); } getSupportLoaderManager().initLoader(LOADER_ID, null, this); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString(QUERY, query); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } private void setUpToolBar() { toolbar.setBackgroundColor(ThemeStore.primaryColor(this)); setSupportActionBar(toolbar); //noinspection ConstantConditions getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_search, menu); final MenuItem searchItem = menu.findItem(R.id.search); searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setQueryHint(getString(R.string.search_hint)); searchView.setMaxWidth(Integer.MAX_VALUE); MenuItemCompat.expandActionView(searchItem); MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { onBackPressed(); return false; } }); searchView.setQuery(query, false); searchView.post(new Runnable() { @Override public void run() { searchView.setOnQueryTextListener(SearchActivity.this); } }); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { onBackPressed(); } return super.onOptionsItemSelected(item); } private void search(@NonNull String query) { this.query = query; getSupportLoaderManager().restartLoader(LOADER_ID, null, this); } @Override public void onMediaStoreChanged() { super.onMediaStoreChanged(); getSupportLoaderManager().restartLoader(LOADER_ID, null, this); } @Override public boolean onQueryTextSubmit(String query) { hideSoftKeyboard(); return false; } @Override public boolean onQueryTextChange(String newText) { search(newText); return false; } private void hideSoftKeyboard() { Util.hideSoftKeyboard(SearchActivity.this); if (searchView != null) { searchView.clearFocus(); } } @Override public Loader<List<Object>> onCreateLoader(int id, Bundle args) { return new AsyncSearchResultLoader(this, query); } @Override public void onLoadFinished(Loader<List<Object>> loader, List<Object> data) { adapter.swapDataSet(data); } @Override public void onLoaderReset(Loader<List<Object>> loader) { adapter.swapDataSet(Collections.emptyList()); } private static class AsyncSearchResultLoader extends WrappedAsyncTaskLoader<List<Object>> { private final String query; public AsyncSearchResultLoader(Context context, String query) { super(context); this.query = query; } @Override public List<Object> loadInBackground() { List<Object> results = new ArrayList<>(); if (!TextUtils.isEmpty(query)) { List songs = SongLoader.getSongs(getContext(), query); if (!songs.isEmpty()) { results.add(getContext().getResources().getString(R.string.songs)); results.addAll(songs); } List artists = ArtistLoader.getArtists(getContext(), query); if (!artists.isEmpty()) { results.add(getContext().getResources().getString(R.string.artists)); results.addAll(artists); } List albums = AlbumLoader.getAlbums(getContext(), query); if (!albums.isEmpty()) { results.add(getContext().getResources().getString(R.string.albums)); results.addAll(albums); } } return results; } } }