diff options
author | Jaekyun Seok <jaekyun@google.com> | 2014-05-21 20:11:21 +0900 |
---|---|---|
committer | Jaekyun Seok <jaekyun@google.com> | 2014-05-22 08:41:07 +0900 |
commit | 7ebbe134810d0461f031b0b57ea2752ec188ab42 (patch) | |
tree | 99f1eb5ade88e227658d896a380b82feb69c56f4 /src/com/android/tv | |
parent | ae5f46e74d9f935ce25220c3ab05ff006eab5f57 (diff) | |
download | TV-7ebbe134810d0461f031b0b57ea2752ec188ab42.tar.gz |
Show only enabled channels
And codes are refactored so that any adapter can be added flexibly.
Bug: 15123495
Change-Id: Id5dca36e0e00fb123cb059b9cb40e58f8b2487e1
Diffstat (limited to 'src/com/android/tv')
-rw-r--r-- | src/com/android/tv/data/Channel.java | 4 | ||||
-rw-r--r-- | src/com/android/tv/data/ChannelMap.java | 14 | ||||
-rw-r--r-- | src/com/android/tv/ui/ChannelListAdapter.java | 44 | ||||
-rw-r--r-- | src/com/android/tv/ui/ItemListView.java | 25 | ||||
-rw-r--r-- | src/com/android/tv/ui/MainMenuView.java | 121 | ||||
-rw-r--r-- | src/com/android/tv/ui/OptionsAdapter.java | 23 |
6 files changed, 159 insertions, 72 deletions
diff --git a/src/com/android/tv/data/Channel.java b/src/com/android/tv/data/Channel.java index 9e8bbde3..69908a52 100644 --- a/src/com/android/tv/data/Channel.java +++ b/src/com/android/tv/data/Channel.java @@ -74,6 +74,10 @@ public final class Channel { return mDescription; } + public boolean isBrowsable() { + return mIsBrowsable; + } + public void setDescription(String description) { mDescription = description; } diff --git a/src/com/android/tv/data/ChannelMap.java b/src/com/android/tv/data/ChannelMap.java index 5030914f..7c0dcf97 100644 --- a/src/com/android/tv/data/ChannelMap.java +++ b/src/com/android/tv/data/ChannelMap.java @@ -83,8 +83,18 @@ public class ChannelMap implements LoaderManager.LoaderCallbacks<Cursor> { return mInput; } - public Channel[] getAllChannelList() { - return mChannelList.toArray(new Channel[0]); + public Channel[] getChannelList(boolean browsableOnly) { + if (mBrowsableChannelCount == 0 || !browsableOnly) { + return mChannelList.toArray(new Channel[0]); + } + + ArrayList<Channel> list = new ArrayList<Channel>(); + for (Channel channel : mChannelList) { + if (channel.isBrowsable()) { + list.add(channel); + } + } + return list.toArray(new Channel[0]); } public int size() { diff --git a/src/com/android/tv/ui/ChannelListAdapter.java b/src/com/android/tv/ui/ChannelListAdapter.java index b4bc2c73..baacb752 100644 --- a/src/com/android/tv/ui/ChannelListAdapter.java +++ b/src/com/android/tv/ui/ChannelListAdapter.java @@ -24,35 +24,59 @@ import com.android.tv.R; import com.android.tv.data.Channel; import com.android.tv.data.ChannelMap; +import java.util.ArrayList; + /* * An adapter of channel list. */ public class ChannelListAdapter extends ItemListView.ItemListAdapter { private Channel[] mChannelList; private ItemListView mListView; + private boolean mBrowsableOnly; + private final String mFixedTitle; + private String mTitle; + private final int mTileHeight; public ChannelListAdapter(Context context, Handler handler, - View.OnClickListener onClickListener) { + View.OnClickListener onClickListener, boolean browsableOnly, String title, + int tileHeight) { super(context, handler, R.layout.channel_tile, onClickListener); + mBrowsableOnly = browsableOnly; + mFixedTitle = title; + mTileHeight = tileHeight; + } + + @Override + public int getTileHeight() { + return mTileHeight; + } + + @Override + public String getTitle() { + return mFixedTitle != null ? mFixedTitle : mTitle; } + @Override public void update(ChannelMap channelMap) { update(channelMap, mListView); } + @Override public void update(ChannelMap channelMap, ItemListView listView) { - mChannelList = channelMap == null ? null : channelMap.getAllChannelList(); + mChannelList = channelMap == null ? null : channelMap.getChannelList(mBrowsableOnly); setItemList(mChannelList); - String title = null; - mListView = listView; - if (channelMap != null) { - setCurrentChannelId(channelMap.getCurrentChannelId()); - title = channelMap.getTvInput().getDisplayName(); - } + if (mFixedTitle == null) { + mTitle = null; + mListView = listView; + if (channelMap != null) { + setCurrentChannelId(channelMap.getCurrentChannelId()); + mTitle = channelMap.getTvInput().getDisplayName(); + } - if (mListView != null) { - mListView.setTitle(title); + if (mListView != null) { + mListView.setTitle(mTitle); + } } } diff --git a/src/com/android/tv/ui/ItemListView.java b/src/com/android/tv/ui/ItemListView.java index 717c486a..9e89e5a0 100644 --- a/src/com/android/tv/ui/ItemListView.java +++ b/src/com/android/tv/ui/ItemListView.java @@ -28,6 +28,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.android.tv.R; +import com.android.tv.data.ChannelMap; /* * A subclass of LinearLayout that shows a title and list view. @@ -53,17 +54,17 @@ public class ItemListView extends LinearLayout { super(context, attrs, defStyle); } - public void loadViews(int listViewHeight) { + public void loadViews() { mTitleView = (TextView) findViewById(R.id.title); - mListView = (HorizontalGridView) findViewById(R.id.list_view); - ViewGroup.LayoutParams lp = mListView.getLayoutParams(); - lp.height = listViewHeight; } public void populateViews(String title, ItemListAdapter adapter) { mTitleView.setText(title); mListView.setAdapter(adapter); + + ViewGroup.LayoutParams lp = mListView.getLayoutParams(); + lp.height = adapter.getTileHeight(); } public void setTitle(String title) { @@ -74,13 +75,19 @@ public class ItemListView extends LinearLayout { mListView.setSelectedPosition(position); } - public static class ItemListAdapter extends RecyclerView.Adapter<ItemListAdapter.MyViewHolder> { + public static abstract class ItemListAdapter extends + RecyclerView.Adapter<ItemListAdapter.MyViewHolder> { private final LayoutInflater mLayoutInflater; private final View.OnClickListener mOnClickListener; private final int mLayoutResId; private Object[] mItemList; private Handler mHandler; + public abstract int getTileHeight(); + public abstract String getTitle(); + public abstract void update(ChannelMap channelMap); + public abstract void update(ChannelMap channelMap, ItemListView list); + public ItemListAdapter(Context context, Handler handler, int layoutResId, View.OnClickListener onClickListener) { mHandler = handler; @@ -115,8 +122,9 @@ public class ItemListView extends LinearLayout { @Override public void onBindViewHolder(MyViewHolder baseHolder, int position) { TileView view = (TileView) baseHolder.itemView; - if (mItemList != null && position >= 0 && mItemList.length > position) { - view.populateViews(mOnClickListener, mItemList[position]); + Object[] itemList = mItemList; + if (itemList != null && position >= 0 && itemList.length > position) { + view.populateViews(mOnClickListener, itemList[position]); if (view instanceof ViewGroup) { final ViewGroup viewGroup = (ViewGroup) view; mHandler.post(new Runnable() { @@ -133,7 +141,8 @@ public class ItemListView extends LinearLayout { @Override public int getItemCount() { - return mItemList == null ? 0 : mItemList.length; + Object[] itemList = mItemList; + return itemList == null ? 0 : itemList.length; } } }
\ No newline at end of file diff --git a/src/com/android/tv/ui/MainMenuView.java b/src/com/android/tv/ui/MainMenuView.java index faf6f719..b12ac72e 100644 --- a/src/com/android/tv/ui/MainMenuView.java +++ b/src/com/android/tv/ui/MainMenuView.java @@ -32,22 +32,24 @@ import com.android.tv.data.Channel; import com.android.tv.data.ChannelMap; import com.android.tv.dialog.PrivacySettingDialogFragment; +import java.util.ArrayList; + /* * A subclass of VerticalGridView that shows tv main menu. */ public class MainMenuView extends VerticalGridView implements View.OnClickListener { - private static final int MENU_COUNT = 2; - private static final int ALL_CHANNEL_LIST_MENU_TYPE = 0; - private static final int SETTINGS_MENU_TYPE = 1; + private static final int DUMMY_TYPE = 0; + private static final int CHANNEL_LIST_TYPE = 1; + private static final int OPTIONS_TYPE = 2; private final LayoutInflater mLayoutInflater; - private final MainMenuAdapter mAapter = new MainMenuAdapter(); + private final MainMenuAdapter mAdapter = new MainMenuAdapter(); private ChannelMap mChannelMap; private TvActivity mTvActivity; private final Handler mHandler = new Handler(); - private final ChannelListAdapter mAllChannelListAdapter; - private final OptionsAdapter mOptionsAdapter; + private final ArrayList<ItemListView.ItemListAdapter> mAllAdapterList = + new ArrayList<ItemListView.ItemListAdapter>(); public MainMenuView(Context context) { this(context, null, 0); @@ -61,10 +63,21 @@ public class MainMenuView extends VerticalGridView implements View.OnClickListen super(context, attrs, defStyle); mLayoutInflater = LayoutInflater.from(context); - setAdapter(mAapter); + setWindowAlignmentOffset(context.getResources().getDimensionPixelOffset( + R.dimen.selected_row_alignment)); + setWindowAlignmentOffsetPercent(VerticalGridView.WINDOW_ALIGN_OFFSET_PERCENT_DISABLED); + + setAdapter(mAdapter); + + // List for enabled channels + mAllAdapterList.add(new ChannelListAdapter(context, mHandler, this, true, null, + context.getResources().getDimensionPixelOffset(R.dimen.channel_list_view_height))); - mAllChannelListAdapter = new ChannelListAdapter(context, mHandler, this); - mOptionsAdapter = new OptionsAdapter(context, mHandler, this); + // List for options + mAllAdapterList.add(new OptionsAdapter(context, mHandler, this)); + + // Keep all items for the main menu + setItemViewCacheSize(mAllAdapterList.size()); } public void setTvActivity(TvActivity activity) { @@ -73,14 +86,29 @@ public class MainMenuView extends VerticalGridView implements View.OnClickListen public void setChannelMap(ChannelMap channelMap) { mChannelMap = channelMap; - mAllChannelListAdapter.update(channelMap); - mOptionsAdapter.update(channelMap); + + ArrayList<ItemListView.ItemListAdapter> availableAdapterList = + new ArrayList<ItemListView.ItemListAdapter>(); + for (ItemListView.ItemListAdapter adapter : mAllAdapterList) { + adapter.update(channelMap); + if (adapter.getItemCount() > 0) { + availableAdapterList.add(adapter); + } + } + + mAdapter.setItemListAdapters( + availableAdapterList.toArray(new ItemListView.ItemListAdapter[0])); } private void show() { if (mChannelMap != null) { long id = mChannelMap.getCurrentChannelId(); - mAllChannelListAdapter.setCurrentChannelId(id); + + for (ItemListView.ItemListAdapter adapter : mAllAdapterList) { + if (adapter instanceof ChannelListAdapter) { + ((ChannelListAdapter) adapter).setCurrentChannelId(id); + } + } } setSelectedPosition(0); @@ -185,9 +213,26 @@ public class MainMenuView extends VerticalGridView implements View.OnClickListen } class MainMenuAdapter extends RecyclerView.Adapter<MainMenuAdapter.MyViewHolder> { + private ItemListView.ItemListAdapter[] mAdapters; + + public void setItemListAdapters(ItemListView.ItemListAdapter[] adapters) { + mAdapters = adapters; + notifyDataSetChanged(); + } + @Override public int getItemViewType(int position) { - return position; + ItemListView.ItemListAdapter[] adapters = mAdapters; + if (adapters != null && position < adapters.length) { + if (adapters[position] instanceof ChannelListAdapter) { + return CHANNEL_LIST_TYPE; + } + if (adapters[position] instanceof OptionsAdapter) { + return OPTIONS_TYPE; + } + } + + return DUMMY_TYPE; } private class MyViewHolder extends RecyclerView.ViewHolder { @@ -198,55 +243,27 @@ public class MainMenuView extends VerticalGridView implements View.OnClickListen @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = null; - view = mLayoutInflater.inflate(R.layout.item_list, parent, false); - - int listViewHeight = 0; - switch (viewType) { - case ALL_CHANNEL_LIST_MENU_TYPE: - listViewHeight = mContext.getResources().getDimensionPixelOffset( - R.dimen.channel_list_view_height); - break; - case SETTINGS_MENU_TYPE: - listViewHeight = mContext.getResources().getDimensionPixelOffset( - R.dimen.action_list_view_height); - break; - - default: - throw new IllegalArgumentException("unexpected view type: " + viewType); - } - ((ItemListView) view).loadViews(listViewHeight); + View view = mLayoutInflater.inflate(R.layout.item_list, parent, false); + ((ItemListView) view).loadViews(); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder baseHolder, int position) { - int viewType = position; - ItemListView listView = null; - switch (viewType) { - case ALL_CHANNEL_LIST_MENU_TYPE: - listView = (ItemListView) baseHolder.itemView; - - listView.populateViews(null, mAllChannelListAdapter); - mAllChannelListAdapter.update(mChannelMap, listView); - break; - - case SETTINGS_MENU_TYPE: - listView = (ItemListView) baseHolder.itemView; - listView.populateViews(mContext.getString(R.string.menu_title), - mOptionsAdapter); - mOptionsAdapter.update(mChannelMap); - break; - - default: - throw new IllegalArgumentException("unexpected view type: " + viewType); + ItemListView.ItemListAdapter[] adapters = mAdapters; + if (adapters != null && position < adapters.length) { + ItemListView listView = (ItemListView) baseHolder.itemView; + ItemListView.ItemListAdapter adapter = mAdapters[position]; + listView.populateViews(adapter.getTitle(), adapter); + adapter.update(mChannelMap, listView); } } @Override public int getItemCount() { - return MENU_COUNT; + ItemListView.ItemListAdapter[] adapters = mAdapters; + return adapters == null ? 0 : adapters.length; } } -}
\ No newline at end of file +} diff --git a/src/com/android/tv/ui/OptionsAdapter.java b/src/com/android/tv/ui/OptionsAdapter.java index 518d3f3e..fc44f043 100644 --- a/src/com/android/tv/ui/OptionsAdapter.java +++ b/src/com/android/tv/ui/OptionsAdapter.java @@ -31,10 +31,28 @@ import java.util.ArrayList; * An adapter of options. */ public class OptionsAdapter extends ItemListView.ItemListAdapter { + private final String mTitle; + private final int mTileHeight; + public OptionsAdapter(Context context, Handler handler, View.OnClickListener onClickListener) { super(context, handler, R.layout.action_tile, onClickListener); + + mTitle = context.getString(R.string.menu_title); + mTileHeight = context.getResources().getDimensionPixelOffset( + R.dimen.action_list_view_height); + } + + @Override + public int getTileHeight() { + return mTileHeight; } + @Override + public String getTitle() { + return mTitle; + } + + @Override public void update(ChannelMap channelMap) { TvInput tvInput = channelMap == null ? null : channelMap.getTvInput(); @@ -54,4 +72,9 @@ public class OptionsAdapter extends ItemListView.ItemListAdapter { setItemList(actionList.toArray(new MenuAction[0])); } + + @Override + public void update(ChannelMap channelMap, ItemListView list) { + update(channelMap); + } } |