/platforms/android/modules/maccandroid/src/main/java/com/amazon/maccandroid/model/state/MediaAppPlaybackState.java

https://github.com/alexa/aac-sdk · Java · 201 lines · 154 code · 31 blank · 16 comment · 31 complexity · 8b76c23e4f73ff9fc731f69435622cfa MD5 · raw file

  1. /*
  2. * Copyright 2017-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License").
  5. * You may not use this file except in compliance with the License.
  6. * A copy of the License is located at
  7. *
  8. * http://aws.amazon.com/apache2.0/
  9. *
  10. * or in the "license" file accompanying this file. This file is distributed
  11. * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
  12. * express or implied. See the License for the specific language governing
  13. * permissions and limitations under the License.
  14. */
  15. package com.amazon.maccandroid.model.state;
  16. import android.os.SystemClock;
  17. import android.support.v4.media.MediaMetadataCompat;
  18. import android.support.v4.media.session.PlaybackStateCompat;
  19. import com.amazon.maccandroid.MediaApp;
  20. import com.amazon.maccandroid.model.PlayBackStateFields;
  21. import com.amazon.maccandroid.model.SupportedOperations;
  22. import java.util.HashSet;
  23. import java.util.Set;
  24. public class MediaAppPlaybackState {
  25. private static final String EXTERNAL_MEDIA_PLAYER_TYPE = "ExternalMediaPlayerMusicItem";
  26. private static final String MEDIA_TYPE_TRACK = "TRACK";
  27. private static final String MEDIA_TYPE_AD = "AD";
  28. private final Set<String> mSupportedOperations;
  29. private final PlayBackStateFields.State mPlaybackState;
  30. private final long mPositionMilliseconds;
  31. private final PlayBackStateFields.shuffle mShuffleMode;
  32. private final PlayBackStateFields.repeat mRepeatMode;
  33. private final PlayBackStateFields.favorite mFavourite;
  34. private final MediaAppMetaData mMediaAppMetaData;
  35. public MediaAppPlaybackState(MediaApp app, SupportedOperations supportedOperations) {
  36. String type = EXTERNAL_MEDIA_PLAYER_TYPE;
  37. if (app.getPlayerPlaybackInfo() == null || app.getPlayerPlaybackInfo().getPlaybackState() == null) {
  38. mSupportedOperations = new HashSet<>(0);
  39. mPlaybackState = null;
  40. mPositionMilliseconds = 0;
  41. mShuffleMode = null;
  42. mRepeatMode = null;
  43. mFavourite = null;
  44. mMediaAppMetaData = new MediaAppMetaData();
  45. return;
  46. }
  47. PlaybackStateCompat playBackState = app.getPlayerPlaybackInfo().getPlaybackState();
  48. mPlaybackState = getExternalMediaPlayerState(app.getPlayerPlaybackInfo().getPlaybackState().getState());
  49. mSupportedOperations = supportedOperations.getSupportedOperations(app);
  50. mPositionMilliseconds = getPositionMilliseconds(playBackState);
  51. mShuffleMode = getShuffleEnabled(app.getPlayerPlaybackInfo().getShuffleMode());
  52. mRepeatMode = getRepeatEnabled(app.getPlayerPlaybackInfo().getRepeatMode());
  53. mFavourite = getFavorite(app.getPlayerPlaybackInfo().getMetadata());
  54. MediaMetadataCompat metadata = app.getPlayerPlaybackInfo().getMetadata();
  55. mMediaAppMetaData = metadata == null ? new MediaAppMetaData() : new MediaAppMetaData(metadata);
  56. }
  57. private PlayBackStateFields.favorite getFavorite(MediaMetadataCompat metadata) {
  58. if (metadata == null) {
  59. return null;
  60. }
  61. if (metadata.getRating(MediaMetadataCompat.METADATA_KEY_RATING) == null) {
  62. return null;
  63. }
  64. if (!metadata.getRating(MediaMetadataCompat.METADATA_KEY_RATING).isRated()) {
  65. return PlayBackStateFields.favorite.NOT_RATED;
  66. } else if (metadata.getRating(MediaMetadataCompat.METADATA_KEY_RATING).isThumbUp()) {
  67. return PlayBackStateFields.favorite.FAVORITED;
  68. } else {
  69. return PlayBackStateFields.favorite.UNFAVORITED;
  70. }
  71. }
  72. private PlayBackStateFields.repeat getRepeatEnabled(int repeatMode) {
  73. switch (repeatMode) {
  74. case PlaybackStateCompat.REPEAT_MODE_ALL:
  75. case PlaybackStateCompat.REPEAT_MODE_GROUP:
  76. return PlayBackStateFields.repeat.REPEATED;
  77. case PlaybackStateCompat.REPEAT_MODE_ONE:
  78. return PlayBackStateFields.repeat.ONE_REPEATED;
  79. case PlaybackStateCompat.REPEAT_MODE_NONE:
  80. // case PlaybackStateCompat.REPEAT_MODE_INVALID:
  81. // return PlayBackStateFields.repeat.NOT_REPEATED;
  82. }
  83. return PlayBackStateFields.repeat.NOT_REPEATED;
  84. }
  85. private PlayBackStateFields.shuffle getShuffleEnabled(int shuffleMode) {
  86. if (shuffleMode == PlaybackStateCompat.SHUFFLE_MODE_ALL
  87. || shuffleMode == PlaybackStateCompat.SHUFFLE_MODE_GROUP) {
  88. return PlayBackStateFields.shuffle.SHUFFLED;
  89. } else {
  90. return PlayBackStateFields.shuffle.NOT_SHUFFLED;
  91. }
  92. }
  93. private long getPositionMilliseconds(PlaybackStateCompat playbackState) {
  94. if (playbackState.getLastPositionUpdateTime() > 0) {
  95. return (long) (playbackState.getPosition()
  96. + playbackState.getPlaybackSpeed()
  97. * (SystemClock.elapsedRealtime() - playbackState.getLastPositionUpdateTime()));
  98. }
  99. return 0;
  100. }
  101. private PlayBackStateFields.State getExternalMediaPlayerState(int state) {
  102. switch (state) {
  103. case PlaybackStateCompat.STATE_NONE:
  104. return PlayBackStateFields.State.IDLE;
  105. case PlaybackStateCompat.STATE_PLAYING:
  106. return PlayBackStateFields.State.PLAYING;
  107. case PlaybackStateCompat.STATE_PAUSED:
  108. return PlayBackStateFields.State.PAUSED;
  109. case PlaybackStateCompat.STATE_STOPPED:
  110. return PlayBackStateFields.State.STOPPED;
  111. case PlaybackStateCompat.STATE_FAST_FORWARDING:
  112. return PlayBackStateFields.State.FAST_FORWARDING;
  113. case PlaybackStateCompat.STATE_REWINDING:
  114. return PlayBackStateFields.State.REWINDING;
  115. case PlaybackStateCompat.STATE_BUFFERING:
  116. return PlayBackStateFields.State.BUFFER_UNDERRUN;
  117. }
  118. return null;
  119. }
  120. public Set<String> getSupportedOperations() {
  121. return mSupportedOperations;
  122. }
  123. public PlayBackStateFields.State getPlaybackState() {
  124. return mPlaybackState;
  125. }
  126. public long getPositionMilliseconds() {
  127. return mPositionMilliseconds;
  128. }
  129. public PlayBackStateFields.shuffle isShuffleEnabled() {
  130. return mShuffleMode;
  131. }
  132. public PlayBackStateFields.repeat getRepeatMode() {
  133. return mRepeatMode;
  134. }
  135. public PlayBackStateFields.favorite getFavourite() {
  136. return mFavourite;
  137. }
  138. @Override
  139. public boolean equals(Object obj) {
  140. if (obj == null) {
  141. return false;
  142. }
  143. if (!MediaAppPlaybackState.class.isAssignableFrom(obj.getClass())) {
  144. return false;
  145. }
  146. final MediaAppPlaybackState otherPlayBackState = (MediaAppPlaybackState) obj;
  147. if (!mPlaybackState.equals(otherPlayBackState.mPlaybackState)) {
  148. return false;
  149. }
  150. if (!mSupportedOperations.equals(otherPlayBackState.mSupportedOperations)) {
  151. return false;
  152. }
  153. if (!(mPositionMilliseconds == otherPlayBackState.mPositionMilliseconds)) {
  154. return false;
  155. }
  156. if (!mShuffleMode.equals(otherPlayBackState.mShuffleMode)) {
  157. return false;
  158. }
  159. if (!mRepeatMode.equals(otherPlayBackState.mRepeatMode)) {
  160. return false;
  161. }
  162. if (!mFavourite.equals(otherPlayBackState.mFavourite)) {
  163. return false;
  164. }
  165. return true;
  166. }
  167. public MediaAppMetaData getMediaAppMetaData() {
  168. return mMediaAppMetaData;
  169. }
  170. }