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