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