summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorH. Lehmann <ByteHamster@users.noreply.github.com>2020-03-25 22:49:34 +0100
committerGitHub <noreply@github.com>2020-03-25 22:49:34 +0100
commitb5836650d18aa611b2fe2ca73d41ed58342c1e94 (patch)
tree8e427bd10df1ee6422df210910a879acff11dcdb /core/src
parentae906de06d1720331be1c64607cdb6011fc66ef5 (diff)
parentd87cc27c9bdfd7fa68df6e09bf184bd75393212b (diff)
downloadAntennaPod-b5836650d18aa611b2fe2ca73d41ed58342c1e94.zip
Merge pull request #3954 from ByteHamster/audioplayer-fragment
Convert AudioPlayer to fragment
Diffstat (limited to 'core/src')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java9
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java24
-rw-r--r--core/src/main/res/values/dimens.xml2
-rw-r--r--core/src/play/java/de/danoeh/antennapod/core/cast/CastButtonVisibilityManager.java120
-rw-r--r--core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java4
5 files changed, 133 insertions, 26 deletions
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 b92dd217d..63b6ee7e1 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
@@ -182,11 +182,6 @@ public class PlaybackService extends MediaBrowserServiceCompat {
public static final int NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED = 9;
/**
- * Send a message to the user (with provided String resource id)
- */
- public static final int NOTIFICATION_TYPE_SHOW_TOAST = 10;
-
- /**
* Returned by getPositionSafe() or getDurationSafe() if the playbackService
* is in an invalid state.
*/
@@ -1218,7 +1213,6 @@ public class PlaybackService extends MediaBrowserServiceCompat {
notificationBuilder.setCasting(isCasting);
notificationBuilder.updatePosition(getCurrentPosition(), getCurrentPlaybackSpeed());
- Log.d(TAG, "setupNotification: startForeground" + playerStatus);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
startForegroundIfPlaying(playerStatus);
@@ -1236,10 +1230,12 @@ public class PlaybackService extends MediaBrowserServiceCompat {
}
private void startForegroundIfPlaying(@NonNull PlayerStatus status) {
+ Log.d(TAG, "startForegroundIfPlaying: " + status);
if (stateManager.hasReceivedValidStartCommand()) {
if (isCasting || status == PlayerStatus.PLAYING || status == PlayerStatus.PREPARING
|| status == PlayerStatus.SEEKING) {
stateManager.startForeground(NOTIFICATION_ID, notificationBuilder.build());
+ Log.d(TAG, "foreground");
} else {
stateManager.stopForeground(false);
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
@@ -1781,6 +1777,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
@Override
public void setIsCasting(boolean isCasting) {
PlaybackService.isCasting = isCasting;
+ stateManager.validStartCommandWasReceived();
}
@Override
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java
index a11406171..1f77d0af0 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/playback/PlaybackController.java
@@ -21,6 +21,7 @@ import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;
+import de.danoeh.antennapod.core.event.MessageEvent;
import de.danoeh.antennapod.core.util.ThemeUtils;
import java.util.concurrent.ScheduledThreadPoolExecutor;
@@ -333,8 +334,6 @@ public class PlaybackController {
case PlaybackService.NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED:
onSetSpeedAbilityChanged();
break;
- case PlaybackService.NOTIFICATION_TYPE_SHOW_TOAST:
- postStatusMsg(code, true);
}
}
@@ -411,11 +410,10 @@ public class PlaybackController {
Log.d(TAG, "status: " + status.toString());
switch (status) {
case ERROR:
- postStatusMsg(R.string.player_error_msg, false);
+ EventBus.getDefault().post(new MessageEvent(activity.getString(R.string.player_error_msg)));
handleError(MediaPlayer.MEDIA_ERROR_UNKNOWN);
break;
case PAUSED:
- clearStatusMsg();
checkMediaInfoLoaded();
onPositionObserverUpdate();
updatePlayButtonAppearance(playResource, playText);
@@ -425,7 +423,6 @@ public class PlaybackController {
}
break;
case PLAYING:
- clearStatusMsg();
checkMediaInfoLoaded();
if (!PlaybackService.isCasting() &&
PlaybackService.getCurrentMediaType() == MediaType.VIDEO) {
@@ -435,7 +432,6 @@ public class PlaybackController {
updatePlayButtonAppearance(pauseResource, pauseText);
break;
case PREPARING:
- postStatusMsg(R.string.player_preparing_msg, false);
checkMediaInfoLoaded();
if (playbackService != null) {
if (playbackService.isStartWhenPrepared()) {
@@ -446,21 +442,17 @@ public class PlaybackController {
}
break;
case STOPPED:
- postStatusMsg(R.string.player_stopped_msg, false);
break;
case PREPARED:
checkMediaInfoLoaded();
- postStatusMsg(R.string.player_ready_msg, false);
updatePlayButtonAppearance(playResource, playText);
onPositionObserverUpdate();
break;
case SEEKING:
onPositionObserverUpdate();
- postStatusMsg(R.string.player_seeking_msg, false);
break;
case INITIALIZED:
checkMediaInfoLoaded();
- clearStatusMsg();
updatePlayButtonAppearance(playResource, playText);
break;
}
@@ -482,10 +474,6 @@ public class PlaybackController {
return null;
}
- public void postStatusMsg(int msg, boolean showToast) {}
-
- public void clearStatusMsg() {}
-
public boolean loadMediaInfo() {
return false;
}
@@ -599,8 +587,8 @@ public class PlaybackController {
public int getPosition() {
if (playbackService != null) {
return playbackService.getCurrentPosition();
- } else if (media != null) {
- return media.getPosition();
+ } else if (getMedia() != null) {
+ return getMedia().getPosition();
} else {
return PlaybackService.INVALID_TIME;
}
@@ -609,8 +597,8 @@ public class PlaybackController {
public int getDuration() {
if (playbackService != null) {
return playbackService.getDuration();
- } else if (media != null) {
- return media.getDuration();
+ } else if (getMedia() != null) {
+ return getMedia().getDuration();
} else {
return PlaybackService.INVALID_TIME;
}
diff --git a/core/src/main/res/values/dimens.xml b/core/src/main/res/values/dimens.xml
index 5083eb749..cfb272ad9 100644
--- a/core/src/main/res/values/dimens.xml
+++ b/core/src/main/res/values/dimens.xml
@@ -3,7 +3,7 @@
<dimen name="widget_margin">0dp</dimen>
<dimen name="thumbnail_length">70dp</dimen>
- <dimen name="external_player_height">56dp</dimen>
+ <dimen name="external_player_height">64dp</dimen>
<dimen name="enc_icons_size">20dp</dimen>
<dimen name="text_size_micro">12sp</dimen>
<dimen name="text_size_small">14sp</dimen>
diff --git a/core/src/play/java/de/danoeh/antennapod/core/cast/CastButtonVisibilityManager.java b/core/src/play/java/de/danoeh/antennapod/core/cast/CastButtonVisibilityManager.java
new file mode 100644
index 000000000..527a652e3
--- /dev/null
+++ b/core/src/play/java/de/danoeh/antennapod/core/cast/CastButtonVisibilityManager.java
@@ -0,0 +1,120 @@
+package de.danoeh.antennapod.core.cast;
+
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import androidx.core.view.MenuItemCompat;
+import de.danoeh.antennapod.core.R;
+
+public class CastButtonVisibilityManager {
+ private static final String TAG = "CastBtnVisibilityMgr";
+ private final CastManager castManager;
+ private volatile boolean prefEnabled = false;
+ private volatile boolean viewRequested = false;
+ private volatile boolean resumed = false;
+ private volatile boolean connected = false;
+ private volatile int showAsAction = MenuItem.SHOW_AS_ACTION_IF_ROOM;
+ private Menu menu;
+ public SwitchableMediaRouteActionProvider mediaRouteActionProvider;
+
+ public CastButtonVisibilityManager(CastManager castManager) {
+ this.castManager = castManager;
+ }
+
+ public synchronized void setPrefEnabled(boolean newValue) {
+ if (prefEnabled != newValue && resumed && (viewRequested || connected)) {
+ if (newValue) {
+ castManager.incrementUiCounter();
+ } else {
+ castManager.decrementUiCounter();
+ }
+ }
+ prefEnabled = newValue;
+ if (mediaRouteActionProvider != null) {
+ mediaRouteActionProvider.setEnabled(prefEnabled && (viewRequested || connected));
+ }
+ }
+
+ public synchronized void setResumed(boolean newValue) {
+ if (resumed == newValue) {
+ Log.e(TAG, "resumed should never change to the same value");
+ return;
+ }
+ resumed = newValue;
+ if (prefEnabled && (viewRequested || connected)) {
+ if (resumed) {
+ castManager.incrementUiCounter();
+ } else {
+ castManager.decrementUiCounter();
+ }
+ }
+ }
+
+ public synchronized void setViewRequested(boolean newValue) {
+ if (viewRequested != newValue && resumed && prefEnabled && !connected) {
+ if (newValue) {
+ castManager.incrementUiCounter();
+ } else {
+ castManager.decrementUiCounter();
+ }
+ }
+ viewRequested = newValue;
+ if (mediaRouteActionProvider != null) {
+ mediaRouteActionProvider.setEnabled(prefEnabled && (viewRequested || connected));
+ }
+ }
+
+ public synchronized void setConnected(boolean newValue) {
+ if (connected != newValue && resumed && prefEnabled && !prefEnabled) {
+ if (newValue) {
+ castManager.incrementUiCounter();
+ } else {
+ castManager.decrementUiCounter();
+ }
+ }
+ connected = newValue;
+ if (mediaRouteActionProvider != null) {
+ mediaRouteActionProvider.setEnabled(prefEnabled && (viewRequested || connected));
+ }
+ }
+
+ public synchronized boolean shouldEnable() {
+ return prefEnabled && viewRequested;
+ }
+
+ public void setMenu(Menu menu) {
+ setViewRequested(false);
+ showAsAction = MenuItem.SHOW_AS_ACTION_IF_ROOM;
+ this.menu = menu;
+ setShowAsAction();
+ }
+
+ public void requestCastButton(int showAsAction) {
+ setViewRequested(true);
+ this.showAsAction = showAsAction;
+ setShowAsAction();
+ }
+
+ public void onConnected() {
+ setConnected(true);
+ setShowAsAction();
+ }
+
+ public void onDisconnected() {
+ setConnected(false);
+ setShowAsAction();
+ }
+
+ private void setShowAsAction() {
+ if (menu == null) {
+ Log.d(TAG, "setShowAsAction() without a menu");
+ return;
+ }
+ MenuItem item = menu.findItem(R.id.media_route_menu_item);
+ if (item == null) {
+ Log.e(TAG, "setShowAsAction(), but cast button not inflated");
+ return;
+ }
+ MenuItemCompat.setShowAsAction(item, connected ? MenuItem.SHOW_AS_ACTION_ALWAYS : showAsAction);
+ }
+}
diff --git a/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java b/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java
index c32ba2385..31e955017 100644
--- a/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java
+++ b/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java
@@ -26,9 +26,11 @@ import java.util.concurrent.TimeoutException;
import de.danoeh.antennapod.core.cast.CastConsumer;
import de.danoeh.antennapod.core.cast.CastManager;
import de.danoeh.antennapod.core.cast.DefaultCastConsumer;
+import de.danoeh.antennapod.core.event.MessageEvent;
import de.danoeh.antennapod.core.feed.MediaType;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.util.NetworkUtils;
+import org.greenrobot.eventbus.EventBus;
/**
* Class intended to work along PlaybackService and provide support for different flavors.
@@ -106,7 +108,7 @@ public class PlaybackServiceFlavorHelper {
}
switch (code) {
case RemotePSMP.CAST_ERROR:
- callback.sendNotificationBroadcast(PlaybackService.NOTIFICATION_TYPE_SHOW_TOAST, resourceId);
+ EventBus.getDefault().post(new MessageEvent(context.getString(resourceId)));
return true;
case RemotePSMP.CAST_ERROR_PRIORITY_HIGH:
Toast.makeText(context, resourceId, Toast.LENGTH_SHORT).show();