Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eddf7797 authored by Paul Sliwowski's avatar Paul Sliwowski
Browse files

Fix a few alarm state manager issues.

- Prevent missed notification from starting app.
- Fix alarmId issues on notifications.
- Fix issue with missed alarms being re-enabled after timezone change.
- Fix issue with missed alarm notification not dismissing properly.
- Remove alarm noise on missed notification
- Added safe guard to prevent duplicate alarm instances.

Change-Id: Id9dd65e6ec59df1e6952c8a892022d20a09eb5a5
(cherry picked from commit 20dccf19)
parent 6da4068d
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -625,18 +625,23 @@ public class AlarmClockFragment extends DeskClockFragment implements

    private void launchRingTonePicker(Alarm alarm) {
        mSelectedAlarm = alarm;
        Uri oldRingtone = Alarm.NO_RINGTONE_URI.equals(alarm.alert) ? null : alarm.alert;
        final Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, alarm.alert);
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, oldRingtone);
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM);
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false);
        startActivityForResult(intent, REQUEST_CODE_RINGTONE);
    }

    private void saveRingtoneUri(Intent intent) {
        final Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        if (uri == null) {
            uri = Alarm.NO_RINGTONE_URI;
        }
        mSelectedAlarm.alert = uri;

        // Save the last selected ringtone as the default for new alarms
        if (uri != null) {
        if (!Alarm.NO_RINGTONE_URI.equals(uri)) {
            RingtoneManager.setActualDefaultRingtoneUri(
                    getActivity(), RingtoneManager.TYPE_ALARM, uri);
        }
@@ -1252,7 +1257,7 @@ public class AlarmClockFragment extends DeskClockFragment implements
            });

            final String ringtone;
            if (alarm.alert == null) {
            if (Alarm.NO_RINGTONE_URI.equals(alarm.alert)) {
                ringtone = mContext.getResources().getString(R.string.silent_alarm_summary);
            } else {
                ringtone = getRingToneTitle(alarm.alert);
+5 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import android.view.View.OnTouchListener;
import android.widget.PopupMenu;
import android.widget.TextView;

import com.android.deskclock.alarms.AlarmStateManager;
import com.android.deskclock.provider.Alarm;
import com.android.deskclock.stopwatch.StopwatchFragment;
import com.android.deskclock.stopwatch.StopwatchService;
@@ -175,6 +176,10 @@ public class DeskClock extends Activity implements LabelDialogFragment.TimerLabe
        }
        initViews();
        setHomeTimeZone();

        // We need to update the system next alarm time on app startup because the
        // user might have clear our data.
        AlarmStateManager.updateNextAlarm(this);
    }

    @Override
+8 −12
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ public final class AlarmNotifications {

        // Setup content action if instance is owned by alarm
        long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId;
        Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, instance.mAlarmId);
        Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, alarmId);
        viewAlarmIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.ALARM_TAB_INDEX);
        viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
@@ -118,7 +118,7 @@ public final class AlarmNotifications {

        // Setup content action if instance is owned by alarm
        long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId;
        Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, instance.mAlarmId);
        Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, alarmId);
        viewAlarmIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.ALARM_TAB_INDEX);
        viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
@@ -175,9 +175,7 @@ public final class AlarmNotifications {
                .setContentTitle(context.getString(R.string.alarm_missed_title))
                .setContentText(contextText)
                .setSmallIcon(R.drawable.stat_notify_alarm)
                .setAutoCancel(true)
                .setPriority(Notification.PRIORITY_HIGH)
                .setDefaults(Notification.DEFAULT_ALL);
                .setPriority(Notification.PRIORITY_HIGH);

        // Setup dismiss intent
        Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context, "DISMISS_TAG",
@@ -186,13 +184,11 @@ public final class AlarmNotifications {
                dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));

        // Setup content intent
        long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId;
        Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, alarmId);
        viewAlarmIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.ALARM_TAB_INDEX);
        viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(viewAlarmIntent);
        notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
                viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
        Intent showAndDismiss = AlarmInstance.createIntent(context, AlarmStateManager.class,
                instance.mId);
        showAndDismiss.setAction(AlarmStateManager.SHOW_AND_DISMISS_ALARM_ACTION);
        notification.setContentIntent(PendingIntent.getBroadcast(context, instance.hashCode(),
                showAndDismiss, PendingIntent.FLAG_UPDATE_CURRENT));

        nm.cancel(instance.hashCode());
        nm.notify(instance.hashCode(), notification.build());
+24 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.preference.PreferenceManager;
import com.android.deskclock.AlarmAlertWakeLock;
import com.android.deskclock.AlarmUtils;
import com.android.deskclock.AsyncHandler;
import com.android.deskclock.DeskClock;
import com.android.deskclock.Log;
import com.android.deskclock.SettingsActivity;
import com.android.deskclock.Utils;
@@ -44,6 +45,9 @@ public final class AlarmStateManager extends BroadcastReceiver {
    // Intent action to trigger an instance state change.
    public static final String CHANGE_STATE_ACTION = "change_state";

    // Intent action to show the alarm and dismiss the instance
    public static final String SHOW_AND_DISMISS_ALARM_ACTION = "show_and_dismiss_alarm";

    // Extra key to set the desired state change.
    public static final String ALARM_STATE_EXTRA = "intent.extra.alarm.state";

@@ -416,6 +420,15 @@ public final class AlarmStateManager extends BroadcastReceiver {
        if (currentTime.after(missedTTL)) {
            // Alarm is so old, don't even show missed alarm
            setDismissState(context, instance);
        } else if (instance.mAlarmState == AlarmInstance.MISSED_STATE) {
            // Don't allow MISSED alarms to re-activate
            if (currentTime.before(alarmTime)) {
                // Get rid of the missed notification if the alarm time would be in
                // the future due to timezone changes
                setDismissState(context, instance);
            } else {
                setMissedState(context, instance);
            }
        } else if (currentTime.after(alarmTime)) {
            if (currentTime.before(timeoutTime)) {
                setFiredState(context, instance);
@@ -536,6 +549,17 @@ public final class AlarmStateManager extends BroadcastReceiver {
            } else {
                registerInstance(context, instance, true);
            }
        } else if (SHOW_AND_DISMISS_ALARM_ACTION.equals(action)) {
            Uri uri = intent.getData();
            AlarmInstance instance = AlarmInstance.getInstance(context.getContentResolver(),
                    AlarmInstance.getId(uri));

            long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId;
            Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, alarmId);
            viewAlarmIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.ALARM_TAB_INDEX);
            viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(viewAlarmIntent);
            setDismissState(context, instance);
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
        values.put(HOUR, alarm.hour);
        values.put(MINUTES, alarm.minutes);
        values.put(DAYS_OF_WEEK, alarm.daysOfWeek.getBitSet());
        values.put(VIBRATE, alarm.vibrate);
        values.put(VIBRATE, alarm.vibrate ? 1 : 0);
        values.put(LABEL, alarm.label);
        values.put(DELETE_AFTER_USE, alarm.deleteAfterUse);
        if (alarm.alert == null) {
Loading