OSDN Git Service

Cleanup the preference code for editing an alarm.
authorPatrick Scott <phanna@android.com>
Thu, 30 Apr 2009 12:23:05 +0000 (08:23 -0400)
committerPatrick Scott <phanna@android.com>
Mon, 4 May 2009 13:51:52 +0000 (09:51 -0400)
Add a save and cancel bar at the bottom similar to the contacts application.
Rather than updating the alarm in the database for every change in the settings,
the user must hit 'save' to save the changes.

Update AlarmPreference and RepeatPreference to manage their own summary instead
of having callbacks. When saving the alarm, retrieve all the values from the
preference widgets.

Make each preference non-persistent to avoid saving them to the shared
preferences.

In order to get the save/cancel buttons flush on the bottom, I have to undo
what the PreferenceActivity does in onCreate. I then build my own LinearLayout
to hold the ListView and the two buttons.

20 files changed:
res/layout/save_cancel_alarm.xml [new file with mode: 0644]
res/values-cs/strings.xml
res/values-de/strings.xml
res/values-es-rUS/strings.xml
res/values-es/strings.xml
res/values-fr/strings.xml
res/values-it/strings.xml
res/values-ja/strings.xml
res/values-ko/strings.xml
res/values-nb/strings.xml
res/values-nl/strings.xml
res/values-pl/strings.xml
res/values-ru/strings.xml
res/values-zh-rCN/strings.xml
res/values-zh-rTW/strings.xml
res/values/strings.xml
res/xml/alarm_prefs.xml
src/com/android/alarmclock/AlarmPreference.java
src/com/android/alarmclock/RepeatPreference.java
src/com/android/alarmclock/SetAlarm.java

diff --git a/res/layout/save_cancel_alarm.xml b/res/layout/save_cancel_alarm.xml
new file mode 100644 (file)
index 0000000..73e9f84
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal"
+    style="@android:style/ButtonBar">
+
+    <Button android:id="@+id/alarm_save"
+        android:focusable="true"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_weight="1"
+        android:text="@string/done"/>
+
+    <Button android:id="@+id/alarm_cancel"
+        android:focusable="true"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_weight="1"
+        android:text="@string/revert"/>
+
+</LinearLayout>
index 55108c1..5e68d4a 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"Štítek"</string>
     <string name="default_label">"Upozornění"</string>
     <string name="set_alarm">"Nastavit budík"</string>
-    <string name="enable">"Zapnout budík"</string>
     <string name="alarm_vibrate">"Vibrace"</string>
     <string name="alarm_repeat">"Opakovat"</string>
     <string name="alert">"Vyzváněcí tón"</string>
index 9749484..5d7a504 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"Label"</string>
     <string name="default_label">"Wecker"</string>
     <string name="set_alarm">"Wecker einstellen"</string>
-    <string name="enable">"Wecker aktivieren"</string>
     <string name="alarm_vibrate">"Vibrieren"</string>
     <string name="alarm_repeat">"Wiederholen"</string>
     <string name="alert">"Klingelton"</string>
index 9fec10b..ed43531 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"Etiqueta"</string>
     <string name="default_label">"Alarma"</string>
     <string name="set_alarm">"Fijar alarma"</string>
-    <string name="enable">"Activar la alarma"</string>
     <string name="alarm_vibrate">"Vibrar"</string>
     <string name="alarm_repeat">"Repetir"</string>
     <string name="alert">"Timbre"</string>
index f6843a0..d6019de 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"Etiqueta"</string>
     <string name="default_label">"Alarma"</string>
     <string name="set_alarm">"Establecer alarma"</string>
-    <string name="enable">"Activar alarma"</string>
     <string name="alarm_vibrate">"Vibración"</string>
     <string name="alarm_repeat">"Repetir"</string>
     <string name="alert">"Tono"</string>
