Skip to content

Commit aef481f

Browse files
committed
Add support for RatingCompat
Replaces the "thumbs up"/"thumbs down" actions with a fully fledged rating control that supports the various kinds of RatingCompats, e.g. Stars, Thumbs, 3/4/5-stars, and percentages. Also adds support for displaying the current rating in the same control by selectively tinting the icons.
1 parent a245b11 commit aef481f

File tree

8 files changed

+570
-34
lines changed

8 files changed

+570
-34
lines changed

mediacontroller/src/main/java/com/example/android/mediacontroller/Action.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -162,17 +162,6 @@ public static List createActions(@NonNull final Context context) {
162162
controller.getTransportControls().skipToPrevious());
163163
actions.add(action);
164164

165-
action = new Action(R.id.action_thumbs_up, context.getString(R.string.action_thumbs_up));
166-
action.setMediaControllerAction((controller, id, extras) ->
167-
controller.getTransportControls().setRating(RatingCompat.newThumbRating(true)));
168-
actions.add(action);
169-
170-
action = new Action(R.id.action_thumbs_down,
171-
context.getString(R.string.action_thumbs_down));
172-
action.setMediaControllerAction((controller, id, extras) ->
173-
controller.getTransportControls().setRating(RatingCompat.newThumbRating(false)));
174-
actions.add(action);
175-
176165
action = new Action(R.id.action_skip_30s_backward,
177166
context.getString(R.string.action_skip_30s_backward));
178167
action.setMediaControllerAction((controller, id, extras) -> {

mediacontroller/src/main/java/com/example/android/mediacontroller/MediaAppControllerActivity.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import android.support.v4.graphics.drawable.DrawableCompat;
3939
import android.support.v4.media.MediaBrowserServiceCompat;
4040
import android.support.v4.media.MediaMetadataCompat;
41+
import android.support.v4.media.RatingCompat;
4142
import android.support.v4.media.session.MediaControllerCompat;
4243
import android.support.v4.media.session.MediaSessionCompat;
4344
import android.support.v4.media.session.PlaybackStateCompat;
@@ -122,6 +123,7 @@ public class MediaAppControllerActivity extends AppCompatActivity {
122123
private MediaAppDetails mMediaAppDetails;
123124
private MediaControllerCompat mController;
124125
private AudioFocusHelper mAudioFocusHelper;
126+
private RatingUiHelper mRatingUiHelper;
125127
private CustomControlsAdapter mCustomControlsAdapter = new CustomControlsAdapter();
126128

127129
private Spinner mInputTypeView;
@@ -136,6 +138,8 @@ public class MediaAppControllerActivity extends AppCompatActivity {
136138
private ModeHelper mShuffleToggle;
137139
private ModeHelper mRepeatToggle;
138140

141+
private ViewGroup mRatingViewGroup;
142+
139143
private final SparseArray<ImageButton> mActionButtonMap = new SparseArray<>();
140144

141145
/**
@@ -171,6 +175,8 @@ protected void onCreate(Bundle savedInstanceState) {
171175
mShuffleToggle = new ShuffleModeHelper();
172176
mRepeatToggle = new RepeatModeHelper();
173177

178+
mRatingViewGroup = findViewById(R.id.rating);
179+
174180
if (savedInstanceState != null) {
175181
mMediaAppDetails = savedInstanceState.getParcelable(STATE_APP_DETAILS_KEY);
176182
mUriInput.setText(savedInstanceState.getString(STATE_URI_KEY));
@@ -323,6 +329,7 @@ private void setupMediaController() {
323329
try {
324330
mController = new MediaControllerCompat(this, mMediaAppDetails.sessionToken);
325331
mController.registerCallback(mCallback);
332+
mRatingUiHelper = ratingUiHelperFor(mController.getRatingType());
326333

327334
// Force update on connect.
328335
mCallback.onPlaybackStateChanged(mController.getPlaybackState());
@@ -447,9 +454,17 @@ private String fetchMediaInfo() {
447454
} else {
448455
mMediaAlbumArtView.setImageResource(R.drawable.ic_album_black_24dp);
449456
}
457+
// Prefer user rating, but fall back to global rating if available.
458+
RatingCompat rating =
459+
mediaMetadata.getRating(MediaMetadataCompat.METADATA_KEY_USER_RATING);
460+
if (rating == null) {
461+
rating = mediaMetadata.getRating(MediaMetadataCompat.METADATA_KEY_RATING);
462+
}
463+
mRatingUiHelper.setRating(rating);
450464
} else {
451465
mMediaArtistView.setText(R.string.media_info_default);
452466
mMediaAlbumArtView.setImageResource(R.drawable.ic_album_black_24dp);
467+
mRatingUiHelper.setRating(null);
453468
}
454469

455470
final long actions = playbackState.getActions();
@@ -525,6 +540,26 @@ private String playbackStateToName(final int playbackState) {
525540
}
526541
}
527542

543+
private RatingUiHelper ratingUiHelperFor(int ratingStyle) {
544+
switch (ratingStyle) {
545+
case RatingCompat.RATING_3_STARS:
546+
return new RatingUiHelper.Stars3(mRatingViewGroup, mController);
547+
case RatingCompat.RATING_4_STARS:
548+
return new RatingUiHelper.Stars4(mRatingViewGroup, mController);
549+
case RatingCompat.RATING_5_STARS:
550+
return new RatingUiHelper.Stars5(mRatingViewGroup, mController);
551+
case RatingCompat.RATING_HEART:
552+
return new RatingUiHelper.Heart(mRatingViewGroup, mController);
553+
case RatingCompat.RATING_THUMB_UP_DOWN:
554+
return new RatingUiHelper.Thumbs(mRatingViewGroup, mController);
555+
case RatingCompat.RATING_PERCENTAGE:
556+
return new RatingUiHelper.Percentage(mRatingViewGroup, mController);
557+
case RatingCompat.RATING_NONE:
558+
default:
559+
return new RatingUiHelper.None(mRatingViewGroup, mController);
560+
}
561+
}
562+
528563
private void addMediaInfo(Map<String, String> mediaInfos, String key, String value) {
529564
if (!TextUtils.isEmpty(value)) {
530565
mediaInfos.put(key, value);

0 commit comments

Comments
 (0)