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