aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/tv/dvr/ui/browse/DvrItemPresenter.java
blob: df0e61c1da1d19ad022bbf79fe6a1df633d9c931 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.tv.dvr.ui.browse;

import android.app.Activity;
import android.content.Context;
import android.support.annotation.CallSuper;
import android.support.v17.leanback.widget.Presenter;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

import com.android.tv.common.SoftPreconditions;
import com.android.tv.dvr.ui.DvrUiHelper;

import java.util.HashSet;
import java.util.Set;

/**
 * An abstract class to present DVR items in {@link RecordingCardView}, which is mainly used in
 * {@link DvrBrowseFragment}. DVR items might include:
 * {@link com.android.tv.dvr.data.ScheduledRecording},
 * {@link com.android.tv.dvr.data.RecordedProgram}, and
 * {@link com.android.tv.dvr.data.SeriesRecording}.
 */
public abstract class DvrItemPresenter<T> extends Presenter {
    protected final Context mContext;
    private final Set<DvrItemViewHolder> mBoundViewHolders = new HashSet<>();
    private final OnClickListener mOnClickListener = onCreateOnClickListener();

    protected class DvrItemViewHolder extends ViewHolder {
        DvrItemViewHolder(RecordingCardView view) {
            super(view);
        }

        protected RecordingCardView getView() {
            return (RecordingCardView) view;
        }

        protected void onBound(T item) { }

        protected void onUnbound() { }
    }

    DvrItemPresenter(Context context) {
        mContext = context;
    }

    @Override
    public final ViewHolder onCreateViewHolder(ViewGroup parent) {
        return onCreateDvrItemViewHolder();
    }

    @Override
    public final void onBindViewHolder(ViewHolder baseHolder, Object item) {
        DvrItemViewHolder viewHolder;
        T dvrItem;
        try {
            viewHolder = (DvrItemViewHolder) baseHolder;
            Class<T> itemType = (Class<T>) item.getClass();
            dvrItem = itemType.cast(item);
        } catch (ClassCastException e) {
            SoftPreconditions.checkState(false);
            return;
        }
        viewHolder.view.setTag(item);
        viewHolder.view.setOnClickListener(mOnClickListener);
        onBindDvrItemViewHolder(viewHolder, dvrItem);
        viewHolder.onBound(dvrItem);
        mBoundViewHolders.add(viewHolder);
    }

    @Override
    @CallSuper
    public void onUnbindViewHolder(ViewHolder baseHolder) {
        DvrItemViewHolder viewHolder = (DvrItemViewHolder) baseHolder;
        mBoundViewHolders.remove(viewHolder);
        viewHolder.onUnbound();
        viewHolder.view.setTag(null);
        viewHolder.view.setOnClickListener(null);
    }

    /**
     * Unbinds all bound view holders.
     */
    public void unbindAllViewHolders() {
        // When browse fragments are destroyed, RecyclerView would not call presenters'
        // onUnbindViewHolder(). We should handle it by ourselves to prevent resources leaks.
        for (ViewHolder viewHolder : new HashSet<>(mBoundViewHolders)) {
            onUnbindViewHolder(viewHolder);
        }
    }

    /**
     * This method will be called when a {@link DvrItemViewHolder} is needed to be created.
     */
    abstract protected DvrItemViewHolder onCreateDvrItemViewHolder();

    /**
     * This method will be called when a {@link DvrItemViewHolder} is bound to a DVR item.
     */
    abstract protected void onBindDvrItemViewHolder(DvrItemViewHolder viewHolder, T item);

    /**
     * Returns context.
     */
    protected Context getContext() {
        return mContext;
    }

    /**
     * Creates {@link OnClickListener} for DVR library's card views.
     */
    protected OnClickListener onCreateOnClickListener() {
        return new OnClickListener() {
            @Override
            public void onClick(View view) {
                if (view instanceof RecordingCardView) {
                    RecordingCardView v = (RecordingCardView) view;
                    DvrUiHelper.startDetailsActivity((Activity) v.getContext(),
                            v.getTag(), v.getImageView(), false);
                }
            }
        };
    }
}