package com.trans.music.search;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import com.jokes.search.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.media.MediaPlayer;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.*;
import android.net.Uri;
import android.opengl.Visibility;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.SeekBar;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class MusicPage extends Activity implements
SeekBar.OnSeekBarChangeListener {
boolean mTrackAdapterCreated = false;
SeekBar mSeekBar;
static final int CONNECTING = 2;
static final int DOWNLOAD_MP3FILE = 3;
static final int CONNECT_ERROR = 7;
boolean mProgressDialogIsOpen = false;
int mSongProgress;
long mSongPosition;
long mSongDuration;
ArrayList<String> mMp3Local;
int locPointer = 0;
boolean mDownloadFinish = false;
boolean mIsPlaying = false;
String mMp3Songer;
String mMp3Title;
//float mRate;
String mAlbm;
String m_CurDownloadFile;
Button btnPreview;
Button btnDownload;
Button btnQueue;
Button btnLyric;
private boolean mPaused = false, mDownloading = false;
private static final int REFRESH = 1;
private static final int RM_CON_DIALOG = 2;
private ImageView mPlayStop;
private ListView listSearchOthers;
ProgressDialog mProgressDialog, mProgressDialogSearch,
mProgressDialogPrepare, mProgressDownload;
MediaScannerConnection mScanner;
private MediaPlayer mPlayer;
private void getMediaInfo(Intent intent) {
mMp3Local = intent.getStringArrayListExtra(Const.MP3LOC);
mMp3Title = intent.getStringExtra(Const.MP3TITLE);
mMp3Songer = intent.getStringExtra(Const.MP3SONGER);
mAlbm = intent.getStringExtra(Const.MP3ALBM);
//mRate = Float.parseFloat(intent.getStringExtra(Const.MP3RATE));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.getMediaInfo(this.getIntent());
setContentView(R.layout.music_display);
AdListener.createAds(this);
btnPreview = (Button) findViewById(R.id.preview);
btnPreview.setOnClickListener(previewClick);
btnDownload = (Button) findViewById(R.id.download);
btnDownload.setOnClickListener(downloadClick);
btnQueue = (Button) findViewById(R.id.queue);
btnQueue.setOnClickListener(queueClick);
btnLyric = (Button) findViewById(R.id.lyric);
btnLyric.setOnClickListener(lyricClick);
mSeekBar = (SeekBar) findViewById(R.id.play_seek_bar);
mSeekBar.setOnSeekBarChangeListener(this);
mSeekBar.setMax(1000);
SeekBarSetSecondaryProgress(1000);
mSeekBar.setEnabled(false);
mPlayStop = (ImageView) findViewById(R.id.play_stop);
mPlayStop.setOnClickListener(mPlayStopListener);
mPlayStop.setEnabled(false);
((TextView) findViewById(R.id.row_title)).setText(this
.getString(R.string.title)
+ mMp3Title);
((TextView) findViewById(R.id.row_artist)).setText(this
.getString(R.string.artist)
+ mMp3Songer);
RatingBar rb = ((RatingBar) findViewById(R.id.row_small_ratingbar));
rb.setIsIndicator(true);
//rb.setRating(mRate);
listSearchOthers = (ListView) findViewById(R.id.list_searchOthers);
ArrayList<HashMap<String, String>> ringlist = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map1 = new HashMap<String, String>();
HashMap<String, String> map2 = new HashMap<String, String>();
HashMap<String, String> map3 = new HashMap<String, String>();
map1.put("ItemTitle", this.getString(R.string.search_more) + " "
+ this.mMp3Songer);
map2.put("ItemTitle", this.getString(R.string.search_more) + " "
+ this.mMp3Title);
map3.put("ItemTitle", this.getString(R.string.search_more) + " "
+ this.mAlbm);
ringlist.add(map1);
ringlist.add(map2);
ringlist.add(map3);
SimpleAdapter mSearchOthers = new SimpleAdapter(this, ringlist,
R.layout.ring_list_item, new String[] { "ItemTitle" },
new int[] { R.id.ringListItem1 });
listSearchOthers.setAdapter(mSearchOthers);
listSearchOthers.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
switch (position) {
// 0 is the singer name create in before 1 is the title.
case 0:
Intent intent1 = new Intent();
intent1.putExtra(Const.Key, mMp3Songer);
intent1.setClass(MusicPage.this, SearchList.class);
startActivityForResult(intent1, 1);
return;
case 1:
Intent intent2 = new Intent();
intent2.putExtra(Const.Key, mMp3Title);
intent2.setClass(MusicPage.this, SearchList.class);
startActivityForResult(intent2, 1);
return;
case 2:
Intent intent3 = new Intent();
intent3.putExtra(Const.Key, mAlbm);
intent3.setClass(MusicPage.this, SearchList.class);
startActivityForResult(intent3, 1);
}
}
});
mPlayer = new MediaPlayer();
mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Toast.makeText(MusicPage.this, R.string.play_error, Toast.LENGTH_SHORT).show();
return false;
}
});
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
try {
mPlayer.stop();
mPlayer.prepare();
} catch (IllegalStateException e) {
} catch (IOException e) {
}
SeekBarInit();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
mPlayer.stop();
mPlayer.release();
} catch (Exception e) {
}
}
private OnClickListener mPlayStopListener = new OnClickListener() {
public void onClick(View v) {
try {
if (mPaused == false) {
//mService.pause();
mPlayer.pause();
mPlayStop.setImageResource(R.drawable.play);
mPaused = true;
} else {
//mService.play();
mPlayer.start();
mPlayStop.setImageResource(R.drawable.stop);
mPaused = false;
long next = refreshSeekBarNow();
queueNextRefresh(next);
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
private long refreshSeekBarNow() {
try {
//long pos = mService.position();
int pos = mPlayer.getCurrentPosition();
long remaining = 1000 - (pos % 1000);
if ((pos >= 0) && (mSongDuration > 0)) {
SeekBarSetProgress((int) (1000 * pos / mSongDuration));
} else {
SeekBarSetProgress(1000);
}
// return the number of milliseconds until the next full second, so
// the counter can be updated at just the right time
return remaining;
} catch (Exception ex) {
;
}
return 500;
}
private void queueNextRefresh(long delay) {
if (!mPaused) {
Message msg = mHandler.obtainMessage(REFRESH);
mHandler.removeMessages(REFRESH);
mHandler.sendMessageDelayed(msg, delay);
}
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case REFRESH:
long next = refreshSeekBarNow();
queueNextRefresh(next);
break;
case RM_CON_DIALOG:
Log.e("MusicPage", "Connecting dialog closed");
showConnectDiaglog(false);
break;
default:
break;
}
}
};
void showConnectDiaglog(final boolean show) {
this.runOnUiThread(new Runnable() {
public void run() {
if (show == true)
showDialog(CONNECTING);
else
removeDialog(CONNECTING);
}
});
}
private void ButtonsSetEnalbe(final boolean enable) {
this.runOnUiThread(new Runnable() {
public void run() {
mPlayStop.setEnabled(true);
mPlayStop.setImageResource(R.drawable.stop);
}
});
}
void showConnectErrorDiaglog(final boolean show) {
this.runOnUiThread(new Runnable() {
public void run() {
try {
if (show == true)
showDialog(CONNECT_ERROR);
else
removeDialog(CONNECT_ERROR);
} catch (Exception e) {
}
}
});
}
OnClickListener previewClick = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showConnectDiaglog(true);
new Thread(new Runnable(){
public void run(){
try {
Log.e("MusicPage","into new thread");
//mService.stop();
mPlayer.reset();
Log.e("MusicPage","media service stopped");
//mService.openfile(mMp3Local);
mPlayer.setDataSource(mMp3Local.get(locPointer));
mPlayer.prepare();
mPlayer.start();
Log.e("MusicPage", "media file opened");
mHandler.sendEmptyMessage(RM_CON_DIALOG);
mProgressDialogIsOpen = false;
SeekBarSetEnalbe(true);
ButtonsSetEnalbe(true);
mSongDuration = mPlayer.getDuration();
long next = refreshSeekBarNow();
queueNextRefresh(next);
} catch (Exception e) {
// TODO Auto-generated catch block
showConnectDiaglog(false);
showConnectErrorDiaglog(true);
if(locPointer < mMp3Local.size()-1) {
locPointer++;
}
e.printStackTrace();
}
}
}).start();
Log.e("MusicPage", "media played");
}
};
protected Dialog onCreateDialog(int id) {
switch (id) {
case CONNECTING: {
mProgressDialog = new ProgressDialog(MusicPage.this);
mProgressDialog.setMessage("Please wait while connect...");
mProgressDialog.setIndeterminate(true);
mProgressDialog.setCancelable(true);
mProgressDialogIsOpen = true;
return mProgressDialog;
}
// download progress
case DOWNLOAD_MP3FILE: {
mProgressDownload = new ProgressDialog(MusicPage.this);
// mProgressDownload.setMessage("Download mp3 file : \n" +
// mMp3Local.substring(0, 64));
mProgressDownload.setMessage("Download mp3 file ...");
mProgressDownload.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDownload.setMax(1000);
mProgressDownload.setButton("Hide",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
mProgressDownload.hide();
/* User clicked Yes so do some stuff */
}
});
mProgressDialogIsOpen = true;
return mProgressDownload;
}
case CONNECT_ERROR: {
return new AlertDialog.Builder(MusicPage.this).setIcon(R.drawable.icon)
.setTitle("Connect error ! ").setMessage(
"This music link is invalid, please try another.").setCancelable(
true).setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
}).create();
}
}
return null;
}
OnClickListener downloadClick = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
btnQueue.setEnabled(false);
removeDialog(CONNECTING);
mProgressDialogIsOpen = false;
if (!mDownloadFinish) {
Log.e("mDownloading: ", ""+mDownloading);
Log.e("misPlaying: ", ""+mIsPlaying);
if (mDownloading == false) {
try {
try {
if (mPlayer.isPlaying() == true) {
mPlayer.pause();
// mPlayStop.setImageResource(R.drawable.play);
mPaused = true;
}
} catch (Exception ex) {
;
}
showDialog(DOWNLOAD_MP3FILE);
m_CurDownloadFile = mMp3Title + "[" + mMp3Songer + "]"
+ ".mp3";
Log.e("download", mMp3Local.get(locPointer));
new DownloadTask(false).execute(mMp3Local.get(locPointer));
} catch (Exception e) {
e.printStackTrace();
}
} else {
mProgressDownload.show();
}
} else {
if (!mIsPlaying) {
new Thread(new Runnable() {
public void run() {
try {
//Log.e("MusicPage", "into new thread");
mPlayer.stop();
//Log.e("MusicPage", "media service stopped");
//mService.openfile(mMp3Local);
//Log.e("play dataSource: ", mMp3Local.get(locPointer));
mPlayer.reset();
mPlayer.setDataSource(mMp3Local.get(locPointer));
mPlayer.prepare();
//Log.e("MusicPage", "media file opened");
//mHandler.sendEmptyMessage(RM_CON_DIALOG);
//mService.play();
mPlayer.start();
mProgressDialogIsOpen = false;
SeekBarSetEnalbe(true);
ButtonsSetEnalbe(true);
//mSongDuration = mService.duration();
mSongDuration = mPlayer.getDuration();
long next = refreshSeekBarNow();
queueNextRefresh(next);
} catch (Exception e) {
// TODO Auto-generated catch block
showConnectDiaglog(false);
showConnectErrorDiaglog(true);
e.printStackTrace();
}
}
}).start();
} else {
}
}
}
};
OnClickListener queueClick = new OnClickListener() {
@Override
public void onClick(View v) {
try {
m_CurDownloadFile = mMp3Title + "[" + mMp3Songer + "]" + ".mp3";
new DownloadTask(true).execute(mMp3Local.get(locPointer));
Toast.makeText(MusicPage.this, R.string.queue_message, Toast.LENGTH_SHORT).show();
MusicPage.this.finish();
} catch(Exception e) {
}
}
};
OnClickListener lyricClick = new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("artist", mMp3Songer);
intent.putExtra("song", mMp3Title);
intent.setClass(MusicPage.this, Lyric.class);
startActivity(intent);
}
};
private void SeekBarSetSecondaryProgress(final int progress) {
this.runOnUiThread(new Runnable() {
public void run() {
mSeekBar.setSecondaryProgress(progress);
}
});
}
private void SeekBarSetProgress(final int progress) {
this.runOnUiThread(new Runnable() {
public void run() {
mSeekBar.setProgress(progress);
}
});
}
private void SeekBarInit() {
this.runOnUiThread(new Runnable() {
public void run() {
mSeekBar.setMax(1000);
mSeekBar.setProgress(0);
}
});
}
private void ProgressDiagClose() {
this.runOnUiThread(new Runnable() {
public void run() {
removeDialog(CONNECTING);
mProgressDialogIsOpen = false;
}
});
}
private void SeekBarSetEnalbe(final boolean enable) {
this.runOnUiThread(new Runnable() {
public void run() {
mSeekBar.setEnabled(enable);
}
});
}
@Override
public void onProgressChanged(SeekBar arg0, int progress, boolean arg2) {
// TODO Auto-generated method stub
mSongProgress = progress;
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
try {
//mSongPosition = mService.position();
mSongPosition = mPlayer.getCurrentPosition();
long position = (mSongDuration * mSongProgress) / 1000;
//mService.seek(position);
mPlayer.seekTo((int)position);
} catch (Exception ex) {
;
}
}
private void DownloadSetProgress(final int progress) {
this.runOnUiThread(new Runnable() {
public void run() {
mProgressDownload.setProgress(progress);
}
});
}
private void DownloadSetMax(final int progress) {
this.runOnUiThread(new Runnable() {
public void run() {
mProgressDownload.setMax(progress);
}
});
}
private void DownloadShowMessage(final String message) {
this.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(MusicPage.this, message, Toast.LENGTH_LONG).show();
}
});
}
private void ShowToastMessage(final String message) {
this.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(MusicPage.this, message, Toast.LENGTH_SHORT).show();
}
});
}
private class DownloadTask extends AsyncTask<String, Integer, Integer> {
boolean isQueue;
public DownloadTask(boolean isQueue) {
super();
this.isQueue = isQueue;
}
public Integer doInBackground(String... urls) {
URL url = null;
HttpURLConnection urlConn = null;
String urlString;
urlString = urls[0];
if (!isQueue) {
DownloadSetProgress(0);
mDownloading = true;
String fullpathname = Const.homedir + m_CurDownloadFile;
try {
url = new URL(urlString);
urlConn = (HttpURLConnection) url.openConnection();
urlConn.setConnectTimeout(10000);
urlConn
.setRequestProperty(
"User-Agent",
"Mozilla/5.0 (Linux; U; Android 0.5; en-us) AppleWebKit/522+ (KHTML, like Gecko) Safari/419.3 -Java");
urlConn.connect();
int downsize = urlConn.getContentLength();
int downed = 0;
DownloadSetMax(downsize);
DataInputStream fileStream;
FileOutputStream filemp3 = new FileOutputStream(fullpathname);
byte[] buff = new byte[4 * 1024];
int len;
fileStream = new DataInputStream(new BufferedInputStream(urlConn
.getInputStream()));
while ((len = fileStream.read(buff)) > 0) {
filemp3.write(buff, 0, len);
downed += len;
publishProgress((int) downed);
}
filemp3.close();
return 1;
} catch (IOException e) {
File file = new File(fullpathname);
file.delete();
return 0;
}
} else {
String fullpathname = Const.homedir + "/" + m_CurDownloadFile;
try {
url = new URL(urlString);
urlConn = (HttpURLConnection) url.openConnection();
urlConn
.setRequestProperty(
"User-Agent",
"Mozilla/5.0 (Linux; U; Android 0.5; en-us) AppleWebKit/522+ (KHTML, like Gecko) Safari/419.3 -Java");
urlConn.setConnectTimeout(10000);
urlConn.connect();
int downed = 0;
DataInputStream fileStream;
// FileOutputStream filemp3 = openFileOutput(filename,
// MODE_WORLD_READABLE);
FileOutputStream filemp3 = new FileOutputStream(fullpathname);
byte[] buff = new byte[64 * 1024];
int len;
fileStream = new DataInputStream(new BufferedInputStream(urlConn
.getInputStream()));
while ((len = fileStream.read(buff)) > 0) {
filemp3.write(buff, 0, len);
downed += len;
}
filemp3.close();
return 1;
} catch (IOException e) {
File file = new File(fullpathname);
file.delete();
return 0;
}
}
}
public void onProgressUpdate(Integer... progress) {
if (!isQueue) {
mProgressDownload.setProgress(progress[0]);
}
}
public void onPostExecute(Integer result) {
String fullpathname = Const.homedir + m_CurDownloadFile;
if (result == 1) {
Toast.makeText(MusicPage.this,
m_CurDownloadFile + getString(R.string.download_finished), Toast.LENGTH_LONG).show();
// DownloadShowMessage(m_CurDownloadFile + " download finished");
// updateDownloadList();
mMp3Local.set(locPointer, fullpathname);
ScanMediafile(fullpathname);
// showDownloadOKNotification(m_CurDownloadFile);
if (isQueue) {
Intent intent = new Intent(MusicPage.this ,local.class);
Util.addNotification(MusicPage.this, intent, mMp3Title, R.string.app_name, R.string.save_success_message, R.string.app_name, R.string.save_success_message);
} else {
btnDownload.setText(R.string.play);
}
saveArtistAndTitle();
}
if (result==0 && !isQueue) {
removeDialog(DOWNLOAD_MP3FILE);
Toast.makeText(MusicPage.this, mMp3Title+getString(R.string.download_failed), Toast.LENGTH_SHORT).show();
mDownloading = false;
mDownloadFinish = false;
mProgressDialogIsOpen = false;
if(locPointer < mMp3Local.size()-1) {
locPointer++;
}
}
if (!isQueue && result==1) {
removeDialog(DOWNLOAD_MP3FILE);
mDownloading = false;
mDownloadFinish = true;
mProgressDialogIsOpen = false;
}
if (result == 0) {
try {
File brokenFile = new File(fullpathname);
brokenFile.delete();
} catch (Exception e) {
}
}
}
}
private void saveArtistAndTitle() {
saveData(Const.MP3TITLE, this.mMp3Songer);
}
private void saveData(String key, String item) {
if (key.length() > 0) {
SharedPreferences s = getSharedPreferences(key, 0);
Editor e = s.edit();
e.putBoolean(item, true);
e.commit();
}
}
private void ScanMediafile(final String fullpathame) {
mScanner = new MediaScannerConnection(getApplicationContext(),
new MediaScannerConnectionClient() {
public void onMediaScannerConnected() {
mScanner.scanFile(fullpathame, null /* mimeType */);
}
public void onScanCompleted(String path, Uri uri) {
if (path.equals(fullpathame)) {
mScanner.disconnect();
}
}
});
mScanner.connect();
}
}