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