diff --git a/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java b/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java
index 057aedfba..c31546514 100644
--- a/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java
+++ b/app/src/main/java/org/isoron/uhabits/HabitBroadcastReceiver.java
@@ -29,7 +29,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.BitmapFactory;
-import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Handler;
import android.preference.PreferenceManager;
@@ -176,7 +175,7 @@ public class HabitBroadcastReceiver extends BroadcastReceiver
PendingIntent checkIntentPending = buildCheckIntent(context, habit, timestamp);
PendingIntent snoozeIntentPending = buildSnoozeIntent(context, habit);
- Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
+ Uri ringtoneUri = ReminderHelper.getRingtoneUri(context);
NotificationCompat.WearableExtender wearableExtender =
new NotificationCompat.WearableExtender().setBackground(
@@ -192,7 +191,7 @@ public class HabitBroadcastReceiver extends BroadcastReceiver
context.getString(R.string.check), checkIntentPending)
.addAction(R.drawable.ic_action_snooze,
context.getString(R.string.snooze), snoozeIntentPending)
- .setSound(soundUri)
+ .setSound(ringtoneUri)
.extend(wearableExtender)
.setWhen(reminderTime)
.setShowWhen(true)
diff --git a/app/src/main/java/org/isoron/uhabits/fragments/SettingsFragment.java b/app/src/main/java/org/isoron/uhabits/fragments/SettingsFragment.java
index 7679a3c71..e3b38731b 100644
--- a/app/src/main/java/org/isoron/uhabits/fragments/SettingsFragment.java
+++ b/app/src/main/java/org/isoron/uhabits/fragments/SettingsFragment.java
@@ -20,6 +20,7 @@
package org.isoron.uhabits.fragments;
import android.app.backup.BackupManager;
+import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.preference.Preference;
@@ -28,11 +29,14 @@ import android.support.v7.preference.PreferenceFragmentCompat;
import org.isoron.uhabits.MainActivity;
import org.isoron.uhabits.R;
+import org.isoron.uhabits.helpers.ReminderHelper;
import org.isoron.uhabits.helpers.UIHelper;
public class SettingsFragment extends PreferenceFragmentCompat
implements SharedPreferences.OnSharedPreferenceChangeListener
{
+ private static int RINGTONE_REQUEST_CODE = 1;
+
@Override
public void onCreate(Bundle savedInstanceState)
{
@@ -44,6 +48,8 @@ public class SettingsFragment extends PreferenceFragmentCompat
setResultOnPreferenceClick("exportDB", MainActivity.RESULT_EXPORT_DB);
setResultOnPreferenceClick("bugReport", MainActivity.RESULT_BUG_REPORT);
+ updateRingtoneDescription();
+
if(UIHelper.isLocaleFullyTranslated())
removePreference("translate", "linksCategory");
}
@@ -97,4 +103,36 @@ public class SettingsFragment extends PreferenceFragmentCompat
{
BackupManager.dataChanged("org.isoron.uhabits");
}
+
+ @Override
+ public boolean onPreferenceTreeClick(Preference preference)
+ {
+ if (preference.getKey().equals("reminderSound"))
+ {
+ ReminderHelper.startRingtonePickerActivity(this, RINGTONE_REQUEST_CODE);
+ return true;
+ }
+
+ return super.onPreferenceTreeClick(preference);
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data)
+ {
+ if(requestCode == RINGTONE_REQUEST_CODE)
+ {
+ ReminderHelper.parseRingtoneData(getContext(), data);
+ updateRingtoneDescription();
+ return;
+ }
+
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+
+ private void updateRingtoneDescription()
+ {
+ String ringtoneName = ReminderHelper.getRingtoneName(getContext());
+ Preference ringtonePreference = findPreference("reminderSound");
+ ringtonePreference.setSummary(ringtoneName);
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/org/isoron/uhabits/helpers/ReminderHelper.java b/app/src/main/java/org/isoron/uhabits/helpers/ReminderHelper.java
index 876c229fb..49220970e 100644
--- a/app/src/main/java/org/isoron/uhabits/helpers/ReminderHelper.java
+++ b/app/src/main/java/org/isoron/uhabits/helpers/ReminderHelper.java
@@ -23,12 +23,19 @@ import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
+import android.content.SharedPreferences;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
+import android.preference.PreferenceManager;
+import android.provider.Settings;
import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
import android.util.Log;
import org.isoron.uhabits.HabitBroadcastReceiver;
+import org.isoron.uhabits.R;
import org.isoron.uhabits.models.Habit;
import java.text.DateFormat;
@@ -89,4 +96,66 @@ public class ReminderHelper
Log.d("ReminderHelper", String.format("Setting alarm (%s): %s",
DateFormat.getDateTimeInstance().format(new Date(reminderTime)), habit.name));
}
+
+ @Nullable
+ public static Uri getRingtoneUri(Context context)
+ {
+ Uri ringtoneUri = null;
+ Uri defaultRingtoneUri = Settings.System.DEFAULT_NOTIFICATION_URI;
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ String prefRingtoneUri = prefs.getString("pref_ringtone_uri", defaultRingtoneUri.toString());
+ if (prefRingtoneUri.length() > 0) ringtoneUri = Uri.parse(prefRingtoneUri);
+
+ return ringtoneUri;
+ }
+
+ public static void parseRingtoneData(Context context, Intent data)
+ {
+ Uri ringtoneUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
+
+ if (ringtoneUri != null)
+ {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ prefs.edit().putString("pref_ringtone_uri", ringtoneUri.toString()).apply();
+ }
+ else
+ {
+ String off = context.getResources().getString(R.string.none);
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ prefs.edit().putString("pref_ringtone_uri", "").apply();
+ }
+ }
+
+ public static void startRingtonePickerActivity(Fragment fragment, int requestCode)
+ {
+ Uri existingRingtoneUri = ReminderHelper.getRingtoneUri(fragment.getContext());
+ Uri defaultRingtoneUri = Settings.System.DEFAULT_NOTIFICATION_URI;
+
+ 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, defaultRingtoneUri);
+ intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, existingRingtoneUri);
+ fragment.startActivityForResult(intent, requestCode);
+ }
+
+ public static String getRingtoneName(Context context)
+ {
+ Uri ringtoneUri = getRingtoneUri(context);
+ String ringtoneName = context.getResources().getString(R.string.none);
+
+ if(ringtoneUri != null)
+ {
+ Ringtone ringtone = RingtoneManager.getRingtone(context, ringtoneUri);
+ if(ringtone != null)
+ {
+ ringtoneName = ringtone.getTitle(context);
+ ringtone.stop();
+ }
+ }
+
+ return ringtoneName;
+ }
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7699ac830..08bc9a21a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -176,4 +176,6 @@
Every %d weeks
Every %d months
Score
+ Reminder sound
+ None
\ No newline at end of file
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 612071fd5..fb63696fe 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -51,6 +51,10 @@
android:summary="%s"
android:title="@string/pref_snooze_interval_title"/>
+
+