Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[stable-3.14] Directly start foreground service #7409

Merged
merged 3 commits into from
Nov 23, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 37 additions & 5 deletions src/main/java/com/nextcloud/client/media/PlayerService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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"
}

Expand Down Expand Up @@ -74,7 +75,7 @@ class PlayerService : Service() {
}

override fun onStop() {
stopForeground(true)
stopServiceAndRemoveNotification(null)
}

override fun onError(error: PlayerError) {
Expand All @@ -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? {
Expand All @@ -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
Expand All @@ -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) {
Expand All @@ -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)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -955,4 +955,6 @@
<string name="oneHour">1 hour</string>
<string name="fourHours">4 hours</string>
<string name="thisWeek">This week</string>
<string name="player_stop">stop</string>
<string name="player_toggle">toggle</string>
</resources>