From f797f525ce3b5ce0338a18e64ece25e7bd5d8b1f Mon Sep 17 00:00:00 2001 From: Keyvan Amiri Date: Mon, 11 Apr 2016 17:48:29 -0700 Subject: [PATCH] Showcase app: Added media row actions to the music fragment With the latest support for custom actions from leanback support, showcase app now demos Playlist and Favorite action buttons for each media item row. Upon favoriting a song, the media row is highlighted with a different color. Also, clicking on song details will start playing that song. Change-Id: I59111563bebea3b0bf28e12d74f71421dc971f88 --- .../app/src/main/AndroidManifest.xml | 1 + .../app/media/MediaPlayerGlue.java | 86 ++++--- .../MusicConsumptionExampleFragment.java | 225 +++++++++++++++--- .../app/media/TrackListHeader.java | 29 --- .../supportleanbackshowcase/models/Song.java | 85 ++++--- .../ic_favorite_border_white_24dp.xml | 9 + .../res/drawable/ic_favorite_filled_24dp.xml | 9 + .../drawable/ic_playlist_add_filled_24dp.xml | 9 + .../drawable/ic_playlist_add_white_24dp.xml | 9 + .../app/src/main/res/layout/row_song.xml | 77 ------ .../main/res/layout/row_track_list_header.xml | 44 ---- .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/strings.xml | 2 +- .../app/src/main/res/values/styles.xml | 60 ++++- .../app/src/main/res/values/themes.xml | 18 ++ 15 files changed, 386 insertions(+), 283 deletions(-) create mode 100644 samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_border_white_24dp.xml create mode 100644 samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_filled_24dp.xml create mode 100644 samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_filled_24dp.xml create mode 100644 samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml delete mode 100644 samples/SupportLeanbackShowcase/app/src/main/res/layout/row_song.xml delete mode 100644 samples/SupportLeanbackShowcase/app/src/main/res/layout/row_track_list_header.xml diff --git a/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml b/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml index a7e158b1f..31af3e1a3 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/AndroidManifest.xml @@ -16,6 +16,7 @@ android:allowBackup="true" android:icon="@mipmap/app_banner_sample_app" android:label="@string/app_name" + android:supportsRtl="true" android:largeHeap="true" android:theme="@style/Theme.Example.LeanbackLauncher"> = mSongList.size()) { - mCurrentSongIndex = 0; - if (!mGlue.repeatAll()) return; + } else { + mCurrentSongIndex++; + if (mCurrentSongIndex >= mSongList.size()) { + mCurrentSongIndex = 0; + if (!mGlue.repeatAll()) { + return; + } + } } startPlayback(); } diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/TrackListHeader.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/TrackListHeader.java index ff794a24d..020674893 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/TrackListHeader.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/media/TrackListHeader.java @@ -15,36 +15,7 @@ package android.support.v17.leanback.supportleanbackshowcase.app.media; -import android.content.Context; -import android.support.v17.leanback.supportleanbackshowcase.R; import android.support.v17.leanback.widget.Row; -import android.support.v17.leanback.widget.RowPresenter; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; public class TrackListHeader extends Row { - - public static class Presenter extends RowPresenter { - - private final Context mContext; - - public Presenter(Context context) { - mContext = context; - setHeaderPresenter(null); - } - - @Override public boolean isUsingDefaultSelectEffect() { - return false; - } - - @Override protected ViewHolder createRowViewHolder(ViewGroup parent) { - View view = LayoutInflater.from(mContext).inflate(R.layout.row_track_list_header, parent, false); - view.setFocusable(false); - view.setFocusableInTouchMode(false); - return new ViewHolder(view); - } - } - - } diff --git a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Song.java b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Song.java index 89729be80..1ba29ca6c 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Song.java +++ b/samples/SupportLeanbackShowcase/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/models/Song.java @@ -16,17 +16,22 @@ package android.support.v17.leanback.supportleanbackshowcase.models; import android.content.Context; +import android.graphics.drawable.Drawable; import android.support.v17.leanback.supportleanbackshowcase.R; +import android.support.v17.leanback.widget.BaseOnItemViewSelectedListener; +import android.support.v17.leanback.widget.MultiActionsProvider; import android.support.v17.leanback.widget.Row; import android.support.v17.leanback.widget.RowPresenter; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import com.google.gson.Gson; import com.google.gson.annotations.SerializedName; -public class Song extends Row { +public class Song implements MultiActionsProvider { @SerializedName("title") private String mTitle = ""; @SerializedName("description") private String mDescription = ""; @@ -35,12 +40,27 @@ public class Song extends Row { @SerializedName("file") private String mFile = null; @SerializedName("duration") private String mDuration = null; @SerializedName("number") private int mNumber = 0; + @SerializedName("favorite") private boolean mFavorite = false; + private MultiAction[] mMediaRowActions; + + + public void setMediaRowActions(MultiAction[] mediaRowActions) { + mMediaRowActions = mediaRowActions; + } + + public MultiAction[] getMediaRowActions() { + return mMediaRowActions; + } public String getDuration() { return mDuration; } + public void setDuration(String duration) { + mDuration = duration; + } + public int getNumber() { return mNumber; } @@ -53,10 +73,26 @@ public class Song extends Row { return mDescription; } + public void setDescription(String description) { + mDescription = description; + } + public String getTitle() { return mTitle; } + public void setTitle(String title) { + mTitle = title; + } + + public boolean isFavorite() { + return mFavorite; + } + + public void setFavorite(boolean favorite) { + mFavorite = favorite; + } + public int getFileResource(Context context) { return context.getResources() .getIdentifier(mFile, "raw", context.getPackageName()); @@ -67,50 +103,9 @@ public class Song extends Row { .getIdentifier(mImage, "drawable", context.getPackageName()); } - public interface OnSongRowClickListener { - - void onSongRowClicked(Song song); - + @Override + public MultiAction[] getActions() { + return mMediaRowActions; } - public static class Presenter extends RowPresenter implements View.OnClickListener { - - private final Context mContext; - private OnSongRowClickListener mClickListener; - - - public Presenter(Context context) { - mContext = context; - setHeaderPresenter(null); - } - - public void setOnClickListener(OnSongRowClickListener listener) { - mClickListener = listener; - } - - @Override protected ViewHolder createRowViewHolder(ViewGroup parent) { - View view = LayoutInflater.from(mContext).inflate(R.layout.row_song, parent, false); - view.findViewById(R.id.rowContainer).setOnClickListener(this); - return new ViewHolder(view); - } - - @Override public boolean isUsingDefaultSelectEffect() { - return false; - } - - @Override protected void onBindRowViewHolder(ViewHolder vh, Object item) { - super.onBindRowViewHolder(vh, item); - Song song = (Song) item; - ((TextView) vh.view.findViewById(R.id.trackNumber)).setText("" + song.getNumber()); - ((TextView) vh.view.findViewById(R.id.trackDuration)).setText(song.getDuration()); - String text = song.getTitle() + " / " + song.getDescription(); - ((TextView) vh.view.findViewById(R.id.trackName)).setText(text); - vh.view.findViewById(R.id.rowContainer).setTag(item); - } - - @Override public void onClick(View v) { - if (mClickListener == null) return; - mClickListener.onSongRowClicked((Song) v.getTag()); - } - } } diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_border_white_24dp.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_border_white_24dp.xml new file mode 100644 index 000000000..03e16ad91 --- /dev/null +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_border_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_filled_24dp.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_filled_24dp.xml new file mode 100644 index 000000000..bce1999a1 --- /dev/null +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_favorite_filled_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_filled_24dp.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_filled_24dp.xml new file mode 100644 index 000000000..ac5d3f39d --- /dev/null +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_filled_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml new file mode 100644 index 000000000..4147e8128 --- /dev/null +++ b/samples/SupportLeanbackShowcase/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/row_song.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/row_song.xml deleted file mode 100644 index b8d660d50..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/row_song.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/layout/row_track_list_header.xml b/samples/SupportLeanbackShowcase/app/src/main/res/layout/row_track_list_header.xml deleted file mode 100644 index df16028fb..000000000 --- a/samples/SupportLeanbackShowcase/app/src/main/res/layout/row_track_list_header.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml index 4c0091d64..10d0973a1 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/colors.xml @@ -31,6 +31,7 @@ #37474F #F0F + #FF455A64 #EEEEEE #99EEEEEE @@ -41,10 +42,15 @@ #04549D #0374BF #022A4E + #FF6E40 #C03800 #C03800 #263238 #0277BD #01579B + + #feab91 + #db2a0f + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml index f14506213..33981d68d 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/strings.xml @@ -46,7 +46,7 @@ Watch in standard definition on the web and supported devices Rental period: start within 30 days,\nfinish within 24 hours Enter credit card number - Exp. date + Exp Date Payment Method \'Payment Method\' clicked. Rent diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml index ca5b19ebd..4f624d8e9 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/styles.xml @@ -44,19 +44,18 @@ - - @@ -147,7 +146,7 @@ @@ -218,4 +217,55 @@ @style/IconCardInfoAreaStyle + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml b/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml index 88a43c3b7..4aa06f676 100644 --- a/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml +++ b/samples/SupportLeanbackShowcase/app/src/main/res/values/themes.xml @@ -73,4 +73,22 @@ @drawable/background_sax + + + + + +