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