/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.tv.menu; import android.content.Context; import android.view.View; import com.android.tv.R; import com.android.tv.TvApplication; import com.android.tv.TvOptionsManager; import com.android.tv.TvOptionsManager.OptionChangedListener; import com.android.tv.analytics.Tracker; import java.util.List; /* * An adapter of options. */ public abstract class OptionsRowAdapter extends ItemListRowView.ItemListAdapter { private static final String CUSTOM_ACTION_LABEL = "custom action"; protected final Tracker mTracker; private List mActionList; private final View.OnClickListener mMenuActionOnClickListener = new View.OnClickListener() { @Override public void onClick(View view) { final MenuAction action = (MenuAction) view.getTag(); view.post(new Runnable() { @Override public void run() { int resId = action.getActionNameResId(); if (resId == 0) { mTracker.sendMenuClicked(CUSTOM_ACTION_LABEL); } else { mTracker.sendMenuClicked(resId); } executeAction(action.getType()); } }); } }; public OptionsRowAdapter(Context context) { super(context); mTracker = TvApplication.getSingletons(context).getTracker(); } /** * Update action list and its content. */ @Override public void update() { if (mActionList == null) { mActionList = createActions(); updateActions(); setItemList(mActionList); } else { if (updateActions()) { setItemList(mActionList); } } } @Override protected int getLayoutResId(int viewType) { return R.layout.menu_card_action; } protected abstract List createActions(); protected abstract boolean updateActions(); protected abstract void executeAction(int type); /** * Gets the action at the given position. * Note that action at the position may differ from returned by {@link #createActions}. * See {@link CustomizableOptionsRowAdapter} */ protected MenuAction getAction(int position) { return mActionList.get(position); } /** * Sets the action at the given position. * Note that action at the position may differ from returned by {@link #createActions}. * See {@link CustomizableOptionsRowAdapter} */ protected void setAction(int position, MenuAction action) { mActionList.set(position, action); } /** * Adds an action to the given position. * Note that action at the position may differ from returned by {@link #createActions}. * See {@link CustomizableOptionsRowAdapter} */ protected void addAction(int position, MenuAction action) { mActionList.add(position, action); } /** * Removes an action at the given position. * Note that action at the position may differ from returned by {@link #createActions}. * See {@link CustomizableOptionsRowAdapter} */ protected void removeAction(int position) { mActionList.remove(position); } protected int getActionSize() { return mActionList.size(); } @Override public void onBindViewHolder(MyViewHolder viewHolder, int position) { super.onBindViewHolder(viewHolder, position); viewHolder.itemView.setTag(getItemList().get(position)); viewHolder.itemView.setOnClickListener(mMenuActionOnClickListener); } @Override public int getItemViewType(int position) { // This makes 1:1 mapping from MenuAction to ActionCardView. That is, an ActionCardView will // not be used(recycled) by other type of MenuAction. So the selection state of the view can // be preserved. return mActionList.get(position).getType(); } protected void setOptionChangedListener(final MenuAction action) { TvOptionsManager om = getMainActivity().getTvOptionsManager(); om.setOptionChangedListener(action.getType(), new OptionChangedListener() { @Override public void onOptionChanged(String newOption) { setItemList(mActionList); } }); } }