186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn/*
286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * Copyright (C) 2015 The Android Open Source Project
386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn *
486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * in compliance with the License. You may obtain a copy of the License at
686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn *
786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * http://www.apache.org/licenses/LICENSE-2.0
886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn *
986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * Unless required by applicable law or agreed to in writing, software distributed under the License
1086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
1186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * or implied. See the License for the specific language governing permissions and limitations under
1286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn * the License.
1386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn */
1486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
15ad31f63f5843898de645f6ee1ac244c872ded8ccRobert Hahnpackage android.support.v17.leanback.supportleanbackshowcase.app.media;
1686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
1786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.app.Fragment;
1886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.os.Bundle;
1986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.app.PlaybackOverlayFragment;
2086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Action;
2186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.ArrayObjectAdapter;
2286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.OnItemViewClickedListener;
2386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.PlaybackControlsRow;
2486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
2586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Presenter;
2686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.Row;
2786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.support.v17.leanback.widget.RowPresenter;
2886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.view.SurfaceHolder;
2986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnimport android.view.SurfaceView;
3086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
3186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
3286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahnpublic class VideoConsumptionExampleFragment extends PlaybackOverlayFragment implements
3386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        OnItemViewClickedListener, MediaPlayerGlue.OnMediaFileFinishedPlayingListener {
3486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
3586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private static final String URL = "http://techslides.com/demos/sample-videos/small.mp4";
36f1f0e1e298d10dfb6de5509fc19788f3d1f9bc2eKeyvan Amiri    public static final String TAG = "VideoConsumptionExampleFragment";
3786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private ArrayObjectAdapter mRowsAdapter;
3886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private MediaPlayerGlue mGlue;
3986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
40fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    @Override
41fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    public void onCreate(Bundle savedInstanceState) {
4286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        super.onCreate(savedInstanceState);
4386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
4486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mGlue = new VideoMediaPlayerGlue(getActivity(), this) {
4586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
46fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn            @Override
47fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn            protected void onRowChanged(PlaybackControlsRow row) {
4886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                if (mRowsAdapter == null) return;
4986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                mRowsAdapter.notifyArrayItemRangeChanged(0, 1);
5086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            }
5186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        };
5286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mGlue.setOnMediaFileFinishedPlayingListener(this);
5386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        MediaPlayerGlue.MetaData metaData = new MediaPlayerGlue.MetaData();
5486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        metaData.setArtist("A Googler");
5586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        metaData.setTitle("Diving with Sharks");
5686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mGlue.setMetaData(metaData);
5786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mGlue.setMediaSource(URL);
585fc2bf47986ea74abe87e94186dd84d72205410bKeyvan Amiri        mGlue.prepareMediaForPlaying();
5986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
60f1f0e1e298d10dfb6de5509fc19788f3d1f9bc2eKeyvan Amiri
6186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        Fragment videoSurfaceFragment = getFragmentManager()
62f1f0e1e298d10dfb6de5509fc19788f3d1f9bc2eKeyvan Amiri                .findFragmentByTag(VideoSurfaceFragment.TAG);
63f1f0e1e298d10dfb6de5509fc19788f3d1f9bc2eKeyvan Amiri
6486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        SurfaceView surface = (SurfaceView) videoSurfaceFragment.getView();
6586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        surface.getHolder().addCallback(new SurfaceHolder.Callback() {
66fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn            @Override
67fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn            public void surfaceCreated(SurfaceHolder holder) {
6886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                mGlue.setDisplay(holder);
6986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            }
7086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
7186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            @Override
7286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
7386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                // Nothing to do
7486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            }
7586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
76fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn            @Override
77fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn            public void surfaceDestroyed(SurfaceHolder holder) {
7886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn            }
7986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        });
8086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
8186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setBackgroundType(PlaybackOverlayFragment.BG_LIGHT);
8286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        addPlaybackControlsRow();
8386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
8486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
85fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    @Override
86fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    public void onStart() {
8786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        super.onStart();
8886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mGlue.enableProgressUpdating(mGlue.hasValidMedia() && mGlue.isMediaPlaying());
8986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
9086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
91fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    @Override
92fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    public void onStop() {
9386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        super.onStop();
9486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mGlue.enableProgressUpdating(false);
9586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mGlue.reset();
9686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
9786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
9886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    private void addPlaybackControlsRow() {
9986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        final PlaybackControlsRowPresenter controlsPresenter = mGlue
10086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn                .createControlsRowAndPresenter();
10186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter = new ArrayObjectAdapter(controlsPresenter);
10286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mRowsAdapter.add(mGlue.getControlsRow());
10386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setAdapter(mRowsAdapter);
10486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        setOnItemViewClickedListener(this);
10586163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
10686163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
107fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    @Override
108fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
109fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn                              RowPresenter.ViewHolder rowViewHolder, Row row) {
11086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        if (!(item instanceof Action)) return;
11186163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mGlue.onActionClicked((Action) item);
11286163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
11386163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
11486163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
115fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    @Override
116fd6954036f5be6b2ca578d76e70510fa23051911Robert Hahn    public void onMediaFileFinishedPlaying(MediaPlayerGlue.MetaData metaData) {
11786163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn        mGlue.startPlayback();
11886163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn    }
11986163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn
12086163d539e1aeb9ae7612def7aaf7dbfc5b88f28Robert Hahn}
121