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