package com.lq.fragment;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.util.Log;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import com.lq.activity.MainContentActivity;
import com.lq.xpressmusic.R;
import com.lq.adapter.FolderAdapter;
import com.lq.entity.FolderInfo;
import com.lq.loader.FolderInfoRetreiveLoader;
import com.lq.util.StringHelper;
import com.lq.util.Constant;
/**
* @author lq 2013-6-1 lq2625304@gmail.com
* */
public class FolderBrowserFragment extends Fragment implements
LoaderCallbacks<List<FolderInfo>> {
private static final String TAG = FolderBrowserFragment.class
.getSimpleName();
private final int FOLDER_RETRIEVE_LOADER = 0;
/** 手势检测 */
private GestureDetector mDetector = null;
private ImageView mView_MenuNavigation = null;
private ImageView mView_MoreFunctions = null;
private ImageView mView_GoToPlayer = null;
private TextView mView_Title = null;
private ListView mView_ListView = null;
private PopupMenu mOverflowPopupMenu = null;
private FolderAdapter mAdapter = null;
private MainContentActivity mActivity = null;
private String mSortOrder = null;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = (MainContentActivity) activity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, "onCreateView");
View rootView = inflater
.inflate(R.layout.list_folder, container, false);
mView_ListView = (ListView) rootView.findViewById(R.id.listview_folder);
mView_MenuNavigation = (ImageView) rootView
.findViewById(R.id.menu_navigation);
mView_Title = (TextView) rootView.findViewById(R.id.title_of_top);
mView_MoreFunctions = (ImageView) rootView
.findViewById(R.id.more_functions);
mView_GoToPlayer = (ImageView) rootView
.findViewById(R.id.switch_to_player);
mOverflowPopupMenu = new PopupMenu(getActivity(), mView_MoreFunctions);
mOverflowPopupMenu.getMenuInflater().inflate(R.menu.popup_folder_list,
mOverflowPopupMenu.getMenu());
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Log.i(TAG, "onActivityCreated");
super.onActivityCreated(savedInstanceState);
initViewsSetting();
getLoaderManager().initLoader(FOLDER_RETRIEVE_LOADER, null, this);
}
@Override
public void onResume() {
Log.i(TAG, "onResume");
super.onResume();
startWatchingExternalStorage();
}
@Override
public void onStop() {
Log.i(TAG, "onStop");
super.onStop();
getActivity().unregisterReceiver(mExternalStorageReceiver);
}
@Override
public void onDetach() {
Log.i(TAG, "onDetach");
super.onDetach();
mActivity = null;
}
private void initViewsSetting() {
Log.i(TAG, "initViewsSetting");
// 设置滑动手势
mDetector = new GestureDetector(new SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
// 从右向左滑动
if (e1 != null && e2 != null) {
if (e1.getX() - e2.getX() > 120) {
mActivity.switchToPlayer();
return true;
}
}
return false;
}
});
View.OnTouchListener gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (mDetector.onTouchEvent(event)) {
return true;
}
return false;
}
};
mView_ListView.setOnTouchListener(gestureListener);
mAdapter = new FolderAdapter(getActivity());
mView_ListView.setAdapter(mAdapter);
mView_ListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if (getParentFragment() instanceof FrameLocalMusicFragment
|| getParentFragment() instanceof FrameFolderFragment) {
Bundle data = new Bundle();
data.putParcelable(FolderInfo.class.getSimpleName(),
mAdapter.getData().get(position));
data.putInt(Constant.PARENT, Constant.START_FROM_FOLER);
getFragmentManager()
.beginTransaction()
.replace(
R.id.frame_for_nested_fragment,
Fragment.instantiate(getActivity(),
TrackBrowserFragment.class
.getName(), data))
.addToBackStack(null).commit();
}
}
});
mView_GoToPlayer.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mActivity.switchToPlayer();
}
});
mView_Title.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().popBackStackImmediate();
}
});
mOverflowPopupMenu
.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.sort_by_folder_name:
Collections.sort(mAdapter.getData(),
mFolderNameComparator);
mAdapter.notifyDataSetChanged();
break;
case R.id.sort_by_folder_music_count:
Collections.sort(mAdapter.getData(),
mFolderSongCountComparator);
mAdapter.notifyDataSetChanged();
break;
default:
break;
}
return true;
}
});
mView_MenuNavigation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mActivity.getSlidingMenu().showMenu();
}
});
mView_MoreFunctions.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOverflowPopupMenu.show();
}
});
if (getParentFragment() instanceof FrameLocalMusicFragment) {
setTitleLeftDrawable();
}
}
@Override
public Loader<List<FolderInfo>> onCreateLoader(int id, Bundle args) {
Log.i(TAG, "onCreateLoader");
// 创建并返回一个Loader
return new FolderInfoRetreiveLoader(getActivity(), mSortOrder);
}
@Override
public void onLoadFinished(Loader<List<FolderInfo>> loader,
List<FolderInfo> data) {
Log.i(TAG, "onLoadFinished");
// TODO SD卡拔出时,没有处理
// 载入完成,更新列表数据
Collections.sort(data, mFolderSongCountComparator);
mAdapter.setData(data);
// 在标题栏上显示艺术家数目
if (data != null && data.size() != 0) {
mView_Title.setText(getResources().getString(
R.string.classify_by_folder)
+ "(" + data.size() + ")");
}
}
@Override
public void onLoaderReset(Loader<List<FolderInfo>> loader) {
Log.i(TAG, "onLoaderReset");
mAdapter.setData(null);
}
private void setTitleLeftDrawable() {
mView_Title.setClickable(true);
Drawable title_drawable = getResources().getDrawable(
R.drawable.btn_titile_back);
title_drawable.setBounds(0, 0, title_drawable.getIntrinsicWidth(),
title_drawable.getIntrinsicHeight());
mView_Title.setCompoundDrawables(title_drawable, null, null, null);
mView_Title.setBackgroundResource(R.drawable.button_backround_light);
}
private void startWatchingExternalStorage() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED);
intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
intentFilter.addAction(Intent.ACTION_MEDIA_EJECT);
intentFilter.setPriority(1000);
intentFilter.addDataScheme("file");
getActivity().registerReceiver(mExternalStorageReceiver, intentFilter);
}
private BroadcastReceiver mExternalStorageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_MEDIA_EJECT)
|| intent.getAction().equals(Intent.ACTION_MEDIA_REMOVED)
|| intent.getAction().equals(
Intent.ACTION_MEDIA_BAD_REMOVAL)) {
// SD卡移除,设置列表为空
mView_MoreFunctions.setClickable(false);
mView_Title.setText("");
mAdapter.setData(null);
// 提示SD卡不可用
Toast.makeText(getActivity(), R.string.sdcard_cannot_use,
Toast.LENGTH_SHORT).show();
} else if (intent.getAction().equals(Intent.ACTION_MEDIA_MOUNTED)) {
// TODO SD卡正常挂载,重新加载数据
mView_MoreFunctions.setClickable(true);
getLoaderManager().restartLoader(FOLDER_RETRIEVE_LOADER, null,
FolderBrowserFragment.this);
}
}
};
// 按歌曲数量倒序排序
private Comparator<FolderInfo> mFolderSongCountComparator = new Comparator<FolderInfo>() {
@Override
public int compare(FolderInfo lhs, FolderInfo rhs) {
if (lhs.getNumOfTracks() > rhs.getNumOfTracks()) {
return -1;
} else if (lhs.getNumOfTracks() < rhs.getNumOfTracks()) {
return 1;
} else {
return 0;
}
}
};
// 按歌曲名称顺序排序
private Comparator<FolderInfo> mFolderNameComparator = new Comparator<FolderInfo>() {
char first_l, first_r;
@Override
public int compare(FolderInfo lhs, FolderInfo rhs) {
first_l = lhs.getFolderName().charAt(0);
first_r = rhs.getFolderName().charAt(0);
if (StringHelper.checkType(first_l) == StringHelper.CharType.CHINESE) {
first_l = StringHelper.getPinyinFirstLetter(first_l);
}
if (StringHelper.checkType(first_r) == StringHelper.CharType.CHINESE) {
first_r = StringHelper.getPinyinFirstLetter(first_r);
}
if (first_l > first_r) {
return 1;
} else if (first_l < first_r) {
return -1;
} else {
return 0;
}
}
};
}