package org.transdroid.core.gui.settings; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.provider.Settings; import android.util.AttributeSet; import androidx.preference.Preference; @SuppressWarnings("unused") // Constructors for XML inflation public class RingtonePreference extends Preference { private static final int REQUEST_RINGTONE = 0; public RingtonePreference(Context context) { super(context); } public RingtonePreference(Context context, AttributeSet attrs) { super(context, attrs); } public RingtonePreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public RingtonePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onClick() { if (!(getContext() instanceof Activity)) { return; } Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, Settings.System.DEFAULT_NOTIFICATION_URI); String existingValue = getSharedPreferences().getString(getKey(), null); if (existingValue != null) { if (existingValue.isEmpty()) { // Select "Silent" intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null); } else { intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, Uri.parse(existingValue)); } } else { // No ringtone has been selected, set to the default intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, Settings.System.DEFAULT_NOTIFICATION_URI); } ((Activity) getContext()).startActivityForResult(intent, REQUEST_RINGTONE); } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_RINGTONE && resultCode == Activity.RESULT_OK && data != null && data.getExtras() != null) { Uri ringtone = (Uri) data.getExtras().get(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); getSharedPreferences().edit().putString(getKey(), ringtone == null ? "" : ringtone.toString()).apply(); } } }