From 59ca3a8c8fb83a241c86cde4efc26cd4a73a681a Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sat, 28 Feb 2015 17:49:27 +0100 Subject: [PATCH] Option to redownload artist image - redownload artist image - better search --- .../materialmusic/adapter/SearchAdapter.java | 9 ++- .../artist/LastFMArtistImageLoader.java | 13 +++- .../lastfm/artist/LastFMArtistInfoUtil.java | 1 + .../artist/LastFMArtistThumbnailLoader.java | 13 +++- .../kabouzeid/materialmusic/model/Album.java | 9 ++- .../kabouzeid/materialmusic/model/Artist.java | 21 +++++- .../materialmusic/model/SearchEntry.java | 3 +- .../kabouzeid/materialmusic/model/Song.java | 9 ++- .../ui/activities/ArtistDetailActivity.java | 16 +++-- .../ui/activities/SearchActivity.java | 70 +++++++++++++++---- app/src/main/res/menu/menu_artist_detail.xml | 5 ++ app/src/main/res/values/strings.xml | 4 ++ 12 files changed, 142 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/materialmusic/adapter/SearchAdapter.java b/app/src/main/java/com/kabouzeid/materialmusic/adapter/SearchAdapter.java index 8c47224e..cf224aac 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/adapter/SearchAdapter.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/adapter/SearchAdapter.java @@ -2,6 +2,7 @@ package com.kabouzeid.materialmusic.adapter; import android.content.Context; import android.graphics.Color; +import android.graphics.Typeface; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -38,16 +39,22 @@ public class SearchAdapter extends ArrayAdapter { final ImageView imageView = (ImageView) convertView.findViewById(R.id.image); if (item instanceof SearchActivity.LabelEntry) { + title.setTypeface(null, Typeface.BOLD); subTitle.setVisibility(View.GONE); + imageView.setVisibility(View.GONE); convertView.setBackgroundColor(Util.resolveColor(getContext(), R.attr.colorPrimary)); } else { + title.setTypeface(null, Typeface.NORMAL); subTitle.setVisibility(View.VISIBLE); + imageView.setVisibility(View.VISIBLE); convertView.setBackgroundColor(Color.TRANSPARENT); } title.setText(item.getTitle()); subTitle.setText(item.getSubTitle()); - item.loadImage(imageView); + + imageView.setImageBitmap(null); + item.loadImage(getContext(), imageView); return convertView; } diff --git a/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistImageLoader.java b/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistImageLoader.java index f49700e1..51d9f1aa 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistImageLoader.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistImageLoader.java @@ -24,10 +24,15 @@ import org.json.JSONObject; public class LastFMArtistImageLoader { public static final String TAG = LastFMArtistImageLoader.class.getSimpleName(); + @Deprecated public static void loadArtistImage(Context context, String queryArtist, ArtistImageLoaderCallback callback) { + loadArtistImage(context, queryArtist, false, callback); + } + + public static void loadArtistImage(Context context, String queryArtist, boolean forceDownload, ArtistImageLoaderCallback callback) { if (queryArtist != null) { String artistJSON = ArtistJSONStore.getInstance(context).getArtistJSON(queryArtist); - if (artistJSON != null) { + if (artistJSON != null && !forceDownload) { Log.i(TAG, queryArtist + " is in cache."); try { loadArtistImageFromJSON(new JSONObject(artistJSON), callback); @@ -35,7 +40,11 @@ public class LastFMArtistImageLoader { Log.e(TAG, "Error while parsing string from cache to JSONObject", e); } } else { - Log.i(TAG, queryArtist + " is not in cache."); + if(forceDownload){ + Log.i(TAG, queryArtist + " force re-download"); + } else { + Log.i(TAG, queryArtist + " is not in cache."); + } downloadArtistJSONAndStartImageDownload(context, queryArtist, callback); } } diff --git a/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistInfoUtil.java b/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistInfoUtil.java index 51c5f91f..11ae10b2 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistInfoUtil.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistInfoUtil.java @@ -90,6 +90,7 @@ public class LastFMArtistInfoUtil { public static void saveArtistJSONDataToCacheAndDisk(Context context, String artist, JSONObject jsonObject) { Log.i(TAG, "Saving new JSON artist data for " + artist + "..."); + ArtistJSONStore.getInstance(context).removeItem(artist); ArtistJSONStore.getInstance(context).addArtistJSON(artist, jsonObject.toString()); } } diff --git a/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistThumbnailLoader.java b/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistThumbnailLoader.java index b1851260..a96b3c88 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistThumbnailLoader.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/lastfm/artist/LastFMArtistThumbnailLoader.java @@ -24,10 +24,15 @@ import org.json.JSONObject; public class LastFMArtistThumbnailLoader { public static final String TAG = LastFMArtistThumbnailLoader.class.getSimpleName(); + @Deprecated public static void loadArtistThumbnail(Context context, String queryArtist, ArtistThumbnailLoaderCallback callback) { + loadArtistThumbnail(context, queryArtist, false, callback); + } + + public static void loadArtistThumbnail(Context context, String queryArtist, boolean forceDownload, ArtistThumbnailLoaderCallback callback) { if (queryArtist != null) { String artistJSON = ArtistJSONStore.getInstance(context).getArtistJSON(queryArtist); - if (artistJSON != null) { + if (artistJSON != null && !forceDownload) { Log.i(TAG, queryArtist + " is in cache."); try { loadArtistThumbnailFromJSON(new JSONObject(artistJSON), callback); @@ -35,7 +40,11 @@ public class LastFMArtistThumbnailLoader { Log.e(TAG, "Error while parsing string from cache to JSONObject", e); } } else { - Log.i(TAG, queryArtist + " is not in cache."); + if(forceDownload){ + Log.i(TAG, queryArtist + " force re-download"); + } else { + Log.i(TAG, queryArtist + " is not in cache."); + } downloadArtistThumbnail(context, queryArtist, callback); } } diff --git a/app/src/main/java/com/kabouzeid/materialmusic/model/Album.java b/app/src/main/java/com/kabouzeid/materialmusic/model/Album.java index 54dc8c7c..dcc59698 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/model/Album.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/model/Album.java @@ -1,7 +1,12 @@ package com.kabouzeid.materialmusic.model; +import android.content.Context; import android.widget.ImageView; +import com.kabouzeid.materialmusic.util.ImageLoaderUtil; +import com.kabouzeid.materialmusic.util.MusicUtil; +import com.nostra13.universalimageloader.core.ImageLoader; + /** * Created by karim on 22.11.14. */ @@ -43,7 +48,7 @@ public class Album implements SearchEntry { } @Override - public void loadImage(ImageView imageView) { - + public void loadImage(Context context, ImageView imageView) { + ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(id).toString(), imageView, new ImageLoaderUtil.defaultAlbumArtOnFailed()); } } diff --git a/app/src/main/java/com/kabouzeid/materialmusic/model/Artist.java b/app/src/main/java/com/kabouzeid/materialmusic/model/Artist.java index f764badd..b9c6769f 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/model/Artist.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/model/Artist.java @@ -1,7 +1,12 @@ package com.kabouzeid.materialmusic.model; +import android.content.Context; +import android.graphics.Bitmap; import android.widget.ImageView; +import com.kabouzeid.materialmusic.R; +import com.kabouzeid.materialmusic.lastfm.artist.LastFMArtistThumbnailLoader; + /** * Created by karim on 29.12.14. */ @@ -36,7 +41,19 @@ public class Artist implements SearchEntry { } @Override - public void loadImage(ImageView imageView) { - + public void loadImage(Context context, final ImageView imageView) { + imageView.setTag(name); + LastFMArtistThumbnailLoader.loadArtistThumbnail(context, name, new LastFMArtistThumbnailLoader.ArtistThumbnailLoaderCallback() { + @Override + public void onArtistThumbnailLoaded(Bitmap thumbnail) { + if (imageView.getTag().equals(name)) { + if (thumbnail != null) { + imageView.setImageBitmap(thumbnail); + } else { + imageView.setImageResource(R.drawable.default_artist_image); + } + } + } + }); } } diff --git a/app/src/main/java/com/kabouzeid/materialmusic/model/SearchEntry.java b/app/src/main/java/com/kabouzeid/materialmusic/model/SearchEntry.java index 9ebeeff0..5b6fc035 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/model/SearchEntry.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/model/SearchEntry.java @@ -1,5 +1,6 @@ package com.kabouzeid.materialmusic.model; +import android.content.Context; import android.widget.ImageView; /** @@ -10,5 +11,5 @@ public interface SearchEntry { public String getSubTitle(); - public void loadImage(ImageView imageView); + public void loadImage(Context context, ImageView imageView); } diff --git a/app/src/main/java/com/kabouzeid/materialmusic/model/Song.java b/app/src/main/java/com/kabouzeid/materialmusic/model/Song.java index 6a41c2de..5841ef13 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/model/Song.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/model/Song.java @@ -1,7 +1,12 @@ package com.kabouzeid.materialmusic.model; +import android.content.Context; import android.widget.ImageView; +import com.kabouzeid.materialmusic.util.ImageLoaderUtil; +import com.kabouzeid.materialmusic.util.MusicUtil; +import com.nostra13.universalimageloader.core.ImageLoader; + import java.io.Serializable; /** @@ -51,7 +56,7 @@ public class Song implements Serializable, SearchEntry { } @Override - public void loadImage(ImageView imageView) { - + public void loadImage(Context context, ImageView imageView) { + ImageLoader.getInstance().displayImage(MusicUtil.getAlbumArtUri(albumId).toString(), imageView, new ImageLoaderUtil.defaultAlbumArtOnFailed()); } } diff --git a/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/ArtistDetailActivity.java index 141013fa..19e48f40 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/ArtistDetailActivity.java @@ -20,6 +20,7 @@ import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks; import com.github.ksoichiro.android.observablescrollview.ScrollState; @@ -103,7 +104,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot @Override public void onTransitionEnd(Transition transition) { - setUpArtistImageAndApplyPalette(); + setUpArtistImageAndApplyPalette(false); } @Override @@ -160,7 +161,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot artistTitleText.setText(artist.name); ViewHelper.setAlpha(artistArtOverlayView, 0); - setUpArtistImageAndApplyPalette(); + setUpArtistImageAndApplyPalette(false); setUpViewPatch(); setUpSlidingTabs(); } @@ -312,8 +313,8 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot } } - private void setUpArtistImageAndApplyPalette() { - LastFMArtistImageLoader.loadArtistImage(this, artist.name, new LastFMArtistImageLoader.ArtistImageLoaderCallback() { + private void setUpArtistImageAndApplyPalette(final boolean forceDownload) { + LastFMArtistImageLoader.loadArtistImage(this, artist.name, forceDownload, new LastFMArtistImageLoader.ArtistImageLoaderCallback() { @SuppressLint("NewApi") @Override public void onArtistImageLoaded(Bitmap artistImage) { @@ -321,7 +322,9 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot artistImageView.setImageBitmap(artistImage); applyPalette(artistImage); } - //if (Util.hasLollipopSDK()) startPostponedEnterTransition(); + if(forceDownload){ + Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updated_artist_image_for) + " " + artist.name, Toast.LENGTH_SHORT).show(); + } } }); } @@ -383,6 +386,9 @@ public class ArtistDetailActivity extends AbsFabActivity implements OnMusicRemot case android.R.id.home: super.onBackPressed(); return true; + case R.id.action_re_download_artist_image: + Toast.makeText(ArtistDetailActivity.this, getResources().getString(R.string.updating), Toast.LENGTH_SHORT).show(); + setUpArtistImageAndApplyPalette(true); case R.id.action_settings: return true; case R.id.action_current_playing: diff --git a/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/SearchActivity.java b/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/SearchActivity.java index 94e0a9b0..7c5882bb 100644 --- a/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/SearchActivity.java +++ b/app/src/main/java/com/kabouzeid/materialmusic/ui/activities/SearchActivity.java @@ -2,6 +2,7 @@ package com.kabouzeid.materialmusic.ui.activities; import android.annotation.SuppressLint; import android.app.ActionBar; +import android.content.Context; import android.os.Bundle; import android.support.v4.util.Pair; import android.support.v4.view.MenuItemCompat; @@ -9,6 +10,7 @@ import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; +import android.view.MotionEvent; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; @@ -34,6 +36,7 @@ public class SearchActivity extends AbsBaseActivity { public static final String TAG = SearchActivity.class.getSimpleName(); private ListView listView; + private SearchView searchView; @SuppressLint("NewApi") @Override @@ -69,6 +72,17 @@ public class SearchActivity extends AbsBaseActivity { } }); + listView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + Util.hideSoftKeyboard(SearchActivity.this); + if(searchView != null){ + searchView.clearFocus(); + } + return false; + } + }); + setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @@ -101,7 +115,7 @@ public class SearchActivity extends AbsBaseActivity { getMenuInflater().inflate(R.menu.menu_search, menu); final MenuItem search = menu.findItem(R.id.action_search); - SearchView searchView = (SearchView) MenuItemCompat.getActionView(search); + searchView = (SearchView) MenuItemCompat.getActionView(search); searchView.setIconified(false); searchView.setIconifiedByDefault(false); @@ -111,7 +125,10 @@ public class SearchActivity extends AbsBaseActivity { searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { - return false; + onQueryTextChange(query); + Util.hideSoftKeyboard(SearchActivity.this); + searchView.clearFocus(); + return true; } @Override @@ -148,26 +165,51 @@ public class SearchActivity extends AbsBaseActivity { } private void search(String query) { + List results = new ArrayList<>(); if (!query.trim().equals("")) { - List results = new ArrayList<>(); - results.add(new LabelEntry("Songs")); - results.addAll(SongLoader.getSongs(this, query)); - results.add(new LabelEntry("Artists")); - results.addAll(ArtistLoader.getArtists(this, query)); - results.add(new LabelEntry("Albums")); - results.addAll(AlbumLoader.getAlbums(this, query)); - ArrayAdapter adapter = new SearchAdapter(this, results); - listView.setAdapter(adapter); - } else { - listView.setAdapter(null); + LabelEntry songLabel = new LabelEntry(getResources().getString(R.string.songs).toUpperCase()); + results.add(songLabel); + List songs = SongLoader.getSongs(this, query); + results.addAll(songs); + songLabel.setNumber(songs.size()); + + LabelEntry artistLabel = new LabelEntry(getResources().getString(R.string.artists).toUpperCase()); + results.add(artistLabel); + List artists = ArtistLoader.getArtists(this, query); + results.addAll(artists); + artistLabel.setNumber(artists.size()); + + LabelEntry albumLabel = new LabelEntry(getResources().getString(R.string.albums).toUpperCase()); + results.add(albumLabel); + List albums = AlbumLoader.getAlbums(this, query); + results.addAll(albums); + albumLabel.setNumber(albums.size()); } + if(results.size() <= 3){ + results.clear(); + results.add(new LabelEntry(getResources().getString(R.string.no_results).toUpperCase())); + } + ArrayAdapter adapter = new SearchAdapter(this, results); + listView.setAdapter(adapter); } + + public static class LabelEntry implements SearchEntry { + String title; String label; public LabelEntry(String label) { this.label = label; + this.title = label; + } + + public void setNumber(int number){ + if(number != -1) { + label = title + " (" + number + ")"; + } else { + label = title; + } } @Override @@ -181,7 +223,7 @@ public class SearchActivity extends AbsBaseActivity { } @Override - public void loadImage(ImageView imageView) { + public void loadImage(Context context, ImageView imageView) { } } diff --git a/app/src/main/res/menu/menu_artist_detail.xml b/app/src/main/res/menu/menu_artist_detail.xml index 9daf7a67..209df9bd 100644 --- a/app/src/main/res/menu/menu_artist_detail.xml +++ b/app/src/main/res/menu/menu_artist_detail.xml @@ -9,6 +9,11 @@ android:title="@string/action_current_playing" app:showAsAction="ifRoom"/> + + Material Music is a completely free material designed music player by Karim Abou Zeid.\n\nGoogle+   Twitter SearchActivity more + No results + Update artist image + Updated artist image for + Updating…