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 android.support.v17.leanback.widget; 183bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 193bcad88cbf4488e747d84893c35f2351b8f84afeDake Guimport android.content.Context; 203bcad88cbf4488e747d84893c35f2351b8f84afeDake Guimport android.support.v17.leanback.media.PlaybackGlueHostImpl; 213bcad88cbf4488e747d84893c35f2351b8f84afeDake Guimport android.view.KeyEvent; 223bcad88cbf4488e747d84893c35f2351b8f84afeDake Guimport android.view.View; 233bcad88cbf4488e747d84893c35f2351b8f84afeDake Guimport android.view.ViewGroup; 243bcad88cbf4488e747d84893c35f2351b8f84afeDake Guimport android.widget.FrameLayout; 253bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 263bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu/** 273bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu * Example to create a ViewHolder and rebind when notifyPlaybackRowChanged. 283bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu */ 293bcad88cbf4488e747d84893c35f2351b8f84afeDake Gupublic class PlaybackGlueHostImplWithViewHolder extends PlaybackGlueHostImpl 303bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu implements PlaybackSeekUi { 313bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu protected Context mContext; 323bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu protected PlaybackRowPresenter.ViewHolder mViewHolder; 333bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu protected ViewGroup mRootView; 343bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 353bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu protected int mLayoutWidth = 1920; 363bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu protected int mLayoutHeight = ViewGroup.LayoutParams.WRAP_CONTENT; 373bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu Client mSeekClient; 383bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 393bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public PlaybackGlueHostImplWithViewHolder(Context context) { 403bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mContext = context; 413bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 423bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 433bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu @Override 443bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public void setPlaybackRow(Row row) { 453bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu super.setPlaybackRow(row); 463bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu createViewHolderIfNeeded(); 473bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 483bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 493bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu @Override 503bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public void setPlaybackRowPresenter(PlaybackRowPresenter presenter) { 513bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu super.setPlaybackRowPresenter(presenter); 523bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu createViewHolderIfNeeded(); 533bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 543bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 553bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu void createViewHolderIfNeeded() { 563bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu if (mViewHolder == null && mPlaybackRowPresenter != null && mRow != null) { 573bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mViewHolder = (PlaybackRowPresenter.ViewHolder) 583bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mPlaybackRowPresenter.onCreateViewHolder(mRootView = new FrameLayout(mContext)); 593bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mRootView.addView(mViewHolder.view, mLayoutWidth, mLayoutHeight); 603bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mRootView.measure( 613bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu View.MeasureSpec.makeMeasureSpec(1920, View.MeasureSpec.AT_MOST), 623bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 633bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mRootView.layout(0, 0, mRootView.getMeasuredWidth(), mRootView.getMeasuredHeight()); 643bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mPlaybackRowPresenter.onBindViewHolder(mViewHolder, mRow); 653bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu if (mViewHolder instanceof PlaybackSeekUi) { 663bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu ((PlaybackSeekUi) mViewHolder).setPlaybackSeekUiClient(mChainedClient); 673bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 683bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 693bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 703bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 713bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu @Override 723bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public void notifyPlaybackRowChanged() { 733bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu if (mViewHolder != null) { 743bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mPlaybackRowPresenter.onUnbindRowViewHolder(mViewHolder); 753bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mPlaybackRowPresenter.onBindViewHolder(mViewHolder, mRow); 763bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 773bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 783bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 793bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public void sendKeyEvent(KeyEvent event) { 803bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mRootView.dispatchKeyEvent(event); 813bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 823bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 833bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public void sendKeyDownUp(int keyCode) { 843bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu sendKeyDownUp(keyCode, 1); 853bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 863bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 873bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public void sendKeyDownUp(int keyCode, int repeat) { 883bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu for (int i = 0; i < repeat; i++) { 893bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mRootView.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keyCode)); 903bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 913bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mRootView.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keyCode)); 923bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 933bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 943bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu @Override 953bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public void setPlaybackSeekUiClient(Client client) { 963bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mSeekClient = client; 973bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 983bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 993bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu protected Client mChainedClient = new Client() { 1003bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu @Override 1013bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public boolean isSeekEnabled() { 1023bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu return mSeekClient == null ? false : mSeekClient.isSeekEnabled(); 1033bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 1043bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 1053bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu @Override 1063bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public void onSeekStarted() { 1073bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mSeekClient.onSeekStarted(); 1083bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 1093bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 1103bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu @Override 1113bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public PlaybackSeekDataProvider getPlaybackSeekDataProvider() { 1123bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu return mSeekClient.getPlaybackSeekDataProvider(); 1133bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 1143bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 1153bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu @Override 1163bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public void onSeekPositionChanged(long pos) { 1173bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mSeekClient.onSeekPositionChanged(pos); 1183bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 1193bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu 1203bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu @Override 1213bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu public void onSeekFinished(boolean cancelled) { 1223bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu mSeekClient.onSeekFinished(cancelled); 1233bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu } 1243bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu }; 1253bcad88cbf4488e747d84893c35f2351b8f84afeDake Gu} 126