Added a ring 5 times setting to Astrid, and now a notification if your volume is muted and you launch astrid

pull/14/head
Tim Su 15 years ago
parent 91b84d2a53
commit 2ddc0429f2

@ -149,7 +149,10 @@ public final class Task extends AbstractModel {
public static final int NOTIFY_AFTER_DEADLINE = 1 << 2; public static final int NOTIFY_AFTER_DEADLINE = 1 << 2;
/** reminder mode non-stop */ /** reminder mode non-stop */
public static final int NOTIFY_NONSTOP = 1 << 3; public static final int NOTIFY_MODE_NONSTOP = 1 << 3;
/** reminder mode five times (exclusive with non-stop) */
public static final int NOTIFY_MODE_FIVE = 1 << 4;
// --- importance settings (note: importance > 3 are supported via plugin) // --- importance settings (note: importance > 3 are supported via plugin)

@ -13,13 +13,13 @@ import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.activity.ShortcutActivity; import com.todoroo.astrid.activity.ShortcutActivity;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.reminders.Notifications; import com.todoroo.astrid.reminders.Notifications;
import com.todoroo.astrid.utility.Constants; import com.todoroo.astrid.utility.Constants;
import com.todoroo.andlib.utility.Preferences;
/** /**
* Receiver is activated when Locale conditions are triggered * Receiver is activated when Locale conditions are triggered
@ -91,7 +91,7 @@ public class LocaleReceiver extends BroadcastReceiver {
Intent notifyIntent = ShortcutActivity.createIntent(filter); Intent notifyIntent = ShortcutActivity.createIntent(filter);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Notifications.showNotification(Constants.NOTIFICATION_LOCALE, Notifications.showNotification(Constants.NOTIFICATION_LOCALE,
notifyIntent, 0, notificationTitle, reminder, false); notifyIntent, 0, notificationTitle, reminder, 1);
Preferences.setLong(preferenceKey, DateUtilities.now()); Preferences.setLong(preferenceKey, DateUtilities.now());
} finally { } finally {

@ -145,7 +145,9 @@ public class Notifications extends BroadcastReceiver {
// read properties // read properties
String taskTitle = task.getValue(Task.TITLE); String taskTitle = task.getValue(Task.TITLE);
boolean nonstopMode = task.getFlag(Task.REMINDER_FLAGS, Task.NOTIFY_NONSTOP); boolean nonstopMode = task.getFlag(Task.REMINDER_FLAGS, Task.NOTIFY_MODE_NONSTOP);
boolean ringFiveMode = task.getFlag(Task.REMINDER_FLAGS, Task.NOTIFY_MODE_FIVE);
int ringTimes = nonstopMode ? -1 : (ringFiveMode ? 5 : 1);
// update last reminder time // update last reminder time
task.setValue(Task.REMINDER_LAST, DateUtilities.now()); task.setValue(Task.REMINDER_LAST, DateUtilities.now());
@ -160,16 +162,17 @@ public class Notifications extends BroadcastReceiver {
notifyIntent.putExtra(NotificationActivity.TOKEN_ID, id); notifyIntent.putExtra(NotificationActivity.TOKEN_ID, id);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
showNotification((int)id, notifyIntent, type, title, text, nonstopMode); showNotification((int)id, notifyIntent, type, title, text, ringTimes);
return true; return true;
} }
/** /**
* Shows an Astrid notification. Pulls in ring tone and quiet hour settings * Shows an Astrid notification. Pulls in ring tone and quiet hour settings
* from preferences. You can make it say anything you like. * from preferences. You can make it say anything you like.
* @param ringTimes number of times to ring (-1 = nonstop)
*/ */
public static void showNotification(int notificationId, Intent intent, int type, String title, public static void showNotification(int notificationId, Intent intent, int type, String title,
String text, boolean nonstopMode) { String text, int ringTimes) {
Context context = ContextManager.getContext(); Context context = ContextManager.getContext();
if(notificationManager == null) if(notificationManager == null)
notificationManager = new AndroidNotificationManager(context); notificationManager = new AndroidNotificationManager(context);
@ -178,7 +181,7 @@ public class Notifications extends BroadcastReceiver {
boolean quietHours = false; boolean quietHours = false;
int quietHoursStart = Preferences.getIntegerFromString(R.string.p_rmd_quietStart, -1); int quietHoursStart = Preferences.getIntegerFromString(R.string.p_rmd_quietStart, -1);
int quietHoursEnd = Preferences.getIntegerFromString(R.string.p_rmd_quietEnd, -1); int quietHoursEnd = Preferences.getIntegerFromString(R.string.p_rmd_quietEnd, -1);
if(quietHoursStart != -1 && quietHoursEnd != -1 && !nonstopMode) { if(quietHoursStart != -1 && quietHoursEnd != -1 && ringTimes >= 0) {
int hour = new Date().getHours(); int hour = new Date().getHours();
if(quietHoursStart <= quietHoursEnd) { if(quietHoursStart <= quietHoursEnd) {
if(hour >= quietHoursStart && hour < quietHoursEnd) if(hour >= quietHoursStart && hour < quietHoursEnd)
@ -235,7 +238,7 @@ public class Notifications extends BroadcastReceiver {
// if non-stop mode is activated, set up the flags for insistent // if non-stop mode is activated, set up the flags for insistent
// notification, and increase the volume to full volume, so the user // notification, and increase the volume to full volume, so the user
// will actually pay attention to the alarm // will actually pay attention to the alarm
if(nonstopMode && (type != ReminderService.TYPE_RANDOM)) { if(ringTimes < 0 && (type != ReminderService.TYPE_RANDOM)) {
notification.flags |= Notification.FLAG_INSISTENT; notification.flags |= Notification.FLAG_INSISTENT;
notification.audioStreamType = AudioManager.STREAM_ALARM; notification.audioStreamType = AudioManager.STREAM_ALARM;
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.setStreamVolume(AudioManager.STREAM_ALARM,
@ -243,6 +246,9 @@ public class Notifications extends BroadcastReceiver {
voiceReminder = false; voiceReminder = false;
} else { } else {
notification.audioStreamType = AudioManager.STREAM_NOTIFICATION; notification.audioStreamType = AudioManager.STREAM_NOTIFICATION;
if(ringTimes > 3)
audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION,
audioManager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION), 0);
} }
// quiet hours = no sound // quiet hours = no sound
@ -283,9 +289,13 @@ public class Notifications extends BroadcastReceiver {
if(Constants.DEBUG) if(Constants.DEBUG)
Log.w("Astrid", "Logging notification: " + text); //$NON-NLS-1$ //$NON-NLS-2$ Log.w("Astrid", "Logging notification: " + text); //$NON-NLS-1$ //$NON-NLS-2$
notificationManager.notify(notificationId, notification); for(int i = 0; i < Math.max(ringTimes, 1); i++) {
notificationManager.notify(notificationId, notification);
AndroidUtilities.sleepDeep(500);
}
if (voiceReminder) { if (voiceReminder) {
AndroidUtilities.sleepDeep(1000); AndroidUtilities.sleepDeep(2000);
for(int i = 0; i < 50; i++) { for(int i = 0; i < 50; i++) {
AndroidUtilities.sleepDeep(500); AndroidUtilities.sleepDeep(500);
if(audioManager.getMode() != AudioManager.MODE_RINGTONE) if(audioManager.getMode() != AudioManager.MODE_RINGTONE)

@ -90,6 +90,9 @@
<!-- Quick Add Edit Box Hint--> <!-- Quick Add Edit Box Hint-->
<string name="TLA_quick_add_hint">Add to this list...</string> <string name="TLA_quick_add_hint">Add to this list...</string>
<!-- Notification Volumne notification-->
<string name="TLA_notification_volume_low">Notifications are muted. You won\'t be able to hear Astrid!</string>
<!-- ====================================================== TaskAdapter == --> <!-- ====================================================== TaskAdapter == -->
<!-- Format string to indicate task is hidden (%s => task name) --> <!-- Format string to indicate task is hidden (%s => task name) -->

@ -21,11 +21,14 @@
<!-- Task Edit: Reminder alarm clock label --> <!-- Task Edit: Reminder alarm clock label -->
<string name="TEA_reminder_alarm_label">Ring/Vibrate Type:</string> <string name="TEA_reminder_alarm_label">Ring/Vibrate Type:</string>
<!-- Task Edit: Reminder alarm clock toggle: off --> <!-- Task Edit: Reminder mode: ring once -->
<string name="TEA_reminder_alarm_off">Ring Once</string> <string name="TEA_reminder_mode_once">Ring Once</string>
<!-- Task Edit: Reminder alarm clock toggle: on --> <!-- Task Edit: Reminder mode: ring five times -->
<string name="TEA_reminder_alarm_on">Ring Until I Dismiss Alarm</string> <string name="TEA_reminder_mode_five">Ring Five Times</string>
<!-- Task Edit: Reminder mode: ring nonstop -->
<string name="TEA_reminder_mode_nonstop">Ring Until I Dismiss Alarm</string>
<string-array name="TEA_reminder_random"> <string-array name="TEA_reminder_random">
<!-- random reminder choices for task edit page. --> <!-- random reminder choices for task edit page. -->

@ -304,7 +304,7 @@ public final class TaskEditActivity extends TabActivity {
}); });
} }
controls.add( new ReminderControlSet(R.id.reminder_due, controls.add(new ReminderControlSet(R.id.reminder_due,
R.id.reminder_overdue, R.id.reminder_alarm)); R.id.reminder_overdue, R.id.reminder_alarm));
controls.add(new RandomReminderControlSet(R.id.reminder_random, controls.add(new RandomReminderControlSet(R.id.reminder_random,
R.id.reminder_random_interval)); R.id.reminder_random_interval));
@ -1293,8 +1293,9 @@ public final class TaskEditActivity extends TabActivity {
mode = (Spinner)findViewById(modeId); mode = (Spinner)findViewById(modeId);
String[] list = new String[] { String[] list = new String[] {
getString(R.string.TEA_reminder_alarm_off), getString(R.string.TEA_reminder_mode_once),
getString(R.string.TEA_reminder_alarm_on), getString(R.string.TEA_reminder_mode_five),
getString(R.string.TEA_reminder_mode_nonstop),
}; };
final ArrayAdapter<String> adapter = new ArrayAdapter<String>( final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
TaskEditActivity.this, android.R.layout.simple_spinner_item, list); TaskEditActivity.this, android.R.layout.simple_spinner_item, list);
@ -1311,8 +1312,13 @@ public final class TaskEditActivity extends TabActivity {
during.setChecked((flags & Task.NOTIFY_AT_DEADLINE) > 0); during.setChecked((flags & Task.NOTIFY_AT_DEADLINE) > 0);
after.setChecked((flags & after.setChecked((flags &
Task.NOTIFY_AFTER_DEADLINE) > 0); Task.NOTIFY_AFTER_DEADLINE) > 0);
mode.setSelection((flags &
Task.NOTIFY_NONSTOP) > 0 ? 1 : 0); if((flags & Task.NOTIFY_MODE_NONSTOP) > 0)
mode.setSelection(2);
else if((flags & Task.NOTIFY_MODE_FIVE) > 0)
mode.setSelection(1);
else
mode.setSelection(0);
} }
public int getValue() { public int getValue() {
@ -1321,8 +1327,13 @@ public final class TaskEditActivity extends TabActivity {
value |= Task.NOTIFY_AT_DEADLINE; value |= Task.NOTIFY_AT_DEADLINE;
if(after.isChecked()) if(after.isChecked())
value |= Task.NOTIFY_AFTER_DEADLINE; value |= Task.NOTIFY_AFTER_DEADLINE;
if(mode.getSelectedItemPosition() == 1)
value |= Task.NOTIFY_NONSTOP; value &= ~(Task.NOTIFY_MODE_FIVE | Task.NOTIFY_MODE_NONSTOP);
if(mode.getSelectedItemPosition() == 2)
value |= Task.NOTIFY_MODE_NONSTOP;
else if(mode.getSelectedItemPosition() == 1)
value |= Task.NOTIFY_MODE_FIVE;
return value; return value;
} }

@ -6,6 +6,7 @@ import java.util.List;
import org.weloveastrid.rmilk.MilkUtilities; import org.weloveastrid.rmilk.MilkUtilities;
import android.Manifest; import android.Manifest;
import android.app.Activity;
import android.app.AlarmManager; import android.app.AlarmManager;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.PendingIntent; import android.app.PendingIntent;
@ -16,7 +17,9 @@ import android.content.Intent;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.media.AudioManager;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
@ -81,6 +84,13 @@ public class StartupService {
if(hasStartedUp) if(hasStartedUp)
return; return;
if(context instanceof Activity) {
AudioManager audioManager = (AudioManager)context.getSystemService(
Context.AUDIO_SERVICE);
if(audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) == 0)
Toast.makeText(context, R.string.TLA_notification_volume_low, Toast.LENGTH_LONG).show();
}
// set uncaught exception handler // set uncaught exception handler
Thread.setDefaultUncaughtExceptionHandler(new TodorooUncaughtExceptionHandler()); Thread.setDefaultUncaughtExceptionHandler(new TodorooUncaughtExceptionHandler());

Loading…
Cancel
Save