package com.lq.fragment; import java.util.List; import android.app.AlertDialog; import android.app.Dialog; 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.provider.MediaStore.Audio.Media; import android.support.v4.app.DialogFragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.support.v4.content.LocalBroadcastManager; 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.ListView; import android.widget.Toast; import com.lq.activity.MutipleEditActivity; import com.lq.xpressmusic.R; import com.lq.adapter.PlaylistAdapter; import com.lq.dao.PlaylistDAO; import com.lq.entity.PlaylistInfo; import com.lq.loader.PlaylistInfoRetrieveLoader; /** * @author lq 2013-6-1 lq2625304@gmail.com * */ public class SelectPlaylistDialogFragment extends DialogFragment implements LoaderCallbacks<List<PlaylistInfo>> { private static final String TAG = SelectPlaylistDialogFragment.class .getSimpleName(); private final int PLAYLIST_RETRIEVE_LOADER = 0; private ViewGroup mView_rootView = null; private ViewGroup mView_top = null; private View mView_createNewList = null; private ListView mView_playlist = null; private PlaylistAdapter mAdapter = null; private long mAudioId[] = null; public static SelectPlaylistDialogFragment newInstance(long[] audioId) { SelectPlaylistDialogFragment f = new SelectPlaylistDialogFragment(); Bundle args = new Bundle(); args.putLongArray(Media._ID, audioId); f.setArguments(args); return f; } @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, "onCreate"); super.onCreate(savedInstanceState); if (getArguments() != null) { mAudioId = getArguments().getLongArray(Media._ID); } initViewsSetting(); // 加载播放列表数据 getLoaderManager().initLoader(PLAYLIST_RETRIEVE_LOADER, null, this); startWatchingExternalStorage(); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Log.i(TAG, "onCreateDialog"); AlertDialog dialog = new AlertDialog.Builder(getActivity()) .setTitle(R.string.add_to) .setView(mView_rootView) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dismiss(); } }).create(); return dialog; } @Override public void onDestroy() { Log.i(TAG, "onDestroy"); super.onDestroy(); getActivity().unregisterReceiver(mExternalStorageReceiver); } @Override public Loader<List<PlaylistInfo>> onCreateLoader(int id, Bundle args) { Log.i(TAG, "onCreateLoader"); return new PlaylistInfoRetrieveLoader(getActivity(), null, null, null); } @Override public void onLoadFinished(Loader<List<PlaylistInfo>> loader, List<PlaylistInfo> data) { Log.i(TAG, "onLoadFinished"); // TODO SD卡拔出时,没有处理 // 载入完成,更新列表数据 mAdapter.setData(data); } @Override public void onLoaderReset(Loader<List<PlaylistInfo>> loader) { Log.i(TAG, "onLoaderReset"); mAdapter.setData(null); } private void initViewsSetting() { LayoutInflater inflater = LayoutInflater.from(getActivity()); mView_rootView = (ViewGroup) inflater.inflate(R.layout.list_playlist, null, false); mView_top = (ViewGroup) mView_rootView.findViewById(R.id.top); mView_top.setVisibility(View.GONE); mView_playlist = (ListView) mView_rootView .findViewById(R.id.listview_playlist); mView_createNewList = (View) mView_rootView .findViewById(R.id.add_playlist); mAdapter = new PlaylistAdapter(getActivity()); mAdapter.setPopupMenuVisible(false); mView_playlist.setAdapter(mAdapter); mView_playlist.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { addTrackToPlaylist(position); } }); mView_createNewList.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 弹出播放列表名称新建窗口 AddTrackToNewPlaylistDialogFragment f = AddTrackToNewPlaylistDialogFragment .newInstance(mAudioId); f.show(getFragmentManager(), null); dismiss(); } }); } private void addTrackToPlaylist(int position) { boolean isExisted = PlaylistDAO.addTrackToPlaylist(getActivity() .getContentResolver(), mAdapter.getItem(position).getId(), mAudioId); if (isExisted) { // 如果歌曲已经存在于指定的播放列表中,提示一下 Toast.makeText( getActivity(), getResources().getString(R.string.song_has_already_existed), Toast.LENGTH_SHORT).show(); } else { // 不存在,则说明添加成功,提示一下,再让窗口消失 Toast.makeText(getActivity(), getResources().getString(R.string.add_success), Toast.LENGTH_SHORT).show(); // 如果是从多选界面打开本界面的,则关闭多选界面 LocalBroadcastManager.getInstance(getActivity()).sendBroadcast( new Intent(MutipleEditActivity.ACTION_FINISH)); dismiss(); } } 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卡移除,设置列表为空 // 提示SD卡不可用 Toast.makeText(getActivity(), R.string.sdcard_cannot_use, Toast.LENGTH_SHORT).show(); mAdapter.setData(null); dismiss(); } else if (intent.getAction().equals(Intent.ACTION_MEDIA_MOUNTED)) { // SD卡正常挂载,重新加载数据 getLoaderManager().restartLoader(PLAYLIST_RETRIEVE_LOADER, null, SelectPlaylistDialogFragment.this); } } }; }