Cleanup playlist dialog code
This commit is contained in:
parent
bb3731f7ea
commit
b88a6f004b
@ -1,61 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2012 Christopher Eby <kreed@kreed.org>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
-->
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:divider="?android:attr/dividerHorizontal"
|
||||
android:showDividers="middle"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content">
|
||||
<EditText
|
||||
android:id="@+id/playlist_name"
|
||||
android:inputType="text"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:singleLine="true"
|
||||
android:layout_marginBottom="8dip"
|
||||
android:layout_marginLeft="8dip"
|
||||
android:layout_marginRight="8dip" />
|
||||
<LinearLayout
|
||||
style="?android:attr/buttonBarStyle"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
<Button
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:id="@+id/cancel"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@android:string/cancel"
|
||||
android:singleLine="true" />
|
||||
<Button
|
||||
style="?android:attr/buttonBarButtonStyle"
|
||||
android:id="@+id/create"
|
||||
android:layout_width="0px"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:text="@string/create"
|
||||
android:singleLine="true" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
@ -675,10 +675,16 @@ public class LibraryActivity
|
||||
pickSongs(intent, ACTION_ENQUEUE_AS_NEXT);
|
||||
break;
|
||||
case CTX_MENU_RENAME_PLAYLIST: {
|
||||
PlaylistTask playlistTask = new PlaylistTask(intent.getLongExtra("id", -1), intent.getStringExtra("title"));
|
||||
NewPlaylistDialog dialog = new NewPlaylistDialog(this, intent.getStringExtra("title"), R.string.rename, playlistTask);
|
||||
dialog.setDismissMessage(mHandler.obtainMessage(MSG_RENAME_PLAYLIST, dialog));
|
||||
dialog.show();
|
||||
final String playlistName = intent.getStringExtra("title");
|
||||
final long playlistId = intent.getLongExtra("id", -1);
|
||||
PlaylistInputDialog dialog = new PlaylistInputDialog(new PlaylistInputDialog.Callback() {
|
||||
@Override
|
||||
public void onSuccess(String input) {
|
||||
PlaylistTask playlistTask = new PlaylistTask(playlistId, input);
|
||||
mHandler.sendMessage(mHandler.obtainMessage(MSG_RENAME_PLAYLIST, playlistTask));
|
||||
}
|
||||
}, playlistName, R.string.rename);
|
||||
dialog.show(getFragmentManager(), "RenamePlaylistInputDialog");
|
||||
break;
|
||||
}
|
||||
case CTX_MENU_DELETE:
|
||||
|
@ -1,173 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Christopher Eby <kreed@kreed.org>
|
||||
* Copyright (C) 2014 Adrian Ulrich <adrian@blinkenlights.ch>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package ch.blinkenlights.android.vanilla;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
|
||||
/**
|
||||
* Simple dialog to prompt to user to enter a playlist name. Has an EditText to
|
||||
* enter the name and two buttons, create and cancel. Create changes to
|
||||
* overwrite if a name that already exists is selected.
|
||||
*/
|
||||
public class NewPlaylistDialog extends Dialog implements TextWatcher, View.OnClickListener {
|
||||
/**
|
||||
* The create/overwrite button.
|
||||
*/
|
||||
private Button mPositiveButton;
|
||||
/**
|
||||
* The text entry view.
|
||||
*/
|
||||
private EditText mText;
|
||||
/**
|
||||
* Whether the dialog has been accepted. The dialog is accepted if create
|
||||
* was clicked.
|
||||
*/
|
||||
private boolean mAccepted;
|
||||
/**
|
||||
* The text to display initially. When the EditText contains this text, the
|
||||
* positive button will be disabled.
|
||||
*/
|
||||
private final String mInitialText;
|
||||
/**
|
||||
* The resource containing the string describing the default positive
|
||||
* action (e.g. "Create" or "Rename").
|
||||
*/
|
||||
private final int mActionRes;
|
||||
/**
|
||||
* A playlist task that is simply stored in the dialog.
|
||||
*/
|
||||
private final PlaylistTask mPlaylistTask;
|
||||
|
||||
/**
|
||||
* 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, PlaylistTask playlistTask)
|
||||
{
|
||||
super(context);
|
||||
mInitialText = initialText;
|
||||
mActionRes = actionText;
|
||||
mPlaylistTask = playlistTask;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle state)
|
||||
{
|
||||
super.onCreate(state);
|
||||
|
||||
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
|
||||
|
||||
setContentView(R.layout.new_playlist_dialog);
|
||||
|
||||
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.addTextChangedListener(this);
|
||||
mText.setText(mInitialText);
|
||||
mText.requestFocus();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the playlist name currently entered in the dialog.
|
||||
*/
|
||||
public String getText()
|
||||
{
|
||||
return mText.getText().toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the stored playlist task.
|
||||
*/
|
||||
public PlaylistTask getPlaylistTask()
|
||||
{
|
||||
return mPlaylistTask;
|
||||
}
|
||||
|
||||
public void afterTextChanged(Editable s)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
public void onTextChanged(CharSequence text, int start, int before, int count)
|
||||
{
|
||||
String string = text.toString();
|
||||
if (string.equals(mInitialText)) {
|
||||
mPositiveButton.setEnabled(false);
|
||||
} else {
|
||||
mPositiveButton.setEnabled(true);
|
||||
// Update the action button based on whether there is an
|
||||
// existing playlist with the given name.
|
||||
ContentResolver resolver = getContext().getContentResolver();
|
||||
int res = Playlist.getPlaylist(resolver, string) == -1 ? mActionRes : R.string.overwrite;
|
||||
mPositiveButton.setText(res);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the dialog has been accepted. The dialog is accepted
|
||||
* when the create/overwrite button is clicked.
|
||||
*/
|
||||
public boolean isAccepted()
|
||||
{
|
||||
return mAccepted;
|
||||
}
|
||||
|
||||
public void onClick(View view)
|
||||
{
|
||||
switch (view.getId()) {
|
||||
case R.id.create:
|
||||
mAccepted = true;
|
||||
// fall through
|
||||
case R.id.cancel:
|
||||
dismiss();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
@ -371,11 +371,10 @@ public abstract class PlaybackActivity extends Activity
|
||||
static final int MENU_SONG_FAVORITE = 12;
|
||||
static final int MENU_SHOW_QUEUE = 13;
|
||||
static final int MENU_HIDE_QUEUE = 14;
|
||||
static final int MENU_SAVE_QUEUE_AS_PLAYLIST = 15;
|
||||
static final int MENU_DELETE = 16;
|
||||
static final int MENU_EMPTY_QUEUE = 17;
|
||||
static final int MENU_ADD_TO_PLAYLIST = 18;
|
||||
static final int MENU_SHARE = 19;
|
||||
static final int MENU_DELETE = 15;
|
||||
static final int MENU_EMPTY_QUEUE = 16;
|
||||
static final int MENU_ADD_TO_PLAYLIST = 17;
|
||||
static final int MENU_SHARE = 18;
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu)
|
||||
@ -397,11 +396,6 @@ public abstract class PlaybackActivity extends Activity
|
||||
case MENU_EMPTY_QUEUE:
|
||||
PlaybackService.get(this).emptyQueue();
|
||||
break;
|
||||
case MENU_SAVE_QUEUE_AS_PLAYLIST:
|
||||
NewPlaylistDialog dialog = new NewPlaylistDialog(this, null, R.string.create, null);
|
||||
dialog.setOnDismissListener(new SaveAsPlaylistDismiss());
|
||||
dialog.show();
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@ -410,10 +404,9 @@ public abstract class PlaybackActivity extends Activity
|
||||
|
||||
|
||||
/**
|
||||
* Call addToPlaylist with the results from a NewPlaylistDialog stored in
|
||||
* obj.
|
||||
* Same as MSG_ADD_TO_PLAYLIST but creates the new playlist on-the-fly (or overwrites an existing list)
|
||||
*/
|
||||
protected static final int MSG_NEW_PLAYLIST = 0;
|
||||
protected static final int MSG_CREATE_PLAYLIST = 0;
|
||||
/**
|
||||
* Call renamePlaylist with the results from a NewPlaylistDialog stored in
|
||||
* obj.
|
||||
@ -434,7 +427,7 @@ public abstract class PlaybackActivity extends Activity
|
||||
/**
|
||||
* Saves the current queue as a playlist
|
||||
*/
|
||||
protected static final int MSG_SAVE_QUEUE_AS_PLAYLIST = 5;
|
||||
protected static final int MSG_ADD_QUEUE_TO_PLAYLIST = 5;
|
||||
/**
|
||||
* Notification that we changed some playlist members
|
||||
*/
|
||||
@ -444,16 +437,12 @@ public abstract class PlaybackActivity extends Activity
|
||||
public boolean handleMessage(Message message)
|
||||
{
|
||||
switch (message.what) {
|
||||
case MSG_NEW_PLAYLIST: {
|
||||
NewPlaylistDialog dialog = (NewPlaylistDialog)message.obj;
|
||||
if (dialog.isAccepted()) {
|
||||
String name = dialog.getText();
|
||||
long playlistId = Playlist.createPlaylist(getContentResolver(), name);
|
||||
PlaylistTask playlistTask = dialog.getPlaylistTask();
|
||||
playlistTask.name = name;
|
||||
case MSG_CREATE_PLAYLIST: {
|
||||
PlaylistTask playlistTask = (PlaylistTask)message.obj;
|
||||
int nextAction = message.arg1;
|
||||
long playlistId = Playlist.createPlaylist(getContentResolver(), playlistTask.name);
|
||||
playlistTask.playlistId = playlistId;
|
||||
mHandler.sendMessage(mHandler.obtainMessage(MSG_ADD_TO_PLAYLIST, playlistTask));
|
||||
}
|
||||
mHandler.sendMessage(mHandler.obtainMessage(nextAction, playlistTask));
|
||||
break;
|
||||
}
|
||||
case MSG_ADD_TO_PLAYLIST: {
|
||||
@ -461,12 +450,9 @@ public abstract class PlaybackActivity extends Activity
|
||||
addToPlaylist(playlistTask);
|
||||
break;
|
||||
}
|
||||
case MSG_SAVE_QUEUE_AS_PLAYLIST: {
|
||||
String playlistName = (String)message.obj;
|
||||
long playlistId = Playlist.createPlaylist(getContentResolver(), playlistName);
|
||||
PlaylistTask playlistTask = new PlaylistTask(playlistId, playlistName);
|
||||
case MSG_ADD_QUEUE_TO_PLAYLIST: {
|
||||
PlaylistTask playlistTask = (PlaylistTask)message.obj;
|
||||
playlistTask.audioIds = new ArrayList<Long>();
|
||||
|
||||
Song song;
|
||||
PlaybackService service = PlaybackService.get(this);
|
||||
for (int i=0; ; i++) {
|
||||
@ -475,7 +461,6 @@ public abstract class PlaybackActivity extends Activity
|
||||
break;
|
||||
playlistTask.audioIds.add(song.id);
|
||||
}
|
||||
|
||||
addToPlaylist(playlistTask);
|
||||
break;
|
||||
}
|
||||
@ -485,11 +470,8 @@ public abstract class PlaybackActivity extends Activity
|
||||
break;
|
||||
}
|
||||
case MSG_RENAME_PLAYLIST: {
|
||||
NewPlaylistDialog dialog = (NewPlaylistDialog)message.obj;
|
||||
if (dialog.isAccepted()) {
|
||||
long playlistId = dialog.getPlaylistTask().playlistId;
|
||||
Playlist.renamePlaylist(getContentResolver(), playlistId, dialog.getText());
|
||||
}
|
||||
PlaylistTask playlistTask = (PlaylistTask)message.obj;
|
||||
Playlist.renamePlaylist(getContentResolver(), playlistTask.playlistId, playlistTask.name);
|
||||
break;
|
||||
}
|
||||
case MSG_DELETE: {
|
||||
@ -678,19 +660,4 @@ public abstract class PlaybackActivity extends Activity
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fired if user dismisses the create-playlist dialog
|
||||
*
|
||||
* @param dialogInterface the dismissed interface dialog
|
||||
*/
|
||||
class SaveAsPlaylistDismiss implements DialogInterface.OnDismissListener {
|
||||
@Override
|
||||
public void onDismiss(DialogInterface dialogInterface) {
|
||||
NewPlaylistDialog dialog = (NewPlaylistDialog)dialogInterface;
|
||||
if (dialog.isAccepted()) {
|
||||
String playlistName = dialog.getText();
|
||||
mHandler.sendMessage(mHandler.obtainMessage(MSG_SAVE_QUEUE_AS_PLAYLIST, playlistName));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -31,22 +31,18 @@ import android.content.Intent;
|
||||
import android.database.Cursor;
|
||||
import android.os.Bundle;
|
||||
|
||||
|
||||
public class PlaylistDialog extends DialogFragment
|
||||
implements DialogInterface.OnClickListener
|
||||
{
|
||||
|
||||
/**
|
||||
* A class implementing our callback interface
|
||||
*/
|
||||
private Callback mCallback;
|
||||
/**
|
||||
* The intent to act on
|
||||
* The data passed to the callback
|
||||
*/
|
||||
private Intent mIntent;
|
||||
/**
|
||||
* The media adapter to pass on which will be used to query all songs
|
||||
*/
|
||||
private MediaAdapter mAllSrc;
|
||||
private PlaylistDialog.Data mData;
|
||||
/**
|
||||
* Array of all found playlist names
|
||||
*/
|
||||
@ -56,23 +52,33 @@ public class PlaylistDialog extends DialogFragment
|
||||
*/
|
||||
private long[] mItemValue;
|
||||
/**
|
||||
* Magic value, indicating that a new
|
||||
* playlist shall be created
|
||||
* Index of 'create playlist' button
|
||||
*/
|
||||
private final int VALUE_CREATE_PLAYLIST = -1;
|
||||
private final int BUTTON_CREATE_PLAYLIST = 0;
|
||||
/**
|
||||
* Our callback interface
|
||||
*/
|
||||
public interface Callback {
|
||||
void appendToPlaylistFromIntent(Intent intent, MediaAdapter allSource);
|
||||
void createNewPlaylistFromIntent(Intent intent, MediaAdapter allSource);
|
||||
void updatePlaylistFromPlaylistDialog(PlaylistDialog.Data data);
|
||||
}
|
||||
/**
|
||||
* Our data structure
|
||||
*/
|
||||
public class Data {
|
||||
public String name;
|
||||
public long id;
|
||||
public Intent sourceIntent;
|
||||
public MediaAdapter allSource;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new playlist dialog to assemble a playlist using an intent
|
||||
*/
|
||||
PlaylistDialog(Callback callback, Intent intent, MediaAdapter allSource) {
|
||||
mCallback = callback;
|
||||
mIntent = intent;
|
||||
mAllSrc = allSource;
|
||||
mData = new PlaylistDialog.Data();
|
||||
mData.sourceIntent = intent;
|
||||
mData.allSource = allSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -87,7 +93,7 @@ public class PlaylistDialog extends DialogFragment
|
||||
|
||||
// Index 0 is always 'New Playlist...'
|
||||
mItemName[0] = getResources().getString(R.string.new_playlist);
|
||||
mItemValue[0] = VALUE_CREATE_PLAYLIST;
|
||||
mItemValue[0] = -1;
|
||||
|
||||
for (int i = 0 ; i < count; i++) {
|
||||
cursor.moveToPosition(i);
|
||||
@ -104,13 +110,23 @@ public class PlaylistDialog extends DialogFragment
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if (mItemValue[which] == VALUE_CREATE_PLAYLIST) {
|
||||
mCallback.createNewPlaylistFromIntent(mIntent, mAllSrc);
|
||||
} else {
|
||||
Intent copy = new Intent(mIntent);
|
||||
copy.putExtra("playlist", mItemValue[which]);
|
||||
copy.putExtra("playlistName", mItemName[which]);
|
||||
mCallback.appendToPlaylistFromIntent(copy, mAllSrc);
|
||||
switch (which) {
|
||||
case BUTTON_CREATE_PLAYLIST:
|
||||
PlaylistInputDialog newDialog = new PlaylistInputDialog(new PlaylistInputDialog.Callback() {
|
||||
@Override
|
||||
public void onSuccess(String input) {
|
||||
mData.id = -1;
|
||||
mData.name = input;
|
||||
mCallback.updatePlaylistFromPlaylistDialog(mData);
|
||||
}
|
||||
}, "", R.string.create);
|
||||
newDialog.show(getFragmentManager(), "PlaylistInputDialog");
|
||||
break;
|
||||
default:
|
||||
mData.id = mItemValue[which];
|
||||
mData.name = mItemName[which];
|
||||
mCallback.updatePlaylistFromPlaylistDialog(mData);
|
||||
}
|
||||
dialog.dismiss();
|
||||
}
|
||||
}
|
||||
|
148
src/ch/blinkenlights/android/vanilla/PlaylistInputDialog.java
Normal file
148
src/ch/blinkenlights/android/vanilla/PlaylistInputDialog.java
Normal file
@ -0,0 +1,148 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Adrian Ulrich <adrian@blinkenlights.ch>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package ch.blinkenlights.android.vanilla;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
import android.app.DialogFragment;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.InputType;
|
||||
import android.text.TextWatcher;
|
||||
import android.widget.EditText;
|
||||
|
||||
public class PlaylistInputDialog extends DialogFragment
|
||||
implements DialogInterface.OnClickListener, TextWatcher
|
||||
{
|
||||
|
||||
public interface Callback {
|
||||
void onSuccess(String input);
|
||||
}
|
||||
|
||||
/**
|
||||
* A editText instance
|
||||
*/
|
||||
private EditText mEditText;
|
||||
/**
|
||||
* Our callback implementing the PlaylistInputDialog.Callback
|
||||
* interface
|
||||
*/
|
||||
private Callback mCallback;
|
||||
/**
|
||||
* The label of the positive button
|
||||
*/
|
||||
private int mActionRes;
|
||||
/**
|
||||
* The initial text to display
|
||||
*/
|
||||
private String mInitialText;
|
||||
/**
|
||||
* The instance of the alert dialog
|
||||
*/
|
||||
private AlertDialog mDialog;
|
||||
|
||||
/**
|
||||
* Creates a new instance
|
||||
* @param callback the callback to call back
|
||||
* @param initialText the initial value mEditText
|
||||
* @param actionRes the label of the positive button
|
||||
*/
|
||||
PlaylistInputDialog(Callback callback, String initialText, int actionRes) {
|
||||
mCallback = callback;
|
||||
mInitialText = initialText;
|
||||
mActionRes = actionRes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
mEditText = new EditText(getActivity());
|
||||
mEditText.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||
mEditText.addTextChangedListener(this);
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
builder.setTitle(R.string.choose_playlist_name)
|
||||
.setView(mEditText)
|
||||
.setPositiveButton(mActionRes, this)
|
||||
.setNegativeButton(android.R.string.cancel, this);
|
||||
mDialog = builder.create();
|
||||
return mDialog;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the view becomes visible, so we can
|
||||
* set the button positive-button and request focus
|
||||
*/
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
mDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false);
|
||||
mEditText.setText(mInitialText);
|
||||
mEditText.requestFocus();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after mEditText changed
|
||||
*/
|
||||
public void afterTextChanged(Editable s) {
|
||||
// noop
|
||||
}
|
||||
|
||||
/**
|
||||
* Called before mEditText changed
|
||||
*/
|
||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||
// noop
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when mEditText changed
|
||||
*/
|
||||
public void onTextChanged(CharSequence text, int start, int before, int count) {
|
||||
String string = text.toString();
|
||||
if (string.equals(mInitialText)) {
|
||||
mDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false);
|
||||
} else {
|
||||
mDialog.getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(true);
|
||||
ContentResolver resolver = getContext().getContentResolver();
|
||||
int res = Playlist.getPlaylist(resolver, string) == -1 ? mActionRes : R.string.overwrite;
|
||||
mDialog.getButton(DialogInterface.BUTTON_POSITIVE).setText(res);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
switch (which) {
|
||||
case DialogInterface.BUTTON_NEGATIVE:
|
||||
// noop
|
||||
break;
|
||||
case DialogInterface.BUTTON_POSITIVE:
|
||||
mCallback.onSuccess(mEditText.getText().toString());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
dialog.dismiss();
|
||||
}
|
||||
}
|
@ -126,11 +126,13 @@ public class SlidingPlaybackActivity extends PlaybackActivity
|
||||
menu.add(0, MENU_HIDE_QUEUE, 20, R.string.hide_queue);
|
||||
menu.add(0, MENU_CLEAR_QUEUE, 20, R.string.dequeue_rest);
|
||||
menu.add(0, MENU_EMPTY_QUEUE, 20, R.string.empty_the_queue);
|
||||
menu.add(0, MENU_SAVE_QUEUE_AS_PLAYLIST, 20, R.string.save_as_playlist);
|
||||
menu.add(0, MENU_SAVE_QUEUE, 20, R.string.save_as_playlist);
|
||||
onSlideFullyExpanded(false);
|
||||
return true;
|
||||
}
|
||||
|
||||
static final int MENU_SAVE_QUEUE = 300;
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
@ -140,13 +142,18 @@ public class SlidingPlaybackActivity extends PlaybackActivity
|
||||
case MENU_HIDE_QUEUE:
|
||||
mSlidingView.hideSlide();
|
||||
break;
|
||||
case MENU_SAVE_QUEUE:
|
||||
PlaylistDialog dialog = new PlaylistDialog(this, null, null);
|
||||
dialog.show(getFragmentManager(), "PlaylistDialog");
|
||||
break;
|
||||
default:
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static final int CTX_MENU_ADD_TO_PLAYLIST = 300;
|
||||
|
||||
static final int CTX_MENU_ADD_TO_PLAYLIST = 300;
|
||||
|
||||
@Override
|
||||
public boolean onContextItemSelected(MenuItem item) {
|
||||
@ -166,32 +173,28 @@ public class SlidingPlaybackActivity extends PlaybackActivity
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by PlaylistDialog.Callback to prompt for the new
|
||||
* playlist name
|
||||
*
|
||||
* @param intent The intent holding the selected data
|
||||
*/
|
||||
public void createNewPlaylistFromIntent(Intent intent, MediaAdapter allSource) {
|
||||
PlaylistTask playlistTask = new PlaylistTask(-1, null);
|
||||
playlistTask.query = buildQueryFromIntent(intent, true, allSource);
|
||||
NewPlaylistDialog dialog = new NewPlaylistDialog(this, null, R.string.create, playlistTask);
|
||||
dialog.setDismissMessage(mHandler.obtainMessage(MSG_NEW_PLAYLIST, dialog));
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by PlaylistDialog.Callback to append data to
|
||||
* a playlist
|
||||
*
|
||||
* @param intent The intent holding the selected data
|
||||
*/
|
||||
public void appendToPlaylistFromIntent(Intent intent, MediaAdapter allSource) {
|
||||
long playlistId = intent.getLongExtra("playlist", -1);
|
||||
String playlistName = intent.getStringExtra("playlistName");
|
||||
PlaylistTask playlistTask = new PlaylistTask(playlistId, playlistName);
|
||||
playlistTask.query = buildQueryFromIntent(intent, true, allSource);
|
||||
mHandler.sendMessage(mHandler.obtainMessage(MSG_ADD_TO_PLAYLIST, playlistTask));
|
||||
public void updatePlaylistFromPlaylistDialog(PlaylistDialog.Data data) {
|
||||
PlaylistTask playlistTask = new PlaylistTask(data.id, data.name);
|
||||
int action = -1;
|
||||
|
||||
if (data.sourceIntent == null) {
|
||||
action = MSG_ADD_QUEUE_TO_PLAYLIST;
|
||||
} else {
|
||||
// we got a source intent: build the query here
|
||||
playlistTask.query = buildQueryFromIntent(data.sourceIntent, true, data.allSource);
|
||||
action = MSG_ADD_TO_PLAYLIST;
|
||||
}
|
||||
if (playlistTask.playlistId < 0) {
|
||||
mHandler.sendMessage(mHandler.obtainMessage(MSG_CREATE_PLAYLIST, action, 0, playlistTask));
|
||||
} else {
|
||||
mHandler.sendMessage(mHandler.obtainMessage(action, playlistTask));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -327,7 +330,7 @@ public class SlidingPlaybackActivity extends PlaybackActivity
|
||||
if (mMenu == null)
|
||||
return; // not initialized yet
|
||||
|
||||
final int[] slide_visible = {MENU_HIDE_QUEUE, MENU_CLEAR_QUEUE, MENU_EMPTY_QUEUE, MENU_SAVE_QUEUE_AS_PLAYLIST};
|
||||
final int[] slide_visible = {MENU_HIDE_QUEUE, MENU_CLEAR_QUEUE, MENU_EMPTY_QUEUE, MENU_SAVE_QUEUE};
|
||||
final int[] slide_hidden = {MENU_SHOW_QUEUE, MENU_SORT, MENU_DELETE, MENU_ENQUEUE_ALBUM, MENU_ENQUEUE_ARTIST, MENU_ENQUEUE_GENRE, MENU_ADD_TO_PLAYLIST, MENU_SHARE};
|
||||
|
||||
for (int id : slide_visible) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user