package com.kitty.poclient.fragment.usb;
import java.util.ArrayList;
import java.util.List;
import org.fourthline.cling.model.action.ActionInvocation;
import org.fourthline.cling.model.message.UpnpResponse;
import org.fourthline.cling.support.contentdirectory.callback.Browse;
import org.fourthline.cling.support.model.BrowseFlag;
import org.fourthline.cling.support.model.DIDLContent;
import org.fourthline.cling.support.model.DIDLObject;
import org.fourthline.cling.support.model.container.Container;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.drawable.AnimationDrawable;
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.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.kitty.poclient.R;
import com.kitty.poclient.activity.MainActivity;
import com.kitty.poclient.adapter.UsbFileListAdapter;
import com.kitty.poclient.common.Constant;
import com.kitty.poclient.common.MymusicManager;
import com.kitty.poclient.common.UIHelper;
import com.kitty.poclient.common.UpnpApp;
import com.kitty.poclient.common.WatchDog;
import com.kitty.poclient.domain.Music;
import com.kitty.poclient.fragment.PlayerFragment;
import com.kitty.poclient.fragment.TabFragment;
import com.kitty.poclient.upnp.Player;
import com.kitty.poclient.util.UsbFileUtil;
import com.kitty.poclient.widget.CustomToast;
@SuppressLint("ValidFragment")
public class ExternalDeviceFragment extends TabFragment {
private static String TAG = "UsbFragment";
public static boolean IS_ALIVE = false;
public static boolean hasExternalDevice = false;
private View view;
private Context context;
private static ExternalDeviceFragment currentInstance;
private TextView tvTabname;
private LinearLayout usblayout;
private ListView usbfilelist;
private ImageButton backButton;
private ImageButton btnPlayer;
private TextView currentDirPath;
// private TextView fileinfo;
private LinearLayout loadingDialog;
private View loadingAnim;
private AnimationDrawable animatiorList;
private boolean isLoading = false;
private LinearLayout noUsbDeviceDialog;
private boolean hasUsb = false;
private String tabnameString = "外联设备";
private static final int BROWSE_FLAG_FAILURE = 0;
private static final int BROWSE_FLAG_RECEIVE = 1;
private static final int BROWSE_FLAG_UPDATESTATUS = 2;
private static final int BROWSE_FLAG_LOADING = 3;
private static final int BROWSE_FLAG_NODEVICE = 4;
private static final int BROWSE_FLAG_NO_MEDIA_FILE = 5;
private static final int PLAY_FLAG_UNSUPPORT = 10;
public static final String ROOT_DIR = "/mnt/usb_storage";
public static final String FIRST_DIR = "0";
public static String CURRENT_DIR = FIRST_DIR;
public static DIDLContent CURRENT_DIDL;
private String nextDir = FIRST_DIR;
private String parentDir = FIRST_DIR;
public static String PLAY_URI = "";
// <20131106 add
public static int currentListType = -1;
public static ArrayList<Music> currentList;
public static String currentUri;
public static Music currentPlayingMusic;
public static String currentPlayingName = "";
public static String currentArtistName = "";
public static int currentPlayingIndex = -1;
public static Long currentPlayingId = 0L;
// >
private List<DIDLObject> didlObjectList;
private Handler browseHandler;
private UsbFileListAdapter usbadp = null;
public ExternalDeviceFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.context = getActivity();
currentInstance = this;
}
public static ExternalDeviceFragment getCurrentInstance(){
return currentInstance;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = LayoutInflater.from(context).inflate(R.layout.usb, null);
initComponent();
initHandler();
initBtnPlayer();
/*if(CURRENT_DIR.equals(FIRST_DIR)){
browse(FIRST_DIR);
} else {
browse(CURRENT_DIR);
}*/
browse(CURRENT_DIR);
return view;
}
public void showNoUsbdeviceDialog() {
usblayout.setVisibility(View.GONE);
loadingDialog.setVisibility(View.GONE);
backButton.setVisibility(ImageButton.INVISIBLE);
noUsbDeviceDialog.setVisibility(View.VISIBLE);
}
private void hideNoUsbdeviceDialog() {
noUsbDeviceDialog.setVisibility(View.GONE);
hasUsb = true;
}
private void showLoadingDialog() {
if (isLoading == false) {
usblayout.setVisibility(View.GONE);
loadingDialog.setVisibility(View.VISIBLE);
loadingAnim.setBackgroundDrawable(animatiorList); // 设备加载动画
animatiorList.start();
isLoading = true;
}
}
private void hideLoadingDialog() {
if (isLoading == true) {
loadingDialog.setVisibility(View.GONE);
usblayout.setVisibility(View.VISIBLE);
isLoading = false;
}
}
private void initComponent() {
tvTabname = (TextView) view.findViewById(R.id.tv_tabname);
tvTabname.setText(tabnameString);
backButton = (ImageButton) view.findViewById(R.id.btn_back);
backButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
browseParentDir();
}
});
btnPlayer = (ImageButton) view.findViewById(R.id.btn_player);
btnPlayer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (!WatchDog.checkMediaReady()) {
return;
}
MymusicManager.mainActivity.showViewpage(MainActivity.PLAYER_PAGE_ITEM_NUM);
// context.startActivity(new Intent(context, PlayerActivity.class));
}
});
// 初始化:加载对话框
loadingDialog = (LinearLayout) view.findViewById(R.id.loading_dialog);
loadingAnim = loadingDialog.findViewById(R.id.loading_anim);
animatiorList = (AnimationDrawable) getResources().getDrawable(R.anim.animatior_list);
// no usb dialog
noUsbDeviceDialog = (LinearLayout) view.findViewById(R.id.no_usb_device);
usblayout = (LinearLayout) view.findViewById(R.id.usbDisplay);
currentDirPath = (TextView) usblayout.findViewById(R.id.current_dir_path);
// fileinfo = (TextView) usblayout.findViewById(R.id.fileinfo);
usbfilelist = (ListView) usblayout.findViewById(R.id.usbfilelist);
didlObjectList = new ArrayList<DIDLObject>();
usbadp = new UsbFileListAdapter(context, didlObjectList);
usbfilelist.setAdapter(usbadp);
usbfilelist.setOnItemClickListener(new ItemClickListener());
}
@SuppressLint("HandlerLeak")
private void initHandler() {
browseHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case BROWSE_FLAG_FAILURE:
break;
case BROWSE_FLAG_LOADING:
showLoadingDialog();
break;
case BROWSE_FLAG_NODEVICE:
showNoUsbdeviceDialog();
break;
case BROWSE_FLAG_NO_MEDIA_FILE:
// CustomToast.makeText(context, "该文件夹内无适播文件", Toast.LENGTH_SHORT).show();
UpnpApp.mainHandler.showInfo(R.string.usb_no_file_info);
// 隐藏加载对话框
hideLoadingDialog();
// 刷新目录和列表
refreshPathAndFileList();
break;
case BROWSE_FLAG_RECEIVE:
// 隐藏加载对话框
hideLoadingDialog();
hideNoUsbdeviceDialog();
// 刷新目录和列表
refreshPathAndFileList();
break;
case BROWSE_FLAG_UPDATESTATUS:
// 显示更新状态
break;
case PLAY_FLAG_UNSUPPORT:
CustomToast.makeText(context, "暂不支持此文件播放", Toast.LENGTH_SHORT).show();
break;
}
}
};
}
private void refreshPathAndFileList() {
// 更新目录
CURRENT_DIR = nextDir;
if (!UsbFileUtil.isUsbRootDir(nextDir)) {
parentDir = UsbFileUtil.getParentPathFromAbsolutePath(nextDir);
// 更新为usb名称
if (UsbFileUtil.isUsbRootDir(parentDir)) {
tvTabname.setText(UsbFileUtil.getFileNameFromAbsolutePath(CURRENT_DIR));
}
// 还源为“外联设备”
if (UsbFileUtil.isUsbRootDir(CURRENT_DIR)) {
tvTabname.setText(tabnameString);
}
}
// 刷新列表
usbadp.notifyDataSetChanged();
if (UsbFileUtil.isUsbRootDir(CURRENT_DIR)) {
currentDirPath.setVisibility(TextView.GONE);
backButton.setVisibility(ImageButton.INVISIBLE);
} else {
backButton.setVisibility(ImageButton.VISIBLE);
currentDirPath.setVisibility(TextView.VISIBLE);
currentDirPath.setText(getDisplayPathFromCurrentDir(CURRENT_DIR));
}
}
private String getDisplayPathFromCurrentDir(String currentDir) {
String displayPath = currentDir.replaceFirst(ROOT_DIR, "USB");
String[] displayPathArray = displayPath.split("/");
int length = displayPathArray.length;
if (length >= 3) {
displayPath = ".../" + displayPathArray[length - 2] + "/" + displayPathArray[length - 1];
}
return displayPath;
}
private void initBtnPlayer() {
String currentCacheState = Music.CACHE_WAIT;
if (WatchDog.currentPlayingMusic != null) {
currentCacheState = WatchDog.cacheStateMap.get(WatchDog.currentPlayingMusic.getId());// 查到当前曲目缓存状态
}
if (WatchDog.mediaOutOfService == true && WatchDog.currentState.equals(PlayerFragment.PLAYING)) {
AnimationDrawable animationDrawable = (AnimationDrawable) getResources().getDrawable(R.anim.playing);
btnPlayer.setImageDrawable(animationDrawable);
animationDrawable.start();
} else if (!WatchDog.currentState.equals(PlayerFragment.PLAYING) || !Music.CACHE_DOWNLOADED.equals(currentCacheState)) {// 空指针
btnPlayer.setImageResource(R.drawable.btn_player);
} else {
AnimationDrawable animationDrawable = (AnimationDrawable) getResources().getDrawable(R.anim.playing);
btnPlayer.setImageDrawable(animationDrawable);
animationDrawable.start();
}
// 外联设备文件播放情况
if (WatchDog.currentListType == Constant.URI_USB || WatchDog.currentListType == Constant.URI_CUE) {
if (WatchDog.currentState.equals(PlayerFragment.PLAYING)) {
AnimationDrawable animationDrawable = (AnimationDrawable) getResources().getDrawable(R.anim.playing);
btnPlayer.setImageDrawable(animationDrawable);
animationDrawable.start();
} else {
btnPlayer.setImageResource(R.drawable.btn_player);
}
}
}
@Override
public void onResume() {
IS_ALIVE = true;
if (hasUsb) {
if (didlObjectList.size() == 0) {
browse(CURRENT_DIR);
}
}
registerReceivers();
super.onResume();
}
@Override
public void onPause() {
IS_ALIVE = false;
unregisterReceivers();
super.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
}
private void browse(String containId, String filter, long startingindex, long requestedcount) {
// default: filter="*", startingindex=0, requestedcount=999
}
public void openFirstDir(){
browse(FIRST_DIR);
}
public void back(){
if (UsbFileUtil.isUsbRootDir(CURRENT_DIR)) {
UIHelper.showExitDialog(getActivity());
}else{
browseParentDir();
}
}
public void browseParentDir() {
if (UsbFileUtil.isUsbRootDir(CURRENT_DIR)) {
// CustomToast.makeText(context, "当前已是根目录", Toast.LENGTH_SHORT).show();
// backButton.setVisibility(ImageButton.INVISIBLE);
} else {
browse(parentDir);
}
}
private void browse(String containId) {
browseHandler.sendEmptyMessage(BROWSE_FLAG_LOADING);
nextDir = containId;
Browse browse = new Browse(UpnpApp.directoryService, containId, BrowseFlag.DIRECT_CHILDREN) {
@Override
public void failure(ActionInvocation arg0, UpnpResponse arg1, String arg2) {
browseHandler.sendEmptyMessage(BROWSE_FLAG_FAILURE);
}
@Override
public void updateStatus(Status arg0) {
}
@Override
public void received(ActionInvocation arg0, DIDLContent didl) {
CURRENT_DIDL = didl;
// 清空usb file list view
didlObjectList.clear();
// 更新usb file list view
didlObjectList.addAll(didl.getContainers());
didlObjectList.addAll(didl.getItems());
// 更新UI
if (didlObjectList.size() == 0) {
if (UsbFileUtil.isUsbRootDir(nextDir)) {
// 无外联设备
browseHandler.sendEmptyMessage(BROWSE_FLAG_NODEVICE);
} else {
// 无适播文件
browseHandler.sendEmptyMessage(BROWSE_FLAG_NO_MEDIA_FILE);
}
} else {
browseHandler.sendEmptyMessage(BROWSE_FLAG_RECEIVE);
}
}
};
UpnpApp.upnpService.getControlPoint().execute(browse);
}
private BroadcastReceiver initBtnPlayerReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
initBtnPlayer();
//TODO 刷新列表 - 小喇叭
usbadp.notifyDataSetChanged();
}
};
private void registerReceivers() {
context.registerReceiver(initBtnPlayerReceiver, new IntentFilter("initBtnPlayerReceiver"));
}
private void unregisterReceivers() {
context.unregisterReceiver(initBtnPlayerReceiver);
}
private class ItemClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
try {
DIDLObject didlObject = didlObjectList.get(position);
// 如果选择的是文件夹则进入子目录
if (didlObject instanceof Container) {
// 打開目錄
browse(didlObject.getId());
} else {
ExternalDeviceFragment.currentPlayingName = didlObject.getTitle();
WatchDog.currentPlayingName = didlObject.getTitle();
String uri = null;
if (UsbFileUtil.isCue(didlObject.getParentID())) {
uri = didlObject.getId(); // Constant.URI_CUE
// xxbox://cue?source=xxx
WatchDog.currentListType = Constant.URI_CUE;
ExternalDeviceFragment.currentListType = Constant.URI_CUE;
} else {
if (UsbFileUtil.isMusic(didlObject.getId())) {// 普通音乐
uri = "xxbox://usb?source=" + didlObject.getId(); // xxbox://usb?source=xxx
WatchDog.currentListType = Constant.URI_USB;
ExternalDeviceFragment.currentListType = Constant.URI_USB;
} else if (UsbFileUtil.isVideo(didlObject.getId())) {// 普通视频
browseHandler.sendEmptyMessage(PLAY_FLAG_UNSUPPORT);
} else {
browseHandler.sendEmptyMessage(PLAY_FLAG_UNSUPPORT);
}
}
if (uri != null) {
WatchDog.currentUri = uri;
ExternalDeviceFragment.currentUri = uri;
//TODO 刷新小喇叭
usbadp.notifyDataSetChanged();
playMedia(uri);
} else {
}
}
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
}
public void playMedia(String uri) {
Player p = new Player();
p.play(uri);
// update playing music list
// UsbFileUtil.updateMusicListFromDIDLContent(currentDIDL);
UsbFileUtil.GetNowPlaylist();
}
}
}