Skip to content

Commit de9fa98

Browse files
author
Chris Bellew
committed
Updated Chromecast playback to support Cinema Trailers. Improved display of playback control elements on smaller screens.
1 parent 1259da8 commit de9fa98

27 files changed

+453
-162
lines changed

mobile/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
</service>
5050
<activity
5151
android:name=".activities.NowPlayingActivity"
52-
android:configChanges="orientation|screenSize"
52+
android:configChanges="screenSize"
5353
android:label="@string/app_name" >
5454
<intent-filter>
5555
<action android:name="android.intent.action.SEND" />

mobile/src/main/java/com/atomjack/vcfp/CastPlayerManager.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ public interface CastListener {
176176
void onCastPlayerTimeUpdate(int seconds);
177177
void onCastPlayerPlaylistAdvance(PlexMedia media);
178178
void onCastPlayerState(PlayerState state, PlexMedia media);
179+
void onCastConnectionFailed();
179180
PlexMedia getNowPlayingMedia();
180181
};
181182

@@ -311,9 +312,12 @@ public void onDataMessageReceived(String message) {
311312
}
312313
} else if(obj.has("event") && obj.getString("event").equals("timeUpdate") && obj.has("currentTime")) {
313314
listener.onCastPlayerTimeUpdate(obj.getInt("currentTime"));
314-
} else if(obj.has("event") && obj.getString("event").equals("playlistAdvance") && obj.has("media")) {
315+
} else if(obj.has("event") && obj.getString("event").equals("playlistAdvance") && obj.has("media") && obj.has("type")) {
315316
Logger.d("[CastPlayerManager] playlistAdvance");
316-
nowPlayingMedia = VoiceControlForPlexApplication.gsonRead.fromJson(obj.getString("media"), PlexTrack.class);
317+
if(obj.getString("type").equals(PARAMS.MEDIA_TYPE_VIDEO))
318+
nowPlayingMedia = VoiceControlForPlexApplication.gsonRead.fromJson(obj.getString("media"), PlexVideo.class);
319+
else
320+
nowPlayingMedia = VoiceControlForPlexApplication.gsonRead.fromJson(obj.getString("media"), PlexTrack.class);
317321
listener.onCastPlayerPlaylistAdvance(nowPlayingMedia);
318322
} else if(obj.has("event") && obj.getString("event").equals("getPlaybackState") && obj.has("state")) {
319323
currentState = PlayerState.getState(obj.getString("state"));
@@ -383,6 +387,13 @@ public void onApplicationStatusChanged(String appStatus) {
383387
Logger.d("CastPlayerManager onApplicationStatusChanged: %s", appStatus);
384388
}
385389

390+
@Override
391+
public boolean onApplicationConnectionFailed(int errorCode) {
392+
Logger.d("[CastPlayerManager] onApplicationConnectionFailed: %d", errorCode);
393+
listener.onCastConnectionFailed();
394+
return false;
395+
}
396+
386397
@Override
387398
public void onVolumeChanged(double value, boolean isMute) {
388399
super.onVolumeChanged(value, isMute);
@@ -396,10 +407,6 @@ public void onCastDeviceDetected(final MediaRouter.RouteInfo info) {
396407
};
397408
}
398409

399-
public String getTranscodeUrl(PlexMedia media, Connection connection) {
400-
return getTranscodeUrl(media, connection, 0);
401-
}
402-
403410
public String getTranscodeUrl(PlexMedia media, Connection connection, int offset) {
404411
String url = connection.uri;
405412
url += String.format("/%s/:/transcode/universal/start?", media instanceof PlexVideo ? "video" : "audio");
@@ -463,15 +470,7 @@ public JSONObject buildMedia(Connection connection, int offset) {
463470
}
464471

465472
private String getPlaylistJson() {
466-
String json = "{}";
467-
if(nowPlayingMedia instanceof PlexTrack) {
468-
json = VoiceControlForPlexApplication.gsonWrite.toJson(nowPlayingAlbum);
469-
} else {
470-
ArrayList<PlexMedia> playlist = new ArrayList<PlexMedia>();
471-
playlist.add(nowPlayingMedia);
472-
json = VoiceControlForPlexApplication.gsonWrite.toJson(playlist);
473-
}
474-
return json;
473+
return VoiceControlForPlexApplication.gsonWrite.toJson(nowPlayingAlbum);
475474
}
476475

477476
public PlayerState getCurrentState() {

mobile/src/main/java/com/atomjack/vcfp/VoiceControlForPlexApplication.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
import java.util.HashMap;
7474
import java.util.Locale;
7575
import java.util.Map;
76+
import java.util.UUID;
7677
import java.util.concurrent.ConcurrentHashMap;
7778

7879
import cz.fhucho.android.util.SimpleDiskCache;
@@ -809,4 +810,13 @@ public static void SetWearMediaTitles(DataMap dataMap, PlexMedia media) {
809810
dataMap.putString(WearConstants.MEDIA_SUBTITLE, media.title);
810811
}
811812
}
813+
814+
public static String getUUID() {
815+
String uuid = VoiceControlForPlexApplication.getInstance().prefs.get(Preferences.UUID, null);
816+
if(uuid == null) {
817+
uuid = UUID.randomUUID().toString();
818+
VoiceControlForPlexApplication.getInstance().prefs.put(Preferences.UUID, uuid);
819+
}
820+
return uuid;
821+
}
812822
}

mobile/src/main/java/com/atomjack/vcfp/activities/CastActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ protected void onCreate(Bundle savedInstanceState) {
4747
new SendToDataLayerThread(WearConstants.FINISH, this).start();
4848
}
4949
// If just playing a single track, put the media into an array
50-
if(nowPlayingMedia.isMusic() && nowPlayingAlbum == null)
50+
if(nowPlayingAlbum == null)
5151
nowPlayingAlbum = Arrays.asList(nowPlayingMedia);
5252

5353
Logger.d("[CastActivity] starting up, action: %s, current state: %s", getIntent().getAction(), castPlayerManager.getCurrentState());

mobile/src/main/java/com/atomjack/vcfp/activities/MainActivity.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,22 @@ public void logout(MenuItem item) {
458458
feedback.m(R.string.logged_out);
459459
}
460460

461+
public void cinemaTrailers(MenuItem item) {
462+
AlertDialog.Builder builder = new AlertDialog.Builder(this);
463+
builder.setTitle(getString(R.string.cinema_trailers_title));
464+
final CharSequence[] items = {getString(R.string.none), "1", "2", "3", "4", "5"};
465+
int numTrailers = VoiceControlForPlexApplication.getInstance().prefs.get(Preferences.NUM_CINEMA_TRAILERS, 0);
466+
builder.setSingleChoiceItems(items, numTrailers, new DialogInterface.OnClickListener() {
467+
@Override
468+
public void onClick(DialogInterface dialog, int which) {
469+
Logger.d("clicked %d", which);
470+
VoiceControlForPlexApplication.getInstance().prefs.put(Preferences.NUM_CINEMA_TRAILERS, which);
471+
dialog.dismiss();
472+
}
473+
});
474+
builder.create().show();
475+
}
476+
461477
public void purchaseWear(MenuItem item) {
462478
showWearPurchaseRequired();
463479
}

mobile/src/main/java/com/atomjack/vcfp/activities/PlayerActivity.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,19 +94,19 @@ public void showNowPlaying() {
9494
public void showNowPlaying(boolean setView) {
9595
if (nowPlayingMedia instanceof PlexVideo) {
9696
PlexVideo video = (PlexVideo)nowPlayingMedia;
97-
if(video.isMovie()) {
98-
if(setView)
97+
if(video.isMovie() || video.isClip()) {
98+
if (setView)
9999
setContentView(R.layout.now_playing_movie);
100100

101-
TextView title = (TextView)findViewById(R.id.nowPlayingTitle);
101+
TextView title = (TextView) findViewById(R.id.nowPlayingTitle);
102102
title.setText(video.title);
103-
TextView genre = (TextView)findViewById(R.id.nowPlayingGenre);
103+
TextView genre = (TextView) findViewById(R.id.nowPlayingGenre);
104104
genre.setText(video.getGenres());
105-
TextView year = (TextView)findViewById(R.id.nowPlayingYear);
105+
TextView year = (TextView) findViewById(R.id.nowPlayingYear);
106106
year.setText(video.year);
107-
TextView duration = (TextView)findViewById(R.id.nowPlayingDuration);
107+
TextView duration = (TextView) findViewById(R.id.nowPlayingDuration);
108108
duration.setText(video.getDuration());
109-
TextView summary = (TextView)findViewById(R.id.nowPlayingSummary);
109+
TextView summary = (TextView) findViewById(R.id.nowPlayingSummary);
110110
summary.setText(video.summary);
111111
} else {
112112
if(setView)

mobile/src/main/java/com/atomjack/vcfp/activities/VCFPActivity.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,15 @@ public void onCastConnected(PlexClient _client) {
486486
// castPlayerManager.getPlaybackState();
487487
}
488488

489+
@Override
490+
public void onCastConnectionFailed() {
491+
Logger.d("[VCFPActivity] onCastConnectionFailed");
492+
setCastIconActive();
493+
if(castPlayerManager.mClient != null)
494+
feedback.e(getString(R.string.couldnt_connect_to), castPlayerManager.mClient.name);
495+
subscribing = false;
496+
}
497+
489498
@Override
490499
public void onCastPlayerState(PlayerState state, PlexMedia media) {
491500
mCurrentState = state;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.atomjack.vcfp.interfaces;
2+
3+
import com.atomjack.vcfp.model.MediaContainer;
4+
5+
public interface PlexPlayQueueHandler {
6+
public void onSuccess(MediaContainer mediaContainer);
7+
}

mobile/src/main/java/com/atomjack/vcfp/model/MediaContainer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ public class MediaContainer {
5353
@Attribute(required=false)
5454
public String art;
5555

56+
@Attribute(required=false)
57+
public String playQueueID;
58+
5659
public Timeline getTimeline(String type) {
5760
if(timelines != null) {
5861
for (Timeline t : timelines) {

mobile/src/main/java/com/atomjack/vcfp/model/PlexMedia.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,8 @@ class Part implements Parcelable {
282282
public List<Stream> streams = new ArrayList<Stream>();
283283
@Attribute(required=false)
284284
public String key;
285+
@Attribute(required=false)
286+
public int duration;
285287

286288
public Part() {
287289

@@ -292,6 +294,7 @@ public Part(Parcel in) {
292294
streams = new ArrayList<Stream>();
293295
in.readTypedList(streams, Stream.CREATOR);
294296
key = in.readString();
297+
duration = in.readInt();
295298
}
296299

297300
@Override
@@ -304,6 +307,7 @@ public void writeToParcel(Parcel out, int flags) {
304307
out.writeString(id);
305308
out.writeTypedList(streams);
306309
out.writeString(key);
310+
out.writeInt(duration);
307311
}
308312

309313
public static final Parcelable.Creator<Part> CREATOR = new Parcelable.Creator<Part>() {

0 commit comments

Comments
 (0)