Skip to content

Commit

Permalink
save playlists in own database instead in the mediastore
Browse files Browse the repository at this point in the history
  • Loading branch information
gnome17 committed Oct 7, 2020
1 parent ebf8a3e commit 90d5dc5
Show file tree
Hide file tree
Showing 22 changed files with 840 additions and 273 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@
*
*/

package org.gateshipone.odyssey.listener;
// IPlaylistModel.aidl
package org.gateshipone.odyssey.models;


public interface OnPlaylistFileSelectedListener {
void onPlaylistFileSelected(String name, String path);
}
parcelable PlaylistModel;
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ package org.gateshipone.odyssey.playbackservice;

// Declare any non-default types here with import statements
import org.gateshipone.odyssey.models.TrackModel;
import org.gateshipone.odyssey.models.PlaylistModel;
import org.gateshipone.odyssey.playbackservice.NowPlayingInformation;

interface IOdysseyPlaybackService {
Expand All @@ -38,15 +39,12 @@ interface IOdysseyPlaybackService {
*/
void seekTo(int position);

// save current playlist in mediastore
// save current playlist in odyssey db
void savePlaylist(String name);

// enqueue a playlist from mediastore
void enqueuePlaylist(long playlistId);
void playPlaylist(long playlistId, int position);

void enqueuePlaylistFile(String path);
void playPlaylistFile(String path, int position);
// enqueue a playlist from mediastore/odyssey db/file
void enqueuePlaylist(in PlaylistModel playlist);
void playPlaylist(in PlaylistModel playlist, int position);

// enqueue all tracks of an album from mediastore
void enqueueAlbum(String albumKey, String orderKey);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,14 @@
import org.gateshipone.odyssey.listener.OnAlbumSelectedListener;
import org.gateshipone.odyssey.listener.OnArtistSelectedListener;
import org.gateshipone.odyssey.listener.OnDirectorySelectedListener;
import org.gateshipone.odyssey.listener.OnPlaylistFileSelectedListener;
import org.gateshipone.odyssey.listener.OnPlaylistSelectedListener;
import org.gateshipone.odyssey.listener.OnRecentAlbumsSelectedListener;
import org.gateshipone.odyssey.listener.OnSaveDialogListener;
import org.gateshipone.odyssey.listener.OnStartSleepTimerListener;
import org.gateshipone.odyssey.listener.ToolbarAndFABCallback;
import org.gateshipone.odyssey.models.AlbumModel;
import org.gateshipone.odyssey.models.ArtistModel;
import org.gateshipone.odyssey.models.PlaylistModel;
import org.gateshipone.odyssey.utils.FileExplorerHelper;
import org.gateshipone.odyssey.utils.FileUtils;
import org.gateshipone.odyssey.utils.MusicLibraryHelper;
Expand Down Expand Up @@ -100,8 +100,7 @@ public class OdysseyMainActivity extends GenericActivity
implements NavigationView.OnNavigationItemSelectedListener, ToolbarAndFABCallback,
OnSaveDialogListener, NowPlayingView.NowPlayingDragStatusReceiver, SettingsFragment.OnArtworkSettingsRequestedCallback,
OnArtistSelectedListener, OnAlbumSelectedListener, OnRecentAlbumsSelectedListener,
OnPlaylistSelectedListener, OnPlaylistFileSelectedListener, OnDirectorySelectedListener,
OnStartSleepTimerListener {
OnPlaylistSelectedListener, OnDirectorySelectedListener, OnStartSleepTimerListener {

public enum REQUESTEDVIEW {
NONE,
Expand Down Expand Up @@ -734,32 +733,9 @@ public void onDragPositionChanged(float pos) {
}

@Override
public void onPlaylistSelected(String playlistTitle, long playlistID) {
public void onPlaylistSelected(PlaylistModel playlistModel) {
// Create fragment and give it an argument for the selected playlist
PlaylistTracksFragment newFragment = PlaylistTracksFragment.newInstance(playlistTitle, playlistID);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// set enter / exit animation
final int layoutDirection = getResources().getConfiguration().getLayoutDirection();
newFragment.setEnterTransition(new Slide(GravityCompat.getAbsoluteGravity(GravityCompat.START, layoutDirection)));
newFragment.setExitTransition(new Slide(GravityCompat.getAbsoluteGravity(GravityCompat.END, layoutDirection)));

// Replace whatever is in the fragment_container view with this
// fragment,
// and add the transaction to the back stack so the user can navigate
// back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack("PlaylistTracksFragment");

// Commit the transaction
transaction.commit();
}

@Override
public void onPlaylistFileSelected(String name, String path) {
// Create fragment and give it an argument for the selected playlist
PlaylistTracksFragment newFragment = PlaylistTracksFragment.newInstance(name, path);
PlaylistTracksFragment newFragment = PlaylistTracksFragment.newInstance(playlistModel);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
});

// setup playlist ViewModel
final PlaylistViewModel model = new ViewModelProvider(this, new PlaylistViewModel.PlaylistViewModelFactory(getActivity().getApplication(), true))
final PlaylistViewModel model = new ViewModelProvider(this, new PlaylistViewModel.PlaylistViewModelFactory(getActivity().getApplication(), true, true))
.get(PlaylistViewModel.class);
model.getData()
.observe(this, data -> mPlaylistsListViewAdapter.swapModel(data));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,10 @@
import org.gateshipone.odyssey.adapter.FilesAdapter;
import org.gateshipone.odyssey.dialogs.ChooseStorageVolumeDialog;
import org.gateshipone.odyssey.listener.OnDirectorySelectedListener;
import org.gateshipone.odyssey.listener.OnPlaylistFileSelectedListener;
import org.gateshipone.odyssey.listener.OnPlaylistSelectedListener;
import org.gateshipone.odyssey.mediascanner.MediaScannerService;
import org.gateshipone.odyssey.models.FileModel;
import org.gateshipone.odyssey.models.PlaylistModel;
import org.gateshipone.odyssey.utils.PreferenceHelper;
import org.gateshipone.odyssey.utils.ThemeUtils;
import org.gateshipone.odyssey.viewmodels.FileViewModel;
Expand All @@ -68,7 +69,7 @@ public class FilesFragment extends OdysseyFragment<FileModel> implements Adapter
*/
private OnDirectorySelectedListener mOnDirectorySelectedCallback;

private OnPlaylistFileSelectedListener mOnPlaylistFileSelectedCallback;
private OnPlaylistSelectedListener mOnPlaylistSelectedCallback;

/**
* the current directory that is displayed by the fragment
Expand Down Expand Up @@ -204,7 +205,7 @@ public void onAttach(@NonNull Context context) {
}

try {
mOnPlaylistFileSelectedCallback = (OnPlaylistFileSelectedListener) context;
mOnPlaylistSelectedCallback = (OnPlaylistSelectedListener) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString() + " must implement OnPlaylistFileSelectedListener");
}
Expand Down Expand Up @@ -259,7 +260,7 @@ public void onItemClick(AdapterView<?> parent, View view, int position, long id)
// file is directory open new fragment
mOnDirectorySelectedCallback.onDirectorySelected(selectedFile.getPath(), false);
} else if (selectedFile.isPlaylist()) {
mOnPlaylistFileSelectedCallback.onPlaylistFileSelected(selectedFile.getNameWithoutExtension(), selectedFile.getPath());
mOnPlaylistSelectedCallback.onPlaylistSelected(new PlaylistModel(selectedFile.getNameWithoutExtension(), selectedFile.getPath()));
} else {
switch (mClickAction) {
case ACTION_ADD_SONG:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,14 @@
import org.gateshipone.odyssey.R;
import org.gateshipone.odyssey.activities.GenericActivity;
import org.gateshipone.odyssey.adapter.TracksAdapter;
import org.gateshipone.odyssey.models.PlaylistModel;
import org.gateshipone.odyssey.models.TrackModel;
import org.gateshipone.odyssey.playbackservice.statemanager.OdysseyDatabaseManager;
import org.gateshipone.odyssey.utils.MusicLibraryHelper;
import org.gateshipone.odyssey.utils.PreferenceHelper;
import org.gateshipone.odyssey.utils.ThemeUtils;
import org.gateshipone.odyssey.viewmodels.GenericViewModel;
import org.gateshipone.odyssey.viewmodels.PlaylistTrackViewModel;
import org.gateshipone.odyssey.viewmodels.TrackViewModel;

import java.util.List;

Expand All @@ -59,40 +60,21 @@ public class PlaylistTracksFragment extends OdysseyFragment<TrackModel> implemen
/**
* Key values for arguments of the fragment
*/
private final static String ARG_PLAYLISTTITLE = "playlisttitle";

private final static String ARG_PLAYLISTID = "playlistid";

private final static String ARG_PLAYLISTPATH = "playlistpath";
private final static String ARG_PLAYLISTMODEL = "playlistmodel";

/**
* The information of the displayed playlist
*/
private String mPlaylistTitle = "";

private long mPlaylistID = -1;

private String mPlaylistPath;
private PlaylistModel mPlaylistModel;

/**
* Action to execute when the user selects an item in the list
*/
private PreferenceHelper.LIBRARY_TRACK_CLICK_ACTION mClickAction;

public static PlaylistTracksFragment newInstance(@NonNull final String playlistTitle, final long playlistID) {
final Bundle args = new Bundle();
args.putString(ARG_PLAYLISTTITLE, playlistTitle);
args.putLong(ARG_PLAYLISTID, playlistID);

final PlaylistTracksFragment fragment = new PlaylistTracksFragment();
fragment.setArguments(args);
return fragment;
}

public static PlaylistTracksFragment newInstance(@NonNull final String playlistTitle, @NonNull final String playlistPath) {
public static PlaylistTracksFragment newInstance(@NonNull final PlaylistModel playlistModel) {
final Bundle args = new Bundle();
args.putString(ARG_PLAYLISTTITLE, playlistTitle);
args.putString(ARG_PLAYLISTPATH, playlistPath);
args.putParcelable(ARG_PLAYLISTMODEL, playlistModel);

final PlaylistTracksFragment fragment = new PlaylistTracksFragment();
fragment.setArguments(args);
Expand Down Expand Up @@ -140,9 +122,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,

Bundle args = getArguments();

mPlaylistTitle = args.getString(ARG_PLAYLISTTITLE);
mPlaylistID = args.getLong(ARG_PLAYLISTID);
mPlaylistPath = args.getString(ARG_PLAYLISTPATH);
mPlaylistModel = args.getParcelable(ARG_PLAYLISTMODEL);

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext());
mClickAction = PreferenceHelper.getClickAction(sharedPreferences, getContext());
Expand All @@ -155,11 +135,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,

@Override
GenericViewModel<TrackModel> getViewModel() {
if (mPlaylistPath == null) {
return new ViewModelProvider(this, new TrackViewModel.TrackViewModelFactory(getActivity().getApplication(), mPlaylistID)).get(TrackViewModel.class);
} else {
return new ViewModelProvider(this, new PlaylistTrackViewModel.PlaylistTrackViewModelFactory(getActivity().getApplication(), mPlaylistPath)).get(PlaylistTrackViewModel.class);
}
return new ViewModelProvider(this, new PlaylistTrackViewModel.PlaylistTrackViewModelFactory(getActivity().getApplication(), mPlaylistModel)).get(PlaylistTrackViewModel.class);
}

/**
Expand All @@ -170,7 +146,7 @@ GenericViewModel<TrackModel> getViewModel() {
public void onResume() {
if (mToolbarAndFABCallback != null) {
// set toolbar behaviour and title
mToolbarAndFABCallback.setupToolbar(mPlaylistTitle, false, false, false);
mToolbarAndFABCallback.setupToolbar(mPlaylistModel.getPlaylistName(), false, false, false);
// Enable FAB correctly for now, can be disabled later
mToolbarAndFABCallback.setupFAB(v -> playPlaylist(0));
}
Expand Down Expand Up @@ -221,7 +197,7 @@ public void onCreateContextMenu(@NonNull ContextMenu menu, @NonNull View v, Cont
MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.context_menu_playlist_tracks_fragment, menu);

if (mPlaylistPath != null) {
if (mPlaylistModel.getPlaylistType() == PlaylistModel.PLAYLIST_TYPES.FILE) {
// Hide remove track for playlist files as it is unsupported
menu.findItem(R.id.fragment_playlist_tracks_action_remove).setVisible(false);
}
Expand Down Expand Up @@ -305,11 +281,7 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
private void enqueuePlaylist() {
try {
// add the playlist
if (mPlaylistPath == null) {
((GenericActivity) getActivity()).getPlaybackService().enqueuePlaylist(mPlaylistID);
} else {
((GenericActivity) getActivity()).getPlaybackService().enqueuePlaylistFile(mPlaylistPath);
}
((GenericActivity) getActivity()).getPlaybackService().enqueuePlaylist(mPlaylistModel);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Expand All @@ -326,11 +298,7 @@ private void enqueuePlaylist() {
private void playPlaylist(int position) {

try {
if (mPlaylistPath == null) {
((GenericActivity) getActivity()).getPlaybackService().playPlaylist(mPlaylistID, position);
} else {
((GenericActivity) getActivity()).getPlaybackService().playPlaylistFile(mPlaylistPath, position);
}
((GenericActivity) getActivity()).getPlaybackService().playPlaylist(mPlaylistModel, position);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Expand Down Expand Up @@ -377,7 +345,16 @@ private void enqueueTrack(int position, boolean asNext) {
* @param position the position of the selected track in the adapter
*/
private void removeTrackFromPlaylist(int position) {
final boolean reloadData = MusicLibraryHelper.removeTrackFromPlaylist(mPlaylistID, position, getContext().getApplicationContext());
boolean reloadData = false;

switch (mPlaylistModel.getPlaylistType()) {
case MEDIASTORE:
reloadData = MusicLibraryHelper.removeTrackFromPlaylist(mPlaylistModel.getPlaylistID(), position, getContext().getApplicationContext());
break;
case ODYSSEY_LOCAL:
reloadData = OdysseyDatabaseManager.getInstance(getContext()).removeTrackFromPlaylist(mPlaylistModel.getPlaylistID(), position);
break;
}

if (reloadData) {
// reload data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import org.gateshipone.odyssey.adapter.SavedPlaylistsAdapter;
import org.gateshipone.odyssey.listener.OnPlaylistSelectedListener;
import org.gateshipone.odyssey.models.PlaylistModel;
import org.gateshipone.odyssey.playbackservice.statemanager.OdysseyDatabaseManager;
import org.gateshipone.odyssey.utils.MusicLibraryHelper;
import org.gateshipone.odyssey.viewmodels.GenericViewModel;
import org.gateshipone.odyssey.viewmodels.PlaylistViewModel;
Expand Down Expand Up @@ -87,7 +88,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,

@Override
GenericViewModel<PlaylistModel> getViewModel() {
return new ViewModelProvider(this, new PlaylistViewModel.PlaylistViewModelFactory(getActivity().getApplication(), false)).get(PlaylistViewModel.class);
return new ViewModelProvider(this, new PlaylistViewModel.PlaylistViewModelFactory(getActivity().getApplication(), false, false)).get(PlaylistViewModel.class);
}

/**
Expand Down Expand Up @@ -130,11 +131,8 @@ public void onItemClick(AdapterView<?> parent, View view, int position, long id)
// identify current playlist
PlaylistModel clickedPlaylist = mAdapter.getItem(position);

String playlistName = clickedPlaylist.getPlaylistName();
long playlistID = clickedPlaylist.getPlaylistID();

// open playlistfragment
mPlaylistSelectedCallback.onPlaylistSelected(playlistName, playlistID);
mPlaylistSelectedCallback.onPlaylistSelected(clickedPlaylist);
}

/**
Expand Down Expand Up @@ -187,7 +185,7 @@ private void enqueuePlaylist(int position) {

try {
// add playlist
((GenericActivity) getActivity()).getPlaybackService().enqueuePlaylist(clickedPlaylist.getPlaylistID());
((GenericActivity) getActivity()).getPlaybackService().enqueuePlaylist(clickedPlaylist);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Expand All @@ -205,7 +203,7 @@ private void playPlaylist(int position) {

try {
// add playlist
((GenericActivity) getActivity()).getPlaybackService().playPlaylist(clickedPlaylist.getPlaylistID(), 0);
((GenericActivity) getActivity()).getPlaybackService().playPlaylist(clickedPlaylist, 0);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Expand All @@ -222,7 +220,16 @@ private void deletePlaylist(final int position) {
final PlaylistModel clickedPlaylist = mAdapter.getItem(position);

// delete current playlist
final boolean reloadData = MusicLibraryHelper.removePlaylist(clickedPlaylist.getPlaylistID(), getActivity().getApplicationContext());
boolean reloadData = false;

switch (clickedPlaylist.getPlaylistType()) {
case MEDIASTORE:
reloadData = MusicLibraryHelper.removePlaylist(clickedPlaylist.getPlaylistID(), getActivity().getApplicationContext());
break;
case ODYSSEY_LOCAL:
reloadData = OdysseyDatabaseManager.getInstance(getContext()).removePlaylist(clickedPlaylist.getPlaylistID());
break;
}

if (reloadData) {
// reload data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

package org.gateshipone.odyssey.listener;

import org.gateshipone.odyssey.models.PlaylistModel;

public interface OnPlaylistSelectedListener {
void onPlaylistSelected(String playlistTitle, long playlistID);
void onPlaylistSelected(PlaylistModel playlistModel);
}
Loading

0 comments on commit 90d5dc5

Please sign in to comment.