package me.wcy.music.fragment;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import java.io.File;
import me.wcy.music.R;
import me.wcy.music.adapter.LocalMusicAdapter;
import me.wcy.music.adapter.OnMoreClickListener;
import me.wcy.music.application.AppCache;
import me.wcy.music.model.Music;
import me.wcy.music.utils.FileUtils;
import me.wcy.music.utils.SystemUtils;
import me.wcy.music.utils.ToastUtils;
import me.wcy.music.utils.binding.Bind;
/**
* 本地音乐列表
* Created by wcy on 2015/11/26.
*/
public class LocalMusicFragment extends BaseFragment implements AdapterView.OnItemClickListener, OnMoreClickListener {
private static final int REQUEST_WRITE_SETTINGS = 1;
@Bind(R.id.lv_local_music)
private ListView lvLocalMusic;
@Bind(R.id.tv_empty)
private TextView tvEmpty;
private LocalMusicAdapter mAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_local_music, container, false);
}
@Override
protected void init() {
mAdapter = new LocalMusicAdapter();
mAdapter.setOnMoreClickListener(this);
lvLocalMusic.setAdapter(mAdapter);
if (getPlayService().getPlayingMusic() != null && getPlayService().getPlayingMusic().getType() == Music.Type.LOCAL) {
lvLocalMusic.setSelection(getPlayService().getPlayingPosition());
}
updateView();
}
@Override
protected void setListener() {
lvLocalMusic.setOnItemClickListener(this);
}
private void updateView() {
if (AppCache.getMusicList().isEmpty()) {
tvEmpty.setVisibility(View.VISIBLE);
} else {
tvEmpty.setVisibility(View.GONE);
}
mAdapter.updatePlayingPosition(getPlayService());
mAdapter.notifyDataSetChanged();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
getPlayService().play(position);
}
@Override
public void onMoreClick(final int position) {
final Music music = AppCache.getMusicList().get(position);
AlertDialog.Builder dialog = new AlertDialog.Builder(getContext());
dialog.setTitle(music.getTitle());
int itemsId = (position == getPlayService().getPlayingPosition()) ? R.array.local_music_dialog_without_delete : R.array.local_music_dialog;
dialog.setItems(itemsId, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:// 分享
shareMusic(music);
break;
case 1:// 设为铃声
requestSetRingtone(music);
break;
case 2:// 查看歌曲信息
musicInfo(music);
break;
case 3:// 删除
deleteMusic(music);
break;
}
}
});
dialog.show();
}
public void onItemPlay() {
if (isAdded()) {
updateView();
if (getPlayService().getPlayingMusic().getType() == Music.Type.LOCAL) {
lvLocalMusic.smoothScrollToPosition(getPlayService().getPlayingPosition());
}
}
}
public void onMusicListUpdate() {
if (isAdded()) {
updateView();
}
}
/**
* 分享音乐
*/
private void shareMusic(Music music) {
File file = new File(music.getPath());
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("audio/*");
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
startActivity(Intent.createChooser(intent, getString(R.string.share)));
}
private void requestSetRingtone(final Music music) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.System.canWrite(getContext())) {
ToastUtils.show("没有权限,无法设置铃声,请授予权限");
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getContext().getPackageName()));
startActivityForResult(intent, REQUEST_WRITE_SETTINGS);
} else {
setRingtone(music);
}
}
/**
* 设置铃声
*/
private void setRingtone(Music music) {
Uri uri = MediaStore.Audio.Media.getContentUriForPath(music.getPath());
// 查询音乐文件在媒体库是否存在
Cursor cursor = getContext().getContentResolver().query(uri, null,
MediaStore.MediaColumns.DATA + "=?", new String[]{music.getPath()}, null);
if (cursor == null) {
return;
}
if (cursor.moveToFirst() && cursor.getCount() > 0) {
String _id = cursor.getString(0);
ContentValues values = new ContentValues();
values.put(MediaStore.Audio.Media.IS_MUSIC, true);
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_ALARM, false);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.Media.IS_PODCAST, false);
getContext().getContentResolver().update(uri, values, MediaStore.MediaColumns.DATA + "=?",
new String[]{music.getPath()});
Uri newUri = ContentUris.withAppendedId(uri, Long.valueOf(_id));
RingtoneManager.setActualDefaultRingtoneUri(getContext(), RingtoneManager.TYPE_RINGTONE, newUri);
ToastUtils.show(R.string.setting_ringtone_success);
}
cursor.close();
}
private void musicInfo(Music music) {
AlertDialog.Builder dialog = new AlertDialog.Builder(getContext());
dialog.setTitle(music.getTitle());
StringBuilder sb = new StringBuilder();
sb.append("艺术家:")
.append(music.getArtist())
.append("\n\n")
.append("专辑:")
.append(music.getAlbum())
.append("\n\n")
.append("播放时长:")
.append(SystemUtils.formatTime("mm:ss", music.getDuration()))
.append("\n\n")
.append("文件名称:")
.append(music.getFileName())
.append("\n\n")
.append("文件大小:")
.append(FileUtils.b2mb((int) music.getFileSize()))
.append("MB")
.append("\n\n")
.append("文件路径:")
.append(new File(music.getPath()).getParent());
dialog.setMessage(sb.toString());
dialog.show();
}
/**
* 删除音乐
*/
private void deleteMusic(final Music music) {
AlertDialog.Builder dialog = new AlertDialog.Builder(getContext());
String title = music.getTitle();
String msg = getString(R.string.delete_music, title);
dialog.setMessage(msg);
dialog.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
AppCache.getMusicList().remove(music);
File file = new File(music.getPath());
if (file.delete()) {
getPlayService().updatePlayingPosition();
updateView();
// 刷新媒体库
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + music.getPath()));
getContext().sendBroadcast(intent);
}
}
});
dialog.setNegativeButton(R.string.cancel, null);
dialog.show();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_WRITE_SETTINGS) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.System.canWrite(getContext())) {
ToastUtils.show("授权成功,请在再次操作以设置铃声");
}
}
}
}