package com.lq.activity;
import java.util.ArrayList;
import java.util.List;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.google.analytics.tracking.android.EasyTracker;
import com.lq.entity.TrackInfo;
import com.lq.fragment.PromptDialogFragment;
import com.lq.listener.OnPlaybackStateChangeListener;
import com.lq.service.MusicService;
import com.lq.service.MusicService.MusicPlaybackLocalBinder;
import com.lq.service.MusicService.State;
import com.lq.util.Constant;
import com.lq.xpressmusic.R;
import com.umeng.analytics.MobclickAgent;
/**
* @author lq 2013-6-1 lq2625304@gmail.com
* */
public class PlayQueueActivity extends FragmentActivity implements
OnItemClickListener {
private static final String TAG = PlayQueueActivity.class.getSimpleName();
private ListView mListView = null;
private View mClear = null;
private TextView mTitle = null;
private ArrayList<TrackInfo> mDataList = new ArrayList<TrackInfo>();
private ArrayList<String> mShownList = new ArrayList<String>();
private int mPlayingSongPosition = -1;
private MyArrayAdapter mAdapter = null;
/** 与MusicService交互的类 */
private MusicPlaybackLocalBinder mMusicServiceBinder = null;
private TrackInfo mPlayingTrack = null;
private int mPlayingState = State.Stopped;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.list_playqueue);
mListView = (ListView) findViewById(R.id.listview_play_queue);
mClear = findViewById(R.id.playqueue_clear);
mTitle = (TextView) findViewById(R.id.playqueue_title);
}
@Override
protected void onStart() {
Log.i(TAG, "onStart");
super.onStart();
// 本Activity界面显示时绑定服务,服务发送消息给本Activity以更新UI
bindService(new Intent(PlayQueueActivity.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
protected void onStop() {
Log.i(TAG, "onStop");
super.onStop();
// 本界面不可见时取消绑定服务,服务端无需发送消息过来,不可见时无需更新界面
mMusicServiceBinder
.unregisterOnPlaybackStateChangeListener(mOnPlaybackStateChangeListener);
unbindService(mServiceConnection);
mDataList = null;
mMusicServiceBinder = null;
EasyTracker.getInstance(this).activityStop(this);
}
@Override
protected void onDestroy() {
Log.i(TAG, "onDestroy");
super.onDestroy();
mShownList.clear();
mShownList = null;
}
@Override
public void onAttachedToWindow() {
// 设置本Activity在父窗口的位置
super.onAttachedToWindow();
View view = getWindow().getDecorView();
WindowManager.LayoutParams lp = (WindowManager.LayoutParams) view
.getLayoutParams();
lp.gravity = Gravity.RIGHT | Gravity.BOTTOM;
lp.x = getResources().getDimensionPixelSize(
R.dimen.playqueue_dialog_marginright);
lp.y = getResources().getDimensionPixelSize(
R.dimen.playqueue_dialog_marginbottom);
lp.width = getResources().getDimensionPixelSize(
R.dimen.playqueue_dialog_width);
lp.height = getResources().getDimensionPixelSize(
R.dimen.playqueue_dialog_height);
getWindowManager().updateViewLayout(view, lp);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// 点击音乐进行播放
Intent intent = new Intent(MusicService.ACTION_PLAY);
intent.putExtra(Constant.REQUEST_PLAY_ID, mDataList.get(position)
.getId());
intent.putExtra(Constant.CLICK_ITEM_IN_LIST, true);
startService(intent);
PlayQueueActivity.this.finish();
}
/** 获取传递过来的数据 */
private void handleArguments() {
Bundle args = mMusicServiceBinder.getCurrentPlayInfo();
mPlayingState = args.getInt(Constant.PLAYING_STATE, State.Stopped);
List<TrackInfo> list = args.getParcelableArrayList(Constant.DATA_LIST);
if (list != null) {
mDataList.addAll(list);
}
mPlayingTrack = args.getParcelable(Constant.PLAYING_MUSIC_ITEM);
if (mPlayingTrack != null) {
mPlayingSongPosition = MusicService.seekPosInListById(mDataList,
mPlayingTrack.getId());
}
if (mDataList != null) {
for (int i = 0; i < mDataList.size(); i++) {
mShownList.add(mDataList.get(i).getTitle());
}
}
}
/** 设置各个视图控件 */
private void initViewsSetting() {
// 根据数据源设置标题
if (mDataList == null) {
mTitle.setText(getResources().getString(R.string.playqueue) + "(0)");
} else if (mDataList.size() == 0) {
mTitle.setText(getResources().getString(R.string.playqueue) + "(0)");
} else {
mTitle.setText(getResources().getString(R.string.playqueue) + "("
+ mDataList.size() + ")");
}
// 设置清空按钮
mClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mShownList.size() != 0) {
DialogFragment df = PromptDialogFragment.newInstance(
getResources().getString(
R.string.confirm_clear_playqueue),
mDeletePromptListener);
df.show(getSupportFragmentManager(), null);
}
}
});
// 设置ListView
mAdapter = new MyArrayAdapter(PlayQueueActivity.this,
android.R.layout.simple_list_item_1, mShownList);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(PlayQueueActivity.this);
if (mPlayingSongPosition != -1) {
mListView.setSelectionFromTop(
mPlayingSongPosition,
getResources().getDimensionPixelSize(
R.dimen.playqueue_dialog_select_item_from_top));
}
}
/** 与Service连接时交互的类 */
private ServiceConnection mServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
Log.i(TAG, "onServiceConnected");
// 保持对Service的Binder引用,以便调用Service提供给客户端的方法
mMusicServiceBinder = (MusicPlaybackLocalBinder) service;
mMusicServiceBinder
.registerOnPlaybackStateChangeListener(mOnPlaybackStateChangeListener);
handleArguments();
initViewsSetting();
}
// 与服务端连接异常丢失时才调用,调用unBindService不调用此方法哎
public void onServiceDisconnected(ComponentName className) {
Log.i(TAG, "onServiceDisconnected");
}
};
// 删除提醒对话框处理------------------------------------------------------------------
private DialogInterface.OnClickListener mDeletePromptListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startService(new Intent(MusicService.ACTION_STOP));
mMusicServiceBinder.setCurrentPlayList(null);
mShownList.clear();
mAdapter.notifyDataSetChanged();
mTitle.setText(getResources().getString(R.string.playqueue) + "(0)");
PlayQueueActivity.this.finish();
}
};
private OnPlaybackStateChangeListener mOnPlaybackStateChangeListener = new OnPlaybackStateChangeListener() {
@Override
public void onMusicPlayed() {
mPlayingState = State.Playing;
}
@Override
public void onMusicPaused() {
mPlayingState = State.Paused;
}
@Override
public void onMusicStopped() {
mPlayingState = State.Stopped;
}
@Override
public void onPlayNewSong(TrackInfo playingSong) {
mPlayingSongPosition = MusicService.seekPosInListById(mDataList,
playingSong.getId());
mAdapter.notifyDataSetChanged();
}
@Override
public void onPlayModeChanged(int playMode) {
}
@Override
public void onPlayProgressUpdate(int currentMillis) {
}
};
class MyArrayAdapter extends ArrayAdapter<String> {
public MyArrayAdapter(Context context, int textViewResourceId,
List<String> objects) {
super(context, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv = (TextView) super.getView(position, convertView,
parent);
if (position == mPlayingSongPosition) {
// 对正在播放的歌曲设置高亮
tv.setTextColor(getResources().getColor(
R.color.holo_orange_dark));
} else {
tv.setTextColor(getResources().getColor(R.color.black));
}
return tv;
}
}
}