diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/PlayerSongQueueAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/PlayerSongQueueAdapter.java index ded170cd..29077060 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/PlayerSongQueueAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/PlayerSongQueueAdapter.java @@ -82,7 +82,7 @@ public class PlayerSongQueueAdapter extends RecyclerView.Adapter restoredQueue = queueRepository.getSongs(); int restoredPosition = PreferenceManager.getDefaultSharedPreferences(this).getInt(PreferenceUtil.POSITION, -1); @@ -400,8 +401,8 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks return position; } - public void playNextSong(boolean force) { - playSongAt(getNextPosition(force)); + public void playNextSong() { + playSongAt(getNextPosition()); } private void openTrackAndPrepareNextAt(int position) { @@ -432,7 +433,7 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks private void prepareNextImpl() { synchronized (this) { - nextPosition = getNextPosition(false); + nextPosition = getNextPosition(); playback.queueDataSource(getSongAt(nextPosition)); } } @@ -500,8 +501,14 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks } } - public int getNextPosition(boolean force) { - return getPosition() + 1; + public int getNextPosition() { + int position = getPosition() + 1; + + if (isLastTrack()) { + position -= 1; + } + + return position; } private boolean isLastTrack() { @@ -804,9 +811,16 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks break; case TRACK_CHANGED: - service.position = service.nextPosition; - service.prepareNextImpl(); - service.notifyChange(META_CHANGED); + if (service.isLastTrack()) { + service.pause(); + service.seek(0); + service.notifyChange(STATE_CHANGED); + } else { + service.position = service.nextPosition; + service.prepareNextImpl(); + service.notifyChange(META_CHANGED); + service.notifyChange(QUEUE_CHANGED); + } break; case TRACK_ENDED: @@ -814,13 +828,14 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks if (service.pendingQuit && service.isLastTrack()) { service.notifyChange(STATE_CHANGED); service.seek(0); + if (service.pendingQuit) { service.pendingQuit = false; service.quit(); break; } } else { - service.playNextSong(false); + service.playNextSong(); } sendEmptyMessage(RELEASE_WAKELOCK); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerBottomSheetFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerBottomSheetFragment.java index f64ee893..489aca3c 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerBottomSheetFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerBottomSheetFragment.java @@ -1,6 +1,9 @@ package com.cappielloantonio.play.ui.fragment; import android.os.Bundle; +import android.os.Handler; +import android.preference.PreferenceManager; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -18,12 +21,14 @@ import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.PlayerNowPlayingSongAdapter; import com.cappielloantonio.play.adapter.PlayerSongQueueAdapter; import com.cappielloantonio.play.databinding.FragmentPlayerBottomSheetBinding; +import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.helper.MusicPlayerRemote; import com.cappielloantonio.play.helper.MusicProgressViewUpdateHelper; import com.cappielloantonio.play.interfaces.MusicServiceEventListener; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.util.MusicUtil; +import com.cappielloantonio.play.util.PreferenceUtil; import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel; public class PlayerBottomSheetFragment extends Fragment implements MusicServiceEventListener, MusicProgressViewUpdateHelper.Callback { @@ -105,9 +110,19 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE super.onPageSelected(position); Song song = playerNowPlayingSongAdapter.getItem(position); - if (song != null && song != playerBottomSheetViewModel.getSong()) setSongInfo(song); + if (song != null && song != playerBottomSheetViewModel.getSong()) { + + if (MusicPlayerRemote.isPlaying()) { + MusicPlayerRemote.playSongAt(position); + } else { + MusicPlayerRemote.setPosition(position); + MusicPlayerRemote.pauseSong(); + } + } } }); + + setViewPageDelayed(PreferenceManager.getDefaultSharedPreferences(requireContext()).getInt(PreferenceUtil.POSITION, -1)); } private void initQueueRecyclerView() { @@ -155,6 +170,19 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE }); } + private void setViewPageDelayed(int position) { + /*bind.playerBodyLayout.playerSongCoverViewPager.post(() -> { + int restoredPosition = PreferenceManager.getDefaultSharedPreferences(requireContext()).getInt(PreferenceUtil.POSITION, -1); + bind.playerBodyLayout.playerSongCoverViewPager.setCurrentItem(restoredPosition, true); + });*/ + + final Handler handler = new Handler(); + final Runnable r = () -> { + bind.playerBodyLayout.playerSongCoverViewPager.setCurrentItem(position, false); + }; + handler.postDelayed(r, 100); + } + private void setSongInfo(Song song) { playerBottomSheetViewModel.setNowPlayingSong(song); @@ -164,6 +192,11 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE bind.playerHeaderLayout.playerHeaderSongTitleLabel.setText(song.getTitle()); bind.playerHeaderLayout.playerHeaderSongArtistLabel.setText(song.getArtistName()); + CustomGlideRequest.Builder + .from(requireContext(), song.getPrimary(), song.getBlurHash(), CustomGlideRequest.PRIMARY, CustomGlideRequest.TOP_QUALITY) + .build() + .into(bind.playerHeaderLayout.playerHeaderSongCoverImage); + bind.playerBodyLayout.buttonFavorite.setChecked(song.isFavorite()); } @@ -176,9 +209,6 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE } private void setUpMusicControllers() { -// setUpPrevNext(); -// setUpRepeatButton(); -// setUpShuffleButton(); initSeekBar(); } @@ -197,6 +227,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE @Override public void onServiceConnected() { + setSongInfo(MusicPlayerRemote.getCurrentSong()); updatePlayPauseState(); } @@ -212,7 +243,8 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE @Override public void onPlayMetadataChanged() { - + setViewPageDelayed(MusicPlayerRemote.getPosition()); + setSongInfo(MusicPlayerRemote.getCurrentSong()); } @Override diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/PlayerBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/PlayerBottomSheetViewModel.java index c51e41ea..c902d21f 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/PlayerBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/PlayerBottomSheetViewModel.java @@ -38,11 +38,7 @@ public class PlayerBottomSheetViewModel extends AndroidViewModel { } public void setFavorite() { - if(song.isFavorite()) - song.setFavorite(false); - else - song.setFavorite(true); - + song.setFavorite(!song.isFavorite()); songRepository.setFavoriteStatus(song); } diff --git a/app/src/main/res/drawable/button_play_pause_selector.xml b/app/src/main/res/drawable/button_play_pause_selector.xml index b1c594a0..79b2b707 100644 --- a/app/src/main/res/drawable/button_play_pause_selector.xml +++ b/app/src/main/res/drawable/button_play_pause_selector.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 00000000..68eb36c7 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_play.xml b/app/src/main/res/drawable/ic_play.xml index 847df52c..0497fc57 100644 --- a/app/src/main/res/drawable/ic_play.xml +++ b/app/src/main/res/drawable/ic_play.xml @@ -5,5 +5,5 @@ android:viewportHeight="24"> + android:pathData="M8,5v14l11,-7z"/> diff --git a/app/src/main/res/layout/item_player_now_playing_song.xml b/app/src/main/res/layout/item_player_now_playing_song.xml index 35d42ade..cac25736 100644 --- a/app/src/main/res/layout/item_player_now_playing_song.xml +++ b/app/src/main/res/layout/item_player_now_playing_song.xml @@ -5,12 +5,12 @@ android:layout_height="match_parent" android:layout_margin="24dp" android:backgroundTint="@color/cardColor" - app:cardCornerRadius="4dp"> + app:cardCornerRadius="4dp" + android:foreground="?android:attr/selectableItemBackground"> + android:layout_height="match_parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/player_header_bottom_sheet.xml b/app/src/main/res/layout/player_header_bottom_sheet.xml index 12abc3a4..1c8340c5 100644 --- a/app/src/main/res/layout/player_header_bottom_sheet.xml +++ b/app/src/main/res/layout/player_header_bottom_sheet.xml @@ -7,33 +7,41 @@ android:elevation="2dp" android:background="@color/almostCardColor"> - + app:layout_constraintTop_toTopOf="parent"> + + + + + \ No newline at end of file