Allow playlists to be renamed
This commit is contained in:
parent
ec017c8d46
commit
0e8fb9cb29
@ -27,9 +27,7 @@
|
|||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:layout_marginBottom="8dip"
|
android:layout_marginBottom="8dip"
|
||||||
android:layout_marginLeft="8dip"
|
android:layout_marginLeft="8dip"
|
||||||
android:layout_marginRight="8dip">
|
android:layout_marginRight="8dip" />
|
||||||
<requestFocus />
|
|
||||||
</EditText>
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
<string name="enqueue">Enqueue</string>
|
<string name="enqueue">Enqueue</string>
|
||||||
<string name="play">Play</string>
|
<string name="play">Play</string>
|
||||||
<string name="edit">Edit</string>
|
<string name="edit">Edit</string>
|
||||||
|
<string name="rename">Rename</string>
|
||||||
<string name="add_to_playlist">Add to Playlist...</string>
|
<string name="add_to_playlist">Add to Playlist...</string>
|
||||||
<string name="new_playlist">New Playlist...</string>
|
<string name="new_playlist">New Playlist...</string>
|
||||||
<string name="expand">Expand</string>
|
<string name="expand">Expand</string>
|
||||||
|
@ -46,10 +46,31 @@ public class NewPlaylistDialog extends Dialog implements TextWatcher, View.OnCli
|
|||||||
* was clicked.
|
* was clicked.
|
||||||
*/
|
*/
|
||||||
private boolean mAccepted;
|
private boolean mAccepted;
|
||||||
|
/**
|
||||||
|
* The text to display initially. When the EditText contains this text, the
|
||||||
|
* positive button will be disabled.
|
||||||
|
*/
|
||||||
|
private String mInitialText;
|
||||||
|
/**
|
||||||
|
* The resource containing the string describing the default positive
|
||||||
|
* action (e.g. "Create" or "Rename").
|
||||||
|
*/
|
||||||
|
private int mActionRes;
|
||||||
|
|
||||||
public NewPlaylistDialog(Context context)
|
/**
|
||||||
|
* Create a NewPlaylistDialog.
|
||||||
|
*
|
||||||
|
* @param context A Context to use.
|
||||||
|
* @param initialText The text to show initially. The positive button is
|
||||||
|
* disabled when the EditText contains this text.
|
||||||
|
* @param actionText A string resource describing the default positive
|
||||||
|
* action (e.g. "Create").
|
||||||
|
*/
|
||||||
|
public NewPlaylistDialog(Context context, String initialText, int actionText)
|
||||||
{
|
{
|
||||||
super(context);
|
super(context);
|
||||||
|
mInitialText = initialText;
|
||||||
|
mActionRes = actionText;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -61,13 +82,16 @@ public class NewPlaylistDialog extends Dialog implements TextWatcher, View.OnCli
|
|||||||
|
|
||||||
setTitle(R.string.choose_playlist_name);
|
setTitle(R.string.choose_playlist_name);
|
||||||
|
|
||||||
|
mPositiveButton = (Button)findViewById(R.id.create);
|
||||||
|
mPositiveButton.setOnClickListener(this);
|
||||||
|
mPositiveButton.setText(mActionRes);
|
||||||
|
View negativeButton = findViewById(R.id.cancel);
|
||||||
|
negativeButton.setOnClickListener(this);
|
||||||
|
|
||||||
mText = (EditText)findViewById(R.id.playlist_name);
|
mText = (EditText)findViewById(R.id.playlist_name);
|
||||||
mText.addTextChangedListener(this);
|
mText.addTextChangedListener(this);
|
||||||
|
mText.setText(mInitialText);
|
||||||
mPositiveButton = (Button)findViewById(R.id.create);
|
mText.requestFocus();
|
||||||
View negativeButton = findViewById(R.id.cancel);
|
|
||||||
mPositiveButton.setOnClickListener(this);
|
|
||||||
negativeButton.setOnClickListener(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,12 +112,18 @@ public class NewPlaylistDialog extends Dialog implements TextWatcher, View.OnCli
|
|||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onTextChanged(CharSequence s, int start, int before, int count)
|
public void onTextChanged(CharSequence text, int start, int before, int count)
|
||||||
{
|
{
|
||||||
// Update the action button based on whether there is an
|
String string = text.toString();
|
||||||
// existing playlist with the given name.
|
if (string.equals(mInitialText)) {
|
||||||
int res = Playlist.getPlaylist(s.toString()) == -1 ? R.string.create : R.string.overwrite;
|
mPositiveButton.setEnabled(false);
|
||||||
mPositiveButton.setText(res);
|
} else {
|
||||||
|
mPositiveButton.setEnabled(true);
|
||||||
|
// Update the action button based on whether there is an
|
||||||
|
// existing playlist with the given name.
|
||||||
|
int res = Playlist.getPlaylist(string) == -1 ? mActionRes : R.string.overwrite;
|
||||||
|
mPositiveButton.setText(res);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -171,4 +171,26 @@ public class Playlist {
|
|||||||
Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, id);
|
Uri uri = ContentUris.withAppendedId(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, id);
|
||||||
ContextApplication.getContext().getContentResolver().delete(uri, null, null);
|
ContextApplication.getContext().getContentResolver().delete(uri, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rename the playlist with the given id.
|
||||||
|
*
|
||||||
|
* @param id The Media.Audio.Playlists id of the playlist.
|
||||||
|
* @param newName The new name for the playlist.
|
||||||
|
*/
|
||||||
|
public static void renamePlaylist(long id, String newName)
|
||||||
|
{
|
||||||
|
long existingId = getPlaylist(newName);
|
||||||
|
// We are already called the requested name; nothing to do.
|
||||||
|
if (existingId == id)
|
||||||
|
return;
|
||||||
|
// There is already a playlist with this name. Kill it.
|
||||||
|
if (existingId != -1)
|
||||||
|
deletePlaylist(existingId);
|
||||||
|
|
||||||
|
ContentResolver resolver = ContextApplication.getContext().getContentResolver();
|
||||||
|
ContentValues values = new ContentValues(1);
|
||||||
|
values.put(MediaStore.Audio.Playlists.NAME, newName);
|
||||||
|
resolver.update(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, values, MediaStore.Audio.Playlists._ID + "=" + id, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -342,6 +342,7 @@ public class SongSelector extends PlaybackActivity implements AdapterView.OnItem
|
|||||||
private static final int MENU_NEW_PLAYLIST = 4;
|
private static final int MENU_NEW_PLAYLIST = 4;
|
||||||
private static final int MENU_DELETE = 5;
|
private static final int MENU_DELETE = 5;
|
||||||
private static final int MENU_EDIT = 6;
|
private static final int MENU_EDIT = 6;
|
||||||
|
private static final int MENU_RENAME_PLAYLIST = 7;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreateContextMenu(ContextMenu menu, View listView, ContextMenu.ContextMenuInfo absInfo)
|
public void onCreateContextMenu(ContextMenu menu, View listView, ContextMenu.ContextMenuInfo absInfo)
|
||||||
@ -353,8 +354,10 @@ public class SongSelector extends PlaybackActivity implements AdapterView.OnItem
|
|||||||
menu.setHeaderTitle(view.getTitle());
|
menu.setHeaderTitle(view.getTitle());
|
||||||
menu.add(0, MENU_PLAY, 0, R.string.play);
|
menu.add(0, MENU_PLAY, 0, R.string.play);
|
||||||
menu.add(0, MENU_ENQUEUE, 0, R.string.enqueue);
|
menu.add(0, MENU_ENQUEUE, 0, R.string.enqueue);
|
||||||
if (view.getMediaType() == MediaUtils.TYPE_PLAYLIST)
|
if (view.getMediaType() == MediaUtils.TYPE_PLAYLIST) {
|
||||||
|
menu.add(0, MENU_RENAME_PLAYLIST, 0, R.string.rename);
|
||||||
menu.add(0, MENU_EDIT, 0, R.string.edit);
|
menu.add(0, MENU_EDIT, 0, R.string.edit);
|
||||||
|
}
|
||||||
SubMenu playlistMenu = menu.addSubMenu(0, MENU_ADD_TO_PLAYLIST, 0, R.string.add_to_playlist);
|
SubMenu playlistMenu = menu.addSubMenu(0, MENU_ADD_TO_PLAYLIST, 0, R.string.add_to_playlist);
|
||||||
if (view.hasExpanders())
|
if (view.hasExpanders())
|
||||||
menu.add(0, MENU_EXPAND, 0, R.string.expand);
|
menu.add(0, MENU_EXPAND, 0, R.string.expand);
|
||||||
@ -433,13 +436,22 @@ public class SongSelector extends PlaybackActivity implements AdapterView.OnItem
|
|||||||
sendSongIntent((MediaAdapter.MediaView)((AdapterView.AdapterContextMenuInfo)item.getMenuInfo()).targetView, action);
|
sendSongIntent((MediaAdapter.MediaView)((AdapterView.AdapterContextMenuInfo)item.getMenuInfo()).targetView, action);
|
||||||
break;
|
break;
|
||||||
case MENU_NEW_PLAYLIST: {
|
case MENU_NEW_PLAYLIST: {
|
||||||
NewPlaylistDialog dialog = new NewPlaylistDialog(this);
|
NewPlaylistDialog dialog = new NewPlaylistDialog(this, null, R.string.create);
|
||||||
Message message = mHandler.obtainMessage(MSG_NEW_PLAYLIST, type, mediaId);
|
Message message = mHandler.obtainMessage(MSG_NEW_PLAYLIST, type, mediaId);
|
||||||
message.obj = dialog;
|
message.obj = dialog;
|
||||||
dialog.setDismissMessage(message);
|
dialog.setDismissMessage(message);
|
||||||
dialog.show();
|
dialog.show();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MENU_RENAME_PLAYLIST: {
|
||||||
|
MediaAdapter.MediaView view = (MediaAdapter.MediaView)((AdapterView.AdapterContextMenuInfo)item.getMenuInfo()).targetView;
|
||||||
|
NewPlaylistDialog dialog = new NewPlaylistDialog(this, view.getTitle(), R.string.rename);
|
||||||
|
Message message = mHandler.obtainMessage(MSG_RENAME_PLAYLIST, view.getMediaType(), (int)view.getMediaId());
|
||||||
|
message.obj = dialog;
|
||||||
|
dialog.setDismissMessage(message);
|
||||||
|
dialog.show();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case MENU_DELETE: {
|
case MENU_DELETE: {
|
||||||
MediaAdapter.MediaView view = (MediaAdapter.MediaView)((AdapterView.AdapterContextMenuInfo)item.getMenuInfo()).targetView;
|
MediaAdapter.MediaView view = (MediaAdapter.MediaView)((AdapterView.AdapterContextMenuInfo)item.getMenuInfo()).targetView;
|
||||||
type = view.getMediaType();
|
type = view.getMediaType();
|
||||||
@ -531,6 +543,13 @@ public class SongSelector extends PlaybackActivity implements AdapterView.OnItem
|
|||||||
* playlist.
|
* playlist.
|
||||||
*/
|
*/
|
||||||
private static final int MSG_DELETE = 12;
|
private static final int MSG_DELETE = 12;
|
||||||
|
/**
|
||||||
|
* Rename the playlist with the parameters from the given message. The
|
||||||
|
* message must contain the type and id of the media to be added in
|
||||||
|
* arg1 and arg2, respectively. The obj field must be a NewPlaylistDialog
|
||||||
|
* that the name will be taken from.
|
||||||
|
*/
|
||||||
|
private static final int MSG_RENAME_PLAYLIST = 13;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean handleMessage(Message message)
|
public boolean handleMessage(Message message)
|
||||||
@ -541,7 +560,7 @@ public class SongSelector extends PlaybackActivity implements AdapterView.OnItem
|
|||||||
Observer observer = new Observer(mHandler);
|
Observer observer = new Observer(mHandler);
|
||||||
resolver.registerContentObserver(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, true, observer);
|
resolver.registerContentObserver(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, true, observer);
|
||||||
break;
|
break;
|
||||||
case MSG_NEW_PLAYLIST:
|
case MSG_NEW_PLAYLIST: {
|
||||||
NewPlaylistDialog dialog = (NewPlaylistDialog)message.obj;
|
NewPlaylistDialog dialog = (NewPlaylistDialog)message.obj;
|
||||||
if (dialog.isAccepted()) {
|
if (dialog.isAccepted()) {
|
||||||
String name = dialog.getText();
|
String name = dialog.getText();
|
||||||
@ -549,9 +568,15 @@ public class SongSelector extends PlaybackActivity implements AdapterView.OnItem
|
|||||||
addToPlaylist(playlistId, message.arg1, message.arg2, name);
|
addToPlaylist(playlistId, message.arg1, message.arg2, name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case MSG_DELETE:
|
case MSG_DELETE:
|
||||||
delete(message.arg1, message.arg2, (String)message.obj);
|
delete(message.arg1, message.arg2, (String)message.obj);
|
||||||
break;
|
break;
|
||||||
|
case MSG_RENAME_PLAYLIST: {
|
||||||
|
NewPlaylistDialog dialog = (NewPlaylistDialog)message.obj;
|
||||||
|
if (dialog.isAccepted())
|
||||||
|
Playlist.renamePlaylist(message.arg2, dialog.getText());
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return super.handleMessage(message);
|
return super.handleMessage(message);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user