PickRingtone.java

 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}