Further progress with glide

This commit is contained in:
Karim Abou Zeid 2016-01-02 16:28:13 +01:00
commit d776926510
16 changed files with 160 additions and 542 deletions

View file

@ -19,6 +19,7 @@ import android.view.MenuItem;
import android.view.View;
import com.afollestad.materialdialogs.color.ColorChooserDialog;
import com.bumptech.glide.Glide;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.prefs.ColorChooserPreference;
import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity;
@ -26,7 +27,6 @@ import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.nostra13.universalimageloader.core.ImageLoader;
import butterknife.Bind;
import butterknife.ButterKnife;
@ -198,7 +198,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
ignoreMediaStoreArtwork.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
ImageLoader.getInstance().clearMemoryCache();
Glide.get(getActivity()).clearMemory();
return true;
}
});

View file

@ -14,7 +14,6 @@ import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
@ -25,7 +24,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.util.DialogUtils;
import com.bumptech.glide.Glide;
import com.github.ksoichiro.android.observablescrollview.ObservableScrollView;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.misc.SimpleObservableScrollViewCallbacks;
@ -120,7 +119,6 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
}
private void setUpViews() {
resetColors();
setUpScrollView();
setUpFab();
setUpImageView();
@ -200,19 +198,6 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
protected abstract void save();
private void resetColors() {
paletteColorPrimary = getThemeColorPrimary();
observableScrollViewCallbacks.onScrollChanged(observableScrollView.getCurrentScrollY(), false, false);
setStatusBarColor(paletteColorPrimary);
if (shouldColorNavigationBar())
setNavigationBarColor(paletteColorPrimary);
header.setBackgroundColor(paletteColorPrimary);
boolean darkContent = ColorUtil.useDarkTextColorOnBackground(paletteColorPrimary);
ViewUtil.setToolbarContentDark(this, toolbar, darkContent);
setUseDarkStatusBarIcons(darkContent);
notifyTaskColorChange(paletteColorPrimary);
}
private void getIntentExtras() {
Bundle intentExtras = getIntent().getExtras();
if (intentExtras != null) {
@ -288,43 +273,22 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
fab.setEnabled(true);
}
protected void setImageRes(int resId) {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resId);
setImageBitmap(bitmap);
protected void setImageBitmap(@Nullable final Bitmap bitmap, int bgColor) {
image.setImageBitmap(bitmap);
setColors(bgColor);
}
protected void setImageBitmap(@Nullable final Bitmap bitmap) {
if (bitmap != null) {
image.setImageBitmap(bitmap);
applyPalette(bitmap);
} else {
resetColors();
}
}
private void applyPalette(@NonNull final Bitmap bitmap) {
Palette.from(bitmap)
.resizeBitmapSize(100)
.generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(@NonNull Palette palette) {
final Palette.Swatch vibrantSwatch = palette.getVibrantSwatch();
if (vibrantSwatch != null) {
paletteColorPrimary = palette.getVibrantColor(DialogUtils.resolveColor(AbsTagEditorActivity.this, R.attr.default_bar_color));
observableScrollViewCallbacks.onScrollChanged(observableScrollView.getCurrentScrollY(), false, false);
if (shouldColorNavigationBar())
setNavigationBarColor(paletteColorPrimary);
setStatusBarColor(paletteColorPrimary);
header.setBackgroundColor(paletteColorPrimary);
boolean darkContent = ColorUtil.useDarkTextColorOnBackground(paletteColorPrimary);
ViewUtil.setToolbarContentDark(AbsTagEditorActivity.this, toolbar, darkContent);
setUseDarkStatusBarIcons(darkContent);
notifyTaskColorChange(paletteColorPrimary);
} else {
resetColors();
}
}
});
private void setColors(int color) {
paletteColorPrimary = color;
observableScrollViewCallbacks.onScrollChanged(observableScrollView.getCurrentScrollY(), false, false);
if (shouldColorNavigationBar())
setNavigationBarColor(paletteColorPrimary);
setStatusBarColor(paletteColorPrimary);
header.setBackgroundColor(paletteColorPrimary);
boolean darkContent = ColorUtil.useDarkTextColorOnBackground(paletteColorPrimary);
ViewUtil.setToolbarContentDark(AbsTagEditorActivity.this, toolbar, darkContent);
setUseDarkStatusBarIcons(darkContent);
notifyTaskColorChange(paletteColorPrimary);
}
@Override
@ -390,6 +354,9 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
});
if (deleteArtwork) {
MusicUtil.deleteAlbumArt(AbsTagEditorActivity.this, getId());
Glide.get(AbsTagEditorActivity.this).clearMemory();
} else if (artwork != null) {
Glide.get(AbsTagEditorActivity.this).clearMemory();
}
rescanMediaAndQuitOnFinish();
}

View file

