Added option to ignore media store artwork and instead loading it directly from the song file

This commit is contained in:
Karim Abou Zeid 2015-07-10 02:24:57 +02:00
commit 1dcc447e52
25 changed files with 194 additions and 106 deletions

View file

@ -78,11 +78,12 @@ dependencies {
compile 'com.android.support:cardview-v7:22.2.0'
compile 'com.android.support:palette-v7:22.2.0'
compile 'com.android.support:design:22.2.0'
compile 'com.android.support:support-annotations:22.2.0'
compile 'com.github.ksoichiro:android-observablescrollview:1.5.1'
compile 'asia.ivity.android:drag-sort-listview:1.0'
compile 'de.hdodenhof:circleimageview:1.3.0'
compile "com.github.semoncat.seekarc:library:0.1"
compile 'com.github.semoncat.seekarc:library:0.1'
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.okhttp:okhttp:2.4.0'

View file

@ -27,6 +27,7 @@ public class App extends Application {
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
.imageDownloader(new PhonographImageDownloader(this))
.memoryCacheSizePercentage(30)
.build();
ImageLoader.getInstance().init(config);
L.writeLogs(false); // turns off UILs annoying LogCat output

View file

@ -78,7 +78,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
holder.artist.setText(album.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumArtUri(album.id).toString(),
MusicUtil.getAlbumImageLoaderString(album),
holder.albumArt,
new DisplayImageOptions.Builder()
.cacheInMemory(true)

View file

@ -82,6 +82,7 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
holder.artistImage.setImageResource(R.drawable.default_artist_image);
return;
}
lastFMRestClient.getApiService().getArtistInfo(artist.name, null, new Callback<ArtistInfo>() {
@Override
public void success(ArtistInfo artistInfo, Response response) {

View file

@ -77,7 +77,7 @@ public class ArtistAlbumAdapter extends AbsMultiSelectAdapter<ArtistAlbumAdapter
final Album album = dataSet.get(position);
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumArtUri(album.id).toString(),
MusicUtil.getAlbumImageLoaderString(album),
holder.albumArt,
new DisplayImageOptions.Builder()
.cacheInMemory(true)

View file

@ -111,7 +111,7 @@ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder
holder.title.setText(album.title);
holder.subTitle.setText(album.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumArtUri(album.id).toString(),
MusicUtil.getAlbumImageLoaderString(album),
holder.image,
new DisplayImageOptions.Builder()
.cacheInMemory(true)

View file

@ -70,7 +70,7 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
songInfo.setText(song.albumName);
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumArtUri(song.albumId).toString(),
MusicUtil.getSongImageLoaderString(song),
albumArt,
new DisplayImageOptions.Builder()
.cacheInMemory(true)

View file

@ -81,7 +81,7 @@ public class PlaylistSongAdapter extends AbsPlaylistSongAdapter<PlaylistSongAdap
holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumArtUri(song.albumId).toString(),
MusicUtil.getSongImageLoaderString(song),
holder.albumArt,
new DisplayImageOptions.Builder()
.cacheInMemory(true)

View file

@ -82,7 +82,7 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumArtUri(song.albumId).toString(),
MusicUtil.getSongImageLoaderString(song),
holder.albumArt,
new DisplayImageOptions.Builder()
.cacheInMemory(true)

View file

@ -77,7 +77,7 @@ public class SmartPlaylistSongAdapter extends AbsPlaylistSongAdapter<SmartPlayli
holder.songTitle.setText(song.title);
holder.songInfo.setText(song.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumArtUri(song.albumId).toString(),
MusicUtil.getSongImageLoaderString(song),
holder.albumArt,
new DisplayImageOptions.Builder()
.cacheInMemory(true)

View file

@ -64,7 +64,7 @@ public class WidgetMedium extends AppWidgetProvider {
private static void loadAlbumArt(final Context context, final Song song) {
if (song != null) {
currentAlbumArtUri = MusicUtil.getAlbumArtUri(song.albumId).toString();
currentAlbumArtUri = MusicUtil.getSongImageLoaderString(song);
ImageLoader.getInstance().displayImage(currentAlbumArtUri, new NonViewAware(new ImageSize(-1, -1), ViewScaleType.CROP), new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

View file

@ -203,7 +203,7 @@ public class PlayingNotificationHelper {
}
private void loadAlbumArt() {
currentAlbumArtUri = MusicUtil.getAlbumArtUri(currentSong.albumId).toString();
currentAlbumArtUri = MusicUtil.getSongImageLoaderString(currentSong);
ImageLoader.getInstance().displayImage(currentAlbumArtUri, new NonViewAware(new ImageSize(-1, -1), ViewScaleType.CROP), new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

View file

@ -1,12 +1,21 @@
package com.kabouzeid.gramophone.imageloader;
import android.content.Context;
import android.graphics.Bitmap;
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.util.ImageUtil;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
/**
* @author Karim Abou Zeid (kabouzeid)
@ -22,14 +31,48 @@ public class PhonographImageDownloader extends BaseImageDownloader {
@Override
protected InputStream getStreamFromOtherSource(String imageUri, Object extra) throws IOException {
if (imageUri.startsWith(SCHEME_ALBUM)) {
try {
int id = Integer.valueOf(imageUri.substring(SCHEME_ALBUM.length()));
return getStream(MusicUtil.getAlbumArtUri(id).toString(), extra);
} catch (NumberFormatException e) {
return super.getStreamFromOtherSource(imageUri, extra);
}
return getStreamFromAlbum(imageUri, extra);
} else if (imageUri.startsWith(SCHEME_SONG)) {
return getStreamFromSong(imageUri, extra);
} else {
return super.getStreamFromOtherSource(imageUri, extra);
}
}
protected InputStream getStreamFromAlbum(String imageUri, Object extra) throws IOException {
int albumId = Integer.valueOf(imageUri.substring(SCHEME_ALBUM.length()));
if (PreferenceUtils.getInstance(context).ignoreMediaStoreArtwork()) {
ArrayList<Song> songs = AlbumSongLoader.getAlbumSongList(context, albumId);
for (Song song : songs) {
Bitmap bitmap = ImageUtil.getEmbeddedSongArt(new File(song.data), context);
if (bitmap != null) {
return getBitmapInputStream(bitmap);
}
}
return null;
}
return getStream(MusicUtil.getAlbumArtUri(albumId).toString(), extra);
}
protected InputStream getStreamFromSong(String imageUri, Object extra) throws IOException {
String[] data = imageUri.split("#", 2);
if (PreferenceUtils.getInstance(context).ignoreMediaStoreArtwork()) {
Bitmap bitmap = ImageUtil.getEmbeddedSongArt(new File(data[1]), context);
if (bitmap != null) {
return getBitmapInputStream(bitmap);
}
return null;
}
int id = Integer.valueOf(data[0].substring(SCHEME_SONG.length()));
return getStream(MusicUtil.getAlbumArtUri(id).toString(), extra);
}
private static ByteArrayInputStream getBitmapInputStream(Bitmap bitmap) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
return new ByteArrayInputStream(bos.toByteArray());
}
}

View file

@ -423,7 +423,7 @@ public class MusicService extends Service {
}
private void updateRemoteControlClient() {
updateRemoteControlClientImpl(PreferenceUtils.getInstance(this).albumArtOnLockscrenn());
updateRemoteControlClientImpl(PreferenceUtils.getInstance(this).albumArtOnLockscreen());
}
private void updateRemoteControlClientImpl(boolean showAlbumArt) {
@ -435,7 +435,7 @@ public class MusicService extends Service {
.putLong(MediaMetadataRetriever.METADATA_KEY_DURATION, song.duration)
.apply();
if (showAlbumArt) {
final String currentAlbumArtUri = MusicUtil.getAlbumArtUri(song.albumId).toString();
final String currentAlbumArtUri = MusicUtil.getSongImageLoaderString(song);
ImageLoader.getInstance().displayImage(currentAlbumArtUri, new NonViewAware(new ImageSize(-1, -1), ViewScaleType.CROP), new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {

View file

@ -206,7 +206,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
private void setUpAlbumArtAndApplyPalette() {
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumArtUri(album.id).toString(),
MusicUtil.getAlbumImageLoaderString(album),
albumArtImageView,
new DisplayImageOptions.Builder()
.cacheInMemory(true)

View file

@ -258,7 +258,7 @@ public class MainActivity extends AbsFabActivity
((TextView) navigationDrawerHeader.findViewById(R.id.song_title)).setText(song.title);
((TextView) navigationDrawerHeader.findViewById(R.id.song_artist)).setText(song.artistName);
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumArtUri(song.albumId).toString(),
MusicUtil.getSongImageLoaderString(song),
((ImageView) navigationDrawerHeader.findViewById(R.id.album_art)),
new DisplayImageOptions.Builder()
.cacheInMemory(true)

View file

@ -422,7 +422,7 @@ public class MusicControllerActivity extends AbsFabActivity {
private void setUpAlbumArtAndApplyPalette() {
ImageLoader.getInstance().displayImage(
MusicUtil.getAlbumArtUri(song.albumId).toString(),
MusicUtil.getSongImageLoaderString(song),
albumArt,
new DisplayImageOptions.Builder()
.cacheInMemory(true)

View file

@ -69,6 +69,7 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia
addPreferencesFromResource(R.xml.pref_general);
addPreferencesFromResource(R.xml.pref_colors);
addPreferencesFromResource(R.xml.pref_now_playing_screen);
addPreferencesFromResource(R.xml.pref_images);
addPreferencesFromResource(R.xml.pref_lockscreen);
addPreferencesFromResource(R.xml.pref_audio);

View file

@ -373,10 +373,8 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
progressDialog.setContent(getString(R.string.rescanning_media));
if (deleteArtwork) {
MusicUtil.deleteAlbumArt(AbsTagEditorActivity.this, getId());
//ImageLoader.getInstance().getMemoryCache().remove(MusicUtil.getAlbumArtUri(getId()).toString());
ImageLoader.getInstance().clearMemoryCache();
} else if (artwork != null) {
//ImageLoader.getInstance().getMemoryCache().remove(MusicUtil.getAlbumArtUri(getId()).toString());
ImageLoader.getInstance().clearMemoryCache();
}
}

View file

@ -0,0 +1,85 @@
package com.kabouzeid.gramophone.util;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Point;
import android.support.annotation.Nullable;
import android.view.Display;
import android.view.WindowManager;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.exceptions.InvalidAudioFrameException;
import org.jaudiotagger.audio.exceptions.ReadOnlyFileException;
import org.jaudiotagger.tag.TagException;
import java.io.File;
import java.io.IOException;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class ImageUtil {
@Nullable
public static Bitmap getEmbeddedSongArt(File songFile, Context context) {
try {
AudioFile audioFile = AudioFileIO.read(songFile);
byte[] data = audioFile.getTag().getFirstArtwork().getBinaryData();
if (data != null) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(data, 0, data.length, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, context);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeByteArray(data, 0, data.length, options);
}
} catch (CannotReadException | TagException | IOException | ReadOnlyFileException | InvalidAudioFrameException e) {
e.printStackTrace();
}
return null;
}
public static int calculateInSampleSize(BitmapFactory.Options options, Context context) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int reqLength = Math.round(getSmallerScreenSize(context) * 1.5f); // absolute maximum size the album art will ever have
// setting reqWidth matching to desired 1:1 ratio and screen-size
if (width < height) {
reqLength = (height / width) * reqLength;
} else {
reqLength = (width / height) * reqLength;
}
int inSampleSize = 1;
if (height > reqLength || width > reqLength) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqLength
&& (halfWidth / inSampleSize) > reqLength) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
private static int getSmallerScreenSize(Context c) {
Display display = ((WindowManager) c.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
Point size = new Point();
display.getSize(size);
return Math.min(size.x, size.y);
}
}

View file

@ -11,14 +11,17 @@ import android.os.Environment;
import android.provider.BaseColumns;
import android.provider.MediaStore;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.util.Log;
import android.widget.Toast;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.imageloader.PhonographImageDownloader;
import com.kabouzeid.gramophone.loader.PlaylistLoader;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.model.Album;
import com.kabouzeid.gramophone.model.Artist;
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
import com.kabouzeid.gramophone.model.Playlist;
@ -34,6 +37,14 @@ import java.util.List;
public class MusicUtil {
public static final String TAG = MusicUtil.class.getSimpleName();
public static String getAlbumImageLoaderString(Album album) {
return PhonographImageDownloader.SCHEME_ALBUM + album.id;
}
public static String getSongImageLoaderString(Song song) {
return PhonographImageDownloader.SCHEME_SONG + song.albumId + "#" + song.data;
}
public static Uri getAlbumArtUri(int albumId) {
final Uri sArtworkUri = Uri
.parse("content://media/external/audio/albumart");
@ -45,6 +56,7 @@ public class MusicUtil {
return ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, songId);
}
@NonNull
public static Intent createShareSongFileIntent(final Song song) {
return new Intent()
.setAction(Intent.ACTION_SEND)
@ -122,6 +134,7 @@ public class MusicUtil {
return new File(createAlbumArtDir(), name + System.currentTimeMillis());
}
@SuppressWarnings("ResultOfMethodCallIgnored")
public static File createAlbumArtDir() {
File albumArtDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "/.albumart/");
if (!albumArtDir.exists()) {

View file

@ -22,8 +22,7 @@ public final class PreferenceUtils {
public static final String ALBUM_SORT_ORDER = "album_sort_order";
public static final String ALBUM_SONG_SORT_ORDER = "album_song_sort_order";
public static final String SONG_SORT_ORDER = "song_sort_order";
// public static final String ONLY_ON_WIFI = "auto_download_artist_images";
// public static final String DOWNLOAD_MISSING_ARTIST_IMAGES = "auto_download_artist_images";
public static final String AUTO_DOWNLOAD_ARTIST_IMAGES_ONLY_ON_WIFI = "auto_download_artist_images_only_on_wifi";
public static final String COLORED_ALBUM_FOOTERS = "colored_album_footers";
public static final String COLORED_NAVIGATION_BAR = "colored_navigation_bar";
public static final String COLORED_NAVIGATION_BAR_ALBUM = "colored_navigation_bar_album";
@ -46,6 +45,7 @@ public final class PreferenceUtils {
public static final String ALBUM_ART_ON_LOCKSCREEN = "album_art_on_lockscreen";
public static final String LAST_SLEEP_TIMER_VALUE = "last_sleep_timer_value";
public static final String NEXT_SLEEP_TIMER_ELAPSED_REALTIME = "next_sleep_timer_elapsed_real_time";
public static final String IGNORE_MEDIA_STORE_ARTWORK = "ignore_media_store_artwork";
private static PreferenceUtils sInstance;
@ -111,9 +111,9 @@ public final class PreferenceUtils {
return mPreferences.getInt(LAST_START_PAGE, DEFAULT_PAGE);
}
// public final boolean autoDownloadOnlyOnWifi() {
// return mPreferences.getBoolean(ONLY_ON_WIFI, false);
// }
public final boolean autoDownloadArtistImagesOnlyOnWifi() {
return mPreferences.getBoolean(AUTO_DOWNLOAD_ARTIST_IMAGES_ONLY_ON_WIFI, false);
}
public final boolean coloredAlbumFooters() {
return mPreferences.getBoolean(COLORED_ALBUM_FOOTERS, true);
@ -168,11 +168,6 @@ public final class PreferenceUtils {
}
}
// @SuppressLint("CommitPrefEdits")
// private void setColoredNavigationBarOtherScreens(boolean coloredNavbar) {
// mPreferences.edit().putBoolean(COLORED_NAVIGATION_BAR_OTHER_SCREENS, coloredNavbar).commit();
// }
public final boolean opaqueStatusbarNowPlaying() {
return mPreferences.getBoolean(OPAQUE_STATUSBAR_NOW_PLAYING, false);
}
@ -201,68 +196,37 @@ public final class PreferenceUtils {
return mPreferences.getBoolean(GAPLESS_PLAYBACK, false);
}
public final boolean albumArtOnLockscrenn() {
public final boolean albumArtOnLockscreen() {
return mPreferences.getBoolean(ALBUM_ART_ON_LOCKSCREEN, true);
}
// public final boolean downloadMissingArtistImages() {
// return mPreferences.getBoolean(DOWNLOAD_MISSING_ARTIST_IMAGES, true);
// }
//
public final boolean ignoreMediaStoreArtwork() {
return mPreferences.getBoolean(IGNORE_MEDIA_STORE_ARTWORK, false);
}
// private void setSortOrder(final String key, final String value) {
// final SharedPreferences.Editor editor = mPreferences.edit();
// editor.putString(key, value);
// editor.apply();
// }
// public void setArtistSortOrder(final String value) {
// setSortOrder(ARTIST_SORT_ORDER, value);
// }
//
public final String getArtistSortOrder() {
return mPreferences.getString(ARTIST_SORT_ORDER, SortOrder.ArtistSortOrder.ARTIST_A_Z);
}
// public void setArtistSongSortOrder(final String value) {
// setSortOrder(ARTIST_SONG_SORT_ORDER, value);
// }
public final String getArtistSongSortOrder() {
return mPreferences.getString(ARTIST_SONG_SORT_ORDER,
SortOrder.ArtistSongSortOrder.SONG_A_Z);
}
// public void setArtistAlbumSortOrder(final String value) {
// setSortOrder(ARTIST_ALBUM_SORT_ORDER, value);
// }
public final String getArtistAlbumSortOrder() {
return mPreferences.getString(ARTIST_ALBUM_SORT_ORDER,
SortOrder.ArtistAlbumSortOrder.ALBUM_YEAR_ASC);
}
// public void setAlbumSortOrder(final String value) {
// setSortOrder(ALBUM_SORT_ORDER, value);
// }
public final String getAlbumSortOrder() {
return mPreferences.getString(ALBUM_SORT_ORDER, SortOrder.AlbumSortOrder.ALBUM_A_Z);
}
// public void setAlbumSongSortOrder(final String value) {
// setSortOrder(ALBUM_SONG_SORT_ORDER, value);
// }
public final String getAlbumSongSortOrder() {
return mPreferences.getString(ALBUM_SONG_SORT_ORDER,
SortOrder.AlbumSongSortOrder.SONG_TRACK_LIST);
}
// public void setSongSortOrder(final String value) {
// setSortOrder(SONG_SORT_ORDER, value);
// }
public final String getSongSortOrder() {
return mPreferences.getString(SONG_SORT_ORDER, SortOrder.SongSortOrder.SONG_A_Z);
}

View file

@ -118,44 +118,6 @@ public class Util {
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
// public static boolean isOnline(final Context context) {
// if (context == null)
// return false;
//
// boolean state = false;
// final boolean onlyOnWifi = PreferenceUtils.getInstance(context).autoDownloadOnlyOnWifi();
//
// /* Monitor network connections */
// final ConnectivityManager connectivityManager = (ConnectivityManager) context
// .getSystemService(Context.CONNECTIVITY_SERVICE);
//
// /* Wi-Fi connection */
// final NetworkInfo wifiNetwork = connectivityManager
// .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
// if (wifiNetwork != null) {
// state = wifiNetwork.isConnectedOrConnecting();
// }
//
// /* Mobile data connection */
// final NetworkInfo mbobileNetwork = connectivityManager
// .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
// if (mbobileNetwork != null) {
// if (!onlyOnWifi) {
// state = mbobileNetwork.isConnectedOrConnecting();
// }
// }
//
// /* Other networks */
// final NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
// if (activeNetwork != null) {
// if (!onlyOnWifi) {
// state = activeNetwork.isConnectedOrConnecting();
// }
// }
//
// return state;
// }
public static String getFileSizeString(long sizeInBytes) {
long fileSizeInKB = sizeInBytes / 1024;
long fileSizeInMB = fileSizeInKB / 1024;

View file

@ -104,6 +104,7 @@
<string name="pref_title_general_theme">General Theme</string>
<string name="pref_header_audio">Audio</string>
<string name="pref_header_general">General</string>
<string name="pref_header_images">Images</string>
<string name="pref_header_lockscreen">Lockscreen</string>
<string name="pref_summary_colored_navigation_bar">In which views the navigation bar should be colored.</string>
<string name="pref_title_navigation_bar">Colored Navigation Bar</string>
@ -117,6 +118,7 @@
<string name="pref_title_colored_album_footers">Colored Album Footers</string>
<string name="pref_title_album_art_on_lockscreen">Album Art on Lockscreen</string>
<string name="pref_title_colored_notification">Colored Notification</string>
<string name="pref_title_ignore_media_store_artwork">Ignore Media Store artwork</string>
<string name="pref_title_gapless_playback">Gapless Playback</string>
<string name="pref_title_force_square_album_art">Force Square Album Cover</string>
<string name="pref_title_opaque_toolbar_now_playing">Opaque Toolbar</string>
@ -160,6 +162,7 @@
<string name="pref_summary_larger_title_box_now_playing">The box below the album art where the song title and artist goes is larger in its height.</string>
<string name="pref_summary_alternative_progress_slider_now_playing">Uses a progressbar which does not cover the album art instead of the default progress slider.</string>
<string name="pref_summary_playback_controller_card_now_playing">Displays a card below the playback controller buttons (play/pause etc.).</string>
<string name="pref_summary_ignore_media_store_artwork">The Android Media Store caches your embedded album artwork but on some devices it seems to store it at a low resolution. Enabling this will bypass the Media Store, which can increase the album art quality but causes slower image loading times.</string>
<string name="could_not_download_album_cover">"Could not download a matching album cover."</string>
<string name="search_hint">Search your library…</string>
<string name="rescanning_media">Rescanning media…</string>

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory android:title="@string/pref_header_images">
<CheckBoxPreference
android:defaultValue="false"
android:key="ignore_media_store_artwork"
android:layout="@layout/preference_custom"
android:summary="@string/pref_summary_ignore_media_store_artwork"
android:title="@string/pref_title_ignore_media_store_artwork"
android:widgetLayout="@layout/preference_dynamic_checkbox" />
</com.kabouzeid.gramophone.prefs.DynamicPreferenceCategory>
</PreferenceScreen>