Show the information of the media being played inside the player

This commit is contained in:
antonio 2022-03-25 22:31:55 +01:00
parent ede3bf6482
commit cbacb417ab
4 changed files with 110 additions and 40 deletions

4
.idea/misc.xml generated
View file

@ -54,6 +54,7 @@
<entry key="app/src/main/res/drawable/ic_pause.xml" value="0.28055555555555556" /> <entry key="app/src/main/res/drawable/ic_pause.xml" value="0.28055555555555556" />
<entry key="app/src/main/res/drawable/ic_pause_circle.xml" value="0.28703703703703703" /> <entry key="app/src/main/res/drawable/ic_pause_circle.xml" value="0.28703703703703703" />
<entry key="app/src/main/res/drawable/ic_pause_white_24dp.xml" value="0.18958333333333333" /> <entry key="app/src/main/res/drawable/ic_pause_white_24dp.xml" value="0.18958333333333333" />
<entry key="app/src/main/res/drawable/ic_pill.xml" value="0.1825" />
<entry key="app/src/main/res/drawable/ic_play.xml" value="0.27685185185185185" /> <entry key="app/src/main/res/drawable/ic_play.xml" value="0.27685185185185185" />
<entry key="app/src/main/res/drawable/ic_play_arrow_white_24dp.xml" value="0.28055555555555556" /> <entry key="app/src/main/res/drawable/ic_play_arrow_white_24dp.xml" value="0.28055555555555556" />
<entry key="app/src/main/res/drawable/ic_play_for_work.xml" value="0.30625" /> <entry key="app/src/main/res/drawable/ic_play_for_work.xml" value="0.30625" />
@ -80,6 +81,7 @@
<entry key="app/src/main/res/drawable/ic_speed.xml" value="0.156" /> <entry key="app/src/main/res/drawable/ic_speed.xml" value="0.156" />
<entry key="app/src/main/res/drawable/ic_star.xml" value="0.2722222222222222" /> <entry key="app/src/main/res/drawable/ic_star.xml" value="0.2722222222222222" />
<entry key="app/src/main/res/drawable/ic_toolbar_motion_on.xml" value="0.30625" /> <entry key="app/src/main/res/drawable/ic_toolbar_motion_on.xml" value="0.30625" />
<entry key="app/src/main/res/drawable/ic_transcode.xml" value="0.2275" />
<entry key="app/src/main/res/drawable/ic_unfold.xml" value="0.5484375" /> <entry key="app/src/main/res/drawable/ic_unfold.xml" value="0.5484375" />
<entry key="app/src/main/res/drawable/outline_play_circle.xml" value="0.28703703703703703" /> <entry key="app/src/main/res/drawable/outline_play_circle.xml" value="0.28703703703703703" />
<entry key="app/src/main/res/drawable/ui_empty_list.xml" value="0.28055555555555556" /> <entry key="app/src/main/res/drawable/ui_empty_list.xml" value="0.28055555555555556" />
@ -122,7 +124,7 @@
<entry key="app/src/main/res/layout/fragment_song_list_page.xml" value="0.225" /> <entry key="app/src/main/res/layout/fragment_song_list_page.xml" value="0.225" />
<entry key="app/src/main/res/layout/fragment_starred.xml" value="0.3166496424923391" /> <entry key="app/src/main/res/layout/fragment_starred.xml" value="0.3166496424923391" />
<entry key="app/src/main/res/layout/inner_fragment_player_controller.xml" value="0.3229166666666667" /> <entry key="app/src/main/res/layout/inner_fragment_player_controller.xml" value="0.3229166666666667" />
<entry key="app/src/main/res/layout/inner_fragment_player_controller_layout.xml" value="0.29030797101449274" /> <entry key="app/src/main/res/layout/inner_fragment_player_controller_layout.xml" value="0.21822916666666667" />
<entry key="app/src/main/res/layout/inner_fragment_player_cover.xml" value="0.40390879478827363" /> <entry key="app/src/main/res/layout/inner_fragment_player_cover.xml" value="0.40390879478827363" />
<entry key="app/src/main/res/layout/inner_fragment_player_lyrics.xml" value="0.3229166666666667" /> <entry key="app/src/main/res/layout/inner_fragment_player_lyrics.xml" value="0.3229166666666667" />
<entry key="app/src/main/res/layout/inner_fragment_player_queue.xml" value="0.3229166666666667" /> <entry key="app/src/main/res/layout/inner_fragment_player_queue.xml" value="0.3229166666666667" />

