package com.teleca.jamendo.activity.playlist;
import java.util.ArrayList;
import org.json.JSONException;
import com.teleca.jamendo.MyApplication;
import com.teleca.jamendo.activity.playview.PlayMethod;
import com.teleca.jamendo.adapter.ItemListViewAdp;
import com.teleca.jamendo.adapter.SplitListViewAdp;
import com.teleca.jamendo.api.IDatabase;
import com.teleca.jamendo.api.IServerApi;
import com.teleca.jamendo.api_impl.DatabaseImpl;
import com.teleca.jamendo.api_impl.ServerApiImpl;
import com.teleca.jamendo.model.MainItem;
import com.teleca.jamendo.model.PlaylistRemote;
import com.teleca.jamendo.model.ErrorMsg;
import com.teleca.jamendo.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.ViewFlipper;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
/**
* <code>BrowsePlaylistActivity</code>
*
* @author Lukasz Wisniewski
*/
public class PlaylistView extends Activity {
public static final int SAVE_REQUEST_CODE = 666668;
private PlayMethod mPlaylist;
private Mode mCurrentMode;
private SplitListViewAdp mSeparatedAdapter;
/**
* Modes in which this activity can be launched (top bar)
*/
public static enum Mode {
/**
* Normal navigation
*/
Normal,
/**
* like Normal but removes activity from the stack
*/
Load,
/**
* Save button at the top bar
*/
Save
}
/**
* Launch this Activity from the outside
*
* @param c
*/
public static void launch(Context c, Mode mode) {
Intent intent = new Intent(c, PlaylistView.class);
intent.putExtra("mode", mode);
c.startActivity(intent);
}
/**
* Save playlist, launch as a subActivity
*
* @param a
* @param playlist
*/
public static void launchSave(Activity a, PlayMethod playlist) {
Intent intent = new Intent(a, PlaylistView.class);
intent.putExtra("mode", Mode.Save);
intent.putExtra("playlist", playlist);
a.startActivityForResult(intent, SAVE_REQUEST_CODE);
}
// layout
private ListView mPlaylistsListView;
private Button mButton;
private EditText mEditText;
private ViewFlipper mViewFlipper;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.browse_playlist);
mPlaylistsListView = (ListView) findViewById(R.id.PlaylistsListView);
mPlaylistsListView.setOnItemLongClickListener(mItemLongClick);
mButton = (Button) findViewById(R.id.BrowseButton);
mEditText = (EditText) findViewById(R.id.BrowseEditText);
mViewFlipper = (ViewFlipper) findViewById(R.id.BrowsePlaylistViewFlipper);
setupMode((Mode) getIntent().getSerializableExtra("mode"));
}
/**
* Save playlist (actually overwrite one selected from the ListView)
*/
private OnItemClickListener mSaveListListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int index, long time) {
MainItem entry = (MainItem) adapterView.getAdapter().getItem(
index);
String playlistName = entry.getText();
savePlaylist(playlistName);
}
};
/**
* Load playlist (normal or load mode)
*/
private OnItemClickListener mLoadListListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int index, long time) {
MainItem entry = (MainItem) adapterView.getAdapter().getItem(
index);
if (entry instanceof PlaylistPurpleEntry) {
// load from server
// PlaylistView.launch(PlaylistView.this,
// ((PlaylistPurpleEntry) entry).getPlaylistRemote());
} else {
String playlistName = entry.getText();
PlayMethod playlist = new DatabaseImpl(
PlaylistView.this).loadPlaylist(playlistName);
MyApplication.getInstance().getPlayerEngineInterface()
.openPlaylist(playlist);
MyApplication.getInstance().getPlayerEngineInterface()
.stop();
// leave the activity on the stack
if (mCurrentMode == Mode.Normal) {
// PlaylistView.launch(PlaylistView.this, false);
}
}
// remove activity from the stack
if (mCurrentMode == Mode.Load) {
finish();
}
}
};
/**
* Long press on list, remove playlist, ask for confirmation before
*/
private OnItemLongClickListener mItemLongClick = new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View arg1,
int position, long arg3) {
MainItem entry = (MainItem) adapterView.getAdapter().getItem(
position);
mPlaylistName = entry.getText();
showDialog(DELETE_YES_NO_MESSAGE);
return true;
}
};
/**
* Saves playlist
*/
private OnClickListener mSaveButtonListener = new OnClickListener() {
@Override
public void onClick(View v) {
savePlaylist(mEditText.getText().toString());
}
};
/**
* Creates new playlist
*/
private OnClickListener mNewButtonListener = new OnClickListener() {
@Override
public void onClick(View v) {
String playlistName = mEditText.getText().toString();
if (playlistName.length() == 0 || playlistName.startsWith(" "))
return;
IDatabase db = new DatabaseImpl(PlaylistView.this);
if (db.loadPlaylist(playlistName) != null) {
Toast.makeText(PlaylistView.this,
R.string.playlist_exists, Toast.LENGTH_SHORT).show();
return;
}
PlayMethod playlist = new PlayMethod();
db.savePlaylist(playlist, playlistName);
loadPlaylists();
}
};
/**
* Apply mode to the view
*
* @param mode
*/
private void setupMode(Mode mode) {
this.mCurrentMode = mode;
if (mCurrentMode == Mode.Save) {
mPlaylist = (PlayMethod) getIntent().getSerializableExtra("playlist");
mButton.setText(R.string.save);
mButton.setOnClickListener(mSaveButtonListener);
mPlaylistsListView.setOnItemClickListener(mSaveListListener);
}
if (mCurrentMode == Mode.Load) {
mButton.setText(R.string.load);
mPlaylistsListView.setOnItemClickListener(mLoadListListener);
}
if (mCurrentMode == Mode.Normal) {
mButton.setText(R.string.neew);
mButton.setOnClickListener(mNewButtonListener);
mPlaylistsListView.setOnItemClickListener(mLoadListListener);
}
loadPlaylists();
}
/**
* Loads available playlists from database to the list view
*/
private void loadPlaylists() {
ItemListViewAdp purpleAdapter = new ItemListViewAdp(this);
ArrayList<MainItem> list = new ArrayList<MainItem>();
ArrayList<String> playlists = new DatabaseImpl(this)
.getAvailablePlaylists();
for (String playlistName : playlists) {
MainItem entry = new MainItem(null, playlistName);
list.add(entry);
}
purpleAdapter.setList(list);
// check if we have personalized client
String userName = PreferenceManager.getDefaultSharedPreferences(this)
.getString("user_name", null);
if (mCurrentMode.equals(Mode.Save) || userName == null
|| userName.length() == 0) {
mPlaylistsListView.setAdapter(purpleAdapter);
} else {
mSeparatedAdapter = new SplitListViewAdp(this);
mSeparatedAdapter.addSection("Playlists on the phone",
purpleAdapter);
mPlaylistsListView.setAdapter(mSeparatedAdapter);
new RemotePlaylistTask().execute(userName);
}
setupListView();
}
/**
* Saves playlist to the database and quits the activity
*
* @param playlistName
*/
private void savePlaylist(String playlistName) {
IDatabase db = new DatabaseImpl(this);
if (db.playlistExists(playlistName)) {
mPlaylistName = playlistName;
showDialog(OVERWRITE_YES_NO_MESSAGE);
} else {
db.savePlaylist(mPlaylist, playlistName);
setResult(RESULT_OK, null);
finish();
}
}
private String mPlaylistName;
private static final int OVERWRITE_YES_NO_MESSAGE = 667;
private static final int DELETE_YES_NO_MESSAGE = 668;
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case OVERWRITE_YES_NO_MESSAGE:
return new AlertDialog.Builder(this).setTitle(
R.string.overwrite_playlist_q).setPositiveButton(
R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
// User clicked OK, overwrite the playlist
IDatabase db = new DatabaseImpl(
PlaylistView.this);
db.savePlaylist(mPlaylist, mPlaylistName);
setResult(RESULT_OK, null);
finish();
}
}).setNegativeButton(R.string.cancel, null).create();
case DELETE_YES_NO_MESSAGE:
return new AlertDialog.Builder(this).setTitle(
R.string.delete_playlist_q).setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
// User clicked OK, delete the playlist
IDatabase db = new DatabaseImpl(
PlaylistView.this);
db.deletePlaylist(mPlaylistName);
loadPlaylists();
}
}).setNegativeButton(R.string.cancel, null).create();
default:
return null;
}
}
private void setupListView() {
if (mPlaylistsListView.getCount() > 0) {
mViewFlipper.setDisplayedChild(0);
} else {
mViewFlipper.setDisplayedChild(1);
}
}
public class RemotePlaylistTask extends
AsyncTask<String, ErrorMsg, PlaylistRemote[]> {
String mUserName;
@Override
protected PlaylistRemote[] doInBackground(String... params) {
String userName = params[0];
IServerApi service = new ServerApiImpl();
mUserName = userName;
try {
return service.getUserPlaylist(userName);
} catch (JSONException e) {
return null;
} catch (ErrorMsg e) {
publishProgress(e);
return null;
}
}
@Override
protected void onPostExecute(PlaylistRemote[] result) {
super.onPostExecute(result);
if (result == null || result.length == 0)
return;
ArrayList<MainItem> list = new ArrayList<MainItem>();
for (int i = 0; i < result.length; i++) {
PlaylistPurpleEntry entry = new PlaylistPurpleEntry(null,
result[i].getName());
entry.setPlaylistRemote(result[i]);
list.add(entry);
}
ItemListViewAdp remotePlaylistAdapter = new ItemListViewAdp(
PlaylistView.this);
remotePlaylistAdapter.setList(list);
mPlaylistsListView.setAdapter(null);
mSeparatedAdapter.addSection("Playlists on the server",
remotePlaylistAdapter);
// mSeparatedAdapter.notifyDataSetChanged();
mPlaylistsListView.setAdapter(mSeparatedAdapter);
}
@Override
protected void onProgressUpdate(ErrorMsg... values) {
Toast.makeText(PlaylistView.this, values[0].getMessage(),
Toast.LENGTH_LONG).show();
super.onProgressUpdate(values);
}
}
private class PlaylistPurpleEntry extends MainItem {
private PlaylistRemote mPlaylistRemote;
public PlaylistPurpleEntry(Integer drawable, String text) {
super(drawable, text);
}
public void setPlaylistRemote(PlaylistRemote mPlaylistRemote) {
this.mPlaylistRemote = mPlaylistRemote;
}
@SuppressWarnings("unused")
public PlaylistRemote getPlaylistRemote() {
return mPlaylistRemote;
}
}
}