diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8f5a87ea..03f41017 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -88,7 +88,7 @@ THE SOFTWARE.
-
+
diff --git a/src/org/kreed/vanilla/PlaybackService.java b/src/org/kreed/vanilla/PlaybackService.java
index b0a17510..b002a86a 100644
--- a/src/org/kreed/vanilla/PlaybackService.java
+++ b/src/org/kreed/vanilla/PlaybackService.java
@@ -23,12 +23,9 @@
package org.kreed.vanilla;
import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.util.ArrayList;
import android.app.Activity;
-import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.content.BroadcastReceiver;
@@ -150,17 +147,6 @@ public final class PlaybackService extends Service implements Handler.Callback,
*/
private float mCurrentVolume = 1.0f;
- private static Method mStartForeground;
- private static Method mStopForeground;
-
- static {
- try {
- mStartForeground = Service.class.getMethod("startForeground", int.class, Notification.class);
- mStopForeground = Service.class.getMethod("stopForeground", boolean.class);
- } catch (NoSuchMethodException e) {
- }
- }
-
@Override
public void onCreate()
{
@@ -258,7 +244,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
mLooper.quit();
// clear the notification
- stopForegroundCompat(true);
+ stopForeground(true);
if (mMediaPlayer != null) {
mTimeline.saveState(this, mMediaPlayer.getCurrentPosition());
@@ -280,40 +266,6 @@ public final class PlaybackService extends Service implements Handler.Callback,
super.onDestroy();
}
- public void startForegroundCompat(int id, Notification notification)
- {
- if (mStartForeground == null) {
- setForeground(true);
- mNotificationManager.notify(id, notification);
- } else {
- try {
- mStartForeground.invoke(this, Integer.valueOf(id), notification);
- } catch (InvocationTargetException e) {
- Log.w("VanillaMusic", e);
- } catch (IllegalAccessException e) {
- Log.w("VanillaMusic", e);
- }
- }
- }
-
- public void stopForegroundCompat(Boolean cancelNotification)
- {
- if (mStopForeground == null) {
- setForeground(false);
- } else {
- try {
- mStopForeground.invoke(this, cancelNotification);
- } catch (InvocationTargetException e) {
- Log.w("VanillaMusic", e);
- } catch (IllegalAccessException e) {
- Log.w("VanillaMusic", e);
- }
- }
-
- if (cancelNotification && mNotificationManager != null)
- mNotificationManager.cancel(NOTIFICATION_ID);
- }
-
/**
* Return the SharedPreferences instance containing the PlaybackService
* settings, creating it if necessary.
@@ -338,7 +290,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
// This is the only way to remove a notification created by
// startForeground(), even if we are not currently in foreground
// mode.
- stopForegroundCompat(true);
+ stopForeground(true);
updateNotification();
} else if ("scrobble".equals(key)) {
mScrobble = settings.getBoolean("scrobble", false);
@@ -428,7 +380,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
}
}
if (mNotificationMode != NEVER)
- startForegroundCompat(NOTIFICATION_ID, new SongNotification(mCurrentSong, true));
+ startForeground(NOTIFICATION_ID, new SongNotification(mCurrentSong, true));
if (mWakeLock != null)
mWakeLock.acquire();
@@ -439,10 +391,10 @@ public final class PlaybackService extends Service implements Handler.Callback,
}
}
if (mNotificationMode == ALWAYS) {
- stopForegroundCompat(false);
+ stopForeground(false);
mNotificationManager.notify(NOTIFICATION_ID, new SongNotification(mCurrentSong, false));
} else {
- stopForegroundCompat(true);
+ stopForeground(true);
}
if (mWakeLock != null && mWakeLock.isHeld())
diff --git a/src/org/kreed/vanilla/Song.java b/src/org/kreed/vanilla/Song.java
index 6afa99ef..c8134719 100644
--- a/src/org/kreed/vanilla/Song.java
+++ b/src/org/kreed/vanilla/Song.java
@@ -33,11 +33,8 @@ import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.provider.MediaStore;
-import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
/**
* Represents a Song backed by the MediaStore. Includes basic metadata and
@@ -406,17 +403,8 @@ public class Song implements Parcelable {
Context context = ContextApplication.getContext();
ContentResolver res = context.getContentResolver();
- // Query the MediaStore content provider
cover = getCoverFromMediaFile(res);
- // If that fails, try using MediaScanner directly
- if (cover == null)
- cover = getCoverFromMediaUsingMediaScanner(res);
-
- // Fall back to the official, documented, slow way.
- if (cover == null)
- cover = getCoverFromMediaStoreCache(res);
-
Bitmap deletedCover = mCoverCache.put(id, cover);
if (deletedCover != null)
deletedCover.recycle();
@@ -450,66 +438,4 @@ public class Song implements Parcelable {
return cover;
}
-
- /**
- * Obtain the cover from a media file using the private MediaScanner API
- *
- * @param resolver A ContentResolver to use.
- * @return The cover or null if the file has no cover art or the art could
- * not be loaded using this method.
- */
- private Bitmap getCoverFromMediaUsingMediaScanner(ContentResolver resolver)
- {
- Bitmap cover = null;
-
- // This is a private API, so do everything using reflection
- // see http://android.git.kernel.org/?p=platform/packages/apps/Music.git;a=blob;f=src/com/android/music/MusicUtils.java;h=ea2079435ca5e2c6834c9f6f02d07fe7621e0fd9;hb=aae2791ffdd8923d99242f2cf453eb66116fd6b6#l1044
- try {
- // Attempt to open the media file in read-only mode
- Uri uri = Uri.fromFile(new File(path));
- FileDescriptor fileDescriptor = resolver.openFileDescriptor(uri, "r").getFileDescriptor();
-
- if (fileDescriptor != null) {
- // Construct a MediaScanner
- Class> mediaScannerClass = Class.forName("android.media.MediaScanner");
- Constructor> mediaScannerConstructor = mediaScannerClass.getDeclaredConstructor(Context.class);
- Object mediaScanner = mediaScannerConstructor.newInstance(ContextApplication.getContext());
-
- // Call extractAlbumArt(fileDescriptor)
- Method method = mediaScannerClass.getDeclaredMethod("extractAlbumArt", FileDescriptor.class);
- byte[] artBinary = (byte[]) method.invoke(mediaScanner, fileDescriptor);
-
- // Convert the album art to a bitmap
- if (artBinary != null)
- cover = BitmapFactory.decodeByteArray(artBinary, 0, artBinary.length, BITMAP_OPTIONS);
- }
- } catch (Exception e) {
- // Swallow every exception and return an empty cover if we can't do it due to the API not being there anymore
- }
-
- return cover;
- }
-
- /**
- * Get the cover from the media store cache, the documented way.
- *
- * @param resolver A ContentResolver to use.
- * @return The cover or null if the MediaStore has no cover for the given
- * song.
- */
- private Bitmap getCoverFromMediaStoreCache(ContentResolver resolver)
- {
- Uri media = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
- String[] albumProjection = {MediaStore.Audio.Albums.ALBUM_ART};
- String albumSelection = MediaStore.Audio.Albums._ID + '=' + albumId;
-
- Cursor cursor = resolver.query(media, albumProjection, albumSelection, null, null);
- if (cursor != null) {
- if (cursor.moveToNext())
- return BitmapFactory.decodeFile(cursor.getString(0), BITMAP_OPTIONS);
- cursor.close();
- }
-
- return null;
- }
}