package com.teleca.jamendo.activity.playview;
import java.util.List;
import org.json.JSONException;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Animation.AnimationListener;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.SlidingDrawer;
import android.widget.TextView;
import android.widget.Toast;
import com.teleca.jamendo.MyApplication;
import com.teleca.jamendo.R;
import com.teleca.jamendo.activity.MainView;
import com.teleca.jamendo.activity.album.AlbumView;
import com.teleca.jamendo.activity.artist.ArtistActivity;
import com.teleca.jamendo.api.IPlayEngine;
import com.teleca.jamendo.api.IPlayEngineListener;
import com.teleca.jamendo.api.IServerApi;
import com.teleca.jamendo.api_impl.ServerApiImpl;
import com.teleca.jamendo.model.Album;
import com.teleca.jamendo.model.ErrorMsg;
import com.teleca.jamendo.model.License;
import com.teleca.jamendo.model.Playlist;
import com.teleca.jamendo.model.PlaylistRemote;
import com.teleca.jamendo.model.Track;
import com.teleca.jamendo.ui.dialog.AddToPlaylistDialog;
import com.teleca.jamendo.ui.dialog.LyricsDialog;
import com.teleca.jamendo.ui.loadDialog.LoadDialog;
import com.teleca.jamendo.ui.loadDialog.PlayAlbumLoadDialog;
import com.teleca.jamendo.ui.loadDialog.PlaylistRemoteLoadDialog;
import com.teleca.jamendo.util.Helper;
import com.teleca.jamendo.widget.MyImageView;
import com.teleca.jamendo.widget.ReflectableLayout;
import com.teleca.jamendo.widget.ReflectiveSurface;
/**
* 播放界面
*
* @author lilin
* @date 2011-12-13 上午12:30:26
* @ClassName: PlayerView
*/
public class PlayView extends Activity implements OnClickListener {
// 播放方法
private PlayMethod playMethod;
private Album myAlbum = null;
private TextView artist_tv;
private TextView song_tv;
private TextView curTime_tv;
private TextView totalTime_tv;
private RatingBar mRatingBar;
private ProgressBar mProgressBar;
// 操作按钮
private ImageButton playBtn;
private ImageButton nextBtn;
private ImageButton preBtn;
private ImageButton stopBtn;
private MyImageView mCoverImageView;
private MyImageView mLicenseImageView;
private Animation mFadeInAnimation;
private Animation mFadeOutAnimation;
private ReflectableLayout mReflectableLayout;
private ReflectiveSurface mReflectiveSurface;
private String mBetterRes;
private SlidingDrawer slidingDrawer;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 无标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.playerview);
setTitle("播放主界面");
// 初始化
initView();
handleIntent();
// cupcake backwards compability
int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
if (sdkVersion == Build.VERSION_CODES.CUPCAKE) {
// 抽屉控件单击事件
new CupcakeListener();
}
}
private void handleIntent() {
PlayMethod playMethod2 = null;
if (getIntent().getData() != null) {
if (!getIntent().getBooleanExtra("handled", false)) {
new UriLoadingDialog(this, "正在努力加载", "加载失败").execute();
}
} else {
playMethod2 = (PlayMethod) getIntent().getSerializableExtra(
"playlist");
loadPlaylist(playMethod2);
}
}
private void loadPlaylist(PlayMethod playMethod) {
if (playMethod == null)
return;
this.playMethod = playMethod;
if (playMethod != getPlayerEngine().getPlaylist()) {
// getPlayerEngine().stop();
getPlayerEngine().openPlaylist(playMethod);
getPlayerEngine().play();
}
}
private IPlayEngine getPlayerEngine() {
return MyApplication.getInstance().getPlayerEngineInterface();
};
@Override
public void onResume() {
super.onResume();
// register UI listener
MyApplication.getInstance().setPlayerEngineListener(
mPlayerEngineListener);
// refresh UI
if (getPlayerEngine() != null) {
// the playlist is empty, abort playback, show message
if (getPlayerEngine().getPlaylist() == null) {
Toast.makeText(this, R.string.no_tracks, 5000).show();
finish();
return;
}
mPlayerEngineListener.onTrackChanged(getPlayerEngine()
.getPlaylist().getSelectedTrack());
}
}
@Override
public void onPause() {
super.onPause();
// unregister UI listener
MyApplication.getInstance().setPlayerEngineListener(null);
}
/**
* 显示按钮
*/
private void showMediaBtn() {
playBtn.setVisibility(View.VISIBLE);
nextBtn.setVisibility(View.VISIBLE);
preBtn.setVisibility(View.VISIBLE);
stopBtn.setVisibility(View.VISIBLE);
}
/**
* Makes 4-way media gone
*/
private void setMediaGone() {
playBtn.setVisibility(View.GONE);
nextBtn.setVisibility(View.GONE);
preBtn.setVisibility(View.GONE);
stopBtn.setVisibility(View.GONE);
}
/**
* Sets fade out animation to 4-way media
*/
private void setFadeOutAnimation() {
playBtn.setAnimation(mFadeOutAnimation);
nextBtn.setAnimation(mFadeOutAnimation);
preBtn.setAnimation(mFadeOutAnimation);
stopBtn.setAnimation(mFadeOutAnimation);
}
/**
* Sets fade out animation to 4-way media
*/
private void setFadeInAnimation() {
playBtn.setAnimation(mFadeInAnimation);
nextBtn.setAnimation(mFadeInAnimation);
preBtn.setAnimation(mFadeInAnimation);
stopBtn.setAnimation(mFadeInAnimation);
}
/**
* Launches fade in/out sequence
*/
private OnClickListener mCoverOnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (playBtn.getVisibility() == View.GONE) {
showMediaBtn();
setFadeInAnimation();
playBtn.startAnimation(mFadeInAnimation);
}
}
};
/**
* PlayerEngineListener implementation, manipulates UI
*/
private IPlayEngineListener mPlayerEngineListener = new IPlayEngineListener() {
@Override
public void onTrackChanged(Playlist playlistEntry) {
new LicenseTask(playlistEntry.getAlbum(), myAlbum);
myAlbum = playlistEntry.getAlbum();
artist_tv.setText(playlistEntry.getAlbum().getArtistName());
song_tv.setText(playlistEntry.getTrack().getName());
curTime_tv.setText(Helper.secondsToString(0));
totalTime_tv.setText(Helper.secondsToString(playlistEntry
.getTrack().getDuration()));
mCoverImageView.setImageUrl(playlistEntry.getAlbum().getImage()
.replaceAll("1.100.jpg", mBetterRes)); // Get higher
// resolution image
// 300x300
mProgressBar.setProgress(0);
mProgressBar.setMax(playlistEntry.getTrack().getDuration());
mCoverImageView.performClick();
if (mRatingBar != null) {
mRatingBar.setProgress((int) (10 * playlistEntry.getAlbum()
.getRating()));
mRatingBar.setMax(10);
}
if (getPlayerEngine() != null) {
if (getPlayerEngine().isPlaying()) {
playBtn.setImageResource(R.drawable.player_pause_light);
} else {
playBtn.setImageResource(R.drawable.player_play_light);
}
}
}
@Override
public void onTrackProgress(int seconds) {
curTime_tv.setText(Helper.secondsToString(seconds));
mProgressBar.setProgress(seconds);
}
@Override
public void onTrackBuffering(int percent) {
// int secondaryProgress = (int)
// (((float)percent/100)*mProgressBar.getMax());
// mProgressBar.setSecondaryProgress(secondaryProgress);
}
@Override
public void onTrackStop() {
playBtn.setImageResource(R.drawable.player_play_light);
}
@Override
public boolean onTrackStart() {
playBtn.setImageResource(R.drawable.player_pause_light);
return true;
}
@Override
public void onTrackPause() {
playBtn.setImageResource(R.drawable.player_play_light);
}
@Override
public void onTrackStreamError() {
Toast.makeText(PlayView.this, R.string.stream_error, 5000).show();
}
};
/**
* This creates playlist based on url that was passed in the intent, e.g.
* http://www.jamendo.com/pl/track/325654 or
* http://www.jamendo.com/pl/album/7505
*
* @author Lukasz Wisniewski
*/
private class UriLoadingDialog extends LoadDialog<Void, PlayMethod> {
public UriLoadingDialog(Activity activity, int loadingMsg, int failMsg) {
super(activity, loadingMsg, failMsg);
}
public UriLoadingDialog(Activity activity, String loadingMsg,
String failMsg) {
super(activity, loadingMsg, failMsg);
}
@Override
public PlayMethod doInBackground(Void... params) {
PlayMethod playlist = null;
Intent intent = getIntent();
String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(action)) {
playlist = new PlayMethod();
List<String> segments = intent.getData().getPathSegments();
String mode = segments.get((segments.size() - 2));
int id = Integer.parseInt(segments.get((segments.size() - 1)));
IServerApi service = new ServerApiImpl();
if (mode.equals("track")) {
try {
Track[] tracks = service.getTracksByTracksId(
new int[] { id }, MyApplication.getInstance()
.getStreamEncoding());
Album[] albums = service
.getAlbumsByTracksId(new int[] { id });
playlist.addTracks(tracks, albums[0]);
} catch (JSONException e) {
Log.e(MyApplication.TAG, "sth went completely wrong");
PlayView.this.finish();
e.printStackTrace();
} catch (ErrorMsg e) {
publishProgress(e);
}
}
if (mode.equals("album")) {
try {
Album album = service.getAlbumById(id);
Track[] tracks = service
.getAlbumTracks(album, MyApplication
.getInstance().getStreamEncoding());
playlist.addTracks(tracks, album);
} catch (JSONException e) {
Log.e("jamendroid", "sth went completely wrong");
PlayView.this.finish();
e.printStackTrace();
} catch (ErrorMsg e) {
publishProgress(e);
}
}
}
intent.putExtra("handled", true);
return playlist;
}
@Override
public void doStuffWithResult(PlayMethod result) {
loadPlaylist(result);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
slidingDrawer.animateToggle();
return true;
}
return super.onKeyDown(keyCode, event);
}
public void albumClickHandler(View target) {
AlbumView.launch(this, getPlayerEngine().getPlaylist()
.getSelectedTrack().getAlbum());
}
public void artistClickHandler(View target) {
ArtistActivity.launch(this, getPlayerEngine().getPlaylist()
.getSelectedTrack().getAlbum().getArtistName());
}
public void playlistClickHandler(View target) {
// PlaylistView.launch(this, false);
}
public void homeClickHandler(View target) {
Intent intent = new Intent(this, MainView.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
public void addOnClick(View v) {
AddToPlaylistDialog dialog = new AddToPlaylistDialog(PlayView.this);
dialog.setPlaylistEntry(getPlayerEngine().getPlaylist()
.getSelectedTrack());
dialog.show();
slidingDrawer.animateClose();
}
public void lyricsOnClick(View v) {
Track track = getPlayerEngine().getPlaylist().getSelectedTrack()
.getTrack();
new LyricsDialog(PlayView.this, track).show();
slidingDrawer.animateClose();
}
public void downloadOnClick(View v) {
AlertDialog alertDialog = new AlertDialog.Builder(PlayView.this)
.setTitle(R.string.download_track_q).setPositiveButton(
R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
Helper.addToDownloads(PlayView.this,
getPlayerEngine().getPlaylist()
.getSelectedTrack());
}
}).setNegativeButton(R.string.cancel, null).create();
alertDialog.show();
slidingDrawer.animateClose();
}
public void shareOnClick(View v) {
if (playMethod == null || playMethod.getSelectedTrack() == null) {
return;
}
Playlist entry = playMethod.getSelectedTrack();
Helper.share(PlayView.this, entry);
slidingDrawer.animateClose();
}
License mLicense;
/**
* do background JamendoGet2Api.getAlbumLicense
*
* @author Lukasz Wisniewski
*/
private class LicenseTask extends AsyncTask<Album, ErrorMsg, License> {
public LicenseTask(Album newAlbum, Album oldAlbum) {
boolean runQuery = true;
if (oldAlbum != null && newAlbum.getId() == oldAlbum.getId()) {
runQuery = false;
}
if (runQuery) {
this.execute(newAlbum);
}
}
@Override
protected void onPreExecute() {
mLicenseImageView.setImageResource(R.drawable.cc_loading);
super.onPreExecute();
}
@Override
public License doInBackground(Album... params) {
IServerApi service = new ServerApiImpl();
try {
return service.getAlbumLicense(params[0]);
} catch (ErrorMsg e) {
return null;
}
}
@Override
public void onPostExecute(License result) {
super.onPostExecute(result);
mLicense = result;
if (mLicense != null) {
mLicenseImageView.setImageUrl(mLicense.getImage());
}
}
@Override
protected void onProgressUpdate(ErrorMsg... values) {
Toast.makeText(PlayView.this, values[0].getMessage(), 5000).show();
super.onProgressUpdate(values);
}
};
public void licenseClickHandler(View v) {
if (mLicense != null) {
Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(mLicense
.getUrl()));
startActivity(myIntent);
}
}
// 抽屉盒子里面的控件单击事件
public class CupcakeListener implements OnClickListener {
public CupcakeListener() {
// 点击图标
findViewById(R.id.SliderHome).setOnClickListener(this);
findViewById(R.id.SliderAlbum).setOnClickListener(this);
findViewById(R.id.SliderArtist).setOnClickListener(this);
findViewById(R.id.SliderPlaylist).setOnClickListener(this);
// 点击按钮
findViewById(R.id.SliderLyrics).setOnClickListener(this);
findViewById(R.id.SliderAddToPlaylist).setOnClickListener(this);
findViewById(R.id.SliderShare).setOnClickListener(this);
findViewById(R.id.SliderDownload).setOnClickListener(this);
// license
if (mLicenseImageView != null) {
mLicenseImageView.setOnClickListener(this);
}
}
public void onClick(View v) {
switch (v.getId()) {
// icons
case R.id.SliderHome:
homeClickHandler(v);
break;
case R.id.SliderAlbum:
albumClickHandler(v);
break;
case R.id.SliderArtist:
artistClickHandler(v);
break;
case R.id.SliderPlaylist:
playlistClickHandler(v);
break;
// buttons
case R.id.SliderLyrics:
lyricsOnClick(v);
break;
case R.id.SliderAddToPlaylist:
addOnClick(v);
break;
case R.id.SliderShare:
shareOnClick(v);
break;
case R.id.SliderDownload:
downloadOnClick(v);
break;
// license
case R.id.LicenseImageView:
licenseClickHandler(v);
break;
}
}
}
private void initView() {
// XML binding
mBetterRes = getResources().getString(R.string.better_res);
artist_tv = (TextView) findViewById(R.id.ArtistTextView);
song_tv = (TextView) findViewById(R.id.SongTextView);
curTime_tv = (TextView) findViewById(R.id.CurrentTimeTextView);
totalTime_tv = (TextView) findViewById(R.id.TotalTimeTextView);
mRatingBar = (RatingBar) findViewById(R.id.TrackRowRatingBar);
mCoverImageView = (MyImageView) findViewById(R.id.CoverImageView);
mCoverImageView.setOnClickListener(mCoverOnClickListener);
mCoverImageView.setDefaultImage(R.drawable.no_cd_300);
mProgressBar = (ProgressBar) findViewById(R.id.ProgressBar);
mReflectableLayout = (ReflectableLayout) findViewById(R.id.ReflectableLayout);
mReflectiveSurface = (ReflectiveSurface) findViewById(R.id.ReflectiveSurface);
if (mReflectableLayout != null && mReflectiveSurface != null) {
mReflectableLayout.setReflectiveSurface(mReflectiveSurface);
mReflectiveSurface.setReflectableLayout(mReflectableLayout);
}
playBtn = (ImageButton) findViewById(R.id.PlayImageButton);
playBtn.setOnClickListener(this);
nextBtn = (ImageButton) findViewById(R.id.NextImageButton);
nextBtn.setOnClickListener(this);
preBtn = (ImageButton) findViewById(R.id.PrevImageButton);
preBtn.setOnClickListener(this);
stopBtn = (ImageButton) findViewById(R.id.StopImageButton);
stopBtn.setOnClickListener(this);
mFadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in);
mFadeOutAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);
mLicenseImageView = (MyImageView) findViewById(R.id.LicenseImageView);
slidingDrawer = (SlidingDrawer) findViewById(R.id.drawer);
mFadeInAnimation.setAnimationListener(new AnimationListener() {
public void onAnimationEnd(Animation animation) {
new Handler().postDelayed(new Runnable() {
public void run() {
if (mFadeInAnimation.hasEnded())
playBtn.startAnimation(mFadeOutAnimation);
}
}, 7500);
}
public void onAnimationRepeat(Animation animation) {
// nothing here
}
public void onAnimationStart(Animation animation) {
showMediaBtn();
}
});
mFadeOutAnimation.setAnimationListener(new AnimationListener() {
public void onAnimationEnd(Animation animation) {
setMediaGone();
}
public void onAnimationRepeat(Animation animation) {
// nothing here
}
public void onAnimationStart(Animation animation) {
setFadeOutAnimation();
}
});
}
// 播放按钮事件
public void onClick(View v) {
switch (v.getId()) {
case R.id.PlayImageButton:
// 播放
{
if (getPlayerEngine().isPlaying()) {
getPlayerEngine().pause();
} else {
getPlayerEngine().play();
}
}
break;
case R.id.NextImageButton:
// 下一首
{
getPlayerEngine().next();
}
break;
case R.id.PrevImageButton:
// 上一首
{
getPlayerEngine().prev();
}
break;
case R.id.StopImageButton:
// 停止
{
getPlayerEngine().stop();
}
break;
default:
break;
}
}
public static void launch(Context c, PlayMethod playlist) {
Intent intent = new Intent(c, PlayView.class);
intent.putExtra("playlist", playlist);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
c.startActivity(intent);
}
public static void launch(Activity c, PlaylistRemote playlistRemote) {
Intent intent = new Intent(c, PlayView.class);
new PlaylistRemoteLoadDialog(c, "正在努力加载", "加载失败", intent)
.execute(playlistRemote);
}
public static void launch(Activity activity, Album albumModal) {
new PlayAlbumLoadDialog(activity, "正在努力加载", "加载失败").execute(albumModal);
}
}