diff --git a/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/fragments/PlaylistFragment.java b/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/fragments/PlaylistFragment.java index 3b8b7c8c446a236981dd5b5986fd51346fc5e307..60e0bffe4e4201cade608d97a20e6912519689a7 100644 --- a/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/fragments/PlaylistFragment.java +++ b/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/fragments/PlaylistFragment.java @@ -1,29 +1,181 @@ package com.magnatune.eyecreate.companionformagnatune.fragments; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.design.widget.FloatingActionButton; import android.support.v4.app.Fragment; +import android.support.v4.content.LocalBroadcastManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; import android.widget.ListView; +import android.widget.ProgressBar; import com.magnatune.eyecreate.companionformagnatune.R; +import com.magnatune.eyecreate.companionformagnatune.service.PlayerService; import com.magnatune.eyecreate.companionformagnatune.service.Playlist; public class PlaylistFragment extends Fragment { ListView playlistUI; + ProgressBar position; + FloatingActionButton playPause; + ImageButton prev; + ImageButton next; Playlist playlist; + //TODO:implement BRs + BroadcastReceiver receivePlaylist = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + } + }; + + BroadcastReceiver playCalled = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + } + }; + + BroadcastReceiver pauseCalled = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + } + }; + + BroadcastReceiver playStarted = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + } + }; + + BroadcastReceiver nextCalled = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + } + }; + + BroadcastReceiver prevCalled = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + } + }; + + BroadcastReceiver trackQueued = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + } + }; + + BroadcastReceiver trackDequeued = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + } + }; + + BroadcastReceiver playlistCleared = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + + } + }; + @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_playlist, container, false); playlistUI = (ListView) v.findViewById(R.id.list); - //TODO:finish getting UI set up. + position = (ProgressBar) v.findViewById(R.id.player_pos); + playPause = (FloatingActionButton) v.findViewById(R.id.play_pause); + prev = (ImageButton) v.findViewById(R.id.prev); + next = (ImageButton) v.findViewById(R.id.next); + //set up click events + playPause.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent playPause = new Intent(getActivity(),PlayerService.class); + if(playlist.isPaused()) { + playPause.setAction(PlayerService.ACTION_TRACK_PLAY); + } else { + playPause.setAction(PlayerService.ACTION_TRACK_PAUSE); + } + getActivity().startService(playPause); + } + }); + prev.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent prev = new Intent(getActivity(),PlayerService.class); + prev.setAction(PlayerService.ACTION_TRACK_PREV); + getActivity().startService(prev); + } + }); + next.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(isLastSong()) { + playlist.setPaused(true); + //TODO:have play button go back to paused state + } + Intent next = new Intent(getActivity(),PlayerService.class); + next.setAction(PlayerService.ACTION_TRACK_NEXT); + getActivity().startService(next); + } + }); return v; } + @Override + public void onPause() { + super.onPause(); + //Deregister BRs to prevent calling when no longer visible. + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(receivePlaylist); + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(playCalled); + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(pauseCalled); + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(playStarted); + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(nextCalled); + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(prevCalled); + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(trackQueued); + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(trackDequeued); + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(playlistCleared); + } + + @Override + public void onResume() { + super.onResume(); + //Register BRs to act upon service calls. + LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receivePlaylist, new IntentFilter(PlayerService.ACTION_TRACK_LIST)); + LocalBroadcastManager.getInstance(getActivity()).registerReceiver(playCalled, new IntentFilter(PlayerService.ACTION_TRACK_PLAY)); + LocalBroadcastManager.getInstance(getActivity()).registerReceiver(pauseCalled, new IntentFilter(PlayerService.ACTION_TRACK_PAUSE)); + LocalBroadcastManager.getInstance(getActivity()).registerReceiver(playStarted, new IntentFilter(PlayerService.ACTION_PLAYING_STARTED)); + LocalBroadcastManager.getInstance(getActivity()).registerReceiver(nextCalled, new IntentFilter(PlayerService.ACTION_TRACK_NEXT)); + LocalBroadcastManager.getInstance(getActivity()).registerReceiver(prevCalled, new IntentFilter(PlayerService.ACTION_TRACK_PREV)); + LocalBroadcastManager.getInstance(getActivity()).registerReceiver(trackQueued, new IntentFilter(PlayerService.ACTION_TRACK_QUEUE)); + LocalBroadcastManager.getInstance(getActivity()).registerReceiver(trackDequeued, new IntentFilter(PlayerService.ACTION_TRACK_DEQUEUE)); + LocalBroadcastManager.getInstance(getActivity()).registerReceiver(playlistCleared, new IntentFilter(PlayerService.ACTION_PLAYLIST_CLEAR)); + //Request playlist from service to set up/sync rest of control data. + Intent getPlaylist = new Intent(getActivity(),PlayerService.class); + getPlaylist.setAction(PlayerService.ACTION_TRACK_LIST); + getActivity().startService(getPlaylist); + } + + private boolean isLastSong() { + //TODO:implement + return false; + } + //TODO:put in functions for buttons to send to player service and try to keep updated to it's state. } diff --git a/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/service/PlayerService.java b/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/service/PlayerService.java index d1a2c45de37eb561ec997ae114a001aaf85a77c8..f4faebc4268476d0d078ce19f6f3619a4c68f806 100644 --- a/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/service/PlayerService.java +++ b/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/service/PlayerService.java @@ -92,6 +92,7 @@ public class PlayerService extends Service implements MediaPlayer.OnPreparedList @Override public void onCreate() { super.onCreate(); + Log.d(getClass().getSimpleName(),"service started."); db = MagnatuneDBManager.getAlbumDB(); player = new MediaPlayer(); player.setOnPreparedListener(this); @@ -109,6 +110,7 @@ public class PlayerService extends Service implements MediaPlayer.OnPreparedList @Override public void onDestroy() { super.onDestroy(); + Log.d(getClass().getSimpleName(),"service stopped."); currentPlaylist.clearPlaylist(); LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(ACTION_PLAYLIST_CLEAR)); NotificationManagerCompat.from(this).cancel(notificationId); @@ -199,6 +201,7 @@ public class PlayerService extends Service implements MediaPlayer.OnPreparedList if(intent.hasExtra(EXTRA_TRACK_PLAYLIST_POSITION) && currentPlaylist.getPlaylistIds().size()>intent.getIntExtra(EXTRA_TRACK_PLAYLIST_POSITION,-1)) { Track nextTrack = db.where(Track.class).equalTo("isrc", currentPlaylist.getPlaylistIds().get(currentPlaylist.getPlaylistIds().indexOf(intent.getIntExtra(EXTRA_TRACK_PLAYLIST_POSITION, -1)))).findFirst(); playThisTrack(nextTrack); + currentPlaylist.setPaused(false); session.setPlaybackState(new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_PLAYING,player.getCurrentPosition(),0) .setActions(PlaybackStateCompat.ACTION_PAUSE|PlaybackStateCompat.ACTION_SKIP_TO_NEXT|PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) @@ -209,6 +212,7 @@ public class PlayerService extends Service implements MediaPlayer.OnPreparedList //Do nothing as currently loading or stopped. } else { player.start(); + currentPlaylist.setPaused(false); session.setPlaybackState(new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_PLAYING,player.getCurrentPosition(),0) .setActions(PlaybackStateCompat.ACTION_PAUSE|PlaybackStateCompat.ACTION_SKIP_TO_NEXT|PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) @@ -220,6 +224,7 @@ public class PlayerService extends Service implements MediaPlayer.OnPreparedList } else if(intent.getAction().equals(ACTION_TRACK_PAUSE)) { if(player.isPlaying()) { player.pause(); + currentPlaylist.setPaused(true); session.setPlaybackState(new PlaybackStateCompat.Builder() .setState(PlaybackStateCompat.STATE_PAUSED,player.getCurrentPosition(),0) .setActions(PlaybackStateCompat.ACTION_PLAY|PlaybackStateCompat.ACTION_SKIP_TO_NEXT|PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS) @@ -246,6 +251,7 @@ public class PlayerService extends Service implements MediaPlayer.OnPreparedList } } else if(intent.getAction().equals(ACTION_PLAYLIST_CLEAR)) { player.reset(); + currentPlaylist.setPaused(true); mediaPrepared = false; currentPlaylist.clearPlaylist(); currentPlaylist.setCurrentPositionMill(0); diff --git a/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/service/Playlist.java b/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/service/Playlist.java index d1a519c44debd975e8e824309d8c0ac363fcbb64..8b780b2617e430c3b8d5952e43aca52f596938ae 100644 --- a/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/service/Playlist.java +++ b/app/src/main/java/com/magnatune/eyecreate/companionformagnatune/service/Playlist.java @@ -10,6 +10,7 @@ public class Playlist implements Parcelable { private ArrayList<String> playlistIds; private String currentlyPlayingId; private int currentPositionMill; + private boolean paused = true; public Playlist() { playlistIds = new ArrayList<>(); @@ -19,6 +20,7 @@ public class Playlist implements Parcelable { in.readStringList(getPlaylistIds()); setCurrentlyPlayingId(in.readString()); setCurrentPositionMill(in.readInt()); + setPaused(in.readInt()==0?false:true); } public static final Creator<Playlist> CREATOR = new Creator<Playlist>() { @@ -43,6 +45,7 @@ public class Playlist implements Parcelable { parcel.writeStringList(getPlaylistIds()); parcel.writeString(getCurrentlyPlayingId()); parcel.writeInt(getCurrentPositionMill()); + parcel.writeInt(isPaused()?1:0); } public ArrayList<String> getPlaylistIds() { @@ -76,4 +79,12 @@ public class Playlist implements Parcelable { public void setCurrentPositionMill(int currentPositionMill) { this.currentPositionMill = currentPositionMill; } + + public boolean isPaused() { + return paused; + } + + public void setPaused(boolean paused) { + this.paused = paused; + } } diff --git a/app/src/main/res/layout/fragment_playlist.xml b/app/src/main/res/layout/fragment_playlist.xml index 1c88a2523c9a9bff21e0caee862fdb642414fcf5..d09fd74daa86ece447fe333237117d22343e4363 100644 --- a/app/src/main/res/layout/fragment_playlist.xml +++ b/app/src/main/res/layout/fragment_playlist.xml @@ -1,10 +1,47 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" android:layout_width="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:orientation="vertical" + android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_weight="1" android:id="@+id/list"/> - <!-- TODO:put in media controls here --> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + <ProgressBar + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:clickable="false" + android:id="@+id/player_pos"/> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:orientation="horizontal"> + <ImageButton + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@android:drawable/ic_media_previous" + android:id="@+id/prev"/> + <android.support.design.widget.FloatingActionButton + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="5dp" + android:elevation="10dp" + app:pressedTranslationZ="10dp" + android:clickable="true" + android:src="@android:drawable/ic_media_play" + android:id="@+id/play_pause"/> + <ImageButton + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@android:drawable/ic_media_next" + android:id="@+id/next"/> + </LinearLayout> + </LinearLayout> </LinearLayout> \ No newline at end of file