View file

@ -34,6 +34,7 @@ import com.cappielloantonio.play.ui.fragment.pager.PlayerControllerHorizontalPag
import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.util.MusicUtil;
import com.cappielloantonio.play.util.PreferenceUtil; import com.cappielloantonio.play.util.PreferenceUtil;
import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel; import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel;
import com.google.android.material.chip.Chip;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
@ -41,13 +42,17 @@ public class PlayerControllerFragment extends Fragment {
private static final String TAG = "PlayerCoverFragment"; private static final String TAG = "PlayerCoverFragment";
private InnerFragmentPlayerControllerBinding bind; private InnerFragmentPlayerControllerBinding bind;
private ImageView playerMoveDownBottomSheet;
private ViewPager2 playerMediaCoverViewPager; private ViewPager2 playerMediaCoverViewPager;
private ToggleButton buttonFavorite; private ToggleButton buttonFavorite;
private TextView playerMediaTitleLabel; private TextView playerMediaTitleLabel;
private TextView playerArtistNameLabel; private TextView playerArtistNameLabel;
private Button playbackSpeedButton; private Button playbackSpeedButton;
private ToggleButton skipSilenceToggleButton; private ToggleButton skipSilenceToggleButton;
private Chip playerMediaExtension;
private TextView playerMediaBitrate;
private ImageView playerMediaTranscodingIcon;
private Chip playerMediaTranscodedExtension;
private TextView playerMediaTranscodedBitrate;
private MainActivity activity; private MainActivity activity;
private PlayerBottomSheetViewModel playerBottomSheetViewModel; private PlayerBottomSheetViewModel playerBottomSheetViewModel;
@ -67,7 +72,6 @@ public class PlayerControllerFragment extends Fragment {
initMediaListenable(); initMediaListenable();
initArtistLabelButton(); initArtistLabelButton();
return view; return view;
} }
@ -92,15 +96,17 @@ public class PlayerControllerFragment extends Fragment {
@SuppressLint("UnsafeOptInUsageError") @SuppressLint("UnsafeOptInUsageError")
private void init() { private void init() {
playerMoveDownBottomSheet = bind.getRoot().findViewById(R.id.player_move_down_bottom_sheet);
playerMediaCoverViewPager = bind.getRoot().findViewById(R.id.player_media_cover_view_pager); playerMediaCoverViewPager = bind.getRoot().findViewById(R.id.player_media_cover_view_pager);
buttonFavorite = bind.getRoot().findViewById(R.id.button_favorite); buttonFavorite = bind.getRoot().findViewById(R.id.button_favorite);
playerMediaTitleLabel = bind.getRoot().findViewById(R.id.player_media_title_label); playerMediaTitleLabel = bind.getRoot().findViewById(R.id.player_media_title_label);
playerArtistNameLabel = bind.getRoot().findViewById(R.id.player_artist_name_label); playerArtistNameLabel = bind.getRoot().findViewById(R.id.player_artist_name_label);
playbackSpeedButton = bind.getRoot().findViewById(R.id.player_playback_speed_button); playbackSpeedButton = bind.getRoot().findViewById(R.id.player_playback_speed_button);
skipSilenceToggleButton = bind.getRoot().findViewById(R.id.player_skip_silence_toggle_button); skipSilenceToggleButton = bind.getRoot().findViewById(R.id.player_skip_silence_toggle_button);
playerMediaExtension = bind.getRoot().findViewById(R.id.player_media_extension);
playerMoveDownBottomSheet.setOnClickListener(view -> activity.collapseBottomSheet()); playerMediaBitrate = bind.getRoot().findViewById(R.id.player_media_bitrate);
playerMediaTranscodingIcon = bind.getRoot().findViewById(R.id.player_media_transcoding_audio);
playerMediaTranscodedExtension = bind.getRoot().findViewById(R.id.player_media_transcoded_extension);
playerMediaTranscodedBitrate = bind.getRoot().findViewById(R.id.player_media_transcoded_bitrate);
} }
@SuppressLint("UnsafeOptInUsageError") @SuppressLint("UnsafeOptInUsageError")
@ -131,12 +137,14 @@ public class PlayerControllerFragment extends Fragment {
private void setMediaControllerListener(MediaBrowser mediaBrowser) { private void setMediaControllerListener(MediaBrowser mediaBrowser) {
setMediaControllerUI(mediaBrowser); setMediaControllerUI(mediaBrowser);
setMetadata(mediaBrowser.getMediaMetadata()); setMetadata(mediaBrowser.getMediaMetadata());
setMediaInfo(mediaBrowser.getMediaMetadata());
mediaBrowser.addListener(new Player.Listener() { mediaBrowser.addListener(new Player.Listener() {
@Override @Override
public void onMediaMetadataChanged(@NonNull MediaMetadata mediaMetadata) { public void onMediaMetadataChanged(@NonNull MediaMetadata mediaMetadata) {
setMediaControllerUI(mediaBrowser); setMediaControllerUI(mediaBrowser);
setMetadata(mediaMetadata); setMetadata(mediaMetadata);
setMediaInfo(mediaMetadata);
} }
}); });
} }
@ -150,6 +158,41 @@ public class PlayerControllerFragment extends Fragment {
playerArtistNameLabel.setSelected(true); playerArtistNameLabel.setSelected(true);
} }
private void setMediaInfo(MediaMetadata mediaMetadata) {
if(mediaMetadata.extras != null) {
String extension = mediaMetadata.extras.getString("extension", "Unknown format");
String bitrate = mediaMetadata.extras.getInt("bitrate", 0) != 0 ? mediaMetadata.extras.getInt("bitrate", 0) + "kbps" : "Original";
playerMediaExtension.setText(extension);
if(bitrate.equals("Original")) {
playerMediaBitrate.setVisibility(View.GONE);
} else {
playerMediaBitrate.setVisibility(View.VISIBLE);
playerMediaBitrate.setText(bitrate);
}
}
String transcodingExtension = MusicUtil.getTranscodingFormatPreference(requireContext());
String transcodingBitrate = Integer.parseInt(MusicUtil.getBitratePreference(requireContext())) != 0 ? Integer.parseInt(MusicUtil.getBitratePreference(requireContext())) + "kbps" : "Original";
if(transcodingExtension.equals("raw") && transcodingBitrate.equals("Original")) {
playerMediaTranscodingIcon.setVisibility(View.GONE);
playerMediaTranscodedBitrate.setVisibility(View.GONE);
playerMediaTranscodedExtension.setVisibility(View.GONE);
} else {
playerMediaTranscodingIcon.setVisibility(View.VISIBLE);
playerMediaTranscodedBitrate.setVisibility(View.VISIBLE);
playerMediaTranscodedExtension.setVisibility(View.VISIBLE);
playerMediaTranscodedExtension.setText(transcodingExtension);
playerMediaTranscodedBitrate.setText(transcodingBitrate);
}
}
@SuppressLint("UnsafeOptInUsageError") @SuppressLint("UnsafeOptInUsageError")
private void setMediaControllerUI(MediaBrowser mediaBrowser) { private void setMediaControllerUI(MediaBrowser mediaBrowser) {
initPlaybackSpeedButton(mediaBrowser); initPlaybackSpeedButton(mediaBrowser);
@ -205,9 +248,7 @@ public class PlayerControllerFragment extends Fragment {
playerBottomSheetViewModel.getLiveMedia().observe(requireActivity(), media -> { playerBottomSheetViewModel.getLiveMedia().observe(requireActivity(), media -> {
if (media != null) { if (media != null) {
buttonFavorite.setChecked(media.isStarred()); buttonFavorite.setChecked(media.isStarred());
buttonFavorite.setOnClickListener(v -> playerBottomSheetViewModel.setFavorite(requireContext(), media)); buttonFavorite.setOnClickListener(v -> playerBottomSheetViewModel.setFavorite(requireContext(), media));
buttonFavorite.setOnLongClickListener(v -> { buttonFavorite.setOnLongClickListener(v -> {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putParcelable("song_object", media); bundle.putParcelable("song_object", media);

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/titleTextColor"
android:pathData="M19,4h-4L7.11,16.63 4.5,12 9,4H5L0.5,12 5,20h4l7.89,-12.63L19.5,12 15,20h4l4.5,-8L19,4z"/>
</vector>

View file

@ -5,52 +5,70 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout <LinearLayout
android:id="@+id/appbar" android:id="@+id/player_media_quality_sector"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent" android:orientation="horizontal"
android:gravity="center"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.chip.Chip
android:id="@+id/toolbar" android:id="@+id/player_media_extension"
android:layout_width="match_parent" style="@style/Widget.Material3.Chip.Suggestion"
android:layout_height="wrap_content"> android:checked="true"
android:clickable="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:chipStrokeWidth="0dp"
android:text="Unknown"/>
<LinearLayout <TextView
android:layout_width="match_parent" android:id="@+id/player_media_bitrate"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:orientation="horizontal"> android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:visibility="gone"/>
<ImageView <ImageView
android:id="@+id/player_move_down_bottom_sheet" android:id="@+id/player_media_transcoding_audio"
android:layout_width="32dp" android:layout_width="24dp"
android:layout_height="32dp" android:layout_height="20dp"
android:layout_gravity="center_vertical" android:src="@drawable/ic_transcode"
android:layout_marginEnd="8dp" android:layout_margin="12dp"
android:background="@drawable/ic_bottom_sheet_down" android:visibility="gone"/>
android:foreground="?android:attr/selectableItemBackgroundBorderless" />
<TextView <com.google.android.material.chip.Chip
style="@style/HeadlineMedium" android:id="@+id/player_media_transcoded_extension"
android:layout_width="match_parent" style="@style/Widget.Material3.Chip.Suggestion"
android:layout_height="wrap_content" android:checked="true"
android:paddingStart="8dp" android:clickable="false"
android:paddingEnd="8dp" android:layout_width="wrap_content"
android:text="@string/player_bottom_sheet_title" /> android:layout_height="wrap_content"
</LinearLayout> app:chipStrokeWidth="0dp"
</com.google.android.material.appbar.MaterialToolbar> android:text="Unknown"
</com.google.android.material.appbar.AppBarLayout> android:visibility="gone"/>
<TextView
android:id="@+id/player_media_transcoded_bitrate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:visibility="gone"/>
</LinearLayout>
<androidx.viewpager2.widget.ViewPager2 <androidx.viewpager2.widget.ViewPager2
android:id="@+id/player_media_cover_view_pager" android:id="@+id/player_media_cover_view_pager"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginTop="4dp"
app:layout_constraintBottom_toTopOf="@id/guideline" app:layout_constraintBottom_toTopOf="@id/guideline"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/appbar" /> app:layout_constraintTop_toBottomOf="@+id/player_media_quality_sector" />
<androidx.constraintlayout.widget.Guideline <androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline" android:id="@+id/guideline"
@ -255,8 +273,8 @@
<ImageButton <ImageButton
android:id="@id/exo_play_pause" android:id="@id/exo_play_pause"
style="@style/ExoStyledControls.Button.Center.PlayPause" style="@style/ExoStyledControls.Button.Center.PlayPause"
android:layout_width="70dp" android:layout_width="80dp"
android:layout_height="70dp" android:layout_height="80dp"
android:layout_marginTop="12dp" android:layout_marginTop="12dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"