• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // CHECKSTYLE:OFF Generated code
2 /* This file is auto-generated from OnboardingDemoFragment.java.  DO NOT MODIFY. */
3 
4 /*
5  * Copyright (C) 2016 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software distributed under the License
13  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14  * or implied. See the License for the specific language governing permissions and limitations under
15  * the License.
16  */
17 package com.example.android.leanback;
18 
19 import android.net.Uri;
20 import android.os.Bundle;
21 import android.support.v17.leanback.app.VideoSupportFragmentGlueHost;
22 import android.support.v17.leanback.media.MediaPlayerAdapter;
23 import android.support.v17.leanback.media.PlaybackGlue;
24 import android.support.v17.leanback.media.PlaybackTransportControlGlue;
25 import android.support.v17.leanback.widget.PlaybackControlsRow;
26 
27 /**
28  * Fragment demonstrating the use of {@link android.support.v17.leanback.app.VideoSupportFragment} to
29  * render video with playback controls. And demonstrates video seeking with thumbnails.
30  *
31  * Generate 1 frame per second thumbnail bitmaps and put on sdcard:
32  * <pre>
33  * sudo apt-get install libav-tools
34  * avconv -i input.mp4 -s 240x135 -vsync 1 -r 1 -an -y -qscale 8 frame_%04d.jpg
35  * adb shell mkdir /sdcard/seek
36  * adb push frame_*.jpg /sdcard/seek/
37  * </pre>
38  * Change to 1 frame per minute: use "-r 1/60".
39  * For more options, see https://wiki.libav.org/Snippets/avconv
40  *
41  * <p>
42  * Showcase:
43  * </p>
44  * <li>Auto play when ready</li>
45  * <li>Set seek provider</li>
46  * <li>switch MediaSource</li>
47  * <li>switch PlaybackGlue</li>
48  */
49 public class SampleVideoSupportFragment extends android.support.v17.leanback.app.VideoSupportFragment {
50     private PlaybackTransportControlGlueSample<MediaPlayerAdapter> mMediaPlayerGlue;
51 
52     final VideoSupportFragmentGlueHost mHost = new VideoSupportFragmentGlueHost(SampleVideoSupportFragment.this);
53 
playWhenReady(PlaybackGlue glue)54     static void playWhenReady(PlaybackGlue glue) {
55         if (glue.isPrepared()) {
56             glue.play();
57         } else {
58             glue.addPlayerCallback(new PlaybackGlue.PlayerCallback() {
59                 @Override
60                 public void onPreparedStateChanged(PlaybackGlue glue) {
61                     if (glue.isPrepared()) {
62                         glue.removePlayerCallback(this);
63                         glue.play();
64                     }
65                 }
66             });
67         }
68     }
69 
loadSeekData(final PlaybackTransportControlGlue glue)70     static void loadSeekData(final PlaybackTransportControlGlue glue) {
71         if (glue.isPrepared()) {
72             glue.setSeekProvider(new PlaybackSeekDiskDataProvider(
73                     glue.getDuration(),
74                     1000,
75                     "/sdcard/seek/frame_%04d.jpg"));
76         } else {
77             glue.addPlayerCallback(new PlaybackGlue.PlayerCallback() {
78                 @Override
79                 public void onPreparedStateChanged(PlaybackGlue glue) {
80                     if (glue.isPrepared()) {
81                         glue.removePlayerCallback(this);
82                         PlaybackTransportControlGlue transportControlGlue =
83                                 (PlaybackTransportControlGlue) glue;
84                         transportControlGlue.setSeekProvider(new PlaybackSeekDiskDataProvider(
85                                 transportControlGlue.getDuration(),
86                                 1000,
87                                 "/sdcard/seek/frame_%04d.jpg"));
88                     }
89                 }
90             });
91         }
92     }
93 
94     @Override
onCreate(Bundle savedInstanceState)95     public void onCreate(Bundle savedInstanceState) {
96         super.onCreate(savedInstanceState);
97         mMediaPlayerGlue = new PlaybackTransportControlGlueSample(getActivity(),
98                 new MediaPlayerAdapter(getActivity()));
99         mMediaPlayerGlue.setHost(mHost);
100         mMediaPlayerGlue.setMode(PlaybackControlsRow.RepeatAction.INDEX_NONE);
101         mMediaPlayerGlue.addPlayerCallback(new PlaybackGlue.PlayerCallback() {
102             boolean mSecondCompleted = false;
103             @Override
104             public void onPlayCompleted(PlaybackGlue glue) {
105                 if (!mSecondCompleted) {
106                     mSecondCompleted = true;
107                     mMediaPlayerGlue.setSubtitle("Leanback artist Changed!");
108                     mMediaPlayerGlue.setTitle("Leanback team at work");
109                     String uriPath = "https://storage.googleapis.com/android-tv/Sample videos/"
110                             + "April Fool's 2013/Explore Treasure Mode with Google Maps.mp4";
111                     mMediaPlayerGlue.getPlayerAdapter().setDataSource(Uri.parse(uriPath));
112                     loadSeekData(mMediaPlayerGlue);
113                     playWhenReady(mMediaPlayerGlue);
114                 } else {
115                     mMediaPlayerGlue.removePlayerCallback(this);
116                     switchAnotherGlue();
117                 }
118             }
119         });
120         mMediaPlayerGlue.setSubtitle("Leanback artist");
121         mMediaPlayerGlue.setTitle("Leanback team at work");
122         String uriPath = "https://storage.googleapis.com/android-tv/Sample videos/"
123                 + "April Fool's 2013/Explore Treasure Mode with Google Maps.mp4";
124         mMediaPlayerGlue.getPlayerAdapter().setDataSource(Uri.parse(uriPath));
125         loadSeekData(mMediaPlayerGlue);
126         playWhenReady(mMediaPlayerGlue);
127     }
128 
129     @Override
onPause()130     public void onPause() {
131         if (mMediaPlayerGlue != null) {
132             mMediaPlayerGlue.pause();
133         }
134         super.onPause();
135     }
136 
switchAnotherGlue()137     void switchAnotherGlue() {
138         mMediaPlayerGlue = new PlaybackTransportControlGlueSample(getActivity(),
139                 new MediaPlayerAdapter(getActivity()));
140         mMediaPlayerGlue.setMode(PlaybackControlsRow.RepeatAction.INDEX_ONE);
141         mMediaPlayerGlue.setSubtitle("A Googler");
142         mMediaPlayerGlue.setTitle("Swimming with the fishes");
143         mMediaPlayerGlue.getPlayerAdapter().setDataSource(
144                 Uri.parse("http://techslides.com/demos/sample-videos/small.mp4"));
145         mMediaPlayerGlue.setHost(mHost);
146         loadSeekData(mMediaPlayerGlue);
147         playWhenReady(mMediaPlayerGlue);
148     }
149 }
150