package com.lq.fragment;
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.content.SharedPreferences;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.Albums;
import android.provider.MediaStore.Audio.Media;
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.GestureDetector.SimpleOnGestureListener;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
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.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.AlbumAdapter;
import com.lq.entity.AlbumInfo;
import com.lq.loader.AlbumInfoRetrieveLoader;
import com.lq.util.Constant;
/**
* @author lq 2013-6-1 lq2625304@gmail.com
* */
public class AlbumBrowserFragment extends Fragment implements
LoaderCallbacks<List<AlbumInfo>> {
private static final String TAG = AlbumBrowserFragment.class
.getSimpleName();
private final int ALBUM_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 AlbumAdapter mAdapter = null;
private MainContentActivity mActivity = null;
private String mSortOrder = MediaStore.Audio.Albums.NUMBER_OF_SONGS
+ " desc";
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (activity instanceof MainContentActivity) {
mActivity = (MainContentActivity) activity;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.i(TAG, "onCreateView");
View rootView = inflater.inflate(R.layout.list_album, container, false);
mView_ListView = (ListView) rootView.findViewById(R.id.listview_album);
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_album_list,
mOverflowPopupMenu.getMenu());
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
Log.i(TAG, "onActivityCreated");
super.onActivityCreated(savedInstanceState);
initViewsSetting();
getLoaderManager().initLoader(ALBUM_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() {
// 设置滑动手势
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 AlbumAdapter(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 FrameAlbumFragment) {
Bundle data = new Bundle();
data.putParcelable(AlbumInfo.class.getSimpleName(),
mAdapter.getData().get(position));
data.putInt(Constant.PARENT, Constant.START_FROM_ALBUM);
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_music_count:
mSortOrder = MediaStore.Audio.Albums.NUMBER_OF_SONGS
+ " desc";
getLoaderManager().restartLoader(
ALBUM_RETRIEVE_LOADER, null,
AlbumBrowserFragment.this);
break;
case R.id.sort_by_album:
mSortOrder = Media.ALBUM_KEY;
getLoaderManager().restartLoader(
ALBUM_RETRIEVE_LOADER, null,
AlbumBrowserFragment.this);
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<AlbumInfo>> onCreateLoader(int id, Bundle args) {
Log.i(TAG, "onCreateLoader");
StringBuilder where = new StringBuilder(Albums._ID
+ " in (select distinct " + Media.ALBUM_ID
+ " from audio_meta where (1=1 ");
// String where = Albums._ID + " in (select " + Media.ALBUM_ID
// + " from audio_meta where ((" + FileColumns.DATA
// + " like'%.mp3' or " + Media.DATA + " like'%.wma') and "
// + Media.DURATION + " > " + 1000 * 60 * 1 + " and "
// + FileColumns.SIZE + " > " + 1024 + " )) ";
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(getActivity());
boolean filterBySize = sp.getBoolean(
SettingFragment.KEY_FILTER_BY_SIZE, true);
boolean filterByDuration = sp.getBoolean(
SettingFragment.KEY_FILTER_BY_DURATION, true);
if (filterBySize) {
where.append(" and " + Media.SIZE + " > " + Constant.FILTER_SIZE);
}
if (filterByDuration) {
where.append(" and " + Media.DURATION + " > "
+ Constant.FILTER_DURATION);
}
where.append("))");
// 创建并返回一个Loader
return new AlbumInfoRetrieveLoader(getActivity(), where.toString(),
null, mSortOrder);
}
@Override
public void onLoadFinished(Loader<List<AlbumInfo>> loader,
List<AlbumInfo> data) {
Log.i(TAG, "onLoadFinished");
// 载入完成,更新列表数据
mAdapter.setData(data);
// 在标题栏上显示艺术家数目
if (data != null && data.size() != 0) {
mView_Title.setText(getResources().getString(
R.string.classify_by_album)
+ "(" + data.size() + ")");
}
}
@Override
public void onLoaderReset(Loader<List<AlbumInfo>> 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(ALBUM_RETRIEVE_LOADER, null,
AlbumBrowserFragment.this);
}
}
};
}