Fix rintone sharing (#687)

This commit is contained in:
George Zacharia 2019-06-10 01:59:26 +05:30 committed by Eugene
commit 18cdb4a72e
4 changed files with 86 additions and 33 deletions

View file

@ -19,6 +19,7 @@ import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.RingtoneManager;
/** /**
* @author Karim Abou Zeid (kabouzeid) * @author Karim Abou Zeid (kabouzeid)
@ -29,7 +30,12 @@ public class SongMenuHelper {
public static boolean handleMenuClick(@NonNull FragmentActivity activity, @NonNull Song song, int menuItemId) { public static boolean handleMenuClick(@NonNull FragmentActivity activity, @NonNull Song song, int menuItemId) {
switch (menuItemId) { switch (menuItemId) {
case R.id.action_set_as_ringtone: 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; return true;
case R.id.action_share: case R.id.action_share:
activity.startActivity(Intent.createChooser(MusicUtil.createShareSongFileIntent(song, activity), null)); activity.startActivity(Intent.createChooser(MusicUtil.createShareSongFileIntent(song, activity), null));

View file

@ -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 @NonNull
public static String getArtistInfoString(@NonNull final Context context, @NonNull final Artist artist) { public static String getArtistInfoString(@NonNull final Context context, @NonNull final Artist artist) {

View file

@ -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) {
}
}
}

View file

@ -308,4 +308,6 @@
<string name="sort_order_album">Album</string> <string name="sort_order_album">Album</string>
<string name="sort_order_year">Year</string> <string name="sort_order_year">Year</string>
<string name="finish_current_music_sleep_timer">Finish last song</string> <string name="finish_current_music_sleep_timer">Finish last song</string>
<string name="dialog_ringtone_title">Set ringtone</string>
<string name="dialog_ringtone_message">Allow phonograph to modify audio settings</string>
</resources> </resources>