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