Added native image loader support for artist images. Automatically recreate activity onrResume when colors changed fixes issues #2 and #39. Also Butterknife should be used now everywhere #40
This commit is contained in:
parent
9c8cba612b
commit
8bdaf08a30
29 changed files with 485 additions and 521 deletions
|
|
@ -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<SearchAdapter.ViewHolder
|
|||
|
||||
private final AppCompatActivity activity;
|
||||
private List results = Collections.emptyList();
|
||||
private final LastFMRestClient lastFMRestClient;
|
||||
|
||||
public SearchAdapter(@NonNull AppCompatActivity activity) {
|
||||
this.activity = activity;
|
||||
lastFMRestClient = new LastFMRestClient(activity);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
|
@ -122,37 +114,15 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
|
|||
holder.image.setImageResource(R.drawable.default_artist_image);
|
||||
break;
|
||||
}
|
||||
lastFMRestClient.getApiService().getArtistInfo(artist.name, null, new Callback<ArtistInfo>() {
|
||||
@Override
|
||||
public void success(@NonNull ArtistInfo artistInfo, Response response) {
|
||||
if (artistInfo.getArtist() != null) {
|
||||
int thumbnailIndex = 0;
|
||||
List<Image> images = artistInfo.getArtist().getImage();
|
||||
if (images.size() > 2) {
|
||||
thumbnailIndex = 2;
|
||||
} else if (images.size() > 1) {
|
||||
thumbnailIndex = 1;
|
||||
}
|
||||
ImageLoader.getInstance().displayImage(images.get(thumbnailIndex).getText(),
|
||||
ImageLoader.getInstance().displayImage(MusicUtil.getArtistImageLoaderString(artist, false),
|
||||
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);
|
||||
}
|
||||
});
|
||||
break;
|
||||
case SONG:
|
||||
final Song song = (Song) results.get(position);
|
||||
|
|
|
|||
|
|
@ -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<AlbumAdapter.ViewHolder,
|
|||
|
||||
protected int itemLayoutRes;
|
||||
|
||||
protected boolean usePalette;
|
||||
protected boolean usePalette = false;
|
||||
|
||||
public AlbumAdapter(@NonNull AppCompatActivity activity, ArrayList<Album> dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) {
|
||||
super(activity, cabHolder, R.menu.menu_media_selection);
|
||||
|
|
@ -62,6 +61,11 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
setHasStableIds(true);
|
||||
}
|
||||
|
||||
public void usePalette(boolean usePalette) {
|
||||
this.usePalette = usePalette;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public List<Album> getDataSet() {
|
||||
return dataSet;
|
||||
}
|
||||
|
|
@ -99,11 +103,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
final Album album = dataSet.get(position);
|
||||
|
||||
final int defaultBarColor = ColorUtil.resolveColor(activity, R.attr.default_bar_color);
|
||||
ViewUtil.applyBackgroundColor(
|
||||
defaultBarColor,
|
||||
new View[]{holder.paletteColorContainer},
|
||||
new TextView[]{holder.title, holder.text},
|
||||
false);
|
||||
setColors(defaultBarColor, holder);
|
||||
|
||||
final boolean isChecked = isChecked(album);
|
||||
holder.itemView.setActivated(isChecked);
|
||||
|
|
@ -125,6 +125,13 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
.cacheInMemory(true)
|
||||
.showImageOnFail(R.drawable.default_album_art)
|
||||
.resetViewBeforeLoading(true)
|
||||
.postProcessor(new BitmapProcessor() {
|
||||
@Override
|
||||
public Bitmap process(Bitmap bitmap) {
|
||||
holder.paletteColor = ColorUtil.generateColor(activity, bitmap);
|
||||
return bitmap;
|
||||
}
|
||||
})
|
||||
.displayer(new FadeInBitmapDisplayer(FADE_IN_TIME) {
|
||||
@Override
|
||||
public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {
|
||||
|
|
@ -135,12 +142,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
super.display(bitmap, imageAware, loadedFrom);
|
||||
}
|
||||
if (usePalette)
|
||||
ViewUtil.applyBackgroundColorFromBitmap(
|
||||
bitmap,
|
||||
defaultBarColor,
|
||||
new View[]{holder.paletteColorContainer},
|
||||
new TextView[]{holder.title, holder.text},
|
||||
!loadedFromMemoryCache);
|
||||
setColors(holder.paletteColor, holder);
|
||||
}
|
||||
})
|
||||
.build(),
|
||||
|
|
@ -149,16 +151,25 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
|
||||
FadeInBitmapDisplayer.animate(view, FADE_IN_TIME);
|
||||
if (usePalette)
|
||||
ViewUtil.applyBackgroundColor(
|
||||
defaultBarColor,
|
||||
new View[]{holder.paletteColorContainer},
|
||||
new TextView[]{holder.title, holder.text},
|
||||
true);
|
||||
setColors(defaultBarColor, holder);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
private void setColors(int color, ViewHolder holder) {
|
||||
if (holder.paletteColorContainer != null) {
|
||||
holder.paletteColorContainer.setBackgroundColor(color);
|
||||
int textColor = ColorUtil.getTextColorForBackground(color);
|
||||
if (holder.title != null) {
|
||||
holder.title.setTextColor(textColor);
|
||||
}
|
||||
if (holder.text != null) {
|
||||
holder.text.setTextColor(textColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return dataSet.size();
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ public class HorizontalAlbumAdapter extends AlbumAdapter {
|
|||
|
||||
public HorizontalAlbumAdapter(@NonNull AppCompatActivity activity, ArrayList<Album> dataSet, @Nullable CabHolder cabHolder) {
|
||||
super(activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, cabHolder);
|
||||
usePalette = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -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<ArtistAdapter.ViewHolde
|
|||
protected final AppCompatActivity activity;
|
||||
protected ArrayList<Artist> dataSet;
|
||||
protected int itemLayoutRes;
|
||||
protected final LastFMRestClient lastFMRestClient;
|
||||
|
||||
public ArtistAdapter(@NonNull AppCompatActivity activity, ArrayList<Artist> 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<ArtistAdapter.ViewHolde
|
|||
return;
|
||||
}
|
||||
|
||||
if (MusicUtil.isArtistNameUnknown(artist.name)) {
|
||||
holder.image.setImageResource(R.drawable.default_artist_image);
|
||||
return;
|
||||
}
|
||||
|
||||
lastFMRestClient.getApiService().getArtistInfo(artist.name, null, new Callback<ArtistInfo>() {
|
||||
@Override
|
||||
public void success(@NonNull ArtistInfo artistInfo, Response response) {
|
||||
if (artistInfo.getArtist() != null) {
|
||||
List<Image> images = artistInfo.getArtist().getImage();
|
||||
if (images == null || images.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
ImageLoader.getInstance().displayImage(images.get(images.size() - 1).getText(),
|
||||
ImageLoader.getInstance().displayImage(MusicUtil.getArtistImageLoaderString(artist, false),
|
||||
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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<Song> songs = (ArrayList<Song>) getArguments().getSerializable("songs");
|
||||
if (songs == null) return;
|
||||
if (i == 0) {
|
||||
materialDialog.dismiss();
|
||||
CreatePlaylistDialog.create(songs).show(getActivity().getSupportFragmentManager(), "ADD_TO_PLAYLIST");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<Image> 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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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<AlbumInfo> 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<ArtistInfo> callback);
|
||||
|
||||
@GET(BASE_QUERY_PARAMETERS + "&method=artist.getinfo")
|
||||
ArtistInfo getArtistInfo(@Query("artist") String artistName, @Nullable @Header("Cache-Control") String cacheControl);
|
||||
}
|
||||
|
|
@ -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<String, Long> 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)");
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
* <p/>
|
||||
* <p>
|
||||
* 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,22 +238,13 @@ 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));
|
||||
private void setUpBackground(String imageUri) {
|
||||
ImageLoader.getInstance().displayImage(
|
||||
imageUri,
|
||||
albumArtBackground,
|
||||
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build()
|
||||
);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
setColors(defaultBarColor);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void setColors(int vibrantColor) {
|
||||
toolbarColor = vibrantColor;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
* <p/>
|
||||
* <p>
|
||||
* 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,53 +275,43 @@ 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<ArtistInfo>() {
|
||||
@Override
|
||||
public void success(@NonNull ArtistInfo artistInfo, Response response) {
|
||||
if (artistInfo.getArtist() != null) {
|
||||
List<Image> images = artistInfo.getArtist().getImage();
|
||||
int lastElementIndex = images.size() - 1;
|
||||
ImageLoader.getInstance().displayImage(images.get(lastElementIndex).getText(),
|
||||
ImageLoader.getInstance().displayImage(MusicUtil.getArtistImageLoaderString(artist, forceDownload),
|
||||
artistImage,
|
||||
new DisplayImageOptions.Builder()
|
||||
.cacheInMemory(true)
|
||||
.cacheOnDisk(true)
|
||||
.showImageOnFail(R.drawable.default_artist_image)
|
||||
.showImageForEmptyUri(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);
|
||||
}
|
||||
});
|
||||
return bitmap;
|
||||
}
|
||||
})
|
||||
.build(),
|
||||
new SimpleImageLoadingListener() {
|
||||
@DebugLog
|
||||
@Override
|
||||
public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
|
||||
resetPaletteAndArtistImageBackground();
|
||||
setUpBackground("drawable://" + R.drawable.default_artist_image);
|
||||
|
||||
toastUpdatedArtistImageIfDownloadWasForced();
|
||||
}
|
||||
|
||||
@DebugLog
|
||||
@Override
|
||||
public void onLoadingComplete(String imageUri, View view, @Nullable Bitmap loadedImage) {
|
||||
if (loadedImage == null) {
|
||||
onLoadingFailed(imageUri, view, null);
|
||||
return;
|
||||
}
|
||||
applyPalette(loadedImage);
|
||||
|
||||
ImageLoader.getInstance().displayImage(
|
||||
imageUri,
|
||||
artistImageBackground,
|
||||
new DisplayImageOptions.Builder().postProcessor(new BlurProcessor(10)).build()
|
||||
);
|
||||
setUpBackground(imageUri);
|
||||
|
||||
toastUpdatedArtistImageIfDownloadWasForced();
|
||||
}
|
||||
|
|
@ -342,54 +324,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
|||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
resetColors();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean overridesTaskColor() {
|
||||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ import butterknife.Optional;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView.Adapter> extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicStateListener {
|
||||
public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicStateListener {
|
||||
|
||||
public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName();
|
||||
|
||||
|
|
@ -39,7 +39,8 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
|
|||
@InjectView(R.id.fast_scroller)
|
||||
FastScroller fastScroller;
|
||||
|
||||
private A mAdapter;
|
||||
private A adapter;
|
||||
private LM layoutManager;
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
|
|
@ -65,8 +66,8 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
|
|||
}
|
||||
|
||||
private void setUpRecyclerView() {
|
||||
mAdapter = createAdapter();
|
||||
mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
|
||||
adapter = createAdapter();
|
||||
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
|
||||
@Override
|
||||
public void onChanged() {
|
||||
super.onChanged();
|
||||
|
|
@ -74,12 +75,22 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
|
|||
}
|
||||
});
|
||||
|
||||
recyclerView.setLayoutManager(createLayoutManager());
|
||||
recyclerView.setAdapter(mAdapter);
|
||||
layoutManager = createLayoutManager();
|
||||
|
||||
recyclerView.setLayoutManager(layoutManager);
|
||||
recyclerView.setAdapter(adapter);
|
||||
}
|
||||
|
||||
public A getAdapter() {
|
||||
return mAdapter;
|
||||
protected A getAdapter() {
|
||||
return adapter;
|
||||
}
|
||||
|
||||
protected LM getLayoutManager() {
|
||||
return layoutManager;
|
||||
}
|
||||
|
||||
protected RecyclerView getRecyclerView() {
|
||||
return recyclerView;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -137,11 +148,7 @@ public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView
|
|||
return R.layout.fragment_main_activity_recycler_view;
|
||||
}
|
||||
|
||||
protected RecyclerView getRecyclerView() {
|
||||
return recyclerView;
|
||||
}
|
||||
|
||||
protected abstract RecyclerView.LayoutManager createLayoutManager();
|
||||
protected abstract LM createLayoutManager();
|
||||
|
||||
protected abstract A createAdapter();
|
||||
|
||||
|
|
|
|||
|
|
@ -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.album.AlbumAdapter;
|
||||
|
|
@ -13,16 +12,13 @@ import com.kabouzeid.gramophone.util.Util;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment<AlbumAdapter> {
|
||||
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment<AlbumAdapter, GridLayoutManager> {
|
||||
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<Album
|
|||
}
|
||||
|
||||
public void setColumns(int columns) {
|
||||
layoutManager.setSpanCount(columns);
|
||||
layoutManager.requestLayout();
|
||||
getLayoutManager().setSpanCount(columns);
|
||||
getLayoutManager().requestLayout();
|
||||
// required to animate the column size change
|
||||
getAdapter().notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -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.artist.ArtistAdapter;
|
||||
|
|
@ -11,13 +10,13 @@ import com.kabouzeid.gramophone.loader.ArtistLoader;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment<ArtistAdapter> {
|
||||
public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment<ArtistAdapter, GridLayoutManager> {
|
||||
|
||||
public static final String TAG = ArtistViewFragment.class.getSimpleName();
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
protected RecyclerView.LayoutManager createLayoutManager() {
|
||||
protected GridLayoutManager createLayoutManager() {
|
||||
return new GridLayoutManager(getActivity(), 2);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<PlaylistAdapter> {
|
||||
public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment<PlaylistAdapter, LinearLayoutManager> {
|
||||
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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<SongAdapter> {
|
||||
public class SongViewFragment extends AbsMainActivityRecyclerViewFragment<SongAdapter, GridLayoutManager> {
|
||||
|
||||
public static final String TAG = SongViewFragment.class.getSimpleName();
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
protected RecyclerView.LayoutManager createLayoutManager() {
|
||||
protected GridLayoutManager createLayoutManager() {
|
||||
return new GridLayoutManager(getActivity(), 1);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -71,7 +71,19 @@ public final class PreferenceUtil {
|
|||
mPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
|
||||
}
|
||||
|
||||
@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:
|
||||
|
|
@ -79,6 +91,9 @@ public final class PreferenceUtil {
|
|||
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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,69 +0,0 @@
|
|||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context=".DrawerActivity">
|
||||
|
||||
<item
|
||||
android:id="@+id/action_now_playing"
|
||||
android:icon="@drawable/ic_play_circle_fill_white_24dp"
|
||||
android:title="@string/action_now_playing"
|
||||
app:showAsAction="always" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_search"
|
||||
android:icon="@drawable/abc_ic_search_api_mtrl_alpha"
|
||||
android:title="@string/action_search"
|
||||
app:showAsAction="ifRoom" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_playing_queue"
|
||||
android:title="@string/action_playing_queue"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_shuffle_all"
|
||||
android:title="@string/action_shuffle_all"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_sleep_timer"
|
||||
android:title="@string/action_sleep_timer"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_grid_columns"
|
||||
android:title="@string/action_grid_columns">
|
||||
<menu>
|
||||
<group
|
||||
android:id="@+id/gridSizeGroup"
|
||||
android:checkableBehavior="single"
|
||||
tools:ignore="HardcodedText">
|
||||
<item
|
||||
android:id="@+id/gridSizeOne"
|
||||
android:title="1" />
|
||||
<item
|
||||
android:id="@+id/gridSizeTwo"
|
||||
android:title="2" />
|
||||
<item
|
||||
android:id="@+id/gridSizeThree"
|
||||
android:title="3" />
|
||||
<item
|
||||
android:id="@+id/gridSizeFour"
|
||||
android:title="4" />
|
||||
<item
|
||||
android:id="@+id/gridSizeFive"
|
||||
android:title="5" />
|
||||
<item
|
||||
android:id="@+id/gridSizeSix"
|
||||
android:title="6" />
|
||||
</group>
|
||||
</menu>
|
||||
</item>
|
||||
|
||||
<item
|
||||
android:id="@+id/action_equalizer"
|
||||
android:orderInCategory="99"
|
||||
android:title="@string/equalizer"
|
||||
app:showAsAction="never" />
|
||||
|
||||
</menu>
|
||||
|
|
@ -30,6 +30,40 @@
|
|||
android:title="@string/action_sleep_timer"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_view_as"
|
||||
android:title="@string/action_view_as">
|
||||
<menu>
|
||||
<group
|
||||
android:id="@+id/gridSizeGroup"
|
||||
android:checkableBehavior="single"
|
||||
tools:ignore="HardcodedText">
|
||||
<item
|
||||
android:id="@+id/gridSizeOne"
|
||||
android:title="1" />
|
||||
<item
|
||||
android:id="@+id/gridSizeTwo"
|
||||
android:title="2" />
|
||||
<item
|
||||
android:id="@+id/gridSizeThree"
|
||||
android:title="3" />
|
||||
<item
|
||||
android:id="@+id/gridSizeFour"
|
||||
android:title="4" />
|
||||
<item
|
||||
android:id="@+id/gridSizeFive"
|
||||
android:title="5" />
|
||||
<item
|
||||
android:id="@+id/gridSizeSix"
|
||||
android:title="6" />
|
||||
</group>
|
||||
<item
|
||||
android:id="@+id/colored_footers"
|
||||
android:checkable="true"
|
||||
android:title="@string/colored_footers" />
|
||||
</menu>
|
||||
</item>
|
||||
|
||||
<item
|
||||
android:id="@+id/action_equalizer"
|
||||
android:orderInCategory="99"
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
<item
|
||||
android:id="@+id/action_new_playlist"
|
||||
android:title="@string/new_playlist_action"
|
||||
android:title="@string/new_playlist_title"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item
|
||||
|
|
|
|||
|
|
@ -66,9 +66,10 @@
|
|||
<string name="added_title_to_playing_queue">"Added 1 title to the playing queue"</string>
|
||||
<string name="added_x_titles_to_playing_queue">Added %1$d titles to the playing queue</string>
|
||||
<string name="action_remove_from_playlist">Remove from playlist</string>
|
||||
<string name="new_playlist_action">New playlist…</string>
|
||||
<string name="action_grid_columns">Grid columns</string>
|
||||
<string name="action_grid_columns_land">Grid columns (Land)</string>
|
||||
<string name="action_view_as">View as</string>
|
||||
<string name="action_view_as_land">View as (Land)</string>
|
||||
<string name="inserted_x_songs_into_playlist">Inserted %1$d songs into this playlist</string>
|
||||
<string name="created_playlist_x">Created playlist %1$s</string>
|
||||
<string name="deleted_playlist_x">Deleted playlist %1$s</string>
|
||||
|
|
@ -90,7 +91,6 @@
|
|||
<string name="delete_playlists_title">Delete Playlists</string>
|
||||
<string name="clear_playlist_title">Clear Playlist</string>
|
||||
<string name="add_playlist_title">"Add to Playlist"</string>
|
||||
<string name="new_playlist_title">New Playlist</string>
|
||||
<string name="delete_warning">"Warning: This operation can not be undone"</string>
|
||||
<string name="action_shuffle_all">Shuffle All</string>
|
||||
<string name="action_shuffle_album">Shuffle Album</string>
|
||||
|
|
@ -180,4 +180,9 @@
|
|||
<string name="cancel_current_timer">Cancel current timer</string>
|
||||
<string name="sleep_timer_canceled">Sleep timer has been canceled</string>
|
||||
<string name="sleep_timer_set">Sleep timer set for %d minutes from now</string>
|
||||
<string name="new_playlist_action">New playlist…</string>
|
||||
<string name="new_playlist_title">New Playlist</string>
|
||||
<string name="grid">Grid</string>
|
||||
<string name="list">List</string>
|
||||
<string name="colored_footers">Colored footers</string>
|
||||
</resources>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue