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 54f1bdaf..1662bec3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/SearchAdapter.java @@ -13,9 +13,6 @@ import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; -import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient; -import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo; -import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image; import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.loader.ArtistLoader; import com.kabouzeid.gramophone.loader.SongLoader; @@ -33,9 +30,6 @@ import java.util.Collections; import java.util.List; import butterknife.ButterKnife; -import retrofit.Callback; -import retrofit.RetrofitError; -import retrofit.client.Response; /** * @author Karim Abou Zeid (kabouzeid) @@ -48,11 +42,9 @@ public class SearchAdapter extends RecyclerView.Adapter() { - @Override - public void success(@NonNull ArtistInfo artistInfo, Response response) { - if (artistInfo.getArtist() != null) { - int thumbnailIndex = 0; - List images = artistInfo.getArtist().getImage(); - if (images.size() > 2) { - thumbnailIndex = 2; - } else if (images.size() > 1) { - thumbnailIndex = 1; - } - ImageLoader.getInstance().displayImage(images.get(thumbnailIndex).getText(), - holder.image, - new DisplayImageOptions.Builder() - .cacheInMemory(true) - .cacheOnDisk(true) - .resetViewBeforeLoading(true) - .showImageOnFail(R.drawable.default_artist_image) - .showImageForEmptyUri(R.drawable.default_artist_image) - .build() - ); - } else { - holder.image.setImageResource(R.drawable.default_artist_image); - } - } - - @Override - public void failure(RetrofitError error) { - holder.image.setImageResource(R.drawable.default_artist_image); - } - }); + ImageLoader.getInstance().displayImage(MusicUtil.getArtistImageLoaderString(artist, false), + holder.image, + new DisplayImageOptions.Builder() + .cacheInMemory(true) + .cacheOnDisk(true) + .resetViewBeforeLoading(true) + .showImageOnFail(R.drawable.default_artist_image) + .build() + ); break; case SONG: final Song song = (Song) results.get(position); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java index 892c92c9..11cb7726 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/album/AlbumAdapter.java @@ -10,7 +10,6 @@ import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; @@ -26,7 +25,6 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; -import com.kabouzeid.gramophone.util.ViewUtil; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; @@ -34,6 +32,7 @@ import com.nostra13.universalimageloader.core.assist.LoadedFrom; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; import com.nostra13.universalimageloader.core.imageaware.ImageAware; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; +import com.nostra13.universalimageloader.core.process.BitmapProcessor; import java.util.ArrayList; import java.util.List; @@ -51,7 +50,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) { super(activity, cabHolder, R.menu.menu_media_selection); @@ -62,6 +61,11 @@ public class AlbumAdapter extends AbsMultiSelectAdapter getDataSet() { return dataSet; } @@ -99,11 +103,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter dataSet, @Nullable CabHolder cabHolder) { super(activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, cabHolder); + usePalette = false; } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistAdapter.java index a5b3b193..496a1a9e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/artist/ArtistAdapter.java @@ -17,9 +17,6 @@ import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.CabHolder; -import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient; -import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo; -import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image; import com.kabouzeid.gramophone.loader.ArtistSongLoader; import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.Song; @@ -32,10 +29,6 @@ import com.nostra13.universalimageloader.core.ImageLoader; import java.util.ArrayList; import java.util.List; -import retrofit.Callback; -import retrofit.RetrofitError; -import retrofit.client.Response; - /** * @author Karim Abou Zeid (kabouzeid) */ @@ -43,14 +36,12 @@ public class ArtistAdapter extends AbsMultiSelectAdapter dataSet; protected int itemLayoutRes; - protected final LastFMRestClient lastFMRestClient; public ArtistAdapter(@NonNull AppCompatActivity activity, ArrayList dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) { super(activity, cabHolder, R.menu.menu_media_selection); this.activity = activity; this.dataSet = dataSet; this.itemLayoutRes = itemLayoutRes; - lastFMRestClient = new LastFMRestClient(activity); setHasStableIds(true); } @@ -94,39 +85,15 @@ public class ArtistAdapter extends AbsMultiSelectAdapter() { - @Override - public void success(@NonNull ArtistInfo artistInfo, Response response) { - if (artistInfo.getArtist() != null) { - List images = artistInfo.getArtist().getImage(); - if (images == null || images.isEmpty()) { - return; - } - ImageLoader.getInstance().displayImage(images.get(images.size() - 1).getText(), - holder.image, - new DisplayImageOptions.Builder() - .cacheInMemory(true) - .cacheOnDisk(true) - .resetViewBeforeLoading(true) - .showImageOnFail(R.drawable.default_artist_image) - .showImageForEmptyUri(R.drawable.default_artist_image) - .build() - ); - } else { - holder.image.setImageResource(R.drawable.default_artist_image); - } - } - - @Override - public void failure(RetrofitError error) { - holder.image.setImageResource(R.drawable.default_artist_image); - } - }); + ImageLoader.getInstance().displayImage(MusicUtil.getArtistImageLoaderString(artist, false), + holder.image, + new DisplayImageOptions.Builder() + .cacheInMemory(true) + .cacheOnDisk(true) + .resetViewBeforeLoading(true) + .showImageOnFail(R.drawable.default_artist_image) + .build() + ); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/base/MediaEntryViewHolder.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/base/MediaEntryViewHolder.java index 60f32b09..50e88559 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/base/MediaEntryViewHolder.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/base/MediaEntryViewHolder.java @@ -41,11 +41,6 @@ public abstract class MediaEntryViewHolder extends RecyclerView.ViewHolder imple @InjectView(R.id.menu) public View menu; - @Nullable - @Optional - @InjectView(R.id.palette_color_container) - public View paletteColorContainer; - @Nullable @Optional @InjectView(R.id.separator) @@ -60,6 +55,12 @@ public abstract class MediaEntryViewHolder extends RecyclerView.ViewHolder imple @InjectView(R.id.selected_indicator) public View selectedIndicator; + @Nullable + @Optional + @InjectView(R.id.palette_color_container) + public View paletteColorContainer; + public int paletteColor; + public MediaEntryViewHolder(View itemView) { super(itemView); ButterKnife.inject(this, itemView); diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java index 8e9291ce..6733694e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/AddToPlaylistDialog.java @@ -54,6 +54,7 @@ public class AddToPlaylistDialog extends DialogFragment { public void onSelection(@NonNull MaterialDialog materialDialog, View view, int i, CharSequence charSequence) { //noinspection unchecked final ArrayList songs = (ArrayList) getArguments().getSerializable("songs"); + if (songs == null) return; if (i == 0) { materialDialog.dismiss(); CreatePlaylistDialog.create(songs).show(getActivity().getSupportFragmentManager(), "ADD_TO_PLAYLIST"); diff --git a/app/src/main/java/com/kabouzeid/gramophone/dialogs/ColorChooserDialog.java b/app/src/main/java/com/kabouzeid/gramophone/dialogs/ColorChooserDialog.java index 8e3e3519..9696d9f9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/dialogs/ColorChooserDialog.java +++ b/app/src/main/java/com/kabouzeid/gramophone/dialogs/ColorChooserDialog.java @@ -24,6 +24,7 @@ import android.widget.GridView; import com.afollestad.materialdialogs.MaterialDialog; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.views.ColorView; /** @@ -33,7 +34,6 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi private ColorCallback mCallback; private int[] mColors; - @Nullable private GridView mGrid; @Override @@ -149,7 +149,7 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi new int[]{android.R.attr.state_pressed} }; int[] colors = new int[]{ - shiftColorDown(mColors[position]) + ColorUtil.shiftColorDown(mColors[position]) }; ColorStateList rippleColors = new ColorStateList(states, colors); colorView.setForeground(new RippleDrawable(rippleColors, selector, null)); @@ -167,14 +167,6 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi } } - @SuppressWarnings("ResourceType") - private static int shiftColorDown(int color) { - float[] hsv = new float[3]; - Color.colorToHSV(color, hsv); - hsv[2] *= 0.9f; // value component - return Color.HSVToColor(hsv); - } - private static int translucentColor(int color) { final float factor = 0.7f; int alpha = Math.round(Color.alpha(color) * factor); @@ -187,7 +179,7 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi @NonNull private static Drawable createSelector(int color) { ShapeDrawable darkerCircle = new ShapeDrawable(new OvalShape()); - darkerCircle.getPaint().setColor(translucentColor(shiftColorDown(color))); + darkerCircle.getPaint().setColor(translucentColor(ColorUtil.shiftColorDown(color))); StateListDrawable stateListDrawable = new StateListDrawable(); stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, darkerCircle); return stateListDrawable; diff --git a/app/src/main/java/com/kabouzeid/gramophone/imageloader/PhonographImageDownloader.java b/app/src/main/java/com/kabouzeid/gramophone/imageloader/PhonographImageDownloader.java index def90642..f9c81864 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/imageloader/PhonographImageDownloader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/imageloader/PhonographImageDownloader.java @@ -5,6 +5,9 @@ import android.graphics.Bitmap; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient; +import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo; +import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image; import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.ImageUtil; @@ -19,6 +22,8 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.List; +import java.util.Locale; /** * @author Karim Abou Zeid (kabouzeid) @@ -26,23 +31,43 @@ import java.util.ArrayList; public class PhonographImageDownloader extends BaseImageDownloader { public static final String SCHEME_ALBUM = "album://"; public static final String SCHEME_SONG = "song://"; + public static final String SCHEME_ARTIST = Scheme.HTTP.wrap("artist://"); + + private final LastFMRestClient lastFMRestClient; public PhonographImageDownloader(@NonNull Context context) { super(context); + lastFMRestClient = new LastFMRestClient(context); } @Nullable @Override public InputStream getStream(@NonNull String imageUri, Object extra) throws IOException { - if (imageUri.startsWith(SCHEME_ALBUM)) { + if (imageUri.toLowerCase(Locale.US).startsWith(SCHEME_ALBUM)) { return getStreamFromAlbum(imageUri); } - if (imageUri.startsWith(SCHEME_SONG)) { + if (imageUri.toLowerCase(Locale.US).startsWith(SCHEME_SONG)) { return getStreamFromSong(imageUri); } + if (imageUri.toLowerCase(Locale.US).startsWith(SCHEME_ARTIST)) { + return getStreamFromArtist(imageUri, extra); + } return super.getStream(imageUri, extra); } + protected InputStream getStreamFromArtist(@NonNull String imageUri, @NonNull Object extra) throws IOException { + String[] data = imageUri.substring(SCHEME_ARTIST.length()).split("#", 2); + String artistName = data[1]; + + if (MusicUtil.isArtistNameUnknown(artistName)) { + return super.getStream("", extra); + } + + ArtistInfo artistInfo = lastFMRestClient.getApiService().getArtistInfo(artistName, data[0].equals("") ? null : data[0]); + List images = artistInfo.getArtist().getImage(); + return super.getStream(images.get(images.size() - 1).getText(), extra); + } + @Nullable protected InputStream getStreamFromAlbum(@NonNull String imageUri) throws IOException { int albumId = Integer.valueOf(imageUri.substring(SCHEME_ALBUM.length())); @@ -62,7 +87,7 @@ public class PhonographImageDownloader extends BaseImageDownloader { @Nullable protected InputStream getStreamFromSong(@NonNull String imageUri) throws IOException { - String[] data = imageUri.split("#", 2); + String[] data = imageUri.substring(SCHEME_SONG.length()).split("#", 2); if (PreferenceUtil.getInstance(context).ignoreMediaStoreArtwork()) { Bitmap bitmap = ImageUtil.getEmbeddedSongArt(new File(data[1]), context); @@ -72,7 +97,7 @@ public class PhonographImageDownloader extends BaseImageDownloader { return null; } - int id = Integer.parseInt(data[0].substring(SCHEME_SONG.length())); + int id = Integer.parseInt(data[0]); return getMediaProviderAlbumArtInputStream(id); } @@ -84,7 +109,8 @@ public class PhonographImageDownloader extends BaseImageDownloader { } @NonNull - private InputStream getMediaProviderAlbumArtInputStream(int albumId) throws FileNotFoundException { + private InputStream getMediaProviderAlbumArtInputStream(int albumId) throws + FileNotFoundException { return context.getContentResolver().openInputStream(MusicUtil.getAlbumArtUri(albumId)); } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/lastfm/rest/service/LastFMService.java b/app/src/main/java/com/kabouzeid/gramophone/lastfm/rest/service/LastFMService.java index 0a2ab729..164d1cf4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/lastfm/rest/service/LastFMService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/lastfm/rest/service/LastFMService.java @@ -20,6 +20,12 @@ public interface LastFMService { @GET(BASE_QUERY_PARAMETERS + "&method=album.getinfo") void getAlbumInfo(@Query("album") String albumName, @Query("artist") String artistName, Callback callback); + @GET(BASE_QUERY_PARAMETERS + "&method=album.getinfo") + AlbumInfo getAlbumInfo(@Query("album") String albumName, @Query("artist") String artistName); + @GET(BASE_QUERY_PARAMETERS + "&method=artist.getinfo") void getArtistInfo(@Query("artist") String artistName, @Nullable @Header("Cache-Control") String cacheControl, Callback callback); + + @GET(BASE_QUERY_PARAMETERS + "&method=artist.getinfo") + ArtistInfo getArtistInfo(@Query("artist") String artistName, @Nullable @Header("Cache-Control") String cacheControl); } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/LagTracker.java b/app/src/main/java/com/kabouzeid/gramophone/misc/LagTracker.java new file mode 100644 index 00000000..12ab4f81 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/misc/LagTracker.java @@ -0,0 +1,68 @@ +package com.kabouzeid.gramophone.misc; + +import android.util.Log; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @author Aidan Follestad (afollestad) + */ +public class LagTracker { + + private static LagTracker mSingleton; + private static Map mMap; + private boolean mEnabled = true; + + private LagTracker() { + mMap = new HashMap<>(); + } + + public static LagTracker get() { + if (mSingleton == null) + mSingleton = new LagTracker(); + return mSingleton; + } + + public LagTracker enable() { + mEnabled = true; + return this; + } + + public LagTracker disable() { + mEnabled = false; + return this; + } + + public void start(String key) { + final long start = System.nanoTime(); + if (!mEnabled) { + if (!mMap.isEmpty()) + mMap.clear(); + return; + } + mMap.put(key, start); + } + + public void end(String key) { + final long end = System.nanoTime(); + if (!mEnabled) { + if (!mMap.isEmpty()) + mMap.clear(); + return; + } + if (!mMap.containsKey(key)) + throw new IllegalStateException("No start time found for " + key); + long start = mMap.get(key); + long diff = end - start; + print(key, diff); + mMap.remove(key); + } + + private void print(String key, long diff) { + long ms = TimeUnit.NANOSECONDS.toMillis(diff); + long s = TimeUnit.NANOSECONDS.toSeconds(diff); + Log.d("LagTracker", "[" + key + " completed in]: " + diff + " ns (" + ms + "ms, " + s + "s)"); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java b/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java index 053e3de7..13d7695e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java +++ b/app/src/main/java/com/kabouzeid/gramophone/prefs/ColorChooserPreference.java @@ -13,7 +13,6 @@ public class ColorChooserPreference extends Preference { private View mView; private int color; - private int border; public ColorChooserPreference(@NonNull Context context, @NonNull AttributeSet attrs) { this(context, attrs, 0); @@ -36,20 +35,19 @@ public class ColorChooserPreference extends Preference { invalidateColor(); } - public void setColor(int color, int border) { + public void setColor(int color) { this.color = color; - this.border = border; invalidateColor(); } private void invalidateColor() { if (mView != null) { - ColorView circle = (ColorView) mView.findViewById(R.id.circle); + ColorView colorView = (ColorView) mView.findViewById(R.id.circle); if (this.color != 0) { - circle.setVisibility(View.VISIBLE); - circle.setBackgroundColor(color); + colorView.setVisibility(View.VISIBLE); + colorView.setBackgroundColor(color); } else { - circle.setVisibility(View.GONE); + colorView.setVisibility(View.GONE); } } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index b2c1fc9d..289edec1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -9,7 +9,6 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.util.Pair; -import android.support.v7.graphics.Palette; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.Toolbar; import android.transition.Transition; @@ -49,13 +48,14 @@ import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; +import com.nostra13.universalimageloader.core.process.BitmapProcessor; import butterknife.ButterKnife; import butterknife.InjectView; /** * A lot of hackery is done in this activity. Changing things may will brake the whole activity. - *

+ *

* Should be kinda stable ONLY AS IT IS!!! */ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder { @@ -200,17 +200,24 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements .cacheInMemory(true) .showImageOnFail(R.drawable.default_album_art) .resetViewBeforeLoading(true) + .postProcessor(new BitmapProcessor() { + @Override + public Bitmap process(Bitmap bitmap) { + final int color = ColorUtil.generateColor(AlbumDetailActivity.this, bitmap); + runOnUiThread(new Runnable() { + @Override + public void run() { + setColors(color); + } + }); + return bitmap; + } + }) .build(), new SimpleImageLoadingListener() { @Override public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) { - applyPalette(null); - - ImageLoader.getInstance().displayImage( - "drawable://" + R.drawable.default_album_art, - albumArtBackground, - new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build() - ); + setUpBackground("drawable://" + R.drawable.default_album_art); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) startPostponedEnterTransition(); @@ -222,13 +229,7 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements onLoadingFailed(imageUri, view, null); return; } - applyPalette(loadedImage); - - ImageLoader.getInstance().displayImage( - imageUri, - albumArtBackground, - new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build() - ); + setUpBackground(imageUri); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) startPostponedEnterTransition(); @@ -237,23 +238,14 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements ); } - private void applyPalette(@Nullable Bitmap bitmap) { - final int defaultBarColor = ColorUtil.resolveColor(this, R.attr.default_bar_color); - if (bitmap != null) { - Palette.from(bitmap) - .resizeBitmapSize(100) - .generate(new Palette.PaletteAsyncListener() { - @Override - public void onGenerated(@NonNull Palette palette) { - setColors(palette.getVibrantColor(defaultBarColor)); - } - }); - } else { - setColors(defaultBarColor); - } + private void setUpBackground(String imageUri) { + ImageLoader.getInstance().displayImage( + imageUri, + albumArtBackground, + new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build() + ); } - private void setColors(int vibrantColor) { toolbarColor = vibrantColor; albumTitleView.setBackgroundColor(vibrantColor); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 04ccb52b..75c64ab9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -4,12 +4,10 @@ import android.animation.Animator; import android.annotation.TargetApi; import android.content.Intent; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v7.graphics.Palette; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; @@ -35,13 +33,11 @@ import com.kabouzeid.gramophone.adapter.album.HorizontalAlbumAdapter; import com.kabouzeid.gramophone.adapter.song.ArtistSongAdapter; import com.kabouzeid.gramophone.dialogs.SleepTimerDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; -import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager; import com.kabouzeid.gramophone.imageloader.BlurProcessor; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.PaletteColorHolder; import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient; import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.ArtistInfo; -import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image; import com.kabouzeid.gramophone.loader.ArtistAlbumLoader; import com.kabouzeid.gramophone.loader.ArtistLoader; import com.kabouzeid.gramophone.loader.ArtistSongLoader; @@ -60,19 +56,17 @@ import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; - -import java.util.List; +import com.nostra13.universalimageloader.core.process.BitmapProcessor; import butterknife.ButterKnife; import butterknife.InjectView; -import hugo.weaving.DebugLog; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; /** * A lot of hackery is done in this activity. Changing things may will brake the whole activity. - *

+ *

* Should be kinda stable ONLY AS IT IS!!! */ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder { @@ -113,8 +107,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement private LastFMRestClient lastFMRestClient; - private StackBlurManager defaultArtistImageBlurManager; - @Override protected void onCreate(Bundle savedInstanceState) { setStatusBarTransparent(); @@ -283,112 +275,54 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement } private void setUpArtistImageAndApplyPalette(final boolean forceDownload) { - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inSampleSize = 2; - if (defaultArtistImageBlurManager == null) { - defaultArtistImageBlurManager = new StackBlurManager(BitmapFactory.decodeResource(getResources(), R.drawable.default_artist_image, options)); - } - if (MusicUtil.isArtistNameUnknown(artist.name)) { - artistImage.setImageResource(R.drawable.default_artist_image); - resetPaletteAndArtistImageBackground(); - return; - } - lastFMRestClient.getApiService().getArtistInfo(artist.name, forceDownload ? "no-cache" : null, new Callback() { - @Override - public void success(@NonNull ArtistInfo artistInfo, Response response) { - if (artistInfo.getArtist() != null) { - List images = artistInfo.getArtist().getImage(); - int lastElementIndex = images.size() - 1; - ImageLoader.getInstance().displayImage(images.get(lastElementIndex).getText(), - artistImage, - new DisplayImageOptions.Builder() - .cacheInMemory(true) - .cacheOnDisk(true) - .showImageOnFail(R.drawable.default_artist_image) - .showImageForEmptyUri(R.drawable.default_artist_image) - .resetViewBeforeLoading(true) - .build(), - new SimpleImageLoadingListener() { - @DebugLog - @Override - public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) { - resetPaletteAndArtistImageBackground(); - toastUpdatedArtistImageIfDownloadWasForced(); - } - - @DebugLog - @Override - public void onLoadingComplete(String imageUri, View view, @Nullable Bitmap loadedImage) { - if (loadedImage == null) { - onLoadingFailed(imageUri, view, null); - return; + ImageLoader.getInstance().displayImage(MusicUtil.getArtistImageLoaderString(artist, forceDownload), + artistImage, + new DisplayImageOptions.Builder() + .cacheInMemory(true) + .cacheOnDisk(true) + .showImageOnFail(R.drawable.default_artist_image) + .resetViewBeforeLoading(true) + .postProcessor(new BitmapProcessor() { + @Override + public Bitmap process(Bitmap bitmap) { + final int color = ColorUtil.generateColor(ArtistDetailActivity.this, bitmap); + runOnUiThread(new Runnable() { + @Override + public void run() { + setColors(color); } - applyPalette(loadedImage); - - ImageLoader.getInstance().displayImage( - imageUri, - artistImageBackground, - new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build() - ); - - toastUpdatedArtistImageIfDownloadWasForced(); - } - - private void toastUpdatedArtistImageIfDownloadWasForced() { - if (forceDownload) { - Toast.makeText(ArtistDetailActivity.this, getString(R.string.updated_artist_image), Toast.LENGTH_SHORT).show(); - } - } + }); + return bitmap; } - ); - } - } + }) + .build(), + new SimpleImageLoadingListener() { + @Override + public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) { + setUpBackground("drawable://" + R.drawable.default_artist_image); - @Override - public void failure(RetrofitError error) { - if (forceDownload) { - Toast.makeText(ArtistDetailActivity.this, getString(R.string.could_not_update_artist_image), Toast.LENGTH_SHORT).show(); - } else { - artistImage.setImageResource(R.drawable.default_artist_image); - resetPaletteAndArtistImageBackground(); - } - } - }); - } + toastUpdatedArtistImageIfDownloadWasForced(); + } - private void resetPaletteAndArtistImageBackground() { - applyPalette(null); - ImageLoader.getInstance().displayImage( - "drawable://" + R.drawable.default_artist_image, - artistImageBackground, - new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build() - ); - } - - private void applyPalette(@Nullable Bitmap bitmap) { - if (bitmap != null) { - Palette.from(bitmap) - .resizeBitmapSize(100) - .generate(new Palette.PaletteAsyncListener() { - - @Override - public void onGenerated(@NonNull Palette palette) { - final Palette.Swatch vibrantSwatch = palette.getVibrantSwatch(); - if (vibrantSwatch != null) { - toolbarColor = vibrantSwatch.getRgb(); - artistName.setBackgroundColor(vibrantSwatch.getRgb()); - artistName.setTextColor(ColorUtil.getOpaqueColor(vibrantSwatch.getTitleTextColor())); - if (PreferenceUtil.getInstance(ArtistDetailActivity.this).coloredNavigationBarArtist()) - setNavigationBarColor(vibrantSwatch.getRgb()); - notifyTaskColorChange(toolbarColor); - } else { - resetColors(); - } + @Override + public void onLoadingComplete(String imageUri, View view, @Nullable Bitmap loadedImage) { + if (loadedImage == null) { + onLoadingFailed(imageUri, view, null); + return; } - }); - } else { - resetColors(); - } + + setUpBackground(imageUri); + + toastUpdatedArtistImageIfDownloadWasForced(); + } + + private void toastUpdatedArtistImageIfDownloadWasForced() { + if (forceDownload) { + Toast.makeText(ArtistDetailActivity.this, getString(R.string.updated_artist_image), Toast.LENGTH_SHORT).show(); + } + } + } + ); } @Override @@ -408,19 +342,23 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement return toolbarColor; } + private void setUpBackground(String imageUri) { + ImageLoader.getInstance().displayImage( + imageUri, + artistImageBackground, + new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build() + ); + } - private void resetColors() { - int titleTextColor = DialogUtils.resolveColor(this, R.attr.title_text_color); - int defaultBarColor = DialogUtils.resolveColor(this, R.attr.default_bar_color); - - toolbarColor = defaultBarColor; - artistName.setBackgroundColor(defaultBarColor); - artistName.setTextColor(titleTextColor); + private void setColors(int vibrantColor) { + toolbarColor = vibrantColor; + artistName.setBackgroundColor(vibrantColor); + artistName.setTextColor(ColorUtil.getTextColorForBackground(vibrantColor)); if (PreferenceUtil.getInstance(this).coloredNavigationBarArtist()) - setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); + setNavigationBarColor(vibrantColor); - notifyTaskColorChange(toolbarColor); + notifyTaskColorChange(vibrantColor); } private void getArtistFromIntentExtras() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 7d26b360..ece99c9d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -329,20 +329,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity handlePlaybackIntent(getIntent()); } - @Override - public boolean onCreateOptionsMenu(@NonNull Menu menu) { - if (isAlbumPage()) { - getMenuInflater().inflate(R.menu.menu_albums, menu); - setUpGridMenu(menu); - } else if (isPlaylistPage()) { - getMenuInflater().inflate(R.menu.menu_playlists, menu); - } else { - getMenuInflater().inflate(R.menu.menu_main, menu); - } - restoreActionBar(); - return true; - } - public void restoreActionBar() { ActionBar actionBar = getSupportActionBar(); //noinspection ConstantConditions @@ -351,6 +337,18 @@ public class MainActivity extends AbsSlidingMusicPanelActivity actionBar.setHomeButtonEnabled(true); } + @Override + public boolean onCreateOptionsMenu(@NonNull Menu menu) { + if (isPlaylistPage()) { + getMenuInflater().inflate(R.menu.menu_playlists, menu); + } else { + getMenuInflater().inflate(R.menu.menu_main, menu); + setUpGridMenu(menu); + } + restoreActionBar(); + return true; + } + @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (drawerToggle.onOptionsItemSelected(item)) { @@ -386,6 +384,63 @@ public class MainActivity extends AbsSlidingMusicPanelActivity return super.onOptionsItemSelected(item); } + private void setUpGridMenu(@NonNull Menu menu) { + boolean isPortrait = Util.isInPortraitMode(this); + int columns = isPortrait ? PreferenceUtil.getInstance(this).getAlbumGridColumns() : PreferenceUtil.getInstance(this).getAlbumGridColumnsLand(); + String title = isPortrait ? getResources().getString(R.string.action_view_as) : getResources().getString(R.string.action_view_as_land); + + MenuItem gridSizeItem = menu.findItem(R.id.action_view_as); + gridSizeItem.setTitle(title); + + SubMenu gridSizeMenu = gridSizeItem.getSubMenu(); + gridSizeMenu.getItem(columns - 1).setChecked(true); + } + + private boolean handleGridSize(@NonNull MenuItem item) { + int size = getGridSize(item); + + if (size > 0) { + item.setChecked(true); + if (isAlbumPage()) { + getAlbumFragment().setColumns(size); + if (Util.isInPortraitMode(this)) { + PreferenceUtil.getInstance(this).setAlbumGridColumns(size); + } else { + PreferenceUtil.getInstance(this).setAlbumGridColumnsLand(size); + } + } + return true; + } + return false; + } + + private int getGridSize(MenuItem item) { + int size = -1; + + switch (item.getItemId()) { + case R.id.gridSizeOne: + size = 1; + break; + case R.id.gridSizeTwo: + size = 2; + break; + case R.id.gridSizeThree: + size = 3; + break; + case R.id.gridSizeFour: + size = 4; + break; + case R.id.gridSizeFive: + size = 5; + break; + case R.id.gridSizeSix: + size = 6; + break; + } + + return size; + } + @Override public void onConfigurationChanged(Configuration newConfig) { drawerToggle.onConfigurationChanged(newConfig); @@ -499,57 +554,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity // return (PlaylistViewFragment) pagerAdapter.getFragment(PagerAdapter.MusicFragments.PLAYLIST.ordinal()); // } - private void setUpGridMenu(@NonNull Menu menu) { - boolean isPortrait = Util.isInPortraitMode(this); - int columns = isPortrait ? PreferenceUtil.getInstance(this).getAlbumGridColumns() : PreferenceUtil.getInstance(this).getAlbumGridColumnsLand(); - String title = isPortrait ? getResources().getString(R.string.action_grid_columns) : getResources().getString(R.string.action_grid_columns_land); - - MenuItem gridSizeItem = menu.findItem(R.id.action_grid_columns); - gridSizeItem.setTitle(title); - - SubMenu gridSizeMenu = gridSizeItem.getSubMenu(); - gridSizeMenu.getItem(columns - 1).setChecked(true); - } - - private boolean handleGridSize(@NonNull MenuItem item) { - int size = -1; - - switch (item.getItemId()) { - case R.id.gridSizeOne: - size = 1; - break; - case R.id.gridSizeTwo: - size = 2; - break; - case R.id.gridSizeThree: - size = 3; - break; - case R.id.gridSizeFour: - size = 4; - break; - case R.id.gridSizeFive: - size = 5; - break; - case R.id.gridSizeSix: - size = 6; - break; - } - - if (size > 0) { - item.setChecked(true); - if (isAlbumPage()) { - getAlbumFragment().setColumns(size); - if (Util.isInPortraitMode(this)) { - PreferenceUtil.getInstance(this).setAlbumGridColumns(size); - } else { - PreferenceUtil.getInstance(this).setAlbumGridColumnsLand(size); - } - } - return true; - } - return false; - } - @Override public boolean dispatchKeyEvent(@NonNull KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_MENU && event.getAction() == KeyEvent.ACTION_UP) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java index 35ef3fab..08038988 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java @@ -14,8 +14,8 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.Toolbar; import android.view.MenuItem; +import android.view.View; -import com.afollestad.materialdialogs.util.DialogUtils; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.dialogs.ColorChooserDialog; import com.kabouzeid.gramophone.prefs.ColorChooserPreference; @@ -53,15 +53,21 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia } else if (title == R.string.accent_color) { PreferenceUtil.getInstance(this).setThemeColorAccent(color); } - recreate(); + recreateIfThemeChanged(); } public static class SettingsFragment extends PreferenceFragment { - private Preference equalizer; + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + view.findViewById(android.R.id.list).setPadding(0, 0, 0, 0); + } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.pref_general); addPreferencesFromResource(R.xml.pref_colors); addPreferencesFromResource(R.xml.pref_now_playing_screen); @@ -85,29 +91,33 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia @Override public boolean onPreferenceChange(Preference preference, @NonNull Object o) { setSummary(generalTheme, o); + PreferenceUtil.getInstance(getActivity()).setGeneralTheme(getActivity(), (String) o); + ((SettingsActivity) getActivity()).recreateIfThemeChanged(); return true; } }); ColorChooserPreference primaryColor = (ColorChooserPreference) findPreference("primary_color"); - primaryColor.setColor(((SettingsActivity) getActivity()).getThemeColorPrimary(), - DialogUtils.resolveColor(getActivity(), android.R.attr.textColorPrimary)); + primaryColor.setColor(PreferenceUtil.getInstance(getActivity()).getThemeColorPrimary(getActivity())); primaryColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(@NonNull Preference preference) { - new ColorChooserDialog().show(getActivity(), preference.getTitleRes(), + new ColorChooserDialog().show( + getActivity(), + preference.getTitleRes(), ((SettingsActivity) getActivity()).getThemeColorPrimary()); return true; } }); ColorChooserPreference accentColor = (ColorChooserPreference) findPreference("accent_color"); - accentColor.setColor(((SettingsActivity) getActivity()).getThemeColorAccent(), - DialogUtils.resolveColor(getActivity(), android.R.attr.textColorPrimary)); + accentColor.setColor(PreferenceUtil.getInstance(getActivity()).getThemeColorAccent(getActivity())); accentColor.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(@NonNull Preference preference) { - new ColorChooserDialog().show(getActivity(), preference.getTitleRes(), + new ColorChooserDialog().show( + getActivity(), + preference.getTitleRes(), ((SettingsActivity) getActivity()).getThemeColorAccent()); return true; } @@ -128,8 +138,11 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia } }); - equalizer = findPreference("equalizer"); - resolveEqualizer(); + Preference equalizer = findPreference("equalizer"); + if (!hasEqualizer()) { + equalizer.setEnabled(false); + equalizer.setSummary(getResources().getString(R.string.no_equalizer)); + } equalizer.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { @@ -160,14 +173,11 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia } } - private void resolveEqualizer() { + private boolean hasEqualizer() { final Intent effects = new Intent(AudioEffect.ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL); PackageManager pm = getActivity().getPackageManager(); ResolveInfo ri = pm.resolveActivity(effects, 0); - if (ri == null) { - equalizer.setEnabled(false); - equalizer.setSummary(getResources().getString(R.string.no_equalizer)); - } + return ri != null; } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java index 97276e4d..9e522fd3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsThemeActivity.java @@ -22,6 +22,7 @@ public abstract class AbsThemeActivity extends AppCompatActivity implements KabV private int colorPrimary; private int colorPrimaryDarker; private int colorAccent; + private boolean darkTheme; @Nullable private ActivityManager.TaskDescription taskDescription; @@ -33,23 +34,41 @@ public abstract class AbsThemeActivity extends AppCompatActivity implements KabV setupTheme(); } + @Override + protected void onResume() { + super.onResume(); + recreateIfThemeChanged(); + } private void setupTheme() { colorPrimary = PreferenceUtil.getInstance(this).getThemeColorPrimary(this); colorPrimaryDarker = ColorUtil.shiftColorDown(colorPrimary); colorAccent = PreferenceUtil.getInstance(this).getThemeColorAccent(this); + darkTheme = PreferenceUtil.getInstance(this).getGeneralTheme() == R.style.Theme_MaterialMusic; ThemeSingleton.get().positiveColor = colorAccent; - ThemeSingleton.get().negativeColor = ThemeSingleton.get().positiveColor; - ThemeSingleton.get().neutralColor = ThemeSingleton.get().positiveColor; - ThemeSingleton.get().widgetColor = ThemeSingleton.get().positiveColor; - ThemeSingleton.get().darkTheme = PreferenceUtil.getInstance(this).getGeneralTheme() == R.style.Theme_MaterialMusic; + ThemeSingleton.get().negativeColor = colorAccent; + ThemeSingleton.get().neutralColor = colorAccent; + ThemeSingleton.get().widgetColor = colorAccent; + ThemeSingleton.get().darkTheme = darkTheme; if (!overridesTaskColor()) { notifyTaskColorChange(getThemeColorPrimary()); } } + protected void recreateIfThemeChanged() { + if (didThemeChanged()) { + recreate(); + } + } + + private boolean didThemeChanged() { + return colorPrimary != PreferenceUtil.getInstance(this).getThemeColorPrimary(this) || + colorAccent != PreferenceUtil.getInstance(this).getThemeColorAccent(this) || + darkTheme != (PreferenceUtil.getInstance(this).getGeneralTheme() == R.style.Theme_MaterialMusic); + } + protected void notifyTaskColorChange(int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Sets color of entry in the system recents page diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java index 6df761a7..def303cf 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java @@ -24,7 +24,7 @@ import butterknife.Optional; /** * @author Karim Abou Zeid (kabouzeid) */ -public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicStateListener { +public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicStateListener { public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName(); @@ -39,7 +39,8 @@ public abstract class AbsMainActivityRecyclerViewFragment { +public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment { public static final String TAG = AlbumViewFragment.class.getSimpleName(); - private GridLayoutManager layoutManager; - @Override - protected RecyclerView.LayoutManager createLayoutManager() { + protected GridLayoutManager createLayoutManager() { int columns = Util.isInPortraitMode(getActivity()) ? PreferenceUtil.getInstance(getActivity()).getAlbumGridColumns() : PreferenceUtil.getInstance(getActivity()).getAlbumGridColumnsLand(); - layoutManager = new GridLayoutManager(getActivity(), columns); - return layoutManager; + return new GridLayoutManager(getActivity(), columns); } @NonNull @@ -41,8 +37,10 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment { +public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment { public static final String TAG = ArtistViewFragment.class.getSimpleName(); @NonNull @Override - protected RecyclerView.LayoutManager createLayoutManager() { + protected GridLayoutManager createLayoutManager() { return new GridLayoutManager(getActivity(), 2); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java index 740a8777..5a597bc0 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java @@ -1,8 +1,7 @@ package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments; import android.support.annotation.NonNull; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.LinearLayoutManager; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.PlaylistAdapter; @@ -17,14 +16,14 @@ import java.util.ArrayList; /** * @author Karim Abou Zeid (kabouzeid) */ -public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment { +public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment { public static final String TAG = PlaylistViewFragment.class.getSimpleName(); @NonNull @Override - protected RecyclerView.LayoutManager createLayoutManager() { - return new GridLayoutManager(getActivity(), 1); + protected LinearLayoutManager createLayoutManager() { + return new LinearLayoutManager(getActivity()); } @NonNull diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java index e3922602..92afebe4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java @@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments; import android.support.annotation.NonNull; import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.song.SongAdapter; @@ -11,13 +10,13 @@ import com.kabouzeid.gramophone.loader.SongLoader; /** * @author Karim Abou Zeid (kabouzeid) */ -public class SongViewFragment extends AbsMainActivityRecyclerViewFragment { +public class SongViewFragment extends AbsMainActivityRecyclerViewFragment { public static final String TAG = SongViewFragment.class.getSimpleName(); @NonNull @Override - protected RecyclerView.LayoutManager createLayoutManager() { + protected GridLayoutManager createLayoutManager() { return new GridLayoutManager(getActivity(), 1); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java index 8208a4d2..c8654991 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ColorUtil.java @@ -3,16 +3,27 @@ package com.kabouzeid.gramophone.util; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.graphics.Bitmap; import android.graphics.Color; import android.support.annotation.AttrRes; import android.support.annotation.ColorInt; import android.support.annotation.NonNull; +import android.support.v7.graphics.Palette; + +import com.kabouzeid.gramophone.R; /** * @author Karim Abou Zeid (kabouzeid) */ public class ColorUtil { + public static int generateColor(Context context, Bitmap bitmap) { + return Palette.from(bitmap) + .resizeBitmapSize(100) + .generate() + .getVibrantColor(ColorUtil.resolveColor(context, R.attr.default_bar_color)); + } + public static int resolveColor(@NonNull Context context, @AttrRes int colorAttr) { TypedArray a = context.obtainStyledAttributes(new int[]{colorAttr}); int resId = a.getColor(0, 0); @@ -50,10 +61,10 @@ public class ColorUtil { } public static boolean useDarkTextColorOnBackground(int backgroundColor) { - return (Color.red(backgroundColor) * 0.299 + Color.green(backgroundColor) * 0.587 + Color.blue(backgroundColor) * 0.114) > 186; + return (Color.red(backgroundColor) * 0.299 + Color.green(backgroundColor) * 0.587 + Color.blue(backgroundColor) * 0.114) > (255 / 2); } public static int getTextColorForBackground(int backgroundColor) { - return (Color.red(backgroundColor) * 0.299 + Color.green(backgroundColor) * 0.587 + Color.blue(backgroundColor) * 0.114) > 186 ? Color.BLACK : Color.WHITE; + return useDarkTextColorOnBackground(backgroundColor) ? Color.BLACK : Color.WHITE; } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java index 6d3bb2aa..48d635fa 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java @@ -36,6 +36,15 @@ import java.util.List; public class MusicUtil { public static final String TAG = MusicUtil.class.getSimpleName(); + @NonNull + public static String getArtistImageLoaderString(@NonNull Artist artist, boolean forceDownload) { + if (forceDownload) { + return PhonographImageDownloader.SCHEME_ARTIST + "no-cache#" + artist.name; + } else { + return PhonographImageDownloader.SCHEME_ARTIST + "#" + artist.name; + } + } + @NonNull public static String getAlbumImageLoaderString(@NonNull Album album) { return PhonographImageDownloader.SCHEME_ALBUM + album.id; diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java index 7a972623..3caeb299 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java @@ -71,14 +71,29 @@ public final class PreferenceUtil { mPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); } - public int getGeneralTheme() { - int value = Integer.parseInt(mPreferences.getString(GENERAL_THEME, "0")); - switch (value) { - case 0: - return R.style.Theme_MaterialMusic_Light; - case 1: - return R.style.Theme_MaterialMusic; + @SuppressLint("CommitPrefEdits") + public void setGeneralTheme(Context context, String value) { + String[] allowedValues = context.getResources().getStringArray(R.array.pref_general_theme_list_values); + for (String allowedValue : allowedValues) { + if (value.equals(allowedValue)) { + mPreferences.edit().putString(GENERAL_THEME, value).commit(); + return; + } } + } + + public int getGeneralTheme() { + try { + int value = Integer.parseInt(mPreferences.getString(GENERAL_THEME, "0")); + switch (value) { + case 0: + return R.style.Theme_MaterialMusic_Light; + case 1: + return R.style.Theme_MaterialMusic; + } + } catch (NumberFormatException ignored) { + } + return R.style.Theme_MaterialMusic_Light; } @@ -86,10 +101,6 @@ public final class PreferenceUtil { return mPreferences.getInt("primary_color", context.getResources().getColor(R.color.indigo_500)); } - public int getThemeColorPrimaryDarker(Context context) { - return ColorUtil.shiftColorDown(getThemeColorPrimary(context)); - } - @SuppressLint("CommitPrefEdits") public void setThemeColorPrimary(int color) { mPreferences.edit().putInt("primary_color", color).commit(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java index a062fbd1..07506661 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java @@ -2,11 +2,9 @@ package com.kabouzeid.gramophone.util; import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; -import android.graphics.Bitmap; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v7.graphics.Palette; import android.support.v7.internal.view.menu.ListMenuItemView; import android.support.v7.internal.view.menu.MenuPopupHelper; import android.view.View; @@ -28,47 +26,6 @@ import java.lang.reflect.Field; public class ViewUtil { public final static int DEFAULT_COLOR_ANIMATION_DURATION = 500; - public static void applyBackgroundColorFromBitmap(@Nullable Bitmap bitmap, final int defaultBgColor, @Nullable final View[] views, @Nullable final TextView[] textViews, final boolean animate) { - if (bitmap != null) { - Palette.from(bitmap) - .resizeBitmapSize(100) - .generate(new Palette.PaletteAsyncListener() { - @Override - public void onGenerated(@NonNull Palette palette) { - applyBackgroundColor(palette.getVibrantColor(defaultBgColor), views, textViews, animate); - } - }); - } else { - applyBackgroundColor(defaultBgColor, views, textViews, animate); - } - } - - public static void applyBackgroundColor(int bgColor, @Nullable final View[] views, @Nullable TextView[] textViews, final boolean animate) { - if (views != null) { - for (View view : views) { - if (view != null) { - if (animate) { - ViewUtil.animateViewColor(view, view.getDrawingCacheBackgroundColor(), bgColor); - } else { - view.setBackgroundColor(bgColor); - } - } - } - } - if (textViews != null) { - int textColor = ColorUtil.getTextColorForBackground(bgColor); - for (TextView textView : textViews) { - if (textView != null) { - if (animate) { - animateTextColor(textView, textView.getCurrentTextColor(), textColor); - } else { - textView.setTextColor(textColor); - } - } - } - } - } - public static void animateViewColor(final View v, final int startColor, final int endColor) { animateViewColor(v, startColor, endColor, DEFAULT_COLOR_ANIMATION_DURATION); } diff --git a/app/src/main/res/menu/menu_albums.xml b/app/src/main/res/menu/menu_albums.xml deleted file mode 100644 index ed69f97a..00000000 --- a/app/src/main/res/menu/menu_albums.xml +++ /dev/null @@ -1,69 +0,0 @@ -

- - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index d01b2f05..f2aa7e86 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -30,10 +30,44 @@ android:title="@string/action_sleep_timer" app:showAsAction="never" /> + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/app/src/main/res/menu/menu_playlists.xml b/app/src/main/res/menu/menu_playlists.xml index d5b48b84..2d56f8ea 100644 --- a/app/src/main/res/menu/menu_playlists.xml +++ b/app/src/main/res/menu/menu_playlists.xml @@ -15,7 +15,7 @@ "Added 1 title to the playing queue" Added %1$d titles to the playing queue Remove from playlist - New playlist… Grid columns Grid columns (Land) + View as + View as (Land) Inserted %1$d songs into this playlist Created playlist %1$s Deleted playlist %1$s @@ -90,7 +91,6 @@ Delete Playlists Clear Playlist "Add to Playlist" - New Playlist "Warning: This operation can not be undone" Shuffle All Shuffle Album @@ -180,4 +180,9 @@ Cancel current timer Sleep timer has been canceled Sleep timer set for %d minutes from now + New playlist… + New Playlist + Grid + List + Colored footers