package org.droidklavier.activity; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; import android.widget.ToggleButton; import org.droidklavier.Droidklavier; import org.droidklavier.R; import org.droidklavier.db.Album; import org.droidklavier.db.DAO; import org.droidklavier.db.Song; import org.droidklavier.dialog.BalanceDialog; import org.droidklavier.dialog.ConnectDialog; import org.droidklavier.dialog.MainVolumeDialog; import org.droidklavier.dialog.SearchDialog; import org.droidklavier.rc.RC; import java.util.Locale; public class Player extends FragmentActivity { // Intent request codes public static final int ALBUM_LIST = 0; public static final int SONG_LIST = 1; public static final int SEARCH = 2; public static final int SETTINGS = 3; // Intent Extras public static final String SOURCE = "org.droidklavier.gui.source"; public static final String ALBUM = "org.droidklavier.gui.album"; public static final String SONG = "org.droidklavier.gui.song"; public static final String KEYWORD = "org.droidklavier.gui.keyword"; public static final String SEARCH_RESULT = "org.droidklavier.gui.searchType"; // Layout Views // private TextView mTitle; private TextView mTextViewAlbumTitle; private TextView mTextViewSongTitle; private TextView mTextSongTime; private TextView mTextSongLength; // private ProgressBar mTitleProgressBar; private SeekBar mSeekBarSongPosition; private Button mButtonLibrary; private Button mButtonSearch; private Button mButtonPlay; private Button mButtonPause; private Button mButtonPrev; private Button mButtonNext; private Button mButtonVolume; private Button mButtonBalance; private ToggleButton mButtonQuietStatus; private ToggleButton mButtonRcsStatus; private ProgressDialog mSearchingProgressDialog; private ProgressDialog mConnectingProgressDialog; private ProgressDialog mLoadingDialog; private Dialog mDialog; private DialogFragment mDialogFragment; private Droidklavier mDroidklavier; private String mSource; private Album mAlbum; private Song mSong; private String mKeyword; private boolean mLoading = false; private boolean mPlaying = false; private boolean mSeeking = false; private boolean mBrowsing = false; private boolean mSearching = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mDroidklavier = (Droidklavier) getApplication(); mButtonLibrary = (Button) findViewById(R.id.button_library); mButtonLibrary.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!mLoading) { showLibraryDialog(); } } }); mButtonSearch = (Button) findViewById(R.id.button_search); mButtonSearch.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showSearchDialog(); } }); mTextViewAlbumTitle = (TextView) findViewById(R.id.text_album_title); mTextViewAlbumTitle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!mLoading) { startAlbumListActivity(mSource); } } }); mTextViewSongTitle = (TextView) findViewById(R.id.text_song_title); mTextViewSongTitle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!mLoading) { startSongListActivity(mSource, mAlbum); } } }); mSeekBarSongPosition = (SeekBar) findViewById(R.id.song_seek_bar); mSeekBarSongPosition.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (mLoading) { event.setAction(MotionEvent.ACTION_CANCEL); } else { mSeeking = true; } return false; } }); mSeekBarSongPosition.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { mTextSongTime.setText(getSongTime(progress)); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { mDroidklavier.sendTCPMessage(RC .search(mSeekBarSongPosition.getProgress())); } }); mSeekBarSongPosition.setIndeterminate(false); mButtonVolume = (Button) findViewById(R.id.button_volume); mButtonVolume.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showMainVolumeDialog(); } }); mButtonBalance = (Button) findViewById(R.id.button_balance); mButtonBalance.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showBalanceDialog(); } }); mTextSongLength = (TextView) findViewById(R.id.text_song_length); mTextSongTime = (TextView) findViewById(R.id.text_song_time); mButtonPlay = (Button) findViewById(R.id.button_play); mButtonPlay.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mDroidklavier.sendTCPMessage(RC.play()); } }); mButtonPause = (Button) findViewById(R.id.button_pause); mButtonPause.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mDroidklavier.sendTCPMessage(RC.pause()); } }); if (mButtonPlay.getVisibility() == Button.VISIBLE) { mButtonPause.setVisibility(Button.GONE); } mButtonPrev = (Button) findViewById(R.id.button_prev); mButtonPrev.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mDroidklavier.sendTCPMessage(RC.prev()); } }); mButtonNext = (Button) findViewById(R.id.button_next); mButtonNext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mDroidklavier.sendTCPMessage(RC.next()); } }); mButtonQuietStatus = (ToggleButton) findViewById(R.id.button_quiet); mButtonQuietStatus.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String mode = (((ToggleButton) v).isChecked()) ? RC.QUIET_STATUS_QUIET : RC.QUIET_STATUS_ACOUSTIC; mDroidklavier.sendTCPMessage(RC.quietStatus(mode)); } }); mButtonRcsStatus = (ToggleButton) findViewById(R.id.button_standby); mButtonRcsStatus.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (((ToggleButton) v).isChecked()) { mDroidklavier.sendTCPMessage(RC.setRcsStatus("on")); } else { mDroidklavier.sendTCPMessage(RC.setRcsStatus("standby")); } } }); mSearchingProgressDialog = new ProgressDialog(this); mSearchingProgressDialog.setTitle(getString(R.string.search)); mSearchingProgressDialog.setMessage(getString(R.string.searching)); mSearchingProgressDialog.setCancelable(false); mSearchingProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.stop), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mDroidklavier.sendTCPMessage(RC.fileFuncCancel("")); } }); mConnectingProgressDialog = new ProgressDialog(this); mConnectingProgressDialog.setTitle(getString(R.string.connect)); mConnectingProgressDialog.setMessage(getString(R.string.connecting)); mConnectingProgressDialog.setCancelable(false); mConnectingProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.stop), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); mLoadingDialog = new ProgressDialog(this); mLoadingDialog.setMessage(getString(R.string.loading)); if (mDroidklavier.isConnected()) { setActionBarStatus(getString(R.string.connected) + mDroidklavier.getConnectedAddr()); } else { setActionBarStatus(getString(R.string.disconnected)); } } public void setActionBarStatus(String status) { getActionBar().setSubtitle(status); } @Override public void onStart() { super.onStart(); mDroidklavier.setPlayer(this); if (!mDroidklavier.isConnected()) { connect(); } else { mDroidklavier.sendTCPMessage(RC.rcStatus()); mDroidklavier.sendTCPMessage(RC.getRcsStatus()); mDroidklavier.sendTCPMessage(RC.quietStatus()); } statusLoading(mDroidklavier.isLoading()); mBrowsing = false; dismissDialogs(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); mDroidklavier.setPlayer(null); mDroidklavier.disconnect(); } public void connect() { dismissDialogs(); mDialog = mConnectingProgressDialog; mDialog.show(); mDroidklavier.reconnect(); } public void connectionSuccess() { dismissDialogs(); String connectedAddr = mDroidklavier.getConnectedAddr(); setActionBarStatus(String.format(getString(R.string.connected), connectedAddr)); infoMessage(String.format(getString(R.string.connection_success), connectedAddr)); mDroidklavier.sendTCPMessage(RC.rcStatus()); mDroidklavier.sendTCPMessage(RC.getRcsStatus()); mDroidklavier.sendTCPMessage(RC.quietStatus()); } public void connectionFailed() { infoMessage(R.string.connection_failed); showConnectDialog(); } public void connectionLost() { setActionBarStatus(getString(R.string.disconnected)); } public boolean isPianoOn() { return mButtonRcsStatus != null && mButtonRcsStatus.isChecked(); } public boolean isPlaying() { return mPlaying; } public boolean isSearching() { return mSearching; } public void infoMessage(String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } public void infoMessage(int string) { Toast.makeText(this, getString(string), Toast.LENGTH_SHORT).show(); } public void updateRCSStatus(String status) { if (status.equals("on")) { mButtonRcsStatus.setChecked(true); } else if (status.equals("standby")) { mButtonRcsStatus.setChecked(false); } } public void updateQuietStatus(String mode) { if (mode.equals(RC.QUIET_STATUS_QUIET)) { mButtonQuietStatus.setChecked(true); } else if (mode.equals(RC.QUIET_STATUS_ACOUSTIC)) { mButtonQuietStatus.setChecked(false); } } public void updateSeekingStatus(boolean seeking) { mSeeking = seeking; } public void updateSeqStatus(String status, String source, int albumId, int selSongNo, int time) { if (mSource == null || mAlbum == null || mSong == null) { updatePlaybackInfo(source, albumId, selSongNo); } if (status.equals("play")) { if (!mPlaying) { mButtonPlay.setVisibility(Button.GONE); mButtonPause.setVisibility(Button.VISIBLE); mPlaying = true; } if (!mSeeking && !mLoading) { mSeekBarSongPosition.setProgress(time); mTextSongTime.setText(getSongTime(time)); } if (mLoading) { updatePlaybackInfo(source, albumId, selSongNo); statusLoading(false); } } else if (status.equals("pause") || status.equals("stop")) { if (mPlaying) { mButtonPlay.setVisibility(Button.VISIBLE); mButtonPause.setVisibility(Button.GONE); mPlaying = false; } if (!mSeeking && !mLoading) { mSeekBarSongPosition.setProgress(time); mTextSongTime.setText(getSongTime(time)); } if (mLoading) { updatePlaybackInfo(source, albumId, selSongNo); statusLoading(false); } } else if (status.equals("load")) { statusLoading(true); } else if (status.equals("loaded")) { updatePlaybackInfo(source, albumId, selSongNo); statusLoading(false); } } private void updatePlaybackInfo(String source, int albumId, int selSongNo) { if (checkSource(source)) { mSource = source; new UpdateAlbumTask().execute(albumId); new UpdateSongTask().execute(albumId, selSongNo); } } private void statusLoading(boolean loading) { if (loading) { mDialog = mLoadingDialog; mDialog.show(); mSeekBarSongPosition.setIndeterminate(true); } else { mLoadingDialog.dismiss(); mSeekBarSongPosition.setIndeterminate(false); } mLoading = loading; mDroidklavier.setLoading(loading); } private boolean checkSource(String source) { if (source != null) { String checkSource = source.toLowerCase(Locale.getDefault()); return checkSource.indexOf(DAO.PIANOSOFT) > -1 || checkSource.indexOf(DAO.USER) > -1 || checkSource.indexOf(DAO.SEARCH_RESULT) > -1; } return false; } private String getSongTime(int millis) { int seconds = (millis / 1000); int minutes = seconds / 60; seconds -= minutes * 60; return String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds); } public void searchStart(String sourceId, String keyword) { mSearching = true; mKeyword = keyword; mDroidklavier.sendTCPMessage(RC.songSearch(sourceId, mKeyword)); mDialog = mSearchingProgressDialog; mDialog.show(); } public void searchProcessing(String message) { if (mSearching && mSearchingProgressDialog != null) { mSearchingProgressDialog.setMessage(message); } } public void searchEnd(String title, String message) { if (mSearching && mSearchingProgressDialog != null) { mSearching = false; mSearchingProgressDialog.dismiss(); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(title) .setMessage(message) .setCancelable(false) .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { startAlbumListActivity(DAO.SEARCH_RESULT); } }) .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); } }).create().show(); } } /** * DIALOGS * */ protected void showConnectDialog() { dismissDialogs(); FragmentManager fm = getSupportFragmentManager(); mDialogFragment = new ConnectDialog(); mDialogFragment.show(fm, "fragment_connect"); } protected void showSearchDialog() { dismissDialogs(); FragmentManager fm = getSupportFragmentManager(); mDialogFragment = new SearchDialog(); mDialogFragment.show(fm, "fragment_search"); } protected void showLibraryDialog() { final String[] libraries = getResources().getStringArray( R.array.libraries); dismissDialogs(); mDialog = new AlertDialog.Builder(this).setTitle(R.string.open_library) .setItems(libraries, new DialogInterface.OnClickListener() { public void onClick(DialogInterface d, int choice) { startAlbumListActivity(libraries[choice]); } }).create(); mDialog.show(); } protected void showMainVolumeDialog() { dismissDialogs(); FragmentManager fm = getSupportFragmentManager(); mDialogFragment = new MainVolumeDialog(); mDialogFragment.show(fm, "fragment_main_volume"); } protected void showBalanceDialog() { dismissDialogs(); FragmentManager fm = getSupportFragmentManager(); mDialogFragment = new BalanceDialog(); mDialogFragment.show(fm, "fragment_balance"); } private void dismissDialogs() { if (mDialog != null) { mDialog.dismiss(); } if (mDialogFragment != null) { mDialogFragment.dismiss(); } } /** * ACTIVITIES * */ private void startAlbumListActivity(String source) { if (mDroidklavier.isConnected() && checkSource(source) && !mBrowsing) { mBrowsing = true; Intent intent = new Intent(this, AlbumList.class); intent.putExtra(SOURCE, source.toLowerCase(Locale.getDefault())); intent.putExtra(Player.KEYWORD, mKeyword); startActivityForResult(intent, ALBUM_LIST); } } private void startSongListActivity(String source, Album album) { if (mDroidklavier.isConnected() && checkSource(source) && !mBrowsing) { mBrowsing = true; Intent intent = new Intent(this, SongList.class); intent.putExtra(Player.SOURCE, source.toLowerCase(Locale.getDefault())); intent.putExtra(Player.ALBUM, album); startActivityForResult(intent, SONG_LIST); } } public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case ALBUM_LIST: case SONG_LIST: if (resultCode == Activity.RESULT_OK) { if (!isPianoOn()) { Toast.makeText(this, R.string.turn_piano_on, Toast.LENGTH_SHORT).show(); } else { mSource = data.getStringExtra(SOURCE); mAlbum = data.getParcelableExtra(ALBUM); mSong = data.getParcelableExtra(SONG); mDroidklavier.sendTCPMessage(RC.loadSongSource(mSource, mAlbum.albumId, mSong.displayOrder)); statusLoading(true); } } mBrowsing = false; break; } } /** * OPTIONS MENU * */ @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.option_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.reconnect: showConnectDialog(); return true; // case R.id.settings: // Intent intentSettings = new Intent(this, SettingsActivity.class); // startActivityForResult(intentSettings, SETTINGS); // return true; } return false; } /** * ASYNCTASKS * */ private class UpdateAlbumTask extends AsyncTask<Integer, Void, Album> { @Override protected Album doInBackground(Integer... params) { int albumId = (Integer) params[0]; Album album = mDroidklavier.getDAO().getAlbum(mSource, albumId); return album; } @Override protected void onPostExecute(Album result) { super.onPostExecute(result); if (result != null) { mAlbum = result; mTextViewAlbumTitle.setText(mAlbum.title); } } } private class UpdateSongTask extends AsyncTask<Integer, Void, Song> { @Override protected Song doInBackground(Integer... params) { Song song; int albumId = (Integer) params[0]; int selSongNo = (Integer) params[1]; if (mSource.equals(DAO.SEARCH_RESULT)) { song = mDroidklavier.getDAO().getSearchResultSong(selSongNo, albumId); } else { song = mDroidklavier.getDAO().getSong(mSource, albumId, selSongNo); } return song; } @Override protected void onPostExecute(Song result) { super.onPostExecute(result); if (result != null) { mSong = result; mTextViewSongTitle.setText(mSong.title); mTextSongLength.setText(getSongTime(mSong.length)); mSeekBarSongPosition.setMax(mSong.length); } } } }