1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/* 2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project 3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License. 6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at 7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software 11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and 14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License. 15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.menu; 18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.Context; 20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.View; 21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.R; 23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.TvApplication; 24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.TvOptionsManager; 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.TvOptionsManager.OptionChangedListener; 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.analytics.Tracker; 27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List; 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/* 31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * An adapter of options. 32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic abstract class OptionsRowAdapter extends ItemListRowView.ItemListAdapter<MenuAction> { 34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final String CUSTOM_ACTION_LABEL = "custom action"; 35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected final Tracker mTracker; 36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private List<MenuAction> mActionList; 37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private final View.OnClickListener mMenuActionOnClickListener = new View.OnClickListener() { 39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void onClick(View view) { 41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko final MenuAction action = (MenuAction) view.getTag(); 42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko view.post(new Runnable() { 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void run() { 45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko int resId = action.getActionNameResId(); 46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (resId == 0) { 47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTracker.sendMenuClicked(CUSTOM_ACTION_LABEL); 48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mTracker.sendMenuClicked(resId); 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko executeAction(action.getType()); 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 53816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko }); 54816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 55816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko }; 56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public OptionsRowAdapter(Context context) { 58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super(context); 591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko mTracker = TvApplication.getSingletons(context).getTracker(); 60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Update action list and its content. 64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void update() { 67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (mActionList == null) { 68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mActionList = createActions(); 69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko updateActions(); 70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko setItemList(mActionList); 71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else { 72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (updateActions()) { 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko setItemList(mActionList); 74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected int getLayoutResId(int viewType) { 80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return R.layout.menu_card_action; 81816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 82816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 83816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected abstract List<MenuAction> createActions(); 84816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected abstract boolean updateActions(); 85816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected abstract void executeAction(int type); 86816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 87816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 88816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Gets the action at the given position. 89816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Note that action at the position may differ from returned by {@link #createActions}. 90816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See {@link CustomizableOptionsRowAdapter} 91816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 92816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected MenuAction getAction(int position) { 93816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return mActionList.get(position); 94816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 95816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 96816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 97816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Sets the action at the given position. 98816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Note that action at the position may differ from returned by {@link #createActions}. 99816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See {@link CustomizableOptionsRowAdapter} 100816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 101816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void setAction(int position, MenuAction action) { 102816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mActionList.set(position, action); 103816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 104816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 105816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 106816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Adds an action to the given position. 107816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Note that action at the position may differ from returned by {@link #createActions}. 108816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See {@link CustomizableOptionsRowAdapter} 109816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 110816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void addAction(int position, MenuAction action) { 111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mActionList.add(position, action); 112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko /** 115816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Removes an action at the given position. 116816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Note that action at the position may differ from returned by {@link #createActions}. 117816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See {@link CustomizableOptionsRowAdapter} 118816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 119816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void removeAction(int position) { 120816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mActionList.remove(position); 121816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 122816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 123816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected int getActionSize() { 124816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return mActionList.size(); 125816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 126816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 127816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 128816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void onBindViewHolder(MyViewHolder viewHolder, int position) { 129816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onBindViewHolder(viewHolder, position); 130816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 131816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko viewHolder.itemView.setTag(getItemList().get(position)); 132816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko viewHolder.itemView.setOnClickListener(mMenuActionOnClickListener); 133816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 134816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 135816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 136816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public int getItemViewType(int position) { 137816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // This makes 1:1 mapping from MenuAction to ActionCardView. That is, an ActionCardView will 138816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // not be used(recycled) by other type of MenuAction. So the selection state of the view can 139816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // be preserved. 140816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return mActionList.get(position).getType(); 141816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 142816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 143816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void setOptionChangedListener(final MenuAction action) { 144816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko TvOptionsManager om = getMainActivity().getTvOptionsManager(); 145816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko om.setOptionChangedListener(action.getType(), new OptionChangedListener() { 146816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 147816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void onOptionChanged(String newOption) { 148816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko setItemList(mActionList); 149816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 150816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko }); 151816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 152816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 153