From e29b96d905c1968a43b35aa66475850b543bcd6c Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Thu, 25 Nov 2021 22:48:21 +0100 Subject: [PATCH] Add settings to pin and unpin playlist in toolbar menu --- .../play/database/AppDatabase.java | 8 ++- .../play/database/dao/PlaylistDao.java | 24 ++++++++ .../cappielloantonio/play/model/Playlist.java | 21 ++++++- .../play/repository/PlaylistRepository.java | 55 +++++++++++++++++++ .../play/ui/fragment/HomeFragment.java | 4 ++ .../ui/fragment/PlaylistPageFragment.java | 16 +++++- .../play/viewmodel/PlaylistPageViewModel.java | 14 +++++ app/src/main/res/drawable/ic_pin_in.xml | 10 ++++ app/src/main/res/drawable/ic_pin_out.xml | 9 +++ app/src/main/res/menu/playlist_page_menu.xml | 12 ++++ app/src/main/res/values/strings.xml | 2 + 11 files changed, 170 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/cappielloantonio/play/database/dao/PlaylistDao.java create mode 100644 app/src/main/res/drawable/ic_pin_in.xml create mode 100644 app/src/main/res/drawable/ic_pin_out.xml diff --git a/app/src/main/java/com/cappielloantonio/play/database/AppDatabase.java b/app/src/main/java/com/cappielloantonio/play/database/AppDatabase.java index c38ee71d..bd6acbc0 100644 --- a/app/src/main/java/com/cappielloantonio/play/database/AppDatabase.java +++ b/app/src/main/java/com/cappielloantonio/play/database/AppDatabase.java @@ -8,18 +8,20 @@ import androidx.room.Room; import androidx.room.RoomDatabase; import com.cappielloantonio.play.database.dao.DownloadDao; +import com.cappielloantonio.play.database.dao.PlaylistDao; import com.cappielloantonio.play.database.dao.QueueDao; import com.cappielloantonio.play.database.dao.RecentSearchDao; import com.cappielloantonio.play.database.dao.ServerDao; import com.cappielloantonio.play.model.Download; +import com.cappielloantonio.play.model.Playlist; import com.cappielloantonio.play.model.Queue; import com.cappielloantonio.play.model.RecentSearch; import com.cappielloantonio.play.model.Server; @SuppressLint("RestrictedApi") @Database( - version = 23, - entities = {Queue.class, Server.class, RecentSearch.class, Download.class} + version = 24, + entities = {Queue.class, Server.class, RecentSearch.class, Download.class, Playlist.class} // autoMigrations = { @AutoMigration(from = 23, to = 24) } ) public abstract class AppDatabase extends RoomDatabase { @@ -44,4 +46,6 @@ public abstract class AppDatabase extends RoomDatabase { public abstract RecentSearchDao recentSearchDao(); public abstract DownloadDao downloadDao(); + + public abstract PlaylistDao playlistDao(); } diff --git a/app/src/main/java/com/cappielloantonio/play/database/dao/PlaylistDao.java b/app/src/main/java/com/cappielloantonio/play/database/dao/PlaylistDao.java new file mode 100644 index 00000000..64b2cb1b --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/database/dao/PlaylistDao.java @@ -0,0 +1,24 @@ +package com.cappielloantonio.play.database.dao; + +import androidx.lifecycle.LiveData; +import androidx.room.Dao; +import androidx.room.Delete; +import androidx.room.Insert; +import androidx.room.OnConflictStrategy; +import androidx.room.Query; + +import com.cappielloantonio.play.model.Playlist; + +import java.util.List; + +@Dao +public interface PlaylistDao { + @Query("SELECT * FROM playlist") + LiveData> getAll(); + + @Insert(onConflict = OnConflictStrategy.REPLACE) + void insert(Playlist playlist); + + @Delete + void delete(Playlist playlist); +} \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/model/Playlist.java b/app/src/main/java/com/cappielloantonio/play/model/Playlist.java index 6613e336..042cfdfc 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Playlist.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Playlist.java @@ -4,16 +4,34 @@ import android.os.Parcel; import android.os.Parcelable; import androidx.annotation.NonNull; +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.Ignore; +import androidx.room.PrimaryKey; +@Entity(tableName = "playlist") public class Playlist implements Parcelable { public static final String ALL = "ALL"; public static final String DOWNLOADED = "DOWNLOADED"; + @NonNull + @PrimaryKey + @ColumnInfo(name = "id") private String id; + + @ColumnInfo(name = "playlist_name") private String name; + + @Ignore private String primary; + + @Ignore private String blurHash; + + @Ignore private int songCount; + + @Ignore private long duration; public Playlist(com.cappielloantonio.play.subsonic.models.Playlist playlist) { @@ -25,11 +43,12 @@ public class Playlist implements Parcelable { this.duration = playlist.getDuration(); } - public Playlist(String id, String name) { + public Playlist(@NonNull String id, String name) { this.id = id; this.name = name; } + @NonNull public String getId() { return id; } diff --git a/app/src/main/java/com/cappielloantonio/play/repository/PlaylistRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/PlaylistRepository.java index 61f41149..5035a08b 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/PlaylistRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/PlaylistRepository.java @@ -3,10 +3,15 @@ package com.cappielloantonio.play.repository; import android.app.Application; import androidx.annotation.NonNull; +import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.App; +import com.cappielloantonio.play.database.AppDatabase; +import com.cappielloantonio.play.database.dao.PlaylistDao; +import com.cappielloantonio.play.database.dao.ServerDao; import com.cappielloantonio.play.model.Playlist; +import com.cappielloantonio.play.model.Server; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; import com.cappielloantonio.play.util.MappingUtil; @@ -21,9 +26,13 @@ import retrofit2.Response; public class PlaylistRepository { private final Application application; + private final PlaylistDao playlistDao; public PlaylistRepository(Application application) { this.application = application; + + AppDatabase database = AppDatabase.getInstance(application); + this.playlistDao = database.playlistDao(); } public MutableLiveData> getPlaylists(boolean random, int size) { @@ -144,4 +153,50 @@ public class PlaylistRepository { } }); } + + public LiveData> getPinnedPlaylists() { + return playlistDao.getAll(); + } + + public void insert(Playlist playlist) { + InsertThreadSafe insert = new InsertThreadSafe(playlistDao, playlist); + Thread thread = new Thread(insert); + thread.start(); + } + + public void delete(Playlist playlist) { + DeleteThreadSafe delete = new DeleteThreadSafe(playlistDao, playlist); + Thread thread = new Thread(delete); + thread.start(); + } + + private static class InsertThreadSafe implements Runnable { + private final PlaylistDao playlistDao; + private final Playlist playlist; + + public InsertThreadSafe(PlaylistDao playlistDao, Playlist playlist) { + this.playlistDao = playlistDao; + this.playlist = playlist; + } + + @Override + public void run() { + playlistDao.insert(playlist); + } + } + + private static class DeleteThreadSafe implements Runnable { + private final PlaylistDao playlistDao; + private final Playlist playlist; + + public DeleteThreadSafe(PlaylistDao playlistDao, Playlist playlist) { + this.playlistDao = playlistDao; + this.playlist = playlist; + } + + @Override + public void run() { + playlistDao.delete(playlist); + } + } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java index a114f345..181524c0 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java @@ -478,4 +478,8 @@ public class HomeFragment extends Fragment { bind.homeLinearLayoutContainer.addView(bind.homeRecentlyPlayedAlbumsSector); } } + + public void addPinnedPlaylistsView() { + + } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java index 0f05063c..e81308e2 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java @@ -20,7 +20,6 @@ import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentPlaylistPageBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; -import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.ui.activity.MainActivity; @@ -29,7 +28,6 @@ import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.viewmodel.PlaylistPageViewModel; import java.util.Collections; -import java.util.List; import java.util.Objects; public class PlaylistPageFragment extends Fragment { @@ -50,6 +48,7 @@ public class PlaylistPageFragment extends Fragment { public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.playlist_page_menu, menu); + initMenuOption(menu); } @Override @@ -90,6 +89,12 @@ public class PlaylistPageFragment extends Fragment { } }); return true; + } else if (item.getItemId() == R.id.action_pin_playlist) { + playlistPageViewModel.setPinned(true); + return true; + } else if (item.getItemId() == R.id.action_unpin_playlist) { + playlistPageViewModel.setPinned(false); + return true; } return false; @@ -100,6 +105,13 @@ public class PlaylistPageFragment extends Fragment { playlistPageViewModel.setOffline(requireArguments().getBoolean("is_offline")); } + private void initMenuOption(Menu menu) { + playlistPageViewModel.isPinned(requireActivity()).observe(requireActivity(), isPinned -> { + menu.findItem(R.id.action_unpin_playlist).setVisible(isPinned); + menu.findItem(R.id.action_pin_playlist).setVisible(!isPinned); + }); + } + private void initAppBar() { activity.setSupportActionBar(bind.animToolbar); diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistPageViewModel.java index d6511f37..b9e0756f 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistPageViewModel.java @@ -57,4 +57,18 @@ public class PlaylistPageViewModel extends AndroidViewModel { public boolean isOffline() { return isOffline; } + + public LiveData isPinned(FragmentActivity activity) { + MutableLiveData isPinnedLive = new MutableLiveData<>(); + playlistRepository.getPinnedPlaylists().observe(activity, playlists -> isPinnedLive.postValue(playlists.contains(playlist))); + return isPinnedLive; + } + + public void setPinned(boolean isNowPinned) { + if(isNowPinned) { + playlistRepository.insert(playlist); + } else { + playlistRepository.delete(playlist); + } + } } diff --git a/app/src/main/res/drawable/ic_pin_in.xml b/app/src/main/res/drawable/ic_pin_in.xml new file mode 100644 index 00000000..189cda3b --- /dev/null +++ b/app/src/main/res/drawable/ic_pin_in.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_pin_out.xml b/app/src/main/res/drawable/ic_pin_out.xml new file mode 100644 index 00000000..17a8fec5 --- /dev/null +++ b/app/src/main/res/drawable/ic_pin_out.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/menu/playlist_page_menu.xml b/app/src/main/res/menu/playlist_page_menu.xml index f7c9d009..0e8046eb 100644 --- a/app/src/main/res/menu/playlist_page_menu.xml +++ b/app/src/main/res/menu/playlist_page_menu.xml @@ -7,4 +7,16 @@ android:iconTint="@color/titleTextColor" android:title="@string/menu_download_all_button" app:showAsAction="never" /> + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8f723030..83692049 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,8 +105,10 @@ Download Home Library + Pin Search Settings + Unpin Now playing The playing notification provides actions for play/pause etc. Playing Notification