Replaced Ion with Glide. Big performance boost, and should also fix the FCs many people get because of recycled bitmaps. Fixed the ripple flickering by using ?selectableItemBackground on Lollipop again instead of custom ripple. Search is broken for now, remake in progress.
This commit is contained in:
parent
c75ab6bf15
commit
ee2b661eb4
34 changed files with 448 additions and 667 deletions
|
|
@ -59,9 +59,6 @@ dependencies {
|
||||||
compile 'com.android.support:support-v13:22.1.0'
|
compile 'com.android.support:support-v13:22.1.0'
|
||||||
compile 'com.android.support:cardview-v7:22.1.0'
|
compile 'com.android.support:cardview-v7:22.1.0'
|
||||||
|
|
||||||
compile 'com.nhaarman.listviewanimations:lib-core:+@aar'
|
|
||||||
compile 'com.nhaarman.listviewanimations:lib-manipulation:+@aar'
|
|
||||||
compile 'com.nhaarman.listviewanimations:lib-core-slh:+@aar'
|
|
||||||
compile 'com.github.ksoichiro:android-observablescrollview:1.5.0'
|
compile 'com.github.ksoichiro:android-observablescrollview:1.5.0'
|
||||||
compile 'asia.ivity.android:drag-sort-listview:1.0'
|
compile 'asia.ivity.android:drag-sort-listview:1.0'
|
||||||
|
|
||||||
|
|
@ -69,9 +66,8 @@ dependencies {
|
||||||
|
|
||||||
compile 'com.mcxiaoke.volley:library:1.0.15'
|
compile 'com.mcxiaoke.volley:library:1.0.15'
|
||||||
compile 'com.squareup:otto:1.3.6'
|
compile 'com.squareup:otto:1.3.6'
|
||||||
compile 'com.squareup.okhttp:okhttp:2.2.0'
|
|
||||||
compile 'de.hdodenhof:circleimageview:1.2.2'
|
compile 'de.hdodenhof:circleimageview:1.2.2'
|
||||||
compile 'com.koushikdutta.ion:ion:2.1.3'
|
compile 'com.github.bumptech.glide:glide:3.5.2'
|
||||||
|
|
||||||
compile 'com.afollestad:material-dialogs:0.7.2.6'
|
compile 'com.afollestad:material-dialogs:0.7.2.6'
|
||||||
compile 'com.jpardogo.materialtabstrip:library:1.0.9'
|
compile 'com.jpardogo.materialtabstrip:library:1.0.9'
|
||||||
|
|
|
||||||
5
app/proguard-rules.pro
vendored
5
app/proguard-rules.pro
vendored
|
|
@ -17,5 +17,10 @@
|
||||||
#}
|
#}
|
||||||
|
|
||||||
-keep class !android.support.v7.internal.view.menu.**,** {*;}
|
-keep class !android.support.v7.internal.view.menu.**,** {*;}
|
||||||
|
-keep public class * implements com.bumptech.glide.module.GlideModule
|
||||||
|
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
|
||||||
|
**[] $VALUES;
|
||||||
|
public *;
|
||||||
|
}
|
||||||
-dontwarn
|
-dontwarn
|
||||||
-ignorewarnings
|
-ignorewarnings
|
||||||
|
|
@ -2,6 +2,7 @@ package com.kabouzeid.gramophone.adapter;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.net.Uri;
|
||||||
import android.support.v4.util.Pair;
|
import android.support.v4.util.Pair;
|
||||||
import android.support.v7.graphics.Palette;
|
import android.support.v7.graphics.Palette;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
|
@ -12,6 +13,12 @@ import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
import com.afollestad.materialdialogs.util.DialogUtils;
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable;
|
||||||
|
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
|
||||||
|
import com.bumptech.glide.request.Request;
|
||||||
|
import com.bumptech.glide.request.RequestListener;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.loader.AlbumLoader;
|
import com.kabouzeid.gramophone.loader.AlbumLoader;
|
||||||
|
|
@ -23,11 +30,6 @@ import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
||||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
import com.koushikdutta.async.future.Future;
|
|
||||||
import com.koushikdutta.async.future.FutureCallback;
|
|
||||||
import com.koushikdutta.ion.ImageViewBitmapInfo;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
import com.koushikdutta.ion.bitmap.BitmapInfo;
|
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -51,9 +53,9 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
|
||||||
@Override
|
@Override
|
||||||
public void onViewRecycled(ViewHolder holder) {
|
public void onViewRecycled(ViewHolder holder) {
|
||||||
super.onViewRecycled(holder);
|
super.onViewRecycled(holder);
|
||||||
Object tag = holder.image.getTag();
|
Object tag = holder.albumArt.getTag();
|
||||||
if (tag instanceof Future) {
|
if (tag instanceof Request) {
|
||||||
((Future) tag).cancel();
|
((Request) tag).clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -63,35 +65,30 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
|
||||||
|
|
||||||
resetColors(holder.title, holder.artist, holder.footer);
|
resetColors(holder.title, holder.artist, holder.footer);
|
||||||
|
|
||||||
|
|
||||||
holder.title.setText(album.title);
|
holder.title.setText(album.title);
|
||||||
holder.artist.setText(album.artistName);
|
holder.artist.setText(album.artistName);
|
||||||
holder.image.setTag(
|
holder.albumArt.setTag(
|
||||||
Ion.with(activity)
|
Glide.with(activity)
|
||||||
.load(MusicUtil.getAlbumArtUri(album.id).toString())
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.id))
|
||||||
.withBitmap()
|
.error(R.drawable.default_album_art)
|
||||||
.resize(holder.image.getWidth(), holder.image.getHeight())
|
.listener(new RequestListener<Uri, GlideDrawable>() {
|
||||||
.centerCrop()
|
|
||||||
.intoImageView(holder.image)
|
|
||||||
.withBitmapInfo()
|
|
||||||
.setCallback(new FutureCallback<ImageViewBitmapInfo>() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onCompleted(Exception e, ImageViewBitmapInfo result) {
|
public boolean onException(Exception e, Uri model, Target<GlideDrawable> target, boolean isFirstResource) {
|
||||||
if (result != null) {
|
|
||||||
BitmapInfo info = result.getBitmapInfo();
|
|
||||||
if (info != null) {
|
|
||||||
Bitmap bitmap = info.bitmap;
|
|
||||||
if (bitmap != null) {
|
|
||||||
if (usePalette)
|
if (usePalette)
|
||||||
applyPalette(bitmap, holder.title, holder.artist, holder.footer);
|
applyPalette(null, holder.title, holder.artist, holder.footer);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
@Override
|
||||||
holder.image.setImageResource(R.drawable.default_album_art);
|
public boolean onResourceReady(GlideDrawable resource, Uri model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
||||||
if (usePalette)
|
if (usePalette)
|
||||||
paletteBlackAndWhite(holder.title, holder.artist, holder.footer);
|
applyPalette(((GlideBitmapDrawable) resource).getBitmap(), holder.title, holder.artist, holder.footer);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.into(holder.albumArt)
|
||||||
|
.getRequest()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -101,14 +98,14 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
|
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
|
||||||
final ImageView image;
|
final ImageView albumArt;
|
||||||
final TextView title;
|
final TextView title;
|
||||||
final TextView artist;
|
final TextView artist;
|
||||||
final View footer;
|
final View footer;
|
||||||
|
|
||||||
public ViewHolder(View itemView) {
|
public ViewHolder(View itemView) {
|
||||||
super(itemView);
|
super(itemView);
|
||||||
image = (ImageView) itemView.findViewById(R.id.album_art);
|
albumArt = (ImageView) itemView.findViewById(R.id.album_art);
|
||||||
title = (TextView) itemView.findViewById(R.id.album_title);
|
title = (TextView) itemView.findViewById(R.id.album_title);
|
||||||
artist = (TextView) itemView.findViewById(R.id.album_interpret);
|
artist = (TextView) itemView.findViewById(R.id.album_interpret);
|
||||||
footer = itemView.findViewById(R.id.footer);
|
footer = itemView.findViewById(R.id.footer);
|
||||||
|
|
@ -118,7 +115,7 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
Pair[] albumPairs = new Pair[]{
|
Pair[] albumPairs = new Pair[]{
|
||||||
Pair.create(image,
|
Pair.create(albumArt,
|
||||||
activity.getResources().getString(R.string.transition_album_cover)
|
activity.getResources().getString(R.string.transition_album_cover)
|
||||||
)};
|
)};
|
||||||
if (activity instanceof AbsFabActivity)
|
if (activity instanceof AbsFabActivity)
|
||||||
|
|
@ -138,6 +135,7 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyPalette(Bitmap bitmap, final TextView title, final TextView artist, final View footer) {
|
private void applyPalette(Bitmap bitmap, final TextView title, final TextView artist, final View footer) {
|
||||||
|
if (bitmap != null) {
|
||||||
Palette.from(bitmap)
|
Palette.from(bitmap)
|
||||||
.generate(new Palette.PaletteAsyncListener() {
|
.generate(new Palette.PaletteAsyncListener() {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -152,6 +150,9 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
paletteBlackAndWhite(title, artist, footer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void paletteBlackAndWhite(final TextView title, final TextView artist, final View footer) {
|
private void paletteBlackAndWhite(final TextView title, final TextView artist, final View footer) {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package com.kabouzeid.gramophone.adapter;
|
package com.kabouzeid.gramophone.adapter;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.support.v4.util.Pair;
|
import android.support.v4.util.Pair;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
|
@ -10,6 +9,7 @@ import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistThumbnailUrlLoader;
|
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistThumbnailUrlLoader;
|
||||||
|
|
@ -17,9 +17,8 @@ import com.kabouzeid.gramophone.loader.ArtistLoader;
|
||||||
import com.kabouzeid.gramophone.model.Artist;
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.koushikdutta.async.future.FutureCallback;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -51,25 +50,16 @@ public class ArtistAdapter extends RecyclerView.Adapter<ArtistAdapter.ViewHolder
|
||||||
final Artist artist = dataSet.get(position);
|
final Artist artist = dataSet.get(position);
|
||||||
|
|
||||||
holder.artistName.setText(artist.name);
|
holder.artistName.setText(artist.name);
|
||||||
holder.artistInfo.setText(artist.getSubTitle());
|
holder.artistInfo.setText(MusicUtil.getArtistInfoString(activity, artist));
|
||||||
holder.artistImage.setImageResource(R.drawable.default_artist_image);
|
holder.artistImage.setImageResource(R.drawable.default_artist_image);
|
||||||
|
|
||||||
LastFMArtistThumbnailUrlLoader.loadArtistThumbnailUrl(activity, artist.name, false, new LastFMArtistThumbnailUrlLoader.ArtistThumbnailUrlLoaderCallback() {
|
LastFMArtistThumbnailUrlLoader.loadArtistThumbnailUrl(activity, artist.name, false, new LastFMArtistThumbnailUrlLoader.ArtistThumbnailUrlLoaderCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onArtistThumbnailUrlLoaded(final String url) {
|
public void onArtistThumbnailUrlLoaded(final String url) {
|
||||||
Ion.with(activity)
|
Glide.with(activity)
|
||||||
.load(url)
|
.load(url)
|
||||||
.asBitmap()
|
.error(R.drawable.default_artist_image)
|
||||||
.setCallback(new FutureCallback<Bitmap>() {
|
.into(holder.artistImage);
|
||||||
@Override
|
|
||||||
public void onCompleted(Exception e, Bitmap result) {
|
|
||||||
if (result != null)
|
|
||||||
holder.artistImage.setImageBitmap(result);
|
|
||||||
else {
|
|
||||||
holder.artistImage.setImageResource(R.drawable.default_artist_image);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,13 @@ import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.request.Request;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.model.Album;
|
import com.kabouzeid.gramophone.model.Album;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -44,17 +45,25 @@ public class ArtistAlbumAdapter extends RecyclerView.Adapter<ArtistAlbumAdapter.
|
||||||
return new ViewHolder(view);
|
return new ViewHolder(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewRecycled(ViewHolder holder) {
|
||||||
|
super.onViewRecycled(holder);
|
||||||
|
Object tag = holder.albumArt.getTag();
|
||||||
|
if (tag instanceof Request) {
|
||||||
|
((Request) tag).clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(final ViewHolder holder, int position) {
|
public void onBindViewHolder(final ViewHolder holder, int position) {
|
||||||
final Album album = dataSet.get(position);
|
final Album album = dataSet.get(position);
|
||||||
|
|
||||||
Ion.with(activity)
|
holder.albumArt.setTag(Glide.with(activity)
|
||||||
.load(MusicUtil.getAlbumArtUri(album.id).toString())
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.id))
|
||||||
.withBitmap()
|
|
||||||
.resize(holder.albumArt.getWidth(), holder.albumArt.getHeight())
|
|
||||||
.centerCrop()
|
|
||||||
.error(R.drawable.default_album_art)
|
.error(R.drawable.default_album_art)
|
||||||
.intoImageView(holder.albumArt);
|
.into(holder.albumArt)
|
||||||
|
.getRequest()
|
||||||
|
);
|
||||||
|
|
||||||
holder.title.setText(album.title);
|
holder.title.setText(album.title);
|
||||||
holder.year.setText(String.valueOf(album.year));
|
holder.year.setText(String.valueOf(album.year));
|
||||||
|
|
|
||||||
|
|
@ -1,91 +1,39 @@
|
||||||
package com.kabouzeid.gramophone.adapter;
|
package com.kabouzeid.gramophone.adapter;
|
||||||
|
|
||||||
import android.graphics.Color;
|
import android.app.Activity;
|
||||||
import android.graphics.Typeface;
|
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.view.LayoutInflater;
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ArrayAdapter;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.PopupMenu;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
|
||||||
import com.kabouzeid.gramophone.R;
|
|
||||||
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
|
||||||
import com.kabouzeid.gramophone.model.SearchEntry;
|
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
|
||||||
import com.kabouzeid.gramophone.ui.activities.SearchActivity;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class SearchAdapter extends ArrayAdapter<SearchEntry> {
|
public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder> {
|
||||||
|
private Activity activity;
|
||||||
|
|
||||||
private final AppCompatActivity activity;
|
public SearchAdapter(AppCompatActivity activity) {
|
||||||
|
|
||||||
public SearchAdapter(AppCompatActivity activity, List<SearchEntry> objects) {
|
|
||||||
super(activity, R.layout.item_list_search, objects);
|
|
||||||
this.activity = activity;
|
this.activity = activity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View getView(int position, View convertView, ViewGroup parent) {
|
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
if (convertView == null) {
|
return null;
|
||||||
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_list_search, parent, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final SearchEntry item = getItem(position);
|
|
||||||
|
|
||||||
final TextView title = (TextView) convertView.findViewById(R.id.title);
|
|
||||||
final TextView subTitle = (TextView) convertView.findViewById(R.id.sub_title);
|
|
||||||
final ImageView imageView = (ImageView) convertView.findViewById(R.id.image);
|
|
||||||
final ImageView overflowButton = (ImageView) convertView.findViewById(R.id.menu);
|
|
||||||
|
|
||||||
if (item instanceof SearchActivity.LabelEntry) {
|
|
||||||
title.setTypeface(null, Typeface.BOLD);
|
|
||||||
subTitle.setVisibility(View.GONE);
|
|
||||||
imageView.setVisibility(View.GONE);
|
|
||||||
overflowButton.setVisibility(View.GONE);
|
|
||||||
convertView.setBackgroundColor(DialogUtils.resolveColor(getContext(), R.attr.default_bar_color));
|
|
||||||
} else if (item instanceof Song) {
|
|
||||||
title.setTypeface(null, Typeface.NORMAL);
|
|
||||||
subTitle.setVisibility(View.VISIBLE);
|
|
||||||
imageView.setVisibility(View.GONE);
|
|
||||||
convertView.setBackgroundColor(Color.TRANSPARENT);
|
|
||||||
overflowButton.setVisibility(View.VISIBLE);
|
|
||||||
overflowButton.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onBindViewHolder(ViewHolder holder, int position) {
|
||||||
PopupMenu popupMenu = new PopupMenu(activity, view);
|
|
||||||
popupMenu.inflate(R.menu.menu_item_song);
|
}
|
||||||
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onMenuItemClick(MenuItem menuItem) {
|
public int getItemCount() {
|
||||||
return MenuItemClickHelper.handleSongMenuClick(activity, (Song) item, menuItem);
|
return 0;
|
||||||
}
|
|
||||||
});
|
|
||||||
popupMenu.show();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
title.setTypeface(null, Typeface.NORMAL);
|
|
||||||
subTitle.setVisibility(View.VISIBLE);
|
|
||||||
imageView.setVisibility(View.VISIBLE);
|
|
||||||
overflowButton.setVisibility(View.GONE);
|
|
||||||
convertView.setBackgroundColor(Color.TRANSPARENT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
title.setText(item.getTitle());
|
public class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
subTitle.setText(item.getSubTitle());
|
public ViewHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
imageView.setImageBitmap(null);
|
}
|
||||||
item.loadImage(getContext(), imageView);
|
|
||||||
|
|
||||||
return convertView;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,13 @@ import android.widget.ImageView;
|
||||||
import android.widget.PopupMenu;
|
import android.widget.PopupMenu;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -47,13 +47,10 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> {
|
||||||
songTitle.setText(song.title);
|
songTitle.setText(song.title);
|
||||||
songInfo.setText(song.albumName);
|
songInfo.setText(song.albumName);
|
||||||
|
|
||||||
Ion.with(activity)
|
Glide.with(activity)
|
||||||
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId))
|
||||||
.withBitmap()
|
|
||||||
.resize(albumArt.getWidth(), albumArt.getHeight())
|
|
||||||
.centerCrop()
|
|
||||||
.error(R.drawable.default_album_art)
|
.error(R.drawable.default_album_art)
|
||||||
.intoImageView(albumArt);
|
.into(albumArt);
|
||||||
|
|
||||||
final ImageView overflowButton = (ImageView) convertView.findViewById(R.id.menu);
|
final ImageView overflowButton = (ImageView) convertView.findViewById(R.id.menu);
|
||||||
overflowButton.setOnClickListener(new View.OnClickListener() {
|
overflowButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,8 @@ import android.widget.ImageView;
|
||||||
import android.widget.PopupMenu;
|
import android.widget.PopupMenu;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.request.Request;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
|
|
@ -20,7 +22,6 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.kabouzeid.gramophone.util.PlaylistsUtil;
|
import com.kabouzeid.gramophone.util.PlaylistsUtil;
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -48,6 +49,10 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter<PlaylistSongAdapte
|
||||||
@Override
|
@Override
|
||||||
public void onViewRecycled(ViewHolder holder) {
|
public void onViewRecycled(ViewHolder holder) {
|
||||||
super.onViewRecycled(holder);
|
super.onViewRecycled(holder);
|
||||||
|
Object tag = holder.albumArt.getTag();
|
||||||
|
if (tag instanceof Request) {
|
||||||
|
((Request) tag).clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -56,15 +61,12 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter<PlaylistSongAdapte
|
||||||
|
|
||||||
holder.songTitle.setText(song.title);
|
holder.songTitle.setText(song.title);
|
||||||
holder.songInfo.setText(song.artistName);
|
holder.songInfo.setText(song.artistName);
|
||||||
|
|
||||||
holder.albumArt.setTag(
|
holder.albumArt.setTag(
|
||||||
Ion.with(activity)
|
Glide.with(activity)
|
||||||
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId))
|
||||||
.withBitmap()
|
|
||||||
.resize(holder.albumArt.getWidth(), holder.albumArt.getHeight())
|
|
||||||
.centerCrop()
|
|
||||||
.error(R.drawable.default_album_art)
|
.error(R.drawable.default_album_art)
|
||||||
.intoImageView(holder.albumArt)
|
.into(holder.albumArt)
|
||||||
|
.getRequest()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,8 @@ import android.widget.PopupMenu;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.ThemeSingleton;
|
import com.afollestad.materialdialogs.ThemeSingleton;
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.request.Request;
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
||||||
|
|
@ -23,7 +25,6 @@ import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -55,6 +56,15 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
|
||||||
return new ViewHolder(view);
|
return new ViewHolder(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewRecycled(ViewHolder holder) {
|
||||||
|
super.onViewRecycled(holder);
|
||||||
|
Object tag = holder.albumArt.getTag();
|
||||||
|
if (tag instanceof Request) {
|
||||||
|
((Request) tag).clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemViewType(int position) {
|
public int getItemViewType(int position) {
|
||||||
return position == 0 ? SHUFFLE_BUTTON : SONG;
|
return position == 0 ? SHUFFLE_BUTTON : SONG;
|
||||||
|
|
@ -67,14 +77,13 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
|
||||||
|
|
||||||
holder.songTitle.setText(song.title);
|
holder.songTitle.setText(song.title);
|
||||||
holder.songInfo.setText(song.artistName);
|
holder.songInfo.setText(song.artistName);
|
||||||
|
holder.albumArt.setTag(
|
||||||
Ion.with(activity)
|
Glide.with(activity)
|
||||||
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId))
|
||||||
.withBitmap()
|
|
||||||
.resize(holder.albumArt.getWidth(), holder.albumArt.getHeight())
|
|
||||||
.centerCrop()
|
|
||||||
.error(R.drawable.default_album_art)
|
.error(R.drawable.default_album_art)
|
||||||
.intoImageView(holder.albumArt);
|
.into(holder.albumArt)
|
||||||
|
.getRequest()
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
holder.songTitle.setText(activity.getResources().getString(R.string.shuffle_all).toUpperCase());
|
holder.songTitle.setText(activity.getResources().getString(R.string.shuffle_all).toUpperCase());
|
||||||
holder.songTitle.setTextColor(ThemeSingleton.get().positiveColor);
|
holder.songTitle.setTextColor(ThemeSingleton.get().positiveColor);
|
||||||
|
|
|
||||||
|
|
@ -7,21 +7,23 @@ import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.net.Uri;
|
||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.request.Request;
|
||||||
|
import com.bumptech.glide.request.RequestListener;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.service.MusicService;
|
import com.kabouzeid.gramophone.service.MusicService;
|
||||||
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
|
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.koushikdutta.async.future.Future;
|
|
||||||
import com.koushikdutta.async.future.FutureCallback;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
|
|
||||||
public class MusicPlayerWidget extends AppWidgetProvider {
|
public class MusicPlayerWidget extends AppWidgetProvider {
|
||||||
private static RemoteViews widgetLayout;
|
private static RemoteViews widgetLayout;
|
||||||
private static Future albumArtTask;
|
private static Request albumArtRequest;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
|
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
|
||||||
|
|
@ -59,27 +61,35 @@ public class MusicPlayerWidget extends AppWidgetProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void loadAlbumArt(final Context context, final Song song) {
|
private static void loadAlbumArt(final Context context, final Song song) {
|
||||||
if (albumArtTask != null) albumArtTask.cancel();
|
if (albumArtRequest != null) albumArtRequest.clear();
|
||||||
albumArtTask = Ion.with(context)
|
final int notificationAlbumArtSize = context.getResources().getDimensionPixelSize(R.dimen.app_widget_small_artwork_height);
|
||||||
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
|
albumArtRequest = Glide.with(context)
|
||||||
.noCache()
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId))
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.setCallback(new FutureCallback<Bitmap>() {
|
.skipMemoryCache(true)
|
||||||
|
.listener(new RequestListener<Uri, Bitmap>() {
|
||||||
@Override
|
@Override
|
||||||
public void onCompleted(Exception e, Bitmap result) {
|
public boolean onException(Exception e, Uri model, Target<Bitmap> target, boolean isFirstResource) {
|
||||||
if (result != null) setAlbumArt(context, result);
|
setAlbumArt(context, null);
|
||||||
else resetAlbumArt(context);
|
return false;
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void resetAlbumArt(final Context context) {
|
@Override
|
||||||
widgetLayout.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
|
public boolean onResourceReady(Bitmap resource, Uri model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
||||||
updateWidgets(context);
|
setAlbumArt(context, resource);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.into(notificationAlbumArtSize, notificationAlbumArtSize)
|
||||||
|
.getRequest();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setAlbumArt(final Context context, final Bitmap albumArt) {
|
private static void setAlbumArt(final Context context, final Bitmap albumArt) {
|
||||||
|
if (albumArt != null) {
|
||||||
widgetLayout.setImageViewBitmap(R.id.album_art, albumArt);
|
widgetLayout.setImageViewBitmap(R.id.album_art, albumArt);
|
||||||
|
} else {
|
||||||
|
widgetLayout.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
|
||||||
|
}
|
||||||
updateWidgets(context);
|
updateWidgets(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ public class DeleteSongsDialog extends DialogFragment {
|
||||||
content = Html.fromHtml(getString(R.string.delete_x_songs, songs.size()));
|
content = Html.fromHtml(getString(R.string.delete_x_songs, songs.size()));
|
||||||
} else {
|
} else {
|
||||||
title = R.string.delete_song_title;
|
title = R.string.delete_song_title;
|
||||||
content = Html.fromHtml(getString(R.string.delete_song_x, songs.get(0).getTitle()));
|
content = Html.fromHtml(getString(R.string.delete_song_x, songs.get(0).title));
|
||||||
}
|
}
|
||||||
return new MaterialDialog.Builder(getActivity())
|
return new MaterialDialog.Builder(getActivity())
|
||||||
.title(title)
|
.title(title)
|
||||||
|
|
|
||||||
|
|
@ -12,17 +12,19 @@ import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.net.Uri;
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.request.Request;
|
||||||
|
import com.bumptech.glide.request.RequestListener;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.service.MusicService;
|
import com.kabouzeid.gramophone.service.MusicService;
|
||||||
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
|
import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.koushikdutta.async.future.Future;
|
|
||||||
import com.koushikdutta.async.future.FutureCallback;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
|
|
||||||
public class PlayingNotificationHelper {
|
public class PlayingNotificationHelper {
|
||||||
|
|
||||||
|
|
@ -37,7 +39,8 @@ public class PlayingNotificationHelper {
|
||||||
private RemoteViews notificationLayout;
|
private RemoteViews notificationLayout;
|
||||||
private RemoteViews notificationLayoutExpanded;
|
private RemoteViews notificationLayoutExpanded;
|
||||||
|
|
||||||
private Future albumArtTask;
|
private Request albumArtRequest;
|
||||||
|
private Song currentSong;
|
||||||
|
|
||||||
public PlayingNotificationHelper(final MusicService service) {
|
public PlayingNotificationHelper(final MusicService service) {
|
||||||
this.service = service;
|
this.service = service;
|
||||||
|
|
@ -46,6 +49,7 @@ public class PlayingNotificationHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void buildNotification(final Song song, final boolean isPlaying) {
|
public void buildNotification(final Song song, final boolean isPlaying) {
|
||||||
|
currentSong = song;
|
||||||
notificationLayout = new RemoteViews(service.getPackageName(),
|
notificationLayout = new RemoteViews(service.getPackageName(),
|
||||||
R.layout.notification_playing);
|
R.layout.notification_playing);
|
||||||
notificationLayoutExpanded = new RemoteViews(service.getPackageName(),
|
notificationLayoutExpanded = new RemoteViews(service.getPackageName(),
|
||||||
|
|
@ -61,9 +65,9 @@ public class PlayingNotificationHelper {
|
||||||
.build();
|
.build();
|
||||||
notification.bigContentView = notificationLayoutExpanded;
|
notification.bigContentView = notificationLayoutExpanded;
|
||||||
|
|
||||||
setUpCollapsedLayout(song);
|
setUpCollapsedLayout();
|
||||||
setUpExpandedLayout(song);
|
setUpExpandedLayout();
|
||||||
loadAlbumArt(song);
|
loadAlbumArt();
|
||||||
setUpPlaybackActions(isPlaying);
|
setUpPlaybackActions(isPlaying);
|
||||||
setUpExpandedPlaybackActions(isPlaying);
|
setUpExpandedPlaybackActions(isPlaying);
|
||||||
|
|
||||||
|
|
@ -140,41 +144,55 @@ public class PlayingNotificationHelper {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpCollapsedLayout(final Song song) {
|
private void setUpCollapsedLayout() {
|
||||||
notificationLayout.setTextViewText(R.id.song_title, song.title);
|
if (currentSong != null) {
|
||||||
notificationLayout.setTextViewText(R.id.song_artist, song.artistName);
|
notificationLayout.setTextViewText(R.id.song_title, currentSong.title);
|
||||||
|
notificationLayout.setTextViewText(R.id.song_artist, currentSong.artistName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpExpandedLayout(final Song song) {
|
private void setUpExpandedLayout() {
|
||||||
notificationLayoutExpanded.setTextViewText(R.id.song_title, song.title);
|
if (currentSong != null) {
|
||||||
notificationLayoutExpanded.setTextViewText(R.id.song_artist, song.artistName);
|
notificationLayoutExpanded.setTextViewText(R.id.song_title, currentSong.title);
|
||||||
notificationLayoutExpanded.setTextViewText(R.id.album_title, song.albumName);
|
notificationLayoutExpanded.setTextViewText(R.id.song_artist, currentSong.artistName);
|
||||||
|
notificationLayoutExpanded.setTextViewText(R.id.album_title, currentSong.albumName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadAlbumArt(final Song song) {
|
private void loadAlbumArt() {
|
||||||
if (albumArtTask != null) albumArtTask.cancel();
|
if (currentSong != null) {
|
||||||
albumArtTask = Ion.with(service)
|
if (albumArtRequest != null) albumArtRequest.clear();
|
||||||
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
|
final int notificationAlbumArtSize = service.getResources().getDimensionPixelSize(R.dimen.notification_albumart_size);
|
||||||
.noCache()
|
albumArtRequest = Glide.with(service)
|
||||||
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(currentSong.albumId))
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.setCallback(new FutureCallback<Bitmap>() {
|
.skipMemoryCache(true)
|
||||||
|
.listener(new RequestListener<Uri, Bitmap>() {
|
||||||
@Override
|
@Override
|
||||||
public void onCompleted(Exception e, Bitmap result) {
|
public boolean onException(Exception e, Uri model, Target<Bitmap> target, boolean isFirstResource) {
|
||||||
if (result != null) setAlbumArt(result);
|
setAlbumArt(null);
|
||||||
else resetAlbumArt();
|
return false;
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetAlbumArt() {
|
@Override
|
||||||
notificationLayout.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
|
public boolean onResourceReady(Bitmap resource, Uri model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
||||||
notificationLayoutExpanded.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
|
setAlbumArt(resource);
|
||||||
notificationManager.notify(NOTIFICATION_ID, notification);
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.into(notificationAlbumArtSize, notificationAlbumArtSize)
|
||||||
|
.getRequest();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setAlbumArt(Bitmap albumArt) {
|
private void setAlbumArt(Bitmap albumArt) {
|
||||||
|
if (albumArt != null) {
|
||||||
notificationLayout.setImageViewBitmap(R.id.album_art, albumArt);
|
notificationLayout.setImageViewBitmap(R.id.album_art, albumArt);
|
||||||
notificationLayoutExpanded.setImageViewBitmap(R.id.album_art, albumArt);
|
notificationLayoutExpanded.setImageViewBitmap(R.id.album_art, albumArt);
|
||||||
|
} else {
|
||||||
|
notificationLayout.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
|
||||||
|
notificationLayoutExpanded.setImageViewResource(R.id.album_art, R.drawable.default_album_art);
|
||||||
|
}
|
||||||
notificationManager.notify(NOTIFICATION_ID, notification);
|
notificationManager.notify(NOTIFICATION_ID, notification);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,9 @@
|
||||||
package com.kabouzeid.gramophone.model;
|
package com.kabouzeid.gramophone.model;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class Album implements SearchEntry {
|
public class Album {
|
||||||
|
|
||||||
public final int id;
|
public final int id;
|
||||||
public int artistId;
|
public int artistId;
|
||||||
|
|
@ -36,31 +29,4 @@ public class Album implements SearchEntry {
|
||||||
songCount = -1;
|
songCount = -1;
|
||||||
year = -1;
|
year = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTitle() {
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSubTitle() {
|
|
||||||
return artistName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadImage(final Context context, final ImageView imageView) {
|
|
||||||
imageView.setImageResource(R.drawable.default_album_art);
|
|
||||||
imageView.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Ion.with(context)
|
|
||||||
.load(MusicUtil.getAlbumArtUri(id).toString())
|
|
||||||
.withBitmap()
|
|
||||||
.resize(imageView.getWidth(), imageView.getHeight())
|
|
||||||
.centerCrop()
|
|
||||||
.error(R.drawable.default_album_art)
|
|
||||||
.intoImageView(imageView);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,9 @@
|
||||||
package com.kabouzeid.gramophone.model;
|
package com.kabouzeid.gramophone.model;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.R;
|
|
||||||
import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistThumbnailUrlLoader;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class Artist implements SearchEntry {
|
public class Artist {
|
||||||
public final int id;
|
public final int id;
|
||||||
public final String name;
|
public final String name;
|
||||||
public final int albumCount;
|
public final int albumCount;
|
||||||
|
|
@ -29,36 +22,4 @@ public class Artist implements SearchEntry {
|
||||||
songCount = -1;
|
songCount = -1;
|
||||||
albumCount = -1;
|
albumCount = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTitle() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSubTitle() {
|
|
||||||
return songCount + " Songs | " + albumCount + " Albums";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadImage(final Context context, final ImageView imageView) {
|
|
||||||
imageView.setImageResource(R.drawable.default_artist_image);
|
|
||||||
LastFMArtistThumbnailUrlLoader.loadArtistThumbnailUrl(context, name, false, new LastFMArtistThumbnailUrlLoader.ArtistThumbnailUrlLoaderCallback() {
|
|
||||||
@Override
|
|
||||||
public void onArtistThumbnailUrlLoaded(final String url) {
|
|
||||||
imageView.post(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Ion.with(context)
|
|
||||||
.load(url)
|
|
||||||
.withBitmap()
|
|
||||||
.resize(imageView.getWidth(), imageView.getHeight())
|
|
||||||
.centerCrop()
|
|
||||||
.error(R.drawable.default_artist_image)
|
|
||||||
.intoImageView(imageView);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
package com.kabouzeid.gramophone.model;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
|
||||||
*/
|
|
||||||
public interface SearchEntry {
|
|
||||||
String getTitle();
|
|
||||||
|
|
||||||
String getSubTitle();
|
|
||||||
|
|
||||||
void loadImage(Context context, ImageView imageView);
|
|
||||||
}
|
|
||||||
|
|
@ -1,14 +1,11 @@
|
||||||
package com.kabouzeid.gramophone.model;
|
package com.kabouzeid.gramophone.model;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Karim Abou Zeid (kabouzeid)
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
*/
|
*/
|
||||||
public class Song implements Serializable, SearchEntry {
|
public class Song implements Serializable {
|
||||||
|
|
||||||
public int id;
|
public int id;
|
||||||
public final int albumId;
|
public final int albumId;
|
||||||
|
|
@ -41,19 +38,4 @@ public class Song implements Serializable, SearchEntry {
|
||||||
this.duration = -1;
|
this.duration = -1;
|
||||||
this.trackNumber = -1;
|
this.trackNumber = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTitle() {
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSubTitle() {
|
|
||||||
return artistName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadImage(Context context, ImageView imageView) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,10 @@ import android.preference.PreferenceManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.request.Request;
|
||||||
|
import com.bumptech.glide.request.RequestListener;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.appwidget.MusicPlayerWidget;
|
import com.kabouzeid.gramophone.appwidget.MusicPlayerWidget;
|
||||||
|
|
@ -32,9 +36,6 @@ import com.kabouzeid.gramophone.model.MusicRemoteEvent;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.InternalStorageUtil;
|
import com.kabouzeid.gramophone.util.InternalStorageUtil;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.koushikdutta.async.future.Future;
|
|
||||||
import com.koushikdutta.async.future.FutureCallback;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -79,7 +80,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
|
||||||
private PlayingNotificationHelper playingNotificationHelper;
|
private PlayingNotificationHelper playingNotificationHelper;
|
||||||
private AudioManager audioManager;
|
private AudioManager audioManager;
|
||||||
private RemoteControlClient remoteControlClient;
|
private RemoteControlClient remoteControlClient;
|
||||||
private Future remoteControlClientAlbumArtTask;
|
private Request remoteControlClientAlbumArtRequest;
|
||||||
private PowerManager.WakeLock wakeLock;
|
private PowerManager.WakeLock wakeLock;
|
||||||
|
|
||||||
public MusicService() {
|
public MusicService() {
|
||||||
|
|
@ -357,17 +358,26 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
|
||||||
.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, song.duration)
|
.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, song.duration)
|
||||||
.apply();
|
.apply();
|
||||||
|
|
||||||
if (remoteControlClientAlbumArtTask != null) remoteControlClientAlbumArtTask.cancel();
|
if (remoteControlClientAlbumArtRequest != null) remoteControlClientAlbumArtRequest.clear();
|
||||||
remoteControlClientAlbumArtTask = Ion.with(this)
|
remoteControlClientAlbumArtRequest = Glide.with(this)
|
||||||
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId))
|
||||||
.noCache()
|
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.setCallback(new FutureCallback<Bitmap>() {
|
.skipMemoryCache(true)
|
||||||
|
.listener(new RequestListener<Uri, Bitmap>() {
|
||||||
@Override
|
@Override
|
||||||
public void onCompleted(Exception e, Bitmap result) {
|
public boolean onException(Exception e, Uri model, Target<Bitmap> target, boolean isFirstResource) {
|
||||||
updateRemoteControlClientBitmap(result);
|
updateRemoteControlClientBitmap(null);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
@Override
|
||||||
|
public boolean onResourceReady(Bitmap resource, Uri model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
||||||
|
updateRemoteControlClientBitmap(resource);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.into(-1, -1)
|
||||||
|
.getRequest();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateRemoteControlClientBitmap(final Bitmap albumArt) {
|
private void updateRemoteControlClientBitmap(final Bitmap albumArt) {
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import android.annotation.TargetApi;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Color;
|
import android.graphics.Color;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.util.Pair;
|
import android.support.v4.util.Pair;
|
||||||
|
|
@ -17,6 +18,11 @@ import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
import com.afollestad.materialdialogs.util.DialogUtils;
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable;
|
||||||
|
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
|
||||||
|
import com.bumptech.glide.request.RequestListener;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
|
import com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView;
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
|
@ -37,8 +43,6 @@ import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
||||||
import com.kabouzeid.gramophone.util.Util;
|
import com.kabouzeid.gramophone.util.Util;
|
||||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
import com.koushikdutta.async.future.FutureCallback;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
import com.nineoldandroids.view.ViewHelper;
|
import com.nineoldandroids.view.ViewHelper;
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
|
@ -170,33 +174,33 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpAlbumArtAndApplyPalette() {
|
private void setUpAlbumArtAndApplyPalette() {
|
||||||
albumArtImageView.post(new Runnable() {
|
Glide.with(AlbumDetailActivity.this)
|
||||||
@Override
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(album.id))
|
||||||
public void run() {
|
.error(R.drawable.default_album_art)
|
||||||
Ion.with(AlbumDetailActivity.this)
|
.listener(new RequestListener<Uri, GlideDrawable>() {
|
||||||
.load(MusicUtil.getAlbumArtUri(album.id).toString())
|
|
||||||
.withBitmap()
|
|
||||||
.smartSize(false)
|
|
||||||
.asBitmap()
|
|
||||||
.setCallback(new FutureCallback<Bitmap>() {
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
@Override
|
@Override
|
||||||
public void onCompleted(Exception e, Bitmap result) {
|
public boolean onException(Exception e, Uri model, Target<GlideDrawable> target, boolean isFirstResource) {
|
||||||
if (result != null) {
|
applyPalette(null);
|
||||||
albumArtImageView.setImageBitmap(result);
|
|
||||||
applyPalette(result);
|
|
||||||
} else {
|
|
||||||
albumArtImageView.setImageResource(R.drawable.default_album_art);
|
|
||||||
resetColors();
|
|
||||||
}
|
|
||||||
if (Util.isAtLeastLollipop()) startPostponedEnterTransition();
|
if (Util.isAtLeastLollipop()) startPostponedEnterTransition();
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
@Override
|
||||||
|
public boolean onResourceReady(GlideDrawable resource, Uri model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
||||||
|
applyPalette(((GlideBitmapDrawable) resource).getBitmap());
|
||||||
|
if (Util.isAtLeastLollipop()) startPostponedEnterTransition();
|
||||||
|
// workaround for glide not working well with shared element, dont remove this redundant looking call!
|
||||||
|
albumArtImageView.setImageDrawable(resource);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
.into(albumArtImageView);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyPalette(Bitmap bitmap) {
|
private void applyPalette(Bitmap bitmap) {
|
||||||
|
if (bitmap != null) {
|
||||||
Palette.from(bitmap)
|
Palette.from(bitmap)
|
||||||
.generate(new Palette.PaletteAsyncListener() {
|
.generate(new Palette.PaletteAsyncListener() {
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
|
@ -215,6 +219,9 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
resetColors();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,11 @@ import android.widget.Toast;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
import com.afollestad.materialdialogs.util.DialogUtils;
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable;
|
||||||
|
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
|
||||||
|
import com.bumptech.glide.request.RequestListener;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.github.ksoichiro.android.observablescrollview.ObservableListView;
|
import com.github.ksoichiro.android.observablescrollview.ObservableListView;
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
|
@ -47,8 +52,6 @@ import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
||||||
import com.kabouzeid.gramophone.util.Util;
|
import com.kabouzeid.gramophone.util.Util;
|
||||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
import com.koushikdutta.async.future.FutureCallback;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
import com.nineoldandroids.view.ViewHelper;
|
import com.nineoldandroids.view.ViewHelper;
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
|
@ -265,33 +268,29 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
|
||||||
LastFMArtistImageUrlLoader.loadArtistImageUrl(this, artist.name, forceDownload, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() {
|
LastFMArtistImageUrlLoader.loadArtistImageUrl(this, artist.name, forceDownload, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onArtistImageUrlLoaded(final String url) {
|
public void onArtistImageUrlLoaded(final String url) {
|
||||||
artistImage.post(new Runnable() {
|
Glide.with(ArtistDetailActivity.this)
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Ion.with(ArtistDetailActivity.this)
|
|
||||||
.load(url)
|
.load(url)
|
||||||
.withBitmap()
|
.error(R.drawable.default_artist_image)
|
||||||
.smartSize(false)
|
.listener(new RequestListener<String, GlideDrawable>() {
|
||||||
.asBitmap()
|
|
||||||
.setCallback(new FutureCallback<Bitmap>() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onCompleted(Exception e, Bitmap result) {
|
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
|
||||||
if (result != null) {
|
applyPalette(null);
|
||||||
artistImage.setImageBitmap(result);
|
return false;
|
||||||
applyPalette(result);
|
|
||||||
} else {
|
|
||||||
artistImage.setImageResource(R.drawable.default_artist_image);
|
|
||||||
resetColors();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
||||||
|
applyPalette(((GlideBitmapDrawable) resource).getBitmap());
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
}
|
.into(artistImage);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyPalette(Bitmap bitmap) {
|
private void applyPalette(Bitmap bitmap) {
|
||||||
|
if (bitmap != null) {
|
||||||
Palette.from(bitmap)
|
Palette.from(bitmap)
|
||||||
.generate(new Palette.PaletteAsyncListener() {
|
.generate(new Palette.PaletteAsyncListener() {
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
|
@ -310,6 +309,9 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
resetColors();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.ui.activities;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
|
@ -28,6 +27,7 @@ import android.widget.FrameLayout;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.ThemeSingleton;
|
import com.afollestad.materialdialogs.ThemeSingleton;
|
||||||
import com.astuetz.PagerSlidingTabStrip;
|
import com.astuetz.PagerSlidingTabStrip;
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.PagerAdapter;
|
import com.kabouzeid.gramophone.adapter.PagerAdapter;
|
||||||
import com.kabouzeid.gramophone.dialogs.AboutDialog;
|
import com.kabouzeid.gramophone.dialogs.AboutDialog;
|
||||||
|
|
@ -49,8 +49,6 @@ import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
||||||
import com.kabouzeid.gramophone.util.Util;
|
import com.kabouzeid.gramophone.util.Util;
|
||||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
import com.koushikdutta.async.future.FutureCallback;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -204,22 +202,13 @@ public class MainActivity extends AbsFabActivity
|
||||||
if (navigationDrawerFragment != null) {
|
if (navigationDrawerFragment != null) {
|
||||||
Song song = MusicPlayerRemote.getCurrentSong();
|
Song song = MusicPlayerRemote.getCurrentSong();
|
||||||
if (song.id != -1) {
|
if (song.id != -1) {
|
||||||
Ion.with(this)
|
|
||||||
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
|
|
||||||
.withBitmap()
|
|
||||||
.smartSize(false)
|
|
||||||
.asBitmap()
|
|
||||||
.setCallback(new FutureCallback<Bitmap>() {
|
|
||||||
@Override
|
|
||||||
public void onCompleted(Exception e, Bitmap result) {
|
|
||||||
if (result != null)
|
|
||||||
navigationDrawerFragment.getAlbumArtImageView().setImageBitmap(result);
|
|
||||||
else
|
|
||||||
navigationDrawerFragment.getAlbumArtImageView().setImageResource(R.drawable.default_album_art);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
navigationDrawerFragment.getSongTitle().setText(song.title);
|
navigationDrawerFragment.getSongTitle().setText(song.title);
|
||||||
navigationDrawerFragment.getSongArtist().setText(song.artistName);
|
navigationDrawerFragment.getSongArtist().setText(song.artistName);
|
||||||
|
Glide.with(this)
|
||||||
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId))
|
||||||
|
.error(R.drawable.default_album_art)
|
||||||
|
.placeholder(R.drawable.default_album_art)
|
||||||
|
.into(navigationDrawerFragment.getAlbumArtImageView());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import android.content.Intent;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v7.graphics.Palette;
|
import android.support.v7.graphics.Palette;
|
||||||
|
|
@ -22,6 +23,11 @@ import android.widget.Toast;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.ThemeSingleton;
|
import com.afollestad.materialdialogs.ThemeSingleton;
|
||||||
import com.afollestad.materialdialogs.util.DialogUtils;
|
import com.afollestad.materialdialogs.util.DialogUtils;
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable;
|
||||||
|
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
|
||||||
|
import com.bumptech.glide.request.RequestListener;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||||
|
|
@ -41,8 +47,6 @@ import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||||
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
||||||
import com.kabouzeid.gramophone.util.Util;
|
import com.kabouzeid.gramophone.util.Util;
|
||||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
import com.koushikdutta.async.future.FutureCallback;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
import com.nineoldandroids.view.ViewPropertyAnimator;
|
import com.nineoldandroids.view.ViewPropertyAnimator;
|
||||||
import com.squareup.otto.Subscribe;
|
import com.squareup.otto.Subscribe;
|
||||||
|
|
||||||
|
|
@ -56,7 +60,7 @@ public class MusicControllerActivity extends AbsFabActivity {
|
||||||
|
|
||||||
private Song song;
|
private Song song;
|
||||||
private ImageView albumArt;
|
private ImageView albumArt;
|
||||||
private ImageView artistArt;
|
private ImageView artistImage;
|
||||||
private TextView songTitle;
|
private TextView songTitle;
|
||||||
private TextView songArtist;
|
private TextView songArtist;
|
||||||
private TextView currentSongProgress;
|
private TextView currentSongProgress;
|
||||||
|
|
@ -118,7 +122,7 @@ public class MusicControllerActivity extends AbsFabActivity {
|
||||||
repeatButton = (ImageButton) findViewById(R.id.repeat_button);
|
repeatButton = (ImageButton) findViewById(R.id.repeat_button);
|
||||||
shuffleButton = (ImageButton) findViewById(R.id.shuffle_button);
|
shuffleButton = (ImageButton) findViewById(R.id.shuffle_button);
|
||||||
albumArt = (ImageView) findViewById(R.id.album_art);
|
albumArt = (ImageView) findViewById(R.id.album_art);
|
||||||
artistArt = (ImageView) findViewById(R.id.artist_image);
|
artistImage = (ImageView) findViewById(R.id.artist_image);
|
||||||
songTitle = (TextView) findViewById(R.id.song_title);
|
songTitle = (TextView) findViewById(R.id.song_title);
|
||||||
songArtist = (TextView) findViewById(R.id.song_artist);
|
songArtist = (TextView) findViewById(R.id.song_artist);
|
||||||
currentSongProgress = (TextView) findViewById(R.id.song_current_progress);
|
currentSongProgress = (TextView) findViewById(R.id.song_current_progress);
|
||||||
|
|
@ -294,32 +298,28 @@ public class MusicControllerActivity extends AbsFabActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpAlbumArtAndApplyPalette() {
|
private void setUpAlbumArtAndApplyPalette() {
|
||||||
albumArt.post(new Runnable() {
|
Glide.with(this)
|
||||||
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId))
|
||||||
|
.error(R.drawable.default_album_art)
|
||||||
|
.placeholder(R.drawable.default_album_art)
|
||||||
|
.listener(new RequestListener<Uri, GlideDrawable>() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public boolean onException(Exception e, Uri model, Target<GlideDrawable> target, boolean isFirstResource) {
|
||||||
Ion.with(MusicControllerActivity.this)
|
applyPalette(null);
|
||||||
.load(MusicUtil.getAlbumArtUri(song.albumId).toString())
|
return false;
|
||||||
.withBitmap()
|
}
|
||||||
.smartSize(false)
|
|
||||||
.asBitmap()
|
|
||||||
.setCallback(new FutureCallback<Bitmap>() {
|
|
||||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
|
||||||
@Override
|
@Override
|
||||||
public void onCompleted(Exception e, Bitmap result) {
|
public boolean onResourceReady(GlideDrawable resource, Uri model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
||||||
if (result != null) {
|
applyPalette(((GlideBitmapDrawable) resource).getBitmap());
|
||||||
albumArt.setImageBitmap(result);
|
return false;
|
||||||
applyPalette(result);
|
|
||||||
} else {
|
|
||||||
albumArt.setImageResource(R.drawable.default_album_art);
|
|
||||||
resetColors();
|
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
});
|
.into(albumArt);
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyPalette(Bitmap bitmap) {
|
private void applyPalette(Bitmap bitmap) {
|
||||||
|
if (bitmap != null) {
|
||||||
Palette.from(bitmap)
|
Palette.from(bitmap)
|
||||||
.generate(new Palette.PaletteAsyncListener() {
|
.generate(new Palette.PaletteAsyncListener() {
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -336,6 +336,9 @@ public class MusicControllerActivity extends AbsFabActivity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
resetColors();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetColors() {
|
private void resetColors() {
|
||||||
|
|
@ -364,14 +367,15 @@ public class MusicControllerActivity extends AbsFabActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpArtistArt() {
|
private void setUpArtistArt() {
|
||||||
if (artistArt != null) {
|
if (artistImage != null) {
|
||||||
artistArt.setImageResource(R.drawable.default_artist_image);
|
artistImage.setImageResource(R.drawable.default_artist_image);
|
||||||
LastFMArtistImageUrlLoader.loadArtistImageUrl(this, song.artistName, false, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() {
|
LastFMArtistImageUrlLoader.loadArtistImageUrl(this, song.artistName, false, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onArtistImageUrlLoaded(String url) {
|
public void onArtistImageUrlLoaded(String url) {
|
||||||
Ion.with(artistArt)
|
Glide.with(MusicControllerActivity.this)
|
||||||
|
.load(url)
|
||||||
.error(R.drawable.default_artist_image)
|
.error(R.drawable.default_artist_image)
|
||||||
.load(url);
|
.into(artistImage);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,49 +2,33 @@ package com.kabouzeid.gramophone.ui.activities;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.ActionBar;
|
import android.app.ActionBar;
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.support.v4.util.Pair;
|
|
||||||
import android.support.v4.view.MenuItemCompat;
|
import android.support.v4.view.MenuItemCompat;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.support.v7.widget.SearchView;
|
import android.support.v7.widget.SearchView;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.ArrayAdapter;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.ListView;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.ThemeSingleton;
|
import com.afollestad.materialdialogs.ThemeSingleton;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.adapter.SearchAdapter;
|
import com.kabouzeid.gramophone.adapter.SearchAdapter;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
|
||||||
import com.kabouzeid.gramophone.loader.AlbumLoader;
|
|
||||||
import com.kabouzeid.gramophone.loader.ArtistLoader;
|
|
||||||
import com.kabouzeid.gramophone.loader.SongLoader;
|
|
||||||
import com.kabouzeid.gramophone.model.Album;
|
|
||||||
import com.kabouzeid.gramophone.model.Artist;
|
|
||||||
import com.kabouzeid.gramophone.model.SearchEntry;
|
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
|
||||||
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
|
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
|
||||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
|
||||||
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
||||||
import com.kabouzeid.gramophone.util.Util;
|
import com.kabouzeid.gramophone.util.Util;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class SearchActivity extends AbsBaseActivity {
|
public class SearchActivity extends AbsBaseActivity {
|
||||||
|
|
||||||
public static final String TAG = SearchActivity.class.getSimpleName();
|
public static final String TAG = SearchActivity.class.getSimpleName();
|
||||||
private ListView listView;
|
private RecyclerView recyclerView;
|
||||||
private SearchView searchView;
|
private SearchView searchView;
|
||||||
|
private SearchAdapter searchAdapter;
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -54,38 +38,11 @@ public class SearchActivity extends AbsBaseActivity {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_search);
|
setContentView(R.layout.activity_search);
|
||||||
|
|
||||||
listView = (ListView) findViewById(R.id.list);
|
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
|
||||||
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
searchAdapter = new SearchAdapter(this);
|
||||||
@Override
|
recyclerView.setAdapter(searchAdapter);
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
|
||||||
Object item = parent.getItemAtPosition(position);
|
|
||||||
if (item instanceof SearchEntry) {
|
|
||||||
if (item instanceof Song) {
|
|
||||||
ArrayList<Song> playList = new ArrayList<>();
|
|
||||||
playList.add((Song) item);
|
|
||||||
MusicPlayerRemote.openQueue(playList, 0, true);
|
|
||||||
} else if (item instanceof Album) {
|
|
||||||
NavigationUtil.goToAlbum(SearchActivity.this,
|
|
||||||
((Album) item).id,
|
|
||||||
new Pair[]{
|
|
||||||
Pair.create(view.findViewById(R.id.image),
|
|
||||||
getResources().getString(R.string.transition_album_cover)
|
|
||||||
)
|
|
||||||
});
|
|
||||||
} else if (item instanceof Artist) {
|
|
||||||
NavigationUtil.goToArtist(SearchActivity.this,
|
|
||||||
((Artist) item).id,
|
|
||||||
new Pair[]{
|
|
||||||
Pair.create(view.findViewById(R.id.image),
|
|
||||||
getResources().getString(R.string.transition_artist_image)
|
|
||||||
)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
listView.setOnTouchListener(new View.OnTouchListener() {
|
recyclerView.setOnTouchListener(new View.OnTouchListener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouch(View v, MotionEvent event) {
|
public boolean onTouch(View v, MotionEvent event) {
|
||||||
Util.hideSoftKeyboard(SearchActivity.this);
|
Util.hideSoftKeyboard(SearchActivity.this);
|
||||||
|
|
@ -120,13 +77,13 @@ public class SearchActivity extends AbsBaseActivity {
|
||||||
@Override
|
@Override
|
||||||
public void enableViews() {
|
public void enableViews() {
|
||||||
super.enableViews();
|
super.enableViews();
|
||||||
listView.setEnabled(true);
|
recyclerView.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disableViews() {
|
public void disableViews() {
|
||||||
super.disableViews();
|
super.disableViews();
|
||||||
listView.setEnabled(false);
|
recyclerView.setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -192,65 +149,6 @@ public class SearchActivity extends AbsBaseActivity {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void search(String query) {
|
private void search(String query) {
|
||||||
List<SearchEntry> results = new ArrayList<>();
|
|
||||||
if (!query.trim().equals("")) {
|
|
||||||
LabelEntry songLabel = new LabelEntry(getResources().getString(R.string.songs).toUpperCase());
|
|
||||||
results.add(songLabel);
|
|
||||||
List<Song> songs = SongLoader.getSongs(this, query);
|
|
||||||
results.addAll(songs);
|
|
||||||
songLabel.setNumber(songs.size());
|
|
||||||
|
|
||||||
LabelEntry artistLabel = new LabelEntry(getResources().getString(R.string.artists).toUpperCase());
|
|
||||||
results.add(artistLabel);
|
|
||||||
List<Artist> artists = ArtistLoader.getArtists(this, query);
|
|
||||||
results.addAll(artists);
|
|
||||||
artistLabel.setNumber(artists.size());
|
|
||||||
|
|
||||||
LabelEntry albumLabel = new LabelEntry(getResources().getString(R.string.albums).toUpperCase());
|
|
||||||
results.add(albumLabel);
|
|
||||||
List<Album> albums = AlbumLoader.getAlbums(this, query);
|
|
||||||
results.addAll(albums);
|
|
||||||
albumLabel.setNumber(albums.size());
|
|
||||||
}
|
|
||||||
if (results.size() <= 3) {
|
|
||||||
results.clear();
|
|
||||||
results.add(new LabelEntry(getResources().getString(R.string.no_results).toUpperCase()));
|
|
||||||
}
|
|
||||||
ArrayAdapter adapter = new SearchAdapter(this, results);
|
|
||||||
listView.setAdapter(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static class LabelEntry implements SearchEntry {
|
|
||||||
final String title;
|
|
||||||
String label;
|
|
||||||
|
|
||||||
public LabelEntry(String label) {
|
|
||||||
this.label = label;
|
|
||||||
this.title = label;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNumber(int number) {
|
|
||||||
if (number != -1) {
|
|
||||||
label = title + " (" + number + ")";
|
|
||||||
} else {
|
|
||||||
label = title;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTitle() {
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getSubTitle() {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadImage(Context context, ImageView imageView) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,6 @@ import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
import com.kabouzeid.gramophone.util.PreferenceUtils;
|
||||||
import com.kabouzeid.gramophone.util.Util;
|
import com.kabouzeid.gramophone.util.Util;
|
||||||
import com.kabouzeid.gramophone.util.ViewUtil;
|
import com.kabouzeid.gramophone.util.ViewUtil;
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
import com.melnykov.fab.FloatingActionButton;
|
import com.melnykov.fab.FloatingActionButton;
|
||||||
import com.nineoldandroids.view.ViewHelper;
|
import com.nineoldandroids.view.ViewHelper;
|
||||||
import com.nineoldandroids.view.ViewPropertyAnimator;
|
import com.nineoldandroids.view.ViewPropertyAnimator;
|
||||||
|
|
@ -378,11 +377,9 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
||||||
}
|
}
|
||||||
if (deleteArtwork) {
|
if (deleteArtwork) {
|
||||||
MusicUtil.deleteAlbumArt(AbsTagEditorActivity.this, getId());
|
MusicUtil.deleteAlbumArt(AbsTagEditorActivity.this, getId());
|
||||||
Ion.getDefault(AbsTagEditorActivity.this).getBitmapCache().clear();
|
//Glide.get(AbsTagEditorActivity.this).clearMemory();
|
||||||
Ion.getDefault(AbsTagEditorActivity.this).getCache().clear();
|
|
||||||
} else if (artwork != null) {
|
} else if (artwork != null) {
|
||||||
Ion.getDefault(AbsTagEditorActivity.this).getBitmapCache().clear();
|
//Glide.get(AbsTagEditorActivity.this).clearMemory();
|
||||||
Ion.getDefault(AbsTagEditorActivity.this).getCache().clear();
|
|
||||||
}
|
}
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,15 @@ import android.util.Log;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.request.RequestListener;
|
||||||
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.lastfm.album.LastFMAlbumImageUrlLoader;
|
import com.kabouzeid.gramophone.lastfm.album.LastFMAlbumImageUrlLoader;
|
||||||
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
|
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
|
||||||
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
|
import com.kabouzeid.gramophone.loader.SongFilePathLoader;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.koushikdutta.async.future.FutureCallback;
|
|
||||||
import com.koushikdutta.ion.Ion;
|
|
||||||
|
|
||||||
import org.jaudiotagger.tag.FieldKey;
|
import org.jaudiotagger.tag.FieldKey;
|
||||||
import org.jaudiotagger.tag.images.Artwork;
|
import org.jaudiotagger.tag.images.Artwork;
|
||||||
|
|
@ -94,17 +95,22 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
|
||||||
LastFMAlbumImageUrlLoader.loadAlbumImageUrl(this, albumTitleStr, albumArtistNameStr, new LastFMAlbumImageUrlLoader.AlbumImageUrlLoaderCallback() {
|
LastFMAlbumImageUrlLoader.loadAlbumImageUrl(this, albumTitleStr, albumArtistNameStr, new LastFMAlbumImageUrlLoader.AlbumImageUrlLoaderCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onAlbumImageUrlLoaded(String url) {
|
public void onAlbumImageUrlLoaded(String url) {
|
||||||
Ion.with(AlbumTagEditorActivity.this)
|
Glide.with(AlbumTagEditorActivity.this)
|
||||||
.load(url)
|
.load(url)
|
||||||
.withBitmap()
|
|
||||||
.resize(500, 500)
|
|
||||||
.centerCrop()
|
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.setCallback(new FutureCallback<Bitmap>() {
|
.centerCrop()
|
||||||
|
.listener(new RequestListener<String, Bitmap>() {
|
||||||
@Override
|
@Override
|
||||||
public void onCompleted(Exception e, Bitmap result) {
|
public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) {
|
||||||
if (result != null) {
|
Toast.makeText(AlbumTagEditorActivity.this,
|
||||||
albumArtBitmap = result;
|
R.string.failed_download_albumart, Toast.LENGTH_SHORT).show();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
||||||
|
if (resource != null) {
|
||||||
|
albumArtBitmap = resource;
|
||||||
setImageBitmap(albumArtBitmap);
|
setImageBitmap(albumArtBitmap);
|
||||||
deleteAlbumArt = false;
|
deleteAlbumArt = false;
|
||||||
dataChanged();
|
dataChanged();
|
||||||
|
|
@ -113,8 +119,10 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
|
||||||
Toast.makeText(AlbumTagEditorActivity.this,
|
Toast.makeText(AlbumTagEditorActivity.this,
|
||||||
R.string.failed_download_albumart, Toast.LENGTH_SHORT).show();
|
R.string.failed_download_albumart, Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
.into(500, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -183,24 +191,29 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void loadImageFromFile(final Uri selectedFileUri) {
|
protected void loadImageFromFile(final Uri selectedFileUri) {
|
||||||
Ion.with(this)
|
Glide.with(this)
|
||||||
.load(selectedFileUri.toString())
|
.load(selectedFileUri)
|
||||||
.withBitmap()
|
|
||||||
.resize(500, 500)
|
|
||||||
.centerCrop()
|
|
||||||
.asBitmap()
|
.asBitmap()
|
||||||
.setCallback(new FutureCallback<Bitmap>() {
|
.centerCrop()
|
||||||
|
.listener(new RequestListener<Uri, Bitmap>() {
|
||||||
@Override
|
@Override
|
||||||
public void onCompleted(Exception e, Bitmap result) {
|
public boolean onException(Exception e, Uri model, Target<Bitmap> target, boolean isFirstResource) {
|
||||||
if (result != null) {
|
return false;
|
||||||
albumArtBitmap = result;
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onResourceReady(Bitmap resource, Uri model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
||||||
|
if (resource != null) {
|
||||||
|
albumArtBitmap = resource;
|
||||||
setImageBitmap(albumArtBitmap);
|
setImageBitmap(albumArtBitmap);
|
||||||
deleteAlbumArt = false;
|
deleteAlbumArt = false;
|
||||||
dataChanged();
|
dataChanged();
|
||||||
setResult(RESULT_OK);
|
setResult(RESULT_OK);
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
});
|
})
|
||||||
|
.into(500, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -13,13 +13,14 @@ import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.kabouzeid.gramophone.App;
|
import com.kabouzeid.gramophone.App;
|
||||||
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.loader.SongLoader;
|
import com.kabouzeid.gramophone.loader.SongLoader;
|
||||||
|
import com.kabouzeid.gramophone.model.Artist;
|
||||||
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -36,14 +37,8 @@ public class MusicUtil {
|
||||||
return ContentUris.withAppendedId(sArtworkUri, album_id);
|
return ContentUris.withAppendedId(sArtworkUri, album_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasAlbumArt(final Context context, int album_id) {
|
public static String getArtistInfoString(Context context, Artist artist) {
|
||||||
try {
|
return artist.songCount + " " + context.getResources().getString(R.string.songs) + " | " + artist.albumCount + " " + context.getResources().getString(R.string.albums);
|
||||||
context.getContentResolver().openFileDescriptor(getAlbumArtUri(album_id), "r");
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getReadableDurationString(long songDurationMillis) {
|
public static String getReadableDurationString(long songDurationMillis) {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:color="?android:colorControlHighlight">
|
|
||||||
|
|
||||||
<item android:drawable="@drawable/rect_selector" />
|
|
||||||
|
|
||||||
</ripple>
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:color="#333333">
|
|
||||||
|
|
||||||
<item android:drawable="@drawable/rect_selector_dark" />
|
|
||||||
|
|
||||||
</ripple>
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<ripple
|
<ripple
|
||||||
android:color="?android:colorControlHighlight"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
android:color="?android:colorControlHighlight">
|
||||||
<item
|
<item
|
||||||
android:id="@android:id/mask"
|
android:id="@android:id/mask"
|
||||||
android:drawable="@drawable/round_ripple_selector_mask" />
|
android:drawable="@drawable/round_ripple_selector_mask" />
|
||||||
|
|
|
||||||
|
|
@ -19,12 +19,11 @@
|
||||||
android:layout_height="5dp"
|
android:layout_height="5dp"
|
||||||
android:background="@drawable/shadow_down" />
|
android:background="@drawable/shadow_down" />
|
||||||
|
|
||||||
<ListView
|
<android.support.v7.widget.RecyclerView
|
||||||
android:id="@+id/list"
|
android:id="@+id/recycler_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:divider="@null"
|
android:scrollbars="vertical" />
|
||||||
android:dividerHeight="0px" />
|
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,8 @@
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/album_art"
|
android:id="@+id/album_art"
|
||||||
android:layout_width="128dp"
|
android:layout_width="@dimen/notification_albumart_size"
|
||||||
android:layout_height="128dp"
|
android:layout_height="@dimen/notification_albumart_size"
|
||||||
android:scaleType="centerCrop" />
|
android:scaleType="centerCrop" />
|
||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
<style name="Theme.MaterialMusic" parent="Theme.MaterialMusic.Base">
|
<style name="Theme.MaterialMusic" parent="Theme.MaterialMusic.Base">
|
||||||
<item name="round_selector">@drawable/round_ripple_selector_dark</item>
|
<item name="round_selector">@drawable/round_ripple_selector_dark</item>
|
||||||
<item name="rect_selector">@drawable/rect_ripple_selector_dark</item>
|
<item name="rect_selector">?selectableItemBackground</item>
|
||||||
<item name="list_selector">@drawable/list_ripple_selector_dark</item>
|
<item name="list_selector">@drawable/list_ripple_selector_dark</item>
|
||||||
|
|
||||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
<style name="Theme.MaterialMusic.Light" parent="Theme.MaterialMusic.Base.Light">
|
<style name="Theme.MaterialMusic.Light" parent="Theme.MaterialMusic.Base.Light">
|
||||||
<item name="round_selector">@drawable/round_ripple_selector</item>
|
<item name="round_selector">@drawable/round_ripple_selector</item>
|
||||||
<item name="rect_selector">@drawable/rect_ripple_selector</item>
|
<item name="rect_selector">?selectableItemBackground</item>
|
||||||
<item name="list_selector">@drawable/list_ripple_selector</item>
|
<item name="list_selector">@drawable/list_ripple_selector</item>
|
||||||
|
|
||||||
<item name="android:statusBarColor">@android:color/transparent</item>
|
<item name="android:statusBarColor">@android:color/transparent</item>
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,6 @@
|
||||||
<color name="materialmusic_accent_color">@color/pink_500</color>
|
<color name="materialmusic_accent_color">@color/pink_500</color>
|
||||||
<color name="materialmusic_accent_color_darker">@color/pink_600</color>
|
<color name="materialmusic_accent_color_darker">@color/pink_600</color>
|
||||||
<color name="materialmusic_music_controller_container_color">@color/grey_300</color>
|
<color name="materialmusic_music_controller_container_color">@color/grey_300</color>
|
||||||
<!--<color name="materialmusic_navigation_drawer_background_color">@color/grey_300</color>-->
|
|
||||||
<color name="materialmusic_navigation_drawer_background_color">#fff</color>
|
<color name="materialmusic_navigation_drawer_background_color">#fff</color>
|
||||||
<color name="materialmusic_separator_color">#0C000000</color>
|
<color name="materialmusic_separator_color">#0C000000</color>
|
||||||
<color name="materialmusic_default_bar_color">@color/grey_300</color>
|
<color name="materialmusic_default_bar_color">@color/grey_300</color>
|
||||||
|
|
|
||||||
|
|
@ -47,4 +47,5 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
|
||||||
<dimen name="seek_bar_margin_left_right">-17dp</dimen>
|
<dimen name="seek_bar_margin_left_right">-17dp</dimen>
|
||||||
<dimen name="list_padding_vertical">2dp</dimen>
|
<dimen name="list_padding_vertical">2dp</dimen>
|
||||||
|
|
||||||
|
<dimen name="notification_albumart_size">128dp</dimen>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue