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;
 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}