package com.architjn.acjmusicplayer.utils;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.media.RingtoneManager;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Html;
import android.text.Spanned;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.MenuItem;
import android.view.WindowManager;
import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.architjn.acjmusicplayer.R;
import com.architjn.acjmusicplayer.service.PlayerService;
import com.architjn.acjmusicplayer.ui.layouts.activity.AlbumActivity;
import com.architjn.acjmusicplayer.ui.layouts.activity.ArtistActivity;
import com.architjn.acjmusicplayer.utils.adapters.AddToPlaylistDialogListAdapter;
import com.architjn.acjmusicplayer.utils.decorations.SimpleDividerItemDecoration;
import com.architjn.acjmusicplayer.utils.handlers.PlaylistDBHelper;
import com.architjn.acjmusicplayer.utils.items.Song;
import com.cocosw.bottomsheet.BottomSheet;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by architjn on 09/12/15.
*/
public class Utils {
private final PlaylistDBHelper playlistDbHelper;
private Context context;
public Utils(Context context) {
this.context = context;
playlistDbHelper = new PlaylistDBHelper(context);
}
public int dpToPx(int dp) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
}
public void addToPlaylist(final Activity activity, final long songId) {
final AddToPlaylistDialogListAdapter adapter = new AddToPlaylistDialogListAdapter(context,
playlistDbHelper.getAllPlaylist(), songId);
RecyclerView rv = (RecyclerView) activity.getLayoutInflater()
.inflate(R.layout.addtoplaylist, null);
rv.setLayoutManager(new LinearLayoutManager(context));
rv.addItemDecoration(new SimpleDividerItemDecoration(context, 0));
rv.setAdapter(adapter);
MaterialDialog dialog = new MaterialDialog.Builder(context)
.title(R.string.add_to_playlist)
.customView(rv, false)
.positiveText(R.string.new_playlist)
.negativeText(R.string.close)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) {
newPlaylistDialog(activity, songId);
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) {
materialDialog.dismiss();
}
})
.show();
adapter.setDialog(dialog);
}
private void newPlaylistDialog(final Activity activity, final long songId) {
new MaterialDialog.Builder(context)
.title(R.string.new_playlist)
.input(null, null, new MaterialDialog.InputCallback() {
@Override
public void onInput(MaterialDialog dialog, CharSequence input) {
if (!input.toString().matches("")) {
new PlaylistDBHelper(context).createPlaylist(input.toString());
addToPlaylist(activity, songId);
}
}
}).show();
}
public void handleSongMenuClick(final MenuItem item, final ArrayList<Song> items,
final Intent intent, final int position, Activity activity,
PermissionChecker permissionChecker) {
switch (item.getItemId()) {
case R.id.popup_song_play:
intent.setAction(PlayerService.ACTION_PLAY_SINGLE);
intent.putExtra("songId", items.get(position).getSongId());
context.sendBroadcast(intent);
break;
case R.id.popup_song_addtoplaylist:
addToPlaylist(activity,
items.get(position).getSongId());
break;
case R.id.popup_song_add_playing_queue:
intent.setAction(PlayerService.ACTION_ADD_QUEUE);
intent.putExtra("songId", items.get(position).getSongId());
context.sendBroadcast(intent);
break;
case R.id.popup_song_open_album:
intent.setClass(context, AlbumActivity.class);
intent.putExtra("albumId", items.get(position).getAlbumId());
intent.putExtra("albumName", items.get(position).getAlbumName());
context.startActivity(intent);
break;
case R.id.popup_song_open_artist:
intent.setClass(context, ArtistActivity.class);
intent.putExtra("name", items.get(position).getArtist());
intent.putExtra("id", ListSongs.getArtistIdFromName(context,
items.get(position).getArtist()));
context.startActivity(intent);
break;
case R.id.popup_song_share:
new BottomSheet.Builder(activity)
.title(R.string.share_as).sheet(R.menu.share_bottom_sheet)
.listener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case R.id.share_file:
shareSongFile(items, position);
break;
case R.id.share_text:
shareSongText(items, position);
break;
}
}
}).show();
break;
case R.id.popup_song_details:
try {
showSongDetailDialog(items, position);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
break;
case R.id.popup_song_delete:
File songFile = new File(items.get(position).getPath());
if (songFile.delete()) {
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show();
}
context.getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
MediaStore.MediaColumns._ID + "='" + items.get(position).getSongId() + "'", null);
break;
// case R.id.popup_song_set_as_ringtone:
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
// if (Settings.System.canWrite(context)) {
// setAsRingtone(items.get(position).getPath());
// Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show();
// } else {
// new MaterialDialog.Builder(context).title(R.string.ringtone_permission_title)
// .content(R.string.ringtone_permission_content)
// .positiveText(R.string.ok)
// .negativeText(R.string.cancel)
// .onPositive(new MaterialDialog.SingleButtonCallback() {
// @Override
// public void onClick(@NonNull MaterialDialog materialDialog,
// @NonNull DialogAction dialogAction) {
// intent.setAction(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
// intent.setData(Uri.parse("package:" + context.getPackageName()));
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(intent);
// }
// })
// .onNegative(new MaterialDialog.SingleButtonCallback() {
// @Override
// public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) {
// materialDialog.dismiss();
// }
// }).show();
// }
// else {
// setAsRingtone(items.get(position).getPath());
// }
// break;
}
}
private void setAsRingtone(String filepath) {
File ringtoneFile = new File(filepath);
ContentValues content = new ContentValues();
content.put(MediaStore.MediaColumns.DATA, ringtoneFile.getAbsolutePath());
content.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName());
content.put(MediaStore.MediaColumns.SIZE, 215454);
content.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
content.put(MediaStore.Audio.Media.DURATION, 230);
content.put(MediaStore.Audio.Media.IS_RINGTONE, true);
content.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
content.put(MediaStore.Audio.Media.IS_ALARM, true);
content.put(MediaStore.Audio.Media.IS_MUSIC, true);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(
ringtoneFile.getAbsolutePath());
// context.getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + ringtoneFile.getAbsolutePath() + "\"",
// null);
Uri newUri = context.getContentResolver().insert(uri, content);
RingtoneManager.setActualDefaultRingtoneUri(
context, RingtoneManager.TYPE_RINGTONE,
newUri);
}
private void showSongDetailDialog(ArrayList<Song> items, int position) {
MediaExtractor mex = new MediaExtractor();
try {
mex.setDataSource(items.get(position).getPath());
} catch (IOException e) {
e.printStackTrace();
}
MediaFormat mf = mex.getTrackFormat(0);
int bitRate = mf.getInteger(MediaFormat.KEY_BIT_RATE);
int sampleRate = mf.getInteger(MediaFormat.KEY_SAMPLE_RATE);
String mime = mf.getString(MediaFormat.KEY_MIME);
File songFile = new File(items.get(position).getPath());
float file_size = (songFile.length() / 1024);
StringBuilder content = new StringBuilder();
content.append(getString(R.string.song_name));
content.append(items.get(position).getName());
content.append("\n\n");
content.append(getString(R.string.album_name));
content.append(items.get(position).getAlbumName());
content.append("\n\n");
content.append(getString(R.string.artist_name));
content.append(items.get(position).getArtist());
content.append("\n\n");
content.append(getString(R.string.file_path));
content.append(items.get(position).getPath());
content.append("\n\n");
content.append(getString(R.string.file_name));
content.append(songFile.getName());
content.append("\n\n");
content.append(getString(R.string.format));
content.append(mime);
content.append("\n\n");
content.append(getString(R.string.file_size));
content.append(String.valueOf(String.format("%.2f", file_size / 1024)));
content.append(" MB");
content.append("\n\n");
content.append(getString(R.string.bitrate));
content.append(String.valueOf(bitRate / 1000));
content.append(" kb/s");
content.append("\n\n");
content.append(getString(R.string.samplingrate));
content.append(sampleRate);
content.append(" Hz");
new MaterialDialog.Builder(context)
.title(R.string.details)
.content(content.toString())
.positiveText(R.string.ok)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog materialDialog,
@NonNull DialogAction dialogAction) {
materialDialog.dismiss();
}
})
.show();
}
private Spanned getString(@StringRes int string) {
return Html.fromHtml(context.getResources().getString(string));
}
private void shareSongText(ArrayList<Song> items, int position) {
String shareBody = context.getResources().getString(R.string.currently_listening_to) +
items.get(position).getName() +
context.getResources().getString(R.string.by) +
items.get(position).getArtist();
Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, shareBody);
context.startActivity(Intent.createChooser(sharingIntent,
context.getResources().getString(R.string.share_using)));
}
private void shareSongFile(ArrayList<Song> items, int position) {
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("audio/*");
share.putExtra(Intent.EXTRA_STREAM,
Uri.parse("file:///" + items.get(position).getPath()));
context.startActivity(Intent.createChooser(share,
context.getString(R.string.share_song_file)));
}
public int getWindowWidth() {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
return metrics.widthPixels;
}
public int getWindowHeight() {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getMetrics(metrics);
return metrics.heightPixels;
}
public Bitmap getBitmapOfVector(@DrawableRes int id, int height, int width) {
Drawable vectorDrawable = context.getDrawable(id);
if (vectorDrawable != null)
vectorDrawable.setBounds(0, 0, width, height);
Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bm);
if (vectorDrawable != null)
vectorDrawable.draw(canvas);
return bm;
}
}