diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/FindPhoneActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/FindPhoneActivity.java index 9a22934dd..1919e1ff7 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/FindPhoneActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/FindPhoneActivity.java @@ -18,9 +18,11 @@ package nodomain.freeyourgadget.gadgetbridge.activities; import android.content.BroadcastReceiver; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.res.AssetFileDescriptor; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.RingtoneManager; @@ -108,23 +110,15 @@ public class FindPhoneActivity extends AbstractGBActivity { } } - private void playRingtone(){ + private void playRingtone() { mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); if (mAudioManager != null) { userVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM); } mp = new MediaPlayer(); - Uri ringtoneUri = Uri.parse(GBApplication.getPrefs().getString(GBPrefs.PING_TONE, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE).toString())); - - try { - mp.setDataSource(this, ringtoneUri); - mp.setAudioStreamType(AudioManager.STREAM_ALARM); - mp.setLooping(true); - mp.prepare(); - mp.start(); - } catch (IOException ignore) { - LOG.warn("problem playing ringtone"); + if (!playConfiguredRingtone()) { + playFallbackRingtone(); } if (mAudioManager != null) { @@ -137,6 +131,46 @@ public class FindPhoneActivity extends AbstractGBActivity { mVibrator.cancel(); } + /** + * Attempt to play the configured ringtone. This fails to get the default ringtone on some ROMs + * (https://codeberg.org/Freeyourgadget/Gadgetbridge/pulls/2697) + * + * @return whether playing the configured ringtone was successful or not. + */ + private boolean playConfiguredRingtone() { + try { + Uri ringtoneUri = Uri.parse(GBApplication.getPrefs().getString(GBPrefs.PING_TONE, RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE).toString())); + mp.setDataSource(this, ringtoneUri); + mp.setAudioStreamType(AudioManager.STREAM_ALARM); + mp.setLooping(true); + mp.prepare(); + mp.start(); + } catch (final Exception e) { + LOG.warn("Failed to play configured ringtone", e); + return false; + } + + return true; + } + + private void playFallbackRingtone() { + try { + final AssetFileDescriptor afd = getBaseContext().getResources().openRawResourceFd(R.raw.ping_tone); + if (afd == null) { + LOG.error("Failed to load fallback ringtone"); + return; + } + + mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); + mp.setAudioStreamType(AudioManager.STREAM_ALARM); + mp.setLooping(true); + mp.prepare(); + mp.start(); + } catch (final Exception e) { + LOG.warn("Failed to play fallback ringtone", e); + } + } + private void stopSound() { mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, userVolume, AudioManager.FLAG_PLAY_SOUND); mp.stop(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java index 8ac78bff3..16c7037d2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/NotificationManagementActivity.java @@ -95,7 +95,14 @@ public class NotificationManagementActivity extends AbstractSettingsActivity { return true; } }); - pref.setSummary(RingtoneManager.getRingtone(this, Uri.parse(prefs.getString(GBPrefs.PING_TONE, DEFAULT_RINGTONE_URI))).getTitle(this)); + + try { + // This fails on some ROMs. The actual implementation falls-back to an internal ping tone + pref.setSummary(RingtoneManager.getRingtone(this, Uri.parse(prefs.getString(GBPrefs.PING_TONE, DEFAULT_RINGTONE_URI))).getTitle(this)); + } catch (final Exception e) { + LOG.error("Failed to find the configured ping ringtone"); + pref.setSummary("-"); + } pref = findPreference("pref_key_blacklist"); pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { diff --git a/app/src/main/res/raw/ping_tone.rtttl b/app/src/main/res/raw/ping_tone.rtttl new file mode 100644 index 000000000..af619fb36 --- /dev/null +++ b/app/src/main/res/raw/ping_tone.rtttl @@ -0,0 +1 @@ +ping:d=8,o=5,b=120:d,2p,d,2p,d,2p,d,2p \ No newline at end of file