From b2811b9797d63d528d475a76eb766dbc5c020ad0 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sun, 1 May 2016 09:36:11 -0400 Subject: [PATCH] Allow user to select reminder sound Closes #63 --- .../uhabits/HabitBroadcastReceiver.java | 5 +- .../uhabits/fragments/SettingsFragment.java | 38 ++++++++++ .../uhabits/helpers/ReminderHelper.java | 69 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/preferences.xml | 4 ++ 5 files changed, 115 insertions(+), 3 deletions(-) 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"/> + +