diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/menu/SongMenuHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/menu/SongMenuHelper.java index a84bfeb4..b55c7f53 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/menu/SongMenuHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/menu/SongMenuHelper.java @@ -19,6 +19,7 @@ import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; +import com.kabouzeid.gramophone.util.RingtoneManager; /** * @author Karim Abou Zeid (kabouzeid) @@ -29,7 +30,12 @@ public class SongMenuHelper { public static boolean handleMenuClick(@NonNull FragmentActivity activity, @NonNull Song song, int menuItemId) { switch (menuItemId) { case R.id.action_set_as_ringtone: - MusicUtil.setRingtone(activity, song.id); + if (RingtoneManager.requiresDialog(activity)) { + RingtoneManager.showDialog(activity); + } else { + RingtoneManager ringtoneManager = new RingtoneManager(); + ringtoneManager.setRingtone(activity, song.id); + } return true; case R.id.action_share: activity.startActivity(Intent.createChooser(MusicUtil.createShareSongFileIntent(song, activity), null)); diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java index 6258c4c5..2b6aa498 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/MusicUtil.java @@ -70,39 +70,7 @@ public class MusicUtil { } } - public static void setRingtone(@NonNull final Context context, final int id) { - final ContentResolver resolver = context.getContentResolver(); - final Uri uri = getSongFileUri(id); - try { - final ContentValues values = new ContentValues(2); - values.put(MediaStore.Audio.AudioColumns.IS_RINGTONE, "1"); - values.put(MediaStore.Audio.AudioColumns.IS_ALARM, "1"); - resolver.update(uri, values, null, null); - } catch (@NonNull final UnsupportedOperationException ignored) { - return; - } - try { - Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, - new String[]{MediaStore.MediaColumns.TITLE}, - BaseColumns._ID + "=?", - new String[]{String.valueOf(id)}, - null); - try { - if (cursor != null && cursor.getCount() == 1) { - cursor.moveToFirst(); - Settings.System.putString(resolver, Settings.System.RINGTONE, uri.toString()); - final String message = context.getString(R.string.x_has_been_set_as_ringtone, cursor.getString(0)); - Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); - } - } finally { - if (cursor != null) { - cursor.close(); - } - } - } catch (SecurityException ignored) { - } - } @NonNull public static String getArtistInfoString(@NonNull final Context context, @NonNull final Artist artist) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/RingtoneManager.java b/app/src/main/java/com/kabouzeid/gramophone/util/RingtoneManager.java new file mode 100644 index 00000000..5e2a9ae2 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/util/RingtoneManager.java @@ -0,0 +1,77 @@ +package com.kabouzeid.gramophone.util; + +import android.content.ContentResolver; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.provider.BaseColumns; +import android.provider.MediaStore; +import android.provider.Settings; +import android.widget.Toast; + +import androidx.annotation.NonNull; + +import com.afollestad.materialdialogs.MaterialDialog; +import com.kabouzeid.gramophone.R; + +public class RingtoneManager { + + + public static boolean requiresDialog(@NonNull Context context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return !Settings.System.canWrite(context); + } + return false; + } + + public static MaterialDialog showDialog(Context context) { + return new MaterialDialog.Builder(context) + .title(R.string.dialog_ringtone_title) + .content(R.string.dialog_ringtone_message) + .positiveText(android.R.string.ok) + .negativeText(android.R.string.cancel) + .onPositive((dialog, which) -> { + Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); + intent.setData(Uri.parse("package:" + context.getPackageName())); + context.startActivity(intent); + }) + .show(); + } + + public void setRingtone(@NonNull final Context context, final int id) { + final ContentResolver resolver = context.getContentResolver(); + final Uri uri = MusicUtil.getSongFileUri(id); + try { + final ContentValues values = new ContentValues(2); + values.put(MediaStore.Audio.AudioColumns.IS_RINGTONE, "1"); + values.put(MediaStore.Audio.AudioColumns.IS_ALARM, "1"); + resolver.update(uri, values, null, null); + } catch (@NonNull final UnsupportedOperationException ignored) { + return; + } + + try { + Cursor cursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, + new String[]{MediaStore.MediaColumns.TITLE}, + BaseColumns._ID + "=?", + new String[]{String.valueOf(id)}, + null); + try { + if (cursor != null && cursor.getCount() == 1) { + cursor.moveToFirst(); + Settings.System.putString(resolver, Settings.System.RINGTONE, uri.toString()); + final String message = context.getString(R.string.x_has_been_set_as_ringtone, cursor.getString(0)); + Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); + } + } finally { + if (cursor != null) { + cursor.close(); + } + } + } catch (SecurityException ignored) { + } + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b3a2cd4a..bded8aa7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -308,4 +308,6 @@ Album Year Finish last song + Set ringtone + Allow phonograph to modify audio settings