From 9b2aaea2c9b097d17b5391efc289a5191145d3f5 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Tue, 22 Sep 2015 16:44:37 +0200 Subject: [PATCH] Fixed kabouzeid/phonograph-issue-tracker#4, when setting an album cover in the tag editor, the image will be cropped instead of stretched now. --- .../tageditor/AbsTagEditorActivity.java | 6 +- .../tageditor/AlbumTagEditorActivity.java | 86 +++++++++++++------ .../kabouzeid/gramophone/util/ImageUtil.java | 18 ---- 3 files changed, 62 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java index 6dd82839..84cd4247 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java @@ -169,9 +169,9 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { } private void startImagePicker() { - Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); - photoPickerIntent.setType("image/*"); - startActivityForResult(photoPickerIntent, REQUEST_CODE_SELECT_IMAGE); + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.setType("image/*"); + startActivityForResult(Intent.createChooser(intent, getString(R.string.pick_from_local_storage)), REQUEST_CODE_SELECT_IMAGE); } protected abstract void loadCurrentImage(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java index 53b4d0db..f0b2b67b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AlbumTagEditorActivity.java @@ -16,7 +16,6 @@ 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.ImageUtil; import com.kabouzeid.gramophone.util.LastFMUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.Util; @@ -102,25 +101,14 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text } lastFMRestClient.getApiService().getAlbumInfo(albumTitleStr, albumArtistNameStr).enqueue(new Callback() { @Override - public void onResponse(Response response) { + public void onResponse(final Response response) { LastFmAlbum lastFmAlbum = response.body(); if (lastFmAlbum.getAlbum() != null) { - final int smallerScreenSize = Util.getSmallerScreenSize(AlbumTagEditorActivity.this); ImageLoader.getInstance().loadImage(LastFMUtil.getLargestAlbumImageUrl(lastFmAlbum.getAlbum().getImage()), new DisplayImageOptions.Builder() - .preProcessor(new BitmapProcessor() { - @Override - public Bitmap process(Bitmap bitmap) { - return ImageUtil.getResizedBitmap(bitmap, smallerScreenSize, smallerScreenSize, true); - } - }) + .preProcessor(albumCoverProcessor) .build(), new SimpleImageLoadingListener() { - @Override - public void onLoadingFailed(String imageUri, View view, FailReason failReason) { - toastLoadingFailed(); - } - @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { if (loadedImage == null) { @@ -133,6 +121,11 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text dataChanged(); setResult(RESULT_OK); } + + @Override + public void onLoadingFailed(String imageUri, View view, FailReason failReason) { + handleFailReason(failReason); + } }); } else { toastLoadingFailed(); @@ -206,23 +199,11 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text @Override protected void loadImageFromFile(@NonNull final Uri selectedFileUri) { - final int smallerScreenSize = Util.getSmallerScreenSize(AlbumTagEditorActivity.this); ImageLoader.getInstance().loadImage(selectedFileUri.toString(), new DisplayImageOptions.Builder() - .preProcessor(new BitmapProcessor() { - @Override - public Bitmap process(Bitmap bitmap) { - return ImageUtil.getResizedBitmap(bitmap, smallerScreenSize, smallerScreenSize, true); - } - }) + .preProcessor(albumCoverProcessor) .build(), new SimpleImageLoadingListener() { - @Override - public void onLoadingFailed(String imageUri, View view, FailReason failReason) { - Toast.makeText(AlbumTagEditorActivity.this, - R.string.could_not_download_album_cover, Toast.LENGTH_SHORT).show(); - } - @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { albumArtBitmap = loadedImage; @@ -231,6 +212,11 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text dataChanged(); setResult(RESULT_OK); } + + @Override + public void onLoadingFailed(String imageUri, View view, FailReason failReason) { + handleFailReason(failReason); + } }); } @@ -248,4 +234,50 @@ public class AlbumTagEditorActivity extends AbsTagEditorActivity implements Text public void afterTextChanged(Editable s) { 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(); + + final int dstWidth; + final int dstHeight; + + if (width < height) { + if (maxForSmallerSize >= width) { + return src; + } + float ratio = (float) height / width; + dstWidth = maxForSmallerSize; + dstHeight = Math.round(maxForSmallerSize * ratio); + } else { + if (maxForSmallerSize >= height) { + return src; + } + float ratio = (float) width / height; + dstWidth = Math.round(maxForSmallerSize * ratio); + dstHeight = maxForSmallerSize; + } + + Bitmap scaledBitmap = Bitmap.createScaledBitmap(src, dstWidth, dstHeight, false); + if (scaledBitmap != src) { + src.recycle(); + } + return scaledBitmap; + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ImageUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ImageUtil.java index 26ef284f..19406bf2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ImageUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ImageUtil.java @@ -1,28 +1,10 @@ package com.kabouzeid.gramophone.util; -import android.graphics.Bitmap; -import android.graphics.Matrix; -import android.support.annotation.NonNull; - /** * @author Karim Abou Zeid (kabouzeid) */ public class ImageUtil { - public static Bitmap getResizedBitmap(@NonNull Bitmap bm, int newHeight, int newWidth, boolean recycleOld) { - int width = bm.getWidth(); - int height = bm.getHeight(); - float scaleWidth = ((float) newWidth) / width; - float scaleHeight = ((float) newHeight) / height; - Matrix matrix = new Matrix(); - matrix.postScale(scaleWidth, scaleHeight); - Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); - if (recycleOld && resizedBitmap != bm) { - bm.recycle(); - } - return resizedBitmap; - } - public static int calculateInSampleSize(int width, int height, int reqWidth) { // setting reqWidth matching to desired 1:1 ratio and screen-size if (width < height) {