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;
20944779887775bd950cf1abf348d2df461593f6abLive Channels Teamimport com.android.tv.common.customization.CustomAction;
21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.ArrayList;
22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List;
23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
2495961816a768da387f0b5523cf4363ace2044089Nick Chalko/** An adapter of options that can accepts customization data. */
25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic abstract class CustomizableOptionsRowAdapter extends OptionsRowAdapter {
26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    private final List<CustomAction> mCustomActions;
27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    public CustomizableOptionsRowAdapter(Context context, List<CustomAction> customActions) {
29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        super(context);
30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        mCustomActions = customActions;
31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    // Subclass should implement this and return list of {@link MenuAction}.
34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    // Custom actions will be added at the first or the last position in addition.
35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    // Note that {@link MenuAction} should have non-negative type
36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    // because negative types are reserved for custom actions.
37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected abstract List<MenuAction> createBaseActions();
38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    // Subclass should implement this to perform proper action
40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    // for {@link MenuAction} with the given type returned by {@link createBaseActions}.
41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected abstract void executeBaseAction(int type);
42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected List<MenuAction> createActions() {
45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        List<MenuAction> actions = new ArrayList<>(createBaseActions());
46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (mCustomActions != null) {
48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            int position = 0;
49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            for (int i = 0; i < mCustomActions.size(); i++) {
50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                // Type of MenuAction should be unique in the Adapter.
51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                int type = -(i + 1);
52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                CustomAction customAction = mCustomActions.get(i);
5395961816a768da387f0b5523cf4363ace2044089Nick Chalko                MenuAction action =
5495961816a768da387f0b5523cf4363ace2044089Nick Chalko                        new MenuAction(
5595961816a768da387f0b5523cf4363ace2044089Nick Chalko                                customAction.getTitle(), type, customAction.getIconDrawable());
56816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
57816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                if (customAction.isFront()) {
58816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    actions.add(position++, action);
59816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                } else {
60816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                    actions.add(action);
61816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko                }
62816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            }
63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return actions;
65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
66816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
67816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    @Override
68816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected void executeAction(int type) {
69816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        if (type < 0) {
70816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            int position = -(type + 1);
71816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            getMainActivity().startActivitySafe(mCustomActions.get(position).getIntent());
72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        } else {
73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko            executeBaseAction(type);
74816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        }
75816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
76816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko
77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    protected List<CustomAction> getCustomActions() {
78816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko        return mCustomActions;
79816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko    }
80816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko}
81