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

Commit 1c604c48 authored by Alon Albert's avatar Alon Albert
Browse files

Enhance SetAlarm API

Add DAYS, VIBRATE, ALERT
Implement implicit deleteAfterUse

Change-Id: Ibe58394020987469aca4a7895ac591407e64ce5e
parent 58f5304c
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -261,14 +261,20 @@ public class AlarmAlertFullScreen extends Activity implements GlowPadView.OnTrig
            Log.v("AlarmAlertFullScreen - dismiss");
        }

        Log.i("Alarm id=" + mAlarm.id + (killed ? (replaced ? " replaced" : " killed") : " dismissed by user"));
        final long id = mAlarm.id;
        Log.i("Alarm id=" + id
                + (killed ? (replaced ? " replaced" : " killed") : " dismissed by user"));
        // The service told us that the alarm has been killed, do not modify
        // the notification or stop the service.
        if (!killed) {
            // Cancel the notification and stop playing the alarm
            NotificationManager nm = getNotificationManager();
            nm.cancel((int)mAlarm.id);
            nm.cancel((int) id);
            stopService(new Intent(Alarms.ALARM_ALERT_ACTION));
            if (mAlarm.deleteAfterUse) {
                Alarms.deleteAlarm(this, id);
                Log.i("Deleted alarm " + id);
            }
        }
        if (!replaced) {
            finish();
+85 −23
Original line number Diff line number Diff line
@@ -18,18 +18,20 @@ package com.android.deskclock;

import static android.provider.AlarmClock.ACTION_SET_ALARM;
import static android.provider.AlarmClock.ACTION_SET_TIMER;
import static android.provider.AlarmClock.EXTRA_DAYS;
import static android.provider.AlarmClock.EXTRA_HOUR;
import static android.provider.AlarmClock.EXTRA_LENGTH;
import static android.provider.AlarmClock.EXTRA_MESSAGE;
import static android.provider.AlarmClock.EXTRA_MINUTES;
import static android.provider.AlarmClock.EXTRA_RINGTONE;
import static android.provider.AlarmClock.EXTRA_SKIP_UI;
import static android.provider.AlarmClock.EXTRA_VIBRATE;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
@@ -72,9 +74,18 @@ public class HandleApiCalls extends Activity {
     * @param intent
     */
    private void handleSetAlarm(Intent intent) {
        // If not provided or invalid, show UI
        final int hour = intent.getIntExtra(EXTRA_HOUR, -1);

        // Intent has no time , open the alarm creation UI
        if (!intent.hasExtra(EXTRA_HOUR)) {
        // If not provided, use zero. If it is provided, make sure it's valid, otherwise, show UI
        final int minutes;
        if (intent.hasExtra(EXTRA_MINUTES)) {
            minutes = intent.getIntExtra(EXTRA_MINUTES, -1);
        } else {
            minutes = 0;
        }
        if (hour < 0 || hour > 23 || minutes < 0 || minutes > 59) {
            // Intent has no time or an invalid time, open the alarm creation UI
            Intent createAlarm = new Intent(this, DeskClock.class);
            createAlarm.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            createAlarm.putExtra(Alarms.ALARM_CREATE_NEW, true);
@@ -85,24 +96,17 @@ public class HandleApiCalls extends Activity {
            return;
        }

        final Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        final int hour = intent.getIntExtra(EXTRA_HOUR, calendar.get(Calendar.HOUR_OF_DAY));
        final int minutes = intent.getIntExtra(EXTRA_MINUTES, calendar.get(Calendar.MINUTE));
        final boolean skipUi = intent.getBooleanExtra(EXTRA_SKIP_UI, false);
        String message = intent.getStringExtra(EXTRA_MESSAGE);
        if (message == null) {
            message = "";
        }

        final StringBuilder selection = new StringBuilder();
        final List<String> args = new ArrayList<String>();
        setSelectionFromIntent(intent, hour, minutes, selection, args);

        // Check if the alarm already exists and handle it
        ContentResolver cr = getContentResolver();
        List<Alarm> alarms = Alarm.getAlarms(cr,
                Alarm.HOUR + "=" + hour + " AND " +
                Alarm.MINUTES + "=" + minutes + " AND " +
                Alarm.DAYS_OF_WEEK + "=" + DaysOfWeek.NO_DAYS_SET + " AND " +
                Alarm.MESSAGE + "=?",
                new String[] { message });
        final ContentResolver cr = getContentResolver();
        final List<Alarm> alarms = Alarm.getAlarms(cr,
                selection.toString(),
                args.toArray(new String[args.size()]));
        if (!alarms.isEmpty()) {
            enableAlarm(alarms.get(0), true, skipUi);
            finish();
@@ -110,9 +114,18 @@ public class HandleApiCalls extends Activity {
        }

        // Otherwise insert it and handle it
        final String message = getMessageFromIntent(intent);
        final DaysOfWeek daysOfWeek = getDaysFromIntent(intent);
        final boolean vibrate = intent.getBooleanExtra(EXTRA_VIBRATE, false);
        final String alert = intent.getStringExtra(EXTRA_RINGTONE);

        Alarm alarm = new Alarm(hour, minutes);
        alarm.enabled = true;
        alarm.label = message;
        alarm.daysOfWeek = daysOfWeek;
        alarm.vibrate = vibrate;
        alarm.setAlert(alert);
        alarm.deleteAfterUse = !daysOfWeek.isRepeating() && skipUi;

        Uri result = cr.insert(Alarm.CONTENT_URI, Alarm.createContentValues(alarm));
        enableAlarm(Alarm.getAlarm(cr, Alarm.getId(result)), false, skipUi);
@@ -134,10 +147,7 @@ public class HandleApiCalls extends Activity {
            Log.i("Invalid timer length requested: " + length);
            return;
        }
        String label = intent.getStringExtra(EXTRA_MESSAGE);
        if (label == null) {
            label = "";
        }
        String label = getMessageFromIntent(intent);

        TimerObj timer = null;
        // Find an existing matching time
@@ -191,4 +201,56 @@ public class HandleApiCalls extends Activity {
            startActivity(createdAlarm);
        }
    }

    private String getMessageFromIntent(Intent intent) {
        final String message = intent.getStringExtra(EXTRA_MESSAGE);
        return message == null ? "" : message;
    }

    private DaysOfWeek getDaysFromIntent(Intent intent) {
        final int[] days = intent.getIntArrayExtra(EXTRA_DAYS);
        final DaysOfWeek daysOfWeek = new DaysOfWeek(0);
        if (days != null) {
            daysOfWeek.setDaysOfWeek(true, days);
        }
        return daysOfWeek;
    }

    private void setSelectionFromIntent(
            Intent intent,
            int hour,
            int minutes,
            StringBuilder selection,
            List<String> args) {
        selection.append(Alarm.HOUR).append("=?");
        args.add(String.valueOf(hour));
        selection.append(" AND ").append(Alarm.MINUTES).append("=?");
        args.add(String.valueOf(minutes));

        if (intent.hasExtra(EXTRA_MESSAGE)) {
            selection.append(" AND ").append(Alarm.MESSAGE).append("=?");
            args.add(getMessageFromIntent(intent));
        }

        if (intent.hasExtra(EXTRA_DAYS)) {
            selection.append(" AND ").append(Alarm.DAYS_OF_WEEK).append("=?");
            args.add(String.valueOf(getDaysFromIntent(intent).getBitSet()));
        }

        if (intent.hasExtra(EXTRA_VIBRATE)) {
            selection.append(" AND ").append(Alarm.VIBRATE).append("=?");
            args.add(intent.getBooleanExtra(EXTRA_VIBRATE, false) ? "1" : "0");
        }

        if (intent.hasExtra(EXTRA_RINGTONE)) {
            String ringtone = intent.getStringExtra(EXTRA_RINGTONE);
            selection.append(" AND ").append(Alarm.ALERT).append("=?");
            if (ringtone == null) {
                // If the intent explicitly specified a NULL ringtone, treat it as the default
                // ringtone.
                ringtone = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM).toString();
            }
            args.add(ringtone);
        }
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -229,7 +229,10 @@ public final class Alarm implements Parcelable, ClockContract.AlarmsColumns {
        label = c.getString(MESSAGE_INDEX);
        deleteAfterUse = c.getInt(DELETE_AFTER_USE_INDEX) == 1;

        String alertString = c.getString(ALERT_INDEX);
        setAlert(c.getString(ALERT_INDEX));
    }

    public void setAlert(String alertString) {
        if (ALARM_ALERT_SILENT.equals(alertString)) {
            if (Log.LOGV) {
                Log.v("Alarm is marked as silent");