diff options
author | Tom Hennen <TomHennen@users.noreply.github.com> | 2015-09-05 12:01:13 -0400 |
---|---|---|
committer | Tom Hennen <TomHennen@users.noreply.github.com> | 2015-09-05 12:01:13 -0400 |
commit | e2369036026e38b5ab1d8201d060cc42b465aee6 (patch) | |
tree | 7d6d2ba9cbca009d84fd541a078c8b2082b8c600 | |
parent | af29d0992ee019f793f35b27fa22ed704fd22156 (diff) | |
parent | e446c6ee8fc95269669109012955ab0ecda8a7e3 (diff) | |
download | AntennaPod-e2369036026e38b5ab1d8201d060cc42b465aee6.zip |
Merge pull request #1166 from TomHennen/api22
Update to API 22
6 files changed, 124 insertions, 164 deletions
diff --git a/app/build.gradle b/app/build.gradle index 5dce7b71d..a9cd05bd4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,9 +8,9 @@ repositories { } dependencies { - compile 'com.android.support:support-v4:21.0.3' - compile 'com.android.support:appcompat-v7:21.0.3' - compile 'com.android.support:gridlayout-v7:21.0.3' + compile 'com.android.support:support-v4:22.2.1' + compile 'com.android.support:appcompat-v7:22.2.1' + compile 'com.android.support:gridlayout-v7:22.2.1' compile 'org.apache.commons:commons-lang3:3.3.2' compile('org.shredzone.flattr4j:flattr4j-core:2.12') { exclude group: 'org.json', module: 'json' @@ -44,12 +44,12 @@ def getMyVersionCode() { } android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 22 + buildToolsVersion "22.0.1" defaultConfig { minSdkVersion 10 - targetSdkVersion 21 + targetSdkVersion 22 versionCode getMyVersionCode() versionName "${getMyVersionName()}" testApplicationId "de.test.antennapod" diff --git a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java index 42fa84d20..4ee372d68 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java @@ -188,10 +188,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { return false; } - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null); @@ -260,11 +256,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { public boolean endPlayback(boolean playNextEpisode) { return false; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null); @@ -337,11 +328,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { public boolean endPlayback(boolean playNextEpisode) { return false; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null); @@ -416,10 +402,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { return false; } - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null); @@ -487,10 +469,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { return false; } - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); @@ -558,11 +536,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { public boolean endPlayback(boolean playNextEpisode) { return false; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); @@ -633,11 +606,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { public boolean endPlayback(boolean playNextEpisode) { return false; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); @@ -711,11 +679,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { public boolean endPlayback(boolean playNextEpisode) { return false; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); @@ -764,11 +727,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { public boolean endPlayback(boolean playNextEpisode) { return false; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; private void pauseTestSkeleton(final PlayerStatus initialState, final boolean stream, final boolean abandonAudioFocus, final boolean reinit, long timeoutSeconds) throws InterruptedException { @@ -841,11 +799,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { public boolean endPlayback(boolean playNextEpisode) { return false; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); @@ -952,11 +905,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { public boolean endPlayback(boolean playNextEpisode) { return false; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); if (initialState == PlayerStatus.PREPARED || initialState == PlayerStatus.PLAYING || initialState == PlayerStatus.PAUSED) { @@ -1038,11 +986,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { public boolean endPlayback(boolean playNextEpisode) { return false; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); @@ -1137,11 +1080,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { public boolean endPlayback(boolean playNextEpisode) { return false; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return null; - } }; PlaybackServiceMediaPlayer psmp = new PlaybackServiceMediaPlayer(c, callback); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); diff --git a/core/build.gradle b/core/build.gradle index 46b2e3ce9..b88780772 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -2,12 +2,12 @@ apply plugin: 'com.android.library' apply plugin: 'me.tatarka.retrolambda' android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 22 + buildToolsVersion "22.0.1" defaultConfig { minSdkVersion 10 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" testApplicationId "de.danoeh.antennapod.core.tests" @@ -34,8 +34,9 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:21.0.3' - compile 'com.android.support:support-v4:21.0.3' + compile 'com.android.support:support-v4:22.2.1' + compile 'com.android.support:appcompat-v7:22.2.1' + compile 'com.android.support:support-v4:22.2.1' compile 'org.apache.commons:commons-lang3:3.3.2' compile ('org.shredzone.flattr4j:flattr4j-core:2.12') { exclude group: 'org.json', module: 'json' diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/MediaButtonIntentReceiver.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/MediaButtonIntentReceiver.java new file mode 100644 index 000000000..3e401b5ea --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/MediaButtonIntentReceiver.java @@ -0,0 +1,27 @@ +package de.danoeh.antennapod.core.service.playback; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.util.Log; +import android.view.KeyEvent; + +public class MediaButtonIntentReceiver extends BroadcastReceiver { + + private static final String TAG = "MediaButtonIntentReceiver"; + + private static PlaybackServiceMediaPlayer mMediaPlayer; + + public static void setMediaPlayer(PlaybackServiceMediaPlayer mediaPlayer) { + mMediaPlayer = mediaPlayer; + } + + @Override + public void onReceive(Context context, Intent intent) { + Log.d(TAG, "onReceive(Context, " + intent.toString() +")"); + if (mMediaPlayer != null && Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { + mMediaPlayer.handleMediaKey((KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT)); + } + } + +}
\ No newline at end of file diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 80ba4fca7..0e3a347bc 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -237,7 +237,6 @@ public class PlaybackService extends Service { ACTION_PAUSE_PLAY_CURRENT_EPISODE)); registerReceiver(pauseResumeCurrentEpisodeReceiver, new IntentFilter( ACTION_RESUME_PLAY_CURRENT_EPISODE)); - remoteControlClient = setupRemoteControlClient(); taskManager = new PlaybackServiceTaskManager(this, taskManagerCallback); mediaPlayer = new PlaybackServiceMediaPlayer(this, mediaPlayerCallback); @@ -499,7 +498,6 @@ public class PlaybackService extends Service { // statusUpdate.putExtra(EXTRA_NEW_PLAYER_STATUS, newInfo.playerStatus.ordinal()); sendBroadcast(statusUpdate); updateWidget(); - refreshRemoteControlClientState(newInfo); bluetoothNotifyChange(newInfo, AVRCP_ACTION_PLAYER_STATUS_CHANGED); bluetoothNotifyChange(newInfo, AVRCP_ACTION_META_CHANGED); } @@ -552,11 +550,6 @@ public class PlaybackService extends Service { PlaybackService.this.endPlayback(true); return true; } - - @Override - public RemoteControlClient getRemoteControlClient() { - return remoteControlClient; - } }; private void endPlayback(boolean playNextEpisode) { @@ -965,74 +958,6 @@ public class PlaybackService extends Service { return taskManager.getSleepTimerTimeLeft(); } - @SuppressLint("NewApi") - private RemoteControlClient setupRemoteControlClient() { - if (Build.VERSION.SDK_INT < 14) { - return null; - } - - Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); - mediaButtonIntent.setComponent(new ComponentName(getPackageName(), - MediaButtonReceiver.class.getName())); - PendingIntent mediaPendingIntent = PendingIntent.getBroadcast( - getApplicationContext(), 0, mediaButtonIntent, 0); - remoteControlClient = new RemoteControlClient(mediaPendingIntent); - int controlFlags; - if (android.os.Build.VERSION.SDK_INT < 16) { - controlFlags = RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE - | RemoteControlClient.FLAG_KEY_MEDIA_NEXT; - } else { - controlFlags = RemoteControlClient.FLAG_KEY_MEDIA_PLAY_PAUSE; - } - remoteControlClient.setTransportControlFlags(controlFlags); - return remoteControlClient; - } - - /** - * Refresh player status and metadata. - */ - @SuppressLint("NewApi") - private void refreshRemoteControlClientState(PlaybackServiceMediaPlayer.PSMPInfo info) { - if (android.os.Build.VERSION.SDK_INT >= 14) { - if (remoteControlClient != null) { - switch (info.playerStatus) { - case PLAYING: - remoteControlClient - .setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); - break; - case PAUSED: - case INITIALIZED: - remoteControlClient - .setPlaybackState(RemoteControlClient.PLAYSTATE_PAUSED); - break; - case STOPPED: - remoteControlClient - .setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED); - break; - case ERROR: - remoteControlClient - .setPlaybackState(RemoteControlClient.PLAYSTATE_ERROR); - break; - default: - remoteControlClient - .setPlaybackState(RemoteControlClient.PLAYSTATE_BUFFERING); - } - if (info.playable != null) { - MetadataEditor editor = remoteControlClient - .editMetadata(false); - editor.putString(MediaMetadataRetriever.METADATA_KEY_TITLE, - info.playable.getEpisodeTitle()); - - editor.putString(MediaMetadataRetriever.METADATA_KEY_ALBUM, - info.playable.getFeedTitle()); - - editor.apply(); - } - Log.d(TAG, "RemoteControlClient state was refreshed"); - } - } - } - private void bluetoothNotifyChange(PlaybackServiceMediaPlayer.PSMPInfo info, String whatChanged) { boolean isPlaying = false; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java index f1aa50c91..e4149a6c5 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java @@ -1,9 +1,10 @@ package de.danoeh.antennapod.core.service.playback; +import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; +import android.content.Intent; import android.media.AudioManager; -import android.media.RemoteControlClient; import android.net.wifi.WifiManager; import android.os.PowerManager; import android.support.v4.media.MediaMetadataCompat; @@ -12,6 +13,7 @@ import android.support.v4.media.session.PlaybackStateCompat; import android.telephony.TelephonyManager; import android.util.Log; import android.util.Pair; +import android.view.KeyEvent; import android.view.SurfaceHolder; import org.apache.commons.lang3.Validate; @@ -29,7 +31,6 @@ import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.receiver.MediaButtonReceiver; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.playback.AudioPlayer; import de.danoeh.antennapod.core.util.playback.IPlayer; @@ -98,9 +99,16 @@ public class PlaybackServiceMediaPlayer { } ); - mediaSession = new MediaSessionCompat(context, TAG); + MediaButtonIntentReceiver.setMediaPlayer(this); + ComponentName eventReceiver = new ComponentName(context.getPackageName(), MediaButtonIntentReceiver.class.getName()); + Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); + mediaButtonIntent.setComponent(eventReceiver); + PendingIntent buttonReceiverIntent = PendingIntent.getBroadcast(context, 0, mediaButtonIntent, 0); + + mediaSession = new MediaSessionCompat(context, TAG, eventReceiver, buttonReceiverIntent); mediaSession.setCallback(sessionCallback); - mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); + mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); + mediaSession.setActive(true); mediaPlayer = null; statusBeforeSeeking = null; @@ -249,7 +257,9 @@ public class PlaybackServiceMediaPlayer { private MediaMetadataCompat getMediaSessionMetadata(Playable p) { MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder(); + builder.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, p.getFeedTitle()); builder.putString(MediaMetadataCompat.METADATA_KEY_TITLE, p.getEpisodeTitle()); + builder.putString(MediaMetadataCompat.METADATA_KEY_DISPLAY_TITLE, p.getEpisodeTitle()); builder.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, p.getFeedTitle()); return builder.build(); } @@ -287,16 +297,6 @@ public class PlaybackServiceMediaPlayer { setPlayerStatus(PlayerStatus.PLAYING, media); pausedBecauseOfTransientAudiofocusLoss = false; - if (android.os.Build.VERSION.SDK_INT >= 14) { - RemoteControlClient remoteControlClient = callback.getRemoteControlClient(); - if (remoteControlClient != null) { - audioManager - .registerRemoteControlClient(remoteControlClient); - } - } - audioManager - .registerMediaButtonEventReceiver(new ComponentName(context.getPackageName(), - MediaButtonReceiver.class.getName())); media.onPlaybackStart(); } else { @@ -975,8 +975,6 @@ public class PlaybackServiceMediaPlayer { public boolean onMediaPlayerError(Object inObj, int what, int extra); public boolean endPlayback(boolean playNextEpisode); - - public RemoteControlClient getRemoteControlClient(); } private IPlayer setMediaPlayerListeners(IPlayer mp) { @@ -1154,5 +1152,76 @@ public class PlaybackServiceMediaPlayer { super.onSeekTo(pos); seekTo((int) pos); } + + @Override + public boolean onMediaButtonEvent(final Intent mediaButton) { + Log.d(TAG, "GOT MediaButton EVENT"); + if (mediaButton != null) { + KeyEvent keyEvent = (KeyEvent) mediaButton.getExtras().get(Intent.EXTRA_KEY_EVENT); + handleMediaKey(keyEvent); + } + return super.onMediaButtonEvent(mediaButton); + } }; + + public boolean handleMediaKey(KeyEvent event) { + if (event != null + && event.getAction() == KeyEvent.ACTION_DOWN + && event.getRepeatCount() == 0) { + switch (event.getKeyCode()) { + case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: + case KeyEvent.KEYCODE_HEADSETHOOK: + { + Log.d(TAG, "Received Play/Pause event from RemoteControlClient"); + if (playerStatus == PlayerStatus.PAUSED || playerStatus == PlayerStatus.PREPARED) { + resume(); + } else if (playerStatus == PlayerStatus.INITIALIZED) { + setStartWhenPrepared(true); + prepare(); + } else if (playerStatus == PlayerStatus.PLAYING) { + pause(false, true); + if (UserPreferences.isPersistNotify()) { + pause(false, true); + } else { + pause(true, true); + } + } + return true; + } + case KeyEvent.KEYCODE_MEDIA_PLAY: + { + Log.d(TAG, "Received Play event from RemoteControlClient"); + if (playerStatus == PlayerStatus.PAUSED || playerStatus == PlayerStatus.PREPARED) { + resume(); + } else if (playerStatus == PlayerStatus.INITIALIZED) { + setStartWhenPrepared(true); + prepare(); + } + return true; + } + case KeyEvent.KEYCODE_MEDIA_PAUSE: + { + Log.d(TAG, "Received Pause event from RemoteControlClient"); + if (playerStatus == PlayerStatus.PLAYING) { + pause(false, true); + } + if (UserPreferences.isPersistNotify()) { + pause(false, true); + } else { + pause(true, true); + } + return true; + } + case KeyEvent.KEYCODE_MEDIA_STOP: + { + Log.d(TAG, "Received Stop event from RemoteControlClient"); + stop(); + return true; + } + default: + break; + } + } + return false; + } } |