1package android.support.v17.leanback.widget;
2
3import android.support.v17.leanback.R;
4
5import android.graphics.drawable.Drawable;
6import android.view.LayoutInflater;
7import android.view.View;
8import android.view.ViewGroup;
9import android.view.ViewGroup.MarginLayoutParams;
10import android.widget.ImageView;
11
12/**
13 * Presenter that responsible to create a ImageView and bind to DetailsOverviewRow. The default
14 * implementation uses {@link DetailsOverviewRow#getImageDrawable()} and binds to {@link ImageView}.
15 * <p>
16 * Subclass may override and has its own image view. Subclass may also download image from URL
17 * instead of using {@link DetailsOverviewRow#getImageDrawable()}. It's subclass's responsibility to
18 * call {@link FullWidthDetailsOverviewRowPresenter#notifyOnBindLogo(FullWidthDetailsOverviewRowPresenter.ViewHolder)}
19 * whenever {@link #isBoundToImage(ViewHolder, DetailsOverviewRow)} turned to true so that activity
20 * transition can be started.
21 */
22public class DetailsOverviewLogoPresenter extends Presenter {
23
24    public static class ViewHolder extends Presenter.ViewHolder {
25
26        protected FullWidthDetailsOverviewRowPresenter mParentPresenter;
27        protected FullWidthDetailsOverviewRowPresenter.ViewHolder mParentViewHolder;
28
29        public ViewHolder(View view) {
30            super(view);
31        }
32    }
33
34    @Override
35    public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
36        View view = LayoutInflater.from(parent.getContext())
37                .inflate(R.layout.lb_fullwidth_details_overview_logo, parent, false);
38        view.setLayoutParams(new ViewGroup.MarginLayoutParams(0, 0));
39        return new ViewHolder(view);
40    }
41
42    /**
43     * Called from {@link FullWidthDetailsOverviewRowPresenter} to setup FullWidthDetailsOverviewRowPresenter
44     * and FullWidthDetailsOverviewRowPresenter.ViewHolder that hosts the logo.
45     * @param viewHolder
46     * @param parentViewHolder
47     * @param parentPresenter
48     */
49    public void setContext(ViewHolder viewHolder,
50            FullWidthDetailsOverviewRowPresenter.ViewHolder parentViewHolder,
51            FullWidthDetailsOverviewRowPresenter parentPresenter) {
52        viewHolder.mParentViewHolder = parentViewHolder;
53        viewHolder.mParentPresenter = parentPresenter;
54    }
55
56    /**
57     * Returns true if the logo view is bound to image. Subclass may override. The default
58     * implementation returns true when {@link DetailsOverviewRow#getImageDrawable()} is not null.
59     * If subclass of DetailsOverviewLogoPresenter manages its own image drawable, it should
60     * override this function to report status correctly and invoke
61     * {@link FullWidthDetailsOverviewRowPresenter#notifyOnBindLogo(FullWidthDetailsOverviewRowPresenter.ViewHolder)}
62     * when image view is bound to the drawable.
63     */
64    public boolean isBoundToImage(ViewHolder viewHolder, DetailsOverviewRow row) {
65        return row != null && row.getImageDrawable() != null;
66    }
67
68    @Override
69    public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
70        DetailsOverviewRow row = (DetailsOverviewRow) item;
71        ImageView imageView = ((ImageView) viewHolder.view);
72        imageView.setImageDrawable(row.getImageDrawable());
73        if (isBoundToImage((ViewHolder) viewHolder, row)) {
74            ViewGroup.LayoutParams lp = imageView.getLayoutParams();
75            lp.width = row.getImageDrawable().getIntrinsicWidth();
76            lp.height = row.getImageDrawable().getIntrinsicHeight();
77            imageView.setLayoutParams(lp);
78            ViewHolder vh = (ViewHolder) viewHolder;
79            vh.mParentPresenter.notifyOnBindLogo(vh.mParentViewHolder);
80        }
81    }
82
83    @Override
84    public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
85    }
86
87}
88