diff --git a/src/main/java/com/nextcloud/client/media/PlayerService.kt b/src/main/java/com/nextcloud/client/media/PlayerService.kt
index d4a4246c1e85..e708d8b09d60 100644
--- a/src/main/java/com/nextcloud/client/media/PlayerService.kt
+++ b/src/main/java/com/nextcloud/client/media/PlayerService.kt
@@ -35,7 +35,7 @@ import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.ui.notifications.NotificationUtils
import com.owncloud.android.utils.ThemeUtils
import dagger.android.AndroidInjection
-import java.lang.IllegalArgumentException
+import java.util.Locale
import javax.inject.Inject
class PlayerService : Service() {
@@ -47,6 +47,7 @@ class PlayerService : Service() {
const val EXTRA_START_POSITION_MS = "START_POSITION_MS"
const val ACTION_PLAY = "PLAY"
const val ACTION_STOP = "STOP"
+ const val ACTION_TOGGLE = "TOGGLE"
const val ACTION_STOP_FILE = "STOP_FILE"
}
@@ -74,7 +75,7 @@ class PlayerService : Service() {
}
override fun onStop() {
- stopForeground(true)
+ stopServiceAndRemoveNotification(null)
}
override fun onError(error: PlayerError) {
@@ -97,10 +98,20 @@ class PlayerService : Service() {
player = Player(applicationContext, clientFactory, playerListener, audioManager)
notificationBuilder = NotificationCompat.Builder(this)
notificationBuilder.color = ThemeUtils.primaryColor(this)
+
val stop = Intent(this, PlayerService::class.java)
stop.action = ACTION_STOP
val pendingStop = PendingIntent.getService(this, 0, stop, 0)
- notificationBuilder.addAction(0, "STOP", pendingStop)
+ notificationBuilder.addAction(0, getString(R.string.player_stop).toUpperCase(Locale.getDefault()), pendingStop)
+
+ val toggle = Intent(this, PlayerService::class.java)
+ toggle.action = ACTION_TOGGLE
+ val pendingToggle = PendingIntent.getService(this, 0, toggle, 0)
+ notificationBuilder.addAction(
+ 0,
+ getString(R.string.player_toggle).toUpperCase(Locale.getDefault()),
+ pendingToggle
+ )
}
override fun onBind(intent: Intent?): IBinder? {
@@ -112,10 +123,19 @@ class PlayerService : Service() {
ACTION_PLAY -> onActionPlay(intent)
ACTION_STOP -> onActionStop()
ACTION_STOP_FILE -> onActionStopFile(intent.extras)
+ ACTION_TOGGLE -> onActionToggle()
}
return START_NOT_STICKY
}
+ private fun onActionToggle() {
+ if (player.isPlaying) {
+ player.pause()
+ } else {
+ player.start()
+ }
+ }
+
private fun onActionPlay(intent: Intent) {
val user: User = intent.getParcelableExtra(EXTRA_USER) as User
val file: OCFile = intent.getParcelableExtra(EXTRA_FILE) as OCFile
@@ -126,12 +146,13 @@ class PlayerService : Service() {
}
private fun onActionStop() {
- player.stop()
+ stopServiceAndRemoveNotification(null)
}
private fun onActionStopFile(args: Bundle?) {
val file: OCFile = args?.getParcelable(EXTRA_FILE) ?: throw IllegalArgumentException("Missing file argument")
- player.stop(file)
+
+ stopServiceAndRemoveNotification(file)
}
private fun startForeground(currentFile: OCFile) {
@@ -149,4 +170,15 @@ class PlayerService : Service() {
startForeground(R.string.media_notif_ticker, notificationBuilder.build())
}
+
+ private fun stopServiceAndRemoveNotification(file: OCFile?) {
+ if (file == null) {
+ player.stop()
+ } else {
+ player.stop(file)
+ }
+
+ stopSelf()
+ stopForeground(true)
+ }
}
diff --git a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java
index bd57c3728862..ab3ff9be0ab1 100644
--- a/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java
+++ b/src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java
@@ -317,14 +317,19 @@ public void onStart() {
Log_OC.v(TAG, "onStart");
OCFile file = getFile();
if (file != null) {
+ // bind to any existing player
+ mMediaPlayerServiceConnection.bind();
+
if (MimeTypeUtil.isAudio(file)) {
mMediaController.setMediaPlayer(mMediaPlayerServiceConnection);
- mMediaPlayerServiceConnection.bind();
mMediaPlayerServiceConnection.start(user, file, mAutoplay, mSavedPlaybackPosition);
mMultiListContainer.setVisibility(View.GONE);
mPreviewContainer.setVisibility(View.VISIBLE);
} else if (MimeTypeUtil.isVideo(file)) {
- stopAudio();
+ if (mMediaPlayerServiceConnection.isConnected()) {
+ // always stop player
+ stopAudio();
+ }
playVideo();
}
}
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 8025da513514..4f5f6e28d827 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -945,4 +945,6 @@
4 hours
This week
Media
+ stop
+ toggle