BrowseFragment.java revision a9a5262b09c09e83822236a18eb810991e01fea6
15c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran/*
25c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran * Copyright (C) 2014 The Android Open Source Project
35c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran *
45c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
55c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran * in compliance with the License. You may obtain a copy of the License at
65c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran *
75c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran * http://www.apache.org/licenses/LICENSE-2.0
85c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran *
95c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran * Unless required by applicable law or agreed to in writing, software distributed under the License
105c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
115c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran * or implied. See the License for the specific language governing permissions and limitations under
125c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran * the License.
135c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran */
145c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranpackage android.support.v17.leanback.app;
155c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran
165c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranimport android.support.v17.leanback.R;
175c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranimport android.support.v17.leanback.widget.Presenter;
185c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranimport android.support.v17.leanback.widget.VerticalGridView;
195c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranimport android.support.v17.leanback.widget.Row;
205c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranimport android.support.v17.leanback.widget.ObjectAdapter;
215c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranimport android.support.v17.leanback.widget.OnItemSelectedListener;
22ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colittiimport android.support.v17.leanback.widget.OnItemClickedListener;
23ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colittiimport android.support.v17.leanback.widget.SearchOrbView;
244753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colittiimport android.util.Log;
25ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colittiimport android.app.Fragment;
268fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandranimport android.os.Bundle;
275c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranimport android.view.LayoutInflater;
28a561e121c724e9163b2e256e15eef660e3a326daPaul Jensenimport android.view.View;
29ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colittiimport android.view.ViewGroup;
305c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandranimport android.view.ViewGroup.MarginLayoutParams;
31ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colittiimport android.widget.ImageView;
32ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colittiimport android.widget.TextView;
33ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colittiimport android.graphics.drawable.Drawable;
34ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
35ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colittiimport static android.support.v7.widget.RecyclerView.NO_POSITION;
36ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
37ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti/**
385c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran * Wrapper fragment for leanback browse screens. Composed of a
395c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran * RowsFragment and a HeadersFragment.
405c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran *
4138b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran */
428fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandranpublic class BrowseFragment extends Fragment {
438fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran    private static final String TAG = "BrowseFragment";
4438b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran    private static boolean DEBUG = false;
458fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran
468fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran    /** The fastlane navigation panel is enabled and shown by default. */
478fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran    public static final int HEADERS_ENABLED = 1;
4856afacf838d24cf8e54d2cf0d8ab9182ab704125Sreeram Ramachandran
4956afacf838d24cf8e54d2cf0d8ab9182ab704125Sreeram Ramachandran    /** The fastlane navigation panel is enabled and hidden by default. */
508fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran    public static final int HEADERS_HIDDEN = 2;
5156afacf838d24cf8e54d2cf0d8ab9182ab704125Sreeram Ramachandran
525c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    /** The fastlane navigation panel is disabled and will never be shown. */
535965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    public static final int HEADERS_DISABLED = 3;
545965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti
5538b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran    private final RowsFragment mRowsFragment = new RowsFragment();
5638b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran    private final HeadersFragment mHeadersFragment = new HeadersFragment();
5738b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran
5838b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran    private Params mParams;
595965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    private BrowseFrameLayout mBrowseFrame;
605965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    private ImageView mBadgeView;
615965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    private TextView mTitleView;
625965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    private ViewGroup mBrowseTitle;
635965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    private SearchOrbView mSearchOrbView;
645965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    private boolean mShowingTitle = true;
655965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    private boolean mShowingHeaders = true;
665965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    private boolean mCanShowHeaders = true;
675965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    private int mContainerListMarginLeft;
685965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    private int mContainerListWidth;
694753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    private int mContainerListAlignTop;
704753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    private TransitionHelper mTransitionHelper;
714753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    private OnItemSelectedListener mExternalOnItemSelectedListener;
72a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen    private int mSelectedPosition = -1;
73a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen
745c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    private static final String ARG_TITLE = BrowseFragment.class.getCanonicalName() + ".title";
75a48118062412f16ae712bfc8c8a539d3b6a85e47Sreeram Ramachandran    private static final String ARG_BADGE_URI = BrowseFragment.class.getCanonicalName() + ".badge";
76a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen    private static final String ARG_HEADERS_STATE =
77a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen        BrowseFragment.class.getCanonicalName() + ".headersState";
78a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen
79a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen    /**
80a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen     * @param args Bundle to use for the arguments, if null a new Bundle will be created.
81a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen     */
82a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen    public static Bundle createArgs(Bundle args, String title, String badgeUri) {
83a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen        return createArgs(args, title, badgeUri, HEADERS_ENABLED);
84a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen    }
85a48118062412f16ae712bfc8c8a539d3b6a85e47Sreeram Ramachandran
865c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    public static Bundle createArgs(Bundle args, String title, String badgeUri, int headersState) {
875c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        if (args == null) {
884753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti            args = new Bundle();
894753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        }
904753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        args.putString(ARG_TITLE, title);
914753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        args.putString(ARG_BADGE_URI, badgeUri);
924753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        args.putInt(ARG_HEADERS_STATE, headersState);
934753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        return args;
944753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    }
954753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
964753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    public static class Params {
974753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        private String mTitle;
984753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        private Drawable mBadgeDrawable;
994753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        private int mHeadersState;
1004753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
1014753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        /**
1024753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         * Sets the badge image.
1034753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         */
1044753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        public void setBadgeImage(Drawable drawable) {
1054753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti            mBadgeDrawable = drawable;
1064753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        }
1074753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
1084753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        /**
1094753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         * Returns the badge image.
1104753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         */
1114753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        public Drawable getBadgeImage() {
1124753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti            return mBadgeDrawable;
1134753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        }
1144753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
1154753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        /**
1164753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         * Sets a title for the browse fragment.
1174753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         */
1184753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        public void setTitle(String title) {
1194753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti            mTitle = title;
1204753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        }
1214753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
1224753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        /**
1234753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         * Returns the title for the browse fragment.
1244753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         */
1254753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        public String getTitle() {
1264753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti            return mTitle;
1274753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        }
1284753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
1294753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        /**
1304753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         * Sets the state for the headers column in the browse fragment.
1318fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran         */
1328fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran        public void setHeadersState(int headersState) {
1338fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran            if (headersState < HEADERS_ENABLED || headersState > HEADERS_DISABLED) {
1348fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran                Log.e(TAG, "Invalid headers state: " + headersState
1358fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran                        + ", default to enabled and shown.");
1368fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran                mHeadersState = HEADERS_ENABLED;
1378fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran            } else {
13896f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti                mHeadersState = headersState;
13996f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti            }
14096f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti        }
1415965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti
1424753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        /**
1434753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         * Returns the state for the headers column in the browse fragment.
1444753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti         */
1454753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        public int getHeadersState() {
1464753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti            return mHeadersState;
1474753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        }
1484753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    }
1494753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
1504753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    /**
1514753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti     * Set browse parameters.
1524753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti     */
1534753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    public void setBrowseParams(Params params) {
1544753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        mParams = params;
1557619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran        setBadgeDrawable(mParams.mBadgeDrawable);
1565965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti        setTitle(mParams.mTitle);
1575965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti        setHeadersState(mParams.mHeadersState);
1585965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    }
1595965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti
1605965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    /**
1615965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     * Set background parameters.
1624753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti     * @deprecated Use BackgroundManager instead
1634753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti     */
1644753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    @Deprecated
1654753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    public void setBackgroundParams(BackgroundParams params) {
166a10ac3214f6a582b7fdb66acc43c702731e53d81Lorenzo Colitti    }
1675965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti
1685965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    /**
1695965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     * Returns browse parameters.
1705965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     */
1715965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    public Params getBrowseParams() {
1725965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti        return mParams;
1735965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    }
174a10ac3214f6a582b7fdb66acc43c702731e53d81Lorenzo Colitti
1754753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    /**
1765965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     * Returns the background parameters.
1775965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     * @deprecated Use BackgroundManager instead
1785965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     */
1795965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    @Deprecated
1805965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    public BackgroundParams getBackgroundParams() {
1815965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti        return new BackgroundParams();
1825965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    }
1835965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti
1845965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    /**
1855965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     * Sets the list of rows for the fragment.
1865965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     */
1875965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    public void setAdapter(ObjectAdapter adapter) {
1885965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti        mRowsFragment.setAdapter(adapter);
1895965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti        mHeadersFragment.setAdapter(adapter);
1905965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    }
1915965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti
1925965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    /**
1934753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti     * Returns the list of rows.
1944753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti     */
1954753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    public ObjectAdapter getAdapter() {
1964753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        return mRowsFragment.getAdapter();
1974753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    }
1984753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
1994753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    /**
2004753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti     * Sets an item selection listener.
20196f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti     */
2025c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
2035c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        mExternalOnItemSelectedListener = listener;
2045c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    }
20596f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti
2065c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    /**
2075c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran     * Sets an item clicked listener on the fragment.
2085965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     * OnItemClickedListener will override {@link View.OnClickListener} that
2095965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     * item presenter sets during {@link Presenter#onCreateViewHolder(ViewGroup)}.
2105965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     * So in general,  developer should choose one of the listeners but not both.
2115965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti     */
2125965651602fb8373b75b6ae2d59c6a4d753f2f49Lorenzo Colitti    public void setOnItemClickedListener(OnItemClickedListener listener) {
213ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti        mRowsFragment.setOnItemClickedListener(listener);
214ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    }
215ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
216ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    /**
217ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti     * Returns the item Clicked listener.
218ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti     */
219ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    public OnItemClickedListener getOnItemClickedListener() {
220ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti        return mRowsFragment.getOnItemClickedListener();
221ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    }
222ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
223ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    /**
224ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti     * Sets a click listener for the search "affordance".
225ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti     *
226ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti     * The presence of a listener will change the visibility of the search "affordance" in the
227ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti     * title area. When set to non null the title area will contain a call to search action.
228ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti     *
229ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti     * The listener onClick method will be invoked when the user click on the search action.
2307619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran     *
231ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti     * @param listener The listener.
232ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti     */
233ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    public void setOnSearchClickedListener(View.OnClickListener listener) {
234ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti        mSearchOrbView.setOnOrbClickedListener(listener);
235ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    }
236ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
237ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    private final BrowseFrameLayout.OnFocusSearchListener mOnFocusSearchListener =
238ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti            new BrowseFrameLayout.OnFocusSearchListener() {
239ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti        @Override
240ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti        public View onFocusSearch(View focused, int direction) {
2417619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran            // If fastlane is disabled, just return null.
2427619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran            if (!mCanShowHeaders) return null;
2437619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran
244ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti            if (DEBUG) Log.v(TAG, "onFocusSearch focused " + focused + " + direction " + direction);
245ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti            if (!mShowingHeaders && direction == View.FOCUS_LEFT) {
246ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti                mTransitionHelper.runTransition(TransitionHelper.SCENE_WITH_HEADERS);
247ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti                mShowingHeaders = true;
248ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti                return mHeadersFragment.getVerticalGridView();
249ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
2504753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti            } else if (mShowingHeaders && direction == View.FOCUS_RIGHT) {
251ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti                mTransitionHelper.runTransition(TransitionHelper.SCENE_WITHOUT_HEADERS);
252ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti                mShowingHeaders = false;
253ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti                return mRowsFragment.getVerticalGridView();
254ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
255ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti            } else if (focused == mSearchOrbView && direction == View.FOCUS_DOWN) {
256ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti                return mShowingHeaders ? mHeadersFragment.getVerticalGridView() :
2574753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti                    mRowsFragment.getVerticalGridView();
2584753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
2594753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti            } else if (focused != mSearchOrbView && mSearchOrbView.getVisibility() == View.VISIBLE
2604753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti                    && direction == View.FOCUS_UP) {
2614753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti                return mSearchOrbView;
262ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
263ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti            } else {
2644753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti                return null;
265ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti            }
266ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti        }
267ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    };
268ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
269ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    @Override
270ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti    public void onCreate(Bundle savedInstanceState) {
2717f972fb1cd3c26af76779a7a3220b9cf5fb63a0aSreeram Ramachandran        super.onCreate(savedInstanceState);
272ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
273ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti        mHeadersFragment.setOnHeaderClickListener(mHeaderClickListener);
274ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti
275ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti        mContainerListMarginLeft = (int) getResources().getDimension(
2764753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti                R.dimen.lb_browse_rows_margin_left);
2774753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        mContainerListWidth =  getResources().getDimensionPixelSize(R.dimen.lb_browse_rows_width);
2787619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran        mContainerListAlignTop =
2797619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran            getResources().getDimensionPixelSize(R.dimen.lb_browse_rows_align_top);
28096f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti    }
28196f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti
2825c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    @Override
2835c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    public View onCreateView(LayoutInflater inflater, ViewGroup container,
28496f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti            Bundle savedInstanceState) {
2855c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        View root = inflater.inflate(R.layout.lb_browse_fragment, container, false);
2865c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran
2874753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        mBrowseFrame = (BrowseFrameLayout) root.findViewById(R.id.browse_frame);
28896f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti        mBrowseFrame.setOnFocusSearchListener(mOnFocusSearchListener);
2895c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran
290122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        mBrowseTitle = (ViewGroup) root.findViewById(R.id.browse_title_group);
291122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        mBadgeView = (ImageView) mBrowseTitle.findViewById(R.id.browse_badge);
292122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        mTitleView = (TextView) mBrowseTitle.findViewById(R.id.browse_title);
293122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        mSearchOrbView = (SearchOrbView) mBrowseTitle.findViewById(R.id.browse_orb);
294122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran
2955c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        readArguments(getArguments());
2965c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        if (mParams != null) {
2975c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran            setBadgeDrawable(mParams.mBadgeDrawable);
2985c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran            setTitle(mParams.mTitle);
2995c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran            setHeadersState(mParams.mHeadersState);
30096f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti        }
30196f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti
30296f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti        mTransitionHelper = new TransitionHelper(getActivity());
3035c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        mTransitionHelper.addSceneRunnable(TransitionHelper.SCENE_WITH_TITLE, mBrowseFrame,
3045c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran                new Runnable() {
3055c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran            @Override
3065c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran            public void run() {
3075c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran                showTitle(true);
3085c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran            }
3095c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        });
310122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        mTransitionHelper.addSceneRunnable(TransitionHelper.SCENE_WITHOUT_TITLE, mBrowseFrame,
311122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran                new Runnable() {
31296f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti            @Override
31396f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti            public void run() {
31496f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti                showTitle(false);
315122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran            }
316122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        });
317122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        mTransitionHelper.addSceneRunnable(TransitionHelper.SCENE_WITH_HEADERS, mBrowseFrame,
318122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran                new Runnable() {
319122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran            @Override
320122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran            public void run() {
321122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran                showHeaders(true);
322122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran            }
323122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        });
324122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        mTransitionHelper.addSceneRunnable(TransitionHelper.SCENE_WITHOUT_HEADERS, mBrowseFrame,
32596f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti                new Runnable() {
32696f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti            @Override
32796f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti            public void run() {
3285c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran                showHeaders(false);
3295c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran            }
3305c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        });
3315c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran
3325c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        return root;
3335c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    }
334a48118062412f16ae712bfc8c8a539d3b6a85e47Sreeram Ramachandran
3355c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    private void showTitle(boolean show) {
3365c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        mBrowseTitle.setVisibility(show ? View.VISIBLE : View.GONE);
337379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran    }
3384753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
339379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran    private void showHeaders(boolean show) {
340379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran        if (DEBUG) Log.v(TAG, "showHeaders " + show);
3414753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        View headerList = mHeadersFragment.getView();
3424753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        View containerList = mRowsFragment.getView();
34396f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti        MarginLayoutParams lp;
344379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran
3455c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        headerList.setVisibility(show ? View.VISIBLE : View.GONE);
3465c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        lp = (MarginLayoutParams) containerList.getLayoutParams();
34796f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti        lp.leftMargin = show ? mContainerListMarginLeft : 0;
3485c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        containerList.setLayoutParams(lp);
3495c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran
35096f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti        mRowsFragment.setExpand(!show);
3519c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran    }
3529c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran
35396f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti    private HeaderPresenter.OnHeaderClickListener mHeaderClickListener =
3549c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran        new HeaderPresenter.OnHeaderClickListener() {
3559c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran            @Override
356122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran            public void onHeaderClicked() {
357122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran                if (!mCanShowHeaders || !mShowingHeaders) return;
358122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran
359122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran                mTransitionHelper.runTransition(TransitionHelper.SCENE_WITHOUT_HEADERS);
360122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran                mShowingHeaders = false;
361122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran                mRowsFragment.getVerticalGridView().requestFocus();
362122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran            }
3639c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran        };
3644753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
3654753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    private OnItemSelectedListener mRowSelectedListener = new OnItemSelectedListener() {
3667619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran        @Override
3677619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran        public void onItemSelected(Object item, Row row) {
368f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti            int position = mRowsFragment.getVerticalGridView().getSelectedPosition();
369f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti            if (DEBUG) Log.v(TAG, "row selected position " + position);
370f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti            onRowSelected(position);
371f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti            if (mExternalOnItemSelectedListener != null) {
3724753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti                mExternalOnItemSelectedListener.onItemSelected(item, row);
37338b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran            }
37438b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        }
37538b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran    };
37638b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran
37738b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran    private OnItemSelectedListener mHeaderSelectedListener = new OnItemSelectedListener() {
37838b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        @Override
37938b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        public void onItemSelected(Object item, Row row) {
38038b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran            int position = mHeadersFragment.getVerticalGridView().getSelectedPosition();
38138b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran            if (DEBUG) Log.v(TAG, "header selected position " + position);
38238b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran            onRowSelected(position);
38338b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        }
38438b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran    };
38538b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran
38638b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran    private void onRowSelected(int position) {
38738b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        if (position != mSelectedPosition) {
38838b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran            mSetSelectionRunnable.mPosition = position;
38938b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran            mBrowseFrame.getHandler().post(mSetSelectionRunnable);
3907619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran
391f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti            if (position == 0) {
3929c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran                if (!mShowingTitle) {
3939c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran                    mTransitionHelper.runTransition(TransitionHelper.SCENE_WITH_TITLE);
394f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti                    mShowingTitle = true;
395f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti                }
396f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti            } else if (mShowingTitle) {
397c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran                mTransitionHelper.runTransition(TransitionHelper.SCENE_WITHOUT_TITLE);
398c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran                mShowingTitle = false;
399c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran            }
400f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti        }
401f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti    }
402f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti
403f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti    private class SetSelectionRunnable implements Runnable {
404f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti        int mPosition;
405f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti        @Override
406f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti        public void run() {
407f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti            setSelection(mPosition);
408f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti        }
409c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran    }
410c92133732378aae815120c39edd62a7b4eb773b3Sreeram Ramachandran
411f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti    private final SetSelectionRunnable mSetSelectionRunnable = new SetSelectionRunnable();
4129c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran
4139c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran    private void setSelection(int position) {
41492b66c4990b4a0ab608aa9c31da946f36085203bSreeram Ramachandran        if (position != NO_POSITION) {
41592b66c4990b4a0ab608aa9c31da946f36085203bSreeram Ramachandran            mRowsFragment.setSelectedPosition(position);
41692b66c4990b4a0ab608aa9c31da946f36085203bSreeram Ramachandran            mHeadersFragment.setSelectedPosition(position);
41792b66c4990b4a0ab608aa9c31da946f36085203bSreeram Ramachandran        }
41892b66c4990b4a0ab608aa9c31da946f36085203bSreeram Ramachandran        mSelectedPosition = position;
419a561e121c724e9163b2e256e15eef660e3a326daPaul Jensen    }
42092b66c4990b4a0ab608aa9c31da946f36085203bSreeram Ramachandran
421357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti    @Override
422357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti    public void onActivityCreated(Bundle savedInstanceState) {
423357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti        super.onActivityCreated(savedInstanceState);
424357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti
425357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti        if (getChildFragmentManager().findFragmentById(R.id.browse_container_dock) == null) {
426357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti            getChildFragmentManager().beginTransaction()
427357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti                    .replace(R.id.browse_headers_dock, mHeadersFragment)
428357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti                    .replace(R.id.browse_container_dock, mRowsFragment).commit();
429357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti            mRowsFragment.setOnItemSelectedListener(mRowSelectedListener);
430357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti            mHeadersFragment.setOnItemSelectedListener(mHeaderSelectedListener);
431357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti        }
432357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti    }
433357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti
434357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti    private void setVerticalVerticalGridViewLayout(VerticalGridView listview) {
435357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti        // align the top edge of item to a fixed position
436357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti        listview.setItemAlignmentOffset(0);
437357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti        listview.setItemAlignmentOffsetPercent(VerticalGridView.ITEM_ALIGN_OFFSET_PERCENT_DISABLED);
438357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti        listview.setWindowAlignmentOffset(mContainerListAlignTop);
439357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti        listview.setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED);
440357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti        listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
441357e5629bb4c745296ab40340ec8679372337155Lorenzo Colitti    }
44292b66c4990b4a0ab608aa9c31da946f36085203bSreeram Ramachandran
44392b66c4990b4a0ab608aa9c31da946f36085203bSreeram Ramachandran    /**
4445c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran     * Setup dimensions that are only meaningful when the child Fragments are inside
4455c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran     * BrowseFragment.
4468fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran     */
4478fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran    private void setupChildFragmentsLayout() {
4488fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran        VerticalGridView headerList = mHeadersFragment.getVerticalGridView();
4498fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran        VerticalGridView containerList = mRowsFragment.getVerticalGridView();
4508fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran
4518fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran        // Both fragments list view has the same alignment
452122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        setVerticalVerticalGridViewLayout(headerList);
453122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        setVerticalVerticalGridViewLayout(containerList);
454122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran
455122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        mRowsFragment.getVerticalGridView().getLayoutParams().width = mContainerListWidth;
456122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran        mRowsFragment.getVerticalGridView().requestLayout();
457122f581eb16e06c70cbbc40bd40995775075151fSreeram Ramachandran    }
4584753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
4594753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    @Override
4608fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran    public void onStart() {
46138b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        super.onStart();
46238b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        setupChildFragmentsLayout();
46338b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        if (mCanShowHeaders && mShowingHeaders && mHeadersFragment.getView() != null) {
46438b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran            mHeadersFragment.getView().requestFocus();
46538b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        } else if ((!mCanShowHeaders || !mShowingHeaders)
46638b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran                && mRowsFragment.getView() != null) {
46738b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran            mRowsFragment.getView().requestFocus();
46838b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        }
46938b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        showHeaders(mCanShowHeaders && mShowingHeaders);
47038b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran    }
4714753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti
4724753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    private void readArguments(Bundle args) {
47338b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        if (args == null) {
47438b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran            return;
47538b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        }
47638b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran        if (args.containsKey(ARG_TITLE)) {
4774753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti            setTitle(args.getString(ARG_TITLE));
4784753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        }
47938b7af1f2cb9579895465fabc37865f5dadcac25Sreeram Ramachandran
4808fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran        if (args.containsKey(ARG_BADGE_URI)) {
4818fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran            setBadgeUri(args.getString(ARG_BADGE_URI));
4828fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran        }
4838fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran
4844753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti        if (args.containsKey(ARG_HEADERS_STATE)) {
4858fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran            setHeadersState(args.getInt(ARG_HEADERS_STATE));
4868fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran        }
4878fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6Sreeram Ramachandran    }
48896f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti
48996f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti    private void setBadgeUri(String badgeUri) {
4909c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran        // TODO - need a drawable downloader
4915c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran    }
4925c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran
49396f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti    private void setBadgeDrawable(Drawable drawable) {
49496f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti        if (mBadgeView == null) {
49592b66c4990b4a0ab608aa9c31da946f36085203bSreeram Ramachandran            return;
49692b66c4990b4a0ab608aa9c31da946f36085203bSreeram Ramachandran        }
497379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran        mBadgeView.setImageDrawable(drawable);
498379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran        if (drawable != null) {
49996f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti            mBadgeView.setVisibility(View.VISIBLE);
50096f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti        } else {
501379bd33f7640e2c4bef902be0ed6cb96378c8c2eSreeram Ramachandran            mBadgeView.setVisibility(View.GONE);
5029c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran        }
5039c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran    }
5049c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran
5059c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran    private void setTitle(String title) {
50696f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti        if (mTitleView != null) {
5074753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti            mTitleView.setText(title);
5089c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran        }
5099c0d313de6a3157fadd3b52a9927c77216ca435eSreeram Ramachandran    }
51096f261e8b28048b8cb48f5a4e81822c73bb813f4Lorenzo Colitti
5114753afd79e130d5f1c888f549c36b4da92dbe680Lorenzo Colitti    private void setHeadersState(int headersState) {
5125c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082fSreeram Ramachandran        if (DEBUG) Log.v(TAG, "setHeadersState " + headersState);
5137619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran        switch (headersState) {
514f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti            case HEADERS_ENABLED:
515f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti                mCanShowHeaders = true;
516ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti                mShowingHeaders = true;
5177619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran                break;
5187619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran            case HEADERS_HIDDEN:
519f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti                mCanShowHeaders = true;
520f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755Lorenzo Colitti                mShowingHeaders = false;
521ba25df989b48f36b784ad39307a49a4fd9c3fd66Lorenzo Colitti                break;
5227619e1bbebdfe643c35ee6be4ac054f5255f0706Sreeram Ramachandran            case HEADERS_DISABLED:
523                mCanShowHeaders = false;
524                mShowingHeaders = false;
525                break;
526            default:
527                Log.w(TAG, "Unknown headers state: " + headersState);
528                break;
529        }
530    }
531}
532