Skip to content

Commit 96ad0ff

Browse files
committed
Simple playback status and controls in Android Auto
Expose a MediaBrowserService from within the existing PlayerService, and use the existing MediaSession for Auto. Empty media browser for now. To test, one needs to enable "Unknown sources" in Android Auto's developer settings. Issue: #1758
1 parent 8683ca7 commit 96ad0ff

3 files changed

Lines changed: 64 additions & 2 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@
5656
<intent-filter>
5757
<action android:name="android.intent.action.MEDIA_BUTTON" />
5858
</intent-filter>
59+
<intent-filter>
60+
<action android:name="android.media.browse.MediaBrowserService"/>
61+
</intent-filter>
5962
</service>
6063

6164
<activity

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

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,30 @@
2121

2222
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
2323

24-
import android.app.Service;
2524
import android.content.Context;
2625
import android.content.Intent;
2726
import android.os.Binder;
27+
import android.os.Bundle;
2828
import android.os.IBinder;
29+
import android.support.v4.media.MediaBrowserCompat.MediaItem;
2930
import android.util.Log;
3031

32+
import androidx.annotation.NonNull;
33+
import androidx.annotation.Nullable;
34+
import androidx.media.MediaBrowserServiceCompat;
35+
3136
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
3237

3338
import org.schabi.newpipe.player.mediabrowser.MediaBrowserConnector;
3439
import org.schabi.newpipe.player.mediasession.MediaSessionPlayerUi;
3540
import org.schabi.newpipe.util.ThemeHelper;
3641

42+
import java.util.List;
43+
3744
/**
3845
* One service for all players.
3946
*/
40-
public final class PlayerService extends Service {
47+
public final class PlayerService extends MediaBrowserServiceCompat {
4148
private static final String TAG = PlayerService.class.getSimpleName();
4249
private static final boolean DEBUG = Player.DEBUG;
4350

@@ -52,6 +59,8 @@ public final class PlayerService extends Service {
5259

5360
@Override
5461
public void onCreate() {
62+
super.onCreate();
63+
5564
if (DEBUG) {
5665
Log.d(TAG, "onCreate() called");
5766
}
@@ -145,6 +154,9 @@ protected void attachBaseContext(final Context base) {
145154

146155
@Override
147156
public IBinder onBind(final Intent intent) {
157+
if (SERVICE_INTERFACE.equals(intent.getAction())) {
158+
return super.onBind(intent);
159+
}
148160
return mBinder;
149161
}
150162

@@ -162,4 +174,18 @@ public Player getPlayer() {
162174
return PlayerService.this.player;
163175
}
164176
}
177+
178+
// MediaBrowserServiceCompat methods
179+
@Nullable
180+
@Override
181+
public BrowserRoot onGetRoot(@NonNull final String clientPackageName, final int clientUid,
182+
@Nullable final Bundle rootHints) {
183+
return mediaBrowserConnector.onGetRoot(clientPackageName, clientUid, rootHints);
184+
}
185+
186+
@Override
187+
public void onLoadChildren(@NonNull final String parentId,
188+
@NonNull final Result<List<MediaItem>> result) {
189+
mediaBrowserConnector.onLoadChildren(parentId, result);
190+
}
165191
}

app/src/main/java/org/schabi/newpipe/player/mediabrowser/MediaBrowserConnector.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
package org.schabi.newpipe.player.mediabrowser;
22

3+
import android.os.Bundle;
4+
import android.support.v4.media.MediaBrowserCompat;
5+
import android.support.v4.media.MediaBrowserCompat.MediaItem;
36
import android.support.v4.media.session.MediaSessionCompat;
7+
import android.util.Log;
48

59
import androidx.annotation.NonNull;
10+
import androidx.annotation.Nullable;
11+
import androidx.media.MediaBrowserServiceCompat;
12+
import androidx.media.MediaBrowserServiceCompat.Result;
613

714
import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector;
815

916
import org.schabi.newpipe.player.PlayerService;
1017

18+
import java.util.ArrayList;
19+
import java.util.List;
20+
1121
public class MediaBrowserConnector {
1222
private static final String TAG = MediaBrowserConnector.class.getSimpleName();
1323

@@ -20,6 +30,7 @@ public MediaBrowserConnector(@NonNull final PlayerService playerService) {
2030
mediaSession = new MediaSessionCompat(playerService, TAG);
2131
sessionConnector = new MediaSessionConnector(mediaSession);
2232
sessionConnector.setMetadataDeduplicationEnabled(true);
33+
playerService.setSessionToken(mediaSession.getSessionToken());
2334
}
2435

2536
public @NonNull MediaSessionConnector getSessionConnector() {
@@ -29,4 +40,26 @@ public MediaBrowserConnector(@NonNull final PlayerService playerService) {
2940
public void release() {
3041
mediaSession.release();
3142
}
43+
44+
@NonNull
45+
private static final String MY_MEDIA_ROOT_ID = "media_root_id";
46+
47+
@Nullable
48+
public MediaBrowserServiceCompat.BrowserRoot onGetRoot(@NonNull final String clientPackageName,
49+
final int clientUid,
50+
@Nullable final Bundle rootHints) {
51+
Log.d(TAG, String.format("MediaBrowserService.onGetRoot(%s, %s, %s)",
52+
clientPackageName, clientUid, rootHints));
53+
54+
return new MediaBrowserServiceCompat.BrowserRoot(MY_MEDIA_ROOT_ID, null);
55+
}
56+
57+
public void onLoadChildren(@NonNull final String parentId,
58+
@NonNull final Result<List<MediaItem>> result) {
59+
Log.d(TAG, String.format("MediaBrowserService.onLoadChildren(%s)", parentId));
60+
61+
final List<MediaBrowserCompat.MediaItem> mediaItems = new ArrayList<>();
62+
63+
result.sendResult(mediaItems);
64+
}
3265
}

0 commit comments

Comments
 (0)