removed unused resource
This commit is contained in:
parent
38e2dfdfb9
commit
59c5bbddcc
3 changed files with 3 additions and 340 deletions
|
@ -32,6 +32,7 @@ import java.util.Objects;
|
||||||
import code.name.monkey.appthemehelper.ThemeStore;
|
import code.name.monkey.appthemehelper.ThemeStore;
|
||||||
import code.name.monkey.appthemehelper.common.ATHToolbarActivity;
|
import code.name.monkey.appthemehelper.common.ATHToolbarActivity;
|
||||||
import code.name.monkey.appthemehelper.util.ATHUtil;
|
import code.name.monkey.appthemehelper.util.ATHUtil;
|
||||||
|
import code.name.monkey.appthemehelper.util.DrawableUtil;
|
||||||
import code.name.monkey.appthemehelper.util.TintHelper;
|
import code.name.monkey.appthemehelper.util.TintHelper;
|
||||||
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
|
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper;
|
||||||
import code.name.monkey.retromusic.R;
|
import code.name.monkey.retromusic.R;
|
||||||
|
@ -42,6 +43,7 @@ import code.name.monkey.retromusic.helper.SortOrder;
|
||||||
import code.name.monkey.retromusic.interfaces.CabHolder;
|
import code.name.monkey.retromusic.interfaces.CabHolder;
|
||||||
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks;
|
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks;
|
||||||
import code.name.monkey.retromusic.util.Compressor;
|
import code.name.monkey.retromusic.util.Compressor;
|
||||||
|
import code.name.monkey.retromusic.util.ImageUtil;
|
||||||
import code.name.monkey.retromusic.util.PreferenceUtil;
|
import code.name.monkey.retromusic.util.PreferenceUtil;
|
||||||
import code.name.monkey.retromusic.util.RetroColorUtil;
|
import code.name.monkey.retromusic.util.RetroColorUtil;
|
||||||
import code.name.monkey.retromusic.util.RetroUtil;
|
import code.name.monkey.retromusic.util.RetroUtil;
|
||||||
|
@ -167,7 +169,7 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
|
||||||
TintHelper.setTintAuto(contentContainer, primaryColor, true);
|
TintHelper.setTintAuto(contentContainer, primaryColor, true);
|
||||||
|
|
||||||
toolbar.setBackgroundColor(primaryColor);
|
toolbar.setBackgroundColor(primaryColor);
|
||||||
|
toolbar.setLogo( R.drawable.ic_person_flat);
|
||||||
toolbar.setNavigationIcon(null);
|
toolbar.setNavigationIcon(null);
|
||||||
appBarLayout.setBackgroundColor(primaryColor);
|
appBarLayout.setBackgroundColor(primaryColor);
|
||||||
appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) ->
|
appBarLayout.addOnOffsetChangedListener((appBarLayout, verticalOffset) ->
|
||||||
|
|
|
@ -1,202 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 Hemanth Savarala.
|
|
||||||
*
|
|
||||||
* Licensed under the GNU General Public License v3
|
|
||||||
*
|
|
||||||
* This is free software: you can redistribute it and/or modify it under
|
|
||||||
* the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package code.name.monkey.retromusic.util;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.ContentUris;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.ResolveInfo;
|
|
||||||
import android.content.res.AssetFileDescriptor;
|
|
||||||
import android.database.Cursor;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.BitmapFactory;
|
|
||||||
import android.graphics.Matrix;
|
|
||||||
import android.media.ExifInterface;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.provider.DocumentsContract;
|
|
||||||
import android.provider.MediaStore;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import code.name.monkey.retromusic.App;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author: Mario Velasco Casquero
|
|
||||||
* Date: 08/09/2015
|
|
||||||
* Email: m3ario@gmail.com
|
|
||||||
*/
|
|
||||||
public class ImagePicker {
|
|
||||||
private static final int DEFAULT_MIN_WIDTH_QUALITY = 400; // min pixels
|
|
||||||
private static final String TAG = "ImagePicker";
|
|
||||||
private static final String TEMP_IMAGE_NAME = "tempImage";
|
|
||||||
public static int minWidthQuality = DEFAULT_MIN_WIDTH_QUALITY;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static List<Intent> addIntentsToList(Context context, List<Intent> list, Intent intent) {
|
|
||||||
List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(intent, 0);
|
|
||||||
for (ResolveInfo resolveInfo : resInfo) {
|
|
||||||
String packageName = resolveInfo.activityInfo.packageName;
|
|
||||||
Intent targetedIntent = new Intent(intent);
|
|
||||||
targetedIntent.setPackage(packageName);
|
|
||||||
list.add(targetedIntent);
|
|
||||||
Log.d(TAG, "Intent: " + intent.getAction() + " package: " + packageName);
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static Bitmap getImageFromResult(Context context, int resultCode,
|
|
||||||
Intent imageReturnedIntent) {
|
|
||||||
Log.d(TAG, "getImageFromResult, resultCode: " + resultCode);
|
|
||||||
Bitmap bm = null;
|
|
||||||
File imageFile = getTempFile(context);
|
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
|
||||||
Uri selectedImage;
|
|
||||||
boolean isCamera = (imageReturnedIntent == null ||
|
|
||||||
imageReturnedIntent.getData() == null ||
|
|
||||||
imageReturnedIntent.getData().toString().contains(imageFile.toString()));
|
|
||||||
if (isCamera) { /** CAMERA **/
|
|
||||||
selectedImage = Uri.fromFile(imageFile);
|
|
||||||
} else { /** ALBUM **/
|
|
||||||
selectedImage = imageReturnedIntent.getData();
|
|
||||||
}
|
|
||||||
Log.d(TAG, "selectedImage: " + selectedImage);
|
|
||||||
|
|
||||||
bm = getImageResized(context, selectedImage);
|
|
||||||
int rotation = getRotation(context, selectedImage, isCamera);
|
|
||||||
bm = rotate(bm, rotation);
|
|
||||||
}
|
|
||||||
return bm;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static File getTempFile(Context context) {
|
|
||||||
File imageFile = new File(context.getExternalCacheDir(), TEMP_IMAGE_NAME);
|
|
||||||
imageFile.getParentFile().mkdirs();
|
|
||||||
return imageFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Bitmap decodeBitmap(Context context, Uri theUri, int sampleSize) {
|
|
||||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
|
||||||
options.inSampleSize = sampleSize;
|
|
||||||
|
|
||||||
AssetFileDescriptor fileDescriptor = null;
|
|
||||||
try {
|
|
||||||
fileDescriptor = context.getContentResolver().openAssetFileDescriptor(theUri, "r");
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
Bitmap actuallyUsableBitmap = BitmapFactory.decodeFileDescriptor(
|
|
||||||
fileDescriptor.getFileDescriptor(), null, options);
|
|
||||||
|
|
||||||
Log.d(TAG, options.inSampleSize + " sample method bitmap ... " +
|
|
||||||
actuallyUsableBitmap.getWidth() + " " + actuallyUsableBitmap.getHeight());
|
|
||||||
|
|
||||||
return actuallyUsableBitmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resize to avoid using too much memory loading big images (e.g.: 2560*1920)
|
|
||||||
**/
|
|
||||||
private static Bitmap getImageResized(Context context, Uri selectedImage) {
|
|
||||||
Bitmap bm = null;
|
|
||||||
int[] sampleSizes = new int[]{5, 3, 2, 1};
|
|
||||||
int i = 0;
|
|
||||||
do {
|
|
||||||
bm = decodeBitmap(context, selectedImage, sampleSizes[i]);
|
|
||||||
Log.d(TAG, "resizer: new bitmap width = " + bm.getWidth());
|
|
||||||
i++;
|
|
||||||
} while (bm.getWidth() < minWidthQuality && i < sampleSizes.length);
|
|
||||||
return bm;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static int getRotation(Context context, Uri imageUri, boolean isCamera) {
|
|
||||||
int rotation;
|
|
||||||
if (isCamera) {
|
|
||||||
rotation = getRotationFromCamera(context, imageUri);
|
|
||||||
} else {
|
|
||||||
rotation = getRotationFromGallery(context, imageUri);
|
|
||||||
}
|
|
||||||
Log.d(TAG, "Image rotation: " + rotation);
|
|
||||||
return rotation;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getRotationFromCamera(Context context, Uri imageFile) {
|
|
||||||
int rotate = 0;
|
|
||||||
try {
|
|
||||||
|
|
||||||
context.getContentResolver().notifyChange(imageFile, null);
|
|
||||||
ExifInterface exif = new ExifInterface(imageFile.getPath());
|
|
||||||
int orientation = exif.getAttributeInt(
|
|
||||||
ExifInterface.TAG_ORIENTATION,
|
|
||||||
ExifInterface.ORIENTATION_NORMAL);
|
|
||||||
|
|
||||||
switch (orientation) {
|
|
||||||
case ExifInterface.ORIENTATION_ROTATE_270:
|
|
||||||
rotate = 270;
|
|
||||||
break;
|
|
||||||
case ExifInterface.ORIENTATION_ROTATE_180:
|
|
||||||
rotate = 180;
|
|
||||||
break;
|
|
||||||
case ExifInterface.ORIENTATION_ROTATE_90:
|
|
||||||
rotate = 90;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return rotate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getRotationFromGallery(Context context, Uri imageUri) {
|
|
||||||
int result = 0;
|
|
||||||
String[] columns = {MediaStore.Images.Media.ORIENTATION};
|
|
||||||
Cursor cursor = null;
|
|
||||||
try {
|
|
||||||
cursor = context.getContentResolver().query(imageUri, columns, null, null, null);
|
|
||||||
if (cursor != null && cursor.moveToFirst()) {
|
|
||||||
int orientationColumnIndex = cursor.getColumnIndex(columns[0]);
|
|
||||||
result = cursor.getInt(orientationColumnIndex);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
//Do nothing
|
|
||||||
} finally {
|
|
||||||
if (cursor != null) {
|
|
||||||
cursor.close();
|
|
||||||
}
|
|
||||||
}//End of try-catch block
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static Bitmap rotate(Bitmap bm, int rotation) {
|
|
||||||
if (rotation != 0) {
|
|
||||||
Matrix matrix = new Matrix();
|
|
||||||
matrix.postRotate(rotation);
|
|
||||||
Bitmap bmOut = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
|
|
||||||
return bmOut;
|
|
||||||
}
|
|
||||||
return bm;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,137 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 Hemanth Savarala.
|
|
||||||
*
|
|
||||||
* Licensed under the GNU General Public License v3
|
|
||||||
*
|
|
||||||
* This is free software: you can redistribute it and/or modify it under
|
|
||||||
* the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package code.name.monkey.retromusic.util;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.BitmapFactory;
|
|
||||||
import android.support.v4.media.MediaBrowserCompat;
|
|
||||||
import android.support.v4.media.MediaMetadataCompat;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
|
|
||||||
import code.name.monkey.retromusic.BuildConfig;
|
|
||||||
|
|
||||||
public class MusicLibrary {
|
|
||||||
private static final TreeMap<String, MediaMetadataCompat> music = new TreeMap<>();
|
|
||||||
private static final HashMap<String, Integer> albumRes = new HashMap<>();
|
|
||||||
private static final HashMap<String, Integer> musicRes = new HashMap<>();
|
|
||||||
|
|
||||||
public static String getRoot() {
|
|
||||||
return "root";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getSongUri(String mediaId) {
|
|
||||||
return "android.resource://" + BuildConfig.APPLICATION_ID + "/" + getMusicRes(mediaId);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getAlbumArtUri(String albumArtResName) {
|
|
||||||
return "android.resource://" + BuildConfig.APPLICATION_ID + "/drawable/" + albumArtResName;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getMusicRes(String mediaId) {
|
|
||||||
return musicRes.containsKey(mediaId) ? musicRes.get(mediaId) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getAlbumRes(String mediaId) {
|
|
||||||
return albumRes.containsKey(mediaId) ? albumRes.get(mediaId) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Bitmap getAlbumBitmap(Context ctx, String mediaId) {
|
|
||||||
return BitmapFactory.decodeResource(ctx.getResources(), MusicLibrary.getAlbumRes(mediaId));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<MediaBrowserCompat.MediaItem> getMediaItems() {
|
|
||||||
List<MediaBrowserCompat.MediaItem> result = new ArrayList<>();
|
|
||||||
for (MediaMetadataCompat metadata : music.values()) {
|
|
||||||
result.add(
|
|
||||||
new MediaBrowserCompat.MediaItem(
|
|
||||||
metadata.getDescription(), MediaBrowserCompat.MediaItem.FLAG_PLAYABLE));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getPreviousSong(String currentMediaId) {
|
|
||||||
String prevMediaId = music.lowerKey(currentMediaId);
|
|
||||||
if (prevMediaId == null) {
|
|
||||||
prevMediaId = music.firstKey();
|
|
||||||
}
|
|
||||||
return prevMediaId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getNextSong(String currentMediaId) {
|
|
||||||
String nextMediaId = music.higherKey(currentMediaId);
|
|
||||||
if (nextMediaId == null) {
|
|
||||||
nextMediaId = music.firstKey();
|
|
||||||
}
|
|
||||||
return nextMediaId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MediaMetadataCompat getMetadata(Context ctx, String mediaId) {
|
|
||||||
MediaMetadataCompat metadataWithoutBitmap = music.get(mediaId);
|
|
||||||
Bitmap albumArt = getAlbumBitmap(ctx, mediaId);
|
|
||||||
|
|
||||||
// Since MediaMetadataCompat is immutable, we need to create a copy to set the album art.
|
|
||||||
// We don't set it initially on all items so that they don't take unnecessary memory.
|
|
||||||
MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder();
|
|
||||||
for (String key :
|
|
||||||
new String[]{
|
|
||||||
MediaMetadataCompat.METADATA_KEY_MEDIA_ID,
|
|
||||||
MediaMetadataCompat.METADATA_KEY_ALBUM,
|
|
||||||
MediaMetadataCompat.METADATA_KEY_ARTIST,
|
|
||||||
MediaMetadataCompat.METADATA_KEY_GENRE,
|
|
||||||
MediaMetadataCompat.METADATA_KEY_TITLE
|
|
||||||
}) {
|
|
||||||
builder.putString(key, metadataWithoutBitmap.getString(key));
|
|
||||||
}
|
|
||||||
builder.putLong(
|
|
||||||
MediaMetadataCompat.METADATA_KEY_DURATION,
|
|
||||||
metadataWithoutBitmap.getLong(MediaMetadataCompat.METADATA_KEY_DURATION));
|
|
||||||
builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ALBUM_ART, albumArt);
|
|
||||||
return builder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void createMediaMetadataCompat(
|
|
||||||
String mediaId,
|
|
||||||
String title,
|
|
||||||
String artist,
|
|
||||||
String album,
|
|
||||||
String genre,
|
|
||||||
long duration,
|
|
||||||
int musicResId,
|
|
||||||
int albumArtResId,
|
|
||||||
String albumArtResName) {
|
|
||||||
music.put(mediaId,
|
|
||||||
new MediaMetadataCompat.Builder()
|
|
||||||
.putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, mediaId)
|
|
||||||
.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album)
|
|
||||||
.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)
|
|
||||||
.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration * 1000)
|
|
||||||
.putString(MediaMetadataCompat.METADATA_KEY_GENRE, genre)
|
|
||||||
.putString(
|
|
||||||
MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI,
|
|
||||||
getAlbumArtUri(albumArtResName))
|
|
||||||
.putString(
|
|
||||||
MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON_URI,
|
|
||||||
getAlbumArtUri(albumArtResName))
|
|
||||||
.putString(MediaMetadataCompat.METADATA_KEY_TITLE, title)
|
|
||||||
.build());
|
|
||||||
albumRes.put(mediaId, albumArtResId);
|
|
||||||
musicRes.put(mediaId, musicResId);
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue