Skip to content

Commit 8683ca7

Browse files
committed
Keep MediaSessionCompat and MediaSessionConnector in a separate class
These objects need to live beyond the player for supporting MediaBrowserServiceCompat and Android Auto, so they need to move outside of the MediaSessionPlayerUi class.
1 parent ca421c2 commit 8683ca7

4 files changed

Lines changed: 71 additions & 26 deletions

File tree

app/src/main/java/org/schabi/newpipe/player/Player.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ public Player(@NonNull final PlayerService service) {
275275
// notification ui in the UIs list, since the notification depends on the media session in
276276
// PlayerUi#initPlayer(), and UIs.call() guarantees UI order is preserved.
277277
UIs = new PlayerUiList(
278-
new MediaSessionPlayerUi(this),
278+
new MediaSessionPlayerUi(this, service.getSessionConnector()),
279279
new NotificationPlayerUi(this)
280280
);
281281
}

app/src/main/java/org/schabi/newpipe/player/PlayerService.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@
2828
import android.os.IBinder;
2929
import android.util.Log;
3030

31+
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
32+
33+
import org.schabi.newpipe.player.mediabrowser.MediaBrowserConnector;
3134
import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi;
3235
import org.schabi.newpipe.util.ThemeHelper;
3336

34-
3537
/**
3638
* One service for all players.
3739
*/
@@ -41,8 +43,8 @@ public final class PlayerService extends Service {
4143

4244
private Player player;
4345

44-
private final IBinder mBinder = new PlayerService.LocalBinder();
45-
46+
private final IBinder mBinder = new LocalBinder();
47+
private MediaBrowserConnector mediaBrowserConnector;
4648

4749
/*//////////////////////////////////////////////////////////////////////////
4850
// Service's LifeCycle
@@ -56,7 +58,14 @@ public void onCreate() {
5658
assureCorrectAppLanguage(this);
5759
ThemeHelper.setTheme(this);
5860

59-
player = new Player(this);
61+
mediaBrowserConnector = new MediaBrowserConnector(this);
62+
}
63+
64+
private void initializePlayer() {
65+
if (player == null) {
66+
assert mediaBrowserConnector != null;
67+
player = new Player(this);
68+
}
6069
}
6170

6271
@Override
@@ -73,6 +82,7 @@ public int onStartCommand(final Intent intent, final int flags, final int startI
7382
return START_NOT_STICKY;
7483
}
7584

85+
initializePlayer();
7686
player.handleIntent(intent);
7787
player.UIs().get(MediaSessionPlayerUi.class)
7888
.ifPresent(ui -> ui.handleMediaButtonIntent(intent));
@@ -110,6 +120,10 @@ public void onDestroy() {
110120
Log.d(TAG, "destroy() called");
111121
}
112122
cleanup();
123+
if (mediaBrowserConnector != null) {
124+
mediaBrowserConnector.release();
125+
mediaBrowserConnector = null;
126+
}
113127
}
114128

115129
private void cleanup() {
@@ -134,6 +148,10 @@ public IBinder onBind(final Intent intent) {
134148
return mBinder;
135149
}
136150

151+
public MediaSessionConnector getSessionConnector() {
152+
return mediaBrowserConnector.getSessionConnector();
153+
}
154+
137155
public class LocalBinder extends Binder {
138156

139157
public PlayerService getService() {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.schabi.newpipe.player.mediabrowser;
2+
3+
import android.support.v4.media.session.MediaSessionCompat;
4+
5+
import androidx.annotation.NonNull;
6+
7+
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
8+
9+
import org.schabi.newpipe.player.PlayerService;
10+
11+
public class MediaBrowserConnector {
12+
private static final String TAG = MediaBrowserConnector.class.getSimpleName();
13+
14+
private final PlayerService playerService;
15+
private final @NonNull MediaSessionConnector sessionConnector;
16+
private final @NonNull MediaSessionCompat mediaSession;
17+
18+
public MediaBrowserConnector(@NonNull final PlayerService playerService) {
19+
this.playerService = playerService;
20+
mediaSession = new MediaSessionCompat(playerService, TAG);
21+
sessionConnector = new MediaSessionConnector(mediaSession);
22+
sessionConnector.setMetadataDeduplicationEnabled(true);
23+
}
24+
25+
public @NonNull MediaSessionConnector getSessionConnector() {
26+
return sessionConnector;
27+
}
28+
29+
public void release() {
30+
mediaSession.release();
31+
}
32+
}

app/src/main/java/org/schabi/newpipe/player/mediasession/MediaSessionPlayerUi.java

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,51 +26,46 @@
2626
public class MediaSessionPlayerUi extends PlayerUi {
2727
private static final String TAG = "MediaSessUi";
2828

29-
private MediaSessionCompat mediaSession;
30-
private MediaSessionConnector sessionConnector;
29+
private final @NonNull MediaSessionCompat mediaSession;
30+
private final @NonNull MediaSessionConnector sessionConnector;
3131

32-
public MediaSessionPlayerUi(@NonNull final Player player) {
32+
public MediaSessionPlayerUi(@NonNull final Player player,
33+
@NonNull final MediaSessionConnector sessionConnector) {
3334
super(player);
35+
this.mediaSession = sessionConnector.mediaSession;
36+
this.sessionConnector = sessionConnector;
3437
}
3538

3639
@Override
3740
public void initPlayer() {
3841
super.initPlayer();
3942
destroyPlayer(); // release previously used resources
4043

41-
mediaSession = new MediaSessionCompat(context, TAG);
4244
mediaSession.setActive(true);
4345

44-
sessionConnector = new MediaSessionConnector(mediaSession);
4546
sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, player));
4647
sessionConnector.setPlayer(getForwardingPlayer());
4748

48-
sessionConnector.setMetadataDeduplicationEnabled(true);
4949
sessionConnector.setMediaMetadataProvider(exoPlayer -> buildMediaMetadata());
5050
}
5151

5252
@Override
5353
public void destroyPlayer() {
5454
super.destroyPlayer();
55-
if (sessionConnector != null) {
56-
sessionConnector.setPlayer(null);
57-
sessionConnector.setQueueNavigator(null);
58-
sessionConnector = null;
59-
}
60-
if (mediaSession != null) {
61-
mediaSession.setActive(false);
62-
mediaSession.release();
63-
mediaSession = null;
64-
}
55+
56+
sessionConnector.setPlayer(null);
57+
sessionConnector.setQueueNavigator(null);
58+
sessionConnector.setMediaMetadataProvider(null);
59+
60+
mediaSession.setActive(false);
6561
}
6662

6763
@Override
6864
public void onThumbnailLoaded(@Nullable final Bitmap bitmap) {
6965
super.onThumbnailLoaded(bitmap);
70-
if (sessionConnector != null) {
71-
// the thumbnail is now loaded: invalidate the metadata to trigger a metadata update
72-
sessionConnector.invalidateMediaSessionMetadata();
73-
}
66+
67+
// the thumbnail is now loaded: invalidate the metadata to trigger a metadata update
68+
sessionConnector.invalidateMediaSessionMetadata();
7469
}
7570

7671

@@ -79,7 +74,7 @@ public void handleMediaButtonIntent(final Intent intent) {
7974
}
8075

8176
public Optional<MediaSessionCompat.Token> getSessionToken() {
82-
return Optional.ofNullable(mediaSession).map(MediaSessionCompat::getSessionToken);
77+
return Optional.of(mediaSession.getSessionToken());
8378
}
8479

8580

0 commit comments

Comments
 (0)