From 26b8f3f65ca4508d5ca999a74d63f96daf4e1855 Mon Sep 17 00:00:00 2001 From: antonio Date: Sun, 17 Sep 2023 16:46:21 +0200 Subject: [PATCH] feat: implemented album and song sharing --- .../AlbumBottomSheetDialog.java | 21 +++++++++++++++++ .../SongBottomSheetDialog.java | 23 +++++++++++++++++-- .../viewmodel/AlbumBottomSheetViewModel.java | 8 +++++++ .../viewmodel/SongBottomSheetViewModel.java | 8 +++++++ .../res/layout/bottom_sheet_album_dialog.xml | 13 +++++++++++ .../res/layout/bottom_sheet_song_dialog.xml | 12 ++++++++++ 6 files changed, 83 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java index 8f1868fe..c3500cef 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java @@ -1,6 +1,9 @@ package com.cappielloantonio.tempo.ui.fragment.bottomsheetdialog; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.ComponentName; +import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -33,6 +36,7 @@ import com.cappielloantonio.tempo.util.DownloadUtil; import com.cappielloantonio.tempo.util.MappingUtil; import com.cappielloantonio.tempo.util.MusicUtil; import com.cappielloantonio.tempo.viewmodel.AlbumBottomSheetViewModel; +import com.cappielloantonio.tempo.viewmodel.HomeViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.common.util.concurrent.ListenableFuture; @@ -43,6 +47,7 @@ import java.util.stream.Collectors; @UnstableApi public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { + private HomeViewModel homeViewModel; private AlbumBottomSheetViewModel albumBottomSheetViewModel; private AlbumID3 album; @@ -55,6 +60,7 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements album = this.requireArguments().getParcelable(Constants.ALBUM_OBJECT); + homeViewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class); albumBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(AlbumBottomSheetViewModel.class); albumBottomSheetViewModel.setAlbum(album); @@ -182,6 +188,17 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements dismissBottomSheet(); })); + + TextView share = view.findViewById(R.id.share_text_view); + share.setOnClickListener(v -> albumBottomSheetViewModel.shareAlbum().observe(getViewLifecycleOwner(), sharedAlbum -> { + if (sharedAlbum != null) { + ClipboardManager clipboardManager = (ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = ClipData.newPlainText(getString(R.string.app_name), sharedAlbum.getUrl()); + clipboardManager.setPrimaryClip(clipData); + refreshShares(); + dismissBottomSheet(); + } + })); } @Override @@ -210,4 +227,8 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements private void releaseMediaBrowser() { MediaBrowser.releaseFuture(mediaBrowserListenableFuture); } + + private void refreshShares() { + homeViewModel.refreshShares(requireActivity()); + } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java index ccbf3ef0..de6ebbfc 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java @@ -1,6 +1,9 @@ package com.cappielloantonio.tempo.ui.fragment.bottomsheetdialog; +import android.content.ClipData; +import android.content.ClipboardManager; import android.content.ComponentName; +import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -30,14 +33,14 @@ import com.cappielloantonio.tempo.util.Constants; import com.cappielloantonio.tempo.util.DownloadUtil; import com.cappielloantonio.tempo.util.MappingUtil; import com.cappielloantonio.tempo.util.MusicUtil; +import com.cappielloantonio.tempo.viewmodel.HomeViewModel; import com.cappielloantonio.tempo.viewmodel.SongBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.common.util.concurrent.ListenableFuture; @UnstableApi public class SongBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { - private static final String TAG = "SongBottomSheetDialog"; - + private HomeViewModel homeViewModel; private SongBottomSheetViewModel songBottomSheetViewModel; private Child song; @@ -50,6 +53,7 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements song = requireArguments().getParcelable(Constants.TRACK_OBJECT); + homeViewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class); songBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(SongBottomSheetViewModel.class); songBottomSheetViewModel.setSong(song); @@ -202,6 +206,17 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements dismissBottomSheet(); })); + + TextView share = view.findViewById(R.id.share_text_view); + share.setOnClickListener(v -> songBottomSheetViewModel.shareTrack().observe(getViewLifecycleOwner(), sharedTrack -> { + if (sharedTrack != null) { + ClipboardManager clipboardManager = (ClipboardManager) requireActivity().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clipData = ClipData.newPlainText(getString(R.string.app_name), sharedTrack.getUrl()); + clipboardManager.setPrimaryClip(clipData); + refreshShares(); + dismissBottomSheet(); + } + })); } @Override @@ -229,4 +244,8 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements private void releaseMediaBrowser() { MediaBrowser.releaseFuture(mediaBrowserListenableFuture); } + + private void refreshShares() { + homeViewModel.refreshShares(requireActivity()); + } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumBottomSheetViewModel.java index 4ee072fc..afd0371a 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/AlbumBottomSheetViewModel.java @@ -11,9 +11,11 @@ import com.cappielloantonio.tempo.interfaces.StarCallback; import com.cappielloantonio.tempo.repository.AlbumRepository; import com.cappielloantonio.tempo.repository.ArtistRepository; import com.cappielloantonio.tempo.repository.FavoriteRepository; +import com.cappielloantonio.tempo.repository.SharingRepository; import com.cappielloantonio.tempo.subsonic.models.AlbumID3; import com.cappielloantonio.tempo.subsonic.models.ArtistID3; import com.cappielloantonio.tempo.subsonic.models.Child; +import com.cappielloantonio.tempo.subsonic.models.Share; import com.cappielloantonio.tempo.util.NetworkUtil; import java.util.Date; @@ -23,6 +25,7 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel { private final AlbumRepository albumRepository; private final ArtistRepository artistRepository; private final FavoriteRepository favoriteRepository; + private final SharingRepository sharingRepository; private AlbumID3 album; @@ -32,6 +35,7 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel { albumRepository = new AlbumRepository(); artistRepository = new ArtistRepository(); favoriteRepository = new FavoriteRepository(); + sharingRepository = new SharingRepository(); } public AlbumID3 getAlbum() { @@ -66,6 +70,10 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel { } } + public MutableLiveData shareAlbum() { + return sharingRepository.createShare(album.getId(), album.getName(), null); + } + private void removeFavoriteOffline() { favoriteRepository.starLater(null, album.getId(), null, false); album.setStarred(null); diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongBottomSheetViewModel.java index 1930ec97..0919b7ea 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/SongBottomSheetViewModel.java @@ -15,10 +15,12 @@ import com.cappielloantonio.tempo.model.Download; import com.cappielloantonio.tempo.repository.AlbumRepository; import com.cappielloantonio.tempo.repository.ArtistRepository; import com.cappielloantonio.tempo.repository.FavoriteRepository; +import com.cappielloantonio.tempo.repository.SharingRepository; import com.cappielloantonio.tempo.repository.SongRepository; import com.cappielloantonio.tempo.subsonic.models.AlbumID3; import com.cappielloantonio.tempo.subsonic.models.ArtistID3; import com.cappielloantonio.tempo.subsonic.models.Child; +import com.cappielloantonio.tempo.subsonic.models.Share; import com.cappielloantonio.tempo.util.DownloadUtil; import com.cappielloantonio.tempo.util.MappingUtil; import com.cappielloantonio.tempo.util.NetworkUtil; @@ -34,6 +36,7 @@ public class SongBottomSheetViewModel extends AndroidViewModel { private final AlbumRepository albumRepository; private final ArtistRepository artistRepository; private final FavoriteRepository favoriteRepository; + private final SharingRepository sharingRepository; private Child song; @@ -46,6 +49,7 @@ public class SongBottomSheetViewModel extends AndroidViewModel { albumRepository = new AlbumRepository(); artistRepository = new ArtistRepository(); favoriteRepository = new FavoriteRepository(); + sharingRepository = new SharingRepository(); } public Child getSong() { @@ -128,4 +132,8 @@ public class SongBottomSheetViewModel extends AndroidViewModel { return instantMix; } + + public MutableLiveData shareTrack() { + return sharingRepository.createShare(song.getId(), song.getTitle(), null); + } } diff --git a/app/src/main/res/layout/bottom_sheet_album_dialog.xml b/app/src/main/res/layout/bottom_sheet_album_dialog.xml index 5d4cb050..168ac9d7 100644 --- a/app/src/main/res/layout/bottom_sheet_album_dialog.xml +++ b/app/src/main/res/layout/bottom_sheet_album_dialog.xml @@ -172,5 +172,18 @@ android:paddingEnd="20dp" android:paddingBottom="12dp" android:text="@string/album_bottom_sheet_go_to_artist" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottom_sheet_song_dialog.xml b/app/src/main/res/layout/bottom_sheet_song_dialog.xml index 37d632cb..c8a8f976 100644 --- a/app/src/main/res/layout/bottom_sheet_song_dialog.xml +++ b/app/src/main/res/layout/bottom_sheet_song_dialog.xml @@ -195,5 +195,17 @@ android:paddingBottom="12dp" android:text="@string/song_bottom_sheet_go_to_artist" /> + \ No newline at end of file