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