DetailsOverviewRowPresenter.java revision 09d52d76912e3689cc2b58b7bb3f44b923915fd8
1a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn/*
2a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn * Copyright (C) 2014 The Android Open Source Project
3a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn *
4a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn * in compliance with the License. You may obtain a copy of the License at
6a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn *
7a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn * http://www.apache.org/licenses/LICENSE-2.0
8a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn *
9a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn * Unless required by applicable law or agreed to in writing, software distributed under the License
10a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn * or implied. See the License for the specific language governing permissions and limitations under
12a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn * the License.
13a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn */
14a83005b70853ea52c5d98910762344de16b850a8Tim Kilbournpackage android.support.v17.leanback.widget;
15a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
164121f22713bbed467a977ec0d867ef53989ff374Dake Guimport android.app.Activity;
17d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stoutimport android.content.Context;
18e23ea69ec54eb70d17239ba671fcd75563780553Craig Stoutimport android.graphics.Bitmap;
19d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stoutimport android.graphics.Color;
207728d53c5c50e8ed807e8f4a189e34684de04800Craig Stoutimport android.graphics.drawable.Drawable;
21e23ea69ec54eb70d17239ba671fcd75563780553Craig Stoutimport android.graphics.drawable.BitmapDrawable;
2209d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stoutimport android.graphics.drawable.ColorDrawable;
23a83005b70853ea52c5d98910762344de16b850a8Tim Kilbournimport android.support.v17.leanback.R;
242e0c922430f8c285b4325da52d69c09451069c93Craig Stoutimport android.support.v7.widget.RecyclerView;
252e0c922430f8c285b4325da52d69c09451069c93Craig Stoutimport android.util.Log;
26d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stoutimport android.util.TypedValue;
27a83005b70853ea52c5d98910762344de16b850a8Tim Kilbournimport android.view.LayoutInflater;
28a83005b70853ea52c5d98910762344de16b850a8Tim Kilbournimport android.view.View;
29a83005b70853ea52c5d98910762344de16b850a8Tim Kilbournimport android.view.ViewGroup;
30a83005b70853ea52c5d98910762344de16b850a8Tim Kilbournimport android.widget.FrameLayout;
31a83005b70853ea52c5d98910762344de16b850a8Tim Kilbournimport android.widget.ImageView;
32a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
33a83005b70853ea52c5d98910762344de16b850a8Tim Kilbournimport java.util.Collection;
34a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
35a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn/**
3680d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn * A DetailsOverviewRowPresenter renders a {@link DetailsOverviewRow} to display an
37a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn * overview of an item. Typically this row will be the first row in a fragment
3880d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn * such as the {@link android.support.v17.leanback.app.DetailsFragment
3918c8048f17940359b8bce99cb46d24337bff8997Dake Gu * DetailsFragment}.  View created by DetailsOverviewRowPresenter is made in three parts:
4018c8048f17940359b8bce99cb46d24337bff8997Dake Gu * ImageView on the left, action list view on the bottom and a customizable detailed
4118c8048f17940359b8bce99cb46d24337bff8997Dake Gu * description view on the right.
42a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn *
4318c8048f17940359b8bce99cb46d24337bff8997Dake Gu * <p>The detailed description is rendered using a {@link Presenter} passed in
4418c8048f17940359b8bce99cb46d24337bff8997Dake Gu * {@link #DetailsOverviewRowPresenter(Presenter)}.  User can access detailed description
4518c8048f17940359b8bce99cb46d24337bff8997Dake Gu * ViewHolder from {@link ViewHolder#mDetailsDescriptionViewHolder}.
4618c8048f17940359b8bce99cb46d24337bff8997Dake Gu * </p>
4718c8048f17940359b8bce99cb46d24337bff8997Dake Gu *
4818c8048f17940359b8bce99cb46d24337bff8997Dake Gu * <p>
4918c8048f17940359b8bce99cb46d24337bff8997Dake Gu * To participate in activity transition, call {@link #setSharedElementEnterTransition(Activity,
5018c8048f17940359b8bce99cb46d24337bff8997Dake Gu * String)} during Activity's onCreate().
5118c8048f17940359b8bce99cb46d24337bff8997Dake Gu * </p>
5218c8048f17940359b8bce99cb46d24337bff8997Dake Gu *
5318c8048f17940359b8bce99cb46d24337bff8997Dake Gu * <p>
5418c8048f17940359b8bce99cb46d24337bff8997Dake Gu * Because transition support and layout are fully controlled by DetailsOverviewRowPresenter,
5518c8048f17940359b8bce99cb46d24337bff8997Dake Gu * developer can not override DetailsOverviewRowPresenter.ViewHolder for adding/replacing views
5618c8048f17940359b8bce99cb46d24337bff8997Dake Gu * of DetailsOverviewRowPresenter.  If developer wants more customization beyond replacing
5718c8048f17940359b8bce99cb46d24337bff8997Dake Gu * detailed description , he/she should write a new presenter class for row object.
5818c8048f17940359b8bce99cb46d24337bff8997Dake Gu * </p>
59a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn */
60a83005b70853ea52c5d98910762344de16b850a8Tim Kilbournpublic class DetailsOverviewRowPresenter extends RowPresenter {
61a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
62a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    private static final String TAG = "DetailsOverviewRowPresenter";
63a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    private static final boolean DEBUG = false;
64a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
652e0c922430f8c285b4325da52d69c09451069c93Craig Stout    private static final int MORE_ACTIONS_FADE_MS = 100;
662e0c922430f8c285b4325da52d69c09451069c93Craig Stout
6780d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn    /**
6880d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     * A ViewHolder for the DetailsOverviewRow.
6980d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     */
70cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout    public final class ViewHolder extends RowPresenter.ViewHolder {
7109d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout        final FrameLayout mOverviewFrame;
72b34a2372153298ebdc3e148e1c1f3b3924efab08Dake Gu        final ViewGroup mOverviewView;
73a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        final ImageView mImageView;
744121f22713bbed467a977ec0d867ef53989ff374Dake Gu        final ViewGroup mRightPanel;
75a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        final FrameLayout mDetailsDescriptionFrame;
76a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        final HorizontalGridView mActionsRow;
7718c8048f17940359b8bce99cb46d24337bff8997Dake Gu        public final Presenter.ViewHolder mDetailsDescriptionViewHolder;
7883118b72d02074ee35f07ad0253579565c16882bCraig Stout        int mNumItems;
7983118b72d02074ee35f07ad0253579565c16882bCraig Stout        boolean mShowMoreRight;
8083118b72d02074ee35f07ad0253579565c16882bCraig Stout        boolean mShowMoreLeft;
81cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        final ItemBridgeAdapter mActionBridgeAdapter = new ItemBridgeAdapter();
82a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
83cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        void bind(ObjectAdapter adapter) {
84cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            mActionBridgeAdapter.setAdapter(adapter);
8537eb0e53ba5363bbe15314c7d19d4b2d6024a5aaDake Gu            mActionsRow.setAdapter(mActionBridgeAdapter);
86cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            mNumItems = mActionBridgeAdapter.getItemCount();
872e0c922430f8c285b4325da52d69c09451069c93Craig Stout
8883118b72d02074ee35f07ad0253579565c16882bCraig Stout            mShowMoreRight = false;
8983118b72d02074ee35f07ad0253579565c16882bCraig Stout            mShowMoreLeft = true;
9083118b72d02074ee35f07ad0253579565c16882bCraig Stout            showMoreLeft(false);
9183118b72d02074ee35f07ad0253579565c16882bCraig Stout        }
9283118b72d02074ee35f07ad0253579565c16882bCraig Stout
93819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout        final View.OnLayoutChangeListener mLayoutChangeListener =
94819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout                new View.OnLayoutChangeListener() {
95819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout
96819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout            @Override
97819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout            public void onLayoutChange(View v, int left, int top, int right,
98819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout                    int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
99819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout                if (DEBUG) Log.v(TAG, "onLayoutChange " + v);
100819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout                checkFirstAndLastPosition(false);
101819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout            }
102819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout        };
103819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout
104cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        final OnChildSelectedListener mChildSelectedListener = new OnChildSelectedListener() {
105cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            @Override
106cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
107cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                dispatchItemSelection(view);
108cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            }
109cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        };
110cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout
111cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        void dispatchItemSelection(View view) {
112cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            if (!isSelected()) {
113cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                return;
114cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            }
115cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            ItemBridgeAdapter.ViewHolder ibvh = (ItemBridgeAdapter.ViewHolder) (view != null ?
116cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                    mActionsRow.getChildViewHolder(view) :
117cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                    mActionsRow.findViewHolderForPosition(mActionsRow.getSelectedPosition()));
118cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            if (ibvh == null) {
119cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                if (getOnItemSelectedListener() != null) {
120cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                    getOnItemSelectedListener().onItemSelected(null, getRow());
121cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                }
122cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                if (getOnItemViewSelectedListener() != null) {
123cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                    getOnItemViewSelectedListener().onItemSelected(null, null,
124cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                            ViewHolder.this, getRow());
125cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                }
126cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            } else {
127cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                if (getOnItemSelectedListener() != null) {
128cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                    getOnItemSelectedListener().onItemSelected(ibvh.getItem(), getRow());
129cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                }
130cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                if (getOnItemViewSelectedListener() != null) {
131cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                    getOnItemViewSelectedListener().onItemSelected(ibvh.getViewHolder(), ibvh.getItem(),
132cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                            ViewHolder.this, getRow());
133cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                }
134cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            }
135cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        };
136cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout
13783118b72d02074ee35f07ad0253579565c16882bCraig Stout        final ItemBridgeAdapter.AdapterListener mAdapterListener =
13883118b72d02074ee35f07ad0253579565c16882bCraig Stout                new ItemBridgeAdapter.AdapterListener() {
1392e0c922430f8c285b4325da52d69c09451069c93Craig Stout
14083118b72d02074ee35f07ad0253579565c16882bCraig Stout            @Override
141cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            public void onBind(final ItemBridgeAdapter.ViewHolder ibvh) {
142cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                if (getOnItemViewClickedListener() != null || getOnItemClickedListener() != null
143cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                        || mActionClickedListener != null) {
144cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                    ibvh.getPresenter().setOnClickListener(
145cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                            ibvh.getViewHolder(), new View.OnClickListener() {
146cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                                @Override
147cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                                public void onClick(View v) {
148cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                                    if (getOnItemViewClickedListener() != null) {
149cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                                        getOnItemViewClickedListener().onItemClicked(ibvh.getViewHolder(),
150cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                                                ibvh.getItem(), ViewHolder.this, getRow());
151cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                                    }
152cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                                    if (mActionClickedListener != null) {
153cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                                        mActionClickedListener.onActionClicked((Action) ibvh.getItem());
154cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                                    }
155cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                                }
156cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                            });
157cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                }
158cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            }
159cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            @Override
160cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            public void onUnbind(final ItemBridgeAdapter.ViewHolder ibvh) {
161cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                if (getOnItemViewClickedListener() != null || getOnItemClickedListener() != null
162cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                        || mActionClickedListener != null) {
163cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                    ibvh.getPresenter().setOnClickListener(ibvh.getViewHolder(), null);
164cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout                }
165cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            }
166cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            @Override
16783118b72d02074ee35f07ad0253579565c16882bCraig Stout            public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder viewHolder) {
168819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout                // Remove first to ensure we don't add ourselves more than once.
169819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout                viewHolder.itemView.removeOnLayoutChangeListener(mLayoutChangeListener);
170819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout                viewHolder.itemView.addOnLayoutChangeListener(mLayoutChangeListener);
17183118b72d02074ee35f07ad0253579565c16882bCraig Stout            }
17283118b72d02074ee35f07ad0253579565c16882bCraig Stout            @Override
17383118b72d02074ee35f07ad0253579565c16882bCraig Stout            public void onDetachedFromWindow(ItemBridgeAdapter.ViewHolder viewHolder) {
174819b4e55bcf37847548a55c5dac0dfa8323975f6Craig Stout                viewHolder.itemView.removeOnLayoutChangeListener(mLayoutChangeListener);
17583118b72d02074ee35f07ad0253579565c16882bCraig Stout                checkFirstAndLastPosition(false);
1762e0c922430f8c285b4325da52d69c09451069c93Craig Stout            }
17783118b72d02074ee35f07ad0253579565c16882bCraig Stout        };
17883118b72d02074ee35f07ad0253579565c16882bCraig Stout
17983118b72d02074ee35f07ad0253579565c16882bCraig Stout        final RecyclerView.OnScrollListener mScrollListener =
18083118b72d02074ee35f07ad0253579565c16882bCraig Stout                new RecyclerView.OnScrollListener() {
1812e0c922430f8c285b4325da52d69c09451069c93Craig Stout
1822e0c922430f8c285b4325da52d69c09451069c93Craig Stout            @Override
183cef7b4942bacc862ea4eac66952e9f7aba027d18Yigit Boyar            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
1842e0c922430f8c285b4325da52d69c09451069c93Craig Stout            }
1852e0c922430f8c285b4325da52d69c09451069c93Craig Stout            @Override
186cef7b4942bacc862ea4eac66952e9f7aba027d18Yigit Boyar            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
18783118b72d02074ee35f07ad0253579565c16882bCraig Stout                checkFirstAndLastPosition(true);
1882e0c922430f8c285b4325da52d69c09451069c93Craig Stout            }
18983118b72d02074ee35f07ad0253579565c16882bCraig Stout        };
19083118b72d02074ee35f07ad0253579565c16882bCraig Stout
19183118b72d02074ee35f07ad0253579565c16882bCraig Stout        private int getViewCenter(View view) {
19283118b72d02074ee35f07ad0253579565c16882bCraig Stout            return (view.getRight() - view.getLeft()) / 2;
19383118b72d02074ee35f07ad0253579565c16882bCraig Stout        }
19483118b72d02074ee35f07ad0253579565c16882bCraig Stout
19583118b72d02074ee35f07ad0253579565c16882bCraig Stout        private void checkFirstAndLastPosition(boolean fromScroll) {
19683118b72d02074ee35f07ad0253579565c16882bCraig Stout            RecyclerView.ViewHolder viewHolder;
1972e0c922430f8c285b4325da52d69c09451069c93Craig Stout
19883118b72d02074ee35f07ad0253579565c16882bCraig Stout            viewHolder = mActionsRow.findViewHolderForPosition(mNumItems - 1);
19983118b72d02074ee35f07ad0253579565c16882bCraig Stout            boolean showRight = (viewHolder == null ||
20083118b72d02074ee35f07ad0253579565c16882bCraig Stout                    viewHolder.itemView.getRight() > mActionsRow.getWidth());
20183118b72d02074ee35f07ad0253579565c16882bCraig Stout
20283118b72d02074ee35f07ad0253579565c16882bCraig Stout            viewHolder = mActionsRow.findViewHolderForPosition(0);
20383118b72d02074ee35f07ad0253579565c16882bCraig Stout            boolean showLeft = (viewHolder == null || viewHolder.itemView.getLeft() < 0);
20483118b72d02074ee35f07ad0253579565c16882bCraig Stout
20583118b72d02074ee35f07ad0253579565c16882bCraig Stout            if (DEBUG) Log.v(TAG, "checkFirstAndLast fromScroll " + fromScroll +
20683118b72d02074ee35f07ad0253579565c16882bCraig Stout                    " showRight " + showRight + " showLeft " + showLeft);
20783118b72d02074ee35f07ad0253579565c16882bCraig Stout
20883118b72d02074ee35f07ad0253579565c16882bCraig Stout            showMoreRight(showRight);
20983118b72d02074ee35f07ad0253579565c16882bCraig Stout            showMoreLeft(showLeft);
21083118b72d02074ee35f07ad0253579565c16882bCraig Stout        }
21183118b72d02074ee35f07ad0253579565c16882bCraig Stout
21283118b72d02074ee35f07ad0253579565c16882bCraig Stout        private void showMoreLeft(boolean show) {
21383118b72d02074ee35f07ad0253579565c16882bCraig Stout            if (show != mShowMoreLeft) {
21483118b72d02074ee35f07ad0253579565c16882bCraig Stout                mActionsRow.setFadingLeftEdge(show);
21583118b72d02074ee35f07ad0253579565c16882bCraig Stout                mShowMoreLeft = show;
2162e0c922430f8c285b4325da52d69c09451069c93Craig Stout            }
21783118b72d02074ee35f07ad0253579565c16882bCraig Stout        }
2182e0c922430f8c285b4325da52d69c09451069c93Craig Stout
21983118b72d02074ee35f07ad0253579565c16882bCraig Stout        private void showMoreRight(boolean show) {
22083118b72d02074ee35f07ad0253579565c16882bCraig Stout            if (show != mShowMoreRight) {
22183118b72d02074ee35f07ad0253579565c16882bCraig Stout                mActionsRow.setFadingRightEdge(show);
22283118b72d02074ee35f07ad0253579565c16882bCraig Stout                mShowMoreRight = show;
2232e0c922430f8c285b4325da52d69c09451069c93Craig Stout            }
2242e0c922430f8c285b4325da52d69c09451069c93Craig Stout        }
2252e0c922430f8c285b4325da52d69c09451069c93Craig Stout
22680d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn        /**
22780d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn         * Constructor for the ViewHolder.
22880d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn         *
22980d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn         * @param rootView The root View that this view holder will be attached
23080d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn         *        to.
23180d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn         */
23218c8048f17940359b8bce99cb46d24337bff8997Dake Gu        public ViewHolder(View rootView, Presenter detailsPresenter) {
233a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn            super(rootView);
23409d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout            mOverviewFrame = (FrameLayout) rootView.findViewById(R.id.details_frame);
235b34a2372153298ebdc3e148e1c1f3b3924efab08Dake Gu            mOverviewView = (ViewGroup) rootView.findViewById(R.id.details_overview);
236a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn            mImageView = (ImageView) rootView.findViewById(R.id.details_overview_image);
2374121f22713bbed467a977ec0d867ef53989ff374Dake Gu            mRightPanel = (ViewGroup) rootView.findViewById(R.id.details_overview_right_panel);
238a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn            mDetailsDescriptionFrame =
2394121f22713bbed467a977ec0d867ef53989ff374Dake Gu                    (FrameLayout) mRightPanel.findViewById(R.id.details_overview_description);
24070c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn            mActionsRow =
2414121f22713bbed467a977ec0d867ef53989ff374Dake Gu                    (HorizontalGridView) mRightPanel.findViewById(R.id.details_overview_actions);
242ceb7ab2ddd6e157cd4ade0f14a382c39428163c4Dake Gu            mActionsRow.setHasOverlappingRendering(false);
2432e0c922430f8c285b4325da52d69c09451069c93Craig Stout            mActionsRow.setOnScrollListener(mScrollListener);
244cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            mActionsRow.setAdapter(mActionBridgeAdapter);
245cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            mActionsRow.setOnChildSelectedListener(mChildSelectedListener);
2462e0c922430f8c285b4325da52d69c09451069c93Craig Stout
2472e0c922430f8c285b4325da52d69c09451069c93Craig Stout            final int fadeLength = rootView.getResources().getDimensionPixelSize(
2482e0c922430f8c285b4325da52d69c09451069c93Craig Stout                    R.dimen.lb_details_overview_actions_fade_size);
2492e0c922430f8c285b4325da52d69c09451069c93Craig Stout            mActionsRow.setFadingRightEdgeLength(fadeLength);
2502e0c922430f8c285b4325da52d69c09451069c93Craig Stout            mActionsRow.setFadingLeftEdgeLength(fadeLength);
25118c8048f17940359b8bce99cb46d24337bff8997Dake Gu            mDetailsDescriptionViewHolder =
25218c8048f17940359b8bce99cb46d24337bff8997Dake Gu                    detailsPresenter.onCreateViewHolder(mDetailsDescriptionFrame);
25318c8048f17940359b8bce99cb46d24337bff8997Dake Gu            mDetailsDescriptionFrame.addView(mDetailsDescriptionViewHolder.view);
254cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout
255cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            mActionBridgeAdapter.setAdapterListener(mAdapterListener);
256a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        }
257a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    }
258a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
259c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout    private static float sShadowZ;
260c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout
261a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    private final Presenter mDetailsPresenter;
26270c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn    private final ActionPresenterSelector mActionPresenterSelector;
263cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout    private OnActionClickedListener mActionClickedListener;
264cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout
265d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    private int mBackgroundColor = Color.TRANSPARENT;
266d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    private boolean mBackgroundColorSet;
267d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    private boolean mIsStyleLarge = true;
268a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
2694121f22713bbed467a977ec0d867ef53989ff374Dake Gu    private DetailsOverviewSharedElementHelper mSharedElementHelper;
2704121f22713bbed467a977ec0d867ef53989ff374Dake Gu
271a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    /**
27280d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     * Constructor for a DetailsOverviewRowPresenter.
27380d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     *
27480d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     * @param detailsPresenter The {@link Presenter} used to render the detailed
27580d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     *        description of the row.
276a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn     */
277a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    public DetailsOverviewRowPresenter(Presenter detailsPresenter) {
278d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout        setHeaderPresenter(null);
279a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        setSelectEffectEnabled(false);
280a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        mDetailsPresenter = detailsPresenter;
281e652714f2fcc876de6f168b28dd03bfc22e1cb96Tim Kilbourn        mActionPresenterSelector = new ActionPresenterSelector();
282a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    }
283a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
28470c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn    /**
28580d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     * Sets the listener for Action click events.
28670c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn     */
28770c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn    public void setOnActionClickedListener(OnActionClickedListener listener) {
288cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        mActionClickedListener = listener;
28970c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn    }
29070c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn
29170c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn    /**
29280d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     * Gets the listener for Action click events.
29370c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn     */
29470c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn    public OnActionClickedListener getOnActionClickedListener() {
295cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        return mActionClickedListener;
29670c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn    }
29770c858a5ca5b7ed9862e2edfa43912faecf42f96Tim Kilbourn
298d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    /**
29980d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     * Sets the background color.  If not set, a default from the theme will be used.
300d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout     */
301d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    public void setBackgroundColor(int color) {
302d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout        mBackgroundColor = color;
303d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout        mBackgroundColorSet = true;
304d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    }
305d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout
306d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    /**
30780d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     * Returns the background color.  If no background color was set, transparent
30880d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     * is returned.
309d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout     */
310d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    public int getBackgroundColor() {
311d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout        return mBackgroundColor;
312d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    }
313d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout
314d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    /**
31580d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     * Sets the layout style to be large or small. This affects the height of
31680d04d2265fe28800fcbc7e8cc7d6d229a7913d8Tim Kilbourn     * the overview, including the text description. The default is large.
317d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout     */
318d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    public void setStyleLarge(boolean large) {
319d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout        mIsStyleLarge = large;
320d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    }
321d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout
322d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    /**
323d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout     * Returns true if the layout style is large.
324d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout     */
325d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    public boolean isStyleLarge() {
326d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout        return mIsStyleLarge;
327d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    }
328d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout
3299de363b8db05106b03d115c266859fe200d41db7Dake Gu    /**
3304121f22713bbed467a977ec0d867ef53989ff374Dake Gu     * Set enter transition of target activity (typically a DetailActivity) to be
3314121f22713bbed467a977ec0d867ef53989ff374Dake Gu     * transiting into overview row created by this presenter.
3324121f22713bbed467a977ec0d867ef53989ff374Dake Gu     * <p>
3334121f22713bbed467a977ec0d867ef53989ff374Dake Gu     * It assumes shared element passed from calling activity is an ImageView;
3344121f22713bbed467a977ec0d867ef53989ff374Dake Gu     * the shared element transits to overview image on the left of detail
3354121f22713bbed467a977ec0d867ef53989ff374Dake Gu     * overview row, while bounds of overview row grows and reveals text
3364121f22713bbed467a977ec0d867ef53989ff374Dake Gu     * and buttons on the right.
3374121f22713bbed467a977ec0d867ef53989ff374Dake Gu     * <p>
3384121f22713bbed467a977ec0d867ef53989ff374Dake Gu     * The method must be invoked in target Activity's onCreate().
3399de363b8db05106b03d115c266859fe200d41db7Dake Gu     */
3404121f22713bbed467a977ec0d867ef53989ff374Dake Gu    public final void setSharedElementEnterTransition(Activity activity,
3414121f22713bbed467a977ec0d867ef53989ff374Dake Gu            String sharedElementName) {
3424121f22713bbed467a977ec0d867ef53989ff374Dake Gu        if (mSharedElementHelper == null) {
3434121f22713bbed467a977ec0d867ef53989ff374Dake Gu            mSharedElementHelper = new DetailsOverviewSharedElementHelper();
3444121f22713bbed467a977ec0d867ef53989ff374Dake Gu        }
3454121f22713bbed467a977ec0d867ef53989ff374Dake Gu        mSharedElementHelper.setSharedElementEnterTransition(activity, sharedElementName);
3469de363b8db05106b03d115c266859fe200d41db7Dake Gu    }
3479de363b8db05106b03d115c266859fe200d41db7Dake Gu
348d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    private int getDefaultBackgroundColor(Context context) {
349d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout        TypedValue outValue = new TypedValue();
350056561d81012983d2d27b8665c4aeabb427174cbTim Kilbourn        context.getTheme().resolveAttribute(R.attr.defaultBrandColor, outValue, true);
351d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout        return context.getResources().getColor(outValue.resourceId);
352d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    }
353d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout
354cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout    protected void onRowViewSelected(RowPresenter.ViewHolder vh, boolean selected) {
355cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        super.onRowViewSelected(vh, selected);
356cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        if (selected) {
357cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout            ((ViewHolder) vh).dispatchItemSelection(null);
358cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        }
359cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout    }
360cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout
361a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    @Override
362a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    protected RowPresenter.ViewHolder createRowViewHolder(ViewGroup parent) {
363a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        View v = LayoutInflater.from(parent.getContext())
364a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn            .inflate(R.layout.lb_details_overview, parent, false);
36518c8048f17940359b8bce99cb46d24337bff8997Dake Gu        ViewHolder vh = new ViewHolder(v, mDetailsPresenter);
366a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
36750ea3557b75826b3f51480715df1973472e345c4Craig Stout        initDetailsOverview(vh);
368d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout
369a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        return vh;
370a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    }
371a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
372e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout    private int getCardHeight(Context context) {
373d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout        int resId = mIsStyleLarge ? R.dimen.lb_details_overview_height_large :
374d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout            R.dimen.lb_details_overview_height_small;
375e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        return context.getResources().getDimensionPixelSize(resId);
376e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout    }
377d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout
378e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout    private void initDetailsOverview(ViewHolder vh) {
3794f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout        final View overview = vh.mOverviewView;
38050ea3557b75826b3f51480715df1973472e345c4Craig Stout        ViewGroup.LayoutParams lp = overview.getLayoutParams();
381e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        lp.height = getCardHeight(overview.getContext());
38250ea3557b75826b3f51480715df1973472e345c4Craig Stout        overview.setLayoutParams(lp);
383d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout
384c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout        if (sShadowZ == 0) {
385c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout            sShadowZ = overview.getResources().getDimensionPixelSize(
386c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout                    R.dimen.lb_details_overview_z);
387c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout        }
388c62efa44831b1c60dcbdfd968735e27ac8294439Craig Stout        ShadowHelper.getInstance().setZ(overview, sShadowZ);
38909d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout
39009d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout        if (!getSelectEffectEnabled()) {
39109d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout            vh.mOverviewFrame.setForeground(null);
39209d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout        }
393d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout    }
394d2c235afaa4119599fd8bfc9bff65c5af9a8fdc1Craig Stout
3957728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout    private static int getNonNegativeWidth(Drawable drawable) {
3967728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout        final int width = (drawable == null) ? 0 : drawable.getIntrinsicWidth();
3977728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout        return (width > 0 ? width : 0);
3987728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout    }
3997728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout
4007728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout    private static int getNonNegativeHeight(Drawable drawable) {
4017728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout        final int height = (drawable == null) ? 0 : drawable.getIntrinsicHeight();
4027728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout        return (height > 0 ? height : 0);
4037728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout    }
4047728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout
405a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    @Override
406cb13a318e577e14461eb008071dddf762847de42Dake Gu    protected void onBindRowViewHolder(RowPresenter.ViewHolder holder, Object item) {
407cb13a318e577e14461eb008071dddf762847de42Dake Gu        super.onBindRowViewHolder(holder, item);
408a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
409a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        DetailsOverviewRow row = (DetailsOverviewRow) item;
410a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        ViewHolder vh = (ViewHolder) holder;
411e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout
412e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        ViewGroup.MarginLayoutParams layoutParams =
413e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout                (ViewGroup.MarginLayoutParams) vh.mImageView.getLayoutParams();
414e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        final int cardHeight = getCardHeight(vh.mImageView.getContext());
415e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        final int verticalMargin = vh.mImageView.getResources().getDimensionPixelSize(
416e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout                R.dimen.lb_details_overview_image_margin_vertical);
417e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        final int horizontalMargin = vh.mImageView.getResources().getDimensionPixelSize(
418e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout                R.dimen.lb_details_overview_image_margin_horizontal);
4197728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout        final int drawableWidth = getNonNegativeWidth(row.getImageDrawable());
4207728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout        final int drawableHeight = getNonNegativeHeight(row.getImageDrawable());
4217728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout
422e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        boolean scaleImage = row.isImageScaleUpAllowed();
423e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        boolean useMargin = false;
424e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout
4257728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout        if (row.getImageDrawable() != null) {
4267728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            boolean landscape = false;
4277728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout
4287728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            // If large style and landscape image we always use margin.
4297728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            if (drawableWidth > drawableHeight) {
4307728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                landscape = true;
4317728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                if (mIsStyleLarge) {
4327728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                    useMargin = true;
4337728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                }
434e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            }
4357728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            // If long dimension bigger than the card height we scale down.
4367728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            if ((landscape && drawableWidth > cardHeight) ||
4377728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                    (!landscape && drawableHeight > cardHeight)) {
438e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout                scaleImage = true;
439e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            }
4407728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            // If we're not scaling to fit the card height then we always use margin.
4417728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            if (!scaleImage) {
4427728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                useMargin = true;
4437728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            }
4447728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            // If using margin than may need to scale down.
4457728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            if (useMargin && !scaleImage) {
4467728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                if (landscape && drawableWidth > cardHeight - horizontalMargin) {
4477728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                    scaleImage = true;
4487728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                } else if (!landscape && drawableHeight > cardHeight - 2 * verticalMargin) {
4497728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                    scaleImage = true;
4507728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout                }
4517728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            }
452e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        }
453e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout
4544f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout        final int bgColor = mBackgroundColorSet ? mBackgroundColor :
4554f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout            getDefaultBackgroundColor(vh.mOverviewView.getContext());
4564f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout
457e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        if (useMargin) {
458e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            layoutParams.leftMargin = horizontalMargin;
459e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            layoutParams.topMargin = layoutParams.bottomMargin = verticalMargin;
4604f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout            RoundedRectHelper.getInstance().setRoundedRectBackground(vh.mOverviewView, bgColor);
46172a2146f4c3e6dbb84a5f9f92e7ab42d142dab04Dake Gu            vh.mRightPanel.setBackground(null);
462836443f4a3b69eb7a88ffeb65a39e11439dee55eDake Gu            vh.mImageView.setBackground(null);
463e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        } else {
464e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            layoutParams.leftMargin = layoutParams.topMargin = layoutParams.bottomMargin = 0;
4654f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout            vh.mRightPanel.setBackgroundColor(bgColor);
4664f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout            vh.mImageView.setBackgroundColor(bgColor);
4674f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout            RoundedRectHelper.getInstance().setRoundedRectBackground(vh.mOverviewView,
4684f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout                    Color.TRANSPARENT);
469e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        }
470e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        if (scaleImage) {
471e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            vh.mImageView.setScaleType(ImageView.ScaleType.FIT_START);
472e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            vh.mImageView.setAdjustViewBounds(true);
473e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            vh.mImageView.setMaxWidth(cardHeight);
474e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
475e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
476e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        } else {
477e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            vh.mImageView.setScaleType(ImageView.ScaleType.CENTER);
478e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            vh.mImageView.setAdjustViewBounds(false);
479e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
480e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout            // Limit width to the card height
4817728d53c5c50e8ed807e8f4a189e34684de04800Craig Stout            layoutParams.width = Math.min(cardHeight, drawableWidth);
482e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        }
483e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        vh.mImageView.setLayoutParams(layoutParams);
484e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout        vh.mImageView.setImageDrawable(row.getImageDrawable());
485e23ea69ec54eb70d17239ba671fcd75563780553Craig Stout
4867d1196948811bc5f1b7ec0cdc74340fca60fc8e2Craig Stout        mDetailsPresenter.onBindViewHolder(vh.mDetailsDescriptionViewHolder, row.getItem());
487a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
488e652714f2fcc876de6f168b28dd03bfc22e1cb96Tim Kilbourn        ArrayObjectAdapter aoa = new ArrayObjectAdapter(mActionPresenterSelector);
489a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        aoa.addAll(0, (Collection)row.getActions());
490cf992de2d34abb8228dc6cb39fffe97346823a37Craig Stout        vh.bind(aoa);
4914121f22713bbed467a977ec0d867ef53989ff374Dake Gu
4924121f22713bbed467a977ec0d867ef53989ff374Dake Gu        if (row.getImageDrawable() != null && mSharedElementHelper != null) {
4934121f22713bbed467a977ec0d867ef53989ff374Dake Gu            mSharedElementHelper.onBindToDrawable(vh);
4944121f22713bbed467a977ec0d867ef53989ff374Dake Gu        }
495a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    }
496a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
497a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    @Override
498cb13a318e577e14461eb008071dddf762847de42Dake Gu    protected void onUnbindRowViewHolder(RowPresenter.ViewHolder holder) {
499cb13a318e577e14461eb008071dddf762847de42Dake Gu        super.onUnbindRowViewHolder(holder);
500a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn
501a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        ViewHolder vh = (ViewHolder) holder;
502a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        if (vh.mDetailsDescriptionViewHolder != null) {
503a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn            mDetailsPresenter.onUnbindViewHolder(vh.mDetailsDescriptionViewHolder);
504a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn        }
505a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn    }
50609d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout
50709d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout    @Override
50809d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout    public final boolean isUsingDefaultSelectEffect() {
50909d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout        return false;
51009d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout    }
51109d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout
51209d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout    @Override
51309d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout    protected void onSelectLevelChanged(RowPresenter.ViewHolder holder) {
51409d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout        super.onSelectLevelChanged(holder);
51509d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout        if (getSelectEffectEnabled()) {
51609d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout            ViewHolder vh = (ViewHolder) holder;
51709d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout            int dimmedColor = vh.mColorDimmer.getPaint().getColor();
51809d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout            ((ColorDrawable) vh.mOverviewFrame.getForeground().mutate()).setColor(dimmedColor);
51909d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout        }
52009d52d76912e3689cc2b58b7bb3f44b923915fd8Craig Stout    }
521a83005b70853ea52c5d98910762344de16b850a8Tim Kilbourn}
522