package com.trans.music.search; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Random; import org.json.JSONArray; import com.jokes.search.R; import android.app.Activity; import android.app.AlertDialog; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.RemoteException; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.AdapterView; import android.widget.MediaController; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.SeekBar; import android.widget.Toast; import android.widget.ImageView; import android.os.Environment; import android.os.IBinder; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.content.ComponentName; import android.content.Context; import android.provider.MediaStore; import android.provider.MediaStore.Audio.Media; import android.net.Uri; import android.content.ContentResolver; import android.provider.Settings; import android.media.MediaPlayer; import android.media.MediaScannerConnection; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.media.MediaPlayer.OnSeekCompleteListener; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.content.ContentUris; import android.database.Cursor; import android.content.ContentValues; public class local extends Activity { // Local Playlist private static final int Mode_All_Repeat = 0; private static final int Mode_Shuffling = 1; private static final int Mode_Single_Repeat = 2; private static final int Seek_Interval = 500; private static final int Seekbar_Max = 100; private static final int Music_Play = 0; private static final int Music_Edit = 1; private static final int Music_Delete = 2; private int mSongProgress; private int mPlayMode = 0; private TextView txtCurMusic; private TextView txtPlayMode; ListView mLocalList; JSONArray mLocalMp3s = new JSONArray(); ArrayAdapter<String> mLocalAdapter; ArrayList<String> mLocalStrings = new ArrayList<String>(); private MediaController.MediaPlayerControl mMediaPlayerControl = new MediaController.MediaPlayerControl() { int curIndex=-1; @Override public void start() { if (curIndex == mLocalMp3index) { mPlayer.start(); } else { curIndex = mLocalMp3index; playSong(); } }; @Override public void seekTo(int pos) { try { mPlayer.seekTo(pos); } catch (Exception e) { } } @Override public void pause() { mPlayer.pause(); } @Override public boolean isPlaying() { return mPlayer.isPlaying(); } @Override public int getDuration() { int duration = 1; try { duration = mPlayer.getDuration(); } catch (Exception e) { } return duration; } @Override public int getCurrentPosition() { int pos = 0; try { pos = mPlayer.getCurrentPosition(); } catch (Exception e) { } return pos; } @Override public int getBufferPercentage() { return 0; } @Override public boolean canSeekForward() { return true; } @Override public boolean canSeekBackward() { return true; } @Override public boolean canPause() { return true; } }; int mLocalMp3index = 0; Uri mCurrentFileUri; private boolean mChooseItem = false; long mSongDuration; ImageView mPlayStop; private MediaPlayer mPlayer = new MediaPlayer(); private MediaController mController; @Override protected void onResume() { super.onResume(); updateDownloadList(); try { txtCurMusic.setText(getString(R.string.current_music)+": "+mLocalStrings.get(mLocalMp3index)); } catch (Exception e) { } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.local); txtCurMusic = (TextView)findViewById(R.id.txtCurMusic); txtPlayMode = (TextView)findViewById(R.id.txtPlayMode); txtPlayMode.setText(getString(R.string.play_mode)+": "+getResources().getStringArray(R.array.play_mode)[mPlayMode]); View anchorView = findViewById(R.id.anchorView); mController = new MediaController(this); mController.setPrevNextListeners(mPlayNextClickListener, mPlayPrevClickListener); mController.setMediaPlayer(mMediaPlayerControl); mController.setEnabled(true); mController.setAnchorView(anchorView); AdListener.createAds(this,R.id.l1); // Local Playlist UI mLocalList = (ListView) findViewById(R.id.local_playlist); mLocalAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mLocalStrings); mLocalList.setAdapter(mLocalAdapter); mLocalList.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { final int position_final = position; AlertDialog.Builder builder = new AlertDialog.Builder(local.this); builder.setTitle(R.string.select_opration); builder.setItems(R.array.local_music_option, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { switch (item) { case Music_Play: mLocalMp3index = position_final; playSong(); break; case Music_Edit: startRingdroidEditor(position_final); break; case Music_Delete: AlertDialog.Builder builder = new AlertDialog.Builder(local.this); builder.setMessage(getString(R.string.delete_warning)+": "+mLocalStrings.get(position_final)+"?") .setCancelable(false) .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { deleteMusicFile(position_final); updateDownloadList(); } }) .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); break; default: break; } } }); AlertDialog alert = builder.create(); alert.show(); } }); mPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { playNext(); } }); mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { if (mPlayMode != Mode_Single_Repeat) { playNext(); } else { Toast.makeText(local.this, R.string.play_error, Toast.LENGTH_SHORT).show(); } return false; } }); mLocalList.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(500); } catch (InterruptedException e) { } runOnUiThread(new Runnable() { @Override public void run() { mController.show(); } }); } }).start(); return false; } }); } @Override protected void onDestroy() { super.onDestroy(); try { mPlayer.stop(); mPlayer.release(); } catch (Exception e) { } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the currently selected menu XML resource. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.local, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Intent intent; switch (item.getItemId()) { case R.id.menu_search: finish(); break; case R.id.menu_mode: AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.select_play_mode); builder.setSingleChoiceItems(R.array.play_mode, mPlayMode, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { mPlayMode = item; txtPlayMode.setText(getString(R.string.play_mode)+": "+getResources().getStringArray(R.array.play_mode)[mPlayMode]); Toast.makeText(local.this, getString(R.string.play_mode_set_to)+": "+getResources().getStringArray(R.array.play_mode)[mPlayMode], Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.show(); break; case R.id.menu_local: loadDefaultMusicApp(); break; case R.id.menu_ringtone: if (mLocalMp3index >= 0 && mChooseItem == true) { try { ContentResolver resolver = this.getContentResolver(); Uri ringUri = mCurrentFileUri; ContentValues values = new ContentValues(2); values.put(MediaStore.Audio.Media.IS_RINGTONE, "1"); values.put(MediaStore.Audio.Media.IS_ALARM, "1"); resolver.update(ringUri, values, null, null); Settings.System.putString(resolver, Settings.System.RINGTONE, ringUri.toString()); Toast.makeText(this, "This playing song has set as phone ringtone.", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } } else { Toast.makeText(this, "Please select one music to play.", Toast.LENGTH_SHORT).show(); } break; case R.id.menu_delete: deleteMusicFile(mLocalMp3index); return true; case R.id.menu_help: intent = new Intent(local.this, help.class); startActivity(intent); return true; default: break; } return false; } private void updateDownloadList() { try { File[] file = (new File(Const.homedir)).listFiles(); mLocalAdapter.clear(); for (int i = 0; i < file.length; i++) { if (file[i].isFile()) { String fname = file[i].getName(); if (fname.endsWith(".mp3")) mLocalAdapter.add(fname); } } } catch (Exception e) { e.printStackTrace(); } } private void loadDefaultMusicApp() { try { Intent intent = new Intent(); intent.setClassName("com.android.music", "com.android.music.MusicBrowserActivity"); startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } private int getPrevIndex(int curIndex) { int prevIndex = 0; switch (mPlayMode) { case Mode_All_Repeat: prevIndex = (--curIndex + mLocalStrings.size())%mLocalStrings.size(); break; case Mode_Single_Repeat: prevIndex = curIndex; break; case Mode_Shuffling: prevIndex = new Random().nextInt(mLocalStrings.size()); break; default: break; } return prevIndex; } private int getNextIndex(int curIndex) { int nextIndex = 0; switch (mPlayMode) { case Mode_All_Repeat: nextIndex = (++curIndex)%mLocalStrings.size(); break; case Mode_Single_Repeat: nextIndex = curIndex; break; case Mode_Shuffling: nextIndex = new Random().nextInt(mLocalStrings.size()); break; default: break; } return nextIndex; } private void playSong() { if (mLocalStrings.size() == 0) return; boolean isSucc = false; int retryCount = 0; do { retryCount++; mPlayer.reset(); txtCurMusic.setText(getString(R.string.current_music)+": "+mLocalStrings.get(mLocalMp3index)); String fileLocal = Const.homedir + mLocalStrings.get(mLocalMp3index); try { //Log.e("DataSource: ", fileLocal); mPlayer.setDataSource(fileLocal); mPlayer.prepare(); mPlayer.start(); Toast.makeText(local.this, "Playing: " + fileLocal, Toast.LENGTH_SHORT).show(); isSucc = true; } catch (Exception e) { Toast.makeText(local.this, R.string.play_error, Toast.LENGTH_SHORT).show(); if (mPlayMode != Mode_Single_Repeat) { mLocalMp3index = getNextIndex(mLocalMp3index); } } } while(!isSucc && mPlayMode!=Mode_Single_Repeat && retryCount<=mLocalStrings.size()); if (retryCount > mLocalStrings.size()) { Toast.makeText(local.this, R.string.have_no_valide_music, Toast.LENGTH_SHORT).show(); } } private OnClickListener mPlayPrevClickListener = new OnClickListener() { @Override public void onClick(View v) { playPrev(); } }; private void playPrev() { mLocalMp3index = getPrevIndex(mLocalMp3index); playSong(); } private OnClickListener mPlayNextClickListener = new OnClickListener() { @Override public void onClick(View v) { if (mLocalStrings.size() > 0) playNext(); } }; private void playNext() { mLocalMp3index = getNextIndex(mLocalMp3index); playSong(); } private void startRingdroidEditor(int index) { String fileLocal = Const.homedir + mLocalStrings.get(index); try { Intent intent = new Intent(Intent.ACTION_EDIT, Uri.parse(fileLocal)); intent.putExtra("was_get_content_intent", false); intent.setClassName( "com.trans.music.search", "com.other.RingEditActivity"); startActivity(intent); } catch (Exception e) { Log.e("Ringdroid", "Couldn't start editor"); } } private void deleteMusicFile(int index) { String fileLocal = Const.homedir + mLocalStrings.get(index); //delete from MediaStore try { ContentResolver mContentResolver = this.getContentResolver(); Cursor cursor = mContentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); while(cursor.moveToNext()) { String url = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)); if(url.equals(fileLocal)) { String itemUri = MediaStore.Audio.Media.getContentUriForPath(url).toString() + "/" + cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)); mContentResolver.delete(Uri.parse(itemUri), null, null); //Log.e("itemUri:", itemUri.toString()); } } } catch (IllegalArgumentException e) { e.printStackTrace(); } //delete from sdcard try { mPlayer.stop(); mPlayer.reset(); File mp3 = new File(fileLocal); if (mp3.exists()) { mp3.delete(); updateDownloadList(); mChooseItem = false; } } catch (Exception e) { e.printStackTrace(); } } }