1package eu.siacs.conversations.ui.activity.result;
2
3import android.app.Activity;
4import android.content.Context;
5import android.content.Intent;
6import android.media.RingtoneManager;
7import android.net.Uri;
8
9import androidx.activity.result.contract.ActivityResultContract;
10import androidx.annotation.NonNull;
11import androidx.annotation.Nullable;
12
13public class PickRingtone extends ActivityResultContract<Uri, Uri> {
14
15 private static final Uri NONE = Uri.parse("about:blank");
16
17 private final int ringToneType;
18
19 public PickRingtone(final int ringToneType) {
20 this.ringToneType = ringToneType;
21 }
22
23 @NonNull
24 @Override
25 public Intent createIntent(@NonNull final Context context, final Uri existing) {
26 final Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
27 intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, ringToneType);
28 intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
29 intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true);
30 if (noneToNull(existing) != null) {
31 intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, existing);
32 }
33 return intent;
34 }
35
36 @Override
37 public Uri parseResult(int resultCode, @Nullable Intent data) {
38 if (resultCode != Activity.RESULT_OK || data == null) {
39 return null;
40 }
41 return nullToNone(data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI));
42 }
43
44 public static Uri noneToNull(final Uri uri) {
45 return uri == null || NONE.equals(uri) ? null : uri;
46 }
47
48 public static @NonNull Uri nullToNone(final Uri uri) {
49 return uri == null ? NONE : uri;
50 }
51}