Skip to content

Commit ea6ab2a

Browse files
author
Chris Bellew
committed
Bunch of fixes.
1 parent af7f796 commit ea6ab2a

24 files changed

+370
-112
lines changed

Voice Control For Plex/src/main/AndroidManifest.xml

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools"
44
package="com.atomjack.vcfp"
5-
android:versionCode="20"
6-
android:versionName="1.9.0b1" >
5+
android:versionCode="21"
6+
android:versionName="1.9.0b2" >
77

88
<uses-permission android:name="com.mohammadag.googlesearchapi.permission.ACCESS_GGOGLE_SEARCH_API" />
99
<uses-permission android:name="android.permission.INTERNET" />
@@ -98,21 +98,6 @@
9898
android:name="android.appwidget.provider"
9999
android:resource="@layout/listener_widget" />
100100
</receiver>
101-
<activity
102-
android:name="com.google.sample.castcompanionlibrary.cast.player.VideoCastControllerActivity"
103-
android:label="@string/app_name"
104-
android:launchMode="singleTask"
105-
android:parentActivityName="com.atomjack.vcfp.activities.CastActivity"
106-
android:screenOrientation="portrait"
107-
android:theme="@style/Theme.CastVideoOverlayYellow" >
108-
<meta-data
109-
android:name="android.support.PARENT_ACTIVITY"
110-
android:value="com.google.sample.cast.refplayer.VideoBrowserActivity" />
111-
112-
<intent-filter>
113-
<action android:name="android.intent.action.MAIN" />
114-
</intent-filter>
115-
</activity>
116101
<service
117102
android:name=".services.PlexControlService"
118103
android:exported="false"/>

