package com.lq.activity;
import java.lang.ref.WeakReference;
import java.util.List;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import android.widget.SeekBar;
import android.widget.TextView;
import com.google.analytics.tracking.android.EasyTracker;
import com.lq.adapter.LyricAdapter;
import com.lq.entity.LyricSentence;
import com.lq.entity.TrackInfo;
import com.lq.fragment.SelectPlaylistDialogFragment;
import com.lq.fragment.TrackDetailDialogFragment;
import com.lq.listener.OnPlaybackStateChangeListener;
import com.lq.service.MusicService;
import com.lq.service.MusicService.MusicPlaybackLocalBinder;
import com.lq.service.MusicService.PlayMode;
import com.lq.service.MusicService.State;
import com.lq.util.Constant;
import com.lq.util.LyricLoadHelper.LyricListener;
import com.lq.util.TimeHelper;
import com.lq.xpressmusic.R;
import com.umeng.analytics.MobclickAgent;
/**
* @author lq 2013-6-1 lq2625304@gmail.com
* */
public class PlayerActivity extends FragmentActivity {
public static final String TAG = PlayerActivity.class.getSimpleName();
public static final int MSG_SET_LYRIC_INDEX = 1;
/** 手势检测 */
private GestureDetector mDetector = null;
private ImageButton mView_ib_back = null;
private ImageButton mView_ib_more_functions = null;
private TextView mView_tv_songtitle = null;
private TextView mView_tv_current_time = null;
private TextView mView_tv_total_time = null;
private TextView mView_tv_lyric_empty = null;
private SeekBar mView_sb_song_progress = null;
private ImageButton mView_ib_play_mode = null;
private ImageButton mView_ib_play_previous = null;
private ImageButton mView_ib_play_or_pause = null;
private ImageButton mView_ib_play_next = null;
private ImageButton mView_ib_playqueue = null;
private ListView mView_lv_lyricshow = null;
private PopupMenu mOverflowPopupMenu = null;
private LyricAdapter mLyricAdapter = null;
private boolean mIsPlay = false;
private TrackInfo mPlaySong = null;
private MusicPlaybackLocalBinder mMusicServiceBinder = null;
private ClientIncomingHandler mHandler = new ClientIncomingHandler(this);
/** 处理来自服务端的消息 */
private static class ClientIncomingHandler extends Handler {
// 使用弱引用,避免Handler造成的内存泄露(Message持有Handler的引用,内部定义的Handler类持有外部类的引用)
WeakReference<PlayerActivity> mFragmentWeakReference = null;
PlayerActivity mActivity = null;
public ClientIncomingHandler(PlayerActivity a) {
mFragmentWeakReference = new WeakReference<PlayerActivity>(a);
mActivity = mFragmentWeakReference.get();
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SET_LYRIC_INDEX:
if (mActivity.mLyricAdapter.isEmpty()) {
Log.i(TAG, "歌词为空");
mActivity.mView_tv_lyric_empty
.setText(R.string.there_is_no_lyric_yet);
} else {
mActivity.mView_lv_lyricshow.setSelectionFromTop(msg.arg1,
mActivity.mView_lv_lyricshow.getHeight() / 2);
}
break;
default:
super.handleMessage(msg);
break;
}
}
}
/** 与Service连接时交互的类 */
private ServiceConnection mServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
Log.i(TAG, "onServiceConnected");
// 保持对Service的Binder引用,以便调用Service提供给客户端的方法
mMusicServiceBinder = (MusicPlaybackLocalBinder) service;
// 传递LyricListener对象给Service,以便歌词发生变化时通知本Activity
mMusicServiceBinder.registerLyricListener(mLyricListener);
// 传递OnPlaybackStateChangeListener对象给Service,以便音乐回放状态发生变化时通知本Activity
mMusicServiceBinder
.registerOnPlaybackStateChangeListener(mOnPlaybackStateChangeListener);
// 请求加载歌词
mMusicServiceBinder.requestLoadLyric();
initCurrentPlayInfo(mMusicServiceBinder.getCurrentPlayInfo());
}
// 与服务端连接异常丢失时才调用,调用unBindService不调用此方法哎
public void onServiceDisconnected(ComponentName className) {
Log.i(TAG, "onServiceDisconnected");
if (mMusicServiceBinder != null) {
mMusicServiceBinder
.unregisterOnPlaybackStateChangeListener(mOnPlaybackStateChangeListener);
}
}
};
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
findViews();
initViewsSetting();
};
@Override
public void onStart() {
Log.i(TAG, "onStart");
super.onStart();
// 本Activity界面显示时绑定服务,服务发送消息给本Activity以更新UI
bindService(new Intent(PlayerActivity.this, MusicService.class),
mServiceConnection, Context.BIND_AUTO_CREATE);
EasyTracker.getInstance(this).activityStart(this);
}
@Override
protected void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
@Override
public void onStop() {
Log.i(TAG, "onStop");
super.onStop();
// 本界面不可见时取消绑定服务,服务端无需发送消息过来,不可见时无需更新界面
unbindService(mServiceConnection);
if (mMusicServiceBinder != null) {
mMusicServiceBinder
.unregisterOnPlaybackStateChangeListener(mOnPlaybackStateChangeListener);
mMusicServiceBinder.unRegisterLyricListener();
mMusicServiceBinder = null;
}
EasyTracker.getInstance(this).activityStop(this);
}
@Override
public void onBackPressed() {
if (!getSupportFragmentManager().popBackStackImmediate()) {
switchToMain();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return this.mDetector.onTouchEvent(event);
}
/** 对各个控件设置相关参数、监听器等 */
private void initViewsSetting() {
// 手势设置----------------------------------------------
// 左滑切换至主页
mDetector = new GestureDetector(new SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
// 从左向右滑动
if (e1.getX() - e2.getX() < -120) {
switchToMain();
return true;
}
return false;
}
});
View.OnTouchListener gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (mDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
mView_lv_lyricshow.setOnTouchListener(gestureListener);
// 歌词秀设置---------------------------------------------------------------
mLyricAdapter = new LyricAdapter(this);
mView_lv_lyricshow.setAdapter(mLyricAdapter);
mView_lv_lyricshow.setEmptyView(mView_tv_lyric_empty);
mView_lv_lyricshow.startAnimation(AnimationUtils.loadAnimation(this,
android.R.anim.fade_in));
// 当前播放信息-----------------------------------------------------
mView_tv_current_time.setText(TimeHelper
.milliSecondsToFormatTimeString(0));
mView_tv_total_time.setText(TimeHelper
.milliSecondsToFormatTimeString(0));
// 回退按键----------------------------------------------------------
mView_ib_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchToMain();
}
});
// 播放控制-----------------------------------------------------------------
// 播放模式--
mView_ib_play_mode.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mMusicServiceBinder != null) {
mMusicServiceBinder.changePlayMode();
}
}
});
// 上一首--
mView_ib_play_previous.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PlayerActivity.this.startService(new Intent(
MusicService.ACTION_PREVIOUS));
}
});
// 播放、暂停
mView_ib_play_or_pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mIsPlay) {
PlayerActivity.this.startService(new Intent(
MusicService.ACTION_PAUSE));
} else {
PlayerActivity.this.startService(new Intent(
MusicService.ACTION_PLAY));
}
}
});
// 下一首--
mView_ib_play_next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PlayerActivity.this.startService(new Intent(
MusicService.ACTION_NEXT));
}
});
// 可拖动的进度条
mView_sb_song_progress
.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// 拖动播放进度条后发送消息给服务端,指示从指定进度开始播放
if (mMusicServiceBinder != null && mPlaySong != null) {
mMusicServiceBinder.seekToSpecifiedPosition(seekBar
.getProgress()
* (int) mPlaySong.getDuration()
/ seekBar.getMax());
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar,
int progress, boolean fromUser) {
if (fromUser && mPlaySong != null) {
// 根据滑动的进度计算出对应的播放时刻
mView_tv_current_time.setText(TimeHelper
.milliSecondsToFormatTimeString(progress
* mPlaySong.getDuration()
/ seekBar.getMax()));
}
}
});
// 显示当前播放队列的按钮--
mView_ib_playqueue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 显示当前播放队列
startActivity(new Intent(PlayerActivity.this,
PlayQueueActivity.class));
}
});
// 播放界面的功能列表--
mView_ib_more_functions.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 弹出播放界面的功能列表
mOverflowPopupMenu.show();
}
});
mOverflowPopupMenu
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (mPlaySong != null) {
// 播放界面功能列表项目
DialogFragment df = null;
switch (item.getItemId()) {
case R.id.track_addto:
// 弹出选择播放列表的窗口
df = SelectPlaylistDialogFragment
.newInstance(new long[] { mPlaySong
.getId() });
df.show(getSupportFragmentManager(), null);
break;
case R.id.track_info:
// 弹出歌曲详细信息的窗口
if (mPlaySong != null) {
df = TrackDetailDialogFragment
.newInstance(mPlaySong);
df.show(getSupportFragmentManager(), null);
}
break;
default:
break;
}
return true;
}
return false;
}
});
}
/**
* 根据播放模式设置播放模式按钮的图标
*
* @param mode
* 音乐播放模式
* */
private void setPlayModeImage(int mode) {
switch (mode) {
case PlayMode.REPEAT_SINGLE:
mView_ib_play_mode
.setImageResource(R.drawable.button_playmode_repeat_single);
// Toast.makeText(getApplicationContext(),
// getResources().getString(R.string.playmode_repeat_single),
// Toast.LENGTH_SHORT).show();
break;
case PlayMode.REPEAT:
mView_ib_play_mode
.setImageResource(R.drawable.button_playmode_repeat);
// Toast.makeText(getApplicationContext(),
// getResources().getString(R.string.playmode_repeat),
// Toast.LENGTH_SHORT).show();
break;
case PlayMode.SEQUENTIAL:
mView_ib_play_mode
.setImageResource(R.drawable.button_playmode_sequential);
// Toast.makeText(getApplicationContext(),
// getResources().getString(R.string.playmode_sequential),
// Toast.LENGTH_SHORT).show();
break;
case PlayMode.SHUFFLE:
mView_ib_play_mode
.setImageResource(R.drawable.button_playmode_shuffle);
// Toast.makeText(getApplicationContext(),
// getResources().getString(R.string.playmode_shuffle),
// Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
/** 初始化当前播放信息 */
private void initCurrentPlayInfo(Bundle bundle) {
int playMode = bundle.getInt(Constant.PLAY_MODE);
int currentPlayerState = bundle.getInt(Constant.PLAYING_STATE);
int currenPlayPosition = bundle.getInt(Constant.CURRENT_PLAY_POSITION,
0);
TrackInfo playingSong = bundle
.getParcelable(Constant.PLAYING_MUSIC_ITEM);
// 根据播放状态,设置播放按钮的图片
if (currentPlayerState == State.Playing
|| currentPlayerState == State.Preparing) {
mIsPlay = true;
mView_ib_play_or_pause.setImageResource(R.drawable.button_pause);
} else {
mIsPlay = false;
mView_ib_play_or_pause.setImageResource(R.drawable.button_play);
}
// 设置歌曲标题、时长、当前播放时间、当前播放进度
mPlaySong = playingSong;
if (playingSong != null) {
mView_tv_total_time.setText(TimeHelper
.milliSecondsToFormatTimeString(playingSong.getDuration()));
mView_tv_songtitle.setText(playingSong.getTitle());
mView_tv_current_time.setText(TimeHelper
.milliSecondsToFormatTimeString(currenPlayPosition));
mView_sb_song_progress.setProgress(currenPlayPosition
* mView_sb_song_progress.getMax()
/ (int) playingSong.getDuration());
}
// 设置播放模式按钮图片
setPlayModeImage(playMode);
}
private void findViews() {
setContentView(R.layout.layout_musicplay);
mView_ib_back = (ImageButton) findViewById(R.id.play_button_back);
mView_ib_more_functions = (ImageButton) findViewById(R.id.play_more_functions);
mView_ib_playqueue = (ImageButton) findViewById(R.id.play_list);
mView_ib_play_mode = (ImageButton) findViewById(R.id.play_mode);
mView_ib_play_next = (ImageButton) findViewById(R.id.play_playnext);
mView_ib_play_previous = (ImageButton) findViewById(R.id.play_playprevious);
mView_ib_play_or_pause = (ImageButton) findViewById(R.id.play_playbutton);
mView_sb_song_progress = (SeekBar) findViewById(R.id.play_progress);
mView_tv_current_time = (TextView) findViewById(R.id.play_current_time);
mView_tv_total_time = (TextView) findViewById(R.id.play_song_total_time);
mView_tv_songtitle = (TextView) findViewById(R.id.play_song_title);
mView_lv_lyricshow = (ListView) findViewById(R.id.lyricshow);
mView_tv_lyric_empty = (TextView) findViewById(R.id.lyric_empty);
mOverflowPopupMenu = new PopupMenu(PlayerActivity.this,
mView_ib_more_functions);
mOverflowPopupMenu.getMenuInflater()
.inflate(R.menu.track_operations_in_player,
mOverflowPopupMenu.getMenu());
}
private void switchToMain() {
Intent intent = new Intent(PlayerActivity.this,
MainContentActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.push_right_in, R.anim.push_right_out);
this.finish();
}
private OnPlaybackStateChangeListener mOnPlaybackStateChangeListener = new OnPlaybackStateChangeListener() {
@Override
public void onMusicPlayed() {
// 音乐播放时,播放按钮设置为暂停的图标(意为点击暂停)
mIsPlay = true;
mView_ib_play_or_pause.setImageResource(R.drawable.button_pause);
}
@Override
public void onMusicPaused() {
// 音乐暂停时,播放按钮设置为播放的图标(意为点击播放)
mIsPlay = false;
mView_ib_play_or_pause.setImageResource(R.drawable.button_play);
}
@Override
public void onMusicStopped() {
// 音乐播放停止时,清空歌曲信息的显示
mIsPlay = false;
mView_ib_play_or_pause.setImageResource(R.drawable.button_play);
mView_tv_total_time.setText(TimeHelper
.milliSecondsToFormatTimeString(0));
mView_tv_songtitle.setText("");
mView_tv_current_time.setText(TimeHelper
.milliSecondsToFormatTimeString(0));
mView_sb_song_progress.setProgress(0);
mLyricAdapter.setLyric(null);
mLyricAdapter.notifyDataSetChanged();
mPlaySong = null;
}
@Override
public void onPlayNewSong(TrackInfo playingSong) {
// 播放新的歌曲时,更新显示的歌曲信息
mPlaySong = playingSong;
if (playingSong != null) {
mView_tv_total_time.setText(TimeHelper
.milliSecondsToFormatTimeString(playingSong
.getDuration()));
mView_tv_songtitle.setText(playingSong.getTitle());
mView_tv_current_time.setText(TimeHelper
.milliSecondsToFormatTimeString(0));
mView_sb_song_progress.setProgress(0);
}
// 歌词秀清空
mView_tv_lyric_empty.setText(R.string.lyric_Loading);
}
@Override
public void onPlayModeChanged(int playMode) {
setPlayModeImage(playMode);
}
@Override
public void onPlayProgressUpdate(int currentMillis) {
// 更新当前播放时间
mView_tv_current_time.setText(TimeHelper
.milliSecondsToFormatTimeString(currentMillis));
// 更新当前播放进度
mView_sb_song_progress.setProgress(currentMillis
* mView_sb_song_progress.getMax()
/ (int) mPlaySong.getDuration());
}
};
private LyricListener mLyricListener = new LyricListener() {
@Override
public void onLyricLoaded(List<LyricSentence> lyricSentences, int index) {
Log.i(TAG, "onLyricLoaded");
if (lyricSentences != null) {
Log.i(TAG, "onLyricLoaded--->歌词句子数目=" + lyricSentences.size()
+ ",当前句子索引=" + index);
mLyricAdapter.setLyric(lyricSentences);
mLyricAdapter.setCurrentSentenceIndex(index);
mLyricAdapter.notifyDataSetChanged();
// 本方法执行时,lyricshow的控件还没有加载完成,所以延迟下再执行相关命令
mHandler.sendMessageDelayed(
Message.obtain(null, MSG_SET_LYRIC_INDEX, index, 0),
100);
}
}
@Override
public void onLyricSentenceChanged(int indexOfCurSentence) {
Log.i(TAG, "onLyricSentenceChanged--->当前句子索引=" + indexOfCurSentence);
mLyricAdapter.setCurrentSentenceIndex(indexOfCurSentence);
mLyricAdapter.notifyDataSetChanged();
mView_lv_lyricshow
.smoothScrollToPositionFromTop(indexOfCurSentence,
mView_lv_lyricshow.getHeight() / 2, 500);
}
};
}