From bc4d7251b098c989f733b9658f91cb6bc0323d6f Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Mon, 10 Jan 2022 12:40:09 +0100 Subject: [PATCH] Added overlay controllers in CoverFragment --- .../play/ui/fragment/PlayerCoverFragment.java | 85 +++++++++++++- .../layout/inner_fragment_player_cover.xml | 106 +++++++++++++++++- 2 files changed, 187 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerCoverFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerCoverFragment.java index b56061bd..af254068 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerCoverFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlayerCoverFragment.java @@ -3,6 +3,9 @@ package com.cappielloantonio.play.ui.fragment; import android.annotation.SuppressLint; import android.content.ComponentName; import android.os.Bundle; +import android.transition.Fade; +import android.transition.Transition; +import android.transition.TransitionManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -10,28 +13,48 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; import androidx.media3.common.MediaMetadata; import androidx.media3.common.Player; import androidx.media3.session.MediaBrowser; import androidx.media3.session.SessionToken; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.databinding.InnerFragmentPlayerCoverBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; +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.dialog.PlaylistChooserDialog; +import com.cappielloantonio.play.util.DownloadUtil; +import com.cappielloantonio.play.util.MappingUtil; +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 PlayerCoverFragment extends Fragment { private static final String TAG = "PlayerCoverFragment"; + private PlayerBottomSheetViewModel playerBottomSheetViewModel; private InnerFragmentPlayerCoverBinding bind; private ListenableFuture mediaBrowserListenableFuture; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { bind = InnerFragmentPlayerCoverBinding.inflate(inflater, container, false); - return bind.getRoot(); + View view = bind.getRoot(); + + playerBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(PlayerBottomSheetViewModel.class); + + initOverlay(); + initInnerButton(); + + return view; } @Override @@ -39,6 +62,7 @@ public class PlayerCoverFragment extends Fragment { super.onStart(); initializeBrowser(); bindMediaController(); + toggleOverlayVisibility(false); } @Override @@ -53,6 +77,64 @@ public class PlayerCoverFragment extends Fragment { bind = null; } + private void initOverlay() { + bind.nowPlayingSongCoverImageView.setOnClickListener(view -> toggleOverlayVisibility(true)); + bind.nowPlayingSongCoverButtonGroup.setOnClickListener(view -> toggleOverlayVisibility(false)); + } + + private void toggleOverlayVisibility(boolean isVisible) { + Transition transition = new Fade(); + transition.setDuration(200); + transition.addTarget(bind.nowPlayingSongCoverButtonGroup); + + TransitionManager.beginDelayedTransition(bind.getRoot(), transition); + bind.nowPlayingSongCoverButtonGroup.setVisibility(isVisible ? View.VISIBLE : View.GONE); + } + + private void initInnerButton() { + playerBottomSheetViewModel.getLiveSong().observe(requireActivity(), song -> { + if (song != null && bind != null) { + bind.innerButtonTopLeft.setOnClickListener(view -> { + DownloadUtil.getDownloadTracker(requireContext()).download( + MappingUtil.mapMediaItem(requireContext(), song, false), + MappingUtil.mapDownload(song, null, null) + ); + }); + + bind.innerButtonTopRight.setOnClickListener(view -> { + Bundle bundle = new Bundle(); + bundle.putParcelable("song_object", song); + + PlaylistChooserDialog dialog = new PlaylistChooserDialog(); + dialog.setArguments(bundle); + dialog.show(requireActivity().getSupportFragmentManager(), null); + } + ); + + bind.innerButtonBottomLeft.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); + } + }); + }); + + bind.innerButtonBottomRight.setOnClickListener(view -> { + + }); + } + }); + } + @SuppressLint("UnsafeOptInUsageError") private void initializeBrowser() { mediaBrowserListenableFuture = new MediaBrowser.Builder(requireContext(), new SessionToken(requireContext(), new ComponentName(requireContext(), MediaService.class))).buildAsync(); @@ -82,6 +164,7 @@ public class PlayerCoverFragment extends Fragment { @Override public void onMediaMetadataChanged(@NonNull MediaMetadata mediaMetadata) { setCover(mediaMetadata); + toggleOverlayVisibility(false); } }); } diff --git a/app/src/main/res/layout/inner_fragment_player_cover.xml b/app/src/main/res/layout/inner_fragment_player_cover.xml index e0bf3ebe..f12836e2 100644 --- a/app/src/main/res/layout/inner_fragment_player_cover.xml +++ b/app/src/main/res/layout/inner_fragment_player_cover.xml @@ -1,6 +1,106 @@ - \ No newline at end of file + android:paddingEnd="24dp"> + + + + + +