Added play/pause toggle button and seekbar text

This commit is contained in:
CappielloAntonio 2021-04-12 12:43:34 +02:00
parent 54bc709317
commit 898f23b9a1
4 changed files with 90 additions and 14 deletions

View file

@ -23,6 +23,7 @@ import com.cappielloantonio.play.helper.MusicProgressViewUpdateHelper;
import com.cappielloantonio.play.interfaces.MusicServiceEventListener; import com.cappielloantonio.play.interfaces.MusicServiceEventListener;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.ui.activities.MainActivity;
import com.cappielloantonio.play.util.MusicUtil;
import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel; import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel;
public class PlayerBottomSheetFragment extends Fragment implements MusicServiceEventListener, MusicProgressViewUpdateHelper.Callback { public class PlayerBottomSheetFragment extends Fragment implements MusicServiceEventListener, MusicProgressViewUpdateHelper.Callback {
@ -56,6 +57,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
initQueueSlideView(); initQueueSlideView();
initQueueRecyclerView(); initQueueRecyclerView();
initFavoriteButtonClick(); initFavoriteButtonClick();
initToggleButtonSongState();
return view; return view;
} }
@ -121,6 +123,16 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
bind.playerBodyLayout.buttonFavorite.setOnClickListener(v -> playerBottomSheetViewModel.setFavorite()); bind.playerBodyLayout.buttonFavorite.setOnClickListener(v -> playerBottomSheetViewModel.setFavorite());
} }
private void initToggleButtonSongState() {
bind.playerHeaderLayout.playerHeaderButton.setOnClickListener(v -> {
if (MusicPlayerRemote.isPlaying()) {
MusicPlayerRemote.pauseSong();
} else {
MusicPlayerRemote.resumePlaying();
}
});
}
private void initSeekBar() { private void initSeekBar() {
bind.playerBodyLayout.playerBigSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { bind.playerBodyLayout.playerBigSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override @Override
@ -155,6 +167,14 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
bind.playerBodyLayout.buttonFavorite.setChecked(song.isFavorite()); bind.playerBodyLayout.buttonFavorite.setChecked(song.isFavorite());
} }
protected void updatePlayPauseState() {
if (MusicPlayerRemote.isPlaying()) {
bind.playerHeaderLayout.playerHeaderButton.setChecked(false);
} else {
bind.playerHeaderLayout.playerHeaderButton.setChecked(true);
}
}
private void setUpMusicControllers() { private void setUpMusicControllers() {
// setUpPrevNext(); // setUpPrevNext();
// setUpRepeatButton(); // setUpRepeatButton();
@ -177,7 +197,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
@Override @Override
public void onServiceConnected() { public void onServiceConnected() {
updatePlayPauseState();
} }
@Override @Override
@ -197,7 +217,7 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
@Override @Override
public void onPlayStateChanged() { public void onPlayStateChanged() {
updatePlayPauseState();
} }
@Override @Override
@ -209,5 +229,8 @@ public class PlayerBottomSheetFragment extends Fragment implements MusicServiceE
public void onUpdateProgressViews(int progress, int total) { public void onUpdateProgressViews(int progress, int total) {
bind.playerBodyLayout.playerBigSeekBar.setMax(total); bind.playerBodyLayout.playerBigSeekBar.setMax(total);
bind.playerBodyLayout.playerBigSeekBar.setProgress(progress); bind.playerBodyLayout.playerBigSeekBar.setProgress(progress);
bind.playerBodyLayout.playerBigSongTimeIn.setText(MusicUtil.getReadableDurationString(progress));
bind.playerBodyLayout.playerBigSongDuration.setText(MusicUtil.getReadableDurationString(total));
} }
} }

View file

@ -8,6 +8,8 @@ import com.cappielloantonio.play.model.Song;
import org.jellyfin.apiclient.interaction.ApiClient; import org.jellyfin.apiclient.interaction.ApiClient;
import java.util.Locale;
public class MusicUtil { public class MusicUtil {
public static String getSongFileUri(Song song) { public static String getSongFileUri(Song song) {
ApiClient apiClient = App.getApiClientInstance(App.getInstance()); ApiClient apiClient = App.getApiClientInstance(App.getInstance());
@ -51,4 +53,17 @@ public class MusicUtil {
Log.i(MusicUtil.class.getName(), "playing audio: " + builder); Log.i(MusicUtil.class.getName(), "playing audio: " + builder);
return builder.toString(); return builder.toString();
} }
public static String getReadableDurationString(long songDurationMillis) {
long minutes = (songDurationMillis / 1000) / 60;
long seconds = (songDurationMillis / 1000) % 60;
if (minutes < 60) {
return String.format(Locale.getDefault(), "%01d:%02d", minutes, seconds);
} else {
long hours = minutes / 60;
minutes = minutes % 60;
return String.format(Locale.getDefault(), "%d:%02d:%02d", hours, minutes, seconds);
}
}
} }

View file

@ -32,24 +32,58 @@
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/collapse_bottom_sheet_button" /> app:layout_constraintTop_toBottomOf="@+id/collapse_bottom_sheet_button" />
<SeekBar <LinearLayout
android:id="@+id/player_big_seek_bar" android:id="@+id/player_big_timer"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:orientation="horizontal"
android:layout_marginStart="28dp"
android:layout_marginTop="18dp"
android:layout_marginEnd="28dp"
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/player_song_cover_view_pager" /> app:layout_constraintTop_toBottomOf="@+id/player_song_cover_view_pager">
<TextView
android:id="@+id/player_big_song_time_in"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginLeft="24dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:text="@string/label_placeholder"
android:textColor="@color/titleTextColor"
android:textSize="12sp" />
<SeekBar
android:id="@+id/player_big_seek_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center"
android:paddingRight="12dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:paddingLeft="12dp"/>
<TextView
android:id="@+id/player_big_song_duration"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginRight="24dp"
android:text="@string/label_placeholder"
android:textColor="@color/titleTextColor"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout <LinearLayout
android:id="@+id/head_title_favorite_linear_layout" android:id="@+id/head_title_favorite_linear_layout"
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" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/player_big_seek_bar" app:layout_constraintTop_toBottomOf="@+id/player_big_timer"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
android:orientation="horizontal"> android:orientation="horizontal">

View file

@ -7,12 +7,16 @@
android:elevation="2dp" android:elevation="2dp"
android:background="@color/almostCardColor"> android:background="@color/almostCardColor">
<ImageView <ToggleButton
android:id="@+id/player_header_button" android:id="@+id/player_header_button"
android:layout_width="42dp" android:layout_width="38dp"
android:layout_height="42dp" android:layout_height="38dp"
android:layout_marginStart="20dp" android:layout_marginStart="20dp"
android:src="@drawable/ic_play" android:background="@drawable/button_play_pause_selector"
android:checked="true"
android:text=""
android:textOff=""
android:textOn=""
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />