diff --git a/app/build.gradle b/app/build.gradle index 388487092..e4f66fe64 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.1' + classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.2' } } @@ -86,6 +86,7 @@ android { buildConfigField STRING, FLATTR_APP_SECRET, mFlattrAppSecret } release { + resValue "string", "provider_authority", "de.danoeh.antennapod.provider" minifyEnabled true proguardFile "proguard.cfg" signingConfig signingConfigs.releaseConfig @@ -127,13 +128,6 @@ android { } } -configurations { - freeDebugImplementation - freeReleaseImplementation - playDebugImplementation - playReleaseImplementation -} - dependencies { freeImplementation project(":core") // free build hack: skip some dependencies @@ -169,7 +163,7 @@ dependencies { transitive = true } implementation "com.yqritc:recyclerview-flexibledivider:$recyclerviewFlexibledividerVersion" - implementation("com.githang:viewpagerindicator:2.5@aar") { + implementation("com.githang:viewpagerindicator:2.5.1@aar") { exclude module: "support-v4" } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java index d9c250b38..26352f58f 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/FlattrAuthActivity.java @@ -4,7 +4,7 @@ package de.danoeh.antennapod.activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.v7.app.ActionBarActivity; +import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -21,7 +21,7 @@ import de.danoeh.antennapod.core.util.flattr.FlattrUtils; /** Guides the user through the authentication process */ -public class FlattrAuthActivity extends ActionBarActivity { +public class FlattrAuthActivity extends AppCompatActivity { private static final String TAG = "FlattrAuthActivity"; private TextView txtvExplanation; diff --git a/build.gradle b/build.gradle index e15625f13..4d5fded46 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { google() } dependencies { - classpath "com.android.tools.build:gradle:3.0.1" + classpath 'com.android.tools.build:gradle:3.1.0' classpath "com.github.triplet.gradle:play-publisher:1.2.0" // Exclude the version that the android plugin depends on. configurations.classpath.exclude group: "com.android.tools.external.lombok" @@ -53,13 +53,13 @@ project.ext { jsoupVersion = "1.11.2" materialDialogsVersion = "0.9.0.2" okhttpVersion = "3.9.0" - okioVersion = "1.13.0" - recyclerviewFlexibledividerVersion = "1.2.6" + okioVersion = "1.14.0" + recyclerviewFlexibledividerVersion = "1.4.0" robotiumSoloVersion = "5.6.3" rxAndroidVersion = "1.2.1" - rxJavaVersion = "1.3.2" - rxJavaRulesVersion = "1.3.2.0" - triangleLabelViewVersion = "1.1.0" + rxJavaVersion = "1.3.8" + rxJavaRulesVersion = "1.3.3.0" + triangleLabelViewVersion = "1.1.2" audioPlayerVersion = "v1.0.17" 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 417716810..ab25f0a5f 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 @@ -263,30 +263,21 @@ public class PlaybackService extends MediaBrowserServiceCompat { Log.d(TAG, "Service created."); isRunning = true; - registerReceiver(autoStateUpdated, new IntentFilter( - "com.google.android.gms.car.media.STATUS")); - registerReceiver(headsetDisconnected, new IntentFilter( - Intent.ACTION_HEADSET_PLUG)); - registerReceiver(shutdownReceiver, new IntentFilter( - ACTION_SHUTDOWN_PLAYBACK_SERVICE)); - registerReceiver(bluetoothStateUpdated, new IntentFilter( - BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)); - registerReceiver(audioBecomingNoisy, new IntentFilter( - AudioManager.ACTION_AUDIO_BECOMING_NOISY)); - registerReceiver(skipCurrentEpisodeReceiver, new IntentFilter( - ACTION_SKIP_CURRENT_EPISODE)); - registerReceiver(pausePlayCurrentEpisodeReceiver, new IntentFilter( - ACTION_PAUSE_PLAY_CURRENT_EPISODE)); - registerReceiver(pauseResumeCurrentEpisodeReceiver, new IntentFilter( - ACTION_RESUME_PLAY_CURRENT_EPISODE)); + registerReceiver(autoStateUpdated, new IntentFilter("com.google.android.gms.car.media.STATUS")); + registerReceiver(headsetDisconnected, new IntentFilter(Intent.ACTION_HEADSET_PLUG)); + registerReceiver(shutdownReceiver, new IntentFilter(ACTION_SHUTDOWN_PLAYBACK_SERVICE)); + registerReceiver(bluetoothStateUpdated, new IntentFilter(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)); + registerReceiver(audioBecomingNoisy, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)); + registerReceiver(skipCurrentEpisodeReceiver, new IntentFilter(ACTION_SKIP_CURRENT_EPISODE)); + registerReceiver(pausePlayCurrentEpisodeReceiver, new IntentFilter(ACTION_PAUSE_PLAY_CURRENT_EPISODE)); + registerReceiver(pauseResumeCurrentEpisodeReceiver, new IntentFilter(ACTION_RESUME_PLAY_CURRENT_EPISODE)); taskManager = new PlaybackServiceTaskManager(this, taskManagerCallback); flavorHelper = new PlaybackServiceFlavorHelper(PlaybackService.this, flavorHelperCallback); PreferenceManager.getDefaultSharedPreferences(this) .registerOnSharedPreferenceChangeListener(prefListener); - ComponentName eventReceiver = new ComponentName(getApplicationContext(), - MediaButtonReceiver.class); + ComponentName eventReceiver = new ComponentName(getApplicationContext(), MediaButtonReceiver.class); Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); mediaButtonIntent.setComponent(eventReceiver); PendingIntent buttonReceiverIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, PendingIntent.FLAG_UPDATE_CURRENT); @@ -309,7 +300,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { List queueItems = new ArrayList<>(); try { for (FeedItem feedItem : taskManager.getQueue()) { - if(feedItem.getMedia() != null) { + if (feedItem.getMedia() != null) { MediaDescriptionCompat mediaDescription = feedItem.getMedia().getMediaItem().getDescription(); queueItems.add(new MediaSessionCompat.QueueItem(mediaDescription, feedItem.getId())); } @@ -375,10 +366,10 @@ public class PlaybackService extends MediaBrowserServiceCompat { .setTitle(feed.getTitle()) .setDescription(feed.getDescription()) .setSubtitle(feed.getCustomTitle()); - if(feed.getImageLocation() != null) { + if (feed.getImageLocation() != null) { builder.setIconUri(Uri.parse(feed.getImageLocation())); } - if(feed.getLink() != null) { + if (feed.getLink() != null) { builder.setMediaUri(Uri.parse(feed.getLink())); } MediaDescriptionCompat description = builder.build(); @@ -401,13 +392,13 @@ public class PlaybackService extends MediaBrowserServiceCompat { e.printStackTrace(); } List feeds = DBReader.getFeedList(); - for (Feed feed: feeds) { + for (Feed feed : feeds) { mediaItems.add(createBrowsableMediaItemForFeed(feed)); } - } else if (parentId.equals(getResources().getString(R.string.queue_label))){ + } else if (parentId.equals(getResources().getString(R.string.queue_label))) { // Child List try { - for (FeedItem feedItem: taskManager.getQueue()) { + for (FeedItem feedItem : taskManager.getQueue()) { mediaItems.add(feedItem.getMedia().getMediaItem()); } } catch (InterruptedException e) { @@ -416,8 +407,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { } else if (parentId.startsWith("FeedId:")) { Long feedId = Long.parseLong(parentId.split(":")[1]); List feedItems = DBReader.getFeedItemList(DBReader.getFeed(feedId)); - for (FeedItem feedItem: feedItems) { - if(feedItem.getMedia() != null && feedItem.getMedia().getMediaItem() != null) { + for (FeedItem feedItem : feedItems) { + if (feedItem.getMedia() != null && feedItem.getMedia().getMediaItem() != null) { mediaItems.add(feedItem.getMedia().getMediaItem()); } } @@ -428,7 +419,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { @Override public IBinder onBind(Intent intent) { Log.d(TAG, "Received onBind event"); - if(intent.getAction() != null && TextUtils.equals(intent.getAction(), MediaBrowserServiceCompat.SERVICE_INTERFACE)) { + if (intent.getAction() != null && TextUtils.equals(intent.getAction(), MediaBrowserServiceCompat.SERVICE_INTERFACE)) { return super.onBind(intent); } else { return mBinder; @@ -467,8 +458,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD, 0); //If the user asks to play External Media, the casting session, if on, should end. flavorHelper.castDisconnect(playable instanceof ExternalMedia); - if(playable instanceof FeedMedia){ - playable = DBReader.getFeedMedia(((FeedMedia)playable).getId()); + if (playable instanceof FeedMedia) { + playable = DBReader.getFeedMedia(((FeedMedia) playable).getId()); } mediaPlayer.playMediaObject(playable, stream, startWhenPrepared, prepareImmediately); } @@ -514,7 +505,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { return true; case KeyEvent.KEYCODE_MEDIA_NEXT: - if(source == InputDevice.SOURCE_CLASS_NONE || + if (source == InputDevice.SOURCE_CLASS_NONE || UserPreferences.shouldHardwareButtonSkip()) { // assume the skip command comes from a notification or the lockscreen // a >| skip button should actually skip @@ -529,7 +520,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { mediaPlayer.seekDelta(UserPreferences.getFastForwardSecs() * 1000); return true; case KeyEvent.KEYCODE_MEDIA_PREVIOUS: - if(UserPreferences.shouldHardwarePreviousButtonRestart()) { + if (UserPreferences.shouldHardwarePreviousButtonRestart()) { // user wants to restart current episode mediaPlayer.seekTo(0); } else { @@ -657,8 +648,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { setupNotification(newInfo); started = true; // set sleep timer if auto-enabled - if(newInfo.oldPlayerStatus != null && newInfo.oldPlayerStatus != PlayerStatus.SEEKING && - SleepTimerPreferences.autoEnable() && !sleepTimerActive()) { + if (newInfo.oldPlayerStatus != null && newInfo.oldPlayerStatus != PlayerStatus.SEEKING && + SleepTimerPreferences.autoEnable() && !sleepTimerActive()) { setSleepTimer(SleepTimerPreferences.timerMillis(), SleepTimerPreferences.shakeToReset(), SleepTimerPreferences.vibrate()); } @@ -801,7 +792,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { Log.e(TAG, "Error handling the queue in order to retrieve the next item", e); return null; } - return (nextItem != null)? nextItem.getMedia() : null; + return (nextItem != null) ? nextItem.getMedia() : null; } @@ -830,7 +821,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { /** * This method processes the media object after its playback ended, either because it completed * or because a different media object was selected for playback. - * + *

* Even though these tasks aren't supposed to be resource intensive, a good practice is to * usually call this method on a background thread. * @@ -1030,6 +1021,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { /** * Updates the Media Session for the corresponding status. + * * @param playerStatus the current {@link PlayerStatus} */ private void updateMediaSession(final PlayerStatus playerStatus) { @@ -1105,8 +1097,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { // showRewindOnCompactNotification() corresponds to the "Set Lockscreen Buttons" // Settings in UI. // Hence, from user perspective, he/she is setting the buttons for Lockscreen - return ( UserPreferences.showRewindOnCompactNotification() && - (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) ); + return (UserPreferences.showRewindOnCompactNotification() && + (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)); } /** @@ -1158,7 +1150,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { PendingIntent.FLAG_UPDATE_CURRENT)); try { mediaSession.setMetadata(builder.build()); - } catch (OutOfMemoryError e) { + } catch (OutOfMemoryError e) { Log.e(TAG, "Setting media session metadata", e); builder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, null); mediaSession.setMetadata(builder.build()); @@ -1255,7 +1247,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { notificationBuilder.addAction(android.R.drawable.ic_media_rew, getString(R.string.rewind_label), rewindButtonPendingIntent); - if(UserPreferences.showRewindOnCompactNotification()) { + if (UserPreferences.showRewindOnCompactNotification()) { compactActionList.add(numActions); } numActions++; @@ -1282,7 +1274,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { notificationBuilder.addAction(android.R.drawable.ic_media_ff, getString(R.string.fast_forward_label), ffButtonPendingIntent); - if(UserPreferences.showFastForwardOnCompactNotification()) { + if (UserPreferences.showFastForwardOnCompactNotification()) { compactActionList.add(numActions); } numActions++; @@ -1293,7 +1285,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { notificationBuilder.addAction(android.R.drawable.ic_media_next, getString(R.string.skip_episode_label), skipButtonPendingIntent); - if(UserPreferences.showSkipOnCompactNotification()) { + if (UserPreferences.showSkipOnCompactNotification()) { compactActionList.add(numActions); } numActions++; @@ -1346,9 +1338,9 @@ public class PlaybackService extends MediaBrowserServiceCompat { * * @param fromMediaPlayer if true, the information is gathered from the current Media Player * and {@param playable} and {@param position} become irrelevant. - * @param playable the playable for which the current position should be saved, unless - * {@param fromMediaPlayer} is true. - * @param position the position that should be saved, unless {@param fromMediaPlayer} is true. + * @param playable the playable for which the current position should be saved, unless + * {@param fromMediaPlayer} is true. + * @param position the position that should be saved, unless {@param fromMediaPlayer} is true. */ private synchronized void saveCurrentPosition(boolean fromMediaPlayer, Playable playable, int position) { int duration; @@ -1416,7 +1408,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { String status = intent.getStringExtra("media_connection_status"); boolean isConnectedToCar = "media_connected".equals(status); Log.d(TAG, "Received Auto Connection update: " + status); - if(!isConnectedToCar) { + if (!isConnectedToCar) { Log.d(TAG, "Car was unplugged during playback."); pauseIfPauseOnDisconnect(); } else { @@ -1506,10 +1498,10 @@ public class PlaybackService extends MediaBrowserServiceCompat { transientPause = false; if (!bluetooth && UserPreferences.isUnpauseOnHeadsetReconnect()) { mediaPlayer.resume(); - } else if (bluetooth && UserPreferences.isUnpauseOnBluetoothReconnect()){ + } else if (bluetooth && UserPreferences.isUnpauseOnBluetoothReconnect()) { // let the user know we've started playback again... Vibrator v = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE); - if(v != null) { + if (v != null) { v.vibrate(500); } mediaPlayer.resume(); @@ -1590,7 +1582,9 @@ public class PlaybackService extends MediaBrowserServiceCompat { return mediaPlayer.getPlayerStatus(); } - public Playable getPlayable() { return mediaPlayer.getPlayable(); } + public Playable getPlayable() { + return mediaPlayer.getPlayable(); + } public boolean canSetSpeed() { return mediaPlayer.canSetSpeed(); @@ -1685,19 +1679,19 @@ public class PlaybackService extends MediaBrowserServiceCompat { public void onPlayFromMediaId(String mediaId, Bundle extras) { Log.d(TAG, "onPlayFromMediaId: mediaId: " + mediaId + " extras: " + extras.toString()); FeedMedia p = DBReader.getFeedMedia(Long.parseLong(mediaId)); - if(p != null) { + if (p != null) { mediaPlayer.playMediaObject(p, !p.localFileAvailable(), true, true); } } @Override - public void onPlayFromSearch (String query, Bundle extras) { + public void onPlayFromSearch(String query, Bundle extras) { Log.d(TAG, "onPlayFromSearch query=" + query + " extras=" + extras.toString()); - List results = FeedSearcher.performSearch(getBaseContext(),query,0); - for( SearchResult result : results) { + List results = FeedSearcher.performSearch(getBaseContext(), query, 0); + for (SearchResult result : results) { try { - FeedMedia p = ((FeedItem)(result.getComponent())).getMedia(); + FeedMedia p = ((FeedItem) (result.getComponent())).getMedia(); mediaPlayer.playMediaObject(p, !p.localFileAvailable(), true, true); return; } catch (Exception e) { @@ -1707,7 +1701,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { } } onPlay(); - return; } @Override @@ -1745,7 +1738,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { @Override public void onSkipToNext() { Log.d(TAG, "onSkipToNext()"); - if(UserPreferences.shouldHardwareButtonSkip()) { + if (UserPreferences.shouldHardwareButtonSkip()) { mediaPlayer.skip(); } else { seekDelta(UserPreferences.getFastForwardSecs() * 1000); @@ -1766,7 +1759,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { KeyEvent keyEvent = (KeyEvent) mediaButton.getExtras().get(Intent.EXTRA_KEY_EVENT); if (keyEvent != null && keyEvent.getAction() == KeyEvent.ACTION_DOWN && - keyEvent.getRepeatCount() == 0){ + keyEvent.getRepeatCount() == 0) { return handleKeycode(keyEvent.getKeyCode(), keyEvent.getSource()); } } @@ -1791,18 +1784,27 @@ public class PlaybackService extends MediaBrowserServiceCompat { } else { flavorHelper.onSharedPreference(key); } - }; + }; interface FlavorHelperCallback { PlaybackServiceMediaPlayer.PSMPCallback getMediaPlayerCallback(); + void setMediaPlayer(PlaybackServiceMediaPlayer mediaPlayer); + PlaybackServiceMediaPlayer getMediaPlayer(); + void setIsCasting(boolean isCasting); + void sendNotificationBroadcast(int type, int code); + void saveCurrentPosition(boolean fromMediaPlayer, Playable playable, int position); + void setupNotification(boolean connected, PlaybackServiceMediaPlayer.PSMPInfo info); + MediaSessionCompat getMediaSession(); + Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter); + void unregisterReceiver(BroadcastReceiver receiver); } @@ -1849,7 +1851,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { UserPreferences.isPersistNotify()) && android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { PlaybackService.this.setupNotification(info); - } else if (!UserPreferences.isPersistNotify()){ + } else if (!UserPreferences.isPersistNotify()) { PlaybackService.this.stopForeground(true); } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2c2bbe5f9..ea720f986 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip