SetAlarm.java revision 7495b0046811971ecb0933888d7eafb4c9668ed2
15fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project/*
25fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
35fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *
45fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
55fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * you may not use this file except in compliance with the License.
65fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * You may obtain a copy of the License at
75fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *
85fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
95fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project *
105fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
115fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
125fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * See the License for the specific language governing permissions and
145fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * limitations under the License.
155fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project */
165fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
175fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectpackage com.android.alarmclock;
185fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
195fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.app.TimePickerDialog;
205fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.content.Context;
215fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.content.Intent;
225fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.media.RingtoneManager;
235fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.net.Uri;
245fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.os.Bundle;
25185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Projectimport android.preference.CheckBoxPreference;
26185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Projectimport android.preference.EditTextPreference;
275fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.preference.Preference;
285fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.preference.PreferenceActivity;
295fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.preference.PreferenceScreen;
305fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.text.format.DateFormat;
31b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scottimport android.view.LayoutInflater;
325fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.view.Menu;
335fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.view.MenuItem;
34b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scottimport android.view.View;
35b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scottimport android.view.ViewGroup.LayoutParams;
36b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scottimport android.widget.Button;
37b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scottimport android.widget.FrameLayout;
38b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scottimport android.widget.LinearLayout;
39b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scottimport android.widget.ListView;
405fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.widget.TimePicker;
415fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectimport android.widget.Toast;
425fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
435fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project/**
445fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project * Manages each alarm
455fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project */
465fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Projectpublic class SetAlarm extends PreferenceActivity
47d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        implements TimePickerDialog.OnTimeSetListener {
485fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
49185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project    private EditTextPreference mLabel;
505fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private Preference mTimePref;
515fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private AlarmPreference mAlarmPref;
525fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private CheckBoxPreference mVibratePref;
535fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private RepeatPreference mRepeatPref;
545fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private MenuItem mDeleteAlarmItem;
555fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private MenuItem mTestAlarmItem;
565fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
577495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott    private int     mId;
587495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott    private boolean mEnabled;
597495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott    private int     mHour;
607495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott    private int     mMinutes;
615fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
625fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    /**
63d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott     * Set an alarm.  Requires an Alarms.ALARM_ID to be passed in as an
64d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott     * extra. FIXME: Pass an Alarm object like every other Activity.
655fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     */
665fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    @Override
675fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    protected void onCreate(Bundle icicle) {
685fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        super.onCreate(icicle);
695fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
705fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        addPreferencesFromResource(R.xml.alarm_prefs);
71b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott
72b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // Get each preference so we can retrieve the value later.
73185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project        mLabel = (EditTextPreference) findPreference("label");
74185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project        mLabel.setOnPreferenceChangeListener(
75185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project                new Preference.OnPreferenceChangeListener() {
76185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project                    public boolean onPreferenceChange(Preference p,
77185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project                            Object newValue) {
78b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                        // Set the summary based on the new label.
79185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project                        p.setSummary((String) newValue);
80185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project                        return true;
81185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project                    }
82185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project                });
835fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        mTimePref = findPreference("time");
845fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        mAlarmPref = (AlarmPreference) findPreference("alarm");
855fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        mVibratePref = (CheckBoxPreference) findPreference("vibrate");
865fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        mRepeatPref = (RepeatPreference) findPreference("setRepeat");
875fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
885fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        Intent i = getIntent();
89d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        mId = i.getIntExtra(Alarms.ALARM_ID, -1);
90b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        if (Log.LOGV) {
91b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott            Log.v("In SetAlarm, alarm id = " + mId);
92b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        }
935fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
945fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        /* load alarm details from database */
95d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        Alarm alarm = Alarms.getAlarm(getContentResolver(), mId);
967495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott        mEnabled = alarm.enabled;
97d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        mLabel.setText(alarm.label);
98d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        mLabel.setSummary(alarm.label);
99d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        mHour = alarm.hour;
100d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        mMinutes = alarm.minutes;
101d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        mRepeatPref.setDaysOfWeek(alarm.daysOfWeek);
102d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        mVibratePref.setChecked(alarm.vibrate);
103d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        // Give the alert uri to the preference.
104d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        mAlarmPref.setAlert(alarm.alert);
105d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott        updateTime();
1065fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
107b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // We have to do this to get the save/cancel buttons to highlight on
108b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // their own.
109b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        getListView().setItemsCanFocus(true);
110b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott
111b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // Grab the content view so we can modify it.
112b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        FrameLayout content = (FrameLayout) getWindow().getDecorView()
113b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                .findViewById(com.android.internal.R.id.content);
114b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott
115b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // Get the main ListView and remove it from the content view.
116b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        ListView lv = getListView();
117b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        content.removeView(lv);
118b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott
119b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // Create the new LinearLayout that will become the content view and
120b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // make it vertical.
121b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        LinearLayout ll = new LinearLayout(this);
122b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        ll.setOrientation(LinearLayout.VERTICAL);
123b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott
124b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // Have the ListView expand to fill the screen minus the save/cancel
125b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // buttons.
126b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
127b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                LayoutParams.FILL_PARENT,
128b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                LayoutParams.WRAP_CONTENT);
129b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        lp.weight = 1;
130b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        ll.addView(lv, lp);
131b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott
132b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // Inflate the buttons onto the LinearLayout.
133b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        View v = LayoutInflater.from(this).inflate(
134b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                R.layout.save_cancel_alarm, ll);
135b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott
136b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // Attach actions to each button.
137b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        Button b = (Button) v.findViewById(R.id.alarm_save);
138b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        b.setOnClickListener(new View.OnClickListener() {
139b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                public void onClick(View v) {
140b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                    saveAlarm();
141b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                    finish();
142b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                }
143b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        });
144b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        b = (Button) v.findViewById(R.id.alarm_cancel);
145b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        b.setOnClickListener(new View.OnClickListener() {
146b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                public void onClick(View v) {
147b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                    finish();
148b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                }
149b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        });
150b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott
151b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        // Replace the old content view with our new one.
152b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        setContentView(ll);
1535fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
1545fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
1555fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    @Override
156b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
157b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott            Preference preference) {
1585fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        if (preference == mTimePref) {
159b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott            new TimePickerDialog(this, this, mHour, mMinutes,
160b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                    DateFormat.is24HourFormat(this)).show();
1615fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
1625fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
1635fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        return super.onPreferenceTreeClick(preferenceScreen, preference);
1645fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
1655fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
1667495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott    @Override
1677495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott    public void onBackPressed() {
1687495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott        saveAlarm();
1697495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott        finish();
1707495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott    }
1717495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott
1725fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
1735fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        mHour = hourOfDay;
1745fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        mMinutes = minute;
175b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        updateTime();
1767495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott        // If the time has been changed, enable the alarm.
1777495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott        mEnabled = true;
1785fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
1795fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
1805fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private void updateTime() {
181b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        if (Log.LOGV) {
182b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott            Log.v("updateTime " + mId);
1835fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
184b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        mTimePref.setSummary(Alarms.formatTime(this, mHour, mMinutes,
185b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                mRepeatPref.getDaysOfWeek()));
1865fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
1875fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
188b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott    private void saveAlarm() {
189b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        final String alert = mAlarmPref.getAlertString();
1907495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott        Alarms.setAlarm(this, mId, mEnabled, mHour, mMinutes,
191b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                mRepeatPref.getDaysOfWeek(), mVibratePref.isChecked(),
192b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                mLabel.getText(), alert);
193185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project
1947495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott        if (mEnabled) {
1957495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott            popAlarmSetToast(this, mHour, mMinutes,
1967495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott                    mRepeatPref.getDaysOfWeek());
1977495b0046811971ecb0933888d7eafb4c9668ed2Patrick Scott        }
1985fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
1995fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2005fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    /**
2015fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     * Write alarm out to persistent store and pops toast if alarm
2025fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     * enabled
2035fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     */
2045fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    private static void saveAlarm(
2055fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            Context context, int id, boolean enabled, int hour, int minute,
206d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott            Alarm.DaysOfWeek daysOfWeek, boolean vibrate, String label,
207185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project            String alert, boolean popToast) {
208185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project        if (Log.LOGV) Log.v("** saveAlarm " + id + " " + label + " " + enabled
209185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project                + " " + hour + " " + minute + " vibe " + vibrate);
2105fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2115fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        // Fix alert string first
2125fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        Alarms.setAlarm(context, id, enabled, hour, minute, daysOfWeek, vibrate,
213185d17974729a98cf48a71ab9f16adaab9d1e1e0The Android Open Source Project                label, alert);
2145fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2155fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        if (enabled && popToast) {
2165fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            popAlarmSetToast(context, hour, minute, daysOfWeek);
2175fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
2185fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
2195fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2205fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    /**
2215fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     * Display a toast that tells the user how long until the alarm
2225fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     * goes off.  This helps prevent "am/pm" mistakes.
2235fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     */
2245fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    static void popAlarmSetToast(Context context, int hour, int minute,
225d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott                                 Alarm.DaysOfWeek daysOfWeek) {
2265fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2275fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        String toastText = formatToast(context, hour, minute, daysOfWeek);
2285fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        Toast toast = Toast.makeText(context, toastText, Toast.LENGTH_LONG);
2295fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        ToastMaster.setToast(toast);
2305fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        toast.show();
2315fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
2325fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2335fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    /**
2345fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     * format "Alarm set for 2 days 7 hours and 53 minutes from
2355fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     * now"
2365fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     */
2375fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    static String formatToast(Context context, int hour, int minute,
238d776e51cec79901a0d656bba7b1f3780cceac57dPatrick Scott                              Alarm.DaysOfWeek daysOfWeek) {
2395fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        long alarm = Alarms.calculateAlarm(hour, minute,
2405fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                                           daysOfWeek).getTimeInMillis();
2415fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        long delta = alarm - System.currentTimeMillis();;
2425fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        long hours = delta / (1000 * 60 * 60);
2435fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        long minutes = delta / (1000 * 60) % 60;
2445fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        long days = hours / 24;
2455fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        hours = hours % 24;
2465fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2475fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        String daySeq = (days == 0) ? "" :
2485fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                (days == 1) ? context.getString(R.string.day) :
2495fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                context.getString(R.string.days, Long.toString(days));
2505fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2515fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        String minSeq = (minutes == 0) ? "" :
2525fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                (minutes == 1) ? context.getString(R.string.minute) :
2535fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                context.getString(R.string.minutes, Long.toString(minutes));
2545fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2555fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        String hourSeq = (hours == 0) ? "" :
2565fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                (hours == 1) ? context.getString(R.string.hour) :
2575fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                context.getString(R.string.hours, Long.toString(hours));
2585fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2595fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        boolean dispDays = days > 0;
2605fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        boolean dispHour = hours > 0;
2615fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        boolean dispMinute = minutes > 0;
2625fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2631bc128fd4266656ebc7e8abc6bf22652f6a6134aEric Fischer        int index = (dispDays ? 1 : 0) |
2641bc128fd4266656ebc7e8abc6bf22652f6a6134aEric Fischer                    (dispHour ? 2 : 0) |
2651bc128fd4266656ebc7e8abc6bf22652f6a6134aEric Fischer                    (dispMinute ? 4 : 0);
2665fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2671bc128fd4266656ebc7e8abc6bf22652f6a6134aEric Fischer        String[] formats = context.getResources().getStringArray(R.array.alarm_set);
2681bc128fd4266656ebc7e8abc6bf22652f6a6134aEric Fischer        return String.format(formats[index], daySeq, hourSeq, minSeq);
2695fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
2705fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2715fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    public boolean onCreateOptionsMenu(Menu menu) {
2725fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        super.onCreateOptionsMenu(menu);
2735fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2745fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        mDeleteAlarmItem = menu.add(0, 0, 0, R.string.delete_alarm);
2755fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        mDeleteAlarmItem.setIcon(android.R.drawable.ic_menu_delete);
2765fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2775fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        if (AlarmClock.DEBUG) {
2785fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            mTestAlarmItem = menu.add(0, 0, 0, "test alarm");
2795fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
2805fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2815fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        return true;
2825fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
2835fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2845fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
2855fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        if (item == mDeleteAlarmItem) {
2865fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            Alarms.deleteAlarm(this, mId);
2875fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            finish();
2885fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            return true;
2895fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
2905fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        if (AlarmClock.DEBUG) {
2915fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            if (item == mTestAlarmItem) {
2925fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                setTestAlarm();
2935fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project                return true;
2945fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project            }
2955fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        }
2965fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
2975fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        return false;
2985fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
2995fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
3005fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
3015fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    /**
3025fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     * Test code: this is disabled for production build.  Sets
3035fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     * this alarm to go off on the next minute
3045fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project     */
3055fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    void setTestAlarm() {
3065fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
3075fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        // start with now
3085fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        java.util.Calendar c = java.util.Calendar.getInstance();
3095fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        c.setTimeInMillis(System.currentTimeMillis());
3105fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
3115fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        int nowHour = c.get(java.util.Calendar.HOUR_OF_DAY);
3125fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        int nowMinute = c.get(java.util.Calendar.MINUTE);
3135fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
3145fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project        int minutes = (nowMinute + 1) % 60;
315b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        int hour = nowHour + (nowMinute == 0 ? 1 : 0);
3165fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
317b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott        saveAlarm(this, mId, true, hour, minutes, mRepeatPref.getDaysOfWeek(),
318b83db52b375a9a28347cacff3a8e8b1ebabe3b46Patrick Scott                true, mLabel.getText(), mAlarmPref.getAlertString(), true);
3195fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project    }
3205fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project
3215fedae0fb8cc29db88719329d52bdd62aad14277The Android Open Source Project}
322