From 9eb147625ca8b8f824d51ea95ebc1cd3af23408b Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Mon, 21 Mar 2016 00:51:14 +0100 Subject: [PATCH] The search now loads results async. --- .../gramophone/adapter/SearchAdapter.java | 54 +++------- .../ui/activities/SearchActivity.java | 100 +++++++++++++++--- 2 files changed, 103 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java index a9e5a17a..fe6979e0 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java @@ -20,9 +20,6 @@ import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.artistimage.ArtistImage; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; -import com.kabouzeid.gramophone.loader.AlbumLoader; -import com.kabouzeid.gramophone.loader.ArtistLoader; -import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.Song; @@ -31,55 +28,36 @@ import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import java.util.ArrayList; -import java.util.Collections; import java.util.List; /** * @author Karim Abou Zeid (kabouzeid) */ public class SearchAdapter extends RecyclerView.Adapter { + private static final int HEADER = 0; private static final int ALBUM = 1; private static final int ARTIST = 2; private static final int SONG = 3; private final AppCompatActivity activity; - private List results = Collections.emptyList(); + private List dataSet; - public SearchAdapter(@NonNull AppCompatActivity activity) { + public SearchAdapter(@NonNull AppCompatActivity activity, @NonNull List dataSet) { this.activity = activity; + this.dataSet = dataSet; } - @SuppressWarnings("unchecked") - public void search(@NonNull String query) { - results = new ArrayList(); - if (!query.trim().equals("")) { - List songs = SongLoader.getSongs(activity, query); - if (!songs.isEmpty()) { - results.add(activity.getResources().getString(R.string.songs)); - results.addAll(songs); - } - - List artists = ArtistLoader.getArtists(activity, query); - if (!artists.isEmpty()) { - results.add(activity.getResources().getString(R.string.artists)); - results.addAll(artists); - } - - List albums = AlbumLoader.getAlbums(activity, query); - if (!albums.isEmpty()) { - results.add(activity.getResources().getString(R.string.albums)); - results.addAll(albums); - } - } + public void swapDataSet(@NonNull List dataSet) { + this.dataSet = dataSet; notifyDataSetChanged(); } @Override public int getItemViewType(int position) { - if (results.get(position) instanceof Album) return ALBUM; - if (results.get(position) instanceof Artist) return ARTIST; - if (results.get(position) instanceof Song) return SONG; + if (dataSet.get(position) instanceof Album) return ALBUM; + if (dataSet.get(position) instanceof Artist) return ARTIST; + if (dataSet.get(position) instanceof Song) return SONG; return HEADER; } @@ -96,7 +74,7 @@ public class SearchAdapter extends RecyclerView.Adapter> { public static final String TAG = SearchActivity.class.getSimpleName(); + private static final int LOADER_ID = 1; + @Bind(R.id.recycler_view) RecyclerView recyclerView; @Bind(R.id.toolbar) @@ -34,9 +47,7 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie SearchView searchView; - private SearchAdapter searchAdapter; - - private String lastQuery = ""; + private SearchAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { @@ -50,8 +61,15 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie setTaskDescriptionColorAuto(); recyclerView.setLayoutManager(new LinearLayoutManager(this)); - searchAdapter = new SearchAdapter(this); - recyclerView.setAdapter(searchAdapter); + 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 @@ -62,6 +80,8 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie }); setUpToolBar(); + + getSupportLoaderManager().initLoader(LOADER_ID, null, this); } private void setUpToolBar() { @@ -106,17 +126,18 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie } private void search(@NonNull String query) { - lastQuery = query; - if (searchAdapter != null) { - searchAdapter.search(query); - empty.setVisibility(searchAdapter.getItemCount() < 1 ? View.VISIBLE : View.GONE); - } + Loader loader = getSupportLoaderManager().getLoader(LOADER_ID); + AsyncSearchResultLoader asyncSearchResultLoader = (AsyncSearchResultLoader) loader; + asyncSearchResultLoader.setQuery(query); + asyncSearchResultLoader.forceLoad(); } @Override public void onMediaStoreChanged() { super.onMediaStoreChanged(); - search(lastQuery); + Loader loader = getSupportLoaderManager().getLoader(LOADER_ID); + AsyncSearchResultLoader asyncSearchResultLoader = (AsyncSearchResultLoader) loader; + asyncSearchResultLoader.forceLoad(); } @Override @@ -137,4 +158,57 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie searchView.clearFocus(); } } + + @Override + public Loader> onCreateLoader(int id, Bundle args) { + return new AsyncSearchResultLoader(this); + } + + @Override + public void onLoadFinished(Loader> loader, List data) { + adapter.swapDataSet(data); + } + + @Override + public void onLoaderReset(Loader> loader) { + adapter.swapDataSet(Collections.emptyList()); + } + + private static class AsyncSearchResultLoader extends WrappedAsyncTaskLoader> { + private String query; + + public AsyncSearchResultLoader(Context context) { + super(context); + setUpdateThrottle(200); + } + + public void setQuery(@Nullable String query) { + this.query = query; + } + + @Override + public List loadInBackground() { + List results = new ArrayList<>(); + if (query != null && !query.trim().equals("")) { + 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; + } + } }