Voice Control For Plex/src/main/java/com/atomjack/vcfp/CastPlayerManager.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public static final class PARAMS {
3535
public static final String KEY = "key";
3636
public static final String THUMB = "thumb";
3737
public static final String OFFSET = "offset";
38+
public static final String RESUME="resume";
39+
3840
public static final String SRC = "src";
3941
public static final String ART = "art";
4042

@@ -169,7 +171,7 @@ public void seekTo(int seconds) {
169171
obj.put(PARAMS.ACTION, PARAMS.ACTION_SEEK);
170172
if(nowPlayingMedia instanceof PlexVideo)
171173
obj.put(PARAMS.SRC, getTranscodeUrl(nowPlayingMedia, seconds));
172-
obj.put(PARAMS.OFFSET, seconds);
174+
obj.put(PARAMS.RESUME, VoiceControlForPlexApplication.getInstance().prefs.get(Preferences.RESUME, false));
173175
sendMessage(obj);
174176
} catch (Exception ex) {}
175177

@@ -369,7 +371,7 @@ public JSONObject buildMedia(int offset) {
369371
data.put(PARAMS.PLEX_USERNAME, VoiceControlForPlexApplication.getInstance().prefs.getString(Preferences.PLEX_USERNAME));
370372
}
371373
data.put(PARAMS.MEDIA_TYPE, nowPlayingMedia instanceof PlexVideo ? PARAMS.MEDIA_TYPE_VIDEO : PARAMS.MEDIA_TYPE_AUDIO);
372-
data.put(PARAMS.OFFSET, offset);
374+
data.put(PARAMS.RESUME, VoiceControlForPlexApplication.getInstance().prefs.get(Preferences.RESUME, false));
373375
data.put(PARAMS.CLIENT, VoiceControlForPlexApplication.gsonWrite.toJson(mClient));
374376
data.put(PARAMS.SRC, getTranscodeUrl(nowPlayingMedia, offset));
375377
data.put(PARAMS.PLAYLIST, getPlaylistJson());

Voice Control For Plex/src/main/java/com/atomjack/vcfp/VoiceControlForPlexApplication.java

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.atomjack.vcfp.model.PlexClient;
3535
import com.atomjack.vcfp.model.PlexMedia;
3636
import com.atomjack.vcfp.model.PlexServer;
37+
import com.atomjack.vcfp.model.PlexTrack;
3738
import com.atomjack.vcfp.services.PlexControlService;
3839
import com.google.gson.Gson;
3940
import com.google.gson.GsonBuilder;
@@ -89,6 +90,7 @@ public static enum NOTIFICATION_STATUS {
8990

9091
private NotificationManager mNotifyMgr;
9192
private Bitmap notificationBitmap = null;
93+
private Bitmap notificationBitmapBig = null;
9294

9395
public final static class Intent {
9496
public final static String GDMRECEIVE = "com.atomjack.vcfp.intent.gdmreceive";
@@ -354,40 +356,42 @@ public void setNotification(final PlexClient client, final PlayerState currentSt
354356
setNotification(client, currentState, media, false);
355357
}
356358

357-
public void setNotification(final PlexClient client, final PlayerState currentState, final PlexMedia media, boolean skipThumb) {
358-
Logger.d("Setting notification, client: %s, media: %s", client, media);
359-
if(notificationStatus == NOTIFICATION_STATUS.off) {
360-
notificationStatus = NOTIFICATION_STATUS.initializing;
361-
notificationBitmap = null;
362-
}
359+
private Bitmap getCachedBitmap(String key) {
360+
if(key == null)
361+
return null;
363362

363+
Bitmap bitmap = null;
364364
try {
365-
Logger.d("Trying to get cached thumb: %s", media.getImageKey(PlexMedia.IMAGE_KEY.NOTIFICATION_THUMB));
366-
SimpleDiskCache.BitmapEntry bitmapEntry = mSimpleDiskCache.getBitmap(media.getImageKey(PlexMedia.IMAGE_KEY.NOTIFICATION_THUMB));
365+
Logger.d("Trying to get cached thumb: %s", key);
366+
SimpleDiskCache.BitmapEntry bitmapEntry = mSimpleDiskCache.getBitmap(key);
367367
Logger.d("bitmapEntry: %s", bitmapEntry);
368368
if(bitmapEntry != null) {
369-
notificationBitmap = bitmapEntry.getBitmap();
369+
bitmap = bitmapEntry.getBitmap();
370370
}
371371
} catch (Exception ex) {
372372
ex.printStackTrace();
373373
}
374374

375-
if(notificationBitmap == null && notificationStatus == NOTIFICATION_STATUS.initializing && !skipThumb) {
376-
Logger.d("Thumb not found in cache. Downloading.");
375+
return bitmap;
376+
377+
378+
}
379+
380+
// Fetch the notification bitmap for the given key. Once it's been downloaded, we'll save the bitmap to the image cache, then set the
381+
// notification again.
382+
private void fetchNotificationBitmap(final PlexMedia.IMAGE_KEY key, final PlexClient client, final PlexMedia media, final PlayerState currentState) {
383+
Logger.d("Thumb not found in cache. Downloading %s.", key);
377384
new AsyncTask() {
378385
@Override
379386
protected Object doInBackground(Object[] objects) {
380387
if (client != null && media != null) {
381-
InputStream inputStream = media.getNotificationThumb();
382-
Logger.d("Got input stream: %s", inputStream);
383-
notificationBitmap = BitmapFactory.decodeStream(inputStream);
388+
InputStream inputStream = media.getNotificationThumb(media instanceof PlexTrack ? PlexMedia.IMAGE_KEY.NOTIFICATION_THUMB_MUSIC : key);
384389
try {
385390
inputStream.reset();
386391
} catch (IOException e) {}
387-
Logger.d("notificationBitmap: %s", notificationBitmap);
388392
try {
389-
Logger.d("image key: %s", media.getImageKey(PlexMedia.IMAGE_KEY.NOTIFICATION_THUMB));
390-
mSimpleDiskCache.put(media.getImageKey(PlexMedia.IMAGE_KEY.NOTIFICATION_THUMB), inputStream);
393+
Logger.d("image key: %s", media.getImageKey(key));
394+
mSimpleDiskCache.put(media.getImageKey(key), inputStream);
391395
inputStream.close();
392396
Logger.d("Downloaded thumb. Redoing notification.");
393397
setNotification(client, currentState, media, true);
@@ -396,10 +400,29 @@ protected Object doInBackground(Object[] objects) {
396400
return null;
397401
}
398402
}.execute();
403+
}
404+
405+
public void setNotification(final PlexClient client, final PlayerState currentState, final PlexMedia media, boolean skipThumb) {
406+
Logger.d("Setting notification, client: %s, media: %s", client, media);
407+
if(client == null) {
408+
Logger.d("Client is null for some reason");
409+
return;
410+
}
411+
if(notificationStatus == NOTIFICATION_STATUS.off) {
412+
notificationStatus = NOTIFICATION_STATUS.initializing;
413+
notificationBitmap = null;
414+
notificationBitmapBig = null;
399415
}
400416

417+
notificationBitmap = getCachedBitmap(media.getImageKey(PlexMedia.IMAGE_KEY.NOTIFICATION_THUMB));
418+
if(notificationBitmap == null && notificationStatus == NOTIFICATION_STATUS.initializing && !skipThumb)
419+
fetchNotificationBitmap(PlexMedia.IMAGE_KEY.NOTIFICATION_THUMB, client, media, currentState);
420+
notificationBitmapBig = getCachedBitmap(media.getImageKey(PlexMedia.IMAGE_KEY.NOTIFICATION_THUMB_BIG));
421+
if(notificationBitmapBig == null && notificationStatus == NOTIFICATION_STATUS.initializing && !skipThumb)
422+
fetchNotificationBitmap(PlexMedia.IMAGE_KEY.NOTIFICATION_THUMB_BIG, client, media, currentState);
423+
424+
401425
Logger.d("Setting up notification");
402-
// notificationBitmap
403426
android.content.Intent rewindIntent = new android.content.Intent(VoiceControlForPlexApplication.this, PlexControlService.class);
404427
rewindIntent.setAction(PlexControlService.ACTION_REWIND);
405428
rewindIntent.putExtra(PlexControlService.CLIENT, client);
@@ -421,7 +444,6 @@ protected Object doInBackground(Object[] objects) {
421444
android.content.Intent nowPlayingIntent;
422445
if(client.isCastClient) {
423446
nowPlayingIntent = new android.content.Intent(VoiceControlForPlexApplication.this, CastActivity.class);
424-
// nowPlayingIntent.setAction(Intent.CAST_MEDIA);
425447
} else
426448
nowPlayingIntent = new android.content.Intent(VoiceControlForPlexApplication.this, NowPlayingActivity.class);
427449
nowPlayingIntent.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK |
@@ -438,11 +460,11 @@ protected Object doInBackground(Object[] objects) {
438460
.setOngoing(true)
439461
.setOnlyAlertOnce(true)
440462
.setContentIntent(piNowPlaying)
441-
.setContent(getNotificationView(R.layout.now_playing_notification, notificationBitmap, media, client, playPendingIntent, pausePendingIntent, piRewind, currentState == PlayerState.PLAYING))
463+
.setContent(getNotificationView(media.isMusic() ? R.layout.now_playing_notification_music : R.layout.now_playing_notification, notificationBitmap, media, client, playPendingIntent, pausePendingIntent, piRewind, currentState == PlayerState.PLAYING))
442464
.setDefaults(Notification.DEFAULT_ALL);
443465
Notification n = mBuilder.build();
444466
if (Build.VERSION.SDK_INT >= 16)
445-
n.bigContentView = getNotificationView(media.isMusic() ? R.layout.now_playing_notification_big_music : R.layout.now_playing_notification_big, notificationBitmap, media, client, playPendingIntent, pausePendingIntent, piRewind, currentState == PlayerState.PLAYING);
467+
n.bigContentView = getNotificationView(media.isMusic() ? R.layout.now_playing_notification_big_music : R.layout.now_playing_notification_big, notificationBitmapBig, media, client, playPendingIntent, pausePendingIntent, piRewind, currentState == PlayerState.PLAYING);
446468

447469
// Disable notification sound
448470
n.defaults = 0;
@@ -474,7 +496,8 @@ private RemoteViews getNotificationView(int layoutId, Bitmap thumb, PlexMedia me
474496
title = String.format("%s - %s", media.grandparentTitle, media.title);
475497
else if(media.isShow())
476498
title = String.format("%s - %s", media.grandparentTitle, media.title);
477-
499+
// else if(media.isShow())
500+
// title = String.format("%s - %s", media.grandparentTitle, media.title);
478501
remoteViews.setTextViewText(R.id.title, title);
479502
remoteViews.setTextViewText(R.id.playingOn, String.format(getString(R.string.playing_on), client.name));
480503

Voice Control For Plex/src/main/java/com/atomjack/vcfp/activities/CastActivity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import com.atomjack.vcfp.model.PlexMedia;
2121
import com.google.sample.castcompanionlibrary.cast.VideoCastManager;
2222

23+
import java.util.ArrayList;
24+
import java.util.Arrays;
2325
import java.util.List;
2426

2527
public class CastActivity extends PlayerActivity {
@@ -45,6 +47,10 @@ protected void onCreate(Bundle savedInstanceState) {
4547
resumePlayback = getIntent().getBooleanExtra("resume", false);
4648
castManager = castPlayerManager.getCastManager();
4749

50+
// If just playing a single track, put the media into an array
51+
if(nowPlayingMedia.isMusic() && nowPlayingAlbum == null)
52+
nowPlayingAlbum = Arrays.asList(nowPlayingMedia);
53+
4854
Logger.d("[CastActivity] starting up, action: %s, current state: %s", getIntent().getAction(), castPlayerManager.getCurrentState());
4955
Logger.d("mClient: %s", mClient);
5056
if(getIntent().getAction() != null && getIntent().getAction().equals(VoiceControlForPlexApplication.Intent.CAST_MEDIA)) {

Voice Control For Plex/src/main/java/com/atomjack/vcfp/activities/NowPlayingActivity.java

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ protected void onCreate(Bundle savedInstanceState) {
4646
Logger.d("found saved instance state");
4747
nowPlayingMedia = savedInstanceState.getParcelable(VoiceControlForPlexApplication.Intent.EXTRA_MEDIA);
4848
mClient = savedInstanceState.getParcelable(VoiceControlForPlexApplication.Intent.EXTRA_CLIENT);
49+
Logger.d("[NowPlaying] set mClient: %s", mClient);
4950
} else {
5051
nowPlayingMedia = getIntent().getParcelableExtra(VoiceControlForPlexApplication.Intent.EXTRA_MEDIA);
5152
mClient = getIntent().getParcelableExtra(VoiceControlForPlexApplication.Intent.EXTRA_CLIENT);
53+
Logger.d("[NowPlayingActivity] 2 set mClient: %s", mClient);
5254
}
5355

5456
if(mClient == null || nowPlayingMedia == null)
@@ -121,8 +123,28 @@ public void doForward(View v) {
121123
}
122124
}
123125

126+
public void doNext(View v) {
127+
Logger.d("doNext");
128+
mClient.next(null);
129+
}
130+
131+
public void doPrevious(View v) {
132+
Logger.d("doPrevious");
133+
mClient.previous(null);
134+
}
135+
124136
public void doStop(View v) {
125-
mClient.stop(null);
137+
mClient.stop(new PlexHttpResponseHandler() {
138+
@Override
139+
public void onSuccess(PlexResponse response) {
140+
finish();
141+
}
142+
143+
@Override
144+
public void onFailure(Throwable error) {
145+
finish();
146+
}
147+
});
126148
}
127149

128150
@Override
@@ -217,17 +239,12 @@ public void onFailure(Throwable error) {
217239

218240
@Override
219241
protected void onSubscriptionMessage(Timeline timeline) {
220-
// Logger.d("NowPlaying onSubscriptionMessage: %d", timeline.time);
242+
// Logger.d("[NowPlaying] onSubscriptionMessage: %d, Continuing: %s", timeline.time, continuing);
221243
if(!isSeeking)
222244
seekBar.setProgress(timeline.time);
223245

224246
if(continuing) {
225-
showNowPlaying(false);
226-
// Need to update the duration
227-
seekBar.setMax(nowPlayingMedia.duration);
228-
durationDisplay.setText(VoiceControlForPlexApplication.secondsToTimecode(nowPlayingMedia.duration / 1000));
229-
Logger.d("[NowPlayingActivity] Setting thumb in onSubscriptionMessage");
230-
setThumb();
247+
onMediaChange();
231248
continuing = false;
232249
}
233250

@@ -245,6 +262,16 @@ protected void onSubscriptionMessage(Timeline timeline) {
245262
}
246263
}
247264

265+
@Override
266+
protected void onMediaChange() {
267+
Logger.d("[NowPlayingActivity] onMediaChange: %s, duration %d", nowPlayingMedia.title, nowPlayingMedia.duration);
268+
seekBar.setMax(nowPlayingMedia.duration);
269+
durationDisplay.setText(VoiceControlForPlexApplication.secondsToTimecode(nowPlayingMedia.duration / 1000));
270+
Logger.d("[NowPlayingActivity] Setting thumb in onSubscriptionMessage");
271+
setThumb();
272+
showNowPlaying(false);
273+
}
274+
248275
@Override
249276
public boolean onPrepareOptionsMenu(Menu _menu) {
250277
Logger.d("NowPlaying onPrepareOptionsMenu");

0 commit comments

Comments
 (0)