PlaybackGlueHostImplWithViewHolder.java revision ac5fe7c617c66850fff75a9fce9979c6e5674b0f
1/* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package androidx.leanback.widget; 18 19import android.content.Context; 20import androidx.leanback.media.PlaybackGlueHostImpl; 21import android.view.KeyEvent; 22import android.view.View; 23import android.view.ViewGroup; 24import android.widget.FrameLayout; 25 26/** 27 * Example to create a ViewHolder and rebind when notifyPlaybackRowChanged. 28 */ 29public class PlaybackGlueHostImplWithViewHolder extends PlaybackGlueHostImpl 30 implements PlaybackSeekUi { 31 protected Context mContext; 32 protected PlaybackRowPresenter.ViewHolder mViewHolder; 33 protected ViewGroup mRootView; 34 35 protected int mLayoutWidth = 1920; 36 protected int mLayoutHeight = ViewGroup.LayoutParams.WRAP_CONTENT; 37 Client mSeekClient; 38 39 public PlaybackGlueHostImplWithViewHolder(Context context) { 40 mContext = context; 41 } 42 43 @Override 44 public void setPlaybackRow(Row row) { 45 super.setPlaybackRow(row); 46 createViewHolderIfNeeded(); 47 } 48 49 @Override 50 public void setPlaybackRowPresenter(PlaybackRowPresenter presenter) { 51 super.setPlaybackRowPresenter(presenter); 52 createViewHolderIfNeeded(); 53 } 54 55 void createViewHolderIfNeeded() { 56 if (mViewHolder == null && mPlaybackRowPresenter != null && mRow != null) { 57 mViewHolder = (PlaybackRowPresenter.ViewHolder) 58 mPlaybackRowPresenter.onCreateViewHolder(mRootView = new FrameLayout(mContext)); 59 // Bind ViewHolder before measure/layout so child views will get proper size 60 mPlaybackRowPresenter.onBindViewHolder(mViewHolder, mRow); 61 mRootView.addView(mViewHolder.view, mLayoutWidth, mLayoutHeight); 62 mRootView.measure( 63 View.MeasureSpec.makeMeasureSpec(1920, View.MeasureSpec.AT_MOST), 64 View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 65 mRootView.layout(0, 0, mRootView.getMeasuredWidth(), mRootView.getMeasuredHeight()); 66 if (mViewHolder instanceof PlaybackSeekUi) { 67 ((PlaybackSeekUi) mViewHolder).setPlaybackSeekUiClient(mChainedClient); 68 } 69 } 70 } 71 72 @Override 73 public void notifyPlaybackRowChanged() { 74 if (mViewHolder != null) { 75 mPlaybackRowPresenter.onUnbindRowViewHolder(mViewHolder); 76 mPlaybackRowPresenter.onBindViewHolder(mViewHolder, mRow); 77 } 78 } 79 80 public void sendKeyEvent(KeyEvent event) { 81 mRootView.dispatchKeyEvent(event); 82 } 83 84 public void sendKeyDownUp(int keyCode) { 85 sendKeyDownUp(keyCode, 1); 86 } 87 88 public void sendKeyDownUp(int keyCode, int repeat) { 89 for (int i = 0; i < repeat; i++) { 90 mRootView.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keyCode)); 91 } 92 mRootView.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keyCode)); 93 } 94 95 @Override 96 public void setPlaybackSeekUiClient(Client client) { 97 mSeekClient = client; 98 } 99 100 protected Client mChainedClient = new Client() { 101 @Override 102 public boolean isSeekEnabled() { 103 return mSeekClient == null ? false : mSeekClient.isSeekEnabled(); 104 } 105 106 @Override 107 public void onSeekStarted() { 108 mSeekClient.onSeekStarted(); 109 } 110 111 @Override 112 public PlaybackSeekDataProvider getPlaybackSeekDataProvider() { 113 return mSeekClient.getPlaybackSeekDataProvider(); 114 } 115 116 @Override 117 public void onSeekPositionChanged(long pos) { 118 mSeekClient.onSeekPositionChanged(pos); 119 } 120 121 @Override 122 public void onSeekFinished(boolean cancelled) { 123 mSeekClient.onSeekFinished(cancelled); 124 } 125 }; 126} 127