package cn.bingoogolapple.media.ui.fragment; import android.content.Intent; import android.database.ContentObserver; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Parcelable; import android.provider.MediaStore; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.format.Formatter; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; import cn.bingoogolapple.androidcommon.adapter.BGAOnRVItemClickListener; import cn.bingoogolapple.androidcommon.adapter.BGARecyclerViewAdapter; import cn.bingoogolapple.androidcommon.adapter.BGAViewHolderHelper; import cn.bingoogolapple.media.R; import cn.bingoogolapple.media.engine.MediaScanner; import cn.bingoogolapple.media.model.MediaFile; import cn.bingoogolapple.media.service.AudioService; import cn.bingoogolapple.media.ui.activity.AudioActivity; import cn.bingoogolapple.media.ui.widget.Divider; import cn.bingoogolapple.media.util.StringUtil; import cn.bingoogolapple.media.util.ThreadUtil; /** * 作者:王浩 邮件:bingoogolapple@gmail.com * 创建时间:15/9/7 下午5:18 * 描述: */ public class AudioFragment extends BaseFragment implements BGAOnRVItemClickListener { private RecyclerView mDataRv; private MusicAdapter mAudioAdapter; private AudioContentObserver mAudioContentObserver; @Override protected void initView(Bundle savedInstanceState) { setContentView(R.layout.fragment_audio); mDataRv = getViewById(R.id.rv_audio_data); } @Override protected void setListener() { mAudioAdapter = new MusicAdapter(mDataRv); mAudioAdapter.setOnRVItemClickListener(this); } @Override protected void processLogic(Bundle savedInstanceState) { registerAudioContentObserver(); LinearLayoutManager layoutManager = new LinearLayoutManager(mActivity); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); mDataRv.setLayoutManager(layoutManager); mDataRv.addItemDecoration(new Divider(mActivity)); mDataRv.setAdapter(mAudioAdapter); reloadData(); } private void reloadData() { ThreadUtil.runInThread(new Runnable() { @Override public void run() { final List<MediaFile> mediaFiles = MediaScanner.scanAudio(); ThreadUtil.runInUIThread(new Runnable() { @Override public void run() { mAudioAdapter.setDatas(mediaFiles); } }); } }); } @Override public void onDestroy() { unregisterAudioContentObserver(); super.onDestroy(); } private void registerAudioContentObserver() { mAudioContentObserver = new AudioContentObserver(new Handler()); mActivity.getContentResolver().registerContentObserver(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, true, mAudioContentObserver); } private void unregisterAudioContentObserver() { mActivity.getContentResolver().unregisterContentObserver(mAudioContentObserver); } @Override public void onRVItemClick(ViewGroup viewGroup, View view, int position) { Intent intent = new Intent(mActivity, AudioActivity.class); Bundle bundle = new Bundle(); bundle.putInt(AudioService.EXTRA_CURRENT_MEDIA_FILE_POSITION, position); bundle.putParcelableArrayList(AudioService.EXTRA_MEDIA_FILES, (ArrayList<? extends Parcelable>) mAudioAdapter.getDatas()); intent.putExtras(bundle); mActivity.forward(intent); } private final class MusicAdapter extends BGARecyclerViewAdapter<MediaFile> { public MusicAdapter(RecyclerView recyclerView) { super(recyclerView, R.layout.item_audio); } @Override protected void fillData(BGAViewHolderHelper helper, int position, MediaFile model) { helper.setText(R.id.tv_item_audio_name, model.name); helper.setText(R.id.tv_item_audio_size, Formatter.formatFileSize(mContext, model.size)); helper.setText(R.id.tv_item_audio_duration, StringUtil.formatTime(model.duration)); } } private final class AudioContentObserver extends ContentObserver { public AudioContentObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); reloadData(); } } }