diff --git a/README.md b/README.md index d8e1b2f..7a9415e 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,8 @@ Timer which loops over the specified interval, playing your default notification ### 2025-07-11 (This article)[https://sijus.medium.com/resurrecting-a-5-year-old-android-app-a-developers-journey-59d8f5689e5b] - was very helpful in getting this app updated from SDK 25 to 36. \ No newline at end of file + was very helpful in getting this app updated from SDK 25 to 36. + +## Licenses +Chime sound byte came free from here: +https://pixabay.com/sound-effects/chime-sound-7143/ diff --git a/app/src/main/java/com/hyperling/apps/infinitetimer/MainActivity.java b/app/src/main/java/com/hyperling/apps/infinitetimer/MainActivity.java index ac98a9b..70f1b0d 100755 --- a/app/src/main/java/com/hyperling/apps/infinitetimer/MainActivity.java +++ b/app/src/main/java/com/hyperling/apps/infinitetimer/MainActivity.java @@ -1,13 +1,17 @@ package com.hyperling.apps.infinitetimer; +import android.app.NotificationManager; +import android.content.DialogInterface; import android.content.SharedPreferences; import android.graphics.Color; import android.media.MediaPlayer; +import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; @@ -68,17 +72,60 @@ public class MainActivity extends AppCompatActivity { stringChronometerDefault = getString(R.string.chronometerDefault); + if (DEBUG) Log.d(tag, "Got strings."); + /***** Shared Preferences *****/ sharedPreferences = getSharedPreferences(keySharedPreferences, MODE_PRIVATE); DEBUG = sharedPreferences.getBoolean(keyDebug, true); appOpen = sharedPreferences.getBoolean(keyAppOpen, false); serviceRunning = sharedPreferences.getBoolean(keyServiceRunning, false); + if (DEBUG) Log.d(tag, "Got preferences."); + // Sound ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + if (DEBUG) Log.d(tag, "ringtoneUri=" + ringtoneUri.toString()); mediaPlayer = MediaPlayer.create(this, ringtoneUri); + if (mediaPlayer == null) { + if (DEBUG) Log.d(tag, "Media Player is null, trying alarm"); + ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); + mediaPlayer = MediaPlayer.create(this, ringtoneUri); + } + if (mediaPlayer == null) { + if (DEBUG) Log.d(tag, "Media Player is null, trying ringtone"); + ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); + mediaPlayer = MediaPlayer.create(this, ringtoneUri); + } + if (mediaPlayer == null) { + if (DEBUG) Log.d(tag, "Media Player is null, trying all"); + ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALL); + mediaPlayer = MediaPlayer.create(this, ringtoneUri); + } + if (mediaPlayer == null) { + if (DEBUG) Log.d(tag, "Media Player is null, trying local sound byte"); + mediaPlayer = MediaPlayer.create(this, R.raw.chime_sound_7143); + } + if (mediaPlayer == null) { + String message = "Could not find a notification, alarm, or ringtone to play."; + message += " App will not be able to function without one of these."; + message += " Please exit and install a system notification sound."; - if (DEBUG) Log.d(tag, "Got strings."); + new AlertDialog.Builder(MainActivity.this) + .setTitle("Error") + .setMessage(message) + .setPositiveButton("Exit", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + finish(); + } + }) + .setCancelable(false) + .show() + ; + } else { + if (DEBUG) Log.d(tag, "mediaPlayer=" + mediaPlayer.toString()); + } if (DEBUG){ // Print all preferences @@ -537,13 +584,34 @@ public class MainActivity extends AppCompatActivity { String tag = TAG + "playSound"; if (DEBUG) Log.d(tag, "Starting"); - /* Original code, did not work on Nexus 7 with CM 12.1-20151117 (Android 5.1.1) + /* Original code, did not work on Nexus 7 with CM 12.1-20151117 (Android 5.1.1) * / Ringtone ringtone = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri); ringtone.play(); - */ + /**/ - //mediaPlayer.reset(); - mediaPlayer.start(); + try { + mediaPlayer.start(); + } catch (Exception e) { + sharedPreferences.edit().putBoolean(keyStartStop, false).apply(); + + String message = "Failed to play a notification sound."; + message += " Please screenshot this error and send it to me@hyperling.com:\n\n"; + message += e.toString(); + + new AlertDialog.Builder(MainActivity.this) + .setTitle("Error") + .setMessage(message) + .setPositiveButton("Exit", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + finish(); + } + }) + .setCancelable(false) + .show() + ; + } if (DEBUG) Log.d(tag, "Finished"); } diff --git a/app/src/main/res/raw/chime_sound_7143.mp3 b/app/src/main/res/raw/chime_sound_7143.mp3 new file mode 100644 index 0000000..d9dbf34 Binary files /dev/null and b/app/src/main/res/raw/chime_sound_7143.mp3 differ