VerticalGridPresenter.java revision 71fddded48048acfa744ac352166770c91a1c2b1
1739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout/*
2739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Copyright (C) 2014 The Android Open Source Project
3739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
4739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * in compliance with the License. You may obtain a copy of the License at
6739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
7739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * http://www.apache.org/licenses/LICENSE-2.0
8739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
9739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License
10739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * or implied. See the License for the specific language governing permissions and limitations under
12739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * the License.
13739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */
14739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutpackage android.support.v17.leanback.widget;
15739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
16739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.support.v17.leanback.R;
17739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.LayoutInflater;
18739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.View;
19739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.view.ViewGroup;
200d734cb6671b314f84cb4911cd37631177d07fbaCraig Stoutimport android.view.ViewGroup.LayoutParams;
21739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutimport android.util.Log;
22739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
23739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout/**
24739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout * A presenter that renders objects in a vertical grid.
25739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout *
26739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout */
27739e3805bf2785e6773aede5e2e1643f537305f9Craig Stoutpublic class VerticalGridPresenter extends Presenter {
28739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private static final String TAG = "GridPresenter";
29739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private static final boolean DEBUG = false;
30739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
3171fddded48048acfa744ac352166770c91a1c2b1Dake Gu    class VerticalGridItemBridgeAdapter extends ItemBridgeAdapter {
3271fddded48048acfa744ac352166770c91a1c2b1Dake Gu        @Override
3371fddded48048acfa744ac352166770c91a1c2b1Dake Gu        public void onBind(final ItemBridgeAdapter.ViewHolder itemViewHolder) {
3471fddded48048acfa744ac352166770c91a1c2b1Dake Gu            // Only when having an OnItemClickListner, we attach the OnClickListener.
3571fddded48048acfa744ac352166770c91a1c2b1Dake Gu            if (getOnItemClickedListener() != null || getOnItemViewClickedListener() != null) {
3671fddded48048acfa744ac352166770c91a1c2b1Dake Gu                final View itemView = itemViewHolder.mHolder.view;
3771fddded48048acfa744ac352166770c91a1c2b1Dake Gu                itemView.setOnClickListener(new View.OnClickListener() {
3871fddded48048acfa744ac352166770c91a1c2b1Dake Gu                    @Override
3971fddded48048acfa744ac352166770c91a1c2b1Dake Gu                    public void onClick(View view) {
4071fddded48048acfa744ac352166770c91a1c2b1Dake Gu                        if (getOnItemClickedListener() != null) {
4171fddded48048acfa744ac352166770c91a1c2b1Dake Gu                            // Row is always null
4271fddded48048acfa744ac352166770c91a1c2b1Dake Gu                            getOnItemClickedListener().onItemClicked(itemViewHolder.mItem,
4371fddded48048acfa744ac352166770c91a1c2b1Dake Gu                                    null);
4471fddded48048acfa744ac352166770c91a1c2b1Dake Gu                        }
4571fddded48048acfa744ac352166770c91a1c2b1Dake Gu                        if (getOnItemViewClickedListener() != null) {
4671fddded48048acfa744ac352166770c91a1c2b1Dake Gu                            // Row is always null
4771fddded48048acfa744ac352166770c91a1c2b1Dake Gu                            getOnItemViewClickedListener().onItemClicked(
4871fddded48048acfa744ac352166770c91a1c2b1Dake Gu                                    itemViewHolder.mHolder, itemViewHolder.mItem, null, null);
4971fddded48048acfa744ac352166770c91a1c2b1Dake Gu                        }
5071fddded48048acfa744ac352166770c91a1c2b1Dake Gu                    }
5171fddded48048acfa744ac352166770c91a1c2b1Dake Gu                });
5271fddded48048acfa744ac352166770c91a1c2b1Dake Gu            }
5371fddded48048acfa744ac352166770c91a1c2b1Dake Gu        }
5471fddded48048acfa744ac352166770c91a1c2b1Dake Gu
5571fddded48048acfa744ac352166770c91a1c2b1Dake Gu        @Override
5671fddded48048acfa744ac352166770c91a1c2b1Dake Gu        public void onUnbind(ItemBridgeAdapter.ViewHolder viewHolder) {
5771fddded48048acfa744ac352166770c91a1c2b1Dake Gu            if (getOnItemClickedListener() != null || getOnItemViewClickedListener() != null) {
5871fddded48048acfa744ac352166770c91a1c2b1Dake Gu                viewHolder.mHolder.view.setOnClickListener(null);
5971fddded48048acfa744ac352166770c91a1c2b1Dake Gu            }
6071fddded48048acfa744ac352166770c91a1c2b1Dake Gu        }
6171fddded48048acfa744ac352166770c91a1c2b1Dake Gu
6271fddded48048acfa744ac352166770c91a1c2b1Dake Gu        @Override
6371fddded48048acfa744ac352166770c91a1c2b1Dake Gu        public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder viewHolder) {
6471fddded48048acfa744ac352166770c91a1c2b1Dake Gu            viewHolder.itemView.setActivated(true);
6571fddded48048acfa744ac352166770c91a1c2b1Dake Gu        }
6671fddded48048acfa744ac352166770c91a1c2b1Dake Gu    }
6771fddded48048acfa744ac352166770c91a1c2b1Dake Gu
68739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public static class ViewHolder extends Presenter.ViewHolder {
6971fddded48048acfa744ac352166770c91a1c2b1Dake Gu        ItemBridgeAdapter mItemBridgeAdapter;
70739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        final VerticalGridView mGridView;
71739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        boolean mInitialized;
72739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
73739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public ViewHolder(VerticalGridView view) {
74739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            super(view);
75739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mGridView = view;
76739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
77739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
78739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        public VerticalGridView getGridView() {
79739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            return mGridView;
80739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
81739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
82739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
83739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private int mNumColumns = -1;
84739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private int mZoomFactor;
850d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    private boolean mShadowEnabled = true;
86739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private OnItemClickedListener mOnItemClickedListener;
87947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    private OnItemSelectedListener mOnItemSelectedListener;
88947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    private OnItemViewSelectedListener mOnItemViewSelectedListener;
89947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    private OnItemViewClickedListener mOnItemViewClickedListener;
904f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout    private boolean mRoundedCornersEnabled = true;
91739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
92739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public VerticalGridPresenter() {
93a37118706af7d79adeb8b3918fb52fad99ece361Dake Gu        this(FocusHighlight.ZOOM_FACTOR_LARGE);
94739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
95739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
96739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public VerticalGridPresenter(int zoomFactor) {
97739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mZoomFactor = zoomFactor;
98739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
99739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
100739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
101739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the number of columns in the vertical grid.
102739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
103739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void setNumberOfColumns(int numColumns) {
104739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (numColumns < 0) {
105739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            throw new IllegalArgumentException("Invalid number of columns");
106739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
107739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mNumColumns != numColumns) {
108739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            mNumColumns = numColumns;
109739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
110739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
111739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
112739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
113739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the number of columns in the vertical grid.
114739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
115739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public int getNumberOfColumns() {
116739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mNumColumns;
117739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
118739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
1190d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    /**
1200d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * Enable or disable child shadow.
1210d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * This is not only for enable/disable default shadow implementation but also subclass must
1220d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * respect this flag.
1230d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     */
1240d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    public final void setShadowEnabled(boolean enabled) {
1250d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        mShadowEnabled = enabled;
1260d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    }
1270d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout
1280d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    /**
1290d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * Returns true if child shadow is enabled.
1300d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * This is not only for enable/disable default shadow implementation but also subclass must
1310d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * respect this flag.
1320d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     */
1330d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    public final boolean getShadowEnabled() {
1340d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        return mShadowEnabled;
1350d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    }
1360d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout
1370d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    /**
1380d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * Returns true if opticalBounds is supported (SDK >= 18) so that default shadow
1390d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * is applied to each individual child of {@link VerticalGridView}.
1400d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     * Subclass may return false to disable.
1410d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout     */
1420d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    public boolean isUsingDefaultShadow() {
1430d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        return ShadowOverlayContainer.supportsShadow();
1440d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    }
1450d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout
14674ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu    /**
1474f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout     * Enables or disabled rounded corners on children of this row.
1484f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout     * Supported on Android SDK >= L.
1494f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout     */
1504f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout    public final void enableChildRoundedCorners(boolean enable) {
1514f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout        mRoundedCornersEnabled = enable;
1524f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout    }
1534f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout
1544f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout    /**
1554f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout     * Returns true if rounded corners are enabled for children of this row.
1564f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout     */
1574f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout    public final boolean areChildRoundedCornersEnabled() {
1584f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout        return mRoundedCornersEnabled;
1594f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout    }
1604f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout
1614f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout    /**
16274ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu     * Returns true if SDK >= L, where Z shadow is enabled so that Z order is enabled
16374ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu     * on each child of vertical grid.   If subclass returns false in isUsingDefaultShadow()
16474ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu     * and does not use Z-shadow on SDK >= L, it should override isUsingZOrder() return false.
16574ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu     */
16674ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu    public boolean isUsingZOrder() {
16774ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu        return ShadowHelper.getInstance().usesZShadow();
16874ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu    }
16974ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu
1700d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    final boolean needsDefaultShadow() {
1710d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        return isUsingDefaultShadow() && getShadowEnabled();
1720d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    }
1730d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout
174739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
175739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public final ViewHolder onCreateViewHolder(ViewGroup parent) {
176739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        ViewHolder vh = createGridViewHolder(parent);
177739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.mInitialized = false;
17871fddded48048acfa744ac352166770c91a1c2b1Dake Gu        vh.mItemBridgeAdapter = new VerticalGridItemBridgeAdapter();
179739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        initializeGridViewHolder(vh);
180739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (!vh.mInitialized) {
181739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            throw new RuntimeException("super.initializeGridViewHolder() must be called");
182739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
183739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return vh;
184739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
185739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
186739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
187739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Subclass may override this to inflate a different layout.
188739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
189739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    protected ViewHolder createGridViewHolder(ViewGroup parent) {
190739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        View root = LayoutInflater.from(parent.getContext()).inflate(
191cb13a318e577e14461eb008071dddf762847de42Dake Gu                R.layout.lb_vertical_grid, parent, false);
192739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return new ViewHolder((VerticalGridView) root.findViewById(R.id.browse_grid));
193739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
194739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
1950d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    private ItemBridgeAdapter.Wrapper mWrapper = new ItemBridgeAdapter.Wrapper() {
1960d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        @Override
1970d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        public View createWrapper(View root) {
1980d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            ShadowOverlayContainer wrapper = new ShadowOverlayContainer(root.getContext());
1990d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            wrapper.setLayoutParams(
2000d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout                    new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
20146e7de54775fc37dc51041629c79249e6dae3242Dake Gu            wrapper.initialize(needsDefaultShadow(), true, areChildRoundedCornersEnabled());
2020d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            return wrapper;
2030d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        }
2040d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        @Override
2050d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        public void wrap(View wrapper, View wrapped) {
2060d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            ((ShadowOverlayContainer) wrapper).wrap(wrapped);
2070d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        }
2080d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout    };
2090d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout
21074ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu    /**
21174ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu     * Called after a {@link VerticalGridPresenter.ViewHolder} is created.
21274ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu     * Subclasses may override this method and start by calling
21374ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu     * super.initializeGridViewHolder(ViewHolder).
21474ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu     *
21574ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu     * @param vh The ViewHolder to initialize for the vertical grid.
21674ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu     */
217739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    protected void initializeGridViewHolder(ViewHolder vh) {
218739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (mNumColumns == -1) {
219739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            throw new IllegalStateException("Number of columns must be set");
220739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
221739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (DEBUG) Log.v(TAG, "mNumColumns " + mNumColumns);
222739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.getGridView().setNumColumns(mNumColumns);
223739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.mInitialized = true;
224739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
22546e7de54775fc37dc51041629c79249e6dae3242Dake Gu        vh.mItemBridgeAdapter.setWrapper(mWrapper);
2264f34a05cdf73b68c3b2eb8678f740ab15225126aCraig Stout        if (needsDefaultShadow() || areChildRoundedCornersEnabled()) {
2270d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            ShadowOverlayContainer.prepareParentForShadow(vh.getGridView());
2280d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout            ((ViewGroup) vh.view).setClipChildren(false);
2290d734cb6671b314f84cb4911cd37631177d07fbaCraig Stout        }
23074ecd2848a6ceaed6a4dcaed4748b4fb688de020Dake Gu        vh.getGridView().setFocusDrawingOrderEnabled(!isUsingZOrder());
23146e7de54775fc37dc51041629c79249e6dae3242Dake Gu        FocusHighlightHelper.setupBrowseItemFocusHighlight(vh.mItemBridgeAdapter,
23246e7de54775fc37dc51041629c79249e6dae3242Dake Gu                mZoomFactor, true);
233739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
234739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        final ViewHolder gridViewHolder = vh;
235739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.getGridView().setOnChildSelectedListener(new OnChildSelectedListener() {
236739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            @Override
237739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            public void onChildSelected(ViewGroup parent, View view, int position, long id) {
238739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout                selectChildView(gridViewHolder, view);
239739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            }
240739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        });
241739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
242739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
243739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
244739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
245739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (DEBUG) Log.v(TAG, "onBindViewHolder " + item);
246739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        ViewHolder vh = (ViewHolder) viewHolder;
247739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.mItemBridgeAdapter.setAdapter((ObjectAdapter) item);
248739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.getGridView().setAdapter(vh.mItemBridgeAdapter);
249739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
250739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
251739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    @Override
252739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
253739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (DEBUG) Log.v(TAG, "onUnbindViewHolder");
254739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        ViewHolder vh = (ViewHolder) viewHolder;
255739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.mItemBridgeAdapter.setAdapter(null);
256739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        vh.getGridView().setAdapter(null);
257739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
258739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
259739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
260739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the item selected listener.
261739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Since this is a grid the row parameter is always null.
262afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu     * @deprecated Use {@link #setOnItemViewSelectedListener(OnItemViewSelectedListener)}
263739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
264739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public final void setOnItemSelectedListener(OnItemSelectedListener listener) {
265739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mOnItemSelectedListener = listener;
266739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
267739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
268739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
269739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the item selected listener.
270afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu     * @deprecated Use {@link #getOnItemViewSelectedListener()}
271739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
272739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public final OnItemSelectedListener getOnItemSelectedListener() {
273739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mOnItemSelectedListener;
274739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
275739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
276739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
277947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * Sets the item selected listener.
278947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * Since this is a grid the row parameter is always null.
279947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     */
280947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    public final void setOnItemViewSelectedListener(OnItemViewSelectedListener listener) {
281947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        mOnItemViewSelectedListener = listener;
282947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
283947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu
284947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    /**
285947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * Returns the item selected listener.
286947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     */
287947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    public final OnItemViewSelectedListener getOnItemViewSelectedListener() {
288947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        return mOnItemViewSelectedListener;
289947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
290947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu
291947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    /**
292739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Sets the item clicked listener.
293739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * OnItemClickedListener will override {@link View.OnClickListener} that
294739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * item presenter sets during {@link Presenter#onCreateViewHolder(ViewGroup)}.
295739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * So in general, developer should choose one of the listeners but not both.
296afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu     * @deprecated Use {@link #setOnItemViewClickedListener(OnItemViewClickedListener)}
297739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
298739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public final void setOnItemClickedListener(OnItemClickedListener listener) {
299739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        mOnItemClickedListener = listener;
300739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
301739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
302739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    /**
303947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * Sets the item clicked listener.
304947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * OnItemViewClickedListener will override {@link View.OnClickListener} that
305947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * item presenter sets during {@link Presenter#onCreateViewHolder(ViewGroup)}.
306947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * So in general, developer should choose one of the listeners but not both.
307947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     */
308947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    public final void setOnItemViewClickedListener(OnItemViewClickedListener listener) {
309947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        mOnItemViewClickedListener = listener;
310947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
311947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu
312947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    /**
313739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     * Returns the item clicked listener.
314afe1da48b4673f64c67c130237dd485a34a69c1bDake Gu     * @deprecated Use {@link #getOnItemViewClickedListener()}
315739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout     */
316739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    public final OnItemClickedListener getOnItemClickedListener() {
317739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        return mOnItemClickedListener;
318739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    }
319739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout
320947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    /**
321947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     * Returns the item clicked listener.
322947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu     */
323947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    public final OnItemViewClickedListener getOnItemViewClickedListener() {
324947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        return mOnItemViewClickedListener;
325947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
326947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu
327739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout    private void selectChildView(ViewHolder vh, View view) {
328739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        if (getOnItemSelectedListener() != null) {
329739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout            ItemBridgeAdapter.ViewHolder ibh = (view == null) ? null :
330947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                    (ItemBridgeAdapter.ViewHolder) vh.getGridView().getChildViewHolder(view);
331947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            if (ibh == null) {
332947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                getOnItemSelectedListener().onItemSelected(null, null);
333947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            } else {
334947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                getOnItemSelectedListener().onItemSelected(ibh.mItem, null);
335947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            }
336739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout        }
337947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        if (getOnItemViewSelectedListener() != null) {
338947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            ItemBridgeAdapter.ViewHolder ibh = (view == null) ? null :
339947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                    (ItemBridgeAdapter.ViewHolder) vh.getGridView().getChildViewHolder(view);
340947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            if (ibh == null) {
341947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                getOnItemViewSelectedListener().onItemSelected(null, null, null, null);
342947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            } else {
343947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu                getOnItemViewSelectedListener().onItemSelected(ibh.mHolder, ibh.mItem, null, null);
344947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu            }
345947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu        }
346947dbf076cd019e3c26217fbc7aa21e860d68044Dake Gu    }
347739e3805bf2785e6773aede5e2e1643f537305f9Craig Stout}
348