package com.devbrackets.android.exomediademo.service; import android.app.PendingIntent; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.bumptech.glide.Glide; import com.bumptech.glide.RequestManager; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; import com.devbrackets.android.exomedia.AudioPlayer; import com.devbrackets.android.exomedia.ui.widget.VideoControls; import com.devbrackets.android.exomedia.ui.widget.VideoView; import com.devbrackets.android.exomediademo.App; import com.devbrackets.android.exomediademo.R; import com.devbrackets.android.exomediademo.data.MediaItem; import com.devbrackets.android.exomediademo.manager.PlaylistManager; import com.devbrackets.android.exomediademo.playlist.AudioApi; import com.devbrackets.android.exomediademo.playlist.VideoApi; import com.devbrackets.android.exomediademo.ui.activity.StartupActivity; import com.devbrackets.android.playlistcore.api.AudioPlayerApi; import com.devbrackets.android.playlistcore.service.BasePlaylistService; /** * A simple service that extends {@link BasePlaylistService} in order to provide * the application specific information required. */ public class MediaService extends BasePlaylistService<MediaItem, PlaylistManager> { private static final int NOTIFICATION_ID = 1564; //Arbitrary private static final int FOREGROUND_REQUEST_CODE = 332; //Arbitrary private static final float AUDIO_DUCK_VOLUME = 0.1f; private Bitmap defaultLargeNotificationImage; private Bitmap largeNotificationImage; private Bitmap lockScreenArtwork; private NotificationTarget notificationImageTarget = new NotificationTarget(); private LockScreenTarget lockScreenImageTarget = new LockScreenTarget(); private RequestManager glide; @Override public void onCreate() { super.onCreate(); glide = Glide.with(getApplicationContext()); } @Override protected void performOnMediaCompletion() { performNext(); immediatelyPause = false; } @NonNull @Override protected AudioPlayerApi getNewAudioPlayer() { return new AudioApi(new AudioPlayer(getApplicationContext())); } @Override protected int getNotificationId() { return NOTIFICATION_ID; } @Override protected float getAudioDuckVolume() { return AUDIO_DUCK_VOLUME; } @NonNull @Override protected PlaylistManager getPlaylistManager() { return App.getPlaylistManager(); } @NonNull @Override protected PendingIntent getNotificationClickPendingIntent() { Intent intent = new Intent(getApplicationContext(), StartupActivity.class); return PendingIntent.getActivity(getApplicationContext(), FOREGROUND_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); } @Override protected Bitmap getDefaultLargeNotificationImage() { if (defaultLargeNotificationImage == null) { defaultLargeNotificationImage = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); } return defaultLargeNotificationImage; } @Nullable @Override protected Bitmap getDefaultLargeNotificationSecondaryImage() { return null; } @Override protected int getNotificationIconRes() { return R.mipmap.ic_launcher; } @Override protected int getRemoteViewIconRes() { return R.mipmap.ic_launcher; } @Override protected void updateLargeNotificationImage(int size, MediaItem playlistItem) { glide.load(playlistItem.getThumbnailUrl()).asBitmap().into(notificationImageTarget); } @Override protected void updateRemoteViewArtwork(MediaItem playlistItem) { glide.load(playlistItem.getArtworkUrl()).asBitmap().into(lockScreenImageTarget); } @Nullable @Override protected Bitmap getRemoteViewArtwork() { return lockScreenArtwork; } @Nullable @Override protected Bitmap getLargeNotificationImage() { return largeNotificationImage; } /** * Overridden to allow updating the Title, SubTitle, and description in * the VideoView (VideoControls) */ @Override protected boolean playVideoItem() { if (super.playVideoItem()) { updateVideoControls(); return true; } return false; } /** * Helper method used to verify we can access the {@link VideoView#getVideoControls()} * to update both the text and available next/previous buttons */ private void updateVideoControls() { VideoApi videoApi = (VideoApi) getPlaylistManager().getVideoPlayer(); if (videoApi == null) { return; } VideoView videoView = videoApi.getVideoView(); if (videoView == null) { return; } VideoControls videoControls = videoView.getVideoControls(); if (videoControls != null) { updateVideoControlsText(videoControls); updateVideoControlsButtons(videoControls); } } private void updateVideoControlsText(@NonNull VideoControls videoControls) { if (currentPlaylistItem != null) { videoControls.setTitle(currentPlaylistItem.getTitle()); videoControls.setSubTitle(currentPlaylistItem.getAlbum()); videoControls.setDescription(currentPlaylistItem.getArtist()); } } private void updateVideoControlsButtons(@NonNull VideoControls videoControls) { videoControls.setPreviousButtonEnabled(getPlaylistManager().isPreviousAvailable()); videoControls.setNextButtonEnabled(getPlaylistManager().isNextAvailable()); } /** * A class used to listen to the loading of the large notification images and perform * the correct functionality to update the notification once it is loaded. * <p> * <b>NOTE:</b> This is a Glide Image loader class */ private class NotificationTarget extends SimpleTarget<Bitmap> { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { largeNotificationImage = resource; onLargeNotificationImageUpdated(); } } /** * A class used to listen to the loading of the large lock screen images and perform * the correct functionality to update the artwork once it is loaded. * <p> * <b>NOTE:</b> This is a Glide Image loader class */ private class LockScreenTarget extends SimpleTarget<Bitmap> { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { lockScreenArtwork = resource; onRemoteViewArtworkUpdated(); } } }