aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/tv/dvr/ui/browse/DvrItemPresenter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/tv/dvr/ui/browse/DvrItemPresenter.java')
-rw-r--r--src/com/android/tv/dvr/ui/browse/DvrItemPresenter.java140
1 files changed, 140 insertions, 0 deletions
diff --git a/src/com/android/tv/dvr/ui/browse/DvrItemPresenter.java b/src/com/android/tv/dvr/ui/browse/DvrItemPresenter.java
new file mode 100644
index 00000000..df0e61c1
--- /dev/null
+++ b/src/com/android/tv/dvr/ui/browse/DvrItemPresenter.java
@@ -0,0 +1,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);
+ }
+ }
+ };
+ }
+} \ No newline at end of file