/* * Copyright (C) 2014 Fastboot Mobile, LLC. * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; * if not, see <http://www.gnu.org/licenses>. */ package com.fastbootmobile.encore.app.fragments; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; import com.fastbootmobile.encore.app.R; import com.fastbootmobile.encore.framework.PluginsLookup; import com.fastbootmobile.encore.model.Album; import com.fastbootmobile.encore.model.Playlist; import com.fastbootmobile.encore.model.Song; import com.fastbootmobile.encore.providers.IMusicProvider; import com.fastbootmobile.encore.providers.ProviderConnection; import com.fastbootmobile.encore.providers.ProviderIdentifier; import com.fastbootmobile.encore.utils.Utils; import java.util.Iterator; /** * Dialog Fragment allowing creation of a new playlist */ public class NewPlaylistFragment extends DialogFragment { private static final String TAG = "NewPlaylistFragment"; private static final String KEY_SONG = "song"; private static final String KEY_ALBUM = "album"; private static final String KEY_PLAYLIST = "playlist"; private Song mSong; private Album mAlbum; private Playlist mPlaylist; /** * Creates a new instance of the New Playlist dialog fragment to create a new playlist and * add a song to it. * * @param song The song to add to the playlist * @return The fragment generated */ public static NewPlaylistFragment newInstance(Song song) { NewPlaylistFragment fragment = new NewPlaylistFragment(); Bundle bundle = new Bundle(); bundle.putParcelable(KEY_SONG, song); fragment.setArguments(bundle); return fragment; } /** * Creates a new instance of the New Playlist dialog fragment to create a new playlist and * add all tracks of an album to it. * * @param album The album to add to the playlist * @return The fragment generated */ public static NewPlaylistFragment newInstance(Album album) { NewPlaylistFragment fragment = new NewPlaylistFragment(); Bundle bundle = new Bundle(); bundle.putParcelable(KEY_ALBUM, album); fragment.setArguments(bundle); return fragment; } /** * Creates a new instance of the New Playlist dialog fragment to create a new playlist and * add all tracks of an existing playlist to it. * * @param playlist The playlist to append to the new playlist * @return The fragment generated */ public static NewPlaylistFragment newInstance(Playlist playlist) { NewPlaylistFragment fragment = new NewPlaylistFragment(); Bundle bundle = new Bundle(); bundle.putParcelable(KEY_PLAYLIST, playlist); fragment.setArguments(bundle); return fragment; } @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); Bundle args = getArguments(); if (args == null) { throw new IllegalArgumentException("This fragment requires a song or an album"); } if (args.containsKey(KEY_SONG)) { mSong = args.getParcelable(KEY_SONG); } else if (args.containsKey(KEY_ALBUM)) { mAlbum = args.getParcelable(KEY_ALBUM); } else if (args.containsKey(KEY_PLAYLIST)) { mPlaylist = args.getParcelable(KEY_PLAYLIST); } } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstance) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); View root = inflater.inflate(R.layout.dialog_new_playlist, null); final TextView playlistName = (TextView) root.findViewById(R.id.et_playlist_name); final CheckBox multiProviderPlaylist = (CheckBox) root.findViewById(R.id.cb_provider_specific); builder.setView(root) .setPositiveButton(getString(R.string.create), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String playlistNameStr = playlistName.getText().toString().trim(); if (!playlistNameStr.isEmpty()) { Log.d(TAG, "Adding new playlist named '" + playlistNameStr + "'"); try { ProviderConnection connection; if (multiProviderPlaylist.isChecked()) { connection = PluginsLookup.getDefault().getMultiProviderPlaylistProvider(); } else { ProviderIdentifier identifier; if (mSong != null) { identifier = mSong.getProvider(); } else if (mAlbum != null) { identifier = mAlbum.getProvider(); } else if (mPlaylist != null) { identifier = mPlaylist.getProvider(); } else { throw new IllegalStateException("Song, Album and Playlist are all null, cannot determine provider!"); } connection = PluginsLookup.getDefault().getProvider(identifier); } IMusicProvider binder = connection.getBinder(); String playlistRef = binder.addPlaylist(playlistName.getText().toString()); if (playlistRef != null) { if (mSong != null) { binder.addSongToPlaylist(mSong.getRef(), playlistRef, mSong.getProvider()); } else if (mAlbum != null) { Iterator<String> songs = mAlbum.songs(); while (songs.hasNext()) { binder.addSongToPlaylist(songs.next(), playlistRef, mAlbum.getProvider()); } } else if (mPlaylist != null) { Iterator<String> songs = mPlaylist.songs(); while (songs.hasNext()) { // TODO: This might cause issues if we add a playlist // from a multi-provider playlist to another one binder.addSongToPlaylist(songs.next(), playlistRef, mPlaylist.getProvider()); } } } else { throw new IllegalStateException("Playlist reference returned by the provider is null!"); } } catch (Exception e) { Log.e(TAG, "Unable to add playlist", e); Toast.makeText(getActivity(), getString(R.string.toast_playlist_track_add_error, playlistNameStr), Toast.LENGTH_SHORT).show(); } } else { Utils.shortToast(getActivity(), R.string.enter_name); } } }) .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }).setTitle(getString(R.string.new_playlist)); return builder.create(); } }