index 0977be9..edaf759 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"Libellé"</string>
     <string name="default_label">"Alarme"</string>
     <string name="set_alarm">"Régler l\'alarme"</string>
-    <string name="enable">"Activer l\'alarme"</string>
     <string name="alarm_vibrate">"Vibreur"</string>
     <string name="alarm_repeat">"Répéter"</string>
     <string name="alert">"Sonnerie"</string>
index b098dca..705e50f 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"Etichetta"</string>
     <string name="default_label">"Allarme"</string>
     <string name="set_alarm">"Imposta allarme"</string>
-    <string name="enable">"Attiva allarme"</string>
     <string name="alarm_vibrate">"Vibrazione"</string>
     <string name="alarm_repeat">"Ripeti"</string>
     <string name="alert">"Suoneria"</string>
index 9f11e6b..3e4bb7c 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"ラベル"</string>
     <string name="default_label">"アラーム"</string>
     <string name="set_alarm">"アラームを設定"</string>
-    <string name="enable">"アラームをONにする"</string>
     <string name="alarm_vibrate">"バイブレーション"</string>
     <string name="alarm_repeat">"繰り返し"</string>
     <string name="alert">"アラーム音"</string>
index a59b17a..3161d01 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"라벨"</string>
     <string name="default_label">"알람"</string>
     <string name="set_alarm">"알람 설정"</string>
-    <string name="enable">"알람 켜기"</string>
     <string name="alarm_vibrate">"진동"</string>
     <string name="alarm_repeat">"반복"</string>
     <string name="alert">"벨소리"</string>
index 7fe268d..594c4d6 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"Etikett"</string>
     <string name="default_label">"Alarm"</string>
     <string name="set_alarm">"Sett alarm"</string>
-    <string name="enable">"Slå på alarm"</string>
     <string name="alarm_vibrate">"Vibrer"</string>
     <string name="alarm_repeat">"Gjenta"</string>
     <string name="alert">"Ringetone"</string>
index 4c30802..a6475a9 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"Label"</string>
     <string name="default_label">"Alarm"</string>
     <string name="set_alarm">"Alarm instellen"</string>
-    <string name="enable">"Alarm inschakelen"</string>
     <string name="alarm_vibrate">"Trillen"</string>
     <string name="alarm_repeat">"Herhalen"</string>
     <string name="alert">"Beltoon"</string>
index 4b702d8..dc30b14 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"Etykieta"</string>
     <string name="default_label">"Alarm"</string>
     <string name="set_alarm">"Ustaw alarm"</string>
-    <string name="enable">"Włącz alarm"</string>
     <string name="alarm_vibrate">"Wibracje"</string>
     <string name="alarm_repeat">"Powtarzanie"</string>
     <string name="alert">"Dzwonek"</string>
index 027188d..46a378a 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"Ярлык"</string>
     <string name="default_label">"Будильник"</string>
     <string name="set_alarm">"Установить будильник"</string>
-    <string name="enable">"Включить будильник"</string>
     <string name="alarm_vibrate">"Вибрация"</string>
     <string name="alarm_repeat">"Повтор"</string>
     <string name="alert">"Мелодия звонка"</string>
index 9dd169c..9944ee4 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"标签"</string>
     <string name="default_label">"警报"</string>
     <string name="set_alarm">"设置闹钟"</string>
-    <string name="enable">"开启闹钟"</string>
     <string name="alarm_vibrate">"振动"</string>
     <string name="alarm_repeat">"重复"</string>
     <string name="alert">"铃声"</string>
index 89eba47..2e852bc 100644 (file)
@@ -24,7 +24,6 @@
     <string name="label">"標籤"</string>
     <string name="default_label">"鬧鐘"</string>
     <string name="set_alarm">"設定鬧鐘"</string>
-    <string name="enable">"開啟鬧鐘"</string>
     <string name="alarm_vibrate">"震動"</string>
     <string name="alarm_repeat">"重複"</string>
     <string name="alert">"鈴聲"</string>
index 15a8a87..d300090 100644 (file)
@@ -49,9 +49,6 @@
     <!-- Preference category on Alarm Settings screen: Set alarm -->
     <string name="set_alarm">Set alarm</string>
 
-    <!-- Setting labels on Set alarm screen: Enable alarm -->
-    <string name="enable">Turn on alarm</string>
-
     <!-- Setting labels on Set alarm screen: Vibration on or off -->
     <string name="alarm_vibrate">Vibrate</string>
 
       <item>30</item>
     </string-array>
 
+    <!-- Done button when editing an alarm. -->
+    <string name="done">Done</string>
 
+    <!-- Revert button when editing an alarm. -->
+    <string name="revert">Revert</string>
 </resources>
 
 
index 627bd79..3183c97 100644 (file)
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
         android:title="@string/set_alarm">
-    <CheckBoxPreference android:key="on" 
-        android:title="@string/enable"/>
     <Preference android:key="time" 
+        android:persistent="false"
         android:title="@string/time"/>
     <com.android.alarmclock.AlarmPreference
         android:key="alarm" 
         android:title="@string/alert"
         android:ringtoneType="alarm"
+        android:persistent="false"
         android:showDefault="false"
         android:showSilent="false" />
     <CheckBoxPreference android:key="vibrate" 
+        android:persistent="false"
         android:title="@string/alarm_vibrate"/>
     <com.android.alarmclock.RepeatPreference
+        android:persistent="false"
         android:key="setRepeat" 
         android:title="@string/alarm_repeat" />
     <EditTextPreference android:key="label"
+        android:persistent="false"
         android:title="@string/label"
         android:dialogTitle="@string/label" />
 </PreferenceScreen>
index 0fd4f89..f6a7bb0 100644 (file)
 package com.android.alarmclock;
 
 import android.content.Context;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
 import android.net.Uri;
 import android.preference.RingtonePreference;
 import android.util.AttributeSet;
 
+/**
+ * The RingtonePreference does not have a way to get/set the current ringtone so
+ * we override onSaveRingtone and onRestoreRingtone to get the same behavior.
+ */
 public class AlarmPreference extends RingtonePreference {
-    public Uri mAlert;
-    private IRingtoneChangedListener mRingtoneChangedListener;
-
-    public interface IRingtoneChangedListener {
-        public void onRingtoneChanged(Uri ringtoneUri);
-    };
+    private Uri mAlert;
 
     public AlarmPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
-    public void setRingtoneChangedListener(IRingtoneChangedListener listener) {
-        mRingtoneChangedListener = listener;
-    }
-
     @Override
     protected void onSaveRingtone(Uri ringtoneUri) {
-        if (ringtoneUri != null) {
-            mAlert = ringtoneUri;
-            if (mRingtoneChangedListener != null) {
-                mRingtoneChangedListener.onRingtoneChanged(ringtoneUri);
-            }
-        }
+        setAlert(ringtoneUri);
     }
 
     @Override
     protected Uri onRestoreRingtone() {
         return mAlert;
     }
+
+    public void setAlert(Uri alert) {
+        if (alert != null) {
+            mAlert = alert;
+            final Ringtone r = RingtoneManager.getRingtone(getContext(), alert);
+            if (r != null) {
+                setSummary(r.getTitle(getContext()));
+            }
+        }
+    }
+
+    public String getAlertString() {
+        if (mAlert != null) {
+            return mAlert.toString();
+        }
+        return null;
+    }
 }
index ba33faa..7111ec6 100644 (file)
@@ -27,16 +27,11 @@ import java.util.Calendar;
 
 public class RepeatPreference extends ListPreference {
 
+    // Initial value that can be set with the values saved in the database.
     private Alarms.DaysOfWeek mDaysOfWeek = new Alarms.DaysOfWeek();
-    private OnRepeatChangedObserver mOnRepeatChangedObserver;
-
-    public interface OnRepeatChangedObserver {
-        /** RepeatPrefrence calls this to get initial state */
-        public Alarms.DaysOfWeek getDaysOfWeek();
-
-        /** Called when this preference has changed */
-        public void onRepeatChanged(Alarms.DaysOfWeek daysOfWeek);
-    }
+    // New value that will be set if a positive result comes back from the
+    // dialog.
+    private Alarms.DaysOfWeek mNewDaysOfWeek = new Alarms.DaysOfWeek();
 
     public RepeatPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -55,17 +50,11 @@ public class RepeatPreference extends ListPreference {
         setEntryValues(values);
     }
 
-    void setOnRepeatChangedObserver(OnRepeatChangedObserver onRepeatChangedObserver) {
-        mOnRepeatChangedObserver = onRepeatChangedObserver;
-    }
-
     @Override
     protected void onDialogClosed(boolean positiveResult) {
         if (positiveResult) {
-            mOnRepeatChangedObserver.onRepeatChanged(mDaysOfWeek);
-        } else {
-            /* no change -- reset to initial state */
-            mDaysOfWeek.set(mOnRepeatChangedObserver.getDaysOfWeek());
+            mDaysOfWeek.set(mNewDaysOfWeek);
+            setSummary(mDaysOfWeek.toString(getContext(), true));
         }
     }
 
@@ -74,19 +63,23 @@ public class RepeatPreference extends ListPreference {
         CharSequence[] entries = getEntries();
         CharSequence[] entryValues = getEntryValues();
 
-        if (entries == null || entryValues == null) {
-            throw new IllegalStateException(
-                    "RepeatPreference requires an entries array and an entryValues array.");
-        }
-
-        mDaysOfWeek.set(mOnRepeatChangedObserver.getDaysOfWeek());
-
         builder.setMultiChoiceItems(
                 entries, mDaysOfWeek.getBooleanArray(),
                 new DialogInterface.OnMultiChoiceClickListener() {
-                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
-                        mDaysOfWeek.set(which, isChecked);
+                    public void onClick(DialogInterface dialog, int which,
+                            boolean isChecked) {
+                        mNewDaysOfWeek.set(which, isChecked);
                     }
                 });
     }
+
+    public void setDaysOfWeek(Alarms.DaysOfWeek dow) {
+        mDaysOfWeek.set(dow);
+        mNewDaysOfWeek.set(dow);
+        setSummary(dow.toString(getContext(), true));
+    }
+
+    public Alarms.DaysOfWeek getDaysOfWeek() {
+        return mDaysOfWeek;
+    }
 }
index 12f9e15..5df4cf5 100644 (file)
 
 package com.android.alarmclock;
 
-import android.app.Activity;
-import android.app.Dialog;
 import android.app.TimePickerDialog;
 import android.content.Context;
 import android.content.Intent;
-import android.database.ContentObserver;
-import android.media.Ringtone;
 import android.media.RingtoneManager;
 import android.net.Uri;
 import android.os.Bundle;
-import android.os.Handler;
 import android.preference.CheckBoxPreference;
 import android.preference.EditTextPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
 import android.text.format.DateFormat;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.Button;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.ListView;
 import android.widget.TimePicker;
 import android.widget.Toast;
 
@@ -45,52 +47,19 @@ public class SetAlarm extends PreferenceActivity
         implements Alarms.AlarmSettings, TimePickerDialog.OnTimeSetListener {
 
     private EditTextPreference mLabel;
-    private CheckBoxPreference mAlarmOnPref;
     private Preference mTimePref;
     private AlarmPreference mAlarmPref;
     private CheckBoxPreference mVibratePref;
     private RepeatPreference mRepeatPref;
-    private ContentObserver mAlarmsChangeObserver;
     private MenuItem mDeleteAlarmItem;
     private MenuItem mTestAlarmItem;
 
     private int mId;
     private int mHour;
     private int mMinutes;
-    private Alarms.DaysOfWeek mDaysOfWeek = new Alarms.DaysOfWeek();
 
     private boolean mReportAlarmCalled;
 
-    private static final int DIALOG_TIMEPICKER = 0;
-
-    private class RingtoneChangedListener implements AlarmPreference.IRingtoneChangedListener {
-        public void onRingtoneChanged(Uri ringtoneUri) {
-            saveAlarm(false);
-        }
-    }
-
-    private class OnRepeatChangedObserver implements RepeatPreference.OnRepeatChangedObserver {
-        public void onRepeatChanged(Alarms.DaysOfWeek daysOfWeek) {
-            if (!mDaysOfWeek.equals(daysOfWeek)) {
-                mDaysOfWeek.set(daysOfWeek);
-                saveAlarm(true);
-            }
-        }
-        public Alarms.DaysOfWeek getDaysOfWeek() {
-            return mDaysOfWeek;
-        }
-    }
-
-    private class AlarmsChangeObserver extends ContentObserver {
-        public AlarmsChangeObserver() {
-            super(new Handler());
-        }
-        @Override
-        public void onChange(boolean selfChange) {
-            Alarms.getAlarm(getContentResolver(), SetAlarm.this, mId);
-        }
-    }
-
     /**
      * Set an alarm.  Requires an Alarms.ID to be passed in as an
      * extra
@@ -100,17 +69,18 @@ public class SetAlarm extends PreferenceActivity
         super.onCreate(icicle);
 
         addPreferencesFromResource(R.xml.alarm_prefs);
+
+        // Get each preference so we can retrieve the value later.
         mLabel = (EditTextPreference) findPreference("label");
         mLabel.setOnPreferenceChangeListener(
                 new Preference.OnPreferenceChangeListener() {
                     public boolean onPreferenceChange(Preference p,
                             Object newValue) {
+                        // Set the summary based on the new label.
                         p.setSummary((String) newValue);
-                        saveAlarm(false, (String) newValue);
                         return true;
                     }
                 });
-        mAlarmOnPref = (CheckBoxPreference)findPreference("on");
         mTimePref = findPreference("time");
         mAlarmPref = (AlarmPreference) findPreference("alarm");
         mVibratePref = (CheckBoxPreference) findPreference("vibrate");
@@ -118,7 +88,9 @@ public class SetAlarm extends PreferenceActivity
 
         Intent i = getIntent();
         mId = i.getIntExtra(Alarms.ID, -1);
-        if (Log.LOGV) Log.v("In SetAlarm, alarm id = " + mId);
+        if (Log.LOGV) {
+            Log.v("In SetAlarm, alarm id = " + mId);
+        }
 
         mReportAlarmCalled = false;
         /* load alarm details from database */
@@ -131,62 +103,60 @@ public class SetAlarm extends PreferenceActivity
             finish();
         }
 
-        mAlarmsChangeObserver = new AlarmsChangeObserver();
-        getContentResolver().registerContentObserver(
-                Alarms.AlarmColumns.CONTENT_URI, true, mAlarmsChangeObserver);
-
-        mAlarmPref.setRingtoneChangedListener(new RingtoneChangedListener());
-        mRepeatPref.setOnRepeatChangedObserver(new OnRepeatChangedObserver());
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-        getContentResolver().unregisterContentObserver(mAlarmsChangeObserver);
-    }
-
-    @Override
-    protected Dialog onCreateDialog(int id) {
-        Dialog d;
-
-        switch (id) {
-        case DIALOG_TIMEPICKER:
-            d = new TimePickerDialog(
-                    SetAlarm.this,
-                    this,
-                    0,
-                    0,
-                    DateFormat.is24HourFormat(SetAlarm.this));
-            d.setTitle(getResources().getString(R.string.time));
-            break;
-        default:
-            d = null;
-        }
-
-        return d;
+        // We have to do this to get the save/cancel buttons to highlight on
+        // their own.
+        getListView().setItemsCanFocus(true);
+
+        // Grab the content view so we can modify it.
+        FrameLayout content = (FrameLayout) getWindow().getDecorView()
+                .findViewById(com.android.internal.R.id.content);
+
+        // Get the main ListView and remove it from the content view.
+        ListView lv = getListView();
+        content.removeView(lv);
+
+        // Create the new LinearLayout that will become the content view and
+        // make it vertical.
+        LinearLayout ll = new LinearLayout(this);
+        ll.setOrientation(LinearLayout.VERTICAL);
+
+        // Have the ListView expand to fill the screen minus the save/cancel
+        // buttons.
+        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
+                LayoutParams.FILL_PARENT,
+                LayoutParams.WRAP_CONTENT);
+        lp.weight = 1;
+        ll.addView(lv, lp);
+
+        // Inflate the buttons onto the LinearLayout.
+        View v = LayoutInflater.from(this).inflate(
+                R.layout.save_cancel_alarm, ll);
+
+        // Attach actions to each button.
+        Button b = (Button) v.findViewById(R.id.alarm_save);
+        b.setOnClickListener(new View.OnClickListener() {
+                public void onClick(View v) {
+                    saveAlarm();
+                    finish();
+                }
+        });
+        b = (Button) v.findViewById(R.id.alarm_cancel);
+        b.setOnClickListener(new View.OnClickListener() {
+                public void onClick(View v) {
+                    finish();
+                }
+        });
+
+        // Replace the old content view with our new one.
+        setContentView(ll);
     }
 
     @Override
