package com.kitty.poclient.fragment;
import java.util.ArrayList;
import java.util.List;
import org.fourthline.cling.controlpoint.SubscriptionCallback;
import org.fourthline.cling.model.ModelUtil;
import org.fourthline.cling.model.action.ActionInvocation;
import org.fourthline.cling.model.message.UpnpResponse;
import org.fourthline.cling.model.types.UnsignedIntegerFourBytes;
import org.fourthline.cling.support.avtransport.callback.GetPositionInfo;
import org.fourthline.cling.support.avtransport.callback.Pause;
import org.fourthline.cling.support.avtransport.callback.Play;
import org.fourthline.cling.support.avtransport.callback.Seek;
import org.fourthline.cling.support.avtransport.callback.SetAVTransportURI;
import org.fourthline.cling.support.model.PositionInfo;
import org.fourthline.cling.support.renderingcontrol.callback.GetVolume;
import org.fourthline.cling.support.renderingcontrol.callback.SetVolume;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import com.kitty.poclient.R;
import com.kitty.poclient.activity.MainActivity;
import com.kitty.poclient.adapter.PlaylistMusicListAdapter;
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.data.VirtualData;
import com.kitty.poclient.domain.Music;
import com.kitty.poclient.fragment.usb.ExternalDeviceFragment;
import com.kitty.poclient.upnp.Player;
import com.kitty.poclient.util.BitmapUtil;
import com.kitty.poclient.util.DateTimeFormatUtil;
import com.kitty.poclient.util.PowerfulBigMan;
import com.kitty.poclient.util.URIParams;
import com.kitty.poclient.util.LoadImageAysnc.ImageCallBack;
import com.kitty.poclient.widget.CustomToast;
//试听曲目
public class PlaylistFragment extends Fragment {
private final String TAG = PlaylistFragment.class.getSimpleName()+":";//onItemC
private View view;
private LinearLayout llPlayer;
private LinearLayout llPlaypic;
private LinearLayout llVolumn;
private LinearLayout llCache;
private LinearLayout llLvPlaylist;
private FrameLayout flBtnAnim;
private ImageView ivBtnAnimArrow;
private Thread threadBtnAnim;
private Animation btnAnimation;
// 控件
private FrameLayout flControlArea;
private FrameLayout flSbProgress;// flSbProgress.setVisibility(View.GONE)
private Button btnPlayPause, btnNext, btnPrev;// btnPrev.seton
private ImageButton btnBack;
private ImageButton btnPlaylist;
private Button btnPlaymode;
private Button btnVolumn;
private TextView tvCurrentTime, tvTotalTime;
private TextView tvMusicName;
private TextView tvArtistName;
private SeekBar sbProgress, sbVolumn;
private SeekBar sbCache;
private ImageView ivPicPlaying;
private ListView lvPlaylist;
// 播放状态
public static final String PLAYING = "PLAYING";
public static final String PAUSED_PLAYBACK = "PAUSED_PLAYBACK";
public static final String STOPPED = "STOPPED";
public static final String PREPARED = "PREPARED";
public static final String TRANSITIONING = "TRANSITIONING";
// 播放模式
public static final int MODE_ORDER = 1;
public static final int MODE_SHUFFLE = 2;
public static final int MODE_SINGLE = 3;
public static final int MODE_ALL = 4;
// 数据
private String currentState = "";
private String currentTime;
private String duration;
private int currentPercent;
private int totalSeconds;
private int currentSeconds;
private int currentVolumn;
private int gpfail = 0;
private int currentCachingChanger = 0;
private Runnable progressRunnable;
private PositionInfo positionInfo;
private boolean mute = false;
private boolean llVolumnShown = false;
private boolean llLvPlaylistShown = false;
private boolean isCaching = false;
private boolean shouldSayHello2Death = false;// 为真时叫停所有循环
private boolean hasEverPaused = false;// 屏幕是否曾休眠
// private boolean isLastClickFromBtnPrev = false;
private int countPrevClick = 0;
// private boolean transitioningCancel = false;
private Thread progressThread;
private SubscriptionCallback myAvTransportSub;
// 正在播放列表
private ArrayList<Music> playlist;
private PlaylistMusicListAdapter adapter;
private final int MSG_MUTE = 1;
private final int MSG_VOLUMN = 2;
private final int MSG_INIT_PIC = 3;
private final int MSG_CLEAR_PLAYING_PROGRESS = 4;
private final int MSG_BTN_PREV = 5;
private BroadcastReceiver playlistSeekPositionReceiver=new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
Log.e("BUG839", TAG+"playlistSeekPositionReceiver onReceive()");
seekToCurrentPlayingPosition();
}
};
private MainActivity mainActivity;
public PlaylistFragment() {
}
public PlaylistFragment(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
if (totalSeconds != 0) {
tvCurrentTime.setText(currentTime);
tvTotalTime.setText(duration);
sbProgress.setProgress(currentPercent);
} else {
getPositionInfo();
}
break;
case MSG_VOLUMN:
sbVolumn.setProgress(currentVolumn);
break;
case MSG_INIT_PIC:
Bitmap bitmap = (Bitmap) msg.getData().get("bitmap");
ivPicPlaying.setImageBitmap(bitmap);
break;
case MSG_CLEAR_PLAYING_PROGRESS:
clearPlayingProgress();
break;
case MSG_BTN_PREV:
if (PowerfulBigMan.testClickInterval() == false) {
return;
}
if (countPrevClick == 1) {
playThisAgain();
countPrevClick = 0;
} else if (countPrevClick > 1) {
WatchDog.latestOperation = "prev";
playPrev();
countPrevClick = 0;
}
break;
}
}
};
private BroadcastReceiver playNewMusicReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// stop();
String uri = intent.getStringExtra("uri");
setNewUri(uri);
while (!currentState.equals(PREPARED) && shouldSayHello2Death == false) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
play();
}
};
private BroadcastReceiver setTransportStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String transportState = intent.getStringExtra("transportState");
System.out.println(TAG + ":setTransportStateReceiver:transportState=" + transportState);
setTransportState(transportState);
}
};
private BroadcastReceiver setCurrentTrackURIReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String currentTrackURI = intent.getStringExtra("currentTrackURI");
setCurrentTrackURI(currentTrackURI);
}
};
private BroadcastReceiver setCurrentTrackDurationReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String currentTrackDuration = intent.getStringExtra("currentTrackDuration");
setCurrentTrackDuration(currentTrackDuration);
}
};
// 设置模式失败时退回上一个模式
private BroadcastReceiver setCurrentPlaymodeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("setBackCurrentPlaymodeReceiver onReceive");
switch (WatchDog.currentPlaymode) {
case MODE_ORDER:
btnPlaymode.setBackgroundResource(R.drawable.playmode_order_selector);
break;
case MODE_SHUFFLE:
btnPlaymode.setBackgroundResource(R.drawable.playmode_shuffle_selector);
break;
case MODE_SINGLE:
btnPlaymode.setBackgroundResource(R.drawable.playmode_repeat_singlel_selector);
break;
case MODE_ALL:
btnPlaymode.setBackgroundResource(R.drawable.playmode_repeat_all_selector);
break;
}
}
};
// 设置模式失败时退回上一个模式
private BroadcastReceiver setBackCurrentPlaymodeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("setBackCurrentPlaymodeReceiver onReceive");
switch (WatchDog.currentPlaymode) {
case MODE_ORDER:
WatchDog.currentPlaymode = MODE_ALL;
btnPlaymode.setBackgroundResource(R.drawable.playmode_repeat_all_selector);
break;
case MODE_SHUFFLE:
WatchDog.currentPlaymode = MODE_ORDER;
btnPlaymode.setBackgroundResource(R.drawable.playmode_order_selector);
break;
case MODE_SINGLE:
WatchDog.currentPlaymode = MODE_SHUFFLE;
btnPlaymode.setBackgroundResource(R.drawable.playmode_shuffle_selector);
break;
case MODE_ALL:
WatchDog.currentPlaymode = MODE_SINGLE;
btnPlaymode.setBackgroundResource(R.drawable.playmode_repeat_singlel_selector);
break;
}
}
};
private BroadcastReceiver updateCacheProgressReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int progress = intent.getIntExtra("progress", -1);
if (progress != -1) {
sbCache.setProgress(progress);
}
if (progress >= 100) {
isCaching = false;
WatchDog.cacheStateMap.put(WatchDog.currentPlayingMusic.getId(), Music.CACHE_DOWNLOADED);
UIHelper.refreshLocalSinglesView();
btnPlayPause.setEnabled(true);
flSbProgress.setVisibility(View.VISIBLE);
tvCurrentTime.setVisibility(View.VISIBLE);
tvTotalTime.setVisibility(View.VISIBLE);
llCache.setVisibility(View.GONE);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
getMediaInfo();
getTransportInfo();
}
}
};
private void refreshUsbMusicDisplayInfo(){
tvArtistName.setText(ExternalDeviceFragment.currentArtistName);
tvMusicName.setText(ExternalDeviceFragment.currentPlayingName);
}
private BroadcastReceiver updateMediaInfoReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
boolean isUsbMusic = intent.getBooleanExtra("is_usb_music", false);
if (isUsbMusic
|| ExternalDeviceFragment.currentListType == Constant.URI_USB
|| ExternalDeviceFragment.currentListType == Constant.URI_CUE) {//[外联设备]
initPlaylist();
} else {//【我的音乐】【音乐商店】
tvArtistName.setText(WatchDog.currentArtistName);
tvMusicName.setText(WatchDog.currentPlayingName);
Log.i(TAG, "tvMusicName.setText(" + WatchDog.currentPlayingName + ");");
initPic();
btnNext.setEnabled(true);
btnPrev.setEnabled(true);
// getPositionInfo();
if (progressRunnable == null) {
updateProgress(WatchDog.currentPlayingName);
System.out.println("fucking updateProgress(" + WatchDog.currentPlayingName + ")");
}
}
}
};
// 播放下一曲返回成功,且状态为正在播放时,刷新媒体信息
private BroadcastReceiver initPlayerReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (isCaching == false && currentState == PLAYING) {
getTransportInfo();
getMediaInfo();
}
}
};
private BroadcastReceiver updatePlayModeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (WatchDog.currentPlaymode) {
case MODE_ORDER:
btnPlaymode.setBackgroundResource(R.drawable.playmode_order_selector);
break;
case MODE_SHUFFLE:
btnPlaymode.setBackgroundResource(R.drawable.playmode_shuffle_selector);
break;
case MODE_SINGLE:
btnPlaymode.setBackgroundResource(R.drawable.playmode_repeat_singlel_selector);
break;
case MODE_ALL:
btnPlaymode.setBackgroundResource(R.drawable.playmode_repeat_all_selector);
break;
}
}
};
private BroadcastReceiver errorMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
if ("".equals(msg) || msg == null) {
System.out.println(">>>>>>>>>>>>>>>>>Empty Error Msg<<<<<<<<<<<<<<<<<");
} else {
CustomToast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
}
}
};
private BroadcastReceiver updateListReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
};
// private BroadcastReceiver babyNotMineReceiver = new BroadcastReceiver() {
// @Override
// public void onReceive(Context context, Intent intent) {
// Log.e("BUG896", TAG + "babyNotMineReceiver onReceive");
//// UpnpApp.mainHandler.showAlert(R.string.device_occupated);
//
// Intent intent2 = new Intent(getActivity(), LoginActivity.class);
// intent2.putExtra("from", "babyNotMineReceiver");
// startActivity(intent2);
// }
// };
private BroadcastReceiver mediaOutOfServiceReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mosExit();
}
};
private void mosExit() {
// finish();
//屏蔽提示“网络试听同步功能将在稍后开放”
// CustomToast.makeText(getActivity(), WatchDog.mediaOutOfServiceReson, Toast.LENGTH_SHORT).show();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG, "onCreateView()");
view = inflater.inflate(R.layout.playlist, null);
initComponents();
// initArguments();
// initListeners();
// registerReceivers();
//
// getPlayMode();
// getVolumn();
//
// if (isCaching == false) {
// getMediaInfo();
// getTransportInfo();
// }
// showPlayList();
return view;
}
private void getPlayMode() {
new Player().getPlayMode();
}
protected void initPic() {
if (WatchDog.currentPlayingMusic == null) {
ivPicPlaying.setImageResource(R.drawable.pic);
return;
} else {
String imgurl = WatchDog.currentPlayingMusic.getImgUrl();
if (imgurl != null) {
final String imageKey = imgurl + "150";// 250
// 开始异步加载数据
Bitmap bitmap = BitmapUtil.loadImageAysnc.loadImage(imageKey, imgurl, 150, false, new ImageCallBack() {
@Override
public void imageLoaded(Bitmap bitmap) {
if (ivPicPlaying != null) {
ivPicPlaying.setImageBitmap(bitmap);
}
}
});
if (bitmap != null) {
ivPicPlaying.setImageBitmap(bitmap);
}
}
}
}
private void getMediaInfo() {
new Player().getMediaInfo();
}
private void getTransportInfo() {
new Player().getTransportInfo();
}
@Override
public void onDetach() {
// stopAllHiddenThread();
//
// UIHelper.refreshLocalSinglesView();
//
// WatchDog.latestOperation = "";
super.onDetach();
}
@Override
public void onDestroyView() {
// Log.e("BUG839", TAG+"onDestroyView()");
// unregisterReceivers();
super.onDestroyView();
}
private void initComponents() {
llPlayer = (LinearLayout) view.findViewById(R.id.ll_player);
llPlaypic = (LinearLayout) view.findViewById(R.id.ll_playpic);
llVolumn = (LinearLayout) view.findViewById(R.id.ll_volumn);
llCache = (LinearLayout) view.findViewById(R.id.ll_cache);
llLvPlaylist = (LinearLayout) view.findViewById(R.id.ll_lv_playlist);
flBtnAnim = (FrameLayout) view.findViewById(R.id.fl_btn_anim);
flControlArea = (FrameLayout) view.findViewById(R.id.fl_control_area);
flSbProgress = (FrameLayout) view.findViewById(R.id.fl_sb_progress);
ivPicPlaying = (ImageView) view.findViewById(R.id.iv_pic_playing);
ivBtnAnimArrow = (ImageView) view.findViewById(R.id.iv_btn_anim_arrow);
lvPlaylist = (ListView) view.findViewById(R.id.lv_playlist);
btnPlayPause = (Button) view.findViewById(R.id.btn_play_pause);
btnPrev = (Button) view.findViewById(R.id.btn_prev);
btnNext = (Button) view.findViewById(R.id.btn_next);
btnBack = (ImageButton) view.findViewById(R.id.btn_back);
btnPlaylist = (ImageButton) view.findViewById(R.id.btn_playlist);
btnPlaymode = (Button) view.findViewById(R.id.btn_playmode);
btnVolumn = (Button) view.findViewById(R.id.btn_volumn);
tvCurrentTime = (TextView) view.findViewById(R.id.tv_current_time);
tvTotalTime = (TextView) view.findViewById(R.id.tv_total_time);
tvMusicName = (TextView) view.findViewById(R.id.tv_music_name);
tvArtistName = (TextView) view.findViewById(R.id.tv_artist_name);
sbProgress = (SeekBar) view.findViewById(R.id.sb_progress);
sbVolumn = (SeekBar) view.findViewById(R.id.sb_volumn);
sbCache = (SeekBar) view.findViewById(R.id.sb_cache_progress);
}
private void initArguments() {
llVolumn.setVisibility(View.GONE);
if (WatchDog.currentListType == Constant.URI_USB || WatchDog.currentListType == Constant.URI_CUE) {
btnPlayPause.setEnabled(true);
flSbProgress.setVisibility(View.VISIBLE);
tvCurrentTime.setVisibility(View.VISIBLE);
tvTotalTime.setVisibility(View.VISIBLE);
llCache.setVisibility(View.GONE);
} else {
long id = 0;
if (WatchDog.currentPlayingMusic != null) {
id = WatchDog.currentPlayingMusic.getId();
}
if (WatchDog.cacheStateMap.containsKey(id) == false) {
btnPlayPause.setEnabled(true);
flSbProgress.setVisibility(View.VISIBLE);
tvCurrentTime.setVisibility(View.VISIBLE);
tvTotalTime.setVisibility(View.VISIBLE);
llCache.setVisibility(View.GONE);
} else if (!WatchDog.cacheStateMap.get(id).equals(Music.CACHE_DOWNLOADED)) {
isCaching = true;
btnPlayPause.setEnabled(false);
setBtnCachingAnim();
flSbProgress.setVisibility(View.GONE);
tvCurrentTime.setVisibility(View.GONE);
tvTotalTime.setVisibility(View.GONE);
llCache.setVisibility(View.VISIBLE);
initPic();
getCacheProgress(id);
} else {
btnPlayPause.setEnabled(true);
flSbProgress.setVisibility(View.VISIBLE);
tvCurrentTime.setVisibility(View.VISIBLE);
tvTotalTime.setVisibility(View.VISIBLE);
llCache.setVisibility(View.GONE);
}
}
tvMusicName.setText(WatchDog.currentPlayingName == "" || WatchDog.currentPlayingName == null ? "歌曲名" : WatchDog.currentPlayingName);
tvArtistName.setText(WatchDog.currentArtistName == "" || WatchDog.currentArtistName == null ? "演出者" : WatchDog.currentArtistName);
switch (WatchDog.currentPlaymode) {
case MODE_ORDER:
btnPlaymode.setBackgroundResource(R.drawable.playmode_order_selector);
break;
case MODE_SHUFFLE:
btnPlaymode.setBackgroundResource(R.drawable.playmode_shuffle_selector);
break;
case MODE_SINGLE:
btnPlaymode.setBackgroundResource(R.drawable.playmode_repeat_singlel_selector);
break;
case MODE_ALL:
btnPlaymode.setBackgroundResource(R.drawable.playmode_repeat_all_selector);
break;
}
if (WatchDog.currentList == null || WatchDog.currentList.size() == 0) {
btnPlaylist.setEnabled(false);
btnNext.setEnabled(false);
btnPrev.setEnabled(false);
} else {
btnPlaylist.setEnabled(true);
btnNext.setEnabled(true);
btnPrev.setEnabled(true);
}
if (WatchDog.currentListType == Constant.URI_USB || WatchDog.currentListType == Constant.URI_CUE) {
// TODO 外联设备 - 文件 - 播放列表 -未稳定
btnPlaylist.setVisibility(View.VISIBLE);
}
btnPlaylist.setVisibility(View.INVISIBLE);
}
private void getCacheProgress(final long id) {
// new Thread(new Runnable() {
// int n1 = currentCachingChanger;
// Music m = WatchDog.currentPlayingMusic;
//
// @Override
// public void run() {
// while (!WatchDog.cacheStateMap.get(id).equals(Music.CACHE_DOWNLOADED) && m == WatchDog.currentPlayingMusic && n1 == currentCachingChanger && shouldSayHello2Death == false) {
// new Cacher().getCacheProgress(Constant.regCacheUriMusic + WatchDog.currentPlayingMusic.getId());
// try {
// Thread.sleep(2000);
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
// }
// }).start();
}
private void initListeners() {
btnPlayPause.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (PowerfulBigMan.testClickInterval() == false) {
return;
}
if (!currentState.equals(PLAYING)) {
play();
btnPlayPause.setBackgroundResource(R.drawable.btn_pause_selector);
} else {
pause();
btnPlayPause.setBackgroundResource(R.drawable.btn_play_selector);
}
}
});
sbProgress.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int pro = seekBar.getProgress();
System.out.println("pro=" + pro);
seekTo(pro);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// System.out.println("newProgress="+progress);
}
});
sbVolumn.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int pro = seekBar.getProgress();
System.out.println("pro=" + pro);
setVolumn(pro);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// System.out.println("newProgress="+progress);
}
});
btnNext.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (PowerfulBigMan.testClickInterval() == false) {
return;
}
WatchDog.latestOperation = "next";
playNext();
}
});
btnPrev.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
countPrevClick++;
handler.sendEmptyMessageDelayed(MSG_BTN_PREV, 1000);// 一秒钟后根据点击次数判断单击还是双击
}
});
btnBack.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mainActivity.showViewpage(MainActivity.PLAYER_PAGE_ITEM_NUM);
}
});
btnPlaylist.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// parent.showPlayer();
}
});
btnPlaymode.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
switch (WatchDog.currentPlaymode) {
case MODE_ORDER:
WatchDog.currentPlaymode = MODE_SHUFFLE;
sendBoxPlayMode(MODE_SHUFFLE);
btnPlaymode.setBackgroundResource(R.drawable.playmode_shuffle_selector);
break;
case MODE_SHUFFLE:
WatchDog.currentPlaymode = MODE_SINGLE;
sendBoxPlayMode(MODE_SINGLE);
btnPlaymode.setBackgroundResource(R.drawable.playmode_repeat_singlel_selector);
break;
case MODE_SINGLE:
WatchDog.currentPlaymode = MODE_ALL;
sendBoxPlayMode(MODE_ALL);
btnPlaymode.setBackgroundResource(R.drawable.playmode_repeat_all_selector);
break;
case MODE_ALL:
WatchDog.currentPlaymode = MODE_ORDER;
sendBoxPlayMode(MODE_ORDER);
btnPlaymode.setBackgroundResource(R.drawable.playmode_order_selector);
break;
}
}
});
btnVolumn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showOrHideVolumn();
}
});
}
protected void playThisAgain() {
Player p = new Player();
p.stop();
// p.play(WatchDog.currentPlayingMusic.getUri(Constant.URI_MUSIC, 0));
p.play(WatchDog.currentUri);
p = null;
}
protected void sendBoxPlayMode(int mode) {
Player p = new Player();
p.sendBoxPlayMode(mode);
}
private void showPlayList(){
llLvPlaylist.setVisibility(View.VISIBLE);
llPlaypic.setVisibility(View.GONE);
flControlArea.setVisibility(View.GONE);
// flControlArea.setBackgroundResource(R.color.icecream_bg);
llLvPlaylistShown = true;
//首次打开列表
initPlaylist();
btnPlaylist.setImageResource(R.drawable.btn_playpic);
}
private void initPlaylist() {
Log.i(TAG, "ExternalDeviceFragment.currentListType:" + ExternalDeviceFragment.currentListType);
Log.e("BUG902", TAG+"initPlaylist():WatchDog.currentListType="+WatchDog.currentListType);
if (WatchDog.currentListType == Constant.URI_USB
|| WatchDog.currentListType == Constant.URI_CUE) {
// 【外联设备】初始化播放列表
playlist = ExternalDeviceFragment.currentList;
adapter = new PlaylistMusicListAdapter(getActivity(), playlist);
lvPlaylist.setAdapter(adapter);
int currentIndex = ExternalDeviceFragment.currentPlayingIndex;
lvPlaylist.setSelection(currentIndex > 3 ? currentIndex - 3 : currentIndex);
tvMusicName.setText(ExternalDeviceFragment.currentPlayingName);
}
else if (WatchDog.currentListType == 0 || WatchDog.currentListType == -1) {
//尚未初始化播放列表
}
else {
// 【我的音乐】初始化播放列表
playlist = WatchDog.currentList;
adapter = new PlaylistMusicListAdapter(getActivity(), playlist);
lvPlaylist.setAdapter(adapter);
// 定位到当前播放曲目
if (!WatchDog.currentPlayingId.equals(0L)) {
for (int i = 0; i < playlist.size(); i++) {
if (playlist.get(i).getId().equals(WatchDog.currentPlayingId)) {
lvPlaylist.setSelection(i > 3 ? i - 3 : i);
}
}
}
}
lvPlaylist.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
Log.i(TAG, "click playing music list, position=" + position);
String uri = null;
if (WatchDog.currentListType == Constant.URI_USB || WatchDog.currentListType == Constant.URI_CUE) {
// [外联设备]
uri = playlist.get(position).getUri();
// stopCurrentCachingUpdate();
// WatchDog.latestOperation = "playlist_click";
ExternalDeviceFragment.currentList = playlist;
ExternalDeviceFragment.currentPlayingIndex = position;
ExternalDeviceFragment.currentPlayingMusic = playlist.get(position);
ExternalDeviceFragment.currentPlayingId = ExternalDeviceFragment.currentPlayingMusic.getId();
// initPic();
ExternalDeviceFragment.currentPlayingName = playlist.get(position).getName();
// WatchDog.updateCachingState();// 如果上一曲未缓存完则修改其状态为等待
WatchDog.currentState = PlayerFragment.STOPPED;// 先改为停止以停止播放器图标的跳动
tvMusicName.setText(ExternalDeviceFragment.currentPlayingName);
adapter.notifyDataSetChanged();
} else {// [我的音乐]
if (PowerfulBigMan.testClickInterval() == false) {
return;
}
stopCurrentCachingUpdate();
WatchDog.latestOperation = "playlist_click";
WatchDog.currentList = playlist;
WatchDog.currentPlayingIndex = position;
WatchDog.currentPlayingMusic = playlist.get(position);
WatchDog.currentPlayingId = WatchDog.currentPlayingMusic.getId();
initPic();
WatchDog.currentPlayingName = playlist.get(position).getName();
WatchDog.updateCachingState();// 如果上一曲未缓存完则修改其状态为等待
WatchDog.currentState = PlayerFragment.STOPPED;// 先改为停止以停止播放器图标的跳动
tvMusicName.setText(WatchDog.currentPlayingName);
adapter.notifyDataSetChanged();
uri = playlist.get(position).getUri(WatchDog.currentListType, WatchDog.currentListId);
}
if (uri == null || uri.equals("")) {
// CustomToast.makeText(getActivity(), "播放列表尚未初始化", Toast.LENGTH_SHORT).show();
Log.e(TAG, UpnpApp.mainHandler.getString(R.string.playlist_not_init_error));
return;
}
Log.i(TAG, "playMusic, uri=" + uri);
playMusic(uri);
}
});
}
private void playMusic(String uri) {
Player p = new Player();
p.play(uri);
}
private void registerReceivers() {
getActivity().registerReceiver(playNewMusicReceiver, new IntentFilter("playNewMusic"));
getActivity().registerReceiver(setTransportStateReceiver, new IntentFilter("setTransportState"));
getActivity().registerReceiver(setCurrentTrackURIReceiver, new IntentFilter("setCurrentTrackURI"));
getActivity().registerReceiver(setCurrentTrackDurationReceiver, new IntentFilter("setCurrentTrackDuration"));
getActivity().registerReceiver(setBackCurrentPlaymodeReceiver, new IntentFilter("setBackCurrentPlaymode"));
getActivity().registerReceiver(setCurrentPlaymodeReceiver, new IntentFilter("setCurrentPlaymodeReceiver"));
getActivity().registerReceiver(updateCacheProgressReceiver, new IntentFilter("updateCacheProgress"));
getActivity().registerReceiver(updateMediaInfoReceiver, new IntentFilter("updateMediaInfo"));
getActivity().registerReceiver(initPlayerReceiver, new IntentFilter("initPlayerReceiver"));
getActivity().registerReceiver(updatePlayModeReceiver, new IntentFilter("updatePlayModeReceiver"));
getActivity().registerReceiver(errorMessageReceiver, new IntentFilter("errorMessageReceiver"));
getActivity().registerReceiver(updateListReceiver, new IntentFilter(BroadcastManager.FILTER_UPDATE_LOCALLIST));
// getActivity().registerReceiver(babyNotMineReceiver, new IntentFilter("babyNotMineReceiver"));// 收归MainActivity管理
getActivity().registerReceiver(mediaOutOfServiceReceiver, new IntentFilter("mediaOutOfServiceReceiver"));
getActivity().registerReceiver(playlistSeekPositionReceiver, new IntentFilter(Constant.ACTION_PLAYLIST_SEEK_POSITION));
}
private void unregisterReceivers() {
getActivity().unregisterReceiver(playNewMusicReceiver);
getActivity().unregisterReceiver(setTransportStateReceiver);
getActivity().unregisterReceiver(setCurrentTrackURIReceiver);
getActivity().unregisterReceiver(setCurrentTrackDurationReceiver);
getActivity().unregisterReceiver(setBackCurrentPlaymodeReceiver);
getActivity().unregisterReceiver(setCurrentPlaymodeReceiver);
getActivity().unregisterReceiver(updateCacheProgressReceiver);
getActivity().unregisterReceiver(updateMediaInfoReceiver);
getActivity().unregisterReceiver(initPlayerReceiver);
getActivity().unregisterReceiver(updatePlayModeReceiver);
getActivity().unregisterReceiver(errorMessageReceiver);
getActivity().unregisterReceiver(updateListReceiver);
// getActivity().unregisterReceiver(babyNotMineReceiver);
getActivity().unregisterReceiver(mediaOutOfServiceReceiver);
getActivity().unregisterReceiver(playlistSeekPositionReceiver);
}
public void play() {
UpnpApp.upnpService.getControlPoint().execute(new Play(new UnsignedIntegerFourBytes(0), UpnpApp.avTransportService) {
@Override
public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) {
System.out.println("播放失败");
btnPlayPause.setBackgroundResource(R.drawable.btn_play_selector);
}
@Override
public void success(ActionInvocation arg0) {
currentState = PLAYING;
btnPlayPause.setBackgroundResource(R.drawable.btn_pause_selector);
System.out.println("播放成功");
getPositionInfo();
updateProgress(WatchDog.currentPlayingName);
}
});
}
protected void pause() {
UpnpApp.upnpService.getControlPoint().execute(new Pause(new UnsignedIntegerFourBytes(0), UpnpApp.avTransportService) {
@Override
public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) {
System.out.println("暂停失败");
btnPlayPause.setBackgroundResource(R.drawable.btn_pause_selector);
}
@Override
public void success(ActionInvocation arg0) {
System.out.println("暂停成功");
currentState = PAUSED_PLAYBACK;
btnPlayPause.setBackgroundResource(R.drawable.btn_play_selector);
}
});
}
private void getVolumn() {
UpnpApp.upnpService.getControlPoint().execute(new GetVolume(UpnpApp.renderingControlService) {
@Override
public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) {
System.out.println("获取音量失败");
}
@Override
public void received(ActionInvocation arg0, int arg1) {
System.out.println("获取音量成功");
currentVolumn = arg1;
handler.sendEmptyMessage(MSG_VOLUMN);
}
});
}
private void getPositionInfo() {
// Player p=new Player();
// p.getPositionInfo();
UpnpApp.upnpService.getControlPoint().execute(new GetPositionInfo(new UnsignedIntegerFourBytes(0), UpnpApp.avTransportService) {
@Override
public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) {
System.out.println("获取位置信息失败");
gpfail++;
if (gpfail <= 2) {
getPositionInfo();
}
}
@Override
public void received(ActionInvocation arg0, PositionInfo arg1) {
System.out.println("获取位置信息成功");
gpfail = 0;
positionInfo = arg1;
System.out.println("positionInfo=" + positionInfo);
duration = positionInfo.getTrackDuration().substring(3);
totalSeconds = DateTimeFormatUtil.time2IntMillis(duration) / 1000;
currentTime = positionInfo.getRelTime().substring(3);
currentSeconds = DateTimeFormatUtil.time2IntMillis(currentTime) / 1000;
currentPercent = positionInfo.getElapsedPercent();
handler.sendEmptyMessage(0);
}
});
}
private void updateProgress(String currentPlayingName) {
// final String myOwner = WatchDog.currentPlayingName;
progressRunnable = new Runnable() {
@Override
public void run() {
String myOwner = WatchDog.currentPlayingName;
System.out.println("pr currentState=" + currentState);
while (currentState.equals(PLAYING)
// && WatchDog.currentPlayingName.equals(myOwner)
&& shouldSayHello2Death == false) {// 空指针
currentTime = DateTimeFormatUtil.parseInt2Time(currentSeconds * 1000);
currentPercent = (int) Math.round(currentSeconds * 1.0 * 100 / totalSeconds);
handler.sendEmptyMessage(0);
currentSeconds++;
if (currentSeconds > totalSeconds && totalSeconds != 0) {
handler.sendEmptyMessage(MSG_CLEAR_PLAYING_PROGRESS);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("currentState=" + currentState + "&&WatchDog.currentPlayingName=" + WatchDog.currentPlayingName + "&&myOwner=" + myOwner);
System.out.println("progress end and pr=null");
progressRunnable = null;
}
};
progressThread = new Thread(progressRunnable);
progressThread.start();
}
protected void clearPlayingProgress() {
sbProgress.setProgress(0);
tvCurrentTime.setText("00:00");
tvTotalTime.setText("00:00");
}
private void seekTo(final int progress) {
double seekTargetSeconds = totalSeconds * progress / 100d;
String targetTime = ModelUtil.toTimeString(new Long(Math.round(seekTargetSeconds)).intValue());
System.out.println("targetTime=" + targetTime);
if ("00:00:00".equals(targetTime)) {
targetTime="00:00:01";
}
sbProgress.setProgress(progress);
UpnpApp.upnpService.getControlPoint().execute(new Seek(new UnsignedIntegerFourBytes(0), UpnpApp.avTransportService, targetTime) {
@Override
public void success(final ActionInvocation invocation) {
System.out.println("定位成功");
currentPercent = progress;
currentSeconds = (int) Math.round(totalSeconds * (currentPercent / 100d));
}
@Override
public void failure(ActionInvocation invocation, UpnpResponse operation, String defaultMsg) {
System.out.println("定位失败");
}
});
}
private void setVolumn(int volumn) {
System.out.println("setVolumn=" + volumn);
UpnpApp.upnpService.getControlPoint().execute(new SetVolume(UpnpApp.renderingControlService, volumn) {
@Override
public void success(ActionInvocation invocation) {
System.out.println("音量设置成功");
}
@Override
public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) {
System.out.println("音量设置失败");
}
});
}
private void setNewUri(final String uri) {
while (!currentState.equals(STOPPED) && shouldSayHello2Death == false) {
try {
synchronized (this) {
wait(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (currentState.equals(STOPPED)) {
UpnpApp.upnpService.getControlPoint().execute(new SetAVTransportURI(new UnsignedIntegerFourBytes(0), UpnpApp.avTransportService, uri) {
@Override
public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) {
System.out.println("URI设置失败");
}
@Override
public void success(ActionInvocation arg0) {
System.out.println("URI设置成功");
currentState = PREPARED;
WatchDog.currentUri = uri;
}
});
}
}
private void playNext() {
// 当前缓存进度还在显示中,而用户切换下一曲时,应当停止拿缓存进度线程;
stopCurrentCachingUpdate();
Player p = new Player();
p.setBoxPlayNext();
}
private void stopCurrentCachingUpdate() {
currentCachingChanger++;
}
private void playPrev() {
stopCurrentCachingUpdate();
Player p = new Player();
p.setBoxPlayPrev();
}
private void setTransportState(String transportStateStr) {
System.out.println("transportStateStr=" + transportStateStr);
if (transportStateStr.equals(PAUSED_PLAYBACK)) {
setStatePaused();
} else if (transportStateStr.equals(PLAYING)) {
setStatePlaying();
} else if (transportStateStr.equals(STOPPED)) {
System.out.println(TAG + ":setTransportState:transportStateStr=" + transportStateStr);
setStateStopped();
} else if (transportStateStr.equals(TRANSITIONING)) {
setStateTransitioning();// 正在缓存
}
}
private void setStateTransitioning() {
// if (transitioningCancel == true) {
// return;
// }
System.out.println("setStateTransitioning");
initPic();
isCaching = true;
currentState = TRANSITIONING;
// 当缓存来自用户在列表中点击未缓存歌曲时,显示缓存进度和媒体和媒体信息
long id = -1;
String currengCachingState = "";
if (WatchDog.currentPlayingMusic != null) {
id = WatchDog.currentPlayingMusic.getId();
currengCachingState = WatchDog.cacheStateMap.get(id);
}
if (!(Music.CACHE_DOWNLOADED).equals(currengCachingState)) {
btnPlayPause.setEnabled(false);
setBtnCachingAnim();
flSbProgress.setVisibility(View.GONE);
tvCurrentTime.setVisibility(View.GONE);
tvTotalTime.setVisibility(View.GONE);
llCache.setVisibility(View.VISIBLE);
if (id != -1) {
getCacheProgress(id);
}
}
// }
}
private void setPicCachingAnim() {
ivPicPlaying.setImageResource(R.drawable.pic1);
}
private void setBtnCachingAnim() {
System.out.println("setBtnCachingAnim");
initBtnAnim();
btnPlayPause.setVisibility(View.GONE);
flBtnAnim.setVisibility(View.VISIBLE);
// threadBtnAnim.start();
handler.post(threadBtnAnim);
}
private void initBtnAnim() {
btnAnimation = AnimationUtils.loadAnimation(getActivity(), R.anim.translate_tweener);
btnAnimation.setRepeatCount(Animation.INFINITE);
threadBtnAnim = null;
threadBtnAnim = new Thread(new Runnable() {
@Override
public void run() {
ivBtnAnimArrow.startAnimation(btnAnimation);// 对控件使用补间效果
btnAnimation.start();
}
});
}
private void setStateStopped() {
System.out.println(TAG + ":setStateStopped");
currentState = STOPPED;// damn
btnPlayPause.setBackgroundResource(R.drawable.btn_play_selector);
}
private void setStatePaused() {
System.out.println("setStatePaused by others");
currentState = PAUSED_PLAYBACK;
btnPlayPause.setBackgroundResource(R.drawable.btn_play_selector);
}
private void setStatePlaying() {
System.out.println("setStatePlaying");
isCaching = false;
currentState = PLAYING;
// 开始暂停按钮恢复状态
flBtnAnim.setVisibility(View.GONE);
if (btnAnimation != null) {
btnAnimation.cancel();
}
handler.removeCallbacks(threadBtnAnim);
threadBtnAnim = null;
btnPlayPause.setVisibility(View.VISIBLE);
btnPlayPause.setBackgroundResource(R.drawable.btn_pause_selector);
btnPlayPause.setEnabled(true);
// 还原播放进度
if (llVolumnShown == false) {
flSbProgress.setVisibility(View.VISIBLE);
} else {
flSbProgress.setVisibility(View.GONE);
}
tvCurrentTime.setVisibility(View.VISIBLE);
tvTotalTime.setVisibility(View.VISIBLE);
llCache.setVisibility(View.GONE);
// 获取并显示播放进度
getPositionInfo();
getMediaInfo();
stopAllHiddenThread();
shouldSayHello2Death = false;
}
protected void setCurrentTrackURI(String currentTrackURI) {
Log.i(TAG, "setCurrentTrackURI: currentTrackURI=" + currentTrackURI);
currentTrackURI = currentTrackURI.replaceAll("%20", " ");
Log.i(TAG, "setCurrentTrackURI: currentTrackURI=" + currentTrackURI);
WatchDog.currentUri = currentTrackURI;
int uriType = new URIParams(currentTrackURI).getType();
String str = "";
String state = "-1";
switch (uriType) {
case 1:
WatchDog.mediaOutOfService = false;
str = new URIParams(currentTrackURI).getParams().get("musicid");
state = new URIParams(currentTrackURI).getParams().get("state");
break;
case 2:
WatchDog.mediaOutOfService = false;
str = new URIParams(currentTrackURI).getParams().get("id");
state = new URIParams(currentTrackURI).getParams().get("state");
break;
case 3:
WatchDog.mediaOutOfService = false;
str = new URIParams(currentTrackURI).getParams().get("musicid");
state = new URIParams(currentTrackURI).getParams().get("state");
break;
case 4:
WatchDog.mediaOutOfService = false;
str = new URIParams(currentTrackURI).getParams().get("musicid");
state = new URIParams(currentTrackURI).getParams().get("state");
break;
case 5:// 歌单
WatchDog.mediaOutOfService = true;
WatchDog.mediaOutOfServiceReson = UpnpApp.context.getResources().getString(R.string.mosReasonPlaylist);
mosExit();
str = new URIParams(currentTrackURI).getParams().get("musicid");
state = new URIParams(currentTrackURI).getParams().get("state");
break;
case Constant.URI_USB:
//TODO 标题, 选择项
refreshUsbMusicDisplayInfo();
break;
case Constant.URI_CUE:
//TODO 标题, 选择项
refreshUsbMusicDisplayInfo();
break;
}
if (state != null && state.equals("4")) {
isCaching = false;
} else {
isCaching = true;
}
if (uriType == Constant.URI_USB || uriType == Constant.URI_CUE) {
// 外联设备:do nothing
// getMusicNameAndArtistFromUsbFileUri(currentTrackURI);
} else {
if(!str.equals("")){
long musicId = Long.parseLong(str);
getMusicNameAndArtistFromId(musicId);
}
}
// }
}
private void getMusicNameAndArtistFromId(long musicId) {
List<Music> list;
if (WatchDog.currentList != null) {
list = WatchDog.currentList;
} else {
list = VirtualData.musics;
}
for (Music music : list) {
if (music.getId() == musicId) {
initPic();
WatchDog.currentPlayingMusic = music;
WatchDog.currentPlayingId = WatchDog.currentPlayingMusic.getId();
WatchDog.currentPlayingName = music.getName();
WatchDog.currentArtistName = music.getArtistName();
tvArtistName.setText(WatchDog.currentArtistName);
tvMusicName.setText(WatchDog.currentPlayingName);
if (adapter != null) {
adapter.notifyDataSetChanged();
}
return;
}
}
tvArtistName.setText("未知曲目");
tvMusicName.setText("未知演出者");
}
protected void setCurrentTrackDuration(String durationIn) {
System.out.println("setCurrentTrackDuration");
duration = durationIn.substring(3);
totalSeconds = DateTimeFormatUtil.time2IntMillis(duration) / 1000;
}
private void stopAllHiddenThread() {
shouldSayHello2Death = true;
}
@Override
public void onResume() {
Log.e(TAG, "onResume()");
// initPlayingInfo();
super.onResume();
}
private void initPlayingInfo() {
Log.e(TAG, "WatchDog.currentPlayingInfo="+WatchDog.getCurrentPlayingInfo());
if(WatchDog.getCurrentPlayingInfo()!=null){
tvMusicName.setText(WatchDog.getCurrentPlayingInfo().getName());
tvArtistName.setText(WatchDog.getCurrentPlayingInfo().getArtist());
tvTotalTime.setText(WatchDog.getCurrentPlayingInfo().getDuration());
}
}
private void seekToCurrentPlayingPosition() {
if(lvPlaylist!=null && lvPlaylist.getVisibility()==View.VISIBLE){
int p=getCurrentPlayingPosition();
Log.e("BUG839", TAG+"seekToCurrentPlayingPosition():p="+p);
lvPlaylist.setSelection(p);
}
}
private int getCurrentPlayingPosition() {
if (playlist == null || playlist.size() == 0 || WatchDog.currentPlayingMusic == null) {
return 0;
}
for (int i = 0; i < playlist.size(); i++) {
if (playlist.get(i).getId() == WatchDog.currentPlayingMusic.getId()) {
return i - 2 > 0 ? i - 2 : 0;
}
}
return 0;
}
private void showOrHideVolumn() {
if (llVolumnShown == false) {
btnVolumn.setBackgroundResource(R.drawable.btn_volumn_hover);
llVolumn.setVisibility(View.VISIBLE);
llVolumnShown = true;
flSbProgress.setVisibility(View.GONE);
llCache.setVisibility(View.GONE);
} else {
btnVolumn.setBackgroundResource(R.drawable.btn_volumn);
llVolumn.setVisibility(View.GONE);
llVolumnShown = false;
if (isCaching) {
llCache.setVisibility(View.VISIBLE);
flSbProgress.setVisibility(View.GONE);
} else {
flSbProgress.setVisibility(View.VISIBLE);
llCache.setVisibility(View.GONE);
}
}
}
}