Cleanup playback controls sample.
Change-Id: Ib8e054001bb95a4b92acb8a2331a9544ec88e669
diff --git a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java
index 8ee689c..44cd34a 100644
--- a/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java
+++ b/samples/SupportLeanbackDemos/src/com/example/android/leanback/PlaybackOverlayFragment.java
@@ -13,6 +13,8 @@
*/
package com.example.android.leanback;
+import java.util.ArrayList;
+
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
@@ -21,12 +23,15 @@
import android.support.v17.leanback.widget.Action;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.ClassPresenterSelector;
+import android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter;
import android.support.v17.leanback.widget.PlaybackControlsRow;
import android.support.v17.leanback.widget.PlaybackControlsRow.PlayPauseAction;
import android.support.v17.leanback.widget.PlaybackControlsRow.RepeatAction;
import android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsUpAction;
import android.support.v17.leanback.widget.PlaybackControlsRow.ThumbsDownAction;
import android.support.v17.leanback.widget.PlaybackControlsRow.ShuffleAction;
+import android.support.v17.leanback.widget.PlaybackControlsRow.SkipNextAction;
+import android.support.v17.leanback.widget.PlaybackControlsRow.SkipPreviousAction;
import android.support.v17.leanback.widget.PlaybackControlsRowPresenter;
import android.support.v17.leanback.widget.HeaderItem;
import android.support.v17.leanback.widget.VerticalGridView;
@@ -42,11 +47,10 @@
private static final boolean SHOW_DETAIL = true;
private static final boolean HIDE_MORE_ACTIONS = false;
- private static final int PRIMARY_CONTROLS = 7;
+ private static final int PRIMARY_CONTROLS = 5;
private static final boolean SHOW_IMAGE = PRIMARY_CONTROLS <= 5;
- private static final int TOTAL_TIME_MS = 15 * 1000;
private static final int BACKGROUND_TYPE = PlaybackOverlayFragment.BG_LIGHT;
- private static final int NUM_ROWS = 3;
+ private static final int MORE_ROWS = 3;
private ArrayObjectAdapter mRowsAdapter;
private ArrayObjectAdapter mPrimaryActionsAdapter;
@@ -56,9 +60,11 @@
private ThumbsUpAction mThumbsUpAction;
private ThumbsDownAction mThumbsDownAction;
private ShuffleAction mShuffleAction;
+ private SkipNextAction mSkipNextAction;
+ private SkipPreviousAction mSkipPreviousAction;
private PlaybackControlsRow mPlaybackControlsRow;
- private Drawable mDetailsDrawable;
- private Drawable mOtherDrawable;
+ private ArrayList<MediaItem> mItems = new ArrayList<MediaItem>();
+ private int mCurrentItem;
private Handler mHandler;
private Runnable mRunnable;
@@ -75,18 +81,6 @@
setupRows();
}
- private void notifyChanged(Action action) {
- ArrayObjectAdapter adapter = mPrimaryActionsAdapter;
- if (adapter.indexOf(action) >= 0) {
- adapter.notifyArrayItemRangeChanged(adapter.indexOf(action), 1);
- return;
- }
- adapter = mSecondaryActionsAdapter;
- if (adapter.indexOf(action) >= 0) {
- adapter.notifyArrayItemRangeChanged(adapter.indexOf(action), 1);
- return;
- }
- }
private void setupRows() {
ClassPresenterSelector ps = new ClassPresenterSelector();
@@ -94,25 +88,24 @@
PlaybackControlsRowPresenter playbackControlsRowPresenter;
if (SHOW_DETAIL) {
playbackControlsRowPresenter = new PlaybackControlsRowPresenter(
- new DetailsDescriptionPresenter());
+ new DescriptionPresenter());
} else {
playbackControlsRowPresenter = new PlaybackControlsRowPresenter();
}
playbackControlsRowPresenter.setOnActionClickedListener(new OnActionClickedListener() {
public void onActionClicked(Action action) {
- Toast.makeText(getActivity(), action.toString(), Toast.LENGTH_SHORT).show();
if (action.getId() == mPlayPauseAction.getId()) {
if (mPlayPauseAction.getIndex() == PlayPauseAction.PLAY) {
- int totalTime = mPlaybackControlsRow.getTotalTime();
- if (totalTime > 0 && mPlaybackControlsRow.getCurrentTime() >= totalTime) {
- mPlaybackControlsRow.setCurrentTime(0);
- }
startProgressAutomation();
setFadingEnabled(true);
} else {
stopProgressAutomation();
setFadingEnabled(false);
}
+ } else if (action.getId() == mSkipNextAction.getId()) {
+ next();
+ } else if (action.getId() == mSkipPreviousAction.getId()) {
+ Toast.makeText(getActivity(), "TODO", Toast.LENGTH_SHORT).show();
}
if (action instanceof PlaybackControlsRow.MultiAction) {
((PlaybackControlsRow.MultiAction) action).nextIndex();
@@ -127,6 +120,7 @@
mRowsAdapter = new ArrayObjectAdapter(ps);
addPlaybackControlsRow();
+ addOtherRows();
setAdapter(mRowsAdapter);
}
@@ -134,48 +128,48 @@
private void addPlaybackControlsRow() {
Context context = getActivity();
- ControlButtonPresenterSelector presenterSelector = new ControlButtonPresenterSelector();
- mPrimaryActionsAdapter = new ArrayObjectAdapter(presenterSelector);
- mSecondaryActionsAdapter = new ArrayObjectAdapter(presenterSelector);
-
if (SHOW_DETAIL) {
- mPlaybackControlsRow = new PlaybackControlsRow("Playback Controls Title");
+ mPlaybackControlsRow = new PlaybackControlsRow(new MediaItem());
} else {
mPlaybackControlsRow = new PlaybackControlsRow();
}
- if (SHOW_IMAGE) {
- mDetailsDrawable = context.getResources().getDrawable(R.drawable.details_img);
- mOtherDrawable = context.getResources().getDrawable(R.drawable.details_img_16x9);
- mPlaybackControlsRow.setImageDrawable(mDetailsDrawable);
- }
+ mRowsAdapter.add(mPlaybackControlsRow);
+
+ mItems = new ArrayList<MediaItem>();
+ mItems.add(new MediaItem("Awesome Tune", "The More Awesome Band", R.drawable.details_img, 15*1000));
+ mItems.add(new MediaItem("Pretty nice Tune", "The Nice Guys", R.drawable.details_img, 10*1000));
+ mCurrentItem = 1;
+ updatePlaybackRow(mCurrentItem);
+
+ ControlButtonPresenterSelector presenterSelector = new ControlButtonPresenterSelector();
+ mPrimaryActionsAdapter = new ArrayObjectAdapter(presenterSelector);
+ mSecondaryActionsAdapter = new ArrayObjectAdapter(presenterSelector);
mPlaybackControlsRow.setPrimaryActionsAdapter(mPrimaryActionsAdapter);
mPlaybackControlsRow.setSecondaryActionsAdapter(mSecondaryActionsAdapter);
- mPlaybackControlsRow.setTotalTime(TOTAL_TIME_MS);
- mPlaybackControlsRow.setCurrentTime(10 * 1000);
- mPlaybackControlsRow.setBufferedProgress(75 * 1000);
-
- mRowsAdapter.add(mPlaybackControlsRow);
mPlayPauseAction = new PlayPauseAction(context);
mRepeatAction = new RepeatAction(context);
mThumbsUpAction = new ThumbsUpAction(context);
mThumbsDownAction = new ThumbsDownAction(context);
mShuffleAction = new ShuffleAction(context);
+ mSkipNextAction = new PlaybackControlsRow.SkipNextAction(context);
+ mSkipPreviousAction = new PlaybackControlsRow.SkipPreviousAction(context);
if (PRIMARY_CONTROLS > 5) {
mPrimaryActionsAdapter.add(mThumbsUpAction);
} else {
mSecondaryActionsAdapter.add(mThumbsUpAction);
}
+ mPrimaryActionsAdapter.add(mSkipPreviousAction);
if (PRIMARY_CONTROLS > 3) {
- mPrimaryActionsAdapter.add(new PlaybackControlsRow.SkipPreviousAction(context));
+ mPrimaryActionsAdapter.add(new PlaybackControlsRow.RewindAction(context));
}
- mPrimaryActionsAdapter.add(new PlaybackControlsRow.RewindAction(context));
mPrimaryActionsAdapter.add(mPlayPauseAction);
- mPrimaryActionsAdapter.add(new PlaybackControlsRow.FastForwardAction(context));
if (PRIMARY_CONTROLS > 3) {
- mPrimaryActionsAdapter.add(new PlaybackControlsRow.SkipNextAction(context));
+ mPrimaryActionsAdapter.add(new PlaybackControlsRow.FastForwardAction(context));
}
+ mPrimaryActionsAdapter.add(mSkipNextAction);
+
mSecondaryActionsAdapter.add(mRepeatAction);
mSecondaryActionsAdapter.add(mShuffleAction);
if (PRIMARY_CONTROLS > 5) {
@@ -185,8 +179,40 @@
}
mSecondaryActionsAdapter.add(new PlaybackControlsRow.HighQualityAction(context));
mSecondaryActionsAdapter.add(new PlaybackControlsRow.ClosedCaptioningAction(context));
+ }
- for (int i = 0; i < NUM_ROWS; ++i) {
+ private void notifyChanged(Action action) {
+ ArrayObjectAdapter adapter = mPrimaryActionsAdapter;
+ if (adapter.indexOf(action) >= 0) {
+ adapter.notifyArrayItemRangeChanged(adapter.indexOf(action), 1);
+ return;
+ }
+ adapter = mSecondaryActionsAdapter;
+ if (adapter.indexOf(action) >= 0) {
+ adapter.notifyArrayItemRangeChanged(adapter.indexOf(action), 1);
+ return;
+ }
+ }
+
+ private void updatePlaybackRow(int index) {
+ if (mPlaybackControlsRow.getItem() != null) {
+ MediaItem item = (MediaItem) mPlaybackControlsRow.getItem();
+ item.title = mItems.get(index).title;
+ item.subtitle = mItems.get(index).subtitle;
+ }
+ if (SHOW_IMAGE) {
+ mPlaybackControlsRow.setImageDrawable(getResources().getDrawable(
+ mItems.get(mCurrentItem).imageResId));
+ }
+ mRowsAdapter.notifyArrayItemRangeChanged(0, 1);
+
+ mPlaybackControlsRow.setTotalTime(mItems.get(mCurrentItem).durationMs);
+ mPlaybackControlsRow.setCurrentTime(0);
+ mPlaybackControlsRow.setBufferedProgress(75 * 1000);
+ }
+
+ private void addOtherRows() {
+ for (int i = 0; i < MORE_ROWS; ++i) {
ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new StringPresenter());
listRowAdapter.add("Some related content");
listRowAdapter.add("Other related content");
@@ -195,28 +221,35 @@
}
}
+ private int getUpdatePeriod() {
+ if (getView() == null || mPlaybackControlsRow.getTotalTime() <= 0) {
+ return 1000;
+ }
+ return Math.max(16, mPlaybackControlsRow.getTotalTime() / getView().getWidth());
+ }
+
private void startProgressAutomation() {
- int width = getView().getWidth();
- final int totalTime = mPlaybackControlsRow.getTotalTime();
- final int updateFreq = totalTime <= 0 ? 1000 :
- Math.max(16, totalTime / width);
mRunnable = new Runnable() {
@Override
public void run() {
- int currentTime = mPlaybackControlsRow.getCurrentTime() + updateFreq;
- if (totalTime > 0 && totalTime <= currentTime) {
- currentTime = 0;
- mPlaybackControlsRow.setCurrentTime(0);
- mPlaybackControlsRow.setImageDrawable(
- mPlaybackControlsRow.getImageDrawable() == mDetailsDrawable ?
- mOtherDrawable : mDetailsDrawable);
- mRowsAdapter.notifyArrayItemRangeChanged(0, 1);
- }
+ int updatePeriod = getUpdatePeriod();
+ int currentTime = mPlaybackControlsRow.getCurrentTime() + updatePeriod;
+ int totalTime = mPlaybackControlsRow.getTotalTime();
mPlaybackControlsRow.setCurrentTime(currentTime);
- mHandler.postDelayed(this, updateFreq);
+ if (totalTime > 0 && totalTime <= currentTime) {
+ next();
+ }
+ mHandler.postDelayed(this, updatePeriod);
}
};
- mHandler.postDelayed(mRunnable, updateFreq);
+ mHandler.postDelayed(mRunnable, getUpdatePeriod());
+ }
+
+ private void next() {
+ if (++mCurrentItem >= mItems.size()) {
+ mCurrentItem = 0;
+ }
+ updatePlaybackRow(mCurrentItem);
}
private void stopProgressAutomation() {
@@ -224,4 +257,29 @@
mHandler.removeCallbacks(mRunnable);
}
}
+
+ static class MediaItem {
+ String title;
+ String subtitle;
+ int imageResId;
+ int durationMs;
+
+ MediaItem() {
+ }
+
+ MediaItem(String title, String subtitle, int imageResId, int durationMs) {
+ this.title = title;
+ this.subtitle = subtitle;
+ this.imageResId = imageResId;
+ this.durationMs = durationMs;
+ }
+ }
+
+ static class DescriptionPresenter extends AbstractDetailsDescriptionPresenter {
+ @Override
+ protected void onBindDescription(ViewHolder vh, Object item) {
+ vh.getTitle().setText(((MediaItem) item).title);
+ vh.getSubtitle().setText(((MediaItem) item).subtitle);
+ }
+ }
}