-    protected void onPrepareDialog(int id, Dialog dialog) {
-        super.onPrepareDialog(id, dialog);
-
-        switch (id) {
-        case DIALOG_TIMEPICKER:
-            TimePickerDialog timePicker = (TimePickerDialog)dialog;
-            timePicker.updateTime(mHour, mMinutes);
-            break;
-        }
-    }
-
-    @Override
-    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+            Preference preference) {
         if (preference == mTimePref) {
-            showDialog(DIALOG_TIMEPICKER);
-        } else if (preference == mAlarmOnPref) {
-            saveAlarm(true);
-        } else if (preference == mVibratePref) {
-            saveAlarm(false);
+            new TimePickerDialog(this, this, mHour, mMinutes,
+                    DateFormat.is24HourFormat(this)).show();
         }
 
         return super.onPreferenceTreeClick(preferenceScreen, preference);
@@ -195,8 +165,7 @@ public class SetAlarm extends PreferenceActivity
     public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
         mHour = hourOfDay;
         mMinutes = minute;
-        mAlarmOnPref.setChecked(true);
-        saveAlarm(true);
+        updateTime();
     }
 
     /**
@@ -212,65 +181,48 @@ public class SetAlarm extends PreferenceActivity
         mLabel.setSummary(label);
         mHour = hour;
         mMinutes = minutes;
-        mAlarmOnPref.setChecked(enabled);
-        mDaysOfWeek.set(daysOfWeek);
+        mRepeatPref.setDaysOfWeek(daysOfWeek);
         mVibratePref.setChecked(vibrate);
 
-        if (alert == null || alert.length() == 0) {
-            if (Log.LOGV) Log.v("****** reportAlarm null or 0-length alert");
-            mAlarmPref.mAlert =
-                    RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
-            if (mAlarmPref.mAlert == null) {
-                Log.e("****** Default Alarm null");
-            }
-        } else {
-            mAlarmPref.mAlert = Uri.parse(alert);
-            if (mAlarmPref.mAlert == null) {
-                Log.e("****** Parsed null alarm. URI: " + alert);
-            }
+        Uri alertUri = null;
+        if (alert != null && alert.length() != 0) {
+            alertUri = Uri.parse(alert);
+        }
+
+        // If the database alert is null or it failed to parse, use the default
+        // alert.
+        if (alertUri == null) {
+            alertUri = RingtoneManager.getDefaultUri(
+                    RingtoneManager.TYPE_ALARM);
+        }
+
+        if (Log.LOGV) {
+            Log.v("reportAlarm alert: " + alert + " uri: " + alertUri);
         }
-        if (Log.LOGV) Log.v("****** reportAlarm uri " + alert + " alert " +
-                            mAlarmPref.mAlert);
+
+        // Give the alert uri to the preference.
+        mAlarmPref.setAlert(alertUri);
+
         updateTime();
-        updateRepeat();
-        updateAlarm(mAlarmPref.mAlert);
 
         mReportAlarmCalled = true;
     }
 
     private void updateTime() {
-        if (Log.LOGV) Log.v("updateTime " + mId);
-        mTimePref.setSummary(Alarms.formatTime(this, mHour, mMinutes, mDaysOfWeek));
-    }
-
-    private void updateAlarm(Uri ringtoneUri) {
-        if (Log.LOGV) Log.v("updateAlarm " + mId);
-        Ringtone ringtone = RingtoneManager.getRingtone(SetAlarm.this, ringtoneUri);
-        if (ringtone != null) {
-            mAlarmPref.setSummary(ringtone.getTitle(SetAlarm.this));
+        if (Log.LOGV) {
+            Log.v("updateTime " + mId);
         }
+        mTimePref.setSummary(Alarms.formatTime(this, mHour, mMinutes,
+                mRepeatPref.getDaysOfWeek()));
     }
 
-    private void updateRepeat() {
-        if (Log.LOGV) Log.v("updateRepeat " + mId);
-        mRepeatPref.setSummary(mDaysOfWeek.toString(this, true));
-    }
-
-    private void saveAlarm(boolean popToast) {
-        saveAlarm(popToast, mLabel.getText());
-    }
+    private void saveAlarm() {
+        final String alert = mAlarmPref.getAlertString();
+        Alarms.setAlarm(this, mId, true, mHour, mMinutes,
+                mRepeatPref.getDaysOfWeek(), mVibratePref.isChecked(),
+                mLabel.getText(), alert);
 
-    /**
-     * This version of saveAlarm uses the passed in label since mLabel may
-     * contain the old value (i.e. during the preference value change).
-     */
-    private void saveAlarm(boolean popToast, String label) {
-        if (mReportAlarmCalled && mAlarmPref.mAlert != null) {
-            String alertString = mAlarmPref.mAlert.toString();
-            saveAlarm(this, mId, mAlarmOnPref.isChecked(), mHour, mMinutes,
-                      mDaysOfWeek, mVibratePref.isChecked(), label, alertString,
-                      popToast);
-        }
+        popAlarmSetToast(this, mHour, mMinutes, mRepeatPref.getDaysOfWeek());
     }
 
     /**
@@ -368,7 +320,6 @@ public class SetAlarm extends PreferenceActivity
             mTestAlarmItem = menu.add(0, 0, 0, "test alarm");
         }
 
-
         return true;
     }
 
@@ -403,10 +354,10 @@ public class SetAlarm extends PreferenceActivity
         int nowMinute = c.get(java.util.Calendar.MINUTE);
 
         int minutes = (nowMinute + 1) % 60;
-        int hour = nowHour + (nowMinute == 0? 1 : 0);
+        int hour = nowHour + (nowMinute == 0 ? 1 : 0);
 
-        saveAlarm(this, mId, true, hour, minutes, mDaysOfWeek, true,
-                mLabel.getText(), mAlarmPref.mAlert.toString(), true);
+        saveAlarm(this, mId, true, hour, minutes, mRepeatPref.getDaysOfWeek(),
+                true, mLabel.getText(), mAlarmPref.getAlertString(), true);
     }
 
 }