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