Added base classes for glide to work with Phonograph.
This commit is contained in:
parent
176fce9ab5
commit
f35fc7cb27
11 changed files with 245 additions and 45 deletions
|
|
@ -132,4 +132,5 @@ dependencies {
|
||||||
compile 'com.anjlab.android.iab.v3:library:1.0.+'
|
compile 'com.anjlab.android.iab.v3:library:1.0.+'
|
||||||
compile 'de.psdev.licensesdialog:licensesdialog:1.8.0'
|
compile 'de.psdev.licensesdialog:licensesdialog:1.8.0'
|
||||||
compile 'com.github.kabouzeid:AppIntro:3.3.0k'
|
compile 'com.github.kabouzeid:AppIntro:3.3.0k'
|
||||||
|
compile 'com.github.bumptech.glide:glide:3.6.1'
|
||||||
}
|
}
|
||||||
|
|
|
||||||
6
app/proguard-rules.pro
vendored
6
app/proguard-rules.pro
vendored
|
|
@ -22,9 +22,9 @@
|
||||||
-keepattributes Signature
|
-keepattributes Signature
|
||||||
-keepattributes Exceptions
|
-keepattributes Exceptions
|
||||||
|
|
||||||
# LeakCanary
|
# Glide
|
||||||
-keep class org.eclipse.mat.** { *; }
|
-keepnames class com.kabouzeid.gramophone.glide.PhonographGlideModule
|
||||||
-keep class com.squareup.leakcanary.** { *; }
|
-keep public class * implements com.bumptech.glide.module.GlideModule
|
||||||
|
|
||||||
# ButterKnife
|
# ButterKnife
|
||||||
-keep class butterknife.** { *; }
|
-keep class butterknife.** { *; }
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.kabouzeid.gramophone"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
package="com.kabouzeid.gramophone">
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
|
|
@ -110,6 +109,10 @@
|
||||||
android:name="com.crashlytics.ApiKey"
|
android:name="com.crashlytics.ApiKey"
|
||||||
android:value="b23725bd3d266aa65c5a3dd1816b2f801524a189" />
|
android:value="b23725bd3d266aa65c5a3dd1816b2f801524a189" />
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.kabouzeid.gramophone.glide.PhonographGlideModule"
|
||||||
|
android:value="GlideModule" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.activities.tageditor.SongTagEditorActivity"
|
android:name=".ui.activities.tageditor.SongTagEditorActivity"
|
||||||
android:windowSoftInputMode="adjustResize" />
|
android:windowSoftInputMode="adjustResize" />
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
package com.kabouzeid.gramophone.adapter;
|
package com.kabouzeid.gramophone.adapter;
|
||||||
|
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v4.app.FragmentManager;
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
|
@ -11,17 +9,15 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.glide.BitmapPaletteTranscoder;
|
||||||
|
import com.kabouzeid.gramophone.glide.BitmapPaletteWrapper;
|
||||||
|
import com.kabouzeid.gramophone.glide.PhonographPaletteTarget;
|
||||||
import com.kabouzeid.gramophone.misc.CustomFragmentStatePagerAdapter;
|
import com.kabouzeid.gramophone.misc.CustomFragmentStatePagerAdapter;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
|
||||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
|
||||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
|
||||||
import com.nostra13.universalimageloader.core.assist.FailReason;
|
|
||||||
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
|
|
||||||
import com.nostra13.universalimageloader.core.process.BitmapProcessor;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
|
@ -131,39 +127,51 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadAlbumCover() {
|
private void loadAlbumCover() {
|
||||||
ImageLoader.getInstance().displayImage(
|
Glide.with(this)
|
||||||
MusicUtil.getSongImageLoaderString(song),
|
.loadFromMediaStore(MusicUtil.getAlbumArtUri(song.albumId))
|
||||||
albumCover,
|
.asBitmap()
|
||||||
new DisplayImageOptions.Builder()
|
.transcode(new BitmapPaletteTranscoder(getActivity()), BitmapPaletteWrapper.class)
|
||||||
.cacheInMemory(true)
|
.error(R.drawable.default_album_art)
|
||||||
.showImageOnFail(R.drawable.default_album_art)
|
.into(new PhonographPaletteTarget(albumCover) {
|
||||||
.postProcessor(new BitmapProcessor() {
|
|
||||||
@Override
|
|
||||||
public Bitmap process(Bitmap bitmap) {
|
|
||||||
// don't use set color here, as this is not running on the ui-thread
|
|
||||||
color = ColorUtil.generateColor(getActivity(), bitmap);
|
|
||||||
return bitmap;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.build(),
|
|
||||||
new SimpleImageLoadingListener() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
|
public void onColorReady(int color) {
|
||||||
if (getActivity() != null) {
|
|
||||||
setColor(ColorUtil.resolveColor(getActivity(), R.attr.default_bar_color));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onLoadingComplete(String imageUri, View view, @Nullable Bitmap loadedImage) {
|
|
||||||
if (loadedImage == null) {
|
|
||||||
onLoadingFailed(imageUri, view, null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setColor(color);
|
setColor(color);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
);
|
|
||||||
|
// ImageLoader.getInstance().displayImage(
|
||||||
|
// MusicUtil.getSongImageLoaderString(song),
|
||||||
|
// albumCover,
|
||||||
|
// new DisplayImageOptions.Builder()
|
||||||
|
// .cacheInMemory(true)
|
||||||
|
// .showImageOnFail(R.drawable.default_album_art)
|
||||||
|
// .postProcessor(new BitmapProcessor() {
|
||||||
|
// @Override
|
||||||
|
// public Bitmap process(Bitmap bitmap) {
|
||||||
|
// // don't use set color here, as this is not running on the ui-thread
|
||||||
|
// color = ColorUtil.generateColor(getActivity(), bitmap);
|
||||||
|
// return bitmap;
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// .build(),
|
||||||
|
// new SimpleImageLoadingListener() {
|
||||||
|
// @Override
|
||||||
|
// public void onLoadingFailed(String imageUri, View view, @Nullable FailReason failReason) {
|
||||||
|
// if (getActivity() != null) {
|
||||||
|
// setColor(ColorUtil.resolveColor(getActivity(), R.attr.default_bar_color));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public void onLoadingComplete(String imageUri, View view, @Nullable Bitmap loadedImage) {
|
||||||
|
// if (loadedImage == null) {
|
||||||
|
// onLoadingFailed(imageUri, view, null);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// setColor(color);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.kabouzeid.gramophone.glide;
|
||||||
|
|
||||||
|
import com.bumptech.glide.load.engine.Resource;
|
||||||
|
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
|
||||||
|
import com.bumptech.glide.util.Util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
|
*/
|
||||||
|
public class BitmapPaletteResource implements Resource<BitmapPaletteWrapper> {
|
||||||
|
|
||||||
|
private final BitmapPaletteWrapper bitmapPaletteWrapper;
|
||||||
|
private final BitmapPool bitmapPool;
|
||||||
|
|
||||||
|
public BitmapPaletteResource(BitmapPaletteWrapper bitmapPaletteWrapper, BitmapPool bitmapPool) {
|
||||||
|
this.bitmapPaletteWrapper = bitmapPaletteWrapper;
|
||||||
|
this.bitmapPool = bitmapPool;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BitmapPaletteWrapper get() {
|
||||||
|
return bitmapPaletteWrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSize() {
|
||||||
|
return Util.getBitmapByteSize(bitmapPaletteWrapper.getBitmap());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void recycle() {
|
||||||
|
if (!bitmapPool.put(bitmapPaletteWrapper.getBitmap())) {
|
||||||
|
bitmapPaletteWrapper.getBitmap().recycle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.kabouzeid.gramophone.glide;
|
||||||
|
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.request.target.ImageViewTarget;
|
||||||
|
|
||||||
|
public class BitmapPaletteTarget extends ImageViewTarget<BitmapPaletteWrapper> {
|
||||||
|
public BitmapPaletteTarget(ImageView view) {
|
||||||
|
super(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setResource(BitmapPaletteWrapper bitmapPaletteWrapper) {
|
||||||
|
view.setImageBitmap(bitmapPaletteWrapper.getBitmap());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.kabouzeid.gramophone.glide;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.load.engine.Resource;
|
||||||
|
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
|
||||||
|
import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
|
||||||
|
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||||
|
|
||||||
|
public class BitmapPaletteTranscoder implements ResourceTranscoder<Bitmap, BitmapPaletteWrapper> {
|
||||||
|
private final BitmapPool bitmapPool;
|
||||||
|
|
||||||
|
public BitmapPaletteTranscoder(Context context) {
|
||||||
|
this(Glide.get(context).getBitmapPool());
|
||||||
|
}
|
||||||
|
|
||||||
|
public BitmapPaletteTranscoder(BitmapPool bitmapPool) {
|
||||||
|
this.bitmapPool = bitmapPool;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Resource<BitmapPaletteWrapper> transcode(Resource<Bitmap> bitmapResource) {
|
||||||
|
Bitmap bitmap = bitmapResource.get();
|
||||||
|
BitmapPaletteWrapper bitmapPaletteWrapper = new BitmapPaletteWrapper(bitmap, ColorUtil.generatePalette(bitmap));
|
||||||
|
return new BitmapPaletteResource(bitmapPaletteWrapper, bitmapPool);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getId() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.kabouzeid.gramophone.glide;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.support.v7.graphics.Palette;
|
||||||
|
|
||||||
|
public class BitmapPaletteWrapper {
|
||||||
|
private final Bitmap mBitmap;
|
||||||
|
private final Palette mPalette;
|
||||||
|
|
||||||
|
public BitmapPaletteWrapper(Bitmap bitmap, Palette palette) {
|
||||||
|
mBitmap = bitmap;
|
||||||
|
mPalette = palette;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap getBitmap() {
|
||||||
|
return mBitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Palette getPalette() {
|
||||||
|
return mPalette;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.kabouzeid.gramophone.glide;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
|
import com.bumptech.glide.GlideBuilder;
|
||||||
|
import com.bumptech.glide.module.GlideModule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Karim Abou Zeid (kabouzeid)
|
||||||
|
*/
|
||||||
|
public class PhonographGlideModule implements GlideModule {
|
||||||
|
@Override
|
||||||
|
public void applyOptions(Context context, GlideBuilder builder) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerComponents(Context context, Glide glide) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
package com.kabouzeid.gramophone.glide;
|
||||||
|
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import com.bumptech.glide.request.animation.GlideAnimation;
|
||||||
|
import com.kabouzeid.gramophone.R;
|
||||||
|
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||||
|
|
||||||
|
import hugo.weaving.DebugLog;
|
||||||
|
|
||||||
|
public abstract class PhonographPaletteTarget extends BitmapPaletteTarget {
|
||||||
|
public PhonographPaletteTarget(ImageView view) {
|
||||||
|
super(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DebugLog
|
||||||
|
@Override
|
||||||
|
public void onLoadFailed(Exception e, Drawable errorDrawable) {
|
||||||
|
super.onLoadFailed(e, errorDrawable);
|
||||||
|
onColorReady(getDefaultBarColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
@DebugLog
|
||||||
|
@Override
|
||||||
|
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
|
||||||
|
super.onResourceReady(resource, glideAnimation);
|
||||||
|
onColorReady(ColorUtil.getColor(resource.getPalette(), getDefaultBarColor()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getDefaultBarColor() {
|
||||||
|
return ColorUtil.resolveColor(getView().getContext(), R.attr.default_bar_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void onColorReady(int color);
|
||||||
|
}
|
||||||
|
|
@ -20,6 +20,7 @@ import com.kabouzeid.gramophone.R;
|
||||||
public class ColorUtil {
|
public class ColorUtil {
|
||||||
public static final int PALETTE_BITMAP_SIZE = 100;
|
public static final int PALETTE_BITMAP_SIZE = 100;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@ColorInt
|
@ColorInt
|
||||||
public static int generateColor(Context context, Bitmap bitmap) {
|
public static int generateColor(Context context, Bitmap bitmap) {
|
||||||
return getColor(context, generatePalette(bitmap));
|
return getColor(context, generatePalette(bitmap));
|
||||||
|
|
@ -31,6 +32,7 @@ public class ColorUtil {
|
||||||
.generate();
|
.generate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
@ColorInt
|
@ColorInt
|
||||||
public static int getColor(Context context, @Nullable Palette palette) {
|
public static int getColor(Context context, @Nullable Palette palette) {
|
||||||
if (palette != null) {
|
if (palette != null) {
|
||||||
|
|
@ -51,6 +53,26 @@ public class ColorUtil {
|
||||||
return ColorUtil.resolveColor(context, R.attr.default_bar_color);
|
return ColorUtil.resolveColor(context, R.attr.default_bar_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ColorInt
|
||||||
|
public static int getColor(@Nullable Palette palette, int fallback) {
|
||||||
|
if (palette != null) {
|
||||||
|
if (palette.getVibrantSwatch() != null) {
|
||||||
|
return palette.getVibrantSwatch().getRgb();
|
||||||
|
} else if (palette.getMutedSwatch() != null) {
|
||||||
|
return palette.getMutedSwatch().getRgb();
|
||||||
|
} else if (palette.getDarkVibrantSwatch() != null) {
|
||||||
|
return palette.getDarkVibrantSwatch().getRgb();
|
||||||
|
} else if (palette.getDarkMutedSwatch() != null) {
|
||||||
|
return palette.getDarkMutedSwatch().getRgb();
|
||||||
|
} else if (palette.getLightVibrantSwatch() != null) {
|
||||||
|
return palette.getLightVibrantSwatch().getRgb();
|
||||||
|
} else if (palette.getLightMutedSwatch() != null) {
|
||||||
|
return palette.getLightMutedSwatch().getRgb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
@ColorInt
|
@ColorInt
|
||||||
public static int resolveColor(@NonNull Context context, @AttrRes int colorAttr) {
|
public static int resolveColor(@NonNull Context context, @AttrRes int colorAttr) {
|
||||||
TypedArray a = context.obtainStyledAttributes(new int[]{colorAttr});
|
TypedArray a = context.obtainStyledAttributes(new int[]{colorAttr});
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue