start view binding migration

This commit is contained in:
dkanada 2020-08-09 04:38:17 +09:00
commit cea025e20c
5 changed files with 79 additions and 112 deletions

View file

@ -29,6 +29,10 @@ android {
} }
} }
buildFeatures {
viewBinding = true
}
lintOptions { lintOptions {
disable 'MissingTranslation' disable 'MissingTranslation'
abortOnError false abortOnError false

View file

@ -11,6 +11,7 @@ import android.widget.ImageView;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.dkanada.gramophone.R; import com.dkanada.gramophone.R;
import com.dkanada.gramophone.databinding.FragmentAlbumCoverBinding;
import com.dkanada.gramophone.glide.CustomGlideRequest; import com.dkanada.gramophone.glide.CustomGlideRequest;
import com.dkanada.gramophone.glide.CustomPaletteTarget; import com.dkanada.gramophone.glide.CustomPaletteTarget;
import com.dkanada.gramophone.misc.CustomFragmentStatePagerAdapter; import com.dkanada.gramophone.misc.CustomFragmentStatePagerAdapter;
@ -71,10 +72,7 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter {
public static class AlbumCoverFragment extends Fragment { public static class AlbumCoverFragment extends Fragment {
private static final String SONG_ARG = "song"; private static final String SONG_ARG = "song";
private Unbinder unbinder; private FragmentAlbumCoverBinding binding;
@BindView(R.id.player_image)
ImageView albumCover;
private boolean isColorReady; private boolean isColorReady;
private int color; private int color;
@ -98,9 +96,9 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter {
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_album_cover, container, false); binding = FragmentAlbumCoverBinding.inflate(inflater);
unbinder = ButterKnife.bind(this, view);
return view; return binding.getRoot();
} }
@Override @Override
@ -112,7 +110,6 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter {
@Override @Override
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();
unbinder.unbind();
colorReceiver = null; colorReceiver = null;
} }
@ -120,7 +117,7 @@ public class AlbumCoverPagerAdapter extends CustomFragmentStatePagerAdapter {
CustomGlideRequest.Builder CustomGlideRequest.Builder
.from(Glide.with(getContext()), song.primary) .from(Glide.with(getContext()), song.primary)
.generatePalette(getActivity()).build() .generatePalette(getActivity()).build()
.into(new CustomPaletteTarget(albumCover) { .into(new CustomPaletteTarget(binding.playerImage) {
@Override @Override
public void onColorReady(int color) { public void onColorReady(int color) {
setColor(color); setColor(color);

View file

@ -11,45 +11,35 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator; import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator; import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
import com.dkanada.gramophone.R;
import com.dkanada.gramophone.adapter.AlbumCoverPagerAdapter; import com.dkanada.gramophone.adapter.AlbumCoverPagerAdapter;
import com.dkanada.gramophone.databinding.FragmentPlayerAlbumCoverBinding;
import com.dkanada.gramophone.helper.MusicPlayerRemote; import com.dkanada.gramophone.helper.MusicPlayerRemote;
import com.dkanada.gramophone.misc.SimpleAnimatorListener; import com.dkanada.gramophone.misc.SimpleAnimatorListener;
import com.dkanada.gramophone.ui.fragments.AbsMusicServiceFragment; import com.dkanada.gramophone.ui.fragments.AbsMusicServiceFragment;
import com.dkanada.gramophone.util.ViewUtil; import com.dkanada.gramophone.util.ViewUtil;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements ViewPager.OnPageChangeListener { public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements ViewPager.OnPageChangeListener {
public static final int VISIBILITY_ANIM_DURATION = 300; public static final int VISIBILITY_ANIM_DURATION = 300;
private Unbinder unbinder; FragmentPlayerAlbumCoverBinding binding;
@BindView(R.id.player_album_cover_viewpager)
ViewPager viewPager;
@BindView(R.id.player_favorite_icon)
ImageView favoriteIcon;
private Callbacks callbacks; private Callbacks callbacks;
private int currentPosition; private int currentPosition;
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_player_album_cover, container, false); binding = FragmentPlayerAlbumCoverBinding.inflate(inflater);
unbinder = ButterKnife.bind(this, view);
return view; return binding.getRoot();
} }
@Override @Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
viewPager.addOnPageChangeListener(this); binding.playerAlbumCoverViewPager.addOnPageChangeListener(this);
viewPager.setOnTouchListener(new View.OnTouchListener() { binding.playerAlbumCoverViewPager.setOnTouchListener(new View.OnTouchListener() {
GestureDetector gestureDetector = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() { GestureDetector gestureDetector = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() {
@Override @Override
public boolean onSingleTapConfirmed(MotionEvent e) { public boolean onSingleTapConfirmed(MotionEvent e) {
@ -71,8 +61,8 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements
@Override @Override
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();
viewPager.removeOnPageChangeListener(this);
unbinder.unbind(); binding.playerAlbumCoverViewPager.removeOnPageChangeListener(this);
} }
@Override @Override
@ -82,7 +72,7 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements
@Override @Override
public void onPlayMetadataChanged() { public void onPlayMetadataChanged() {
viewPager.setCurrentItem(MusicPlayerRemote.getPosition()); binding.playerAlbumCoverViewPager.setCurrentItem(MusicPlayerRemote.getPosition());
} }
@Override @Override
@ -91,8 +81,8 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements
} }
private void updatePlayingQueue() { private void updatePlayingQueue() {
viewPager.setAdapter(new AlbumCoverPagerAdapter(getFragmentManager(), MusicPlayerRemote.getPlayingQueue())); binding.playerAlbumCoverViewPager.setAdapter(new AlbumCoverPagerAdapter(getFragmentManager(), MusicPlayerRemote.getPlayingQueue()));
viewPager.setCurrentItem(MusicPlayerRemote.getPosition()); binding.playerAlbumCoverViewPager.setCurrentItem(MusicPlayerRemote.getPosition());
onPageSelected(MusicPlayerRemote.getPosition()); onPageSelected(MusicPlayerRemote.getPosition());
} }
@ -103,7 +93,7 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements
@Override @Override
public void onPageSelected(int position) { public void onPageSelected(int position) {
currentPosition = position; currentPosition = position;
((AlbumCoverPagerAdapter) viewPager.getAdapter()).receiveColor(colorReceiver, position); ((AlbumCoverPagerAdapter) binding.playerAlbumCoverViewPager.getAdapter()).receiveColor(colorReceiver, position);
if (position != MusicPlayerRemote.getPosition()) { if (position != MusicPlayerRemote.getPosition()) {
MusicPlayerRemote.playSongAt(position); MusicPlayerRemote.playSongAt(position);
} }
@ -123,16 +113,16 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements
} }
public void showHeartAnimation() { public void showHeartAnimation() {
favoriteIcon.clearAnimation(); binding.playerFavoriteIcon.clearAnimation();
favoriteIcon.setAlpha(0f); binding.playerFavoriteIcon.setAlpha(0f);
favoriteIcon.setScaleX(0f); binding.playerFavoriteIcon.setScaleX(0f);
favoriteIcon.setScaleY(0f); binding.playerFavoriteIcon.setScaleY(0f);
favoriteIcon.setVisibility(View.VISIBLE); binding.playerFavoriteIcon.setVisibility(View.VISIBLE);
favoriteIcon.setPivotX(favoriteIcon.getWidth() / 2); binding.playerFavoriteIcon.setPivotX(binding.playerFavoriteIcon.getWidth() / 2);
favoriteIcon.setPivotY(favoriteIcon.getHeight() / 2); binding.playerFavoriteIcon.setPivotY(binding.playerFavoriteIcon.getHeight() / 2);
favoriteIcon.animate() binding.playerFavoriteIcon.animate()
.setDuration(ViewUtil.PHONOGRAPH_ANIM_TIME / 2) .setDuration(ViewUtil.PHONOGRAPH_ANIM_TIME / 2)
.setInterpolator(new DecelerateInterpolator()) .setInterpolator(new DecelerateInterpolator())
.scaleX(1f) .scaleX(1f)
@ -141,10 +131,10 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements
.setListener(new SimpleAnimatorListener() { .setListener(new SimpleAnimatorListener() {
@Override @Override
public void onAnimationCancel(Animator animation) { public void onAnimationCancel(Animator animation) {
favoriteIcon.setVisibility(View.INVISIBLE); binding.playerFavoriteIcon.setVisibility(View.INVISIBLE);
} }
}) })
.withEndAction(() -> favoriteIcon.animate() .withEndAction(() -> binding.playerFavoriteIcon.animate()
.setDuration(ViewUtil.PHONOGRAPH_ANIM_TIME / 2) .setDuration(ViewUtil.PHONOGRAPH_ANIM_TIME / 2)
.setInterpolator(new AccelerateInterpolator()) .setInterpolator(new AccelerateInterpolator())
.scaleX(0f) .scaleX(0f)

View file

@ -12,10 +12,9 @@ import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.TextView;
import com.dkanada.gramophone.databinding.FragmentFlatPlayerPlaybackControlsBinding;
import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.appthemehelper.util.MaterialValueHelper;
import com.dkanada.gramophone.R; import com.dkanada.gramophone.R;
import com.dkanada.gramophone.helper.MusicPlayerRemote; import com.dkanada.gramophone.helper.MusicPlayerRemote;
@ -30,31 +29,8 @@ import com.dkanada.gramophone.views.PlayPauseDrawable;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
public class FlatPlayerPlaybackControlsFragment extends AbsMusicServiceFragment implements MusicProgressViewUpdateHelper.Callback { public class FlatPlayerPlaybackControlsFragment extends AbsMusicServiceFragment implements MusicProgressViewUpdateHelper.Callback {
FragmentFlatPlayerPlaybackControlsBinding binding;
private Unbinder unbinder;
@BindView(R.id.player_play_pause__button)
ImageButton playPauseButton;
@BindView(R.id.player_prev_button)
ImageButton prevButton;
@BindView(R.id.player_next_button)
ImageButton nextButton;
@BindView(R.id.player_repeat_button)
ImageButton repeatButton;
@BindView(R.id.player_shuffle_button)
ImageButton shuffleButton;
@BindView(R.id.player_progress_slider)
SeekBar progressSlider;
@BindView(R.id.player_song_total_time)
TextView songTotalTime;
@BindView(R.id.player_song_current_progress)
TextView songCurrentProgress;
private PlayPauseDrawable playPauseDrawable; private PlayPauseDrawable playPauseDrawable;
@ -75,13 +51,14 @@ public class FlatPlayerPlaybackControlsFragment extends AbsMusicServiceFragment
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_flat_player_playback_controls, container, false); binding = FragmentFlatPlayerPlaybackControlsBinding.inflate(inflater);
return binding.getRoot();
} }
@Override @Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
unbinder = ButterKnife.bind(this, view);
setUpMusicControllers(); setUpMusicControllers();
updateProgressTextColor(); updateProgressTextColor();
} }
@ -89,7 +66,6 @@ public class FlatPlayerPlaybackControlsFragment extends AbsMusicServiceFragment
@Override @Override
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();
unbinder.unbind();
} }
@Override @Override
@ -144,13 +120,13 @@ public class FlatPlayerPlaybackControlsFragment extends AbsMusicServiceFragment
private void setUpPlayPauseButton() { private void setUpPlayPauseButton() {
playPauseDrawable = new PlayPauseDrawable(getActivity()); playPauseDrawable = new PlayPauseDrawable(getActivity());
playPauseButton.setImageDrawable(playPauseDrawable); binding.playerPlayPauseButton.setImageDrawable(playPauseDrawable);
updatePlayPauseColor(); updatePlayPauseColor();
playPauseButton.setOnClickListener(new PlayPauseButtonOnClickHandler()); binding.playerPlayPauseButton.setOnClickListener(new PlayPauseButtonOnClickHandler());
playPauseButton.post(() -> { binding.playerPlayPauseButton.post(() -> {
if (playPauseButton != null) { if (binding.playerPlayPauseButton != null) {
playPauseButton.setPivotX(playPauseButton.getWidth() / 2); binding.playerPlayPauseButton.setPivotX(binding.playerPlayPauseButton.getWidth() / 2);
playPauseButton.setPivotY(playPauseButton.getHeight() / 2); binding.playerPlayPauseButton.setPivotY(binding.playerPlayPauseButton.getHeight() / 2);
} }
}); });
} }
@ -173,57 +149,57 @@ public class FlatPlayerPlaybackControlsFragment extends AbsMusicServiceFragment
private void setUpPrevNext() { private void setUpPrevNext() {
updatePrevNextColor(); updatePrevNextColor();
nextButton.setOnClickListener(v -> MusicPlayerRemote.playNextSong()); binding.playerNextButton.setOnClickListener(v -> MusicPlayerRemote.playNextSong());
prevButton.setOnClickListener(v -> MusicPlayerRemote.back()); binding.playerPrevButton.setOnClickListener(v -> MusicPlayerRemote.back());
} }
private void updateProgressTextColor() { private void updateProgressTextColor() {
int color = MaterialValueHelper.getPrimaryTextColor(getContext(), false); int color = MaterialValueHelper.getPrimaryTextColor(getContext(), false);
songTotalTime.setTextColor(color); binding.playerSongTotalTime.setTextColor(color);
songCurrentProgress.setTextColor(color); binding.playerSongCurrentProgress.setTextColor(color);
} }
private void updatePrevNextColor() { private void updatePrevNextColor() {
nextButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); binding.playerNextButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN);
prevButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); binding.playerPrevButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN);
} }
private void updatePlayPauseColor() { private void updatePlayPauseColor() {
playPauseButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); binding.playerPlayPauseButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN);
} }
private void setUpShuffleButton() { private void setUpShuffleButton() {
shuffleButton.setOnClickListener(v -> MusicPlayerRemote.toggleShuffleMode()); binding.playerShuffleButton.setOnClickListener(v -> MusicPlayerRemote.toggleShuffleMode());
} }
private void updateShuffleState() { private void updateShuffleState() {
switch (MusicPlayerRemote.getShuffleMode()) { switch (MusicPlayerRemote.getShuffleMode()) {
case MusicService.SHUFFLE_MODE_SHUFFLE: case MusicService.SHUFFLE_MODE_SHUFFLE:
shuffleButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); binding.playerShuffleButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN);
break; break;
default: default:
shuffleButton.setColorFilter(lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN); binding.playerShuffleButton.setColorFilter(lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN);
break; break;
} }
} }
private void setUpRepeatButton() { private void setUpRepeatButton() {
repeatButton.setOnClickListener(v -> MusicPlayerRemote.cycleRepeatMode()); binding.playerRepeatButton.setOnClickListener(v -> MusicPlayerRemote.cycleRepeatMode());
} }
private void updateRepeatState() { private void updateRepeatState() {
switch (MusicPlayerRemote.getRepeatMode()) { switch (MusicPlayerRemote.getRepeatMode()) {
case MusicService.REPEAT_MODE_NONE: case MusicService.REPEAT_MODE_NONE:
repeatButton.setImageResource(R.drawable.ic_repeat_white_24dp); binding.playerRepeatButton.setImageResource(R.drawable.ic_repeat_white_24dp);
repeatButton.setColorFilter(lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN); binding.playerRepeatButton.setColorFilter(lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN);
break; break;
case MusicService.REPEAT_MODE_ALL: case MusicService.REPEAT_MODE_ALL:
repeatButton.setImageResource(R.drawable.ic_repeat_white_24dp); binding.playerRepeatButton.setImageResource(R.drawable.ic_repeat_white_24dp);
repeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); binding.playerRepeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN);
break; break;
case MusicService.REPEAT_MODE_THIS: case MusicService.REPEAT_MODE_THIS:
repeatButton.setImageResource(R.drawable.ic_repeat_one_white_24dp); binding.playerRepeatButton.setImageResource(R.drawable.ic_repeat_one_white_24dp);
repeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN); binding.playerRepeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN);
break; break;
} }
} }
@ -236,11 +212,11 @@ public class FlatPlayerPlaybackControlsFragment extends AbsMusicServiceFragment
LinkedList<Animator> animators = new LinkedList<>(); LinkedList<Animator> animators = new LinkedList<>();
addAnimation(animators, playPauseButton, interpolator, duration, 0); addAnimation(animators, binding.playerPlayPauseButton, interpolator, duration, 0);
addAnimation(animators, nextButton, interpolator, duration, 100); addAnimation(animators, binding.playerNextButton, interpolator, duration, 100);
addAnimation(animators, prevButton, interpolator, duration, 100); addAnimation(animators, binding.playerPrevButton, interpolator, duration, 100);
addAnimation(animators, shuffleButton, interpolator, duration, 200); addAnimation(animators, binding.playerShuffleButton, interpolator, duration, 200);
addAnimation(animators, repeatButton, interpolator, duration, 200); addAnimation(animators, binding.playerRepeatButton, interpolator, duration, 200);
musicControllerAnimationSet = new AnimatorSet(); musicControllerAnimationSet = new AnimatorSet();
musicControllerAnimationSet.playTogether(animators); musicControllerAnimationSet.playTogether(animators);
@ -257,11 +233,11 @@ public class FlatPlayerPlaybackControlsFragment extends AbsMusicServiceFragment
if (musicControllerAnimationSet != null) { if (musicControllerAnimationSet != null) {
musicControllerAnimationSet.cancel(); musicControllerAnimationSet.cancel();
} }
prepareForAnimation(playPauseButton); prepareForAnimation(binding.playerPlayPauseButton);
prepareForAnimation(nextButton); prepareForAnimation(binding.playerNextButton);
prepareForAnimation(prevButton); prepareForAnimation(binding.playerPrevButton);
prepareForAnimation(shuffleButton); prepareForAnimation(binding.playerShuffleButton);
prepareForAnimation(repeatButton); prepareForAnimation(binding.playerRepeatButton);
hidden = true; hidden = true;
} }
@ -289,10 +265,10 @@ public class FlatPlayerPlaybackControlsFragment extends AbsMusicServiceFragment
private void setUpProgressSlider() { private void setUpProgressSlider() {
int color = MaterialValueHelper.getPrimaryTextColor(getContext(), false); int color = MaterialValueHelper.getPrimaryTextColor(getContext(), false);
progressSlider.getThumb().mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN); binding.playerProgressSlider.getThumb().mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
progressSlider.getProgressDrawable().mutate().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_IN); binding.playerProgressSlider.getProgressDrawable().mutate().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.SRC_IN);
progressSlider.setOnSeekBarChangeListener(new SimpleOnSeekbarChangeListener() { binding.playerProgressSlider.setOnSeekBarChangeListener(new SimpleOnSeekbarChangeListener() {
@Override @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) { if (fromUser) {
@ -305,9 +281,9 @@ public class FlatPlayerPlaybackControlsFragment extends AbsMusicServiceFragment
@Override @Override
public void onUpdateProgressViews(int progress, int total) { public void onUpdateProgressViews(int progress, int total) {
progressSlider.setMax(total); binding.playerProgressSlider.setMax(total);
progressSlider.setProgress(progress); binding.playerProgressSlider.setProgress(progress);
songTotalTime.setText(MusicUtil.getReadableDurationString(total)); binding.playerSongTotalTime.setText(MusicUtil.getReadableDurationString(total));
songCurrentProgress.setText(MusicUtil.getReadableDurationString(progress)); binding.playerSongCurrentProgress.setText(MusicUtil.getReadableDurationString(progress));
} }
} }

View file

@ -6,7 +6,7 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.viewpager.widget.ViewPager <androidx.viewpager.widget.ViewPager
android:id="@+id/player_album_cover_viewpager" android:id="@+id/player_album_cover_view_pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent" />