package com.feebe.musicsearch; import java.io.File; import java.util.ArrayList; import org.json.JSONArray; import com.feebe.musicsearch.IMediaPlaybackService; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.SeekBar; import android.widget.Toast; import android.widget.ImageView; import android.os.Environment; import android.os.IBinder; import android.view.View; import android.view.View.OnClickListener; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; 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.MediaScannerConnection; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.content.ContentUris; import android.database.Cursor; import android.content.ContentValues; public class local extends Activity implements SeekBar.OnSeekBarChangeListener { // Local Playlist ListView mLocalList; JSONArray mLocalMp3s = new JSONArray(); ArrayAdapter<String> mLocalAdapter; ArrayList<String> mLocalStrings = new ArrayList<String>(); SeekBar mSeekBar; private boolean mPaused = false; int mLocalMp3index = -1; Uri mCurrentFileUri ; private boolean mChooseItem = false; private IMediaPlaybackService mService = null; long mSongDuration; private static final int REFRESH = 1; ImageView mPlayStop; MediaScannerConnection mScanner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.local); // 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); mSeekBar = (SeekBar)findViewById(R.id.play_seek_bar); mSeekBar.setOnSeekBarChangeListener(this); mSeekBar.setEnabled(false); SeekBarSetSecondaryProgress(1000); mPlayStop = (ImageView) findViewById(R.id.play_stop);; mPlayStop.setOnClickListener(mPlayStopListener); mPlayStop.setEnabled(false); try{ String status = Environment.getExternalStorageState(); File saveddir = new File(Const.homedir); if(!saveddir.exists()) saveddir.mkdirs(); File[] file=(new File(Const.homedir)).listFiles(); 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(); } startService(new Intent(this, MediaPlaybackService.class)); bindService((new Intent()).setClass(this, MediaPlaybackService.class), osc, 0); mLocalList.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { final int mp3index = position; mLocalMp3index = mp3index; String fileLocal = Const.homedir + "/" + mLocalStrings.get(mLocalMp3index); ScanMediafile(fileLocal); Toast.makeText(local.this, "Playing: " + fileLocal, Toast.LENGTH_SHORT).show(); try { mService.stop(); mService.openfile(fileLocal); mService.play(); mChooseItem = true; mSeekBar.setEnabled(true); mPlayStop.setEnabled(true); mPlayStop.setImageResource(R.drawable.stop); updateTrackInfo(); long next = refreshSeekBarNow(); queueNextRefresh(next); }catch(Exception e) { e.printStackTrace(); } } }); } protected void onDestroy() { unbindService(osc); //mScanner.disconnect(); super.onDestroy(); } private ServiceConnection osc = new ServiceConnection() { public void onServiceConnected(ComponentName classname, IBinder obj) { mService = IMediaPlaybackService.Stub.asInterface(obj); updateTrackInfo(); long next = refreshSeekBarNow(); queueNextRefresh(next); } public void onServiceDisconnected(ComponentName classname) { } }; public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { ; } public void onStartTrackingTouch(SeekBar seekBar) { ; } public void onStopTrackingTouch(SeekBar seekBar) { ; } private long refreshSeekBarNow() { try { long pos = mService.position(); 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; //return 5000; } catch (Exception ex) { } return 500; } private void updateTrackInfo() { if (mService == null) { return; } try { if (mService.getPath() == null) { return; } if (mPaused == false){ mPlayStop.setImageResource(R.drawable.stop); }else{ mPlayStop.setImageResource(R.drawable.play); } mSongDuration = mService.duration(); mSeekBar.setEnabled(true); mPlayStop.setEnabled(true); } catch (Exception ex) { return; } } 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; default: break; } } }; private void SeekBarSetProgress(final int progress) { this.runOnUiThread(new Runnable() { public void run() { mSeekBar.setProgress(progress); } }); } private void SeekBarSetSecondaryProgress(final int progress) { this.runOnUiThread(new Runnable() { public void run() { mSeekBar.setSecondaryProgress(progress); } }); } private OnClickListener mPlayStopListener = new OnClickListener() { public void onClick(View v) { try{ if (mPaused == false){ mService.pause(); mPlayStop.setImageResource(R.drawable.play); mPaused = true; }else{ mService.play(); mPlayStop.setImageResource(R.drawable.stop); mPaused = false; long next = refreshSeekBarNow(); queueNextRefresh(next); } }catch(Exception e) { e.printStackTrace(); } } }; @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_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: try{ String fileLocal = Const.homedir + "/" + mLocalStrings.get(mLocalMp3index); File mp3 = new File(fileLocal); if(mp3.exists()){ mp3.delete(); updateDownloadList(); mChooseItem = false; } }catch(Exception e) { e.printStackTrace(); } 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() { this.runOnUiThread(new Runnable() { public void run() { 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 ScanMediafile(final String fullpathame) { mScanner = new MediaScannerConnection(this, new MediaScannerConnectionClient() { public void onMediaScannerConnected() { mScanner.scanFile(fullpathame, null /*mimeType*/); } public void onScanCompleted(String path, Uri uri) { if (path.equals(fullpathame)) { mCurrentFileUri = uri; mScanner.disconnect(); } } }); mScanner.connect(); } }