package com.kitty.poclient.fragment.mymusic;
import java.util.ArrayList;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckBox;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.kitty.poclient.R;
import com.kitty.poclient.adapter.SinglesAdapter;
import com.kitty.poclient.bean.LocalSingle;
import com.kitty.poclient.bean.LocalSingles;
import com.kitty.poclient.common.BroadcastManager;
import com.kitty.poclient.common.Constant;
import com.kitty.poclient.common.UIHelper;
import com.kitty.poclient.common.UpnpApp;
import com.kitty.poclient.common.WatchDog;
import com.kitty.poclient.dao.AlbumDao;
import com.kitty.poclient.data.VirtualData;
import com.kitty.poclient.domain.Album;
import com.kitty.poclient.domain.Music;
import com.kitty.poclient.fragment.PlayerFragment;
import com.kitty.poclient.upnp.BoxControl;
import com.kitty.poclient.upnp.Player;
import com.kitty.poclient.util.MediaUtil;
import com.kitty.poclient.widget.StandardCustomDialog;
@SuppressLint("HandlerLeak")
public class SinglesFragment extends BaseFragment {
private final String TAG = SinglesFragment.class.getSimpleName();
private LinearLayout llLvMusics;
private TextView tvNoData;
private int firstVisiblePosition = -1;// 记录listview的滚动位置
private int scrollTop;
private boolean dontChangeCurrentPosition = false;// 随机播放时使用
private ListView lvMusics;
private SinglesAdapter adapter;
private View view;
private LinearLayout playAndManage; //播放和管理区域
private LinearLayout llPlaymode; //“隨機播放”
private LinearLayout cacheManage; //“管理”
public static int SINGLE_MODE = 0; // current single mode
public static final int SINGLE_MODE_PLAY = 0;
public static final int SINGLE_MODE_MANAGE = 1;
private LinearLayout cancelAndClearcache;
private LinearLayout cancelClearCache; // 取消缓存
private CancelClearListener cancelClearListener;
private LinearLayout clearCache; // 确定清楚缓存
private LinearLayout selectAllBtn;// 全选linearLayout
private CheckBox selectAllCheckBox;
// private TextView tvPlaymode; //随机播放
// 侧滑菜单属性
private FrameLayout flMainUI;
private FrameLayout flSlidingMenu;
private RelativeLayout rlParent;
private long currentAnimationTime;
private int currentPosition = 0;
private int menuWidth;
private int scale;
private final int ANIMATION_DURATION = 20;
private final int MSG_ANIM = 0;
private boolean isShown = false;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
doAnimation();
}
};
@SuppressLint("HandlerLeak")
private Handler deleteHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case BoxControl.CLEAR_CACHE_SUCESS:
UpnpApp.mainHandler.showInfo(R.string.mymusic_cache_clear_success_info);
String idStr = (String) msg.obj;
removeSingles(idStr);
adapter.notifyDataSetChanged();
break;
case BoxControl.CLEAR_CACHE_FAILURE:
UpnpApp.mainHandler.showAlert(R.string.mymusic_cache_clear_failure_alert);
// adapter.notifyDataSetChanged();
break;
}
cancelClearListener.setEnableCancel(true);
// cancelClearCache.setOnClickListener(cancelClearListener);
}
};
public SinglesFragment() {
}
private void removeSingles(String idStr){
String[] deleteIdArray = idStr.split(",");
for(int i=0;i<deleteIdArray.length;i++){
long id = Long.parseLong(deleteIdArray[i]);
int position = VirtualData.localSingles.getPositionById(id);
VirtualData.localSingles.remove(position);
VirtualData.musics.remove(position);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.e(TAG, "onCreateView");
view = LayoutInflater.from(UpnpApp.context).inflate(R.layout.singles_fragment, null);
view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
initComponents();
initArguments();
initListeners();
// registerReceivers();
return view;
}
public String getFragmentName(){
return TAG;
}
private void initComponents() {
llLvMusics = (LinearLayout) view.findViewById(R.id.ll_lv_music);
tvNoData = (TextView) view.findViewById(R.id.tv_no_data);
lvMusics = (ListView) view.findViewById(R.id.lv_music);
}
private void initArguments() {
if (VirtualData.musics == null || VirtualData.musics.size() == 0) {
// 显示暂无数据
llLvMusics.setVisibility(View.GONE);
tvNoData.setVisibility(View.VISIBLE);
} else {
llLvMusics.setVisibility(View.VISIBLE);
tvNoData.setVisibility(View.GONE);
adapter = new SinglesAdapter(UpnpApp.context, VirtualData.musics);
lvMusics.setAdapter(adapter);
}
}
private void initListeners() {
lvMusics.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
new MediaUtil(getActivity()).playLocally(VirtualData.musics.get(position).getId());
}
});
}
private void showDeleteSinglesDialog() {
StandardCustomDialog.Builder builder = new StandardCustomDialog.Builder(getActivity());
builder.setTitle("清除歌曲缓存");
builder.setMessage("确认清除选中的" + VirtualData.localSingles.getSelectedItemNum() + "首歌曲?");
builder.setPositiveButton("取消",
new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setNegativeButton("确定",
new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
cancelClearListener.setEnableCancel(false);
// cancelClearCache.setOnClickListener(cancelClearListener);
dialog.dismiss();
String musicIds = "";
LocalSingles selectedSingles = VirtualData.localSingles.getSelectedSingles();
if (selectedSingles.size() > 0) {
for (int index = 0; index < selectedSingles.size();index++) {
LocalSingle selectedItem = selectedSingles.get(index);
if(index == 0){
musicIds = "" + selectedItem.getId();
} else {
musicIds = musicIds + "," + selectedItem.getId();
}
}
Log.i("SinglesCache", "begin delete, musicIds" + musicIds);
new BoxControl().clearcache(musicIds, BoxControl.MEDIA_TYPE_SINGLE, deleteHandler);
Log.i("SinglesCache", "finish delete, musicIds" + musicIds);
//判断是否全选
//TODO
if(selectAllCheckBox.isChecked()){
//如果全部单曲被清除,数据库中所有专辑的位置状态也应全部改为“在云端”
for(Album album:VirtualData.albums){
new AlbumDao().updateCloudState(album.getId(), Constant.LOCATION_STATE_REMOTE);
}
VirtualData.albums.clear();
VirtualData.localAlbums.clear();
} else {
//通知专辑、主题列表更新
UIHelper.refreshAllLocalView();
}
}
}
});
StandardCustomDialog dialog = builder.create();
dialog.setCancelable(false);
dialog.show();
}
private void setSingleMode(int mode){
SINGLE_MODE = mode;
switch(SINGLE_MODE){
case SINGLE_MODE_PLAY:
playAndManage.setVisibility(View.VISIBLE);
cancelAndClearcache.setVisibility(View.GONE);
selectAllBtn.setVisibility(View.GONE);
break;
case SINGLE_MODE_MANAGE:
// 初始化 管理模式
selectAllCheckBox.setChecked(false);
VirtualData.localSingles = LocalSingles.translateMusics(VirtualData.musics);;
adapter.notifyDataSetChanged();
playAndManage.setVisibility(View.GONE);
cancelAndClearcache.setVisibility(View.VISIBLE);
selectAllBtn.setVisibility(View.VISIBLE);
break;
}
}
protected void onSingleItemClick_PlayMode(int position) {
// 初始化播放列表
WatchDog.currentList = (ArrayList<Music>) VirtualData.musics;
WatchDog.currentListType = Constant.URI_MUSIC;
WatchDog.currentListId = 0L;
// sendBoxCurrentList("list_musics");
WatchDog.currentPlayingIndex = position;
WatchDog.currentPlayingMusic = VirtualData.musics.get(position);
WatchDog.currentPlayingId = WatchDog.currentPlayingMusic.getId();
System.out.println("WatchDog.currentPlayingId=" + WatchDog.currentPlayingId);
WatchDog.currentPlayingName = VirtualData.musics.get(position).getName();
WatchDog.currentArtistName = VirtualData.musics.get(position).getArtistName();
WatchDog.updateCachingState();// 如果上一曲未缓存完则修改其状态为等待
WatchDog.updateCachingState();// 本曲目状态立即转为正在下载
WatchDog.currentState = PlayerFragment.STOPPED;// 先改为停止以停止播放器图标的跳动
// initBtnPlayer();
UIHelper.refreshPlayerButton();
// adapter.notifyDataSetChanged();
String uri = VirtualData.musics.get(position).getUri(Constant.URI_MUSIC, 0);
playMusic(uri);
adapter.notifyDataSetChanged();
}
/*
* 定位至当前播放曲目
*/
protected void locateCurrentPlaying() {
if (!WatchDog.currentPlayingId.equals(0L)) {
for (int i = 0; i < VirtualData.musics.size(); i++) {
if (VirtualData.musics.get(i).getId().equals(WatchDog.currentPlayingId)) {
lvMusics.setSelection(i > 3 ? i - 3 : i);
}
}
} else {
return;
}
}
private void playMusic(String uri) {
Player p = new Player();
p.play(uri);
}
private void moveLayout(int scale) {
int left = flMainUI.getLeft();
System.out.println("left=" + left);
if ((left + scale) < menuWidth && (left + scale) > 0) {
// 还没有越界:
flMainUI.offsetLeftAndRight(scale);
currentPosition += scale;
} else if ((left + scale) >= menuWidth) {
// 再偏移就要越界的情况下:
flMainUI.offsetLeftAndRight(menuWidth - left);
currentPosition += menuWidth - left;
isShown = true;
WatchDog.isSlidingMenuShown = true;
System.out.println("now, isShown = true");
} else {
System.out.println("(left + scale)=" + (left + scale));
// 归零矫正
flMainUI.offsetLeftAndRight(0 - left);
currentPosition += 0 - left;
}
rlParent.invalidate();
flMainUI.forceLayout();
}
private void doAnimation() {
if (isShown == true) {
System.out.println("isShown=" + isShown);
moveLayout(-scale);
System.out.println("currentPosition=" + currentPosition);
if (currentPosition <= 0) {
handler.removeMessages(MSG_ANIM);
isShown = false;
WatchDog.isSlidingMenuShown = false;
rlParent.removeView(flSlidingMenu);
} else {
currentAnimationTime += ANIMATION_DURATION;
handler.sendMessageAtTime(handler.obtainMessage(MSG_ANIM), currentAnimationTime);
}
} else if (isShown == false) {
System.out.println("isShown=" + isShown);
moveLayout(scale);
System.out.println("currentPosition=" + currentPosition);
if (currentPosition >= menuWidth) {
handler.removeMessages(MSG_ANIM);
} else {
currentAnimationTime += ANIMATION_DURATION;
handler.sendMessageAtTime(handler.obtainMessage(MSG_ANIM), currentAnimationTime);
}
} else {
}
}
@Override
public void onResume() {
System.out.println(TAG + " onResume");
currentPosition = 0;
isShown = false;
WatchDog.isSlidingMenuShown = false;
if (adapter != null) {
adapter.notifyDataSetChanged();
} else {
System.out.println(TAG + "adapter==null");
}
System.out.println("sx=" + firstVisiblePosition);
// 恢复listview的卷动位置
if (firstVisiblePosition != -1 && dontChangeCurrentPosition == false) {
lvMusics.setSelectionFromTop(firstVisiblePosition, scrollTop);
}
super.onResume();
}
float x = 0;
float y = 0;
boolean heWantsTheMenu = false;
@Override
public void onDetach() {
unregisterReceivers();
super.onDetach();
}
private BroadcastReceiver updateListReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (adapter != null &&
!(WatchDog.currentListType == Constant.URI_USB || WatchDog.currentListType == Constant.URI_CUE)) {
initArguments();
}
System.out.println("sx=" + firstVisiblePosition);
// 恢复listview的卷动位置
if (firstVisiblePosition != -1 && dontChangeCurrentPosition == false) {
lvMusics.setSelectionFromTop(firstVisiblePosition, scrollTop);
}
}
};
private void registerReceivers() {
getActivity().registerReceiver(updateListReceiver, new IntentFilter(BroadcastManager.FILTER_UPDATE_LOCALLIST));
}
private void unregisterReceivers() {
getActivity().unregisterReceiver(updateListReceiver);
}
private class CancelClearListener implements OnClickListener {
private boolean enable = true;
public void setEnableCancel(boolean isEnable){
enable = isEnable;
}
@Override
public void onClick(View v) {
//切换到状态: play
if(enable){
setSingleMode(SINGLE_MODE_PLAY);
}
}
}
}