@ -1,29 +1,33 @@
package com.kabouzeid.gramophone.ui.activities.tageditor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder;
import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper;
import com.kabouzeid.gramophone.lastfm.rest.LastFMRestClient;
import com.kabouzeid.gramophone.lastfm.rest.model.LastFmAlbum;
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.ColorUtil;
import com.kabouzeid.gramophone.util.LastFMUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.Util;
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 org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.images.Artwork;
@ -88,7 +92,8 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@Override
protected void loadCurrentImage() {
setImageBitmap(getAlbumArt());
Bitmap bitmap = getAlbumArt();
setImageBitmap(bitmap, ColorUtil.getColor(ColorUtil.generatePalette(bitmap), ColorUtil.resolveColor(this, R.attr.default_bar_color)));
deleteAlbumArt = false;
}
@ -105,32 +110,36 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
public void onResponse(final Response<LastFmAlbum> response, Retrofit retrofit) {
LastFmAlbum lastFmAlbum = response.body();
if (lastFmAlbum.getAlbum() != null) {
ImageLoader.getInstance().loadImage(LastFMUtil.getLargestAlbumImageUrl(lastFmAlbum.getAlbum().getImage()),
new DisplayImageOptions.Builder()
.preProcessor(albumCoverProcessor)
.build(),
new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
if (loadedImage == null) {
onLoadingFailed(imageUri, view, null);
return;
String url = LastFMUtil.getLargestAlbumImageUrl(lastFmAlbum.getAlbum().getImage());
if (!TextUtils.isEmpty(url) && url.trim().length() > 0) {
Glide.with(AlbumTagEditorActivity.this)
.load(url)
.asBitmap()
.transcode(new BitmapPaletteTranscoder(AlbumTagEditorActivity.this), BitmapPaletteWrapper.class)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.error(R.drawable.default_album_art)
.into(new SimpleTarget<BitmapPaletteWrapper>() {
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
super.onLoadFailed(e, errorDrawable);
e.printStackTrace();
Toast.makeText(AlbumTagEditorActivity.this, e.toString(), Toast.LENGTH_LONG).show();
}
albumArtBitmap = loadedImage;
setImageBitmap(albumArtBitmap);
deleteAlbumArt = false;
dataChanged();
setResult(RESULT_OK);
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
handleFailReason(failReason);
}
});
} else {
toastLoadingFailed();
@Override
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
ColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT);
albumArtBitmap = resource.getBitmap();
setImageBitmap(albumArtBitmap, ColorUtil.getColor(resource.getPalette(), ColorUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color)));
deleteAlbumArt = false;
dataChanged();
setResult(RESULT_OK);
}
});
return;
}
}
toastLoadingFailed();
}
@Override
@ -152,7 +161,7 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@Override
protected void deleteImage() {
setImageRes(R.drawable.default_album_art);
setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.default_album_art), ColorUtil.resolveColor(this, R.attr.default_bar_color));
deleteAlbumArt = true;
dataChanged();
}
@ -200,23 +209,28 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
@Override
protected void loadImageFromFile(@NonNull final Uri selectedFileUri) {
ImageLoader.getInstance().loadImage(selectedFileUri.toString(),
new DisplayImageOptions.Builder()
.preProcessor(albumCoverProcessor)
.build(),
new SimpleImageLoadingListener() {
Glide.with(AlbumTagEditorActivity.this)
.load(selectedFileUri)
.asBitmap()
.transcode(new BitmapPaletteTranscoder(AlbumTagEditorActivity.this), BitmapPaletteWrapper.class)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.into(new SimpleTarget<BitmapPaletteWrapper>() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
albumArtBitmap = loadedImage;
setImageBitmap(albumArtBitmap);
deleteAlbumArt = false;
dataChanged();
setResult(RESULT_OK);
public void onLoadFailed(Exception e, Drawable errorDrawable) {
super.onLoadFailed(e, errorDrawable);
e.printStackTrace();
Toast.makeText(AlbumTagEditorActivity.this, e.toString(), Toast.LENGTH_LONG).show();
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
handleFailReason(failReason);
public void onResourceReady(BitmapPaletteWrapper resource, GlideAnimation<? super BitmapPaletteWrapper> glideAnimation) {
ColorUtil.getColor(resource.getPalette(), Color.TRANSPARENT);
albumArtBitmap = resource.getBitmap();
setImageBitmap(albumArtBitmap, ColorUtil.getColor(resource.getPalette(), ColorUtil.resolveColor(AlbumTagEditorActivity.this, R.attr.default_bar_color)));
deleteAlbumArt = false;
dataChanged();
setResult(RESULT_OK);
}
});
}
@ -236,22 +250,6 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text
dataChanged();
}
private BitmapProcessor albumCoverProcessor = new BitmapProcessor() {
@Override
public Bitmap process(Bitmap bitmap) {
return getResizedAlbumCover(bitmap, Util.getSmallerScreenSize(AlbumTagEditorActivity.this));
}
};
@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
private void handleFailReason(FailReason failReason) {
Throwable cause = failReason.getCause();
if (cause != null) {
cause.printStackTrace();
Toast.makeText(AlbumTagEditorActivity.this, cause.toString(), Toast.LENGTH_LONG).show();
}
}
private static Bitmap getResizedAlbumCover(@NonNull Bitmap src, int maxForSmallerSize) {
int width = src.getWidth();
int height = src.getHeight();