Skip to content

Commit 9090ee7

Browse files
Release 1.6.0
2 parents efc04cd + ff5372d commit 9090ee7

File tree

7 files changed

+114
-90
lines changed

7 files changed

+114
-90
lines changed

AndroidManifest.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.connectsdk.sampler"
4-
android:versionCode="11"
5-
android:versionName="1.5.0" >
4+
android:versionCode="12"
5+
android:versionName="1.6.0" >
66

77
<uses-sdk
88
android:minSdkVersion="10"

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ For more information, visit our [website](http://www.connectsdk.com/).
1010

1111
##Dependencies
1212
- [Android v7 appcompat library](http://developer.android.com/tools/support-library/features.html#v7-appcompat)
13-
- Android SDK v21 (the Sampler app targets v21, but works on v9 and greater)
13+
- Android SDK v22 (the Sampler app targets v22, but works on v10 and greater)
1414
- [Connect-SDK-Android-Core](https://github.com/ConnectSDK/Connect-SDK-Android-Core)
1515
- [Connect-SDK-Android-Google-Cast](https://github.com/ConnectSDK/Connect-SDK-Android-Google-Cast) for full version of Connect-SDK
1616

@@ -21,6 +21,9 @@ For more information, visit our [website](http://www.connectsdk.com/).
2121
```
2222
2. Import the Sampler project into Android Studio
2323
24+
##Using dev branch
25+
If you use dev branch you should [setup](https://github.com/ConnectSDK/Connect-SDK-Android#including-connect-sdk-in-your-app-with-android-studio-from-sources) Connect-SDK-Android from sources and you should use Connect-SDK-Android dev branch as well
26+
2427
##Contact
2528
* Twitter [@ConnectSDK](https://www.twitter.com/ConnectSDK)
2629
* Ask a question on Stack Overflow with the [Connect-SDK tag](https://stackoverflow.com/tags/connect-sdk) (or [TV tag](https://stackoverflow.com/tags/tv))

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,5 @@ android {
5151

5252

5353
dependencies {
54-
compile 'com.connectsdk:connect-sdk-android:1.5.0'
54+
compile 'com.connectsdk:connect-sdk-android:1.6.0'
5555
}

res/layout/fragment_media_player.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@
108108
android:layout_weight="1"
109109
android:text="Playlist" />
110110

111+
<CheckBox
112+
android:id="@+id/subtitlesButton"
113+
android:layout_width="wrap_content"
114+
android:layout_height="wrap_content"
115+
android:paddingRight="5dp"
116+
android:text="Subtitles" />
117+
111118
<CheckBox
112119
android:id="@+id/loopingButton"
113120
android:layout_width="wrap_content"

src/com/connectsdk/sampler/MainActivity.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public void onPairingRequired(ConnectableDevice device, DeviceService service, P
7272
break;
7373

7474
case PIN_CODE:
75+
case MIXED:
7576
Log.d("2ndScreenAPP", "Pin Code");
7677
pairingCodeDialog.show();
7778
break;
@@ -90,10 +91,13 @@ public void onConnectionFailed(ConnectableDevice device, ServiceCommandError err
9091

9192
@Override
9293
public void onDeviceReady(ConnectableDevice device) {
94+
Log.d("2ndScreenAPP", "onPairingSuccess");
9395
if (pairingAlertDialog.isShowing()) {
94-
Log.d("2ndScreenAPP", "onPairingSuccess");
9596
pairingAlertDialog.dismiss();
9697
}
98+
if (pairingCodeDialog.isShowing()) {
99+
pairingCodeDialog.dismiss();
100+
}
97101
registerSuccess(mTV);
98102
}
99103

@@ -214,6 +218,7 @@ public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
214218

215219
mTV = (ConnectableDevice)arg0.getItemAtPosition(arg2);
216220
mTV.addListener(deviceListener);
221+
mTV.setPairingType(null);
217222
mTV.connect();
218223
connectItem.setTitle(mTV.getFriendlyName());
219224

@@ -297,6 +302,9 @@ void connectEnded(ConnectableDevice device) {
297302
if (pairingAlertDialog.isShowing()) {
298303
pairingAlertDialog.dismiss();
299304
}
305+
if (pairingCodeDialog.isShowing()) {
306+
pairingCodeDialog.dismiss();
307+
}
300308
mTV.removeListener(deviceListener);
301309
mTV = null;
302310
}

src/com/connectsdk/sampler/fragments/MediaPlayerFragment.java

Lines changed: 89 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import android.widget.TextView;
3232

3333
import com.connectsdk.core.MediaInfo;
34+
import com.connectsdk.core.SubtitleInfo;
3435
import com.connectsdk.device.ConnectableDevice;
3536
import com.connectsdk.sampler.R;
3637
import com.connectsdk.sampler.util.TestResponseObject;
@@ -56,6 +57,15 @@
5657
import java.util.concurrent.TimeUnit;
5758

5859
public class MediaPlayerFragment extends BaseFragment {
60+
public static final String URL_SUBTITLES_WEBVTT =
61+
"http://ec2-54-201-108-205.us-west-2.compute.amazonaws.com/samples/media/sintel_en.vtt";
62+
public static final String URL_SUBTITLE_SRT =
63+
"http://ec2-54-201-108-205.us-west-2.compute.amazonaws.com/samples/media/sintel_en.srt";
64+
public static final String URL_VIDEO_MP4 =
65+
"http://ec2-54-201-108-205.us-west-2.compute.amazonaws.com/samples/media/video.mp4";
66+
public static final String URL_IMAGE_ICON =
67+
"http://ec2-54-201-108-205.us-west-2.compute.amazonaws.com/samples/media/videoIcon.jpg";
68+
5969
public Button photoButton;
6070
public Button videoButton;
6171
public Button audioButton;
@@ -71,8 +81,9 @@ public class MediaPlayerFragment extends BaseFragment {
7181
public Button nextButton;
7282
public Button jumpButton;
7383
public CheckBox loopingButton;
84+
public CheckBox subtitlesButton;
7485

75-
public static LaunchSession launchSession;
86+
public LaunchSession launchSession;
7687

7788
public TextView positionTextView;
7889
public TextView durationTextView;
@@ -87,14 +98,14 @@ public class MediaPlayerFragment extends BaseFragment {
8798

8899
public boolean mSeeking;
89100
public Runnable mRefreshRunnable;
90-
public static final int REFRESH_INTERVAL_MS = (int) TimeUnit.SECONDS.toMillis(1);
101+
public final int REFRESH_INTERVAL_MS = (int) TimeUnit.SECONDS.toMillis(1);
91102
public Handler mHandler;
92103
public long totalTimeDuration;
93104
public boolean mIsGettingPlayPosition;
94105

95106

96-
static boolean isPlayingImage = false;
97-
static boolean isPlaying = false;
107+
boolean isPlayingImage = false;
108+
boolean isPlaying = false;
98109

99110
private MediaControl mMediaControl = null;
100111
private PlaylistControl mPlaylistControl = null;
@@ -138,6 +149,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
138149
nextButton = (Button) rootView.findViewById(R.id.nextButton);
139150
jumpButton = (Button) rootView.findViewById(R.id.jumpButton);
140151
loopingButton = (CheckBox) rootView.findViewById(R.id.loopingButton);
152+
subtitlesButton = (CheckBox) rootView.findViewById(R.id.subtitlesButton);
141153

142154
positionTextView = (TextView) rootView.findViewById(R.id.stream_position);
143155
durationTextView = (TextView) rootView.findViewById(R.id.stream_duration);
@@ -163,6 +175,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
163175
nextButton,
164176
jumpButton,
165177
loopingButton,
178+
subtitlesButton,
166179
};
167180

168181
mHandler = new Handler();
@@ -216,6 +229,8 @@ public void onClick(View view) {
216229
totalTimeDuration = -1;
217230

218231
loopingButton.setEnabled(getTv().hasCapability(MediaPlayer.Loop));
232+
subtitlesButton.setEnabled(getTv().hasCapability(MediaPlayer.Subtitle_SRT)
233+
|| getTv().hasCapability(MediaPlayer.Subtitle_WebVTT));
219234

220235
if (getTv().hasCapability(MediaPlayer.Play_Video)) {
221236
videoButton.setEnabled(true);
@@ -303,25 +318,23 @@ private void playAudio() {
303318
String mimeType = "audio/mp3";
304319
boolean shouldLoop = loopingButton.isChecked();
305320

306-
getMediaPlayer().playMedia(mediaURL, mimeType, title, description, iconURL, shouldLoop, new MediaPlayer.LaunchListener() {
321+
MediaInfo mediaInfo = new MediaInfo.Builder(mediaURL, mimeType)
322+
.setTitle(title)
323+
.setDescription(description)
324+
.setIcon(iconURL)
325+
.build();
326+
327+
getMediaPlayer().playMedia(mediaInfo, shouldLoop, new MediaPlayer.LaunchListener() {
307328

308329
@Override
309330
public void onError(ServiceCommandError error) {
310-
Log.d("LG", "Error playing audio");
311-
if (launchSession != null) {
312-
launchSession.close(null);
313-
launchSession = null;
314-
testResponse = new TestResponseObject(false, error.getCode(), error.getMessage());
315-
stopUpdating();
316-
disableMedia();
317-
isPlaying = isPlayingImage = false;
318-
}
331+
Log.d("LG", "Error playing audio", error);
332+
stopMediaSession();
319333
}
320334

321335
@Override
322336
public void onSuccess(MediaLaunchObject object) {
323337
Log.d("LG", "Started playing audio");
324-
325338
launchSession = object.launchSession;
326339
testResponse = new TestResponseObject(true, TestResponseObject.SuccessCode, TestResponseObject.Play_Audio);
327340
mMediaControl = object.mediaControl;
@@ -330,8 +343,6 @@ public void onSuccess(MediaLaunchObject object) {
330343
stopUpdating();
331344
enableMedia();
332345
isPlaying = true;
333-
disconnectWebAppSession();
334-
335346
}
336347
});
337348
}
@@ -344,18 +355,18 @@ private void playM3U() {
344355
String mimeType = "application/x-mpegurl";
345356
boolean shouldLoop = loopingButton.isChecked();
346357

347-
getMediaPlayer().playMedia(mediaURL, mimeType, title, description, iconURL, shouldLoop, new MediaPlayer.LaunchListener() {
358+
MediaInfo mediaInfo = new MediaInfo.Builder(mediaURL, mimeType)
359+
.setTitle(title)
360+
.setDescription(description)
361+
.setIcon(iconURL)
362+
.build();
363+
364+
getMediaPlayer().playMedia(mediaInfo, shouldLoop, new MediaPlayer.LaunchListener() {
348365

349366
@Override
350367
public void onError(ServiceCommandError error) {
351-
Log.d("LG", "Error playing audio");
352-
if (launchSession != null) {
353-
launchSession.close(null);
354-
launchSession = null;
355-
stopUpdating();
356-
disableMedia();
357-
isPlaying = isPlayingImage = false;
358-
}
368+
Log.d("LG", "Error playing audio", error);
369+
stopMediaSession();
359370
}
360371

361372
@Override
@@ -367,7 +378,6 @@ public void onSuccess(MediaLaunchObject object) {
367378
stopUpdating();
368379
enableMedia();
369380
isPlaying = true;
370-
disconnectWebAppSession();
371381
}
372382
});
373383
}
@@ -381,71 +391,84 @@ private void showImage() {
381391
String description = "Blender Open Movie Project";
382392
String icon = "http://ec2-54-201-108-205.us-west-2.compute.amazonaws.com/samples/media/photoIcon.jpg";
383393

384-
getMediaPlayer().displayImage(imagePath, mimeType, title, description, icon, new MediaPlayer.LaunchListener() {
394+
MediaInfo mediaInfo = new MediaInfo.Builder(imagePath, mimeType)
395+
.setTitle(title)
396+
.setDescription(description)
397+
.setIcon(icon)
398+
.build();
399+
400+
getMediaPlayer().displayImage(mediaInfo, new MediaPlayer.LaunchListener() {
401+
402+
@Override
403+
public void onError(ServiceCommandError error) {
404+
Log.e("Error", "Error displaying Image", error);
405+
stopMediaSession();
406+
}
385407

386408
@Override
387409
public void onSuccess(MediaLaunchObject object) {
388410
launchSession = object.launchSession;
389411
closeButton.setEnabled(true);
390-
testResponse = new TestResponseObject(true, TestResponseObject.SuccessCode, TestResponseObject.Display_image);
412+
testResponse = new TestResponseObject(true, TestResponseObject.SuccessCode,
413+
TestResponseObject.Display_image);
391414
closeButton.setOnClickListener(closeListener);
392415
stopUpdating();
393416
isPlayingImage = true;
394-
disconnectWebAppSession();
395-
396-
}
397-
398-
@Override
399-
public void onError(ServiceCommandError error) {
400-
Log.e("Error", "Error displaying Image");
401-
if (launchSession != null) {
402-
launchSession.close(null);
403-
launchSession = null;
404-
testResponse = new TestResponseObject(false, error.getCode(), error.getMessage());
405-
stopUpdating();
406-
disableMedia();
407-
isPlaying = isPlayingImage = false;
408-
409-
}
410417
}
411418
});
412419
}
413420

414421
private void playVideo() {
415-
String videoPath = "http://ec2-54-201-108-205.us-west-2.compute.amazonaws.com/samples/media/video.mp4";
416-
String mimeType = "video/mp4";
417-
String title = "Sintel Trailer";
418-
String description = "Blender Open Movie Project";
419-
String icon = "http://ec2-54-201-108-205.us-west-2.compute.amazonaws.com/samples/media/videoIcon.jpg";
420422
boolean shouldLoop = loopingButton.isChecked();
421423

422-
getMediaPlayer().playMedia(videoPath, mimeType, title, description, icon, shouldLoop, new MediaPlayer.LaunchListener() {
424+
SubtitleInfo.Builder subtitleBuilder = null;
425+
if (subtitlesButton.isChecked()) {
426+
subtitleBuilder = new SubtitleInfo.Builder(
427+
getTv().hasCapability(MediaPlayer.Subtitle_WebVTT) ? URL_SUBTITLES_WEBVTT :
428+
URL_SUBTITLE_SRT);
429+
subtitleBuilder.setLabel("English").setLanguage("en");
430+
}
431+
432+
MediaInfo mediaInfo = new MediaInfo.Builder(URL_VIDEO_MP4, "video/mp4")
433+
.setTitle("Sintel Trailer")
434+
.setDescription("Blender Open Movie Project")
435+
.setIcon(URL_IMAGE_ICON)
436+
.setSubtitleInfo(subtitleBuilder == null ? null : subtitleBuilder.build())
437+
.build();
438+
439+
getMediaPlayer().playMedia(mediaInfo, shouldLoop, new MediaPlayer.LaunchListener() {
440+
441+
@Override
442+
public void onError(ServiceCommandError error) {
443+
Log.e("Error", "Error playing video", error);
444+
stopMediaSession();
445+
}
423446

424447
public void onSuccess(MediaLaunchObject object) {
425448
launchSession = object.launchSession;
426-
testResponse = new TestResponseObject(true, TestResponseObject.SuccessCode, TestResponseObject.Play_Video);
449+
testResponse = new TestResponseObject(true, TestResponseObject.SuccessCode,
450+
TestResponseObject.Play_Video);
427451
mMediaControl = object.mediaControl;
428452
mPlaylistControl = object.playlistControl;
429453
stopUpdating();
430454
enableMedia();
431455
isPlaying = true;
432-
disconnectWebAppSession();
433-
}
434-
435-
@Override
436-
public void onError(ServiceCommandError error) {
437-
if (launchSession != null) {
438-
launchSession.close(null);
439-
launchSession = null;
440-
testResponse = new TestResponseObject(false, error.getCode(), error.getMessage());
441-
stopUpdating();
442-
disableMedia();
443-
isPlaying = isPlayingImage = false;
444-
}
445456
}
446457
});
447458
}
448459

460+
461+
private void stopMediaSession() {
462+
// don't call launchSession.close() here, currently it can close
463+
// a different web app in WebOS
464+
if (launchSession != null) {
465+
launchSession = null;
466+
stopUpdating();
467+
disableMedia();
468+
isPlaying = isPlayingImage = false;
469+
}
470+
}
471+
449472
@Override
450473
public void disableButtons() {
451474
mSeekBar.setEnabled(false);
@@ -459,6 +482,7 @@ public void disableButtons() {
459482
positionTrackView.setEnabled(false);
460483

461484
loopingButton.setChecked(false);
485+
subtitlesButton.setEnabled(false);
462486
super.disableButtons();
463487
}
464488

@@ -834,14 +858,6 @@ private String formatTime(long millisec) {
834858
return time;
835859
}
836860

837-
private void disconnectWebAppSession() {
838-
if (WebAppFragment.mWebAppSession != null) {
839-
WebAppFragment.mWebAppSession.setWebAppSessionListener(null);
840-
WebAppFragment.mWebAppSession.close(null);
841-
WebAppFragment.isLaunched = false;
842-
}
843-
}
844-
845861
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
846862
ImageView bmImage;
847863

0 commit comments

Comments
 (0)