diff --git a/.idea/misc.xml b/.idea/misc.xml
index 7e49d62c..09b7204d 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -18,6 +18,8 @@
+
+
@@ -35,16 +37,22 @@
+
+
+
+
+
+
@@ -91,7 +99,7 @@
-
+
diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerControllerFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerControllerFragment.java
index 2a4fe540..cee73671 100644
--- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerControllerFragment.java
+++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerControllerFragment.java
@@ -22,17 +22,27 @@ import androidx.media3.session.SessionToken;
import androidx.navigation.fragment.NavHostFragment;
import androidx.viewpager2.widget.ViewPager2;
+import com.cappielloantonio.play.App;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.databinding.InnerFragmentPlayerControllerBinding;
+import com.cappielloantonio.play.interfaces.MediaCallback;
+import com.cappielloantonio.play.model.Song;
+import com.cappielloantonio.play.repository.SongRepository;
+import com.cappielloantonio.play.service.MediaManager;
import com.cappielloantonio.play.service.MediaService;
import com.cappielloantonio.play.ui.activity.MainActivity;
+import com.cappielloantonio.play.ui.dialog.PlaylistChooserDialog;
import com.cappielloantonio.play.ui.dialog.RatingDialog;
import com.cappielloantonio.play.ui.fragment.pager.PlayerControllerHorizontalPager;
+import com.cappielloantonio.play.util.DownloadUtil;
+import com.cappielloantonio.play.util.MappingUtil;
import com.cappielloantonio.play.util.MusicUtil;
import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
+import java.util.List;
+
public class PlayerControllerFragment extends Fragment {
private static final String TAG = "PlayerCoverFragment";
@@ -43,6 +53,10 @@ public class PlayerControllerFragment extends Fragment {
private ToggleButton buttonFavorite;
private TextView playerSongTitleLabel;
private TextView playerArtistNameLabel;
+ private ImageButton buttonDownload;
+ private ImageButton buttonAddToPlaylist;
+ private ImageButton buttonStartMix;
+ private ImageButton buttonLyrics;
private MainActivity activity;
private PlayerBottomSheetViewModel playerBottomSheetViewModel;
@@ -61,6 +75,7 @@ public class PlayerControllerFragment extends Fragment {
initCoverLyricsSlideView();
initMediaListenable();
initArtistLabelButton();
+ initButtonRow();
return view;
}
@@ -94,6 +109,11 @@ public class PlayerControllerFragment extends Fragment {
playerSongTitleLabel = bind.getRoot().findViewById(R.id.player_song_title_label);
playerArtistNameLabel = bind.getRoot().findViewById(R.id.player_artist_name_label);
+ buttonDownload = bind.getRoot().findViewById(R.id.button_download);
+ buttonAddToPlaylist = bind.getRoot().findViewById(R.id.button_playlist);
+ buttonStartMix = bind.getRoot().findViewById(R.id.button_mix);
+ buttonLyrics = bind.getRoot().findViewById(R.id.button_lyrics);
+
playerMoveDownBottomSheet.setOnClickListener(view -> activity.collapseBottomSheet());
}
@@ -190,6 +210,47 @@ public class PlayerControllerFragment extends Fragment {
});
}
+ private void initButtonRow() {
+ playerBottomSheetViewModel.getLiveSong().observe(requireActivity(), song -> {
+ if (song != null) {
+ buttonDownload.setOnClickListener(view -> DownloadUtil
+ .getDownloadTracker(requireContext())
+ .download(
+ MappingUtil.mapMediaItem(requireContext(), song, false),
+ MappingUtil.mapDownload(song, null, null)
+ ));
+
+ buttonAddToPlaylist.setOnClickListener(view -> {
+ Bundle bundle = new Bundle();
+ bundle.putParcelable("song_object", song);
+
+ PlaylistChooserDialog dialog = new PlaylistChooserDialog();
+ dialog.setArguments(bundle);
+ dialog.show(requireActivity().getSupportFragmentManager(), null);
+ });
+
+ buttonStartMix.setOnClickListener(view -> {
+ MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), song);
+
+ SongRepository songRepository = new SongRepository(App.getInstance());
+ songRepository.getInstantMix(song, 20, new MediaCallback() {
+ @Override
+ public void onError(Exception exception) {
+ Log.e(TAG, "onError() " + exception.getMessage());
+ }
+
+ @Override
+ public void onLoadMedia(List> media) {
+ MediaManager.enqueue(mediaBrowserListenableFuture, requireContext(), (List) media, true);
+ }
+ });
+ });
+ }
+ });
+
+ buttonLyrics.setOnClickListener(view -> playerSongCoverViewPager.setCurrentItem(1, true));
+ }
+
public void goBackToFirstPage() {
playerSongCoverViewPager.setCurrentItem(0, false);
}
diff --git a/app/src/main/res/drawable/ic_lyrics.xml b/app/src/main/res/drawable/ic_lyrics.xml
new file mode 100644
index 00000000..cac983a6
--- /dev/null
+++ b/app/src/main/res/drawable/ic_lyrics.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_mix_from_here.xml b/app/src/main/res/drawable/ic_mix_from_here.xml
new file mode 100644
index 00000000..8c351abe
--- /dev/null
+++ b/app/src/main/res/drawable/ic_mix_from_here.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_playlist_add.xml b/app/src/main/res/drawable/ic_playlist_add.xml
new file mode 100644
index 00000000..25c22a79
--- /dev/null
+++ b/app/src/main/res/drawable/ic_playlist_add.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_queue_music.xml b/app/src/main/res/drawable/ic_queue_music.xml
new file mode 100644
index 00000000..88e9249c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_queue_music.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/layout/inner_fragment_player_controller_layout.xml b/app/src/main/res/layout/inner_fragment_player_controller_layout.xml
index 73c558c6..f1f654df 100644
--- a/app/src/main/res/layout/inner_fragment_player_controller_layout.xml
+++ b/app/src/main/res/layout/inner_fragment_player_controller_layout.xml
@@ -52,11 +52,18 @@
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="12dp"
- app:layout_constraintBottom_toTopOf="@id/player_song_title_label"
+ app:layout_constraintBottom_toTopOf="@id/guideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appbar" />
+
+
+ app:layout_constraintStart_toEndOf="@+id/button_rating"
+ app:layout_constraintTop_toBottomOf="@+id/guideline" />
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/player_song_title_label" />
+ app:layout_constraintTop_toBottomOf="@+id/exo_progress" />
+ app:layout_constraintTop_toBottomOf="@+id/exo_progress" />
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/exo_duration" />
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/exo_duration" />
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/exo_duration" />
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/inner_fragment_player_queue.xml b/app/src/main/res/layout/inner_fragment_player_queue.xml
index 9e8a0cc0..e78dd308 100644
--- a/app/src/main/res/layout/inner_fragment_player_queue.xml
+++ b/app/src/main/res/layout/inner_fragment_player_queue.xml
@@ -8,7 +8,7 @@
android:layout_height="match_parent"
android:clipToPadding="false"
android:orientation="vertical"
- android:paddingTop="12dp"
+ android:paddingTop="4dp"
android:paddingBottom="@dimen/global_padding_bottom" />
\ No newline at end of file