blob: 4e69a601d5570c1f08a2daf80f12df05f401b0d1 [file] [log] [blame]
/*
* 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.TvSingletons;
import com.android.tv.analytics.Tracker;
import java.util.List;
/*
* An adapter of options.
*/
public abstract class OptionsRowAdapter extends ItemListRowView.ItemListAdapter<MenuAction> {
private static final String CUSTOM_ACTION_LABEL = "custom action";
protected final Tracker mTracker;
private List<MenuAction> mActionList;
private final View.OnClickListener mMenuActionOnClickListener =
new View.OnClickListener() {
@Override
public void onClick(View view) {
final MenuAction action = (MenuAction) view.getTag();
view.post(
() -> {
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 = TvSingletons.getSingletons(context).getTracker();
}
/** Update action list and its content. */
@Override
public void update() {
if (mActionList == null) {
mActionList = createActions();
setItemList(mActionList);
} else {
updateActions();
}
}
@Override
protected int getLayoutResId(int viewType) {
return R.layout.menu_card_action;
}
protected abstract List<MenuAction> createActions();
protected abstract void 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);
}
@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();
}
}