diff --git a/app/build.gradle b/app/build.gradle index b313c862..445fc394 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -79,7 +79,7 @@ dependencies { implementation "com.github.woltapp:blurhash:f41a23cc50" // Exoplayer - implementation 'com.google.android.exoplayer:exoplayer:2.11.4' + implementation 'com.google.android.exoplayer:exoplayer:2.12.2' annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' annotationProcessor "androidx.room:room-compiler:2.2.5" diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/PlayerNowPlayingSongAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/PlayerNowPlayingSongAdapter.java index 6407cc8c..6270837f 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/PlayerNowPlayingSongAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/PlayerNowPlayingSongAdapter.java @@ -5,12 +5,14 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; +import android.widget.Toast; import androidx.recyclerview.widget.RecyclerView; import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.glide.CustomGlideRequest; +import com.cappielloantonio.play.helper.MusicPlayerRemote; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.SongRepository; @@ -66,6 +68,14 @@ public class PlayerNowPlayingSongAdapter extends RecyclerView.Adapter mConnectionMap = new WeakHashMap<>(); @@ -143,22 +145,13 @@ public class MusicPlayerRemote { } public static void openQueue(final List queue, final int startPosition, final boolean startPlaying) { + Log.d(TAG, "MusicPlayerRemote - openQueue: S " + queue.size() + " P " + startPosition + " SP " + startPlaying); + if (!tryToHandleOpenPlayingQueue(queue, startPosition, startPlaying) && musicService != null) { musicService.openQueue(queue, startPosition, startPlaying); } } - public static void openAndShuffleQueue(final List queue, boolean startPlaying) { - int startPosition = 0; - if (!queue.isEmpty()) { - startPosition = new Random().nextInt(queue.size()); - } - - if (!tryToHandleOpenPlayingQueue(queue, startPosition, startPlaying) && musicService != null) { - openQueue(queue, startPosition, startPlaying); - } - } - private static boolean tryToHandleOpenPlayingQueue(final List queue, final int startPosition, final boolean startPlaying) { if (getPlayingQueue() == queue) { if (startPlaying) { @@ -173,10 +166,6 @@ public class MusicPlayerRemote { return false; } - public static Song getCurrentSong() { - return musicService.getCurrentSong(); - } - public static int getPosition() { if (musicService != null) { return musicService.getPosition(); @@ -209,14 +198,6 @@ public class MusicPlayerRemote { return -1; } - public static long getQueueDurationMillis(int position) { - if (musicService != null) { - return musicService.getQueueDurationMillis(position); - } - - return -1; - } - public static int seekTo(int millis) { if (musicService != null) { return musicService.seek(millis); @@ -225,23 +206,6 @@ public class MusicPlayerRemote { return -1; } - public static int getRepeatMode() { - if (musicService != null) { - return musicService.getRepeatMode(); - } - - return MusicService.REPEAT_MODE_NONE; - } - - public static boolean cycleRepeatMode() { - if (musicService != null) { - musicService.cycleRepeatMode(); - return true; - } - - return false; - } - public static boolean playNext(Song song) { if (musicService != null) { if (getPlayingQueue().size() > 0) { diff --git a/app/src/main/java/com/cappielloantonio/play/service/MultiPlayer.java b/app/src/main/java/com/cappielloantonio/play/service/MultiPlayer.java index 3e20b29a..68445f86 100644 --- a/app/src/main/java/com/cappielloantonio/play/service/MultiPlayer.java +++ b/app/src/main/java/com/cappielloantonio/play/service/MultiPlayer.java @@ -68,8 +68,8 @@ public class MultiPlayer implements Playback { } @Override - public void onLoadingChanged(boolean isLoading) { - Log.i(TAG, "onLoadingChanged: " + isLoading); + public void onIsLoadingChanged(boolean isLoadingChanged) { + Log.i(TAG, "onIsLoadingChanged: " + isLoadingChanged); } @Override @@ -93,6 +93,11 @@ public class MultiPlayer implements Playback { } } + @Override + public void onPlaybackStateChanged(int state) { + + } + @Override public void onPositionDiscontinuity(int reason) { Log.i(TAG, "onPositionDiscontinuity: " + reason); diff --git a/app/src/main/java/com/cappielloantonio/play/service/MusicService.java b/app/src/main/java/com/cappielloantonio/play/service/MusicService.java index fb151a99..72d21167 100644 --- a/app/src/main/java/com/cappielloantonio/play/service/MusicService.java +++ b/app/src/main/java/com/cappielloantonio/play/service/MusicService.java @@ -69,8 +69,6 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks public static final String META_CHANGED = PACKAGE_NAME + ".meta.changed"; public static final String QUEUE_CHANGED = PACKAGE_NAME + ".queue.changed"; - public static final String REPEAT_MODE_CHANGED = PACKAGE_NAME + ".repeat.changed"; - public static final int TRACK_STARTED = 9; public static final int TRACK_CHANGED = 1; public static final int TRACK_ENDED = 2; @@ -83,11 +81,6 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks public static final int DUCK = 7; public static final int UNDUCK = 8; - public static final int REPEAT_MODE_NONE = 0; - public static final int REPEAT_MODE_ALL = 1; - public static final int REPEAT_MODE_THIS = 2; - - public static final int SAVE_QUEUE = 0; public static final int LOAD_QUEUE = 9; private final IBinder musicBinder = new MusicBinder(); @@ -101,8 +94,6 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks private int position = -1; private int nextPosition = -1; - private int repeatMode; - private boolean notHandledMetaChangedForCurrentTrack; private boolean queuesRestored; private boolean pausedByTransientLossOfFocus; @@ -113,7 +104,6 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks private PowerManager.WakeLock wakeLock; private PlaybackHandler playerHandler; - private Handler uiThreadHandler; private ThrottledSeekHandler throttledSeekHandler; private QueueHandler queueHandler; private ProgressHandler progressHandler; @@ -170,7 +160,6 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks queueHandler = new QueueHandler(this, queueHandlerThread.getLooper()); throttledSeekHandler = new ThrottledSeekHandler(playerHandler); - uiThreadHandler = new Handler(); registerReceiver(becomingNoisyReceiver, new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)); @@ -323,16 +312,13 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks case LOAD_QUEUE: service.restoreQueuesAndPositionIfNecessary(); break; - case SAVE_QUEUE: - service.saveQueue(); - break; } } } - private void saveQueue() { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew(playingQueue); + public void saveState() { + savePosition(); + saveProgress(); } private void savePosition() { @@ -343,19 +329,7 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks PreferenceManager.getDefaultSharedPreferences(this).edit().putInt(PreferenceUtil.PROGRESS, getSongProgressMillis()).apply(); } - public void saveState() { - queueHandler.removeMessages(SAVE_QUEUE); - queueHandler.sendEmptyMessage(SAVE_QUEUE); - - savePosition(); - saveProgress(); - } - private void restoreState() { - repeatMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(PreferenceUtil.REPEAT, 0); - - notifyChange(REPEAT_MODE_CHANGED); - queueHandler.removeMessages(LOAD_QUEUE); queueHandler.sendEmptyMessage(LOAD_QUEUE); } @@ -464,7 +438,7 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks } public void updateNotification() { - if (playingNotification != null && getCurrentSong().getId() != null) { + if (playingNotification != null && getCurrentSong() != null) { playingNotification.update(); } } @@ -481,7 +455,7 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks private void updateMediaSessionMetadata() { final Song song = getCurrentSong(); - if (song.getId() == null) { + if (song == null) { mediaSession.setMetadata(null); return; } @@ -499,10 +473,6 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks metaData.putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, getPlayingQueue().size()); } - public void runOnUiThread(Runnable runnable) { - uiThreadHandler.post(runnable); - } - public Song getCurrentSong() { return getSongAt(getPosition()); } @@ -516,31 +486,7 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks } public int getNextPosition(boolean force) { - int position = getPosition() + 1; - switch (getRepeatMode()) { - case REPEAT_MODE_ALL: - if (isLastTrack()) { - position = 0; - } - break; - case REPEAT_MODE_THIS: - if (force) { - if (isLastTrack()) { - position = 0; - } - } else { - position -= 1; - } - break; - default: - case REPEAT_MODE_NONE: - if (isLastTrack()) { - position -= 1; - } - break; - } - - return position; + return getPosition() + 1; } private boolean isLastTrack() { @@ -551,31 +497,15 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks return playingQueue; } - public int getRepeatMode() { - return repeatMode; - } - - public void setRepeatMode(final int repeatMode) { - switch (repeatMode) { - case REPEAT_MODE_NONE: - case REPEAT_MODE_ALL: - case REPEAT_MODE_THIS: - this.repeatMode = repeatMode; - PreferenceManager.getDefaultSharedPreferences(this).edit() - .putInt(PreferenceUtil.REPEAT, repeatMode) - .apply(); - prepareNext(); - notifyChange(REPEAT_MODE_CHANGED); - break; - } - } - public void openQueue(@Nullable final List playingQueue, final int startPosition, final boolean startPlaying) { if (playingQueue != null && !playingQueue.isEmpty() && startPosition >= 0 && startPosition < playingQueue.size()) { + this.playingQueue = playingQueue; + this.position = startPosition; + if (startPlaying) { - playSongAt(startPosition); + playSongAt(position); } else { - setPosition(startPosition); + setPosition(position); } notifyChange(QUEUE_CHANGED); @@ -709,31 +639,7 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks } public int getPreviousPosition(boolean force) { - int newPosition = getPosition() - 1; - switch (repeatMode) { - case REPEAT_MODE_ALL: - if (newPosition < 0) { - newPosition = getPlayingQueue().size() - 1; - } - break; - case REPEAT_MODE_THIS: - if (force) { - if (newPosition < 0) { - newPosition = getPlayingQueue().size() - 1; - } - } else { - newPosition = getPosition(); - } - break; - default: - case REPEAT_MODE_NONE: - if (newPosition < 0) { - newPosition = 0; - } - break; - } - - return newPosition; + return getPosition() - 1; } public int getSongProgressMillis() { @@ -761,20 +667,6 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks } } - public void cycleRepeatMode() { - switch (getRepeatMode()) { - case REPEAT_MODE_NONE: - setRepeatMode(REPEAT_MODE_ALL); - break; - case REPEAT_MODE_ALL: - setRepeatMode(REPEAT_MODE_THIS); - break; - default: - setRepeatMode(REPEAT_MODE_NONE); - break; - } - } - private void notifyChange(@NonNull final String what) { handleChangeInternal(what); sendChangeInternal(what); @@ -821,10 +713,6 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks } } - public void acquireWakeLock(long milli) { - wakeLock.acquire(milli); - } - @Override public void onTrackStarted() { progressHandler.sendEmptyMessage(TRACK_STARTED); @@ -837,8 +725,6 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks public void onTrackWentToNext() { playerHandler.sendEmptyMessage(TRACK_CHANGED); progressHandler.sendEmptyMessage(TRACK_CHANGED); - - acquireWakeLock(30000); } @Override @@ -895,20 +781,14 @@ public class MusicService extends Service implements Playback.PlaybackCallbacks break; case TRACK_CHANGED: - if (service.getRepeatMode() == REPEAT_MODE_NONE && service.isLastTrack()) { - service.pause(); - service.seek(0); - service.notifyChange(STATE_CHANGED); - } else { - service.position = service.nextPosition; - service.prepareNextImpl(); - service.notifyChange(META_CHANGED); - } + service.position = service.nextPosition; + service.prepareNextImpl(); + service.notifyChange(META_CHANGED); break; case TRACK_ENDED: // if there is a timer finished, don't continue - if (service.pendingQuit || service.getRepeatMode() == REPEAT_MODE_NONE && service.isLastTrack()) { + if (service.pendingQuit && service.isLastTrack()) { service.notifyChange(STATE_CHANGED); service.seek(0); if (service.pendingQuit) { diff --git a/app/src/main/java/com/cappielloantonio/play/ui/activities/base/BaseActivity.java b/app/src/main/java/com/cappielloantonio/play/ui/activities/base/BaseActivity.java index 8a860a89..d67362fd 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/activities/base/BaseActivity.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/activities/base/BaseActivity.java @@ -151,7 +151,6 @@ public class BaseActivity extends AppCompatActivity implements EasyPermissions.P final IntentFilter filter = new IntentFilter(); filter.addAction(MusicService.STATE_CHANGED); - filter.addAction(MusicService.REPEAT_MODE_CHANGED); filter.addAction(MusicService.META_CHANGED); filter.addAction(MusicService.QUEUE_CHANGED); @@ -240,9 +239,6 @@ public class BaseActivity extends AppCompatActivity implements EasyPermissions.P case MusicService.STATE_CHANGED: activity.onPlayStateChanged(); break; - case MusicService.REPEAT_MODE_CHANGED: - activity.onRepeatModeChanged(); - break; } } } 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 f9aa9303..aa7ac452 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 @@ -6,7 +6,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ScrollView; import android.widget.SeekBar; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -154,34 +153,15 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE bind.playerHeaderLayout.playerHeaderSongArtistLabel.setText(song.getArtistName()); bind.playerBodyLayout.buttonFavorite.setChecked(song.isFavorite()); - - playSong(song); } private void setUpMusicControllers() { - setUpPlayPauseButton(); // setUpPrevNext(); // setUpRepeatButton(); // setUpShuffleButton(); initSeekBar(); } - private void setUpPlayPauseButton() { - bind.playerBodyLayout.playPauseButton.setOnClickListener(v -> { - if (MusicPlayerRemote.isPlaying()) { - MusicPlayerRemote.pauseSong(); - Toast.makeText(requireContext(), "PAUSING", Toast.LENGTH_SHORT).show(); - } else { - MusicPlayerRemote.resumePlaying(); - Toast.makeText(requireContext(), "PLAYING", Toast.LENGTH_SHORT).show(); - } - }); - } - - private void playSong(Song song) { - // Toast.makeText(activity, MusicUtil.getSongFileUri(song), Toast.LENGTH_SHORT).show(); - } - public View getPlayerHeader() { return getView().findViewById(R.id.player_header_layout); } 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 4cb60b3c..ce8af70e 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 @@ -12,6 +12,7 @@ + android:layout_height="match_parent" + android:background="?android:attr/selectableItemBackground"/> \ No newline at end of file diff --git a/app/src/main/res/layout/player_body_bottom_sheet.xml b/app/src/main/res/layout/player_body_bottom_sheet.xml index b5b6cf9e..880f039d 100644 --- a/app/src/main/res/layout/player_body_bottom_sheet.xml +++ b/app/src/main/res/layout/player_body_bottom_sheet.xml @@ -22,21 +22,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - -