package com.lq.activity;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
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.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.analytics.tracking.android.EasyTracker;
import com.lq.adapter.TrackMutipleChooseAdapter;
import com.lq.dao.PlaylistDAO;
import com.lq.entity.TrackInfo;
import com.lq.fragment.PromptDialogFragment;
import com.lq.fragment.SelectPlaylistDialogFragment;
import com.lq.service.MusicService;
import com.lq.service.MusicService.MusicPlaybackLocalBinder;
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 MutipleEditActivity extends FragmentActivity implements
View.OnClickListener {
public static String ACTION_FINISH = MutipleEditActivity.class.getName()
+ ".ACTION_FINISH";
private final String TAG = MutipleEditActivity.class.getSimpleName();
private ImageView mView_Close = null;
private TextView mView_Title = null;
private TextView mView_NumOfSelect = null;
private CheckBox mView_SelectAll = null;
private ListView mView_ListView = null;
private View mView_PlayListLater = null;
private View mView_AddToPlaylist = null;
private View mView_Delete = null;
private TrackMutipleChooseAdapter mAdapter = null;
// Arguments
private ArrayList<TrackInfo> mDataList = null;
private String mTitle = null;
private int mFirstVisiblePosition = 0;
private int mParent = -1;
private int mPlaylistId = -1;
private int mCloseDelayTime = 500;
private LocalBroadcastManager mLocalBroadcastManager;
// 用于关闭本页面的广播接收器
// 如果在其他界面操作成功,会向发送一个关闭本页面的广播,本接收器会接受到该广播并处理请求
private BroadcastReceiver mReceiver;
private MusicPlaybackLocalBinder mMusicServiceBinder = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.mutiple_choose);
handleArguments();
findViews();
initViewsSetting();
initBroadcastReceiver();
}
@Override
protected void onStart() {
Log.i(TAG, "onStart");
super.onStart();
// 本Activity界面显示时绑定服务,服务发送消息给本Activity以更新UI
bindService(new Intent(MutipleEditActivity.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();
// 本界面不可见时取消绑定服务
unbindService(mServiceConnection);
EasyTracker.getInstance(this).activityStop(this);
}
@Override
protected void onDestroy() {
Log.i(TAG, "onDestroy");
super.onDestroy();
mDataList = null;
mAdapter = null;
mMusicServiceBinder = null;
mLocalBroadcastManager.unregisterReceiver(mReceiver);
}
private void handleArguments() {
// 获取Intent中传递过来的数据
Bundle args = getIntent().getExtras();
mDataList = args.getParcelableArrayList(Constant.DATA_LIST);
mTitle = args.getString(Constant.TITLE) + "(" + mDataList.size() + ")";
mFirstVisiblePosition = args.getInt(Constant.FIRST_VISIBLE_POSITION, 0);
mParent = args.getInt(Constant.PARENT, -1);
mPlaylistId = args.getInt(Constant.PLAYLIST_ID, -1);
}
/** 配置广播接收器 */
private void initBroadcastReceiver() {
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_FINISH);
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_FINISH)) {
// 接受到关闭本页面的请求,则关闭本页面
// 延时关闭(等本Activity弹出的对话框都消失再关闭)
mHandler.sendEmptyMessageDelayed(0, mCloseDelayTime);
}
}
};
mLocalBroadcastManager.registerReceiver(mReceiver, filter);
}
/** 获取布局中的各个View对象 */
private void findViews() {
mView_Close = (ImageView) findViewById(R.id.close_mutiple_edit);
mView_Title = (TextView) findViewById(R.id.title_mutiple_edit);
mView_NumOfSelect = (TextView) findViewById(R.id.num_of_select);
mView_PlayListLater = (View) findViewById(R.id.play_list_later);
mView_AddToPlaylist = (View) findViewById(R.id.add_to_playlist);
mView_Delete = (View) findViewById(R.id.delete_selected_item);
mView_SelectAll = (CheckBox) findViewById(R.id.select_all_cb);
mView_ListView = (ListView) findViewById(R.id.listview_mutiple);
}
/** 初始化各个View的设置 */
private void initViewsSetting() {
// ListView的设置--------------------------------------------------------
mAdapter = new TrackMutipleChooseAdapter(this, mDataList);
mView_ListView.setAdapter(mAdapter);
mView_ListView.setSelection(mFirstVisiblePosition);
mView_ListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
mView_ListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 更新条目勾选状态
mAdapter.toggleCheckedState(position);
// 每次选择条目后,更新已选择的数目
mView_NumOfSelect.setText(getResources().getString(
R.string.has_selected)
+ mAdapter.getSelectedItemPositions().length
+ getResources().getString(R.string.a_piece_of_song));
}
});
// 关闭按钮的设置--------------------------------------------------------
mView_Close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 点击关闭按钮,关闭本Activity
MutipleEditActivity.this.finish();
}
});
// 标题设置--------------------------------------------------------
mView_Title.setText(mTitle);
// 已选歌曲数量的设置-----------------------------------------------------
mView_NumOfSelect.setText(getResources().getString(
R.string.has_selected)
+ 0 + getResources().getString(R.string.a_piece_of_song));
// 全选按钮的设置-----------------------------------------------------
mView_SelectAll
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// 根据全选按钮状态,全选或全不选所有条目
mAdapter.selectAllItem(isChecked);
// 更新已选择的数目
mView_NumOfSelect.setText(getResources().getString(
R.string.has_selected)
+ mAdapter.getSelectedItemPositions().length
+ getResources().getString(
R.string.a_piece_of_song));
}
});
// 三个批量操作按钮的设置-----------------------------------------------------
mView_AddToPlaylist.setOnClickListener(MutipleEditActivity.this);
mView_PlayListLater.setOnClickListener(MutipleEditActivity.this);
mView_Delete.setOnClickListener(MutipleEditActivity.this);
}
// 处理歌曲的批量操作
@Override
public void onClick(View v) {
Log.i(TAG, "onClick");
switch (v.getId()) {
case R.id.add_to_playlist:
if (mAdapter.getSelectedItemPositions().length == 0) {
// 如果尚未选择任何条目,提示一下
Toast.makeText(MutipleEditActivity.this,
R.string.please_select_add_song_first,
Toast.LENGTH_SHORT).show();
} else {
// 弹出选择播放列表的窗口
long[] selectedAudioIds = mAdapter.getSelectedAudioIds();
DialogFragment df = SelectPlaylistDialogFragment
.newInstance(selectedAudioIds);
df.show(getSupportFragmentManager(), null);
}
break;
case R.id.play_list_later:
if (mAdapter.getSelectedItemPositions().length == 0) {
// 如果尚未选择任何条目,提示一下
Toast.makeText(MutipleEditActivity.this,
R.string.please_select_play_song_first,
Toast.LENGTH_SHORT).show();
} else {
// 追加选择的歌曲条目到后台的正在播放的列表中
mMusicServiceBinder.appendToCurrentPlayList(mAdapter
.getSelectedItems());
// 关闭本界面
mHandler.sendEmptyMessageDelayed(0, mCloseDelayTime);
}
break;
case R.id.delete_selected_item:
if (mAdapter.getSelectedItemPositions().length == 0) {
// 如果尚未选择任何条目,提示一下
Toast.makeText(MutipleEditActivity.this,
R.string.please_select_delete_song_first,
Toast.LENGTH_SHORT).show();
} else {
DialogFragment df;
if (mParent == Constant.START_FROM_PLAYLIST) {
df = PromptDialogFragment
.newInstance(
getResources()
.getString(
R.string.confirm_remove_song_from_playlist),
mDeletePromptListener);
} else {
df = PromptDialogFragment.newInstance(getResources()
.getString(R.string.confirm_delete_song_file),
mDeletePromptListener);
}
df.show(getSupportFragmentManager(), null);
}
break;
default:
break;
}
}
private MyHandler mHandler = new MyHandler(MutipleEditActivity.this);
private static class MyHandler extends Handler {
// 使用弱引用,避免Handler造成的内存泄露(Message持有Handler的引用,内部定义的Handler类持有外部类的引用)
WeakReference<MutipleEditActivity> mWeakReference = null;
MutipleEditActivity mActivity = null;
public MyHandler(MutipleEditActivity a) {
mWeakReference = new WeakReference<MutipleEditActivity>(a);
mActivity = mWeakReference.get();
}
public void handleMessage(Message msg) {
// 关闭本页面
mActivity.finish();
}
}
private DialogInterface.OnClickListener mDeletePromptListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
boolean isDeleted = false;
switch (mParent) {
case Constant.START_FROM_PLAYLIST:
// 从播放列表移除歌曲,不会删除文件
isDeleted = PlaylistDAO.removeTrackFromPlaylist(
getContentResolver(), mPlaylistId,
mAdapter.getSelectedAudioIds());
if (isDeleted) {
// 提示移除成功
Toast.makeText(MutipleEditActivity.this,
getResources().getString(R.string.remove_success),
Toast.LENGTH_SHORT).show();
}
break;
default:
// 删除指定的歌曲,在存储器上的文件和数据库里的记录都要删除
PlaylistDAO.removeTrackFromDatabase(getContentResolver(),
mAdapter.getSelectedAudioIds());
isDeleted = PlaylistDAO.deleteFiles(mAdapter
.getSelectedAudioPaths());
if (isDeleted) {
// 提示删除成功
Toast.makeText(MutipleEditActivity.this,
getResources().getString(R.string.delete_success),
Toast.LENGTH_SHORT).show();
}
break;
}
if (!isDeleted) {
// 删除失败,提示失败信息
Toast.makeText(MutipleEditActivity.this,
getResources().getString(R.string.delete_failed),
Toast.LENGTH_SHORT).show();
} else {
mHandler.sendEmptyMessageDelayed(0, mCloseDelayTime);
}
}
};
/** 与Service连接时交互的类 */
private ServiceConnection mServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
Log.i(TAG, "onServiceConnected");
// 保持对Service的Binder引用,以便调用Service提供给客户端的方法
mMusicServiceBinder = (MusicPlaybackLocalBinder) service;
}
// 与服务端连接异常丢失时才调用,调用unBindService不调用此方法哎
public void onServiceDisconnected(ComponentName className) {
Log.i(TAG, "onServiceDisconnected");
}
};
}