package org.freemp.droid.player; import android.app.Activity; import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.graphics.Bitmap; import android.os.AsyncTask; import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceManager; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; import android.text.format.Time; import android.view.Display; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import com.androidquery.AQuery; import com.androidquery.util.AQUtility; import com.flurry.android.FlurryAgent; import org.freemp.droid.ClsTrack; import org.freemp.droid.Constants; import org.freemp.droid.FileUtils; import org.freemp.droid.MediaUtils; import org.freemp.droid.R; import org.freemp.droid.UpdateUtils; import org.freemp.droid.playlist.ActPlaylist; import java.util.ArrayList; import java.util.Collections; import java.util.Random; /** * Created with IntelliJ IDEA. * User: recoilme * Date: 28/11/13 * Time: 15:10 * To change this template use File | Settings | File Templates. */ public class ActPlayer extends ActionBarActivity implements InterfacePlayer { public static final int LOGIN_RESULT = 101; private static final int PLAYLIST_CODE = 100; public static int selected = -1; private static Random randomGenerator; private AQuery aq; private AdpPlayer adapter; private ArrayList<ClsTrack> items; private ArrayList<ClsTrack> sourceItemsList; private Activity activity; private ListView listView; private SeekBar seekBar; private TextView txtDur, artist, title; private ImageView albumImage; private ImageView artworkBgr; private int screenHeight, screenWidth; // Bass Service private ServicePlayer mBoundService = null; // Bass Service Connection private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { mBoundService = ((ServicePlayer.BassServiceBinder) service).getService(); onBassServiceConnected(); setShuffleMode(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean("Shuffle", false)); } public void onServiceDisconnected(ComponentName name) { mBoundService = null; } }; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_DITHER, WindowManager.LayoutParams.FLAG_DITHER); AQUtility.setDebug(Constants.DEBUG); setContentView(R.layout.player); activity = this; Display display = getWindowManager().getDefaultDisplay(); screenWidth = display.getWidth(); screenHeight = display.getHeight(); PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putInt("screenWidth", screenWidth).commit(); PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putInt("screenHeight", screenHeight).commit(); aq = new AQuery(activity); if (randomGenerator == null) { Time now = new Time(); randomGenerator = new Random(now.toMillis(true)); } FlurryAgent.onStartSession(activity, getString(R.string.flurry)); View customView = activity.getLayoutInflater().inflate(R.layout.player_ab, null); ActionBar actionBar = getSupportActionBar(); actionBar.setCustomView(customView, new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT));//(int) (90*scale + 0.5f))); actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); listView = aq.id(R.id.listView).getListView(); txtDur = (TextView) customView.findViewById(R.id.textViewDur); artist = (TextView) customView.findViewById(R.id.textViewArttist); title = (TextView) customView.findViewById(R.id.textViewTitle); seekBar = (SeekBar) customView.findViewById(R.id.seekBar); albumImage = (ImageView) customView.findViewById(R.id.album_img); artworkBgr = (ImageView) findViewById(R.id.artworkBgr); sourceItemsList = items = new ArrayList<ClsTrack>(); adapter = new AdpPlayer(activity, items); listView.setAdapter(adapter); // Start Service startService(new Intent(this, ServicePlayer.class)); // Bind Service bindService(new Intent(this, ServicePlayer.class), mConnection, Context.BIND_AUTO_CREATE); new UpdateUtils(activity); } // onBassServiceConnected: Put some activity stuff here public void onBassServiceConnected() { // Register Activity mBoundService.setActivity(this); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { public void onStopTrackingTouch(SeekBar seekBar) { } public void onStartTrackingTouch(SeekBar seekBar) { } public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { final int prgr = progress; new Thread(new Runnable() { @Override public void run() { mBoundService.seekTo(prgr); } }).start(); } } }); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final int pos = position; new Thread(new Runnable() { @Override public void run() { if (mBoundService.isShuffle()) { updatePlayPause(); } mBoundService.startVolumeUpFlag = System.currentTimeMillis(); mBoundService.play(pos); //aq.id(R.id.btnPlay).background(R.drawable.player_pause_button); updatePlayPause(); } }).start(); } }); aq.id(R.id.btnFf).clicked(new View.OnClickListener() { @Override public void onClick(View view) { if (mBoundService != null) { new Thread(new Runnable() { @Override public void run() { mBoundService.playNext(); updatePlayPause(); } }).start(); } } }); aq.id(R.id.btnRew).clicked(new View.OnClickListener() { @Override public void onClick(View view) { if (mBoundService != null) { new Thread(new Runnable() { @Override public void run() { mBoundService.playPrev(); updatePlayPause(); } }).start(); } } }); aq.id(R.id.btnSfl).clicked(new View.OnClickListener() { @Override public void onClick(View view) { if (mBoundService != null) { new Thread(new Runnable() { @Override public void run() { boolean mode = !mBoundService.isShuffle(); setShuffleMode(mode); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(activity, getString(R.string.shuffle_is) + (mBoundService.isShuffle() ? " on" : " off"), Toast.LENGTH_SHORT).show(); } }); } }).start(); } } }); aq.id(R.id.btnRept1).clicked(new View.OnClickListener() { @Override public void onClick(View view) { if (mBoundService != null) { new Thread(new Runnable() { @Override public void run() { mBoundService.setRepeat(!mBoundService.isRepeat()); updatePlayPause(); } }).start(); } } }); aq.id(R.id.btnPlay).clicked(new View.OnClickListener() { @Override public void onClick(View view) { if (mBoundService != null) { new Thread(new Runnable() { @Override public void run() { if (mBoundService.isPlaying()) { mBoundService.pause(); //aq.id(R.id.btnPlay).background(R.drawable.player_play_button); } else { if (mBoundService.isPaused()) { mBoundService.playFromPause(); mBoundService.startVolumeUpFlag = System.currentTimeMillis(); //aq.id(R.id.btnPlay).background(R.drawable.player_pause_button); } else { int pos = listView.getSelectedItemPosition() > 0 ? listView.getSelectedItemPosition() : 0; if (!adapter.isEmpty() && adapter.getCount() > pos) { mBoundService.play(pos); mBoundService.startVolumeUpFlag = System.currentTimeMillis(); //aq.id(R.id.btnPlay).background(R.drawable.player_pause_button); } } } updatePlayPause(); } }).start(); } } }); update(); } private void setShuffleMode(boolean mode) { PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putBoolean("Shuffle", mode).commit(); mBoundService.setShuffle(mode); shuffleItemsList(); updatePlayPause(); } public void startPlaylist(int type) { Intent intent = new Intent(activity, ActPlaylist.class); intent.putExtra("type", type); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivityForResult(intent, PLAYLIST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case PLAYLIST_CODE: if (resultCode == RESULT_OK) { update(); } break; case LOGIN_RESULT: if (resultCode == RESULT_OK) { startPlaylist(2); } } } private void shuffleItemsList() { synchronized (this) { if (sourceItemsList != null /*&& sourceItemsList.size() > 2*/) { items = new ArrayList<ClsTrack>(sourceItemsList); if (mBoundService.isShuffle()) { Collections.shuffle(items, randomGenerator); } } synchronizeTrackList(); } runOnUiThread(new Runnable() { @Override public void run() { adapter.replaceTrackList(items); } }); } private boolean synchronizeTrackList() { mBoundService.updateTrackList(items); int newPlayingTrackIndex = mBoundService.getPlayingPosition(); if (newPlayingTrackIndex != selected) { selected = newPlayingTrackIndex; return true; } return false; } public void update() { if (items != null) { //if (mBoundService!=null) mBoundService.Stop(); //TODO clear menu_player|progress status in interface (reset) adapter.notifyDataSetInvalidated(); items.clear(); adapter.notifyDataSetChanged(); } TaskGetPlaylist taskGetPlaylist = new TaskGetPlaylist(); taskGetPlaylist.setContext(getApplicationContext()); taskGetPlaylist.execute(new ArrayList<String>()); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_player, menu); return super.onCreateOptionsMenu(menu); } /* @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); MenuItem item= menu.findItem(action_settings); item.setVisible(false); return true; } */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_open_fs: startPlaylist(1); return true; } return super.onOptionsItemSelected(item); } @Override public void onDestroy() { // Unbind Service unbindService(mConnection); FlurryAgent.onEndSession(activity); super.onDestroy(); } // BassInterface: onPluginsLoaded public void onPluginsLoaded(String plugins) { } // BassInterface: onFileLoaded public void onFileLoaded(final ClsTrack track, final double _duration, final String _artist, final String _title, final int position, final int albumId) { runOnUiThread(new Runnable() { @Override public void run() { selected = position; title.setText(_title); seekBar.setMax((int) _duration); artist.setText(_artist); adapter.notifyDataSetChanged(); listView.smoothScrollToPosition(position); listView.invalidate(); Bitmap artwork = null; /* Drawable drawable = ((ImageView)view).getDrawable(); if(drawable instanceof BitmapDrawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable; bitmapDrawable.getBitmap().recycle(); } final BitmapDrawable aid = ((BitmapDrawable) albumImage.getDrawable()); if (aid!=null && aid.getBitmap()!=null) aid.getBitmap().recycle(); final BitmapDrawable ari = ((BitmapDrawable) artworkBgr.getDrawable()); if (ari!=null && ari.getBitmap()!=null) ari.getBitmap().recycle(); */ if (activity != null && !activity.isFinishing()) { artwork = MediaUtils.getArtworkQuick(activity, track, 180, 180); } if (artwork != null) { albumImage.setImageBitmap(artwork); int min = Math.min(screenWidth, screenHeight) / 2; Bitmap bitmap = MediaUtils.getArtworkQuick(activity, track, min, min); artworkBgr.setImageBitmap(bitmap); listView.setBackgroundResource(R.drawable.player_listview_bgr); } else { artworkBgr.setImageBitmap(null); albumImage.setImageDrawable(getResources().getDrawable(R.drawable.empty_artwork)); listView.setBackgroundColor(getResources().getColor(R.color.bgr)); } } }); } // BassInterface: onProgressChanged public void onProgressChanged(final double progress) { seekBar.setProgress((int) progress); runOnUiThread(new Runnable() { @Override public void run() { //String f = "mm:ss"; int sec = (int) progress; int min = sec / 60; sec %= 60; if (progress >= 3600d) { //f = "HH:mm:ss"; txtDur.setText(String.format("%2d:%2d:%02d", ((int) sec / 3600), min, sec)); } else { txtDur.setText(String.format("%2d:%02d", min, sec)); } //txtDur.setText(new SimpleDateFormat(f) {{ // setTimeZone(TimeZone.getTimeZone("UTC")); // }}.format(new Date((int)progress*1000))); } }); } @Override public void onUpdatePlayPause() { updatePlayPause(); } @Override public void onResume() { super.onResume(); updatePlayPause(); } public void updatePlayPause() { if (mBoundService != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { mBoundService.setActivityStarted(true); if (mBoundService.isPlaying()) { aq.id(R.id.btnPlay).background(R.drawable.player_pause_button); } else { aq.id(R.id.btnPlay).background(R.drawable.player_play_button); } if (mBoundService.isShuffle()) { aq.id(R.id.btnSfl).background(R.drawable.player_shuffle_button_on); } else { aq.id(R.id.btnSfl).background(R.drawable.player_shuffle_button_off); } if (mBoundService.isRepeat()) { aq.id(R.id.btnRept1).background(R.drawable.player_repeat_button_on); } else { aq.id(R.id.btnRept1).background(R.drawable.player_repeat_button_off); } } }); } } @Override public void onPause() { super.onPause(); if (mBoundService != null) { mBoundService.setActivityStarted(false); } } public class TaskGetPlaylist extends AsyncTask { private Context context; @Override protected Object doInBackground(Object... params) { ArrayList<ClsTrack> o = null; o = (ArrayList<ClsTrack>) FileUtils.readObject("tracks", activity); return o; } public void setContext(Context context) { this.context = context; } protected void onPostExecute(Object result) { if (result != null) { sourceItemsList = (ArrayList<ClsTrack>) result; adapter.notifyDataSetInvalidated(); shuffleItemsList(); } else { if (PreferenceManager.getDefaultSharedPreferences(activity).getString("scanDir", "").equals("")) { AlertDialog.Builder dlg = new AlertDialog.Builder(activity); dlg.setMessage(R.string.createNewPlaylist); dlg.setCancelable(true); dlg.setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startPlaylist(1); } }); dlg.setNegativeButton(android.R.string.cancel, null); dlg.show(); } } } } }