Skip to content

Commit 8786d82

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 73aebc1 commit 8786d82

4 files changed

Lines changed: 71 additions & 27 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 & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,17 @@ public class MediaSessionPlayerUi extends PlayerUi
2828
implements SharedPreferences.OnSharedPreferenceChangeListener {
2929
private static final String TAG = "MediaSessUi";
3030

31-
private MediaSessionCompat mediaSession;
32-
private MediaSessionConnector sessionConnector;
31+
private final @NonNull MediaSessionCompat mediaSession;
32+
private final @NonNull MediaSessionConnector sessionConnector;
3333

3434
private final String ignoreHardwareMediaButtonsKey;
3535
private boolean shouldIgnoreHardwareMediaButtons = false;
3636

37-
public MediaSessionPlayerUi(@NonNull final Player player) {
37+
public MediaSessionPlayerUi(@NonNull final Player player,
38+
@NonNull final MediaSessionConnector sessionConnector) {
3839
super(player);
40+
this.mediaSession = sessionConnector.mediaSession;
41+
this.sessionConnector = sessionConnector;
3942
ignoreHardwareMediaButtonsKey =
4043
context.getString(R.string.ignore_hardware_media_buttons_key);
4144
}
@@ -45,10 +48,8 @@ public void initPlayer() {
4548
super.initPlayer();
4649
destroyPlayer(); // release previously used resources
4750

48-
mediaSession = new MediaSessionCompat(context, TAG);
4951
mediaSession.setActive(true);
5052

51-
sessionConnector = new MediaSessionConnector(mediaSession);
5253
sessionConnector.setQueueNavigator(new PlayQueueNavigator(mediaSession, player));
5354
sessionConnector.setPlayer(getForwardingPlayer());
5455

@@ -61,34 +62,27 @@ public void initPlayer() {
6162
updateShouldIgnoreHardwareMediaButtons(player.getPrefs());
6263
player.getPrefs().registerOnSharedPreferenceChangeListener(this);
6364

64-
sessionConnector.setMetadataDeduplicationEnabled(true);
6565
sessionConnector.setMediaMetadataProvider(exoPlayer -> buildMediaMetadata());
6666
}
6767

6868
@Override
6969
public void destroyPlayer() {
7070
super.destroyPlayer();
7171
player.getPrefs().unregisterOnSharedPreferenceChangeListener(this);
72-
if (sessionConnector != null) {
73-
sessionConnector.setMediaButtonEventHandler(null);
74-
sessionConnector.setPlayer(null);
75-
sessionConnector.setQueueNavigator(null);
76-
sessionConnector = null;
77-
}
78-
if (mediaSession != null) {
79-
mediaSession.setActive(false);
80-
mediaSession.release();
81-
mediaSession = null;
82-
}
72+
sessionConnector.setMediaButtonEventHandler(null);
73+
sessionConnector.setPlayer(null);
74+
sessionConnector.setQueueNavigator(null);
75+
sessionConnector.setMediaMetadataProvider(null);
76+
77+
mediaSession.setActive(false);
8378
}
8479

8580
@Override
8681
public void onThumbnailLoaded(@Nullable final Bitmap bitmap) {
8782
super.onThumbnailLoaded(bitmap);
88-
if (sessionConnector != null) {
89-
// the thumbnail is now loaded: invalidate the metadata to trigger a metadata update
90-
sessionConnector.invalidateMediaSessionMetadata();
91-
}
83+
84+
// the thumbnail is now loaded: invalidate the metadata to trigger a metadata update
85+
sessionConnector.invalidateMediaSessionMetadata();
9286
}
9387

9488

@@ -111,7 +105,7 @@ public void handleMediaButtonIntent(final Intent intent) {
111105
}
112106

113107
public Optional<MediaSessionCompat.Token> getSessionToken() {
114-
return Optional.ofNullable(mediaSession).map(MediaSessionCompat::getSessionToken);
108+
return Optional.of(mediaSession.getSessionToken());
115109
}
116110

117111

0 commit comments

Comments
 (0)