13bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu/*
23bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu * Copyright (C) 2017 The Android Open Source Project
33bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu *
43bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu * Licensed under the Apache License, Version 2.0 (the "License");
53bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu * you may not use this file except in compliance with the License.
63bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu * You may obtain a copy of the License at
73bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu *
83bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu *      http://www.apache.org/licenses/LICENSE-2.0
93bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu *
103bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu * Unless required by applicable law or agreed to in writing, software
113bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu * distributed under the License is distributed on an "AS IS" BASIS,
123bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu * See the License for the specific language governing permissions and
143bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu * limitations under the License.
153bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu */
163bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
173bcad88cbf4488e747d84893c35f2351b8f84afeDake Gupackage com.example.android.leanback;
183bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
193bcad88cbf4488e747d84893c35f2351b8f84afeDake Guimport android.os.Handler;
203bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
213bcad88cbf4488e747d84893c35f2351b8f84afeDake Guclass PlayerAdapter extends
223bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        android.support.v17.leanback.media.PlayerAdapter {
233bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
243bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    static final int FAUX_DURATION = 33 * 1000;
253bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
263bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    private boolean mIsPlaying;
273bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    private long mStartTime;
283bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    private long mStartPosition = 0;
293bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    private Handler mHandler = new Handler();
303bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    private final Runnable mUpdateProgressRunnable = new Runnable() {
313bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        @Override
323bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        public void run() {
333bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            getCallback().onCurrentPositionChanged(com.example.android.leanback.PlayerAdapter.this);
343bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            mHandler.postDelayed(this, 16);
353bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        }
363bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    };
373bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
383bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    @Override
393bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    public boolean isPlaying() {
403bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        return mIsPlaying;
413bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    }
423bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
433bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    @Override
443bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    public long getDuration() {
453bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        return FAUX_DURATION;
463bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    }
473bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
483bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    @Override
493bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    public void seekTo(long position) {
503bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        mStartPosition = position;
513bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        mStartTime = System.currentTimeMillis();
523bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        getCallback().onCurrentPositionChanged(com.example.android.leanback.PlayerAdapter.this);
533bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    }
543bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
553bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    @Override
563bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    public long getCurrentPosition() {
573bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        int speed;
583bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        if (!mIsPlaying) {
593bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            speed = 0;
603bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        } else {
613bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            speed = 1;
623bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        }
633bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        long position = mStartPosition + (System.currentTimeMillis() - mStartTime) * speed;
643bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        if (position > getDuration()) {
653bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            position = getDuration();
663bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            onPlaybackComplete(true);
673bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        } else if (position < 0) {
683bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            position = 0;
693bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            onPlaybackComplete(false);
703bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        }
713bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        return (int) position;
723bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    }
733bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
743bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    void onPlaybackComplete(final boolean ended) {
753bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        mHandler.post(new Runnable() {
763bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            @Override
773bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            public void run() {
783bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu                mStartPosition = 0;
793bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu                mIsPlaying = false;
803bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu                getCallback().onPlayStateChanged(com.example.android.leanback.PlayerAdapter.this);
813bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu                if (ended) {
823bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu                    getCallback().onPlayCompleted(com.example.android.leanback.PlayerAdapter.this);
833bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu                }
843bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            }
853bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        });
863bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    }
873bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
883bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    @Override
893bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    public void play() {
903bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        if (mIsPlaying) {
913bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            return;
923bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        }
933bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        mStartPosition = getCurrentPosition();
943bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        mIsPlaying = true;
953bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        mStartTime = System.currentTimeMillis();
963bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        getCallback().onPlayStateChanged(com.example.android.leanback.PlayerAdapter.this);
973bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    }
983bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
993bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    @Override
1003bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    public void pause() {
1013bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        if (!mIsPlaying) {
1023bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            return;
1033bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        }
1043bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        mStartPosition = getCurrentPosition();
1053bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        mIsPlaying = false;
1063bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        getCallback().onPlayStateChanged(com.example.android.leanback.PlayerAdapter.this);
1073bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    }
1083bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu
1093bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    @Override
1103bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    public void setProgressUpdatingEnabled(boolean enable) {
1113bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        mHandler.removeCallbacks(mUpdateProgressRunnable);
1123bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        if (enable) {
1133bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu            mUpdateProgressRunnable.run();
1143bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu        }
1153bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu    }
1163bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu}
117