Fix occurrences of crashing by snoozing alarm from notification by parceling and unparceling Alarm in UpcomingAlarmReceiver instead of retrieving from database with long id

This commit is contained in:
Phillip Hsu 2016-09-05 00:22:58 -07:00
parent d44caf5255
commit 16a853157b
3 changed files with 46 additions and 59 deletions

View File

@ -6,16 +6,12 @@ import android.app.PendingIntent;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.AsyncTask;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import com.philliphsu.clock2.model.AlarmCursor;
import com.philliphsu.clock2.model.AlarmsTableManager;
import com.philliphsu.clock2.util.AlarmController; import com.philliphsu.clock2.util.AlarmController;
import static android.app.PendingIntent.FLAG_ONE_SHOT; import static android.app.PendingIntent.FLAG_ONE_SHOT;
import static com.philliphsu.clock2.util.DateFormatUtils.formatTime; import static com.philliphsu.clock2.util.DateFormatUtils.formatTime;
import static com.philliphsu.clock2.util.Preconditions.checkNotNull;
// TODO: Consider registering this locally instead of in the manifest. // TODO: Consider registering this locally instead of in the manifest.
public class UpcomingAlarmReceiver extends BroadcastReceiver { public class UpcomingAlarmReceiver extends BroadcastReceiver {
@ -25,29 +21,22 @@ public class UpcomingAlarmReceiver extends BroadcastReceiver {
public static final String ACTION_CANCEL_NOTIFICATION = "com.philliphsu.clock2.action.CANCEL_NOTIFICATION"; public static final String ACTION_CANCEL_NOTIFICATION = "com.philliphsu.clock2.action.CANCEL_NOTIFICATION";
public static final String ACTION_SHOW_SNOOZING = "com.philliphsu.clock2.action.SHOW_SNOOZING"; public static final String ACTION_SHOW_SNOOZING = "com.philliphsu.clock2.action.SHOW_SNOOZING";
public static final String EXTRA_ALARM_ID = "com.philliphsu.clock2.extra.ALARM_ID"; public static final String EXTRA_ALARM = "com.philliphsu.clock2.extra.ALARM";
@Override @Override
public void onReceive(final Context context, final Intent intent) { public void onReceive(final Context context, final Intent intent) {
final long id = intent.getLongExtra(EXTRA_ALARM_ID, -1); final Alarm alarm = intent.getParcelableExtra(EXTRA_ALARM);
if (id < 0) { if (alarm == null) {
throw new IllegalStateException("No alarm id received"); throw new IllegalStateException("No alarm received");
} }
final long id = alarm.getId();
final NotificationManager nm = (NotificationManager) final NotificationManager nm = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE); context.getSystemService(Context.NOTIFICATION_SERVICE);
if (ACTION_CANCEL_NOTIFICATION.equals(intent.getAction())) { if (ACTION_CANCEL_NOTIFICATION.equals(intent.getAction())) {
nm.cancel(TAG, (int) id); nm.cancel(TAG, (int) id);
} else { } else {
new AsyncTask<Void, Void, Alarm>() {
@Override
protected Alarm doInBackground(Void... params) {
AlarmCursor cursor = new AlarmsTableManager(context).queryItem(id);
return checkNotNull(cursor.getItem());
}
@Override
protected void onPostExecute(Alarm alarm) {
if (ACTION_DISMISS_NOW.equals(intent.getAction())) { if (ACTION_DISMISS_NOW.equals(intent.getAction())) {
new AlarmController(context, null).cancelAlarm(alarm, false); new AlarmController(context, null).cancelAlarm(alarm, false);
} else { } else {
@ -74,7 +63,7 @@ public class UpcomingAlarmReceiver extends BroadcastReceiver {
} }
Intent in = new Intent(context, UpcomingAlarmReceiver.class) Intent in = new Intent(context, UpcomingAlarmReceiver.class)
.putExtra(EXTRA_ALARM_ID, id) // TOneverDO: cast to int .putExtra(EXTRA_ALARM, alarm)
.setAction(ACTION_DISMISS_NOW); .setAction(ACTION_DISMISS_NOW);
PendingIntent pi = PendingIntent.getBroadcast(context, (int) id, in, FLAG_ONE_SHOT); PendingIntent pi = PendingIntent.getBroadcast(context, (int) id, in, FLAG_ONE_SHOT);
Notification note = new NotificationCompat.Builder(context) Notification note = new NotificationCompat.Builder(context)
@ -87,7 +76,5 @@ public class UpcomingAlarmReceiver extends BroadcastReceiver {
nm.notify(TAG, (int) id, note); nm.notify(TAG, (int) id, note);
} }
} }
}.execute();
}
} }
} }

