PlaybackControlsPresenter.java revision 7ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7
1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
12 * the License.
13 */
14package android.support.v17.leanback.widget;
15
16import android.support.v17.leanback.R;
17import android.view.LayoutInflater;
18import android.view.View;
19import android.view.ViewGroup;
20import android.widget.FrameLayout;
21
22/**
23 * A presenter for a control bar that supports "more actions",
24 * and toggling the set of controls between primary and secondary
25 * sets of {@link Actions}.
26 */
27class PlaybackControlsPresenter extends ControlBarPresenter {
28
29    /**
30     * The data type expected by this presenter.
31     */
32    static class BoundData extends ControlBarPresenter.BoundData {
33        /**
34         * The adapter containing secondary actions.
35         */
36        ObjectAdapter secondaryActionsAdapter;
37    }
38
39    class ViewHolder extends ControlBarPresenter.ViewHolder {
40        ObjectAdapter mMoreActionsAdapter;
41        ObjectAdapter.DataObserver mMoreActionsObserver;
42        FrameLayout mMoreActionsDock;
43        Presenter.ViewHolder mMoreActionsViewHolder;
44        boolean mMoreActionsShowing;
45
46        ViewHolder(View rootView) {
47            super(rootView);
48            mMoreActionsDock = (FrameLayout) rootView.findViewById(R.id.more_actions_dock);
49            mMoreActionsObserver = new ObjectAdapter.DataObserver() {
50                @Override
51                public void onChanged() {
52                    if (mMoreActionsShowing) {
53                        showControls(mMoreActionsAdapter, mPresenter);
54                    }
55                }
56                @Override
57                public void onItemRangeChanged(int positionStart, int itemCount) {
58                    if (mMoreActionsShowing) {
59                        for (int i = 0; i < itemCount; i++) {
60                            bindControlToAction(positionStart + i,
61                                    mMoreActionsAdapter, mPresenter);
62                        }
63                    }
64                }
65            };
66        }
67
68        void showMoreActions() {
69            if (mMoreActionsViewHolder == null) {
70                Action action = new PlaybackControlsRow.MoreActions(mMoreActionsDock.getContext());
71                mMoreActionsViewHolder = mPresenter.onCreateViewHolder(mMoreActionsDock);
72                mPresenter.onBindViewHolder(mMoreActionsViewHolder, action);
73                mPresenter.setOnClickListener(mMoreActionsViewHolder, new View.OnClickListener() {
74                    @Override
75                    public void onClick(View v) {
76                        toggleMoreActions();
77                    }
78                });
79            }
80            mMoreActionsDock.addView(mMoreActionsViewHolder.view);
81        }
82
83        void toggleMoreActions() {
84            mMoreActionsShowing = !mMoreActionsShowing;
85            showControls(getAdapter(), mPresenter);
86        }
87
88        @Override
89        ObjectAdapter getAdapter() {
90            return mMoreActionsShowing ? mMoreActionsAdapter : mAdapter;
91        }
92    }
93
94    private boolean mMoreActionsEnabled = true;
95
96    /**
97     * Constructor for a PlaybackControlsRowPresenter.
98     *
99     * @param layoutResourceId The resource id of the layout for this presenter.
100     */
101    public PlaybackControlsPresenter(int layoutResourceId) {
102        super(layoutResourceId);
103    }
104
105    /**
106     * Enables the display of secondary actions.
107     * A "more actions" button will be displayed.  When "more actions" is selected,
108     * the primary actions are replaced with the secondary actions.
109     */
110    public void enableSecondaryActions(boolean enable) {
111        mMoreActionsEnabled = enable;
112    }
113
114    /**
115     * Returns true if secondary actions are enabled.
116     */
117    public boolean areMoreActionsEnabled() {
118        return mMoreActionsEnabled;
119    }
120
121    @Override
122    public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
123        View v = LayoutInflater.from(parent.getContext())
124            .inflate(getLayoutResourceId(), parent, false);
125        return new ViewHolder(v);
126    }
127
128    @Override
129    public void onBindViewHolder(Presenter.ViewHolder holder, Object item) {
130        super.onBindViewHolder(holder, item);
131
132        ViewHolder vh = (ViewHolder) holder;
133        BoundData data = (BoundData) item;
134        if (vh.mMoreActionsAdapter != data.secondaryActionsAdapter) {
135            vh.mMoreActionsAdapter = data.secondaryActionsAdapter;
136            vh.mMoreActionsAdapter.registerObserver(vh.mMoreActionsObserver);
137        }
138        if (mMoreActionsEnabled) {
139            vh.showMoreActions();
140        }
141    }
142
143    @Override
144    public void onUnbindViewHolder(Presenter.ViewHolder holder) {
145        super.onUnbindViewHolder(holder);
146        ViewHolder vh = (ViewHolder) holder;
147        vh.mMoreActionsAdapter.unregisterObserver(vh.mMoreActionsObserver);
148        vh.mMoreActionsAdapter = null;
149    }
150}
151