View File

@ -168,7 +168,7 @@ public final class AlarmController {
public void removeUpcomingAlarmNotification(Alarm a) { public void removeUpcomingAlarmNotification(Alarm a) {
Intent intent = new Intent(mAppContext, UpcomingAlarmReceiver.class) Intent intent = new Intent(mAppContext, UpcomingAlarmReceiver.class)
.setAction(UpcomingAlarmReceiver.ACTION_CANCEL_NOTIFICATION) .setAction(UpcomingAlarmReceiver.ACTION_CANCEL_NOTIFICATION)
.putExtra(UpcomingAlarmReceiver.EXTRA_ALARM_ID, a.id()); .putExtra(UpcomingAlarmReceiver.EXTRA_ALARM, a);
mAppContext.sendBroadcast(intent); mAppContext.sendBroadcast(intent);
} }
@ -200,7 +200,7 @@ public final class AlarmController {
private PendingIntent notifyUpcomingAlarmIntent(Alarm alarm, boolean retrievePrevious) { private PendingIntent notifyUpcomingAlarmIntent(Alarm alarm, boolean retrievePrevious) {
Intent intent = new Intent(mAppContext, UpcomingAlarmReceiver.class) Intent intent = new Intent(mAppContext, UpcomingAlarmReceiver.class)
.putExtra(UpcomingAlarmReceiver.EXTRA_ALARM_ID, alarm.id()); .putExtra(UpcomingAlarmReceiver.EXTRA_ALARM, alarm);
if (alarm.isSnoozed()) { if (alarm.isSnoozed()) {
// TODO: Will this affect retrieving a previous instance? Say if the previous instance // TODO: Will this affect retrieving a previous instance? Say if the previous instance
// didn't have this action set initially, but at a later time we made a new instance // didn't have this action set initially, but at a later time we made a new instance

View File

@ -152,7 +152,7 @@ public final class AlarmUtils {
public static void removeUpcomingAlarmNotification(Context c, Alarm a) { public static void removeUpcomingAlarmNotification(Context c, Alarm a) {
Intent intent = new Intent(c, UpcomingAlarmReceiver.class) Intent intent = new Intent(c, UpcomingAlarmReceiver.class)
.setAction(UpcomingAlarmReceiver.ACTION_CANCEL_NOTIFICATION) .setAction(UpcomingAlarmReceiver.ACTION_CANCEL_NOTIFICATION)
.putExtra(UpcomingAlarmReceiver.EXTRA_ALARM_ID, a.id()); .putExtra(UpcomingAlarmReceiver.EXTRA_ALARM, a);
c.sendBroadcast(intent); c.sendBroadcast(intent);
} }
@ -196,7 +196,7 @@ public final class AlarmUtils {
private static PendingIntent notifyUpcomingAlarmIntent(Context context, Alarm alarm, boolean retrievePrevious) { private static PendingIntent notifyUpcomingAlarmIntent(Context context, Alarm alarm, boolean retrievePrevious) {
Intent intent = new Intent(context, UpcomingAlarmReceiver.class) Intent intent = new Intent(context, UpcomingAlarmReceiver.class)
.putExtra(UpcomingAlarmReceiver.EXTRA_ALARM_ID, alarm.id()); .putExtra(UpcomingAlarmReceiver.EXTRA_ALARM, alarm);
if (alarm.isSnoozed()) { if (alarm.isSnoozed()) {
// TODO: Will this affect retrieving a previous instance? Say if the previous instance // TODO: Will this affect retrieving a previous instance? Say if the previous instance
// didn't have this action set initially, but at a later time we made a new instance // didn't have this action set initially, but at a later time we made a new instance