OSDN Git Service

merge from open-source master
authorThe Android Open Source Project <initial-contribution@android.com>
Thu, 21 Jan 2010 19:21:28 +0000 (11:21 -0800)
committerThe Android Open Source Project <initial-contribution@android.com>
Thu, 21 Jan 2010 19:21:28 +0000 (11:21 -0800)
162 files changed:
Android.mk [new file with mode: 0644]
AndroidManifest.xml [new file with mode: 0644]
MODULE_LICENSE_APACHE2 [new file with mode: 0644]
NOTICE [new file with mode: 0644]
assets/fonts/Clockopia.ttf [new file with mode: 0644]
res/anim/dim.xml [new file with mode: 0644]
res/anim/dim_instant.xml [new file with mode: 0644]
res/anim/undim.html [new file with mode: 0644]
res/anim/undim_instant.xml [new file with mode: 0644]
res/drawable-hdpi/appwidget_clock_dial.png [new file with mode: 0644]
res/drawable-hdpi/appwidget_clock_hour.png [new file with mode: 0644]
res/drawable-hdpi/appwidget_clock_minute.png [new file with mode: 0644]
res/drawable-hdpi/btn_in_call_round_disable.png [new file with mode: 0644]
res/drawable-hdpi/btn_in_call_round_disable_focused.png [new file with mode: 0644]
res/drawable-hdpi/btn_in_call_round_normal.png [new file with mode: 0644]
res/drawable-hdpi/btn_in_call_round_pressed.png [new file with mode: 0644]
res/drawable-hdpi/btn_in_call_round_selected.png [new file with mode: 0644]
res/drawable-hdpi/btn_strip_trans_left_normal.9.png [new file with mode: 0644]
res/drawable-hdpi/btn_strip_trans_left_pressed.9.png [new file with mode: 0644]
res/drawable-hdpi/btn_strip_trans_left_selected.9.png [new file with mode: 0644]
res/drawable-hdpi/btn_strip_trans_middle_normal.9.png [new file with mode: 0644]
res/drawable-hdpi/btn_strip_trans_middle_pressed.9.png [new file with mode: 0644]
res/drawable-hdpi/btn_strip_trans_middle_selected.9.png [new file with mode: 0644]
res/drawable-hdpi/btn_strip_trans_right_normal.9.png [new file with mode: 0644]
res/drawable-hdpi/btn_strip_trans_right_pressed.9.png [new file with mode: 0644]
res/drawable-hdpi/btn_strip_trans_right_selected.9.png [new file with mode: 0644]
res/drawable-hdpi/dialog.9.png [new file with mode: 0644]
res/drawable-hdpi/ic_clock_add_alarm.png [new file with mode: 0644]
res/drawable-hdpi/ic_clock_add_alarm_selected.png [new file with mode: 0644]
res/drawable-hdpi/ic_clock_alarm_off.png [new file with mode: 0644]
res/drawable-hdpi/ic_clock_alarm_on.png [new file with mode: 0644]
res/drawable-hdpi/ic_clock_alarm_selected.png [new file with mode: 0644]
res/drawable-hdpi/ic_clock_strip_alarm.png [new file with mode: 0644]
res/drawable-hdpi/ic_clock_strip_desk_clock.png [new file with mode: 0644]
res/drawable-hdpi/ic_clock_strip_gallery.png [new file with mode: 0644]
res/drawable-hdpi/ic_clock_strip_home.png [new file with mode: 0644]
res/drawable-hdpi/ic_clock_strip_music.png [new file with mode: 0644]
res/drawable-hdpi/ic_indicator_off.png [new file with mode: 0644]
res/drawable-hdpi/ic_indicator_on.png [new file with mode: 0644]
res/drawable-hdpi/ic_launcher_alarmclock.png [new file with mode: 0644]
res/drawable-hdpi/ic_lock_idle_alarm.png [new file with mode: 0644]
res/drawable-hdpi/ic_lock_idle_alarm_saver.png [new file with mode: 0644]
res/drawable-hdpi/ic_lock_idle_alarm_saver_dim.png [new file with mode: 0644]
res/drawable-hdpi/ic_menu_add.png [new file with mode: 0755]
res/drawable-hdpi/ic_menu_alarms.png [new file with mode: 0644]
res/drawable-hdpi/ic_menu_clock_face.png [new file with mode: 0644]
res/drawable-hdpi/ic_menu_desk_clock.png [new file with mode: 0644]
res/drawable-hdpi/ic_round_brightness.png [new file with mode: 0644]
res/drawable-hdpi/ic_widget_analog_clock.png [new file with mode: 0644]
res/drawable-hdpi/stat_notify_alarm.png [new file with mode: 0644]
res/drawable-mdpi/appwidget_clock_dial.png [new file with mode: 0644]
res/drawable-mdpi/appwidget_clock_hour.png [new file with mode: 0644]
res/drawable-mdpi/appwidget_clock_minute.png [new file with mode: 0644]
res/drawable-mdpi/btn_in_call_round_disable.png [new file with mode: 0644]
res/drawable-mdpi/btn_in_call_round_disable_focused.png [new file with mode: 0644]
res/drawable-mdpi/btn_in_call_round_normal.png [new file with mode: 0644]
res/drawable-mdpi/btn_in_call_round_pressed.png [new file with mode: 0644]
res/drawable-mdpi/btn_in_call_round_selected.png [new file with mode: 0644]
res/drawable-mdpi/btn_strip_trans_left_normal.9.png [new file with mode: 0644]
res/drawable-mdpi/btn_strip_trans_left_pressed.9.png [new file with mode: 0644]
res/drawable-mdpi/btn_strip_trans_left_selected.9.png [new file with mode: 0644]
res/drawable-mdpi/btn_strip_trans_middle_normal.9.png [new file with mode: 0644]
res/drawable-mdpi/btn_strip_trans_middle_pressed.9.png [new file with mode: 0644]
res/drawable-mdpi/btn_strip_trans_middle_selected.9.png [new file with mode: 0644]
res/drawable-mdpi/btn_strip_trans_right_normal.9.png [new file with mode: 0644]
res/drawable-mdpi/btn_strip_trans_right_pressed.9.png [new file with mode: 0644]
res/drawable-mdpi/btn_strip_trans_right_selected.9.png [new file with mode: 0644]
res/drawable-mdpi/dialog.9.png [new file with mode: 0644]
res/drawable-mdpi/ic_clock_add_alarm.png [new file with mode: 0644]
res/drawable-mdpi/ic_clock_add_alarm_selected.png [new file with mode: 0644]
res/drawable-mdpi/ic_clock_alarm_off.png [new file with mode: 0644]
res/drawable-mdpi/ic_clock_alarm_on.png [new file with mode: 0644]
res/drawable-mdpi/ic_clock_alarm_selected.png [new file with mode: 0644]
res/drawable-mdpi/ic_clock_strip_alarm.png [new file with mode: 0644]
res/drawable-mdpi/ic_clock_strip_desk_clock.png [new file with mode: 0644]
res/drawable-mdpi/ic_clock_strip_gallery.png [new file with mode: 0644]
res/drawable-mdpi/ic_clock_strip_home.png [new file with mode: 0644]
res/drawable-mdpi/ic_clock_strip_music.png [new file with mode: 0644]
res/drawable-mdpi/ic_indicator_off.png [new file with mode: 0644]
res/drawable-mdpi/ic_indicator_on.png [new file with mode: 0755]
res/drawable-mdpi/ic_launcher_alarmclock.png [new file with mode: 0644]
res/drawable-mdpi/ic_lock_idle_alarm.png [new file with mode: 0644]
res/drawable-mdpi/ic_lock_idle_alarm_saver.png [new file with mode: 0644]
res/drawable-mdpi/ic_lock_idle_alarm_saver_dim.png [new file with mode: 0644]
res/drawable-mdpi/ic_menu_add.png [new file with mode: 0644]
res/drawable-mdpi/ic_menu_alarms.png [new file with mode: 0644]
res/drawable-mdpi/ic_menu_clock_face.png [new file with mode: 0644]
res/drawable-mdpi/ic_menu_desk_clock.png [new file with mode: 0644]
res/drawable-mdpi/ic_round_brightness.png [new file with mode: 0644]
res/drawable-mdpi/ic_widget_analog_clock.png [new file with mode: 0644]
res/drawable-mdpi/stat_notify_alarm.png [new file with mode: 0644]
res/drawable/add_alarm.xml [new file with mode: 0644]
res/drawable/btn_strip_trans_left.xml [new file with mode: 0644]
res/drawable/btn_strip_trans_middle.xml [new file with mode: 0644]
res/drawable/btn_strip_trans_right.xml [new file with mode: 0644]
res/drawable/clock_selector.xml [new file with mode: 0644]
res/drawable/incall_round_button.xml [new file with mode: 0644]
res/drawable/indicator_bar_onoff.xml [new file with mode: 0644]
res/drawable/indicator_clock_onoff.xml [new file with mode: 0644]
res/layout-land/desk_clock.xml [new file with mode: 0644]
res/layout/alarm_alert.xml [new file with mode: 0644]
res/layout/alarm_clock.xml [new file with mode: 0644]
res/layout/alarm_time.xml [new file with mode: 0644]
res/layout/analog_appwidget.xml [new file with mode: 0644]
res/layout/context_menu_header.xml [new file with mode: 0644]
res/layout/desk_clock.xml [new file with mode: 0644]
res/layout/desk_clock_battery.xml [new file with mode: 0644]
res/layout/desk_clock_buttons.xml [new file with mode: 0644]
res/layout/desk_clock_saver.xml [new file with mode: 0644]
res/layout/desk_clock_time_date.xml [new file with mode: 0644]
res/layout/desk_clock_weather.xml [new file with mode: 0644]
res/layout/save_cancel_alarm.xml [new file with mode: 0644]
res/menu/alarm_list_menu.xml [new file with mode: 0644]
res/menu/context_menu.xml [new file with mode: 0644]
res/menu/desk_clock_menu.xml [new file with mode: 0644]
res/raw/in_call_alarm.ogg [new file with mode: 0644]
res/values-cs/strings.xml [new file with mode: 0644]
res/values-da/strings.xml [new file with mode: 0644]
res/values-de/strings.xml [new file with mode: 0644]
res/values-el/strings.xml [new file with mode: 0644]
res/values-es-rUS/strings.xml [new file with mode: 0644]
res/values-es/strings.xml [new file with mode: 0644]
res/values-fr/strings.xml [new file with mode: 0644]
res/values-it/strings.xml [new file with mode: 0644]
res/values-ja/strings.xml [new file with mode: 0644]
res/values-ko/strings.xml [new file with mode: 0644]
res/values-nb/strings.xml [new file with mode: 0644]
res/values-nl/strings.xml [new file with mode: 0644]
res/values-pl/strings.xml [new file with mode: 0644]
res/values-pt-rPT/strings.xml [new file with mode: 0644]
res/values-pt/strings.xml [new file with mode: 0644]
res/values-ru/strings.xml [new file with mode: 0644]
res/values-sv/strings.xml [new file with mode: 0644]
res/values-tr/strings.xml [new file with mode: 0644]
res/values-zh-rCN/strings.xml [new file with mode: 0644]
res/values-zh-rTW/strings.xml [new file with mode: 0644]
res/values/colors.xml [new file with mode: 0644]
res/values/strings.xml [new file with mode: 0644]
res/values/styles.xml [new file with mode: 0644]
res/xml/alarm_prefs.xml [new file with mode: 0644]
res/xml/analog_appwidget.xml [new file with mode: 0644]
res/xml/settings.xml [new file with mode: 0644]
src/com/android/deskclock/Alarm.java [new file with mode: 0644]
src/com/android/deskclock/AlarmAlert.java [new file with mode: 0644]
src/com/android/deskclock/AlarmAlertFullScreen.java [new file with mode: 0644]
src/com/android/deskclock/AlarmAlertWakeLock.java [new file with mode: 0644]
src/com/android/deskclock/AlarmClock.java [new file with mode: 0644]
src/com/android/deskclock/AlarmInitReceiver.java [new file with mode: 0644]
src/com/android/deskclock/AlarmKlaxon.java [new file with mode: 0644]
src/com/android/deskclock/AlarmPreference.java [new file with mode: 0644]
src/com/android/deskclock/AlarmProvider.java [new file with mode: 0644]
src/com/android/deskclock/AlarmReceiver.java [new file with mode: 0644]
src/com/android/deskclock/Alarms.java [new file with mode: 0644]
src/com/android/deskclock/AnalogAppWidgetProvider.java [new file with mode: 0644]
src/com/android/deskclock/DeskClock.java [new file with mode: 0644]
src/com/android/deskclock/DigitalClock.java [new file with mode: 0644]
src/com/android/deskclock/DontPressWithParentLayout.java [new file with mode: 0644]
src/com/android/deskclock/Log.java [new file with mode: 0644]
src/com/android/deskclock/RepeatPreference.java [new file with mode: 0644]
src/com/android/deskclock/SetAlarm.java [new file with mode: 0644]
src/com/android/deskclock/SettingsActivity.java [new file with mode: 0644]
src/com/android/deskclock/ToastMaster.java [new file with mode: 0644]

diff --git a/Android.mk b/Android.mk
new file mode 100644 (file)
index 0000000..cac2687
--- /dev/null
@@ -0,0 +1,10 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-subdir-java-files)
+
+LOCAL_PACKAGE_NAME := DeskClock
+
+LOCAL_OVERRIDES_PACKAGES := AlarmClock
+
+include $(BUILD_PACKAGE)
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
new file mode 100644 (file)
index 0000000..293d0fe
--- /dev/null
@@ -0,0 +1,113 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+        package="com.android.deskclock">
+
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+    <uses-permission android:name="android.permission.WAKE_LOCK"/>
+    <uses-permission android:name="android.permission.VIBRATE"/>
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+
+    <application android:label="@string/app_label"
+                 android:icon="@drawable/ic_launcher_alarmclock">
+
+        <provider android:name="AlarmProvider" android:authorities="com.android.deskclock" />
+
+        <activity android:name="DeskClock"
+                android:label="@string/app_label"
+                android:theme="@android:style/Theme.Wallpaper.NoTitleBar"
+                android:icon="@drawable/ic_widget_analog_clock"
+                android:launchMode="singleInstance"
+                android:configChanges="orientation|keyboardHidden|keyboard|navigation">
+                >
+
+            <!-- while docked, this is our home application -->
+            <meta-data android:name="android.dock_home" android:value="true" />
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.LAUNCHER" />
+                <category android:name="android.intent.category.DESK_DOCK" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="AlarmClock"
+                android:label="@string/alarm_list_title"
+                android:taskAffinity=""
+                android:excludeFromRecents="true"
+                android:configChanges="orientation|keyboardHidden|keyboard|navigation"
+                >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="SettingsActivity"
+                android:label="@string/settings"
+                android:taskAffinity=""
+                android:excludeFromRecents="true"
+                >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+            </intent-filter>
+        </activity>
+
+        <activity android:name="SetAlarm" android:label="@string/set_alarm"
+                android:configChanges="orientation|keyboardHidden|keyboard|navigation" />
+
+        <activity android:name="AlarmAlert"
+                android:excludeFromRecents="true"
+                android:theme="@style/alarm_alert"
+                android:launchMode="singleInstance"
+                android:taskAffinity=""
+                android:configChanges="orientation|keyboardHidden|keyboard|navigation"/>
+
+        <!-- This activity is basically the same as AlarmAlert but with a more
+             generic theme. It also shows as full screen (with status bar) but
+             with the wallpaper background. -->
+        <activity android:name="AlarmAlertFullScreen"
+                android:excludeFromRecents="true"
+                android:theme="@android:style/Theme.Wallpaper.NoTitleBar"
+                android:launchMode="singleInstance"
+                android:taskAffinity=""
+                android:configChanges="orientation|keyboardHidden|keyboard|navigation"/>
+
+        <receiver android:name="AlarmReceiver">
+            <intent-filter>
+               <action android:name="com.android.deskclock.ALARM_ALERT" />
+               <action android:name="alarm_killed" />
+               <action android:name="cancel_snooze" />
+            </intent-filter>
+        </receiver>
+
+        <!-- This service receives the same intent as AlarmReceiver but it does
+             not respond to the same broadcast. The AlarmReceiver will receive
+             the alert broadcast and will start this service with the same
+             intent. The service plays the alarm alert and vibrates the device.
+             This allows the alert to continue playing even if another activity
+             causes the AlarmAlert activity to pause. -->
+        <service android:name="AlarmKlaxon">
+            <intent-filter>
+                <action android:name="com.android.deskclock.ALARM_ALERT" />
+            </intent-filter>
+        </service>
+
+        <receiver android:name="AlarmInitReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.BOOT_COMPLETED" />
+                <action android:name="android.intent.action.TIME_SET" />
+                <action android:name="android.intent.action.TIMEZONE_CHANGED" />
+            </intent-filter>
+        </receiver>
+
+        <receiver android:name="AnalogAppWidgetProvider" android:label="@string/analog_gadget"
+               android:icon="@drawable/ic_widget_analog_clock">
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+            </intent-filter>
+            <meta-data android:name="android.appwidget.provider" android:resource="@xml/analog_appwidget" />
+        </receiver>
+    </application>
+</manifest>
+
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/NOTICE b/NOTICE
new file mode 100644 (file)
index 0000000..c5b1efa
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,190 @@
+
+   Copyright (c) 2005-2008, 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.
+
+   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.
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
diff --git a/assets/fonts/Clockopia.ttf b/assets/fonts/Clockopia.ttf
new file mode 100644 (file)
index 0000000..123ea4f
Binary files /dev/null and b/assets/fonts/Clockopia.ttf differ
diff --git a/res/anim/dim.xml b/res/anim/dim.xml
new file mode 100644 (file)
index 0000000..72529c9
--- /dev/null
@@ -0,0 +1,7 @@
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:fromAlpha="0.0"
+    android:toAlpha="1.0"
+    android:duration="500"
+    android:fillAfter="true"
+    android:interpolator="@android:anim/decelerate_interpolator"
+    />
diff --git a/res/anim/dim_instant.xml b/res/anim/dim_instant.xml
new file mode 100644 (file)
index 0000000..bd7fe40
--- /dev/null
@@ -0,0 +1,6 @@
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:fromAlpha="0.0"
+    android:toAlpha="1.0"
+    android:duration="0"
+    android:fillAfter="true"
+    />
diff --git a/res/anim/undim.html b/res/anim/undim.html
new file mode 100644 (file)
index 0000000..d0ba9ad
--- /dev/null
@@ -0,0 +1,7 @@
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:fromAlpha="1.0"
+    android:toAlpha="0.0"
+    android:duration="500"
+    android:fillAfter="true"
+    android:interpolator="@android:anim/decelerate_interpolator"
+    />
diff --git a/res/anim/undim_instant.xml b/res/anim/undim_instant.xml
new file mode 100644 (file)
index 0000000..ce20f1e
--- /dev/null
@@ -0,0 +1,6 @@
+<alpha xmlns:android="http://schemas.android.com/apk/res/android"
+    android:fromAlpha="1.0"
+    android:toAlpha="0.0"
+    android:duration="0"
+    android:fillAfter="true"
+    />
diff --git a/res/drawable-hdpi/appwidget_clock_dial.png b/res/drawable-hdpi/appwidget_clock_dial.png
new file mode 100644 (file)
index 0000000..eb50eb6
Binary files /dev/null and b/res/drawable-hdpi/appwidget_clock_dial.png differ
diff --git a/res/drawable-hdpi/appwidget_clock_hour.png b/res/drawable-hdpi/appwidget_clock_hour.png
new file mode 100644 (file)
index 0000000..d357e8c
Binary files /dev/null and b/res/drawable-hdpi/appwidget_clock_hour.png differ
diff --git a/res/drawable-hdpi/appwidget_clock_minute.png b/res/drawable-hdpi/appwidget_clock_minute.png
new file mode 100644 (file)
index 0000000..dd67580
Binary files /dev/null and b/res/drawable-hdpi/appwidget_clock_minute.png differ
diff --git a/res/drawable-hdpi/btn_in_call_round_disable.png b/res/drawable-hdpi/btn_in_call_round_disable.png
new file mode 100644 (file)
index 0000000..0591d51
Binary files /dev/null and b/res/drawable-hdpi/btn_in_call_round_disable.png differ
diff --git a/res/drawable-hdpi/btn_in_call_round_disable_focused.png b/res/drawable-hdpi/btn_in_call_round_disable_focused.png
new file mode 100644 (file)
index 0000000..1b870ac
Binary files /dev/null and b/res/drawable-hdpi/btn_in_call_round_disable_focused.png differ
diff --git a/res/drawable-hdpi/btn_in_call_round_normal.png b/res/drawable-hdpi/btn_in_call_round_normal.png
new file mode 100644 (file)
index 0000000..9182f3f
Binary files /dev/null and b/res/drawable-hdpi/btn_in_call_round_normal.png differ
diff --git a/res/drawable-hdpi/btn_in_call_round_pressed.png b/res/drawable-hdpi/btn_in_call_round_pressed.png
new file mode 100644 (file)
index 0000000..7d47a84
Binary files /dev/null and b/res/drawable-hdpi/btn_in_call_round_pressed.png differ
diff --git a/res/drawable-hdpi/btn_in_call_round_selected.png b/res/drawable-hdpi/btn_in_call_round_selected.png
new file mode 100644 (file)
index 0000000..1f6846a
Binary files /dev/null and b/res/drawable-hdpi/btn_in_call_round_selected.png differ
diff --git a/res/drawable-hdpi/btn_strip_trans_left_normal.9.png b/res/drawable-hdpi/btn_strip_trans_left_normal.9.png
new file mode 100644 (file)
index 0000000..31b3970
Binary files /dev/null and b/res/drawable-hdpi/btn_strip_trans_left_normal.9.png differ
diff --git a/res/drawable-hdpi/btn_strip_trans_left_pressed.9.png b/res/drawable-hdpi/btn_strip_trans_left_pressed.9.png
new file mode 100644 (file)
index 0000000..3b13559
Binary files /dev/null and b/res/drawable-hdpi/btn_strip_trans_left_pressed.9.png differ
diff --git a/res/drawable-hdpi/btn_strip_trans_left_selected.9.png b/res/drawable-hdpi/btn_strip_trans_left_selected.9.png
new file mode 100644 (file)
index 0000000..0607d23
Binary files /dev/null and b/res/drawable-hdpi/btn_strip_trans_left_selected.9.png differ
diff --git a/res/drawable-hdpi/btn_strip_trans_middle_normal.9.png b/res/drawable-hdpi/btn_strip_trans_middle_normal.9.png
new file mode 100644 (file)
index 0000000..d9f4f84
Binary files /dev/null and b/res/drawable-hdpi/btn_strip_trans_middle_normal.9.png differ
diff --git a/res/drawable-hdpi/btn_strip_trans_middle_pressed.9.png b/res/drawable-hdpi/btn_strip_trans_middle_pressed.9.png
new file mode 100644 (file)
index 0000000..3cc35e7
Binary files /dev/null and b/res/drawable-hdpi/btn_strip_trans_middle_pressed.9.png differ
diff --git a/res/drawable-hdpi/btn_strip_trans_middle_selected.9.png b/res/drawable-hdpi/btn_strip_trans_middle_selected.9.png
new file mode 100644 (file)
index 0000000..736e9b2
Binary files /dev/null and b/res/drawable-hdpi/btn_strip_trans_middle_selected.9.png differ
diff --git a/res/drawable-hdpi/btn_strip_trans_right_normal.9.png b/res/drawable-hdpi/btn_strip_trans_right_normal.9.png
new file mode 100644 (file)
index 0000000..3e83fd4
Binary files /dev/null and b/res/drawable-hdpi/btn_strip_trans_right_normal.9.png differ
diff --git a/res/drawable-hdpi/btn_strip_trans_right_pressed.9.png b/res/drawable-hdpi/btn_strip_trans_right_pressed.9.png
new file mode 100644 (file)
index 0000000..1076681
Binary files /dev/null and b/res/drawable-hdpi/btn_strip_trans_right_pressed.9.png differ
diff --git a/res/drawable-hdpi/btn_strip_trans_right_selected.9.png b/res/drawable-hdpi/btn_strip_trans_right_selected.9.png
new file mode 100644 (file)
index 0000000..b0cf219
Binary files /dev/null and b/res/drawable-hdpi/btn_strip_trans_right_selected.9.png differ
diff --git a/res/drawable-hdpi/dialog.9.png b/res/drawable-hdpi/dialog.9.png
new file mode 100644 (file)
index 0000000..16ca7e6
Binary files /dev/null and b/res/drawable-hdpi/dialog.9.png differ
diff --git a/res/drawable-hdpi/ic_clock_add_alarm.png b/res/drawable-hdpi/ic_clock_add_alarm.png
new file mode 100644 (file)
index 0000000..f7cc82d
Binary files /dev/null and b/res/drawable-hdpi/ic_clock_add_alarm.png differ
diff --git a/res/drawable-hdpi/ic_clock_add_alarm_selected.png b/res/drawable-hdpi/ic_clock_add_alarm_selected.png
new file mode 100644 (file)
index 0000000..55cd344
Binary files /dev/null and b/res/drawable-hdpi/ic_clock_add_alarm_selected.png differ
diff --git a/res/drawable-hdpi/ic_clock_alarm_off.png b/res/drawable-hdpi/ic_clock_alarm_off.png
new file mode 100644 (file)
index 0000000..76c19e5
Binary files /dev/null and b/res/drawable-hdpi/ic_clock_alarm_off.png differ
diff --git a/res/drawable-hdpi/ic_clock_alarm_on.png b/res/drawable-hdpi/ic_clock_alarm_on.png
new file mode 100644 (file)
index 0000000..8304d61
Binary files /dev/null and b/res/drawable-hdpi/ic_clock_alarm_on.png differ
diff --git a/res/drawable-hdpi/ic_clock_alarm_selected.png b/res/drawable-hdpi/ic_clock_alarm_selected.png
new file mode 100644 (file)
index 0000000..ddcaea1
Binary files /dev/null and b/res/drawable-hdpi/ic_clock_alarm_selected.png differ
diff --git a/res/drawable-hdpi/ic_clock_strip_alarm.png b/res/drawable-hdpi/ic_clock_strip_alarm.png
new file mode 100644 (file)
index 0000000..0d2f558
Binary files /dev/null and b/res/drawable-hdpi/ic_clock_strip_alarm.png differ
diff --git a/res/drawable-hdpi/ic_clock_strip_desk_clock.png b/res/drawable-hdpi/ic_clock_strip_desk_clock.png
new file mode 100644 (file)
index 0000000..ddc2d31
Binary files /dev/null and b/res/drawable-hdpi/ic_clock_strip_desk_clock.png differ
diff --git a/res/drawable-hdpi/ic_clock_strip_gallery.png b/res/drawable-hdpi/ic_clock_strip_gallery.png
new file mode 100644 (file)
index 0000000..10d137c
Binary files /dev/null and b/res/drawable-hdpi/ic_clock_strip_gallery.png differ
diff --git a/res/drawable-hdpi/ic_clock_strip_home.png b/res/drawable-hdpi/ic_clock_strip_home.png
new file mode 100644 (file)
index 0000000..b7d1b42
Binary files /dev/null and b/res/drawable-hdpi/ic_clock_strip_home.png differ
diff --git a/res/drawable-hdpi/ic_clock_strip_music.png b/res/drawable-hdpi/ic_clock_strip_music.png
new file mode 100644 (file)
index 0000000..c9ee2d4
Binary files /dev/null and b/res/drawable-hdpi/ic_clock_strip_music.png differ
diff --git a/res/drawable-hdpi/ic_indicator_off.png b/res/drawable-hdpi/ic_indicator_off.png
new file mode 100644 (file)
index 0000000..1ca71d9
Binary files /dev/null and b/res/drawable-hdpi/ic_indicator_off.png differ
diff --git a/res/drawable-hdpi/ic_indicator_on.png b/res/drawable-hdpi/ic_indicator_on.png
new file mode 100644 (file)
index 0000000..5a99970
Binary files /dev/null and b/res/drawable-hdpi/ic_indicator_on.png differ
diff --git a/res/drawable-hdpi/ic_launcher_alarmclock.png b/res/drawable-hdpi/ic_launcher_alarmclock.png
new file mode 100644 (file)
index 0000000..147d2cc
Binary files /dev/null and b/res/drawable-hdpi/ic_launcher_alarmclock.png differ
diff --git a/res/drawable-hdpi/ic_lock_idle_alarm.png b/res/drawable-hdpi/ic_lock_idle_alarm.png
new file mode 100644 (file)
index 0000000..6b4f66d
Binary files /dev/null and b/res/drawable-hdpi/ic_lock_idle_alarm.png differ
diff --git a/res/drawable-hdpi/ic_lock_idle_alarm_saver.png b/res/drawable-hdpi/ic_lock_idle_alarm_saver.png
new file mode 100644 (file)
index 0000000..fbc98d8
Binary files /dev/null and b/res/drawable-hdpi/ic_lock_idle_alarm_saver.png differ
diff --git a/res/drawable-hdpi/ic_lock_idle_alarm_saver_dim.png b/res/drawable-hdpi/ic_lock_idle_alarm_saver_dim.png
new file mode 100644 (file)
index 0000000..51a9ca7
Binary files /dev/null and b/res/drawable-hdpi/ic_lock_idle_alarm_saver_dim.png differ
diff --git a/res/drawable-hdpi/ic_menu_add.png b/res/drawable-hdpi/ic_menu_add.png
new file mode 100755 (executable)
index 0000000..65cc01e
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_add.png differ
diff --git a/res/drawable-hdpi/ic_menu_alarms.png b/res/drawable-hdpi/ic_menu_alarms.png
new file mode 100644 (file)
index 0000000..db27521
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_alarms.png differ
diff --git a/res/drawable-hdpi/ic_menu_clock_face.png b/res/drawable-hdpi/ic_menu_clock_face.png
new file mode 100644 (file)
index 0000000..b6e7d1b
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_clock_face.png differ
diff --git a/res/drawable-hdpi/ic_menu_desk_clock.png b/res/drawable-hdpi/ic_menu_desk_clock.png
new file mode 100644 (file)
index 0000000..e4d8ecc
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_desk_clock.png differ
diff --git a/res/drawable-hdpi/ic_round_brightness.png b/res/drawable-hdpi/ic_round_brightness.png
new file mode 100644 (file)
index 0000000..2efa332
Binary files /dev/null and b/res/drawable-hdpi/ic_round_brightness.png differ
diff --git a/res/drawable-hdpi/ic_widget_analog_clock.png b/res/drawable-hdpi/ic_widget_analog_clock.png
new file mode 100644 (file)
index 0000000..147d2cc
Binary files /dev/null and b/res/drawable-hdpi/ic_widget_analog_clock.png differ
diff --git a/res/drawable-hdpi/stat_notify_alarm.png b/res/drawable-hdpi/stat_notify_alarm.png
new file mode 100644 (file)
index 0000000..64f583f
Binary files /dev/null and b/res/drawable-hdpi/stat_notify_alarm.png differ
diff --git a/res/drawable-mdpi/appwidget_clock_dial.png b/res/drawable-mdpi/appwidget_clock_dial.png
new file mode 100644 (file)
index 0000000..69e8ca8
Binary files /dev/null and b/res/drawable-mdpi/appwidget_clock_dial.png differ
diff --git a/res/drawable-mdpi/appwidget_clock_hour.png b/res/drawable-mdpi/appwidget_clock_hour.png
new file mode 100644 (file)
index 0000000..6086823
Binary files /dev/null and b/res/drawable-mdpi/appwidget_clock_hour.png differ
diff --git a/res/drawable-mdpi/appwidget_clock_minute.png b/res/drawable-mdpi/appwidget_clock_minute.png
new file mode 100644 (file)
index 0000000..8ec61bc
Binary files /dev/null and b/res/drawable-mdpi/appwidget_clock_minute.png differ
diff --git a/res/drawable-mdpi/btn_in_call_round_disable.png b/res/drawable-mdpi/btn_in_call_round_disable.png
new file mode 100644 (file)
index 0000000..3598375
Binary files /dev/null and b/res/drawable-mdpi/btn_in_call_round_disable.png differ
diff --git a/res/drawable-mdpi/btn_in_call_round_disable_focused.png b/res/drawable-mdpi/btn_in_call_round_disable_focused.png
new file mode 100644 (file)
index 0000000..8680a23
Binary files /dev/null and b/res/drawable-mdpi/btn_in_call_round_disable_focused.png differ
diff --git a/res/drawable-mdpi/btn_in_call_round_normal.png b/res/drawable-mdpi/btn_in_call_round_normal.png
new file mode 100644 (file)
index 0000000..d7524f6
Binary files /dev/null and b/res/drawable-mdpi/btn_in_call_round_normal.png differ
diff --git a/res/drawable-mdpi/btn_in_call_round_pressed.png b/res/drawable-mdpi/btn_in_call_round_pressed.png
new file mode 100644 (file)
index 0000000..c3dd47d
Binary files /dev/null and b/res/drawable-mdpi/btn_in_call_round_pressed.png differ
diff --git a/res/drawable-mdpi/btn_in_call_round_selected.png b/res/drawable-mdpi/btn_in_call_round_selected.png
new file mode 100644 (file)
index 0000000..79b5516
Binary files /dev/null and b/res/drawable-mdpi/btn_in_call_round_selected.png differ
diff --git a/res/drawable-mdpi/btn_strip_trans_left_normal.9.png b/res/drawable-mdpi/btn_strip_trans_left_normal.9.png
new file mode 100644 (file)
index 0000000..2d7db2b
Binary files /dev/null and b/res/drawable-mdpi/btn_strip_trans_left_normal.9.png differ
diff --git a/res/drawable-mdpi/btn_strip_trans_left_pressed.9.png b/res/drawable-mdpi/btn_strip_trans_left_pressed.9.png
new file mode 100644 (file)
index 0000000..ceddd76
Binary files /dev/null and b/res/drawable-mdpi/btn_strip_trans_left_pressed.9.png differ
diff --git a/res/drawable-mdpi/btn_strip_trans_left_selected.9.png b/res/drawable-mdpi/btn_strip_trans_left_selected.9.png
new file mode 100644 (file)
index 0000000..bc40887
Binary files /dev/null and b/res/drawable-mdpi/btn_strip_trans_left_selected.9.png differ
diff --git a/res/drawable-mdpi/btn_strip_trans_middle_normal.9.png b/res/drawable-mdpi/btn_strip_trans_middle_normal.9.png
new file mode 100644 (file)
index 0000000..77ee4be
Binary files /dev/null and b/res/drawable-mdpi/btn_strip_trans_middle_normal.9.png differ
diff --git a/res/drawable-mdpi/btn_strip_trans_middle_pressed.9.png b/res/drawable-mdpi/btn_strip_trans_middle_pressed.9.png
new file mode 100644 (file)
index 0000000..19b33af
Binary files /dev/null and b/res/drawable-mdpi/btn_strip_trans_middle_pressed.9.png differ
diff --git a/res/drawable-mdpi/btn_strip_trans_middle_selected.9.png b/res/drawable-mdpi/btn_strip_trans_middle_selected.9.png
new file mode 100644 (file)
index 0000000..33ca95c
Binary files /dev/null and b/res/drawable-mdpi/btn_strip_trans_middle_selected.9.png differ
diff --git a/res/drawable-mdpi/btn_strip_trans_right_normal.9.png b/res/drawable-mdpi/btn_strip_trans_right_normal.9.png
new file mode 100644 (file)
index 0000000..2de79b5
Binary files /dev/null and b/res/drawable-mdpi/btn_strip_trans_right_normal.9.png differ
diff --git a/res/drawable-mdpi/btn_strip_trans_right_pressed.9.png b/res/drawable-mdpi/btn_strip_trans_right_pressed.9.png
new file mode 100644 (file)
index 0000000..41d2650
Binary files /dev/null and b/res/drawable-mdpi/btn_strip_trans_right_pressed.9.png differ
diff --git a/res/drawable-mdpi/btn_strip_trans_right_selected.9.png b/res/drawable-mdpi/btn_strip_trans_right_selected.9.png
new file mode 100644 (file)
index 0000000..a65e65f
Binary files /dev/null and b/res/drawable-mdpi/btn_strip_trans_right_selected.9.png differ
diff --git a/res/drawable-mdpi/dialog.9.png b/res/drawable-mdpi/dialog.9.png
new file mode 100644 (file)
index 0000000..2305be4
Binary files /dev/null and b/res/drawable-mdpi/dialog.9.png differ
diff --git a/res/drawable-mdpi/ic_clock_add_alarm.png b/res/drawable-mdpi/ic_clock_add_alarm.png
new file mode 100644 (file)
index 0000000..c49358e
Binary files /dev/null and b/res/drawable-mdpi/ic_clock_add_alarm.png differ
diff --git a/res/drawable-mdpi/ic_clock_add_alarm_selected.png b/res/drawable-mdpi/ic_clock_add_alarm_selected.png
new file mode 100644 (file)
index 0000000..c4817c4
Binary files /dev/null and b/res/drawable-mdpi/ic_clock_add_alarm_selected.png differ
diff --git a/res/drawable-mdpi/ic_clock_alarm_off.png b/res/drawable-mdpi/ic_clock_alarm_off.png
new file mode 100644 (file)
index 0000000..742c074
Binary files /dev/null and b/res/drawable-mdpi/ic_clock_alarm_off.png differ
diff --git a/res/drawable-mdpi/ic_clock_alarm_on.png b/res/drawable-mdpi/ic_clock_alarm_on.png
new file mode 100644 (file)
index 0000000..f81d9f6
Binary files /dev/null and b/res/drawable-mdpi/ic_clock_alarm_on.png differ
diff --git a/res/drawable-mdpi/ic_clock_alarm_selected.png b/res/drawable-mdpi/ic_clock_alarm_selected.png
new file mode 100644 (file)
index 0000000..197325b
Binary files /dev/null and b/res/drawable-mdpi/ic_clock_alarm_selected.png differ
diff --git a/res/drawable-mdpi/ic_clock_strip_alarm.png b/res/drawable-mdpi/ic_clock_strip_alarm.png
new file mode 100644 (file)
index 0000000..1bc1368
Binary files /dev/null and b/res/drawable-mdpi/ic_clock_strip_alarm.png differ
diff --git a/res/drawable-mdpi/ic_clock_strip_desk_clock.png b/res/drawable-mdpi/ic_clock_strip_desk_clock.png
new file mode 100644 (file)
index 0000000..76ebbd2
Binary files /dev/null and b/res/drawable-mdpi/ic_clock_strip_desk_clock.png differ
diff --git a/res/drawable-mdpi/ic_clock_strip_gallery.png b/res/drawable-mdpi/ic_clock_strip_gallery.png
new file mode 100644 (file)
index 0000000..6b0cf58
Binary files /dev/null and b/res/drawable-mdpi/ic_clock_strip_gallery.png differ
diff --git a/res/drawable-mdpi/ic_clock_strip_home.png b/res/drawable-mdpi/ic_clock_strip_home.png
new file mode 100644 (file)
index 0000000..afa67ae
Binary files /dev/null and b/res/drawable-mdpi/ic_clock_strip_home.png differ
diff --git a/res/drawable-mdpi/ic_clock_strip_music.png b/res/drawable-mdpi/ic_clock_strip_music.png
new file mode 100644 (file)
index 0000000..a1f7efa
Binary files /dev/null and b/res/drawable-mdpi/ic_clock_strip_music.png differ
diff --git a/res/drawable-mdpi/ic_indicator_off.png b/res/drawable-mdpi/ic_indicator_off.png
new file mode 100644 (file)
index 0000000..c1aa867
Binary files /dev/null and b/res/drawable-mdpi/ic_indicator_off.png differ
diff --git a/res/drawable-mdpi/ic_indicator_on.png b/res/drawable-mdpi/ic_indicator_on.png
new file mode 100755 (executable)
index 0000000..361364b
Binary files /dev/null and b/res/drawable-mdpi/ic_indicator_on.png differ
diff --git a/res/drawable-mdpi/ic_launcher_alarmclock.png b/res/drawable-mdpi/ic_launcher_alarmclock.png
new file mode 100644 (file)
index 0000000..6b450cd
Binary files /dev/null and b/res/drawable-mdpi/ic_launcher_alarmclock.png differ
diff --git a/res/drawable-mdpi/ic_lock_idle_alarm.png b/res/drawable-mdpi/ic_lock_idle_alarm.png
new file mode 100644 (file)
index 0000000..d29c6c3
Binary files /dev/null and b/res/drawable-mdpi/ic_lock_idle_alarm.png differ
diff --git a/res/drawable-mdpi/ic_lock_idle_alarm_saver.png b/res/drawable-mdpi/ic_lock_idle_alarm_saver.png
new file mode 100644 (file)
index 0000000..a1815df
Binary files /dev/null and b/res/drawable-mdpi/ic_lock_idle_alarm_saver.png differ
diff --git a/res/drawable-mdpi/ic_lock_idle_alarm_saver_dim.png b/res/drawable-mdpi/ic_lock_idle_alarm_saver_dim.png
new file mode 100644 (file)
index 0000000..f6a0ab9
Binary files /dev/null and b/res/drawable-mdpi/ic_lock_idle_alarm_saver_dim.png differ
diff --git a/res/drawable-mdpi/ic_menu_add.png b/res/drawable-mdpi/ic_menu_add.png
new file mode 100644 (file)
index 0000000..6752bfd
Binary files /dev/null and b/res/drawable-mdpi/ic_menu_add.png differ
diff --git a/res/drawable-mdpi/ic_menu_alarms.png b/res/drawable-mdpi/ic_menu_alarms.png
new file mode 100644 (file)
index 0000000..e7a5bd1
Binary files /dev/null and b/res/drawable-mdpi/ic_menu_alarms.png differ
diff --git a/res/drawable-mdpi/ic_menu_clock_face.png b/res/drawable-mdpi/ic_menu_clock_face.png
new file mode 100644 (file)
index 0000000..678af24
Binary files /dev/null and b/res/drawable-mdpi/ic_menu_clock_face.png differ
diff --git a/res/drawable-mdpi/ic_menu_desk_clock.png b/res/drawable-mdpi/ic_menu_desk_clock.png
new file mode 100644 (file)
index 0000000..d9893ed
Binary files /dev/null and b/res/drawable-mdpi/ic_menu_desk_clock.png differ
diff --git a/res/drawable-mdpi/ic_round_brightness.png b/res/drawable-mdpi/ic_round_brightness.png
new file mode 100644 (file)
index 0000000..0c81bbe
Binary files /dev/null and b/res/drawable-mdpi/ic_round_brightness.png differ
diff --git a/res/drawable-mdpi/ic_widget_analog_clock.png b/res/drawable-mdpi/ic_widget_analog_clock.png
new file mode 100644 (file)
index 0000000..6b450cd
Binary files /dev/null and b/res/drawable-mdpi/ic_widget_analog_clock.png differ
diff --git a/res/drawable-mdpi/stat_notify_alarm.png b/res/drawable-mdpi/stat_notify_alarm.png
new file mode 100644 (file)
index 0000000..6012575
Binary files /dev/null and b/res/drawable-mdpi/stat_notify_alarm.png differ
diff --git a/res/drawable/add_alarm.xml b/res/drawable/add_alarm.xml
new file mode 100644 (file)
index 0000000..950894d
--- /dev/null
@@ -0,0 +1,24 @@
+<?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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_focused="true" android:state_window_focused="true"
+        android:drawable="@drawable/ic_clock_add_alarm_selected" />
+    <item android:state_pressed="true" android:state_window_focused="true"
+        android:drawable="@drawable/ic_clock_add_alarm_selected" />
+    <item android:state_focused="false"
+        android:drawable="@drawable/ic_clock_add_alarm" />
+</selector>
diff --git a/res/drawable/btn_strip_trans_left.xml b/res/drawable/btn_strip_trans_left.xml
new file mode 100644 (file)
index 0000000..dd8cbd6
--- /dev/null
@@ -0,0 +1,30 @@
+<?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.
+-->
+
+<!-- StateListDrawable used for the small round ImageButtons at the upper
+     corners of the in-call onscreen touch UI. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_pressed="true" 
+        android:drawable="@drawable/btn_strip_trans_left_pressed" />
+
+    <item android:state_focused="true"
+        android:drawable="@drawable/btn_strip_trans_left_selected" />
+
+    <item android:state_enabled="true"
+        android:drawable="@drawable/btn_strip_trans_left_normal" />
+
+</selector>
diff --git a/res/drawable/btn_strip_trans_middle.xml b/res/drawable/btn_strip_trans_middle.xml
new file mode 100644 (file)
index 0000000..b0b715a
--- /dev/null
@@ -0,0 +1,30 @@
+<?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.
+-->
+
+<!-- StateListDrawable used for the small round ImageButtons at the upper
+     corners of the in-call onscreen touch UI. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_pressed="true" 
+        android:drawable="@drawable/btn_strip_trans_middle_pressed" />
+
+    <item android:state_focused="true"
+        android:drawable="@drawable/btn_strip_trans_middle_selected" />
+
+    <item android:state_enabled="true"
+        android:drawable="@drawable/btn_strip_trans_middle_normal" />
+
+</selector>
diff --git a/res/drawable/btn_strip_trans_right.xml b/res/drawable/btn_strip_trans_right.xml
new file mode 100644 (file)
index 0000000..23cab56
--- /dev/null
@@ -0,0 +1,30 @@
+<?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.
+-->
+
+<!-- StateListDrawable used for the small round ImageButtons at the upper
+     corners of the in-call onscreen touch UI. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_pressed="true" 
+        android:drawable="@drawable/btn_strip_trans_right_pressed" />
+
+    <item android:state_focused="true"
+        android:drawable="@drawable/btn_strip_trans_right_selected" />
+
+    <item android:state_enabled="true"
+        android:drawable="@drawable/btn_strip_trans_right_normal" />
+
+</selector>
diff --git a/res/drawable/clock_selector.xml b/res/drawable/clock_selector.xml
new file mode 100644 (file)
index 0000000..efc9e5b
--- /dev/null
@@ -0,0 +1,22 @@
+<?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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_pressed="false"
+      android:drawable="@android:color/background_dark" />
+  <item android:state_pressed="true"
+      android:drawable="@*android:drawable/list_selector_background_pressed" />
+</selector>
diff --git a/res/drawable/incall_round_button.xml b/res/drawable/incall_round_button.xml
new file mode 100644 (file)
index 0000000..5750c07
--- /dev/null
@@ -0,0 +1,42 @@
+<?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.
+-->
+
+<!-- StateListDrawable used for the small round ImageButtons at the upper
+     corners of the in-call onscreen touch UI. -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_window_focused="false" android:state_enabled="true"
+        android:drawable="@drawable/btn_in_call_round_normal" />
+
+    <item android:state_window_focused="false" android:state_enabled="false"
+        android:drawable="@drawable/btn_in_call_round_disable" />
+
+    <item android:state_pressed="true" 
+        android:drawable="@drawable/btn_in_call_round_pressed" />
+
+    <item android:state_focused="true" android:state_enabled="true"
+        android:drawable="@drawable/btn_in_call_round_selected" />
+
+    <item android:state_enabled="true"
+        android:drawable="@drawable/btn_in_call_round_normal" />
+
+    <item android:state_focused="true"
+        android:drawable="@drawable/btn_in_call_round_disable_focused" />
+
+    <item
+        android:drawable="@drawable/btn_in_call_round_disable" />
+
+</selector>
diff --git a/res/drawable/indicator_bar_onoff.xml b/res/drawable/indicator_bar_onoff.xml
new file mode 100644 (file)
index 0000000..e3d8caa
--- /dev/null
@@ -0,0 +1,22 @@
+<?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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_checked="true"
+        android:drawable="@drawable/ic_indicator_on" />
+    <item android:state_checked="false"
+        android:drawable="@drawable/ic_indicator_off" />
+</selector>
diff --git a/res/drawable/indicator_clock_onoff.xml b/res/drawable/indicator_clock_onoff.xml
new file mode 100644 (file)
index 0000000..e3a2d8d
--- /dev/null
@@ -0,0 +1,21 @@
+<?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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true" android:state_window_focused="true"
+        android:drawable="@drawable/ic_clock_alarm_selected" />
+    <item android:drawable="@drawable/ic_clock_alarm_on" />
+</selector>
diff --git a/res/layout-land/desk_clock.xml b/res/layout-land/desk_clock.xml
new file mode 100644 (file)
index 0000000..fbe310c
--- /dev/null
@@ -0,0 +1,128 @@
+<?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.
+-->
+
+<!-- This is the alarm clock in LANDSCAPE desk dock mode.
+     -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    >
+    <LinearLayout
+        android:id="@+id/desk_clock"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:orientation="vertical"
+        android:paddingTop="25dip"
+        >
+
+        <!-- Entire display region (everything but bottom buttons) -->
+        <!-- Left margin is 4 dip shy of desired to allow for the time to
+             "hang off" the left-hand side, accommodating the extra glyph
+             escapement in Clockopia and 3px of text shadow -->
+        <LinearLayout
+            android:orientation="vertical"
+            android:layout_gravity="left"
+            android:layout_weight="1"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:layout_marginLeft="25dip"
+            android:layout_marginTop="18dip"
+            android:layout_marginRight="18dip"
+            android:layout_marginBottom="12dip"
+            >
+
+            <!-- across the top: next alarm, battery, nightmode button -->
+            <LinearLayout
+                android:orientation="horizontal"
+                android:layout_width="fill_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="0"
+                android:layout_marginBottom="6dip"
+                android:layout_marginLeft="4dip"
+                android:gravity="center_vertical"
+                >
+                <TextView android:id="@+id/nextAlarm"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:gravity="left"
+                    android:textAppearance="?android:attr/textAppearanceMedium"
+                    android:drawablePadding="6dip"
+                    android:drawableLeft="@drawable/ic_lock_idle_alarm"
+                    android:shadowColor="#C0000000"
+                    android:shadowDx="0"
+                    android:shadowDy="0"
+                    android:shadowRadius="3.0"                        
+                    />
+
+                <include layout="@layout/desk_clock_battery"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginRight="8dip"
+                    android:layout_weight="0"
+                    />
+
+                <ImageButton android:id="@+id/nightmode_button"
+                    style="@style/RoundTouchButton"
+                    android:layout_weight="0"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:src="@drawable/ic_round_brightness"
+                    android:contentDescription="@string/nightmode_button_description"
+                    android:nextFocusDown="@+id/alarm_button"
+                    />
+            </LinearLayout>
+
+            <!-- second row: date/time on the left, weather on the right -->
+            <LinearLayout
+                android:orientation="horizontal"
+                android:layout_weight="1"
+                android:layout_width="fill_parent"
+                android:layout_height="wrap_content"
+                android:gravity="bottom"
+                >
+
+                <include layout="@layout/desk_clock_time_date"
+                    android:layout_height="wrap_content"
+                    android:layout_width="0dip"
+                    android:layout_weight="5"
+                    />
+
+                <include layout="@layout/desk_clock_weather"
+                    android:layout_height="wrap_content"
+                    android:layout_width="0dip"
+                    android:layout_marginLeft="12dip"
+                    android:layout_weight="3"
+                    />
+
+
+            </LinearLayout>
+
+        </LinearLayout>
+
+        <include layout="@layout/desk_clock_buttons" />
+
+    </LinearLayout>
+
+    <View android:id="@+id/window_tint"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:background="#CC000000"
+        android:visibility="visible"
+        android:clickable="false"
+        />
+
+</FrameLayout>
diff --git a/res/layout/alarm_alert.xml b/res/layout/alarm_alert.xml
new file mode 100644 (file)
index 0000000..57588c3
--- /dev/null
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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="fill_parent"
+    android:gravity="center">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:gravity="center_horizontal"
+        android:background="@drawable/dialog"
+        android:orientation="vertical">
+
+        <TextView android:id="@+id/alertTitle"
+            style="?android:attr/textAppearanceLarge"
+            android:padding="5dip"
+            android:singleLine="true"
+            android:ellipsize="end"
+            android:gravity="center"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content" />
+        <ImageView
+            android:layout_width="fill_parent"
+            android:layout_height="1dip"
+            android:scaleType="fitXY"
+            android:gravity="fill_horizontal"
+            android:src="@*android:drawable/dialog_divider_horizontal_light"
+            android:layout_marginLeft="10dip"
+            android:layout_marginRight="10dip"/>
+
+        <com.android.deskclock.DigitalClock
+            style="@style/clock"
+            android:paddingTop="30dip"
+            android:paddingBottom="30dip"
+            android:baselineAligned="true"
+            android:gravity="center_horizontal">
+
+            <TextView android:id="@+id/timeDisplay"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textSize="64sp"
+                android:textColor="?android:attr/textColorPrimary"/>
+
+            <TextView android:id="@+id/am_pm"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textStyle="bold"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:textColor="?android:attr/textColorPrimary"/>
+
+        </com.android.deskclock.DigitalClock>
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            style="@android:style/ButtonBar">
+
+            <Button
+                android:id="@+id/snooze"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="3"
+                android:text="@string/alarm_alert_snooze_text" />
+
+            <!-- blank stretchable view -->
+            <View
+                android:layout_width="2dip"
+                android:layout_height="2dip"
+                android:layout_gravity="fill_horizontal"
+                android:layout_weight="1"/>
+
+            <Button
+                android:id="@+id/dismiss"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="3"
+                android:text="@string/alarm_alert_dismiss_text" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/res/layout/alarm_clock.xml b/res/layout/alarm_clock.xml
new file mode 100644 (file)
index 0000000..a66fd59
--- /dev/null
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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:id="@+id/base_layout"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical"> 
+
+    <LinearLayout android:id="@+id/add_alarm"
+        android:clickable="true"
+        android:focusable="true"
+        android:background="@android:drawable/list_selector_background"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <ImageView
+            style="@style/alarm_list_left_column"
+            android:duplicateParentState="true"
+            android:gravity="center"
+            android:scaleType="center"
+            android:src="@drawable/add_alarm" />
+
+        <TextView
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            android:layout_gravity="center_vertical"
+            android:textAppearance="?android:attr/textAppearanceLarge"
+            android:textColor="?android:attr/textColorPrimary"
+            android:text="@string/add_alarm" />
+
+    </LinearLayout>
+
+    <ImageView
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:scaleType="fitXY"
+        android:gravity="fill_horizontal"
+        android:src="@android:drawable/divider_horizontal_dark" />
+
+    <ListView
+        android:id="@+id/alarms_list"
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="1" />
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal" >
+
+        <ImageButton android:id="@+id/desk_clock_button"
+            style="@style/ButtonStripLeft"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/ic_clock_strip_desk_clock"
+            android:contentDescription="@string/desk_clock_button_description"/>
+
+        <com.android.deskclock.DigitalClock
+            style="@style/ButtonStripRight"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent">
+
+            <LinearLayout
+                android:layout_width="fill_parent"
+                android:layout_height="wrap_content"
+                android:baselineAligned="true">
+
+                <TextView android:id="@+id/timeDisplay"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:paddingRight="6dip"
+                    android:textSize="48sp"
+                    android:textColor="?android:attr/textColorPrimary" />
+
+                <TextView android:id="@+id/am_pm"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textAppearance="?android:attr/textAppearanceSmall"
+                    android:textStyle="bold"
+                    android:textColor="?android:attr/textColorPrimary" />
+
+            </LinearLayout>
+
+      </com.android.deskclock.DigitalClock>
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/res/layout/alarm_time.xml b/res/layout/alarm_time.xml
new file mode 100644 (file)
index 0000000..5c3b19b
--- /dev/null
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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">
+
+    <!-- I can't use a normal checkbox here for a couple reasons:
+         1. The checkbox button resources cannot contain layouts so I have to
+            use 2 views for the clock and the bar.
+         2. The normal checkbox has a really messed up layout. Using the button
+            attribute produces a left-aligned image that has some kind of
+            minimum height. If the bar is a checkbox, it is too tall and is
+            clipped on the right.
+    -->
+    <com.android.deskclock.DontPressWithParentLayout android:id="@+id/indicator"
+        style="@style/alarm_list_left_column"
+        android:background="@drawable/clock_selector"
+        android:gravity="center"
+        android:orientation="vertical">
+        <CheckBox android:id="@+id/clock_onoff"
+            android:focusable="false"
+            android:clickable="false"
+            android:background="@drawable/indicator_clock_onoff"
+            android:duplicateParentState="true"
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            android:layout_gravity="center"
+            android:button="@null" />
+        <ImageView android:id="@+id/bar_onoff"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:paddingTop="4dip"
+            android:src="@drawable/ic_indicator_off" />
+    </com.android.deskclock.DontPressWithParentLayout>
+
+    <ImageView
+        android:src="@*android:drawable/divider_vertical_dark"
+        android:background="?android:attr/windowBackground"
+        android:layout_width="wrap_content"
+        android:layout_height="fill_parent"
+        android:paddingTop="4dip"
+        android:paddingBottom="4dip"
+        android:scaleType="fitXY"
+        android:gravity="fill_vertical" />
+
+    <!-- A layout that displays the time.  Shows time, am/pm (if 12-hour),
+         and an optional line below, used for day/days of week -->
+    <com.android.deskclock.DigitalClock android:id="@+id/digitalClock"
+        android:layout_width="wrap_content"
+        android:layout_height="fill_parent"
+        android:gravity="center_vertical"
+        android:layout_weight="1"
+        android:orientation="vertical"
+        android:paddingLeft="16dip"
+        android:paddingRight="16dip">
+
+        <LinearLayout
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:baselineAligned="true">
+
+            <TextView android:id="@+id/timeDisplay"
+                android:includeFontPadding="false"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingRight="6dip"
+                android:textSize="28sp"
+                android:textColor="?android:attr/textColorPrimary"/>
+
+            <TextView android:id="@+id/am_pm"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textStyle="bold"
+                android:textColor="?android:attr/textColorPrimary"/>
+
+            <TextView android:id="@+id/label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:paddingLeft="8dip"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textColor="?android:attr/textColorTertiary"
+                android:textStyle="bold"
+                android:gravity="right"
+                android:singleLine="true"/>
+
+        </LinearLayout>
+
+        <TextView android:id="@+id/daysOfWeek"
+            android:includeFontPadding="false"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textColor="?android:attr/textColorSecondary"/>
+
+    </com.android.deskclock.DigitalClock>
+
+</LinearLayout>
diff --git a/res/layout/analog_appwidget.xml b/res/layout/analog_appwidget.xml
new file mode 100644 (file)
index 0000000..7a32477
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<AnalogClock xmlns:android="http://schemas.android.com/apk/res/android"
+    android:dial="@drawable/appwidget_clock_dial"
+    android:hand_hour="@drawable/appwidget_clock_hour"
+    android:hand_minute="@drawable/appwidget_clock_minute"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent" />
diff --git a/res/layout/context_menu_header.xml b/res/layout/context_menu_header.xml
new file mode 100644 (file)
index 0000000..6ac4dc5
--- /dev/null
@@ -0,0 +1,52 @@
+<?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:paddingTop="6dip"
+    android:paddingBottom="9dip"
+    android:paddingLeft="10dip"
+    android:paddingRight="10dip">
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="top"
+        android:paddingTop="6dip"
+        android:paddingRight="10dip"
+        android:src="@*android:drawable/ic_dialog_time"/>
+
+    <TextView android:id="@+id/header_time"
+        style="?android:attr/textAppearanceLarge"
+        android:layout_width="wrap_content"
+        android:layout_height="fill_parent"
+        android:singleLine="true"
+        android:gravity="center_vertical"
+        android:ellipsize="none"/>
+
+    <TextView android:id="@+id/header_label"
+        style="?android:attr/textAppearanceLarge"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_marginLeft="20dip"
+        android:singleLine="true"
+        android:gravity="right|center_vertical"
+        android:ellipsize="end"/>
+
+</LinearLayout>
+
diff --git a/res/layout/desk_clock.xml b/res/layout/desk_clock.xml
new file mode 100644 (file)
index 0000000..018ef1f
--- /dev/null
@@ -0,0 +1,121 @@
+<?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.
+-->
+
+<!-- This is the alarm clock in desk dock mode. It shows the time in large
+     type, plus information about active alarms and charge status.  It can
+     also show some additional status information (e.g. weather data).
+     Buttons are provided to access alarms, music, and other useful functions.
+     -->
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    >
+    <!-- the top padding accounts for the status bar area -->
+    <LinearLayout
+        android:id="@+id/desk_clock"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:orientation="vertical"
+        android:paddingTop="25dip"
+        >
+
+        <!-- Entire display region (everything but bottom buttons) -->
+        <!-- Left margin is 4 dip shy of desired to allow for the time to
+             "hang off" the left-hand side, accommodating the extra glyph
+             escapement in Clockopia and 3px of text shadow -->
+        <LinearLayout
+            android:orientation="vertical"
+            android:layout_gravity="left"
+            android:layout_weight="1"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:layout_marginLeft="22dip"
+            android:layout_marginTop="18dip"
+            android:layout_marginRight="18dip"
+            android:layout_marginBottom="14dip"
+            >
+
+            <!-- across the top: next alarm, nightmode button -->
+            <LinearLayout
+                android:orientation="horizontal"
+                android:layout_width="fill_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="0"
+                android:layout_marginLeft="4dip"
+                android:layout_marginBottom="6dip"
+                android:gravity="center_vertical"
+                >
+                <TextView android:id="@+id/nextAlarm"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:gravity="left"
+                    android:textAppearance="?android:attr/textAppearanceMedium"
+                    android:drawablePadding="6dip"
+                    android:drawableLeft="@drawable/ic_lock_idle_alarm"
+                    android:shadowColor="#C0000000"
+                    android:shadowDx="0"
+                    android:shadowDy="0"
+                    android:shadowRadius="3.0"                        
+                    />
+                <ImageButton android:id="@+id/nightmode_button"
+                    style="@style/RoundTouchButton"
+                    android:layout_weight="0"
+                    android:layout_height="wrap_content"
+                    android:layout_width="wrap_content"
+                    android:src="@drawable/ic_round_brightness"
+                    android:contentDescription="@string/nightmode_button_description"
+                    android:nextFocusDown="@+id/alarm_button"
+                    />
+            </LinearLayout>
+
+            <include layout="@layout/desk_clock_time_date"
+                android:layout_weight="1"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                />
+
+            <include layout="@layout/desk_clock_weather"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="0"
+                android:layout_marginTop="12dip"
+                android:layout_marginBottom="40dip"
+                android:layout_marginLeft="4dip"
+                />
+
+            <include layout="@layout/desk_clock_battery"
+                android:layout_height="wrap_content"
+                android:layout_width="fill_parent"
+                android:layout_weight="0"
+                android:layout_marginLeft="4dip"
+                />
+
+        </LinearLayout>
+
+        <include layout="@layout/desk_clock_buttons" />
+
+    </LinearLayout>
+
+    <View android:id="@+id/window_tint"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:background="#CC000000"
+        android:visibility="visible"
+        android:clickable="false"
+        />
+
+</FrameLayout>
diff --git a/res/layout/desk_clock_battery.xml b/res/layout/desk_clock_battery.xml
new file mode 100644 (file)
index 0000000..9537500
--- /dev/null
@@ -0,0 +1,26 @@
+<?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.
+-->
+
+<!-- battery/charge status -->
+<TextView android:id="@+id/battery" xmlns:android="http://schemas.android.com/apk/res/android"
+    android:gravity="right"
+       android:textAppearance="?android:attr/textAppearanceMedium"
+    android:drawablePadding="6dip"
+    android:shadowColor="#C0000000"
+    android:shadowDx="0"
+    android:shadowDy="0"
+    android:shadowRadius="3.0"                        
+    />
diff --git a/res/layout/desk_clock_buttons.xml b/res/layout/desk_clock_buttons.xml
new file mode 100644 (file)
index 0000000..9d72282
--- /dev/null
@@ -0,0 +1,55 @@
+<?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:orientation="horizontal"
+    android:layout_width="fill_parent"
+    android:layout_height="wrap_content"
+    android:layout_weight="0"
+    >
+    <ImageButton android:id="@+id/alarm_button"
+               style="@style/ButtonStripLeft"
+        android:layout_height="wrap_content"
+        android:layout_width="fill_parent"
+        android:layout_weight=".25"
+        android:src="@drawable/ic_clock_strip_alarm"
+        android:contentDescription="@string/alarm_button_description"
+        />
+    <ImageButton android:id="@+id/gallery_button"
+               style="@style/ButtonStripMiddle"
+        android:layout_height="wrap_content"
+        android:layout_width="fill_parent"
+        android:layout_weight=".25"
+        android:src="@drawable/ic_clock_strip_gallery"
+        android:contentDescription="@string/gallery_button_description"
+        />
+    <ImageButton android:id="@+id/music_button"
+               style="@style/ButtonStripMiddle"
+        android:layout_height="wrap_content"
+        android:layout_width="fill_parent"
+        android:layout_weight=".25"
+        android:src="@drawable/ic_clock_strip_music"
+        android:contentDescription="@string/music_button_description"
+        />
+    <ImageButton android:id="@+id/home_button"
+               style="@style/ButtonStripRight"
+        android:layout_height="wrap_content"
+        android:layout_width="fill_parent"
+        android:layout_weight=".25"
+        android:src="@drawable/ic_clock_strip_home"
+        android:contentDescription="@string/home_button_description"
+        />
+</LinearLayout>
diff --git a/res/layout/desk_clock_saver.xml b/res/layout/desk_clock_saver.xml
new file mode 100644 (file)
index 0000000..fcde362
--- /dev/null
@@ -0,0 +1,54 @@
+<?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.
+-->
+
+<!-- Special "screen saver mode" with just the time/date on black. -->
+<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    >
+
+    <View
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_x="0dip"
+        android:layout_y="0dip"
+        android:background="#FF000000"
+        />
+
+    <RelativeLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_x="0dip"
+        android:layout_y="0dip"
+        android:id="@+id/saver_view"
+        >
+        <TextView android:id="@+id/nextAlarm"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="10dip"
+            android:layout_marginLeft="4dip"
+            android:gravity="left"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:drawablePadding="6dip"
+            />
+        <include layout="@layout/desk_clock_time_date"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/nextAlarm"
+            />
+    </RelativeLayout>
+
+</AbsoluteLayout>
diff --git a/res/layout/desk_clock_time_date.xml b/res/layout/desk_clock_time_date.xml
new file mode 100644 (file)
index 0000000..5b2af22
--- /dev/null
@@ -0,0 +1,78 @@
+<?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.
+-->
+
+<!-- digital clock & date, together -->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/time_date"
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:gravity="left|center_vertical"
+    android:layout_weight="1"
+    >
+
+    <com.android.deskclock.DigitalClock android:id="@+id/time"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="8dip"
+        >
+
+        <TextView android:id="@+id/timeDisplay"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:ellipsize="none"
+            android:gravity="center"
+            android:textSize="106sp"
+            android:textColor="#FFFFFFFF"
+            android:shadowColor="#C0000000"
+            android:shadowDx="0"
+            android:shadowDy="0"
+            android:shadowRadius="3.0"
+            android:paddingBottom="3dip"
+            />
+
+
+        <TextView android:id="@+id/am_pm"
+            android:layout_width="wrap_content"
+            android:layout_height="fill_parent"
+            android:gravity="bottom"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:textStyle="bold"
+            android:singleLine="true"
+            android:ellipsize="none"
+            android:layout_marginLeft="4dip"
+            android:shadowColor="#C0000000"
+            android:shadowDx="0"
+            android:shadowDy="0"
+            android:shadowRadius="3.0"
+            />
+
+    </com.android.deskclock.DigitalClock>
+
+    <TextView android:id="@+id/date"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="left"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:shadowColor="#C0000000"
+        android:shadowDx="0"
+        android:shadowDy="0"
+        android:shadowRadius="3.0"
+        android:layout_marginLeft="4dip"
+        />
+
+</LinearLayout>
diff --git a/res/layout/desk_clock_weather.xml b/res/layout/desk_clock_weather.xml
new file mode 100644 (file)
index 0000000..6c17162
--- /dev/null
@@ -0,0 +1,95 @@
+<?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.
+-->
+
+<!-- Weather data from Genie provider -->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/weather"
+    android:orientation="vertical"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:gravity="left"
+    >
+    <RelativeLayout android:id="@+id/weather_temp_icon_cluster"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_marginBottom="-6dip"
+        >
+        <ImageView android:id="@+id/weather_icon"
+            android:layout_height="60sp"
+            android:layout_width="60sp"
+            android:gravity="left"
+            android:scaleType="centerInside"
+            android:layout_marginRight="8dip"
+            />
+        <TextView android:id="@+id/weather_temperature"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:textSize="46sp"
+            android:textColor="?android:attr/textColorPrimary"
+            android:shadowColor="#C0000000"
+            android:shadowDx="0"
+            android:shadowDy="0"
+            android:shadowRadius="3.0"
+            android:layout_marginRight="8dip"
+            android:layout_centerVertical="true"
+            android:layout_toRightOf="@id/weather_icon"
+            android:layout_alignBottom="@id/weather_icon"
+            />
+        <TextView android:id="@+id/weather_low_temperature"
+            android:layout_width="40sp"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textColor="?android:attr/textColorSecondary"
+            android:shadowColor="#C0000000"
+            android:shadowDx="0"
+            android:shadowDy="0"
+            android:shadowRadius="3.0"
+            android:layout_toRightOf="@id/weather_temperature"
+            android:layout_alignBaseline="@id/weather_temperature"
+            />
+        <TextView android:id="@+id/weather_high_temperature"
+            android:layout_width="40sp"
+            android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:textAppearance="?android:attr/textAppearanceSmall"
+            android:textStyle="bold"
+            android:textColor="?android:attr/textColorPrimary"
+            android:shadowColor="#C0000000"
+            android:shadowDx="0"
+            android:shadowDy="0"
+            android:shadowRadius="3.0"
+            android:layout_alignTop="@id/weather_temperature"
+            android:layout_marginTop="9sp"
+            android:layout_alignLeft="@id/weather_low_temperature"
+            />
+    </RelativeLayout>
+    <TextView android:id="@+id/weather_location"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/weather_temp_icon_cluster"
+        android:maxWidth="300sp"
+        android:gravity="left"
+        android:textSize="18sp"
+        android:textColor="#ffffffff"
+        android:shadowColor="#c0000000"
+        android:shadowDx="0"
+        android:shadowDy="0"
+        android:shadowRadius="3.0"
+        />
+</RelativeLayout>
diff --git a/res/layout/save_cancel_alarm.xml b/res/layout/save_cancel_alarm.xml
new file mode 100644 (file)
index 0000000..837d951
--- /dev/null
@@ -0,0 +1,44 @@
+<?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"/>
+
+    <Button android:id="@+id/alarm_delete"
+        android:focusable="true"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:layout_weight="1"
+        android:text="@string/delete"/>
+
+</LinearLayout>
diff --git a/res/menu/alarm_list_menu.xml b/res/menu/alarm_list_menu.xml
new file mode 100644 (file)
index 0000000..1b727b3
--- /dev/null
@@ -0,0 +1,29 @@
+<?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.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/menu_item_desk_clock"
+        android:title="@string/menu_desk_clock"
+        android:icon="@drawable/ic_menu_desk_clock"/>
+    <item android:id="@+id/menu_item_add_alarm"
+        android:title="@string/add_alarm"
+        android:icon="@drawable/ic_menu_add"/>
+    <item android:id="@+id/menu_item_settings"
+        android:title="@string/settings"
+        android:icon="@android:drawable/ic_menu_preferences"/>
+</menu>
+
+
diff --git a/res/menu/context_menu.xml b/res/menu/context_menu.xml
new file mode 100644 (file)
index 0000000..797bafb
--- /dev/null
@@ -0,0 +1,26 @@
+<?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.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/enable_alarm"
+        android:title="@string/enable_alarm"/>
+    <item android:id="@+id/edit_alarm"
+        android:title="@string/menu_edit_alarm"/>
+    <item android:id="@+id/delete_alarm"
+        android:title="@string/delete_alarm"/>
+</menu>
+
+
diff --git a/res/menu/desk_clock_menu.xml b/res/menu/desk_clock_menu.xml
new file mode 100644 (file)
index 0000000..d31d65b
--- /dev/null
@@ -0,0 +1,29 @@
+<?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.
+-->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:id="@+id/menu_item_alarms"
+        android:title="@string/alarm_list_title"
+        android:icon="@drawable/ic_menu_alarms"/>
+    <item android:id="@+id/menu_item_add_alarm"
+        android:title="@string/add_alarm"
+        android:icon="@drawable/ic_menu_add"/>
+    <item android:id="@+id/menu_item_dock_settings"
+        android:title="@string/menu_item_dock_settings"
+        android:icon="@android:drawable/ic_menu_preferences"/>
+</menu>
+
+
diff --git a/res/raw/in_call_alarm.ogg b/res/raw/in_call_alarm.ogg
new file mode 100644 (file)
index 0000000..9d80037
Binary files /dev/null and b/res/raw/in_call_alarm.ogg differ
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
new file mode 100644 (file)
index 0000000..62122d4
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Hodiny"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Budíky"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Přidat budík"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Stolní hodiny"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Upravit budík"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Smazat budík"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Zapnout budík"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Vypnout budík"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Tento budík bude smazán."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Zobrazit hodiny"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Skrýt hodiny"</string>
+    <string name="label" msgid="162189613902857319">"Štítek"</string>
+    <string name="default_label" msgid="5590025289805630372">"Budík"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Nastavit budík"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrace"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Opakovat"</string>
+    <string name="alert" msgid="6539852766423700221">"Vyzváněcí tón"</string>
+    <string name="time" msgid="8067216534232296518">"Čas"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Zavřít"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Budík byl ztišen po uplynutí <xliff:g id="MINUTES">%d</xliff:g> min."</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Odložit"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Upozornění odloženo o <xliff:g id="MINUTES">%d</xliff:g> min."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Tento budík se spustí za méně než 1 minutu."</item>
+    <item msgid="7110525731259629055">"Tento budík se spustí za <xliff:g id="DAYS">%1$s</xliff:g> dny."</item>
+    <item msgid="7003982794086186185">"Tento budík se spustí za <xliff:g id="HOURS">%2$s</xliff:g> hod."</item>
+    <item msgid="7311021123230077742">"Tento budík bude aktivován za <xliff:g id="DAYS">%1$s</xliff:g> dny <xliff:g id="HOURS">%2$s</xliff:g> hod."</item>
+    <item msgid="8431715191823114872">"Tento budík se spustí za <xliff:g id="MINUTES">%3$s</xliff:g> min."</item>
+    <item msgid="3244151088673185428">"Tento budík se spustí za <xliff:g id="DAYS">%1$s</xliff:g> hod. a <xliff:g id="MINUTES">%3$s</xliff:g> min."</item>
+    <item msgid="3663661342600168814">"Tento budík se spustí za <xliff:g id="HOURS">%2$s</xliff:g> hod. a <xliff:g id="MINUTES">%3$s</xliff:g> min."</item>
+    <item msgid="7779544127785487304">"Tento budík se spustí za <xliff:g id="DAYS">%1$s</xliff:g> dny <xliff:g id="HOURS">%2$s</xliff:g> hod. <xliff:g id="MINUTES">%3$s</xliff:g> min."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 den"</string>
+    <string name="days" msgid="2070509222727852210">"dní: <xliff:g id="DAYS">%s</xliff:g>"</string>
+    <string name="hour" msgid="2546819039651509323">"1 hodina"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> hod."</string>
+    <string name="minute" msgid="2486157997434653710">"1 minuta"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> min"</string>
+    <string name="every_day" msgid="1058994798884544691">"Každý den"</string>
+    <string name="never" msgid="54104287800571769">"Nikdy"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Vyberte hodiny, které mají být zobrazeny."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Analogové hodiny"</string>
+    <string name="settings" msgid="5849739030579520686">"Nastavení"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Budík v tichém režimu"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Aktivovat budík i v případě, že je telefon v tichém režimu."</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Doba odložení"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 min"</item>
+    <item msgid="5294206441496024610">"10 min"</item>
+    <item msgid="2165904039211935470">"15 min"</item>
+    <item msgid="7248236967714374250">"20 min"</item>
+    <item msgid="738394723625179423">"25 min"</item>
+    <item msgid="1180222611308391616">"30 min"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Hotovo"</string>
+    <string name="revert" msgid="9100911171235162926">"Vrátit zpět"</string>
+    <string name="delete" msgid="5732434972457000541">"Smazat"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Hlasitost budíku"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Nastavení hlasitosti budíků"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Tichý"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Vyberte, zda budík chcete ukončit nebo odložit."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (odloženo)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Budík byl nastaven na <xliff:g id="TIME">%s</xliff:g>. Můžete jej případně vybrat a zrušit."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Chování postranních tlačítek"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Umožňuje nastavit chování postranních tlačítek při vyzvánění budíku"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Žádné"</item>
+    <item msgid="7111908302622811168">"Odložit"</item>
+    <item msgid="8573552194573068996">"Ukončit"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Budíky"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galerie"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Hudba"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Ztlumit"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Zobrazení hodin"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Informace o počasí aktuálně nejsou k dispozici."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Nastavení doku"</string>
+</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
new file mode 100644 (file)
index 0000000..1b940ac
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Ur"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarmer"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Tilføj alarm"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Ur på skrivebord"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Rediger alarm"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Slet alarm"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Slå alarm til"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Slå alarm fra"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Denne alarm slettes."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Vis ur"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Skjul ur"</string>
+    <string name="label" msgid="162189613902857319">"Etiket"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Angiv alarm"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibration"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Gentag"</string>
+    <string name="alert" msgid="6539852766423700221">"Ringetone"</string>
+    <string name="time" msgid="8067216534232296518">"Tid"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Annuller"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarm slukkes efter <xliff:g id="MINUTES">%d</xliff:g> minutter"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Slumretilstand"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Slumrer i <xliff:g id="MINUTES">%d</xliff:g> minutter."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Alarm er indstillet til mindre end 1 minut fra nu af."</item>
+    <item msgid="7110525731259629055">"Alarmen er indstillet til <xliff:g id="DAYS">%1$s</xliff:g> fra nu af."</item>
+    <item msgid="7003982794086186185">"Alarmen er indstillet til <xliff:g id="HOURS">%2$s</xliff:g> fra nu af."</item>
+    <item msgid="7311021123230077742">"Alarmen er indstillet til <xliff:g id="DAYS">%1$s</xliff:g> og <xliff:g id="HOURS">%2$s</xliff:g> fra nu af."</item>
+    <item msgid="8431715191823114872">"Alarmen er indstillet til <xliff:g id="MINUTES">%3$s</xliff:g> fra nu af."</item>
+    <item msgid="3244151088673185428">"Alarmen er indstillet til <xliff:g id="DAYS">%1$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g> fra nu af."</item>
+    <item msgid="3663661342600168814">"Alarmen er indstillet til <xliff:g id="HOURS">%2$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g> fra nu af."</item>
+    <item msgid="7779544127785487304">"Alarmen er indstillet til <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g> fra nu af."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 dag"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dage"</string>
+    <string name="hour" msgid="2546819039651509323">"1 time"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> timer"</string>
+    <string name="minute" msgid="2486157997434653710">"1 minut"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> minutter"</string>
+    <string name="every_day" msgid="1058994798884544691">"hver dag"</string>
+    <string name="never" msgid="54104287800571769">"Aldrig"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Vælg det ur, der skal vises."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Analogt ur"</string>
+    <string name="settings" msgid="5849739030579520686">"Indstillinger"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm i lydløs tilstand"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Afspil alarm, selvom telefonen er i lydløs tilstand"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Slumretilstands varighed"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutter"</item>
+    <item msgid="5294206441496024610">"10 minutter"</item>
+    <item msgid="2165904039211935470">"15 minutter"</item>
+    <item msgid="7248236967714374250">"20 minutter"</item>
+    <item msgid="738394723625179423">"25 minutter"</item>
+    <item msgid="1180222611308391616">"30 minutter"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Udfør"</string>
+    <string name="revert" msgid="9100911171235162926">"Annuller"</string>
+    <string name="delete" msgid="5732434972457000541">"Slet"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Lydstyrke for alarm"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Angiv alarmernes lydstyrke"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Lydløs"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Vælg for at slumre eller annullere alarmen."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (slumretilstand)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarmen er indstillet til <xliff:g id="TIME">%s</xliff:g>. Vælg for at annullere."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Sideknaps adfærd"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Angiv ønsket adfærd for sideknapperne, når der trykkes på dem under en alarm"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Ingen"</item>
+    <item msgid="7111908302622811168">"Slumretilstand"</item>
+    <item msgid="8573552194573068996">"Annuller"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarmer"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galleri"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Musik"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Dæmp"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Urvisning"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Oplysninger om vejret er ikke tilgængelige i øjeblikket."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Indstillinger for dockingstation"</string>
+</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
new file mode 100644 (file)
index 0000000..e8d28db
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Uhr"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Wecker"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Wecker hinzufügen"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Schreibtischuhr"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Wecker bearbeiten"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Wecker löschen"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Wecker einschalten"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Wecker ausschalten"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Dieser Alarm wird gelöscht."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Uhr anzeigen"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Uhr ausblenden"</string>
+    <string name="label" msgid="162189613902857319">"Label"</string>
+    <string name="default_label" msgid="5590025289805630372">"Wecker"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Wecker einstellen"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrieren"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Wiederholen"</string>
+    <string name="alert" msgid="6539852766423700221">"Klingelton"</string>
+    <string name="time" msgid="8067216534232296518">"Uhrzeit"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Verwerfen"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Der Wecker verstummte nach <xliff:g id="MINUTES">%d</xliff:g> Minuten"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Snooze-Funktion"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Snooze-Funktion aktiviert für <xliff:g id="MINUTES">%d</xliff:g> Minuten"</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Dieser Wecker klingelt in weniger als 1 Minute."</item>
+    <item msgid="7110525731259629055">"Dieser Wecker klingelt in <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"Dieser Wecker klingelt in <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"Dieser Wecker klingelt in <xliff:g id="DAYS">%1$s</xliff:g> und <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"Dieser Wecker klingelt in <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"Dieser Wecker klingelt in <xliff:g id="DAYS">%1$s</xliff:g> und <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"Dieser Wecker klingelt in <xliff:g id="HOURS">%2$s</xliff:g> und <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"Dieser Wecker klingelt in <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> und <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 Tag"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> Tagen"</string>
+    <string name="hour" msgid="2546819039651509323">"1 Stunde"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> Stunden"</string>
+    <string name="minute" msgid="2486157997434653710">"1 Minute"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> Minuten"</string>
+    <string name="every_day" msgid="1058994798884544691">"Täglich"</string>
+    <string name="never" msgid="54104287800571769">"Nie"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Wählen Sie die anzuzeigende Uhr aus."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Analoguhr"</string>
+    <string name="settings" msgid="5849739030579520686">"Einstellungen"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm im Lautlosmodus"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Alarm auch im Lautlosmodus auslösen"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Snooze-Dauer"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 Minuten"</item>
+    <item msgid="5294206441496024610">"10 Minuten"</item>
+    <item msgid="2165904039211935470">"15 Minuten"</item>
+    <item msgid="7248236967714374250">"20 Minuten"</item>
+    <item msgid="738394723625179423">"25 Minuten"</item>
+    <item msgid="1180222611308391616">"30 Minuten"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Fertig"</string>
+    <string name="revert" msgid="9100911171235162926">"Zurücksetzen"</string>
+    <string name="delete" msgid="5732434972457000541">"Löschen"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Lautstärke für Alarm"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Lautstärke des Weckers einstellen"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Lautlos"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Für Snooze-Funktion oder Beenden auswählen"</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (Snooze)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Wecker für <xliff:g id="TIME">%s</xliff:g> gestellt. Zum Abbrechen auswählen."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Funktion der seitlichen Tasten"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Verhalten der seitlichen Tasten während des Weckerklingelns"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Keine"</item>
+    <item msgid="7111908302622811168">"Snooze-Funktion"</item>
+    <item msgid="8573552194573068996">"Beenden"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Wecker"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galerie"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Musik"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Dimmen"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Uhrendisplay"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Wetterinformationen derzeit nicht verfügbar"</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Dock-Einstellungen"</string>
+</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
new file mode 100644 (file)
index 0000000..f4d2385
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Ρολόι"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Ειδοποιήσεις"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Προσθήκη ξυπνητηριού"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Ρολόι γραφείου"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Επεξεργασία ξυπνητηριού"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Διαγραφή ξυπνητηριού"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Ενεργοποίηση ξυπνητηριού"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Απενεργοποίηση ξυπνητηριού"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Αυτό το ξυπνητήρι θα διαγραφεί."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Εμφάνιση ρολογιού"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Απόκρυψη ρολογιού"</string>
+    <string name="label" msgid="162189613902857319">"Ετικέτα"</string>
+    <string name="default_label" msgid="5590025289805630372">"Ξυπνητήρι"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Ορισμός ξυπνητηριού"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Δόνηση"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Επανάληψη"</string>
+    <string name="alert" msgid="6539852766423700221">"Ήχος ξυπνητηριού"</string>
+    <string name="time" msgid="8067216534232296518">"Ώρα"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Παράβλεψη"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Σιγή ξυπνητηριού μετά από <xliff:g id="MINUTES">%d</xliff:g> λεπτά"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Αναβολή αφύπνισης"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Αναβολή αφύπνισης για <xliff:g id="MINUTES">%d</xliff:g> λεπτά."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Το ξυπνητήρι αυτό έχει οριστεί σε λιγότερο από 1 λεπτό από τώρα."</item>
+    <item msgid="7110525731259629055">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="DAYS">%1$s</xliff:g> από τώρα."</item>
+    <item msgid="7003982794086186185">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="HOURS">%2$s</xliff:g> από τώρα."</item>
+    <item msgid="7311021123230077742">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="DAYS">%1$s</xliff:g> και σε <xliff:g id="HOURS">%2$s</xliff:g> από τώρα."</item>
+    <item msgid="8431715191823114872">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="MINUTES">%3$s</xliff:g> από τώρα."</item>
+    <item msgid="3244151088673185428">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="DAYS">%1$s</xliff:g> και σε <xliff:g id="MINUTES">%3$s</xliff:g> από τώρα."</item>
+    <item msgid="3663661342600168814">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="HOURS">%2$s</xliff:g> και σε <xliff:g id="MINUTES">%3$s</xliff:g> από τώρα."</item>
+    <item msgid="7779544127785487304">"Το ξυπνητήρι αυτό έχει οριστεί σε <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g>και <xliff:g id="MINUTES">%3$s</xliff:g> από τώρα."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 ημέρα"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> ημέρες"</string>
+    <string name="hour" msgid="2546819039651509323">"1 ώρα"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> ώρες"</string>
+    <string name="minute" msgid="2486157997434653710">"1 λεπτό"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> λεπτά"</string>
+    <string name="every_day" msgid="1058994798884544691">"κάθε μέρα"</string>
+    <string name="never" msgid="54104287800571769">"Ποτέ"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Επιλογή ρολογιού για προβολή."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Αναλογικό ρολόι"</string>
+    <string name="settings" msgid="5849739030579520686">"Ρυθμίσεις"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Ξυπνητήρι σε αθόρυβη λειτουργία"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Αναπ/γή ήχου ξυπνητ.ακόμα και όταν το τηλ.βρίσκ.σε αθόρ.λειτ."</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Διάρκεια αφύπνισης"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 λεπτά"</item>
+    <item msgid="5294206441496024610">"10 λεπτά"</item>
+    <item msgid="2165904039211935470">"15 λεπτά"</item>
+    <item msgid="7248236967714374250">"20 λεπτά"</item>
+    <item msgid="738394723625179423">"25 λεπτά"</item>
+    <item msgid="1180222611308391616">"30 λεπτά"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Τέλος"</string>
+    <string name="revert" msgid="9100911171235162926">"Επαναφορά"</string>
+    <string name="delete" msgid="5732434972457000541">"Διαγραφή"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Ένταση ήχου ξυπνητηριού"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Ορισμός της έντασης του ήχου ξυπνητηριού"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Σίγαση"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Επιλέξτε την αφύπνιση ή την παράβλεψη σε αυτό το ξυπνητήρι."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (αναβολή)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Το ξυπνητήρι ρυθμίστηκε για τις <xliff:g id="TIME">%s</xliff:g>. Επιλέξτε για να ακυρώσετε."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Συμπεριφορά πλευρικού κουμπιού"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Ορίστε την επιθυμητή συμπεριφορά των πλαϊνών κουμπιών κατά τον ήχο του ξυπνητηριού"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Καμία"</item>
+    <item msgid="7111908302622811168">"Αφύπνιση"</item>
+    <item msgid="8573552194573068996">"Παράβλεψη"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Ειδοποιήσεις"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Συλλογή"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Μουσική"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Θάμπωμα"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Εκκίνηση"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Οθόνη ρολογιού"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Οι πληροφορίες καιρού δεν είναι διαθέσιμες αυτή τη στιγμή."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Ρυθμίσεις βάσης σύνδεσης"</string>
+</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
new file mode 100644 (file)
index 0000000..89fa634
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Reloj"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarmas"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Agregar alarma"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Reloj de escritorio"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Modificar alarma"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Eliminar alarma"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Activar alarma"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Desactivar alarma"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Esta alarma se eliminará"</string>
+    <string name="show_clock" msgid="8358759982675616915">"Mostrar reloj"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Ocultar reloj"</string>
+    <string name="label" msgid="162189613902857319">"Etiqueta"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarma"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Fijar alarma"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrar"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
+    <string name="alert" msgid="6539852766423700221">"Timbre"</string>
+    <string name="time" msgid="8067216534232296518">"Hora"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Descartar"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarma silenciada después de <xliff:g id="MINUTES">%d</xliff:g> minutos"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Recurrente"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Recurrente a los <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Esta alarma se activará en menos de un minuto a partir de ahora."</item>
+    <item msgid="7110525731259629055">"Esta alarma se activará en <xliff:g id="DAYS">%1$s</xliff:g> a partir de ahora."</item>
+    <item msgid="7003982794086186185">"Esta alarma se activará en <xliff:g id="HOURS">%2$s</xliff:g> a partir de ahora."</item>
+    <item msgid="7311021123230077742">"Esta alarma se activará en <xliff:g id="DAYS">%1$s</xliff:g> y <xliff:g id="HOURS">%2$s</xliff:g> a partir de ahora."</item>
+    <item msgid="8431715191823114872">"Esta alarma se activará en <xliff:g id="MINUTES">%3$s</xliff:g> a partir de ahora."</item>
+    <item msgid="3244151088673185428">"Esta alarma se activará en <xliff:g id="DAYS">%1$s</xliff:g> y <xliff:g id="MINUTES">%3$s</xliff:g> a partir de ahora."</item>
+    <item msgid="3663661342600168814">"Esta alarma se activará en <xliff:g id="HOURS">%2$s</xliff:g> y <xliff:g id="MINUTES">%3$s</xliff:g> a partir de ahora."</item>
+    <item msgid="7779544127785487304">"Esta alarma se activará en <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> y <xliff:g id="MINUTES">%3$s</xliff:g> a partir de ahora."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"un día"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> días"</string>
+    <string name="hour" msgid="2546819039651509323">"1 hora"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> horas"</string>
+    <string name="minute" msgid="2486157997434653710">"1 minuto"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> minutos"</string>
+    <string name="every_day" msgid="1058994798884544691">"todos los días"</string>
+    <string name="never" msgid="54104287800571769">"Nunca"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Selecciona un reloj."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Reloj analógico"</string>
+    <string name="settings" msgid="5849739030579520686">"Config."</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarma en modo silencio"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Reproducir alarma cuando el teléfono está en modo silencioso"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Duración de recurrencia"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutos"</item>
+    <item msgid="5294206441496024610">"10 minutos"</item>
+    <item msgid="2165904039211935470">"15 minutos"</item>
+    <item msgid="7248236967714374250">"20 minutos"</item>
+    <item msgid="738394723625179423">"25 minutos"</item>
+    <item msgid="1180222611308391616">"30 minutos"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Finalizado"</string>
+    <string name="revert" msgid="9100911171235162926">"Revertir"</string>
+    <string name="delete" msgid="5732434972457000541">"Suprimir"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volumen de la alarma"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Establecer el volumen de las alarmas"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencioso"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Seleccionar alarma recurrente o rechazar."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (recurrente)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Esta alarma se activará en <xliff:g id="TIME">%s</xliff:g>. Selecciona para cancelar."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Comport. del botón lateral"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Activar el comport. deseado de los botones lat. durante una alarma"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Ninguno"</item>
+    <item msgid="7111908302622811168">"Recurrente"</item>
+    <item msgid="8573552194573068996">"Descartar"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarmas"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galería"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Música"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Atenuar"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Visualización del reloj"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"Segmento <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Actualmente no se encuentra disponible información sobre el tiempo."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Configuración de la base"</string>
+</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
new file mode 100644 (file)
index 0000000..95592fc
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Reloj"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarmas"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Añadir alarma"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Reloj de escritorio"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Editar alarma"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Eliminar alarma"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Activar alarma"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Desactivar alarma"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Esta alarma se eliminará."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Mostrar reloj"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Ocultar reloj"</string>
+    <string name="label" msgid="162189613902857319">"Etiqueta"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarma"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Establecer alarma"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibración"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
+    <string name="alert" msgid="6539852766423700221">"Tono"</string>
+    <string name="time" msgid="8067216534232296518">"Hora"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Descartar"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"La alarma se ha silenciado después de <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Posponer"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"La alarma volverá a sonar en <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"La alarma sonará en menos de un minuto."</item>
+    <item msgid="7110525731259629055">"La alarma sonará en <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"La alarma sonará en <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"La alarma sonará en <xliff:g id="DAYS">%1$s</xliff:g> y <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"La alarma sonará en <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"La alarma sonará en <xliff:g id="DAYS">%1$s</xliff:g> y <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"La alarma sonará en <xliff:g id="HOURS">%2$s</xliff:g> y <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"La alarma sonará en <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> y <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 día"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> días"</string>
+    <string name="hour" msgid="2546819039651509323">"1 hora"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> horas"</string>
+    <string name="minute" msgid="2486157997434653710">"1 minuto"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> minutos"</string>
+    <string name="every_day" msgid="1058994798884544691">"todos los días"</string>
+    <string name="never" msgid="54104287800571769">"Nunca"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Selecciona el reloj que quieras ver."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Reloj analógico"</string>
+    <string name="settings" msgid="5849739030579520686">"Configuración"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarma en modo silencio"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Reproducir alarma aunque el teléfono esté en modo silencio"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Repetición de alarmas"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutos"</item>
+    <item msgid="5294206441496024610">"10 minutos"</item>
+    <item msgid="2165904039211935470">"15 minutos"</item>
+    <item msgid="7248236967714374250">"20 minutos"</item>
+    <item msgid="738394723625179423">"25 minutos"</item>
+    <item msgid="1180222611308391616">"30 minutos"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Hecho"</string>
+    <string name="revert" msgid="9100911171235162926">"Revertir"</string>
+    <string name="delete" msgid="5732434972457000541">"Eliminar"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volumen de alarma"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Establecer el volumen de las alarmas"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencio"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Elige si deseas posponer o descartar esta alarma."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (pospuesta)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"La alarma sonará a las <xliff:g id="TIME">%s</xliff:g>. Selecciona la opción para cancelarla."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Comportamiento de los botones laterales"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Establecer el comportamiento deseado de los botones laterales cuando se pulsan durante una alarma"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Ninguno"</item>
+    <item msgid="7111908302622811168">"Posponer"</item>
+    <item msgid="8573552194573068996">"Descartar"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarmas"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galería"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Música"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Atenuar"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Página principal"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Reloj"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"La información meteorológica no está disponible."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Configuración del conector"</string>
+</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
new file mode 100644 (file)
index 0000000..8027073
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Horloge"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarmes"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Ajouter alarme"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Horloge de bureau"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Modifier l\'alarme"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Supprimer l\'alarme"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Activer l\'alarme"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Désactiver l\'alarme"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Cette alarme va être supprimée."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Afficher l\'horloge"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Masquer l\'horloge"</string>
+    <string name="label" msgid="162189613902857319">"Libellé"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarme"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Régler l\'alarme"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibreur"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Répéter"</string>
+    <string name="alert" msgid="6539852766423700221">"Sonnerie"</string>
+    <string name="time" msgid="8067216534232296518">"Heure"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Quitter"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarme interrompue après <xliff:g id="MINUTES">%d</xliff:g> minutes"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Répéter"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Répétition dans <xliff:g id="MINUTES">%d</xliff:g> minutes."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Prochaine alarme dans moins d\'une minute."</item>
+    <item msgid="7110525731259629055">"Prochaine alarme dans <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"Prochaine alarme dans <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"Prochaine alarme dans <xliff:g id="DAYS">%1$s</xliff:g> et <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"Prochaine alarme dans <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"Prochaine alarme dans <xliff:g id="DAYS">%1$s</xliff:g> et <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"Prochaine alarme dans <xliff:g id="HOURS">%2$s</xliff:g> et <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"Prochaine alarme dans <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> et <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 jour"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> jours"</string>
+    <string name="hour" msgid="2546819039651509323">"1 heure"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> heures"</string>
+    <string name="minute" msgid="2486157997434653710">"1 minute"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> minutes"</string>
+    <string name="every_day" msgid="1058994798884544691">"Tous les jours"</string>
+    <string name="never" msgid="54104287800571769">"Jamais"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Sélectionnez une horloge à afficher."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Horloge analogique"</string>
+    <string name="settings" msgid="5849739030579520686">"Paramètres"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarme mode silencieux"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Faire sonner l\'alarme même lorsque le téléphone est en mode silencieux"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Répéter après"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutes"</item>
+    <item msgid="5294206441496024610">"10 minutes"</item>
+    <item msgid="2165904039211935470">"15 minutes"</item>
+    <item msgid="7248236967714374250">"20 minutes"</item>
+    <item msgid="738394723625179423">"25 minutes"</item>
+    <item msgid="1180222611308391616">"30 minutes"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Terminé"</string>
+    <string name="revert" msgid="9100911171235162926">"Annuler"</string>
+    <string name="delete" msgid="5732434972457000541">"Supprimer"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volume"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Définir le volume des alarmes"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencieuse"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Choisissez de répéter ou de désactiver cette alarme."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (répétition)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Prochaine alarme dans <xliff:g id="TIME">%s</xliff:g>. Sélectionnez l\'option appropriée pour annuler."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Action du bouton latéral"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Définir les actions des boutons latéraux lors d\'une alarme"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Aucune"</item>
+    <item msgid="7111908302622811168">"Répéter"</item>
+    <item msgid="8573552194573068996">"Désactiver"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarmes"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galerie"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Musique"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Assombrir"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Lanceur"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Affichage de l\'horloge"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"La météo n\'est pas disponible pour le moment."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Paramètres de la base"</string>
+</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
new file mode 100644 (file)
index 0000000..708e8fd
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Orologio"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Sveglia"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Aggiungi allarme"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Orologio da tavolo"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Modifica allarme"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Elimina allarme"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Attiva allarme"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Disattiva allarme"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Questa sveglia verrà eliminata."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Mostra orologio"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Nascondi orologio"</string>
+    <string name="label" msgid="162189613902857319">"Etichetta"</string>
+    <string name="default_label" msgid="5590025289805630372">"Allarme"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Imposta allarme"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrazione"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Ripeti"</string>
+    <string name="alert" msgid="6539852766423700221">"Suoneria"</string>
+    <string name="time" msgid="8067216534232296518">"Ora"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Spegni"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Tono allarme disattivato dopo <xliff:g id="MINUTES">%d</xliff:g> minuti"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Posponi"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Sospensione per <xliff:g id="MINUTES">%d</xliff:g> minuti."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"L\'allarme sarà attivato fra meno di 1 minuto."</item>
+    <item msgid="7110525731259629055">"L\'allarme sarà attivato fra <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"L\'allarme sarà attivato fra <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"L\'allarme sarà attivato fra <xliff:g id="DAYS">%1$s</xliff:g> e <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"L\'allarme sarà attivato fra <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"L\'allarme sarà attivato fra <xliff:g id="DAYS">%1$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"L\'allarme sarà attivato fra <xliff:g id="HOURS">%2$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"L\'allarme sarà attivato fra <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 giorno"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> giorni"</string>
+    <string name="hour" msgid="2546819039651509323">"1 ora"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> ore"</string>
+    <string name="minute" msgid="2486157997434653710">"1 minuto"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> minuti"</string>
+    <string name="every_day" msgid="1058994798884544691">"Ogni giorno"</string>
+    <string name="never" msgid="54104287800571769">"Mai"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Seleziona un orologio."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Orologio analogico"</string>
+    <string name="settings" msgid="5849739030579520686">"Impostazioni"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Allarme in mod. silenz."</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Riproduci allarme anche con telefono in modalità silenziosa"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Durata sospensione"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minuti"</item>
+    <item msgid="5294206441496024610">"10 minuti"</item>
+    <item msgid="2165904039211935470">"15 minuti"</item>
+    <item msgid="7248236967714374250">"20 minuti"</item>
+    <item msgid="738394723625179423">"25 minuti"</item>
+    <item msgid="1180222611308391616">"30 minuti"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Fine"</string>
+    <string name="revert" msgid="9100911171235162926">"Annulla modifiche"</string>
+    <string name="delete" msgid="5732434972457000541">"Elimina"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volume allarme"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Imposta il volume degli allarmi"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silenzioso"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Seleziona per sospendere o eliminare questo allarme."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (sospeso)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"L\'allarme sarà attivato alle <xliff:g id="TIME">%s</xliff:g>. Seleziona per annullare."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Comp. pulsante laterale"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Imposta il comport. dei puls. laterali quando vengono premuti durante un allarme"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Nessuno"</item>
+    <item msgid="7111908302622811168">"Sospendi"</item>
+    <item msgid="8573552194573068996">"Elimina"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Sveglia"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galleria"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Musica"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Abbassa"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Visualizzazione orologio"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Informazioni meteo attualmente non disponibili."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Impostazioni dock"</string>
+</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
new file mode 100644 (file)
index 0000000..e055121
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"時計"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"アラーム"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"アラームの設定"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"卓上時計"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"アラームを編集"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"アラームを削除"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"アラームをオンにする"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"アラームをオフにする"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"このアラームを削除します。"</string>
+    <string name="show_clock" msgid="8358759982675616915">"時計を表示"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"時計を隠す"</string>
+    <string name="label" msgid="162189613902857319">"ラベル"</string>
+    <string name="default_label" msgid="5590025289805630372">"アラーム"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"アラームを設定"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"バイブレーション"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"繰り返し"</string>
+    <string name="alert" msgid="6539852766423700221">"アラーム音"</string>
+    <string name="time" msgid="8067216534232296518">"時刻"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"停止"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"アラームは<xliff:g id="MINUTES">%d</xliff:g>分間鳴って止まりました"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"スヌーズ"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"<xliff:g id="MINUTES">%d</xliff:g>分後に再通知します"</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"アラームは今から1分以内に設定されています。"</item>
+    <item msgid="7110525731259629055">"アラームは<xliff:g id="DAYS">%1$s</xliff:g>後に設定されています。"</item>
+    <item msgid="7003982794086186185">"アラームは<xliff:g id="HOURS">%2$s</xliff:g>後に設定されています。"</item>
+    <item msgid="7311021123230077742">"アラームは<xliff:g id="DAYS">%1$s</xliff:g>と<xliff:g id="HOURS">%2$s</xliff:g>後に設定されています。"</item>
+    <item msgid="8431715191823114872">"アラームは<xliff:g id="MINUTES">%3$s</xliff:g>後に設定されています。"</item>
+    <item msgid="3244151088673185428">"アラームは<xliff:g id="DAYS">%1$s</xliff:g>と<xliff:g id="MINUTES">%3$s</xliff:g>後に設定されています。"</item>
+    <item msgid="3663661342600168814">"アラームは<xliff:g id="HOURS">%2$s</xliff:g><xliff:g id="MINUTES">%3$s</xliff:g>後に設定されています。"</item>
+    <item msgid="7779544127785487304">"アラームは<xliff:g id="DAYS">%1$s</xliff:g>と<xliff:g id="HOURS">%2$s</xliff:g><xliff:g id="MINUTES">%3$s</xliff:g>後に設定されています。"</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1日"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g>日"</string>
+    <string name="hour" msgid="2546819039651509323">"1時間"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g>時間"</string>
+    <string name="minute" msgid="2486157997434653710">"1分"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g>分"</string>
+    <string name="every_day" msgid="1058994798884544691">"毎日"</string>
+    <string name="never" msgid="54104287800571769">"繰り返しなし"</string>
+    <string name="day_concat" msgid="971998564991636532">"、 "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"表示する時計を選択してください。"</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"アナログ時計"</string>
+    <string name="settings" msgid="5849739030579520686">"設定"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"マナーモード中のアラーム"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"マナーモード中もアラームを鳴らす"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"スヌーズ間隔"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5分"</item>
+    <item msgid="5294206441496024610">"10分"</item>
+    <item msgid="2165904039211935470">"15分"</item>
+    <item msgid="7248236967714374250">"20分"</item>
+    <item msgid="738394723625179423">"25分"</item>
+    <item msgid="1180222611308391616">"30分"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"完了"</string>
+    <string name="revert" msgid="9100911171235162926">"キャンセル"</string>
+    <string name="delete" msgid="5732434972457000541">"削除"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"アラームの音量"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"アラームの音量を設定します"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"マナーモード"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"アラームのスヌーズ/解除を選択します。"</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g>(スヌーズ)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"アラームは<xliff:g id="TIME">%s</xliff:g>に設定されています。選択すると解除されます。"</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"サイドボタンの動作"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"アラームが鳴っているときにサイドボタンを押した場合の動作を設定します"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"なし"</item>
+    <item msgid="7111908302622811168">"スヌーズ"</item>
+    <item msgid="8573552194573068996">"解除"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"アラーム"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"ギャラリー"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"音楽"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"暗くする"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"ランチャー"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"時計のディスプレイ"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"天気予報は現在ご利用いただけません。"</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"ドックの設定"</string>
+</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
new file mode 100644 (file)
index 0000000..2062993
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"시계"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"알람"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"알람 추가"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"탁상 시계"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"알람 수정"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"알람 삭제"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"알람 켜기"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"알람 끄기"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"알람이 삭제됩니다."</string>
+    <string name="show_clock" msgid="8358759982675616915">"시계 표시"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"시계 숨기기"</string>
+    <string name="label" msgid="162189613902857319">"라벨"</string>
+    <string name="default_label" msgid="5590025289805630372">"알람"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"알람 설정"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"진동"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"반복"</string>
+    <string name="alert" msgid="6539852766423700221">"벨소리"</string>
+    <string name="time" msgid="8067216534232296518">"시간"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"해제"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"<xliff:g id="MINUTES">%d</xliff:g>분 후 알람이 중지됨"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"다시 울림"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"<xliff:g id="MINUTES">%d</xliff:g>분 동안 알람 일시 중지"</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"지금부터 1분 미만 후로 알람이 설정됩니다."</item>
+    <item msgid="7110525731259629055">"지금부터 <xliff:g id="DAYS">%1$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="7003982794086186185">"지금부터 <xliff:g id="HOURS">%2$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="7311021123230077742">"지금부터 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="HOURS">%2$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="8431715191823114872">"지금부터 <xliff:g id="MINUTES">%3$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="3244151088673185428">"지금부터 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="3663661342600168814">"지금부터 <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g> 후로 알람이 설정됩니다."</item>
+    <item msgid="7779544127785487304">"지금부터 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g> 후로 알람이 설정됩니다."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1일"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g>일"</string>
+    <string name="hour" msgid="2546819039651509323">"1시간"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g>시간"</string>
+    <string name="minute" msgid="2486157997434653710">"1분"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g>분"</string>
+    <string name="every_day" msgid="1058994798884544691">"매일"</string>
+    <string name="never" msgid="54104287800571769">"반복 안함"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"표시할 시계를 선택하세요."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"아날로그 시계"</string>
+    <string name="settings" msgid="5849739030579520686">"설정"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"무음 모드로 알람 설정"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"무음 모드에서도 알람이 울리도록 설정"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"다시 울림 간격"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5분"</item>
+    <item msgid="5294206441496024610">"10분"</item>
+    <item msgid="2165904039211935470">"15분"</item>
+    <item msgid="7248236967714374250">"20분"</item>
+    <item msgid="738394723625179423">"25분"</item>
+    <item msgid="1180222611308391616">"30분"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"완료"</string>
+    <string name="revert" msgid="9100911171235162926">"되돌리기"</string>
+    <string name="delete" msgid="5732434972457000541">"삭제"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"알람 볼륨"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"알람 볼륨 설정"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"무음"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"알람을 일시 중지하거나 해제하려면 선택하세요."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g>(알람 일시 중지됨)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"<xliff:g id="TIME">%s</xliff:g> 후로 알람이 설정되었습니다. 취소하려면 선택하세요."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"사이드 버튼 동작"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"알람이 울리는 동안 사이드 버튼을 눌렀을 때의 동작 설정"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"없음"</item>
+    <item msgid="7111908302622811168">"다시 울림"</item>
+    <item msgid="8573552194573068996">"취소"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"알람"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"갤러리"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"음악"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"낮추기"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"시계 디스플레이"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"현재 날씨 정보를 사용할 수 없습니다."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"도킹 설정"</string>
+</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
new file mode 100644 (file)
index 0000000..df9fbd7
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Klokke"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarmer"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Legg til alarm"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Skrivebordsklokke"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Rediger alarm"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Slett alarm"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Slå på alarm"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Slå av alarm"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Denne alarmen vil bli slettet."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Vis klokke"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Skjul klokke"</string>
+    <string name="label" msgid="162189613902857319">"Etikett"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Sett alarm"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrer"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Gjenta"</string>
+    <string name="alert" msgid="6539852766423700221">"Ringetone"</string>
+    <string name="time" msgid="8067216534232296518">"Tidspunkt"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Slå av"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarmen ble slått av etter <xliff:g id="MINUTES">%d</xliff:g> minutter"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Slumre"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Slumrer i <xliff:g id="MINUTES">%d</xliff:g> minutter."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Alarmen ringer om mindre enn ett minutt."</item>
+    <item msgid="7110525731259629055">"Alarmen ringer om <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"Alarmen ringer om <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"Alarmen ringer om <xliff:g id="DAYS">%1$s</xliff:g> og <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"Alarmen ringer om <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"Alarmen ringer om <xliff:g id="DAYS">%1$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"Alarmen ringer om <xliff:g id="HOURS">%2$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"Alarmen ringer om <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> og <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 dag"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dager"</string>
+    <string name="hour" msgid="2546819039651509323">"1 time"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> timer"</string>
+    <string name="minute" msgid="2486157997434653710">"1 minutt"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> minutter"</string>
+    <string name="every_day" msgid="1058994798884544691">"hver dag"</string>
+    <string name="never" msgid="54104287800571769">"Aldri"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Velg klokken som skal vises."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Analog klokke"</string>
+    <string name="settings" msgid="5849739030579520686">"Innstillinger"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm i stillemodus"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Spill alarm selv når telefonen er i stillemodus"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Slumrevarighet"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutter"</item>
+    <item msgid="5294206441496024610">"10 minutter"</item>
+    <item msgid="2165904039211935470">"15 minutter"</item>
+    <item msgid="7248236967714374250">"20 minutter"</item>
+    <item msgid="738394723625179423">"25 minutter"</item>
+    <item msgid="1180222611308391616">"30 minutter"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"OK"</string>
+    <string name="revert" msgid="9100911171235162926">"Tilbakestill"</string>
+    <string name="delete" msgid="5732434972457000541">"Slett"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Alarmvolum"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Still inn volumet på alarmer"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Stille"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Velg å slumre eller slå av alarmen"</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (slumre)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarmen er innstilt på <xliff:g id="TIME">%s</xliff:g>. Velg for å avbryte."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Sideknappfunksjon"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Angi hvilken funksjon du vil at sideknappene skal ha når de trykkes på under en alarm"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Ingen"</item>
+    <item msgid="7111908302622811168">"Slumre"</item>
+    <item msgid="8573552194573068996">"Slå av"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarmer"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galleri"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Musikk"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Demp"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Hjem"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Klokkeskjerm"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Værinformasjonen er for øyeblikket ikke tilgjengelig."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Innstillinger for forankringsstasjon"</string>
+</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
new file mode 100644 (file)
index 0000000..527d9bc
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Klok"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarmen"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Alarm toevoegen"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Bureauklok"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Alarm bewerken"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Alarm verwijderen"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Alarm inschakelen"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Alarm uitschakelen"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Dit alarm wordt verwijderd."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Klok weergeven"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Klok verbergen"</string>
+    <string name="label" msgid="162189613902857319">"Label"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Alarm instellen"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Trillen"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Herhalen"</string>
+    <string name="alert" msgid="6539852766423700221">"Beltoon"</string>
+    <string name="time" msgid="8067216534232296518">"Tijd"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Negeren"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarm gaat uit na <xliff:g id="MINUTES">%d</xliff:g> minuten"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Snooze"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Snooze is ingesteld op <xliff:g id="MINUTES">%d</xliff:g> minuten."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Dit alarm is ingesteld voor minder dan 1 minuut vanaf nu."</item>
+    <item msgid="7110525731259629055">"Dit alarm is ingesteld voor <xliff:g id="DAYS">%1$s</xliff:g> vanaf nu."</item>
+    <item msgid="7003982794086186185">"Dit alarm is ingesteld voor <xliff:g id="HOURS">%2$s</xliff:g> vanaf nu."</item>
+    <item msgid="7311021123230077742">"Dit alarm is ingesteld voor <xliff:g id="DAYS">%1$s</xliff:g> en <xliff:g id="HOURS">%2$s</xliff:g> vanaf nu."</item>
+    <item msgid="8431715191823114872">"Dit alarm is ingesteld voor <xliff:g id="MINUTES">%3$s</xliff:g> vanaf nu."</item>
+    <item msgid="3244151088673185428">"Dit alarm is ingesteld voor <xliff:g id="DAYS">%1$s</xliff:g> en <xliff:g id="MINUTES">%3$s</xliff:g> vanaf nu."</item>
+    <item msgid="3663661342600168814">"Dit alarm is ingesteld voor <xliff:g id="HOURS">%2$s</xliff:g> en <xliff:g id="MINUTES">%3$s</xliff:g> vanaf nu."</item>
+    <item msgid="7779544127785487304">"Dit alarm is ingesteld voor <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> en <xliff:g id="MINUTES">%3$s</xliff:g> vanaf nu."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 dag"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dagen"</string>
+    <string name="hour" msgid="2546819039651509323">"1 uur"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> uur"</string>
+    <string name="minute" msgid="2486157997434653710">"1 minuut"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> minuten"</string>
+    <string name="every_day" msgid="1058994798884544691">"elke dag"</string>
+    <string name="never" msgid="54104287800571769">"Nooit"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Selecteer een klok die u wilt weergeven."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Analoge klok"</string>
+    <string name="settings" msgid="5849739030579520686">"Instellingen"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm in stille modus"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Alarm afspelen, zelfs als stille modus van telefoon is geactiveerd"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Snooze-duur"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minuten"</item>
+    <item msgid="5294206441496024610">"10 minuten"</item>
+    <item msgid="2165904039211935470">"15 minuten"</item>
+    <item msgid="7248236967714374250">"20 minuten"</item>
+    <item msgid="738394723625179423">"25 minuten"</item>
+    <item msgid="1180222611308391616">"30 minuten"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Gereed"</string>
+    <string name="revert" msgid="9100911171235162926">"Terugzetten"</string>
+    <string name="delete" msgid="5732434972457000541">"Verwijderen"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Alarmvolume"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Het volume van het alarm instellen"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Stil"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Selecteer of u snooze wilt selecteren voor dit alarm of het alarm wilt negeren."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (snooze aan)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarm is ingesteld voor <xliff:g id="TIME">%s</xliff:g>. Selecteer om te annuleren."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Gedrag van zijknop"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Stel het gewenste gedrag van de zijknoppen in wanneer hierop wordt gedrukt tijdens een alarm"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Geen"</item>
+    <item msgid="7111908302622811168">"Snooze"</item>
+    <item msgid="8573552194573068996">"Negeren"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarmen"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galerij"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Muziek"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Dimmen"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Klokweergave"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Er is momenteel geen weerbericht beschikbaar."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Instellingen voor dockstation"</string>
+</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
new file mode 100644 (file)
index 0000000..0f3c878
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Zegar"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarmy"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Dodaj alarm"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Zegar biurkowy"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Edytuj alarm"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Usuń alarm"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Włącz alarm"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Wyłącz alarm"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Ten zegar zostanie usunięty."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Pokaż zegar"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Ukryj zegar"</string>
+    <string name="label" msgid="162189613902857319">"Etykieta"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Ustaw alarm"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Wibracje"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Powtarzanie"</string>
+    <string name="alert" msgid="6539852766423700221">"Dzwonek"</string>
+    <string name="time" msgid="8067216534232296518">"Godzina"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Zamknij"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarm jest wyciszany po <xliff:g id="MINUTES">%d</xliff:g> min."</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Drzemka"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Drzemka przez <xliff:g id="MINUTES">%d</xliff:g> min."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Ten alarm włączy się za mniej niż 1 minutę."</item>
+    <item msgid="7110525731259629055">"Ten alarm włączy się za <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"Ten alarm włączy się za <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"Ten alarm włączy się za <xliff:g id="DAYS">%1$s</xliff:g> i <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"Ten alarm włączy się za <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"Ten alarm włączy się za <xliff:g id="DAYS">%1$s</xliff:g> i <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"Ten alarm włączy się za <xliff:g id="HOURS">%2$s</xliff:g> i <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"Ten alarm włączy się za <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> i <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 dzień"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dni"</string>
+    <string name="hour" msgid="2546819039651509323">"1 godz."</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> godz."</string>
+    <string name="minute" msgid="2486157997434653710">"1 min"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> min"</string>
+    <string name="every_day" msgid="1058994798884544691">"codziennie"</string>
+    <string name="never" msgid="54104287800571769">"Nigdy"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Wybierz wyświetlany zegar."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Zegar analogowy"</string>
+    <string name="settings" msgid="5849739030579520686">"Ustawienia"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm w trybie cichym"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Odtwórz alarm, nawet gdy telefon jest w trybie cichym"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Czas uśpienia"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minut"</item>
+    <item msgid="5294206441496024610">"10 minut"</item>
+    <item msgid="2165904039211935470">"15 minut"</item>
+    <item msgid="7248236967714374250">"20 minut"</item>
+    <item msgid="738394723625179423">"25 minut"</item>
+    <item msgid="1180222611308391616">"30 minut"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Gotowe"</string>
+    <string name="revert" msgid="9100911171235162926">"Przywróć"</string>
+    <string name="delete" msgid="5732434972457000541">"Usuń"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Głośność alarmu"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Ustaw głośność alarmów"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Cichy"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Wybierz, czy uśpić, czy też zamknąć ten alarm."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (uśpiony)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarm ustawiony na godzinę <xliff:g id="TIME">%s</xliff:g>. Wybierz, aby anulować."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Działanie bocznego przycisku"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Ustaw żądane działanie bocznych przycisków przy naciśnięciu podczas alarmu"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Brak"</item>
+    <item msgid="7111908302622811168">"Uśpij"</item>
+    <item msgid="8573552194573068996">"Zamknij"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarmy"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galeria"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Muzyka"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Przyciemnij"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Program uruchamiający"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Wyświetlanie zegara"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Informacje pogodowe są aktualnie niedostępne."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Ustawienia podstawki"</string>
+</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
new file mode 100644 (file)
index 0000000..07df86f
--- /dev/null
@@ -0,0 +1,118 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Relógio"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarmes"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Adicionar alarme"</string>
+    <!-- no translation found for menu_desk_clock (3241995064554071588) -->
+    <skip />
+    <!-- no translation found for menu_edit_alarm (7204602994918829751) -->
+    <skip />
+    <string name="delete_alarm" msgid="3457780990646206817">"Eliminar alarme"</string>
+    <!-- no translation found for enable_alarm (1834599140632142536) -->
+    <skip />
+    <!-- no translation found for disable_alarm (5889378670229554109) -->
+    <skip />
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Este alarme será eliminado."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Mostrar relógio"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Ocultar relógio"</string>
+    <string name="label" msgid="162189613902857319">"Etiqueta"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarme"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Definir alarme"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrar"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
+    <string name="alert" msgid="6539852766423700221">"Toque"</string>
+    <string name="time" msgid="8067216534232296518">"Hora"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Ignorar"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarme silenciado após <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Suspender"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Suspenso por <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Este alarme dispara daqui a menos de um minuto."</item>
+    <item msgid="7110525731259629055">"Este alarme dispara daqui a <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"Este alarme dispara daqui a <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"Este alarme dispara daqui a <xliff:g id="DAYS">%1$s</xliff:g> e <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"Este alarme dispara daqui a <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"Este alarme dispara daqui a <xliff:g id="DAYS">%1$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"Este alarme dispara daqui a <xliff:g id="HOURS">%2$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"Este alarme dispara daqui a <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 dia"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dias"</string>
+    <string name="hour" msgid="2546819039651509323">"1 hora"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> horas"</string>
+    <string name="minute" msgid="2486157997434653710">"1 minuto"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> minutos"</string>
+    <string name="every_day" msgid="1058994798884544691">"todos os dias"</string>
+    <string name="never" msgid="54104287800571769">"Nunca"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Seleccione um relógio para visualizar."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Relógio analógico"</string>
+    <string name="settings" msgid="5849739030579520686">"Definições"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarme em modo silencioso"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Fazer soar o alarme mesmo com o telefone em modo silencioso"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Duração da suspensão"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutos"</item>
+    <item msgid="5294206441496024610">"10 minutos"</item>
+    <item msgid="2165904039211935470">"15 minutos"</item>
+    <item msgid="7248236967714374250">"20 minutos"</item>
+    <item msgid="738394723625179423">"25 minutos"</item>
+    <item msgid="1180222611308391616">"30 minutos"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Concluído"</string>
+    <string name="revert" msgid="9100911171235162926">"Reverter"</string>
+    <!-- no translation found for delete (5732434972457000541) -->
+    <skip />
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volume do alarme"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Definir o volume dos alarmes"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencioso"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Seleccionar suspender ou ignorar este alarme."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (suspenso)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarme definido para a(s) <xliff:g id="TIME">%s</xliff:g>. Seleccione para cancelar."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Comportamento do botão lateral"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Definir o comportamento pretendido dos botões laterais quando premidos durante um alarme"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Nenhum"</item>
+    <item msgid="7111908302622811168">"Suspender"</item>
+    <item msgid="8573552194573068996">"Ignorar"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarmes"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galeria"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Música"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Esbater"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <!-- no translation found for desk_clock_button_description (968868045496561043) -->
+    <skip />
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <!-- no translation found for weather_fetch_failure (7517010911981312358) -->
+    <skip />
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Definições da estação de ancoragem"</string>
+</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
new file mode 100644 (file)
index 0000000..84b3b0c
--- /dev/null
@@ -0,0 +1,118 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Relógio"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarmes"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Adicionar alarme"</string>
+    <!-- no translation found for menu_desk_clock (3241995064554071588) -->
+    <skip />
+    <!-- no translation found for menu_edit_alarm (7204602994918829751) -->
+    <skip />
+    <string name="delete_alarm" msgid="3457780990646206817">"Excluir alarme"</string>
+    <!-- no translation found for enable_alarm (1834599140632142536) -->
+    <skip />
+    <!-- no translation found for disable_alarm (5889378670229554109) -->
+    <skip />
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Este alarme será excluído."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Mostrar relógio"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Ocultar relógio"</string>
+    <string name="label" msgid="162189613902857319">"Marcador"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarme"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Definir alarme"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrar"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
+    <string name="alert" msgid="6539852766423700221">"Toque"</string>
+    <string name="time" msgid="8067216534232296518">"Horário"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Encerrar"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarme silenciado após <xliff:g id="MINUTES">%d</xliff:g> minutos"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Colocar em modo de espera"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Em espera por <xliff:g id="MINUTES">%d</xliff:g> minutos."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Este alarme está definido para menos de um minuto a partir de agora."</item>
+    <item msgid="7110525731259629055">"Este alarme está definido para <xliff:g id="DAYS">%1$s</xliff:g> a partir de agora."</item>
+    <item msgid="7003982794086186185">"Este alarme está definido para <xliff:g id="HOURS">%2$s</xliff:g> a partir de agora."</item>
+    <item msgid="7311021123230077742">"Este alarme está definido para <xliff:g id="DAYS">%1$s</xliff:g> e <xliff:g id="HOURS">%2$s</xliff:g> a partir de agora."</item>
+    <item msgid="8431715191823114872">"Este alarme está definido para <xliff:g id="MINUTES">%3$s</xliff:g> a partir de agora."</item>
+    <item msgid="3244151088673185428">"Este alarme está definido para <xliff:g id="DAYS">%1$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g> a partir de agora."</item>
+    <item msgid="3663661342600168814">"Este alarme está definido para <xliff:g id="HOURS">%2$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g> a partir de agora."</item>
+    <item msgid="7779544127785487304">"Este alarme está definido para <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> e <xliff:g id="MINUTES">%3$s</xliff:g> a partir de agora."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 dia"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dias"</string>
+    <string name="hour" msgid="2546819039651509323">"1 hora"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> horas"</string>
+    <string name="minute" msgid="2486157997434653710">"1 minuto"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> minutos"</string>
+    <string name="every_day" msgid="1058994798884544691">"todos os dias"</string>
+    <string name="never" msgid="54104287800571769">"Nunca"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Selecione um relógio para exibir."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Relógio analógico"</string>
+    <string name="settings" msgid="5849739030579520686">"Configurações"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Modo silencioso"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Tocar o alarme mesmo quando o telefone estiver no modo silencioso"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Duração do modo de espera"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minutos"</item>
+    <item msgid="5294206441496024610">"10 minutos"</item>
+    <item msgid="2165904039211935470">"15 minutos"</item>
+    <item msgid="7248236967714374250">"20 minutos"</item>
+    <item msgid="738394723625179423">"25 minutos"</item>
+    <item msgid="1180222611308391616">"30 minutos"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Concluído"</string>
+    <string name="revert" msgid="9100911171235162926">"Reverter"</string>
+    <!-- no translation found for delete (5732434972457000541) -->
+    <skip />
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Volume do alarme"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Definir o volume dos alarmes"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencioso"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Selecione para colocar esse alarme em modo de espera ou descartá-lo."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (em modo de espera)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarme definido para <xliff:g id="TIME">%s</xliff:g>. Selecione para cancelar."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Comportamento do botão lateral"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Defina o comportamento desejado dos botões laterais quando pressionados durante um alarme"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Nenhuma"</item>
+    <item msgid="7111908302622811168">"Colocar em modo de espera"</item>
+    <item msgid="8573552194573068996">"Descartar"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarmes"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galeria"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Música"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Escurecer"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <!-- no translation found for desk_clock_button_description (968868045496561043) -->
+    <skip />
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <!-- no translation found for weather_fetch_failure (7517010911981312358) -->
+    <skip />
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Configurações de dock"</string>
+</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
new file mode 100644 (file)
index 0000000..6b767a0
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Часы"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Будильник"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Добавить будильник"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Настольные часы"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Изменить настройки будильника"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Удалить будильник"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Включить будильник"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Выключить будильник"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Сигнал будет удален."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Показать часы"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Спрятать часы"</string>
+    <string name="label" msgid="162189613902857319">"Ярлык"</string>
+    <string name="default_label" msgid="5590025289805630372">"Будильник"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Установить будильник"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Вибросигнал"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Повтор"</string>
+    <string name="alert" msgid="6539852766423700221">"Мелодия"</string>
+    <string name="time" msgid="8067216534232296518">"Время"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Игнорировать"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Будильник выключился спустя <xliff:g id="MINUTES">%d</xliff:g> мин."</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Спящий режим"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Отсрочка будильника на <xliff:g id="MINUTES">%d</xliff:g> мин."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"До срабатывания будильника осталось меньше одной минуты."</item>
+    <item msgid="7110525731259629055">"Будильник зазвонит через <xliff:g id="DAYS">%1$s</xliff:g>."</item>
+    <item msgid="7003982794086186185">"Будильник зазвонит через <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="7311021123230077742">"Будильник зазвонит через <xliff:g id="DAYS">%1$s</xliff:g> и <xliff:g id="HOURS">%2$s</xliff:g>."</item>
+    <item msgid="8431715191823114872">"Будильник зазвонит через <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3244151088673185428">"Будильник зазвонит через <xliff:g id="DAYS">%1$s</xliff:g> и <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="3663661342600168814">"Будильник зазвонит через <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+    <item msgid="7779544127785487304">"Будильник зазвонит через <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> и <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 день"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> дн."</string>
+    <string name="hour" msgid="2546819039651509323">"1 час"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> ч."</string>
+    <string name="minute" msgid="2486157997434653710">"1 минута"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> мин."</string>
+    <string name="every_day" msgid="1058994798884544691">"каждый день"</string>
+    <string name="never" msgid="54104287800571769">"Никогда"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Выберите вид часов."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Часы со стрелками"</string>
+    <string name="settings" msgid="5849739030579520686">"Настройки"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Будильник в тихом режиме"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Подавать сигнал, даже если телефон работает в тихом режиме"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Продолжительность спящего режима"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 минут"</item>
+    <item msgid="5294206441496024610">"10 минут"</item>
+    <item msgid="2165904039211935470">"15 минут"</item>
+    <item msgid="7248236967714374250">"20 минут"</item>
+    <item msgid="738394723625179423">"25 минут"</item>
+    <item msgid="1180222611308391616">"30 минут"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Готово"</string>
+    <string name="revert" msgid="9100911171235162926">"Отмена"</string>
+    <string name="delete" msgid="5732434972457000541">"Удалить"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Громкость будильника"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Настройка громкости будильника"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Без звука"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Выберите, чтобы включить спящий режим или полностью отключить этот будильник."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (спящий режим)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Будильник зазвонит в <xliff:g id="TIME">%s</xliff:g>. Отменить?"</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Функции боковой кнопки"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Настройка функции боковой кнопки при ее нажатии во время звонка будильника"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Нет"</item>
+    <item msgid="7111908302622811168">"Спящий режим"</item>
+    <item msgid="8573552194573068996">"Отключить"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Будильник"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Фотоальбом"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Музыка"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Затемнить"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Вид часов"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Сейчас информация о погоде недоступна."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Настройки док-станции"</string>
+</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
new file mode 100644 (file)
index 0000000..0f5e9f5
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Klocka"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarm"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Lägg till alarm"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Bordsklocka"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Ändra alarmet"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Ta bort alarm"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Aktivera alarmet"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Inaktivera alarmet"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Alarmet tas bort."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Visa klocka"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Dölj klocka"</string>
+    <string name="label" msgid="162189613902857319">"Etikett"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Ställ alarm"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Vibrera"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Upprepa"</string>
+    <string name="alert" msgid="6539852766423700221">"Ringsignal"</string>
+    <string name="time" msgid="8067216534232296518">"Tid"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Ignorera"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"Alarmet tystnar efter <xliff:g id="MINUTES">%d</xliff:g> minuter"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Snooze"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"Snoozar i <xliff:g id="MINUTES">%d</xliff:g> minuter."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Alarmet ringer om mindre än 1 minut från och med nu."</item>
+    <item msgid="7110525731259629055">"Alarmet ringer om <xliff:g id="DAYS">%1$s</xliff:g> från och med nu."</item>
+    <item msgid="7003982794086186185">"Alarmet ringer om <xliff:g id="HOURS">%2$s</xliff:g> från och med nu."</item>
+    <item msgid="7311021123230077742">"Alarmet ringer om <xliff:g id="DAYS">%1$s</xliff:g> och <xliff:g id="HOURS">%2$s</xliff:g> från och med nu."</item>
+    <item msgid="8431715191823114872">"Alarmet ringer om <xliff:g id="MINUTES">%3$s</xliff:g> från och med nu."</item>
+    <item msgid="3244151088673185428">"Alarmet ringer om <xliff:g id="DAYS">%1$s</xliff:g> och <xliff:g id="MINUTES">%3$s</xliff:g> från och med nu."</item>
+    <item msgid="3663661342600168814">"Alarmet ringer om <xliff:g id="HOURS">%2$s</xliff:g> och <xliff:g id="MINUTES">%3$s</xliff:g> från och med nu."</item>
+    <item msgid="7779544127785487304">"Alarmet ringer om <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> och <xliff:g id="MINUTES">%3$s</xliff:g> från och med nu."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 dag"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> dagar"</string>
+    <string name="hour" msgid="2546819039651509323">"1 timme"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> timmar"</string>
+    <string name="minute" msgid="2486157997434653710">"1 minut"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> minuter"</string>
+    <string name="every_day" msgid="1058994798884544691">"Varje dag"</string>
+    <string name="never" msgid="54104287800571769">"Aldrig"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Välj vilken klocka du vill visa."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Analog klocka"</string>
+    <string name="settings" msgid="5849739030579520686">"Inställningar"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Alarm i tyst läge"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Alarm ringer även när telefonen är i tyst läge"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Längd på snooze"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 minuter"</item>
+    <item msgid="5294206441496024610">"10 minuter"</item>
+    <item msgid="2165904039211935470">"15 minuter"</item>
+    <item msgid="7248236967714374250">"20 minuter"</item>
+    <item msgid="738394723625179423">"25 minuter"</item>
+    <item msgid="1180222611308391616">"30 minuter"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Färdig"</string>
+    <string name="revert" msgid="9100911171235162926">"Återgå"</string>
+    <string name="delete" msgid="5732434972457000541">"Ta bort"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Alarmvolym"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Ställ in volym för alarmen"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Tyst"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Snooza eller ta bort alarmet permanent."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (snoozat)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"Alarmet ringer <xliff:g id="TIME">%s</xliff:g>. Välj om du vill avbryta."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Sidoknappens funktion"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Ange önskad funktion för sidoknappen under alarm"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Ingen"</item>
+    <item msgid="7111908302622811168">"Snooze"</item>
+    <item msgid="8573552194573068996">"Ta bort permanent"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarm"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galleri"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Musik"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Dämpa"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Startbild"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Klockvisning"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Väderinfo är inte tillgänglig för tillfället."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Dockningsinställningar"</string>
+</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
new file mode 100644 (file)
index 0000000..707581c
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"Saat"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"Alarmlar"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"Alarm ekle"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"Masa saati"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"Alarmı düzenle"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"Alarmı sil"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"Alarmı aç"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"Alarmı kapat"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"Bu alarm silinecek."</string>
+    <string name="show_clock" msgid="8358759982675616915">"Saati göster"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"Saati gizle"</string>
+    <string name="label" msgid="162189613902857319">"Etiket"</string>
+    <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"Alarmı ayarla"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"Titreşim"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"Tekrarla"</string>
+    <string name="alert" msgid="6539852766423700221">"Zil sesi"</string>
+    <string name="time" msgid="8067216534232296518">"Saat"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Kapat"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"<xliff:g id="MINUTES">%d</xliff:g> dakika sonra alarm susturuldu"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Ertele"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"<xliff:g id="MINUTES">%d</xliff:g> dakika erteleniyor."</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"Bu alarm, şu andan itibaren bir dakikadan kısa süre içinde çalacaktır."</item>
+    <item msgid="7110525731259629055">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="DAYS">%1$s</xliff:g> var."</item>
+    <item msgid="7003982794086186185">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="HOURS">%2$s</xliff:g> var."</item>
+    <item msgid="7311021123230077742">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="DAYS">%1$s</xliff:g> ve <xliff:g id="HOURS">%2$s</xliff:g> var."</item>
+    <item msgid="8431715191823114872">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="MINUTES">%3$s</xliff:g> var."</item>
+    <item msgid="3244151088673185428">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="DAYS">%1$s</xliff:g> ve <xliff:g id="MINUTES">%3$s</xliff:g> var."</item>
+    <item msgid="3663661342600168814">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="HOURS">%2$s</xliff:g> ve <xliff:g id="MINUTES">%3$s</xliff:g> var."</item>
+    <item msgid="7779544127785487304">"Bu alarmın çalmasına şu andan itibaren <xliff:g id="DAYS">%1$s</xliff:g>, <xliff:g id="HOURS">%2$s</xliff:g> ve <xliff:g id="MINUTES">%3$s</xliff:g> var."</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 gün"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> gün"</string>
+    <string name="hour" msgid="2546819039651509323">"1 saat"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> saat"</string>
+    <string name="minute" msgid="2486157997434653710">"1 dakika"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> dakika"</string>
+    <string name="every_day" msgid="1058994798884544691">"her gün"</string>
+    <string name="never" msgid="54104287800571769">"Asla"</string>
+    <string name="day_concat" msgid="971998564991636532">", "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"Görüntülenecek bir saat seçin."</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"Analog saat"</string>
+    <string name="settings" msgid="5849739030579520686">"Ayarlar"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"Sessiz modda alarm çal"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"Telefon sessiz moddayken bile alarm çal"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"Erteleme süresi"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 dakika"</item>
+    <item msgid="5294206441496024610">"10 dakika"</item>
+    <item msgid="2165904039211935470">"15 dakika"</item>
+    <item msgid="7248236967714374250">"20 dakika"</item>
+    <item msgid="738394723625179423">"25 dakika"</item>
+    <item msgid="1180222611308391616">"30 dakika"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"Bitti"</string>
+    <string name="revert" msgid="9100911171235162926">"Geri Döndür"</string>
+    <string name="delete" msgid="5732434972457000541">"Sil"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"Alarm ses düzeyi"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"Alarmların ses düzeyini ayarla"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"Sessiz"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"Ertelemek veya alarmı kapatmak için seçin."</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ertelendi)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"<xliff:g id="TIME">%s</xliff:g> için alarm ayarlandı. İptal etmek için seçin."</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"Yan düğme işlevi"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"Alarm sırasında basıldığında istenen yan düğme işlevini ayarlayın"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"Yok"</item>
+    <item msgid="7111908302622811168">"Ertele"</item>
+    <item msgid="8573552194573068996">"Kapat"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"Alarm çalar"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"Galeri"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"Müzik"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"Loş"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Başlatıcı"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"Saat Görüntüleme"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"Hava durumu bilgileri şu anda mevcut değil."</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"Yuva ayarları"</string>
+</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
new file mode 100644 (file)
index 0000000..e580487
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"时钟"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"闹钟"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"添加闹钟"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"座钟"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"修改闹钟设置"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"取消闹钟"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"启用闹钟"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"停用闹钟"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"将会取消此闹钟。"</string>
+    <string name="show_clock" msgid="8358759982675616915">"显示时钟"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"隐藏时钟"</string>
+    <string name="label" msgid="162189613902857319">"标签"</string>
+    <string name="default_label" msgid="5590025289805630372">"闹钟"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"设置闹钟"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"振动"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"重复"</string>
+    <string name="alert" msgid="6539852766423700221">"铃声"</string>
+    <string name="time" msgid="8067216534232296518">"时间"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"取消"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"闹钟响了 <xliff:g id="MINUTES">%d</xliff:g> 分钟后停止"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"暂停再响"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"暂停 <xliff:g id="MINUTES">%d</xliff:g> 分钟后再响。"</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"已将此闹钟设置为从现在起不到 1 分钟后提醒。"</item>
+    <item msgid="7110525731259629055">"已将此闹钟设置为从现在起 <xliff:g id="DAYS">%1$s</xliff:g>后启动。"</item>
+    <item msgid="7003982794086186185">"已将此闹钟设置为从现在起 <xliff:g id="HOURS">%2$s</xliff:g>后启动。"</item>
+    <item msgid="7311021123230077742">"已将此闹钟设置为从现在起 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="HOURS">%2$s</xliff:g>后启动。"</item>
+    <item msgid="8431715191823114872">"已将此闹钟设置为从现在起 <xliff:g id="MINUTES">%3$s</xliff:g>后启动。"</item>
+    <item msgid="3244151088673185428">"已将此闹钟设置为从现在起 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g>后启动。"</item>
+    <item msgid="3663661342600168814">"已将此闹钟设置为从现在起 <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g>后启动。"</item>
+    <item msgid="7779544127785487304">"已将此闹钟设置为从现在起 <xliff:g id="DAYS">%1$s</xliff:g> <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g>后启动。"</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 天"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> 天"</string>
+    <string name="hour" msgid="2546819039651509323">"1 小时"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> 小时"</string>
+    <string name="minute" msgid="2486157997434653710">"1 分钟"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> 分钟"</string>
+    <string name="every_day" msgid="1058994798884544691">"每天"</string>
+    <string name="never" msgid="54104287800571769">"永不"</string>
+    <string name="day_concat" msgid="971998564991636532">"、 "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"选择要显示的时钟。"</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"模拟时钟"</string>
+    <string name="settings" msgid="5849739030579520686">"设置"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"静音模式下闹钟响"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"手机处于静音模式时,闹钟仍会响"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"再响间隔"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 分钟"</item>
+    <item msgid="5294206441496024610">"10 分钟"</item>
+    <item msgid="2165904039211935470">"15 分钟"</item>
+    <item msgid="7248236967714374250">"20 分钟"</item>
+    <item msgid="738394723625179423">"25 分钟"</item>
+    <item msgid="1180222611308391616">"30 分钟"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"完成"</string>
+    <string name="revert" msgid="9100911171235162926">"还原"</string>
+    <string name="delete" msgid="5732434972457000541">"删除闹钟"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"闹钟音量"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"设置闹钟音量"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"静音"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"选择暂停或关闭此闹钟。"</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g>(已暂停)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"已将此闹钟设置在 <xliff:g id="TIME">%s</xliff:g>启动。选择即可取消。"</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"侧边按钮功用"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"设置侧边按钮在闹钟启动时的功用"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"无"</item>
+    <item msgid="7111908302622811168">"暂停"</item>
+    <item msgid="8573552194573068996">"关闭"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"闹钟"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"图库"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"音乐"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"调暗"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"启动程序"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"时钟显示"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"目前无法提供天气信息。"</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"底座设置"</string>
+</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
new file mode 100644 (file)
index 0000000..efdb870
--- /dev/null
@@ -0,0 +1,111 @@
+<?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.
+-->
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="app_label" msgid="6674495003718166674">"時鐘"</string>
+    <string name="alarm_list_title" msgid="7589940465292950600">"鬧鐘"</string>
+    <string name="add_alarm" msgid="5976616107390962899">"新增鬧鐘"</string>
+    <string name="menu_desk_clock" msgid="3241995064554071588">"桌面時鐘"</string>
+    <string name="menu_edit_alarm" msgid="7204602994918829751">"編輯鬧鐘"</string>
+    <string name="delete_alarm" msgid="3457780990646206817">"刪除鬧鐘"</string>
+    <string name="enable_alarm" msgid="1834599140632142536">"開啟鬧鐘"</string>
+    <string name="disable_alarm" msgid="5889378670229554109">"關閉鬧鐘"</string>
+    <string name="delete_alarm_confirm" msgid="4237696873219106907">"刪除此鬧鐘?"</string>
+    <string name="show_clock" msgid="8358759982675616915">"顯示時鐘"</string>
+    <string name="hide_clock" msgid="3217727306480505694">"隱藏時鐘"</string>
+    <string name="label" msgid="162189613902857319">"標籤"</string>
+    <string name="default_label" msgid="5590025289805630372">"鬧鐘"</string>
+    <string name="set_alarm" msgid="9148359866152726808">"設定鬧鐘"</string>
+    <string name="alarm_vibrate" msgid="3476686921490362230">"震動"</string>
+    <string name="alarm_repeat" msgid="7242985466344233206">"重複"</string>
+    <string name="alert" msgid="6539852766423700221">"鈴聲"</string>
+    <string name="time" msgid="8067216534232296518">"時間"</string>
+    <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"關閉"</string>
+    <string name="alarm_alert_alert_silenced" msgid="7918075929961104202">"鬧鐘 <xliff:g id="MINUTES">%d</xliff:g> 分鐘後靜音"</string>
+    <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"貪睡"</string>
+    <string name="alarm_alert_snooze_set" msgid="656470966696912087">"再貪睡 <xliff:g id="MINUTES">%d</xliff:g> 分鐘。"</string>
+  <string-array name="alarm_set">
+    <item msgid="5163476010406761625">"已將此鬧鐘設為 1 分鐘後啟動。"</item>
+    <item msgid="7110525731259629055">"已將此鬧鐘設為 <xliff:g id="DAYS">%1$s</xliff:g>後啟動。"</item>
+    <item msgid="7003982794086186185">"已將此鬧鐘設為 <xliff:g id="HOURS">%2$s</xliff:g>後啟動。"</item>
+    <item msgid="7311021123230077742">"已將此鬧鐘設為 <xliff:g id="DAYS">%1$s</xliff:g>又 <xliff:g id="HOURS">%2$s</xliff:g>後啟動。"</item>
+    <item msgid="8431715191823114872">"已將此鬧鐘設為 <xliff:g id="MINUTES">%3$s</xliff:g>後啟動。"</item>
+    <item msgid="3244151088673185428">"已將此鬧鐘設為 <xliff:g id="DAYS">%1$s</xliff:g>又 <xliff:g id="MINUTES">%3$s</xliff:g>後啟動。"</item>
+    <item msgid="3663661342600168814">"已將此鬧鐘設為 <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g>後啟動。"</item>
+    <item msgid="7779544127785487304">"已將此鬧鐘設為 <xliff:g id="DAYS">%1$s</xliff:g>又 <xliff:g id="HOURS">%2$s</xliff:g> <xliff:g id="MINUTES">%3$s</xliff:g>後啟動。"</item>
+  </string-array>
+    <string name="day" msgid="7984755014526510295">"1 天"</string>
+    <string name="days" msgid="2070509222727852210">"<xliff:g id="DAYS">%s</xliff:g> 天"</string>
+    <string name="hour" msgid="2546819039651509323">"1 小時"</string>
+    <string name="hours" msgid="2071487018566991613">"<xliff:g id="HOURS">%s</xliff:g> 小時"</string>
+    <string name="minute" msgid="2486157997434653710">"1 分鐘"</string>
+    <string name="minutes" msgid="6115838729146292526">"<xliff:g id="MINUTES">%s</xliff:g> 分鐘"</string>
+    <string name="every_day" msgid="1058994798884544691">"每天"</string>
+    <string name="never" msgid="54104287800571769">"從不"</string>
+    <string name="day_concat" msgid="971998564991636532">"、 "</string>
+    <string name="clock_instructions" msgid="3118560284915857690">"選取要顯示的時鐘。"</string>
+    <string name="analog_gadget" msgid="1670505720837152766">"類比時鐘"</string>
+    <string name="settings" msgid="5849739030579520686">"設定"</string>
+    <string name="alarm_in_silent_mode_title" msgid="3892612644543516705">"靜音模式下的鬧鐘"</string>
+    <string name="alarm_in_silent_mode_summary" msgid="6042500263899922832">"手機處於靜音模式時,鬧鐘仍會響"</string>
+    <string name="snooze_duration_title" msgid="1471249885139952670">"貪睡時間"</string>
+  <string-array name="snooze_duration_entries">
+    <item msgid="8337408933053603125">"5 分鐘"</item>
+    <item msgid="5294206441496024610">"10 分鐘"</item>
+    <item msgid="2165904039211935470">"15 分鐘"</item>
+    <item msgid="7248236967714374250">"20 分鐘"</item>
+    <item msgid="738394723625179423">"25 分鐘"</item>
+    <item msgid="1180222611308391616">"30 分鐘"</item>
+  </string-array>
+  <string-array name="snooze_duration_values">
+    <item msgid="3655014754453084122">"5"</item>
+    <item msgid="8939029597449573449">"10"</item>
+    <item msgid="3922647341176353315">"15"</item>
+    <item msgid="5821804105985044459">"20"</item>
+    <item msgid="6048861883552402852">"25"</item>
+    <item msgid="2740866721232379791">"30"</item>
+  </string-array>
+    <string name="done" msgid="6509722361933858451">"完成"</string>
+    <string name="revert" msgid="9100911171235162926">"復原"</string>
+    <string name="delete" msgid="5732434972457000541">"刪除"</string>
+    <string name="alarm_volume_title" msgid="8506245173912428522">"鬧鐘音量"</string>
+    <string name="alarm_volume_summary" msgid="8957440373896242438">"設定鬧鐘音量"</string>
+    <string name="silent_alarm_summary" msgid="8605302849408279221">"靜音"</string>
+    <string name="alarm_notify_text" msgid="4146350965933990093">"選取貪睡功能或關閉此鬧鐘。"</string>
+    <string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (貪睡)"</string>
+    <string name="alarm_notify_snooze_text" msgid="8004830999152609519">"鬧鐘設定在 <xliff:g id="TIME">%s</xliff:g>,選取即可取消"</string>
+    <string name="volume_button_setting_title" msgid="1892885285888644234">"側邊按鈕功用"</string>
+    <string name="volume_button_setting_summary" msgid="1594641247799573198">"設定側邊按鈕在鬧鐘啟動時的功用"</string>
+  <string-array name="volume_button_setting_entries">
+    <item msgid="4520420953175098625">"無"</item>
+    <item msgid="7111908302622811168">"貪睡"</item>
+    <item msgid="8573552194573068996">"關閉"</item>
+  </string-array>
+  <string-array name="volume_button_setting_values">
+    <item msgid="4851033050639608752">"0"</item>
+    <item msgid="3204893476515513084">"1"</item>
+    <item msgid="7687709558968154577">"2"</item>
+  </string-array>
+    <string name="alarm_button_description" msgid="740283647046258651">"鬧鐘"</string>
+    <string name="gallery_button_description" msgid="1151743663255257668">"圖片庫"</string>
+    <string name="music_button_description" msgid="1626593420810117999">"音樂"</string>
+    <string name="nightmode_button_description" msgid="990894208217576381">"微暗"</string>
+    <string name="home_button_description" msgid="3383859096809056157">"Launcher"</string>
+    <string name="desk_clock_button_description" msgid="968868045496561043">"時鐘顯示"</string>
+    <string name="battery_charging_level" msgid="4391767951302394083">"<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="weather_fetch_failure" msgid="7517010911981312358">"目前無法取得天氣資訊。"</string>
+    <string name="menu_item_dock_settings" msgid="3524235151132971114">"座架設定"</string>
+</resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
new file mode 100644 (file)
index 0000000..df2c9cf
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources>
+    <color name="ampm_off">#ff404040</color>
+    <color name="ampm_on">#ffffffff</color>
+
+    <color name="white">#ffffffff</color>
+    <color name="red">#ffee0000</color>
+    <color name="grey">#ffaaaaaa</color>
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
new file mode 100644 (file)
index 0000000..4d9d57f
--- /dev/null
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2007 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.
+-->
+
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- -->
+    <!-- Label shown on launcher icon -->
+    <string name="app_label">Clock</string>
+
+    <!-- Title for AlarmClock activity -->
+    <string name="alarm_list_title">Alarms</string>
+
+    <!-- Menu item on Alarm Clock screen: Add alarm -->
+    <string name="add_alarm">Add alarm</string>
+
+    <!-- Menu item on Alarm Clock screen: Desk clock -->
+    <string name="menu_desk_clock">Desk clock</string>
+
+    <!-- Menu item on Alarm Clock screen: Edit alarm -->
+    <string name="menu_edit_alarm">Edit alarm</string>
+
+    <!-- Context Menu Item on Alarm Settings screen: Delete alarm -->
+    <string name="delete_alarm">Delete alarm</string>
+
+    <!-- Context Menu Item on Alarm Settings screen: Enable alarm -->
+    <string name="enable_alarm">Turn alarm on</string>
+
+    <!-- Context Menu Item on Alarm Settings screen: Disable alarm -->
+    <string name="disable_alarm">Turn alarm off</string>
+
+    <!-- Delete alarm confirmation dialog message. -->
+    <string name="delete_alarm_confirm">This alarm will be deleted.</string>
+
+    <!-- Menu item on Alarm Clock screen: Show clock -->
+    <string name="show_clock">Show clock</string>
+
+    <!-- Menu item on Alarm Clock screen: Hide clock -->
+    <string name="hide_clock">Hide clock</string>
+
+    <!-- Setting label on Set alarm screen: Label -->
+    <string name="label">Label</string>
+
+    <!-- Default label to display for an alarm -->
+    <string name="default_label">Alarm</string>
+
+    <!-- Preference category on Alarm Settings screen: Set alarm -->
+    <string name="set_alarm">Set alarm</string>
+
+    <!-- Setting labels on Set alarm screen: Vibration on or off -->
+    <string name="alarm_vibrate">Vibrate</string>
+
+    <!-- Setting labels on Set alarm screen: Repeat -->
+    <string name="alarm_repeat">Repeat</string>
+
+    <!-- Setting labels on Set alarm screen: Select alarm ringtone  -->
+    <string name="alert">Ringtone</string>
+
+    <!-- Setting labels on Set alarm screen: Set time  -->
+    <string name="time">Time</string>
+
+    <!-- Button labels on the alarm dialog: Dismiss -->
+    <string name="alarm_alert_dismiss_text">Dismiss</string>
+
+    <!-- Alarm Alert screen: this message is shown after an alarm rung
+         unattended for a number of minutes.  It tells the user that
+         the alarm has been silenced.-->
+    <string name="alarm_alert_alert_silenced">Alarm silenced after <xliff:g id="minutes">%d</xliff:g> minutes</string>
+
+    <!-- Button labels on the alarm dialog: Snooze -->
+    <string name="alarm_alert_snooze_text">Snooze</string>
+
+    <!-- Toast that appears after Alarm is snoozed from the Alarm
+         dialog. Says the alarm will snooze for xxx minutes.  -->
+    <string name="alarm_alert_snooze_set">Snoozing for <xliff:g id="minutes">%d</xliff:g> minutes.</string>
+
+    <!-- 0: nothing
+         1: days
+         2:      hours
+         3: days hours
+         4:            minutes
+         5: days       minutes
+         6:      hours minutes
+         7: days hours minutes
+    --><skip />
+
+    <!-- Alarm confirmation toast: Describes how long from now until
+         alarm fires -->
+    <string-array name="alarm_set">
+        <item>This alarm is set for less than 1 minute from now.</item>
+        <item>This alarm is set for <xliff:g id="DAYS" example="2 days">%1$s</xliff:g> from now.</item>
+        <item>This alarm is set for <xliff:g id="HOURS" example="2 hours">%2$s</xliff:g> from now.</item>
+        <item>This alarm is set for <xliff:g id="DAYS" example="2 days">%1$s</xliff:g> and <xliff:g id="HOURS" example="2 hours">%2$s</xliff:g> from now.</item>
+        <item>This alarm is set for <xliff:g id="MINUTES" example="2 minutes">%3$s</xliff:g> from now.</item>
+        <item>This alarm is set for <xliff:g id="DAYS" example="2 days">%1$s</xliff:g> and <xliff:g id="MINUTES" example="2 minutes">%3$s</xliff:g> from now.</item>
+        <item>This alarm is set for <xliff:g id="HOURS" example="2 hours">%2$s</xliff:g> and <xliff:g id="MINUTES" example="2 minutes">%3$s</xliff:g> from now.</item>
+        <item>This alarm is set for <xliff:g id="DAYS" example="2 days">%1$s</xliff:g>, <xliff:g id="HOURS" example="2 hours">%2$s</xliff:g>, and <xliff:g id="MINUTES" example="2 minutes">%3$s</xliff:g> from now.</item>
+    </string-array>
+
+    <!-- Alarm confirmation toast: singular day -->
+    <string name="day">"1 day"</string>
+
+    <!-- Alarm confirmation toast: plural days -->
+    <string name="days">"<xliff:g id="days">%s</xliff:g> days"</string>
+
+    <!-- Alarm confirmation toast: singular hour -->
+    <string name="hour">1 hour</string>
+
+    <!-- Alarm confirmation toast: plural hours -->
+    <string name="hours"><xliff:g id="hours">%s</xliff:g> hours</string>
+
+    <!-- Alarm confirmation toast: singular minute  -->
+    <string name="minute">"1 minute"</string>
+
+    <!-- Alarm confirmation toast: plural minutes  -->
+    <string name="minutes">"<xliff:g id="minutes">%s</xliff:g> minutes"</string>
+
+    <!-- Repeat options that appear under an alarm on main Alarm Clock
+         screen to identify repetition schedule: special case for when
+         the alarm is set to repeat every day -->
+    <string name="every_day">every day</string>
+
+    <!-- Repeat options that appear under an alarm on main Alarm Clock
+         screen to identify repetition schedule: special case for when
+         the alarm is set to never repeat -->
+    <string name="never">Never</string>
+
+    <!-- Repeat options that appear under an alarm on main Alarm Clock
+         screen to identify repetition schedule: concatenate days with
+         this character, i.e. "Mon, Tue, Wed" -->
+    <string name="day_concat">", "</string>
+
+    <!-- Appears at the top of the Clock Picker screen: Tell user to
+         select a clock to display -->
+    <string name="clock_instructions">Select a clock to display.</string>
+
+    <!-- Label for analog clock gadget, shown in list of all gadgets -->
+    <string name="analog_gadget">Analog clock</string>
+
+    <!-- Menu item title for general Alarm Clock Settings -->
+    <string name="settings">Settings</string>
+
+    <!-- Setting title for whether the alarm should play in silent mode.
+         Usually, silent mode only affects the ringer, but this setting
+         will make the alarms respect silent mode too. -->
+    <string name="alarm_in_silent_mode_title">Alarm in silent mode</string>
+
+    <!-- Setting summary for whether the alarm should play in silent mode. -->
+    <string name="alarm_in_silent_mode_summary">Play alarm even when the phone is in silent mode</string>
+
+    <!-- Setting title for changing the snooze duration. -->
+    <string name="snooze_duration_title">Snooze duration</string>
+
+    <!-- Entries listed in the ListPreference when invoking the snooze duration
+         preference. -->
+    <string-array name="snooze_duration_entries">
+      <item>5 minutes</item>
+      <item>10 minutes</item>
+      <item>15 minutes</item>
+      <item>20 minutes</item>
+      <item>25 minutes</item>
+      <item>30 minutes</item>
+    </string-array>
+
+    <!-- Values that are retrieved from the ListPreference. These must match
+         the snooze_duration_entries above. -->
+    <string-array name="snooze_duration_values">
+      <item>5</item>
+      <item>10</item>
+      <item>15</item>
+      <item>20</item>
+      <item>25</item>
+      <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>
+
+    <!-- Delete button when editing an alarm. -->
+    <string name="delete">Delete</string>
+
+    <!-- Setting title for changing the alarm volume. -->
+    <string name="alarm_volume_title">Alarm volume</string>
+
+    <!-- Setting summary for changing the alarm volume. -->
+    <string name="alarm_volume_summary">Set the volume of alarms</string>
+
+    <!-- Summary for the alarm preference when silent is chosen. -->
+    <string name="silent_alarm_summary">Silent</string>
+
+    <!-- Text to display in the small text of the notification -->
+    <string name="alarm_notify_text">Select to snooze or dismiss this alarm.</string>
+
+    <!-- Text to display in the notification ticker and label -->
+    <string name="alarm_notify_snooze_label"><xliff:g id="label">%s</xliff:g> (snoozed)</string>
+
+    <!-- Text to display in the notification when the alarm has been snoozed -->
+    <string name="alarm_notify_snooze_text">Alarm set for <xliff:g id="time">%s</xliff:g>. Select to cancel.</string>
+
+    <!-- Title of the setting to change the volume/camera button behavior. -->
+    <string name="volume_button_setting_title">Side button behavior</string>
+
+    <!-- The summary of the side button setting. -->
+    <string name="volume_button_setting_summary">Set the desired behavior of the side buttons when pressed during an alarm</string>
+
+    <!-- Entries listed in the setting for the side-button action. -->
+    <string-array name="volume_button_setting_entries">
+      <item>None</item>
+      <item>Snooze</item>
+      <item>Dismiss</item>
+    </string-array>
+
+    <!-- Values for the side-button setting. -->
+    <string-array name="volume_button_setting_values">
+      <item>0</item>
+      <item>1</item>
+      <item>2</item>
+    </string-array>
+
+    <!-- Accessibility labels for Clock activity buttons --><skip/>
+    <string name="alarm_button_description">Alarms</string>
+    <string name="gallery_button_description">Gallery</string>
+    <string name="music_button_description">Music</string>
+    <string name="nightmode_button_description">Dim</string>
+    <string name="home_button_description">Launcher</string>
+    <string name="desk_clock_button_description">Clock Display</string>
+
+    <!-- A short representation of charging information, e.g "34%" -->
+    <string name="battery_charging_level"><xliff:g id="number">%d</xliff:g><xliff:g id="percent">%%</xliff:g></string>
+
+    <!-- What to show the user if the weather widget exists but fails to
+         respond. This is a sign of an error; if the weather widget is not
+         present on the device, we show nothing at all. -->
+    <string name="weather_fetch_failure">Weather information currently unavailable.</string>
+
+    <string name="menu_item_dock_settings" msgid="9161438664257429372">Dock settings</string>
+</resources>
+
+
diff --git a/res/values/styles.xml b/res/values/styles.xml
new file mode 100644 (file)
index 0000000..edacfea
--- /dev/null
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<resources>
+    <style name="clock">
+        <item name="android:layout_width">fill_parent</item>
+        <item name="android:layout_height">fill_parent</item>
+        <item name="android:layout_gravity">center_horizontal</item>
+    </style>
+
+    <!-- This theme is similar to the Theme.Dialog.Alert but does not rely on a
+         non-public resource. -->
+    <style name="alarm_alert" parent="android:Theme.Dialog">
+        <item name="android:windowBackground">@android:color/transparent</item>
+    </style>
+
+    <style name="RoundTouchButton">
+        <item name="android:gravity">center</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:background">@drawable/incall_round_button</item>
+    </style>
+
+    <style name="ButtonStripLeft">
+        <item name="android:gravity">center</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:background">@drawable/btn_strip_trans_left</item>
+    </style>
+    <style name="ButtonStripMiddle">
+        <item name="android:gravity">center</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:background">@drawable/btn_strip_trans_middle</item>
+    </style>
+    <style name="ButtonStripRight">
+        <item name="android:gravity">center</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:background">@drawable/btn_strip_trans_right</item>
+    </style>
+
+    <style name="alarm_list_left_column">
+        <item name="android:layout_width">68dip</item>
+        <item name="android:layout_height">68dip</item>
+    </style>
+</resources>
diff --git a/res/xml/alarm_prefs.xml b/res/xml/alarm_prefs.xml
new file mode 100644 (file)
index 0000000..3ca8ed0
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 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.
+-->
+
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+        android:title="@string/set_alarm">
+    <CheckBoxPreference android:key="enabled"
+        android:persistent="false"
+        android:title="@string/enable_alarm" />
+    <Preference android:key="time"
+        android:persistent="false"
+        android:title="@string/time"/>
+    <com.android.deskclock.RepeatPreference
+        android:persistent="false"
+        android:key="setRepeat"
+        android:title="@string/alarm_repeat" />
+    <com.android.deskclock.AlarmPreference
+        android:key="alarm"
+        android:title="@string/alert"
+        android:ringtoneType="alarm"
+        android:persistent="false"
+        android:showDefault="false"
+        android:showSilent="true" />
+    <CheckBoxPreference android:key="vibrate"
+        android:persistent="false"
+        android:title="@string/alarm_vibrate"/>
+    <EditTextPreference android:key="label"
+        android:persistent="false"
+        android:title="@string/label"
+        android:dialogTitle="@string/label" />
+</PreferenceScreen>
diff --git a/res/xml/analog_appwidget.xml b/res/xml/analog_appwidget.xml
new file mode 100644 (file)
index 0000000..d87b484
--- /dev/null
@@ -0,0 +1,23 @@
+<?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.
+-->
+
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+    android:minWidth="146dip"
+    android:minHeight="146dip"
+    android:updatePeriodMillis="0"
+    android:initialLayout="@layout/analog_appwidget"
+    >
+</appwidget-provider>
diff --git a/res/xml/settings.xml b/res/xml/settings.xml
new file mode 100644 (file)
index 0000000..e49126c
--- /dev/null
@@ -0,0 +1,49 @@
+<?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.
+-->
+
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:title="@string/settings">
+
+    <CheckBoxPreference
+        android:key="alarm_in_silent_mode"
+        android:title="@string/alarm_in_silent_mode_title"
+        android:summary="@string/alarm_in_silent_mode_summary" />
+
+    <VolumePreference
+        android:title="@string/alarm_volume_title"
+        android:summary="@string/alarm_volume_summary"
+        android:dialogTitle="@string/alarm_volume_title"
+        android:persistent="false"
+        android:streamType="alarm" />
+
+    <ListPreference
+        android:key="snooze_duration"
+        android:title="@string/snooze_duration_title"
+        android:entries="@array/snooze_duration_entries"
+        android:entryValues="@array/snooze_duration_values"
+        android:defaultValue="10"
+        android:dialogTitle="@string/snooze_duration_title" />
+
+    <ListPreference
+        android:key="volume_button_setting"
+        android:title="@string/volume_button_setting_title"
+        android:entries="@array/volume_button_setting_entries"
+        android:entryValues="@array/volume_button_setting_values"
+        android:summary="@string/volume_button_setting_summary"
+        android:defaultValue="2" />
+
+</PreferenceScreen>
diff --git a/src/com/android/deskclock/Alarm.java b/src/com/android/deskclock/Alarm.java
new file mode 100644 (file)
index 0000000..7d8c8a3
--- /dev/null
@@ -0,0 +1,342 @@
+/*
+ * 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.
+ */
+
+package com.android.deskclock;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.provider.BaseColumns;
+import android.text.format.DateFormat;
+
+import java.text.DateFormatSymbols;
+import java.util.Calendar;
+
+public final class Alarm implements Parcelable {
+
+    //////////////////////////////
+    // Parcelable apis
+    //////////////////////////////
+    public static final Parcelable.Creator<Alarm> CREATOR
+            = new Parcelable.Creator<Alarm>() {
+                public Alarm createFromParcel(Parcel p) {
+                    return new Alarm(p);
+                }
+
+                public Alarm[] newArray(int size) {
+                    return new Alarm[size];
+                }
+            };
+
+    public int describeContents() {
+        return 0;
+    }
+
+    public void writeToParcel(Parcel p, int flags) {
+        p.writeInt(id);
+        p.writeInt(enabled ? 1 : 0);
+        p.writeInt(hour);
+        p.writeInt(minutes);
+        p.writeInt(daysOfWeek.getCoded());
+        p.writeLong(time);
+        p.writeInt(vibrate ? 1 : 0);
+        p.writeString(label);
+        p.writeParcelable(alert, flags);
+        p.writeInt(silent ? 1 : 0);
+    }
+    //////////////////////////////
+    // end Parcelable apis
+    //////////////////////////////
+
+    //////////////////////////////
+    // Column definitions
+    //////////////////////////////
+    public static class Columns implements BaseColumns {
+        /**
+         * The content:// style URL for this table
+         */
+        public static final Uri CONTENT_URI =
+                Uri.parse("content://com.android.deskclock/alarm");
+
+        /**
+         * Hour in 24-hour localtime 0 - 23.
+         * <P>Type: INTEGER</P>
+         */
+        public static final String HOUR = "hour";
+
+        /**
+         * Minutes in localtime 0 - 59
+         * <P>Type: INTEGER</P>
+         */
+        public static final String MINUTES = "minutes";
+
+        /**
+         * Days of week coded as integer
+         * <P>Type: INTEGER</P>
+         */
+        public static final String DAYS_OF_WEEK = "daysofweek";
+
+        /**
+         * Alarm time in UTC milliseconds from the epoch.
+         * <P>Type: INTEGER</P>
+         */
+        public static final String ALARM_TIME = "alarmtime";
+
+        /**
+         * True if alarm is active
+         * <P>Type: BOOLEAN</P>
+         */
+        public static final String ENABLED = "enabled";
+
+        /**
+         * True if alarm should vibrate
+         * <P>Type: BOOLEAN</P>
+         */
+        public static final String VIBRATE = "vibrate";
+
+        /**
+         * Message to show when alarm triggers
+         * Note: not currently used
+         * <P>Type: STRING</P>
+         */
+        public static final String MESSAGE = "message";
+
+        /**
+         * Audio alert to play when alarm triggers
+         * <P>Type: STRING</P>
+         */
+        public static final String ALERT = "alert";
+
+        /**
+         * The default sort order for this table
+         */
+        public static final String DEFAULT_SORT_ORDER =
+                HOUR + ", " + MINUTES + " ASC";
+
+        // Used when filtering enabled alarms.
+        public static final String WHERE_ENABLED = ENABLED + "=1";
+
+        static final String[] ALARM_QUERY_COLUMNS = {
+            _ID, HOUR, MINUTES, DAYS_OF_WEEK, ALARM_TIME,
+            ENABLED, VIBRATE, MESSAGE, ALERT };
+
+        /**
+         * These save calls to cursor.getColumnIndexOrThrow()
+         * THEY MUST BE KEPT IN SYNC WITH ABOVE QUERY COLUMNS
+         */
+        public static final int ALARM_ID_INDEX = 0;
+        public static final int ALARM_HOUR_INDEX = 1;
+        public static final int ALARM_MINUTES_INDEX = 2;
+        public static final int ALARM_DAYS_OF_WEEK_INDEX = 3;
+        public static final int ALARM_TIME_INDEX = 4;
+        public static final int ALARM_ENABLED_INDEX = 5;
+        public static final int ALARM_VIBRATE_INDEX = 6;
+        public static final int ALARM_MESSAGE_INDEX = 7;
+        public static final int ALARM_ALERT_INDEX = 8;
+    }
+    //////////////////////////////
+    // End column definitions
+    //////////////////////////////
+
+    // Public fields
+    public int        id;
+    public boolean    enabled;
+    public int        hour;
+    public int        minutes;
+    public DaysOfWeek daysOfWeek;
+    public long       time;
+    public boolean    vibrate;
+    public String     label;
+    public Uri        alert;
+    public boolean    silent;
+
+    public Alarm(Cursor c) {
+        id = c.getInt(Columns.ALARM_ID_INDEX);
+        enabled = c.getInt(Columns.ALARM_ENABLED_INDEX) == 1;
+        hour = c.getInt(Columns.ALARM_HOUR_INDEX);
+        minutes = c.getInt(Columns.ALARM_MINUTES_INDEX);
+        daysOfWeek = new DaysOfWeek(c.getInt(Columns.ALARM_DAYS_OF_WEEK_INDEX));
+        time = c.getLong(Columns.ALARM_TIME_INDEX);
+        vibrate = c.getInt(Columns.ALARM_VIBRATE_INDEX) == 1;
+        label = c.getString(Columns.ALARM_MESSAGE_INDEX);
+        String alertString = c.getString(Columns.ALARM_ALERT_INDEX);
+        if (Alarms.ALARM_ALERT_SILENT.equals(alertString)) {
+            if (Log.LOGV) {
+                Log.v("Alarm is marked as silent");
+            }
+            silent = true;
+        } else {
+            if (alertString != null && alertString.length() != 0) {
+                alert = Uri.parse(alertString);
+            }
+
+            // If the database alert is null or it failed to parse, use the
+            // default alert.
+            if (alert == null) {
+                alert = RingtoneManager.getDefaultUri(
+                        RingtoneManager.TYPE_ALARM);
+            }
+        }
+    }
+
+    public Alarm(Parcel p) {
+        id = p.readInt();
+        enabled = p.readInt() == 1;
+        hour = p.readInt();
+        minutes = p.readInt();
+        daysOfWeek = new DaysOfWeek(p.readInt());
+        time = p.readLong();
+        vibrate = p.readInt() == 1;
+        label = p.readString();
+        alert = (Uri) p.readParcelable(null);
+        silent = p.readInt() == 1;
+    }
+
+    public String getLabelOrDefault(Context context) {
+        if (label == null || label.length() == 0) {
+            return context.getString(R.string.default_label);
+        }
+        return label;
+    }
+
+    /*
+     * Days of week code as a single int.
+     * 0x00: no day
+     * 0x01: Monday
+     * 0x02: Tuesday
+     * 0x04: Wednesday
+     * 0x08: Thursday
+     * 0x10: Friday
+     * 0x20: Saturday
+     * 0x40: Sunday
+     */
+    static final class DaysOfWeek {
+
+        private static int[] DAY_MAP = new int[] {
+            Calendar.MONDAY,
+            Calendar.TUESDAY,
+            Calendar.WEDNESDAY,
+            Calendar.THURSDAY,
+            Calendar.FRIDAY,
+            Calendar.SATURDAY,
+            Calendar.SUNDAY,
+        };
+
+        // Bitmask of all repeating days
+        private int mDays;
+
+        DaysOfWeek(int days) {
+            mDays = days;
+        }
+
+        public String toString(Context context, boolean showNever) {
+            StringBuilder ret = new StringBuilder();
+
+            // no days
+            if (mDays == 0) {
+                return showNever ?
+                        context.getText(R.string.never).toString() : "";
+            }
+
+            // every day
+            if (mDays == 0x7f) {
+                return context.getText(R.string.every_day).toString();
+            }
+
+            // count selected days
+            int dayCount = 0, days = mDays;
+            while (days > 0) {
+                if ((days & 1) == 1) dayCount++;
+                days >>= 1;
+            }
+
+            // short or long form?
+            DateFormatSymbols dfs = new DateFormatSymbols();
+            String[] dayList = (dayCount > 1) ?
+                    dfs.getShortWeekdays() :
+                    dfs.getWeekdays();
+
+            // selected days
+            for (int i = 0; i < 7; i++) {
+                if ((mDays & (1 << i)) != 0) {
+                    ret.append(dayList[DAY_MAP[i]]);
+                    dayCount -= 1;
+                    if (dayCount > 0) ret.append(
+                            context.getText(R.string.day_concat));
+                }
+            }
+            return ret.toString();
+        }
+
+        private boolean isSet(int day) {
+            return ((mDays & (1 << day)) > 0);
+        }
+
+        public void set(int day, boolean set) {
+            if (set) {
+                mDays |= (1 << day);
+            } else {
+                mDays &= ~(1 << day);
+            }
+        }
+
+        public void set(DaysOfWeek dow) {
+            mDays = dow.mDays;
+        }
+
+        public int getCoded() {
+            return mDays;
+        }
+
+        // Returns days of week encoded in an array of booleans.
+        public boolean[] getBooleanArray() {
+            boolean[] ret = new boolean[7];
+            for (int i = 0; i < 7; i++) {
+                ret[i] = isSet(i);
+            }
+            return ret;
+        }
+
+        public boolean isRepeatSet() {
+            return mDays != 0;
+        }
+
+        /**
+         * returns number of days from today until next alarm
+         * @param c must be set to today
+         */
+        public int getNextAlarm(Calendar c) {
+            if (mDays == 0) {
+                return -1;
+            }
+
+            int today = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7;
+
+            int day = 0;
+            int dayCount = 0;
+            for (; dayCount < 7; dayCount++) {
+                day = (today + dayCount) % 7;
+                if (isSet(day)) {
+                    break;
+                }
+            }
+            return dayCount;
+        }
+    }
+}
diff --git a/src/com/android/deskclock/AlarmAlert.java b/src/com/android/deskclock/AlarmAlert.java
new file mode 100644 (file)
index 0000000..6319dff
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2007 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.
+ */
+
+package com.android.deskclock;
+
+import android.app.Activity;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.BroadcastReceiver;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.LayoutInflater;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.Toast;
+import android.widget.TextView;
+
+import java.util.Calendar;
+
+/**
+ * Alarm Clock alarm alert: pops visible indicator and plays alarm
+ * tone
+ */
+public class AlarmAlert extends Activity {
+
+    // These defaults must match the values in res/xml/settings.xml
+    private static final String DEFAULT_SNOOZE = "10";
+    private static final String DEFAULT_VOLUME_BEHAVIOR = "2";
+
+    private Alarm mAlarm;
+    private int mVolumeBehavior;
+
+    // Receives the ALARM_KILLED action from the AlarmKlaxon.
+    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Alarm alarm = intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA);
+            if (mAlarm.id == alarm.id) {
+                dismiss(true);
+            }
+        }
+    };
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        mAlarm = getIntent().getParcelableExtra(Alarms.ALARM_INTENT_EXTRA);
+
+        // Get the volume/camera button behavior setting
+        final String vol =
+                PreferenceManager.getDefaultSharedPreferences(this)
+                .getString(SettingsActivity.KEY_VOLUME_BEHAVIOR,
+                        DEFAULT_VOLUME_BEHAVIOR);
+        mVolumeBehavior = Integer.parseInt(vol);
+
+        requestWindowFeature(android.view.Window.FEATURE_NO_TITLE);
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
+                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
+        updateLayout();
+
+        // Register to get the alarm killed intent.
+        registerReceiver(mReceiver, new IntentFilter(Alarms.ALARM_KILLED));
+    }
+
+    private void setTitle() {
+        String label = mAlarm.getLabelOrDefault(this);
+        TextView title = (TextView) findViewById(R.id.alertTitle);
+        title.setText(label);
+    }
+
+    // This method is overwritten in AlarmAlertFullScreen in order to show a
+    // full activity with the wallpaper as the background.
+    protected View inflateView(LayoutInflater inflater) {
+        return inflater.inflate(R.layout.alarm_alert, null);
+    }
+
+    private void updateLayout() {
+        LayoutInflater inflater = LayoutInflater.from(this);
+
+        setContentView(inflateView(inflater));
+
+        /* snooze behavior: pop a snooze confirmation view, kick alarm
+           manager. */
+        Button snooze = (Button) findViewById(R.id.snooze);
+        snooze.requestFocus();
+        snooze.setOnClickListener(new Button.OnClickListener() {
+            public void onClick(View v) {
+                snooze();
+            }
+        });
+
+        /* dismiss button: close notification */
+        findViewById(R.id.dismiss).setOnClickListener(
+                new Button.OnClickListener() {
+                    public void onClick(View v) {
+                        dismiss(false);
+                    }
+                });
+
+        /* Set the title from the passed in alarm */
+        setTitle();
+    }
+
+    // Attempt to snooze this alert.
+    private void snooze() {
+        final String snooze =
+                PreferenceManager.getDefaultSharedPreferences(this)
+                .getString(SettingsActivity.KEY_ALARM_SNOOZE, DEFAULT_SNOOZE);
+        int snoozeMinutes = Integer.parseInt(snooze);
+
+        final long snoozeTime = System.currentTimeMillis()
+                + (1000 * 60 * snoozeMinutes);
+        Alarms.saveSnoozeAlert(AlarmAlert.this, mAlarm.id, snoozeTime);
+
+        // Get the display time for the snooze and update the notification.
+        final Calendar c = Calendar.getInstance();
+        c.setTimeInMillis(snoozeTime);
+
+        // Append (snoozed) to the label.
+        String label = mAlarm.getLabelOrDefault(this);
+        label = getString(R.string.alarm_notify_snooze_label, label);
+
+        // Notify the user that the alarm has been snoozed.
+        Intent cancelSnooze = new Intent(this, AlarmReceiver.class);
+        cancelSnooze.setAction(Alarms.CANCEL_SNOOZE);
+        cancelSnooze.putExtra(Alarms.ALARM_ID, mAlarm.id);
+        PendingIntent broadcast =
+                PendingIntent.getBroadcast(this, mAlarm.id, cancelSnooze, 0);
+        NotificationManager nm = getNotificationManager();
+        Notification n = new Notification(R.drawable.stat_notify_alarm,
+                label, 0);
+        n.setLatestEventInfo(this, label,
+                getString(R.string.alarm_notify_snooze_text,
+                    Alarms.formatTime(this, c)), broadcast);
+        n.flags |= Notification.FLAG_AUTO_CANCEL
+                | Notification.FLAG_ONGOING_EVENT;
+        nm.notify(mAlarm.id, n);
+
+        String displayTime = getString(R.string.alarm_alert_snooze_set,
+                snoozeMinutes);
+        // Intentionally log the snooze time for debugging.
+        Log.v(displayTime);
+
+        // Display the snooze minutes in a toast.
+        Toast.makeText(AlarmAlert.this, displayTime, Toast.LENGTH_LONG).show();
+        stopService(new Intent(Alarms.ALARM_ALERT_ACTION));
+        finish();
+    }
+
+    private NotificationManager getNotificationManager() {
+        return (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+    }
+
+    // Dismiss the alarm.
+    private void dismiss(boolean killed) {
+        // 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(mAlarm.id);
+            stopService(new Intent(Alarms.ALARM_ALERT_ACTION));
+        }
+        finish();
+    }
+
+    /**
+     * this is called when a second alarm is triggered while a
+     * previous alert window is still active.
+     */
+    @Override
+    protected void onNewIntent(Intent intent) {
+        super.onNewIntent(intent);
+
+        if (Log.LOGV) Log.v("AlarmAlert.OnNewIntent()");
+
+        mAlarm = intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA);
+
+        setTitle();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        // Don't hang around.
+        finish();
+    }
+    
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (Log.LOGV) Log.v("AlarmAlert.onDestroy()");
+        // No longer care about the alarm being killed.
+        unregisterReceiver(mReceiver);
+    }
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        // Do this on key down to handle a few of the system keys.
+        boolean up = event.getAction() == KeyEvent.ACTION_UP;
+        switch (event.getKeyCode()) {
+            // Volume keys and camera keys dismiss the alarm
+            case KeyEvent.KEYCODE_VOLUME_UP:
+            case KeyEvent.KEYCODE_VOLUME_DOWN:
+            case KeyEvent.KEYCODE_CAMERA:
+            case KeyEvent.KEYCODE_FOCUS:
+                if (up) {
+                    switch (mVolumeBehavior) {
+                        case 1:
+                            snooze();
+                            break;
+
+                        case 2:
+                            dismiss(false);
+                            break;
+
+                        default:
+                            break;
+                    }
+                }
+                return true;
+            default:
+                break;
+        }
+        return super.dispatchKeyEvent(event);
+    }
+}
diff --git a/src/com/android/deskclock/AlarmAlertFullScreen.java b/src/com/android/deskclock/AlarmAlertFullScreen.java
new file mode 100644 (file)
index 0000000..fe7d61d
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+package com.android.deskclock;
+
+import android.os.Bundle;
+import android.view.WindowManager;
+
+/**
+ * Full screen alarm alert: pops visible indicator and plays alarm tone. This
+ * activity displays the alert in full screen in order to be secure. The
+ * background is the current wallpaper.
+ */
+public class AlarmAlertFullScreen extends AlarmAlert {
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+    }
+    
+    @Override
+    public void onBackPressed() {
+        // Don't allow back to dismiss.
+        return;
+    }
+}
diff --git a/src/com/android/deskclock/AlarmAlertWakeLock.java b/src/com/android/deskclock/AlarmAlertWakeLock.java
new file mode 100644 (file)
index 0000000..92b79e3
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package com.android.deskclock;
+
+import android.content.Context;
+import android.os.PowerManager;
+
+/**
+ * Hold a wakelock that can be acquired in the AlarmReceiver and
+ * released in the AlarmAlert activity
+ */
+class AlarmAlertWakeLock {
+
+    private static PowerManager.WakeLock sCpuWakeLock;
+
+    static void acquireCpuWakeLock(Context context) {
+        Log.v("Acquiring cpu wake lock");
+        if (sCpuWakeLock != null) {
+            return;
+        }
+
+        PowerManager pm =
+                (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+
+        sCpuWakeLock = pm.newWakeLock(
+                PowerManager.PARTIAL_WAKE_LOCK |
+                PowerManager.ACQUIRE_CAUSES_WAKEUP |
+                PowerManager.ON_AFTER_RELEASE, Log.LOGTAG);
+        sCpuWakeLock.acquire();
+    }
+
+    static void releaseCpuLock() {
+        Log.v("Releasing cpu wake lock");
+        if (sCpuWakeLock != null) {
+            sCpuWakeLock.release();
+            sCpuWakeLock = null;
+        }
+    }
+}
diff --git a/src/com/android/deskclock/AlarmClock.java b/src/com/android/deskclock/AlarmClock.java
new file mode 100644 (file)
index 0000000..adfe740
--- /dev/null
@@ -0,0 +1,327 @@
+/*
+ * Copyright (C) 2007 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.
+ */
+
+package com.android.deskclock;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.database.Cursor;
+import android.graphics.Typeface;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.provider.Settings;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnCreateContextMenuListener;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.AdapterContextMenuInfo;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CursorAdapter;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.Calendar;
+
+/**
+ * AlarmClock application.
+ */
+public class AlarmClock extends Activity implements OnItemClickListener {
+
+    final static String PREFERENCES = "AlarmClock";
+
+    /** This must be false for production.  If true, turns on logging,
+        test code, etc. */
+    final static boolean DEBUG = false;
+
+    private SharedPreferences mPrefs;
+    private LayoutInflater mFactory;
+    private ListView mAlarmsList;
+    private Cursor mCursor;
+
+    private void updateIndicatorAndAlarm(boolean enabled, ImageView bar,
+            Alarm alarm) {
+        bar.setImageResource(enabled ? R.drawable.ic_indicator_on
+                : R.drawable.ic_indicator_off);
+        Alarms.enableAlarm(this, alarm.id, enabled);
+        if (enabled) {
+            SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
+                    alarm.daysOfWeek);
+        }
+    }
+
+    private class AlarmTimeAdapter extends CursorAdapter {
+        public AlarmTimeAdapter(Context context, Cursor cursor) {
+            super(context, cursor);
+        }
+
+        public View newView(Context context, Cursor cursor, ViewGroup parent) {
+            View ret = mFactory.inflate(R.layout.alarm_time, parent, false);
+
+            DigitalClock digitalClock = (DigitalClock) ret.findViewById(R.id.digitalClock);
+            digitalClock.setLive(false);
+            if (Log.LOGV) Log.v("newView " + cursor.getPosition());
+            return ret;
+        }
+
+        public void bindView(View view, Context context, Cursor cursor) {
+            final Alarm alarm = new Alarm(cursor);
+
+            View indicator = view.findViewById(R.id.indicator);
+
+            // Set the initial resource for the bar image.
+            final ImageView barOnOff =
+                    (ImageView) indicator.findViewById(R.id.bar_onoff);
+            barOnOff.setImageResource(alarm.enabled ?
+                    R.drawable.ic_indicator_on : R.drawable.ic_indicator_off);
+
+            // Set the initial state of the clock "checkbox"
+            final CheckBox clockOnOff =
+                    (CheckBox) indicator.findViewById(R.id.clock_onoff);
+            clockOnOff.setChecked(alarm.enabled);
+
+            // Clicking outside the "checkbox" should also change the state.
+            indicator.setOnClickListener(new OnClickListener() {
+                    public void onClick(View v) {
+                        clockOnOff.toggle();
+                        updateIndicatorAndAlarm(clockOnOff.isChecked(),
+                                barOnOff, alarm);
+                    }
+            });
+
+            DigitalClock digitalClock =
+                    (DigitalClock) view.findViewById(R.id.digitalClock);
+
+            // set the alarm text
+            final Calendar c = Calendar.getInstance();
+            c.set(Calendar.HOUR_OF_DAY, alarm.hour);
+            c.set(Calendar.MINUTE, alarm.minutes);
+            digitalClock.updateTime(c);
+            digitalClock.setTypeface(Typeface.DEFAULT);
+
+            // Set the repeat text or leave it blank if it does not repeat.
+            TextView daysOfWeekView =
+                    (TextView) digitalClock.findViewById(R.id.daysOfWeek);
+            final String daysOfWeekStr =
+                    alarm.daysOfWeek.toString(AlarmClock.this, false);
+            if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {
+                daysOfWeekView.setText(daysOfWeekStr);
+                daysOfWeekView.setVisibility(View.VISIBLE);
+            } else {
+                daysOfWeekView.setVisibility(View.GONE);
+            }
+
+            // Display the label
+            TextView labelView =
+                    (TextView) view.findViewById(R.id.label);
+            if (alarm.label != null && alarm.label.length() != 0) {
+                labelView.setText(alarm.label);
+                labelView.setVisibility(View.VISIBLE);
+            } else {
+                labelView.setVisibility(View.GONE);
+            }
+        }
+    };
+
+    @Override
+    public boolean onContextItemSelected(final MenuItem item) {
+        final AdapterContextMenuInfo info =
+                (AdapterContextMenuInfo) item.getMenuInfo();
+        final int id = (int) info.id;
+        switch (item.getItemId()) {
+            case R.id.delete_alarm:
+                // Confirm that the alarm will be deleted.
+                new AlertDialog.Builder(this)
+                        .setTitle(getString(R.string.delete_alarm))
+                        .setMessage(getString(R.string.delete_alarm_confirm))
+                        .setPositiveButton(android.R.string.ok,
+                                new DialogInterface.OnClickListener() {
+                                    public void onClick(DialogInterface d,
+                                            int w) {
+                                        Alarms.deleteAlarm(AlarmClock.this, id);
+                                    }
+                                })
+                        .setNegativeButton(android.R.string.cancel, null)
+                        .show();
+                return true;
+
+            case R.id.enable_alarm:
+                final Cursor c = (Cursor) mAlarmsList.getAdapter()
+                        .getItem(info.position);
+                final Alarm alarm = new Alarm(c);
+                Alarms.enableAlarm(this, alarm.id, !alarm.enabled);
+                if (!alarm.enabled) {
+                    SetAlarm.popAlarmSetToast(this, alarm.hour, alarm.minutes,
+                            alarm.daysOfWeek);
+                }
+                return true;
+
+            case R.id.edit_alarm:
+                Intent intent = new Intent(this, SetAlarm.class);
+                intent.putExtra(Alarms.ALARM_ID, id);
+                startActivity(intent);
+                return true;
+
+            default:
+                break;
+        }
+        return super.onContextItemSelected(item);
+    }
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        mFactory = LayoutInflater.from(this);
+        mPrefs = getSharedPreferences(PREFERENCES, 0);
+        mCursor = Alarms.getAlarmsCursor(getContentResolver());
+
+        updateLayout();
+    }
+
+    private void updateLayout() {
+        setContentView(R.layout.alarm_clock);
+        mAlarmsList = (ListView) findViewById(R.id.alarms_list);
+        AlarmTimeAdapter adapter = new AlarmTimeAdapter(this, mCursor);
+        mAlarmsList.setAdapter(adapter);
+        mAlarmsList.setVerticalScrollBarEnabled(true);
+        mAlarmsList.setOnItemClickListener(this);
+        mAlarmsList.setOnCreateContextMenuListener(this);
+
+        View addAlarm = findViewById(R.id.add_alarm);
+        addAlarm.setOnClickListener(new View.OnClickListener() {
+                public void onClick(View v) {
+                    addNewAlarm();
+                }
+            });
+        // Make the entire view selected when focused.
+        addAlarm.setOnFocusChangeListener(new View.OnFocusChangeListener() {
+                public void onFocusChange(View v, boolean hasFocus) {
+                    v.setSelected(hasFocus);
+                }
+        });
+
+        ImageButton deskClock =
+                (ImageButton) findViewById(R.id.desk_clock_button);
+        deskClock.setOnClickListener(new View.OnClickListener() {
+                public void onClick(View v) {
+                    startActivity(new Intent(AlarmClock.this, DeskClock.class));
+                }
+        });
+    }
+
+    // Version of addNewAlarm that can be called from any activity, e.g. DeskClock
+    protected static void addNewAlarm(Context context) {
+        final Uri uri = Alarms.addAlarm(context.getContentResolver());
+        final String segment = uri.getPathSegments().get(1);
+        int newId = Integer.parseInt(segment);
+        if (Log.LOGV) {
+            Log.v("In AlarmClock, new alarm id = " + newId);
+        }
+        final Intent intent = new Intent(context, SetAlarm.class);
+        intent.putExtra(Alarms.ALARM_ID, newId);
+        context.startActivity(intent);
+    }
+
+    private void addNewAlarm() {
+        addNewAlarm(this);
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        ToastMaster.cancelToast();
+        mCursor.deactivate();
+    }
+
+    @Override
+    public void onCreateContextMenu(ContextMenu menu, View view,
+            ContextMenuInfo menuInfo) {
+        // Inflate the menu from xml.
+        getMenuInflater().inflate(R.menu.context_menu, menu);
+
+        // Use the current item to create a custom view for the header.
+        final AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
+        final Cursor c =
+                (Cursor) mAlarmsList.getAdapter().getItem((int) info.position);
+        final Alarm alarm = new Alarm(c);
+
+        // Construct the Calendar to compute the time.
+        final Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.HOUR_OF_DAY, alarm.hour);
+        cal.set(Calendar.MINUTE, alarm.minutes);
+        final String time = Alarms.formatTime(this, cal);
+
+        // Inflate the custom view and set each TextView's text.
+        final View v = mFactory.inflate(R.layout.context_menu_header, null);
+        TextView textView = (TextView) v.findViewById(R.id.header_time);
+        textView.setText(time);
+        textView = (TextView) v.findViewById(R.id.header_label);
+        textView.setText(alarm.label);
+
+        // Set the custom view on the menu.
+        menu.setHeaderView(v);
+        // Change the text based on the state of the alarm.
+        if (alarm.enabled) {
+            menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.menu_item_settings:
+                startActivity(new Intent(this, SettingsActivity.class));
+                return true;
+            case R.id.menu_item_desk_clock:
+                startActivity(new Intent(this, DeskClock.class));
+                return true;
+            case R.id.menu_item_add_alarm:
+                addNewAlarm();
+                return true;
+            default:
+                break;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.alarm_list_menu, menu);
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    public void onItemClick(AdapterView parent, View v, int pos, long id) {
+        Intent intent = new Intent(this, SetAlarm.class);
+        intent.putExtra(Alarms.ALARM_ID, (int) id);
+        startActivity(intent);
+    }
+}
diff --git a/src/com/android/deskclock/AlarmInitReceiver.java b/src/com/android/deskclock/AlarmInitReceiver.java
new file mode 100644 (file)
index 0000000..3ab8c62
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2007 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.
+ */
+
+package com.android.deskclock;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.BroadcastReceiver;
+
+public class AlarmInitReceiver extends BroadcastReceiver {
+
+    /**
+     * Sets alarm on ACTION_BOOT_COMPLETED.  Resets alarm on
+     * TIME_SET, TIMEZONE_CHANGED
+     */
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        String action = intent.getAction();
+        if (Log.LOGV) Log.v("AlarmInitReceiver" + action);
+
+        if (context.getContentResolver() == null) {
+            Log.e("AlarmInitReceiver: FAILURE unable to get content resolver.  Alarms inactive.");
+            return;
+        }
+        if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
+            Alarms.saveSnoozeAlert(context, -1, -1);
+            Alarms.disableExpiredAlarms(context);
+        }
+        Alarms.setNextAlert(context);
+    }
+}
diff --git a/src/com/android/deskclock/AlarmKlaxon.java b/src/com/android/deskclock/AlarmKlaxon.java
new file mode 100644 (file)
index 0000000..040dc24
--- /dev/null
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package com.android.deskclock;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.Resources;
+import android.media.AudioManager;
+import android.media.MediaPlayer;
+import android.media.MediaPlayer.OnErrorListener;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Vibrator;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+
+/**
+ * Manages alarms and vibe. Runs as a service so that it can continue to play
+ * if another activity overrides the AlarmAlert dialog.
+ */
+public class AlarmKlaxon extends Service {
+
+    /** Play alarm up to 10 minutes before silencing */
+    private static final int ALARM_TIMEOUT_SECONDS = 10 * 60;
+
+    private static final long[] sVibratePattern = new long[] { 500, 500 };
+
+    private boolean mPlaying = false;
+    private Vibrator mVibrator;
+    private MediaPlayer mMediaPlayer;
+    private Alarm mCurrentAlarm;
+    private long mStartTime;
+    private TelephonyManager mTelephonyManager;
+    private int mInitialCallState;
+
+    // Internal messages
+    private static final int KILLER = 1000;
+    private Handler mHandler = new Handler() {
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case KILLER:
+                    if (Log.LOGV) {
+                        Log.v("*********** Alarm killer triggered ***********");
+                    }
+                    sendKillBroadcast((Alarm) msg.obj);
+                    stopSelf();
+                    break;
+            }
+        }
+    };
+
+    private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
+        @Override
+        public void onCallStateChanged(int state, String ignored) {
+            // The user might already be in a call when the alarm fires. When
+            // we register onCallStateChanged, we get the initial in-call state
+            // which kills the alarm. Check against the initial call state so
+            // we don't kill the alarm during a call.
+            if (state != TelephonyManager.CALL_STATE_IDLE
+                    && state != mInitialCallState) {
+                sendKillBroadcast(mCurrentAlarm);
+                stopSelf();
+            }
+        }
+    };
+
+    @Override
+    public void onCreate() {
+        mVibrator = new Vibrator();
+        // Listen for incoming calls to kill the alarm.
+        mTelephonyManager =
+                (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+        mTelephonyManager.listen(
+                mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+        AlarmAlertWakeLock.acquireCpuWakeLock(this);
+    }
+
+    @Override
+    public void onDestroy() {
+        stop();
+        // Stop listening for incoming calls.
+        mTelephonyManager.listen(mPhoneStateListener, 0);
+        AlarmAlertWakeLock.releaseCpuLock();
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        // No intent, tell the system not to restart us.
+        if (intent == null) {
+            stopSelf();
+            return START_NOT_STICKY;
+        }
+
+        final Alarm alarm = intent.getParcelableExtra(
+                Alarms.ALARM_INTENT_EXTRA);
+
+        if (alarm == null) {
+            Log.v("AlarmKlaxon failed to parse the alarm from the intent");
+            stopSelf();
+            return START_NOT_STICKY;
+        }
+
+        if (mCurrentAlarm != null) {
+            sendKillBroadcast(mCurrentAlarm);
+        }
+
+        play(alarm);
+        mCurrentAlarm = alarm;
+        // Record the initial call state here so that the new alarm has the
+        // newest state.
+        mInitialCallState = mTelephonyManager.getCallState();
+
+        return START_STICKY;
+    }
+
+    private void sendKillBroadcast(Alarm alarm) {
+        long millis = System.currentTimeMillis() - mStartTime;
+        int minutes = (int) Math.round(millis / 60000.0);
+        Intent alarmKilled = new Intent(Alarms.ALARM_KILLED);
+        alarmKilled.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);
+        alarmKilled.putExtra(Alarms.ALARM_KILLED_TIMEOUT, minutes);
+        sendBroadcast(alarmKilled);
+    }
+
+    // Volume suggested by media team for in-call alarms.
+    private static final float IN_CALL_VOLUME = 0.125f;
+
+    private void play(Alarm alarm) {
+        // stop() checks to see if we are already playing.
+        stop();
+
+        if (Log.LOGV) {
+            Log.v("AlarmKlaxon.play() " + alarm.id + " alert " + alarm.alert);
+        }
+
+        if (!alarm.silent) {
+            Uri alert = alarm.alert;
+            // Fall back on the default alarm if the database does not have an
+            // alarm stored.
+            if (alert == null) {
+                alert = RingtoneManager.getDefaultUri(
+                        RingtoneManager.TYPE_ALARM);
+                if (Log.LOGV) {
+                    Log.v("Using default alarm: " + alert.toString());
+                }
+            }
+
+            // TODO: Reuse mMediaPlayer instead of creating a new one and/or use
+            // RingtoneManager.
+            mMediaPlayer = new MediaPlayer();
+            mMediaPlayer.setOnErrorListener(new OnErrorListener() {
+                public boolean onError(MediaPlayer mp, int what, int extra) {
+                    Log.e("Error occurred while playing audio.");
+                    mp.stop();
+                    mp.release();
+                    mMediaPlayer = null;
+                    return true;
+                }
+            });
+
+            try {
+                // Check if we are in a call. If we are, use the in-call alarm
+                // resource at a low volume to not disrupt the call.
+                if (mTelephonyManager.getCallState()
+                        != TelephonyManager.CALL_STATE_IDLE) {
+                    Log.v("Using the in-call alarm");
+                    mMediaPlayer.setVolume(IN_CALL_VOLUME, IN_CALL_VOLUME);
+                    setDataSourceFromResource(getResources(), mMediaPlayer,
+                            R.raw.in_call_alarm);
+                } else {
+                    mMediaPlayer.setDataSource(this, alert);
+                }
+                startAlarm(mMediaPlayer);
+            } catch (Exception ex) {
+                Log.v("Using the fallback ringtone");
+                // The alert may be on the sd card which could be busy right
+                // now. Use the fallback ringtone.
+                try {
+                    // Must reset the media player to clear the error state.
+                    mMediaPlayer.reset();
+                    setDataSourceFromResource(getResources(), mMediaPlayer,
+                            com.android.internal.R.raw.fallbackring);
+                    startAlarm(mMediaPlayer);
+                } catch (Exception ex2) {
+                    // At this point we just don't play anything.
+                    Log.e("Failed to play fallback ringtone", ex2);
+                }
+            }
+        }
+
+        /* Start the vibrator after everything is ok with the media player */
+        if (alarm.vibrate) {
+            mVibrator.vibrate(sVibratePattern, 0);
+        } else {
+            mVibrator.cancel();
+        }
+
+        enableKiller(alarm);
+        mPlaying = true;
+        mStartTime = System.currentTimeMillis();
+    }
+
+    // Do the common stuff when starting the alarm.
+    private void startAlarm(MediaPlayer player)
+            throws java.io.IOException, IllegalArgumentException,
+                   IllegalStateException {
+        final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
+        // do not play alarms if stream volume is 0
+        // (typically because ringer mode is silent).
+        if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
+            player.setAudioStreamType(AudioManager.STREAM_ALARM);
+            player.setLooping(true);
+            player.prepare();
+            player.start();
+        }
+    }
+
+    private void setDataSourceFromResource(Resources resources,
+            MediaPlayer player, int res) throws java.io.IOException {
+        AssetFileDescriptor afd = resources.openRawResourceFd(res);
+        if (afd != null) {
+            player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(),
+                    afd.getLength());
+            afd.close();
+        }
+    }
+
+    /**
+     * Stops alarm audio and disables alarm if it not snoozed and not
+     * repeating
+     */
+    public void stop() {
+        if (Log.LOGV) Log.v("AlarmKlaxon.stop()");
+        if (mPlaying) {
+            mPlaying = false;
+
+            // Stop audio playing
+            if (mMediaPlayer != null) {
+                mMediaPlayer.stop();
+                mMediaPlayer.release();
+                mMediaPlayer = null;
+            }
+
+            // Stop vibrator
+            mVibrator.cancel();
+        }
+        disableKiller();
+    }
+
+    /**
+     * Kills alarm audio after ALARM_TIMEOUT_SECONDS, so the alarm
+     * won't run all day.
+     *
+     * This just cancels the audio, but leaves the notification
+     * popped, so the user will know that the alarm tripped.
+     */
+    private void enableKiller(Alarm alarm) {
+        mHandler.sendMessageDelayed(mHandler.obtainMessage(KILLER, alarm),
+                1000 * ALARM_TIMEOUT_SECONDS);
+    }
+
+    private void disableKiller() {
+        mHandler.removeMessages(KILLER);
+    }
+
+
+}
diff --git a/src/com/android/deskclock/AlarmPreference.java b/src/com/android/deskclock/AlarmPreference.java
new file mode 100644 (file)
index 0000000..a977728
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package com.android.deskclock;
+
+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 {
+    private Uri mAlert;
+
+    public AlarmPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onSaveRingtone(Uri ringtoneUri) {
+        setAlert(ringtoneUri);
+    }
+
+    @Override
+    protected Uri onRestoreRingtone() {
+        if (RingtoneManager.isDefault(mAlert)) {
+            return RingtoneManager.getActualDefaultRingtoneUri(getContext(),
+                    RingtoneManager.TYPE_ALARM);
+        }
+        return mAlert;
+    }
+
+    public void setAlert(Uri alert) {
+        mAlert = alert;
+        if (alert != null) {
+            final Ringtone r = RingtoneManager.getRingtone(getContext(), alert);
+            if (r != null) {
+                setSummary(r.getTitle(getContext()));
+            }
+        } else {
+            setSummary(R.string.silent_alarm_summary);
+        }
+    }
+
+    public String getAlertString() {
+        if (mAlert != null) {
+            return mAlert.toString();
+        }
+        return Alarms.ALARM_ALERT_SILENT;
+    }
+}
diff --git a/src/com/android/deskclock/AlarmProvider.java b/src/com/android/deskclock/AlarmProvider.java
new file mode 100644 (file)
index 0000000..4b6c8a3
--- /dev/null
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2007 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.
+ */
+
+package com.android.deskclock;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.sqlite.SQLiteQueryBuilder;
+import android.net.Uri;
+import android.text.TextUtils;
+
+public class AlarmProvider extends ContentProvider {
+    private SQLiteOpenHelper mOpenHelper;
+
+    private static final int ALARMS = 1;
+    private static final int ALARMS_ID = 2;
+    private static final UriMatcher sURLMatcher = new UriMatcher(
+            UriMatcher.NO_MATCH);
+
+    static {
+        sURLMatcher.addURI("com.android.deskclock", "alarm", ALARMS);
+        sURLMatcher.addURI("com.android.deskclock", "alarm/#", ALARMS_ID);
+    }
+
+    private static class DatabaseHelper extends SQLiteOpenHelper {
+        private static final String DATABASE_NAME = "alarms.db";
+        private static final int DATABASE_VERSION = 5;
+
+        public DatabaseHelper(Context context) {
+            super(context, DATABASE_NAME, null, DATABASE_VERSION);
+        }
+
+        @Override
+        public void onCreate(SQLiteDatabase db) {
+            db.execSQL("CREATE TABLE alarms (" +
+                       "_id INTEGER PRIMARY KEY," +
+                       "hour INTEGER, " +
+                       "minutes INTEGER, " +
+                       "daysofweek INTEGER, " +
+                       "alarmtime INTEGER, " +
+                       "enabled INTEGER, " +
+                       "vibrate INTEGER, " +
+                       "message TEXT, " +
+                       "alert TEXT);");
+
+            // insert default alarms
+            String insertMe = "INSERT INTO alarms " +
+                    "(hour, minutes, daysofweek, alarmtime, enabled, vibrate, message, alert) " +
+                    "VALUES ";
+            db.execSQL(insertMe + "(8, 30, 31, 0, 0, 1, '', '');");
+            db.execSQL(insertMe + "(9, 00, 96, 0, 0, 1, '', '');");
+        }
+
+        @Override
+        public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
+            if (Log.LOGV) Log.v(
+                    "Upgrading alarms database from version " +
+                    oldVersion + " to " + currentVersion +
+                    ", which will destroy all old data");
+            db.execSQL("DROP TABLE IF EXISTS alarms");
+            onCreate(db);
+        }
+    }
+
+    public AlarmProvider() {
+    }
+
+    @Override
+    public boolean onCreate() {
+        mOpenHelper = new DatabaseHelper(getContext());
+        return true;
+    }
+
+    @Override
+    public Cursor query(Uri url, String[] projectionIn, String selection,
+            String[] selectionArgs, String sort) {
+        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+
+        // Generate the body of the query
+        int match = sURLMatcher.match(url);
+        switch (match) {
+            case ALARMS:
+                qb.setTables("alarms");
+                break;
+            case ALARMS_ID:
+                qb.setTables("alarms");
+                qb.appendWhere("_id=");
+                qb.appendWhere(url.getPathSegments().get(1));
+                break;
+            default:
+                throw new IllegalArgumentException("Unknown URL " + url);
+        }
+
+        SQLiteDatabase db = mOpenHelper.getReadableDatabase();
+        Cursor ret = qb.query(db, projectionIn, selection, selectionArgs,
+                              null, null, sort);
+
+        if (ret == null) {
+            if (Log.LOGV) Log.v("Alarms.query: failed");
+        } else {
+            ret.setNotificationUri(getContext().getContentResolver(), url);
+        }
+
+        return ret;
+    }
+
+    @Override
+    public String getType(Uri url) {
+        int match = sURLMatcher.match(url);
+        switch (match) {
+            case ALARMS:
+                return "vnd.android.cursor.dir/alarms";
+            case ALARMS_ID:
+                return "vnd.android.cursor.item/alarms";
+            default:
+                throw new IllegalArgumentException("Unknown URL");
+        }
+    }
+
+    @Override
+    public int update(Uri url, ContentValues values, String where, String[] whereArgs) {
+        int count;
+        long rowId = 0;
+        int match = sURLMatcher.match(url);
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        switch (match) {
+            case ALARMS_ID: {
+                String segment = url.getPathSegments().get(1);
+                rowId = Long.parseLong(segment);
+                count = db.update("alarms", values, "_id=" + rowId, null);
+                break;
+            }
+            default: {
+                throw new UnsupportedOperationException(
+                        "Cannot update URL: " + url);
+            }
+        }
+        if (Log.LOGV) Log.v("*** notifyChange() rowId: " + rowId + " url " + url);
+        getContext().getContentResolver().notifyChange(url, null);
+        return count;
+    }
+
+    @Override
+    public Uri insert(Uri url, ContentValues initialValues) {
+        if (sURLMatcher.match(url) != ALARMS) {
+            throw new IllegalArgumentException("Cannot insert into URL: " + url);
+        }
+
+        ContentValues values;
+        if (initialValues != null)
+            values = new ContentValues(initialValues);
+        else
+            values = new ContentValues();
+
+        if (!values.containsKey(Alarm.Columns.HOUR))
+            values.put(Alarm.Columns.HOUR, 0);
+
+        if (!values.containsKey(Alarm.Columns.MINUTES))
+            values.put(Alarm.Columns.MINUTES, 0);
+
+        if (!values.containsKey(Alarm.Columns.DAYS_OF_WEEK))
+            values.put(Alarm.Columns.DAYS_OF_WEEK, 0);
+
+        if (!values.containsKey(Alarm.Columns.ALARM_TIME))
+            values.put(Alarm.Columns.ALARM_TIME, 0);
+
+        if (!values.containsKey(Alarm.Columns.ENABLED))
+            values.put(Alarm.Columns.ENABLED, 0);
+
+        if (!values.containsKey(Alarm.Columns.VIBRATE))
+            values.put(Alarm.Columns.VIBRATE, 1);
+
+        if (!values.containsKey(Alarm.Columns.MESSAGE))
+            values.put(Alarm.Columns.MESSAGE, "");
+
+        if (!values.containsKey(Alarm.Columns.ALERT))
+            values.put(Alarm.Columns.ALERT, "");
+
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        long rowId = db.insert("alarms", Alarm.Columns.MESSAGE, values);
+        if (rowId < 0) {
+            throw new SQLException("Failed to insert row into " + url);
+        }
+        if (Log.LOGV) Log.v("Added alarm rowId = " + rowId);
+
+        Uri newUrl = ContentUris.withAppendedId(Alarm.Columns.CONTENT_URI, rowId);
+        getContext().getContentResolver().notifyChange(newUrl, null);
+        return newUrl;
+    }
+
+    public int delete(Uri url, String where, String[] whereArgs) {
+        SQLiteDatabase db = mOpenHelper.getWritableDatabase();
+        int count;
+        long rowId = 0;
+        switch (sURLMatcher.match(url)) {
+            case ALARMS:
+                count = db.delete("alarms", where, whereArgs);
+                break;
+            case ALARMS_ID:
+                String segment = url.getPathSegments().get(1);
+                rowId = Long.parseLong(segment);
+                if (TextUtils.isEmpty(where)) {
+                    where = "_id=" + segment;
+                } else {
+                    where = "_id=" + segment + " AND (" + where + ")";
+                }
+                count = db.delete("alarms", where, whereArgs);
+                break;
+            default:
+                throw new IllegalArgumentException("Cannot delete from URL: " + url);
+        }
+
+        getContext().getContentResolver().notifyChange(url, null);
+        return count;
+    }
+}
diff --git a/src/com/android/deskclock/AlarmReceiver.java b/src/com/android/deskclock/AlarmReceiver.java
new file mode 100644 (file)
index 0000000..92f929a
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2007 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.
+ */
+
+package com.android.deskclock;
+
+import android.app.KeyguardManager;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.Intent;
+import android.content.BroadcastReceiver;
+import android.database.Cursor;
+import android.os.Parcel;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Glue class: connects AlarmAlert IntentReceiver to AlarmAlert
+ * activity.  Passes through Alarm ID.
+ */
+public class AlarmReceiver extends BroadcastReceiver {
+
+    /** If the alarm is older than STALE_WINDOW seconds, ignore.  It
+        is probably the result of a time or timezone change */
+    private final static int STALE_WINDOW = 60 * 30;
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (Alarms.ALARM_KILLED.equals(intent.getAction())) {
+            // The alarm has been killed, update the notification
+            updateNotification(context, (Alarm)
+                    intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA),
+                    intent.getIntExtra(Alarms.ALARM_KILLED_TIMEOUT, -1));
+            return;
+        } else if (Alarms.CANCEL_SNOOZE.equals(intent.getAction())) {
+            Alarms.saveSnoozeAlert(context, -1, -1);
+            return;
+        }
+
+        Alarm alarm = null;
+        // Grab the alarm from the intent. Since the remote AlarmManagerService
+        // fills in the Intent to add some extra data, it must unparcel the
+        // Alarm object. It throws a ClassNotFoundException when unparcelling.
+        // To avoid this, do the marshalling ourselves.
+        final byte[] data = intent.getByteArrayExtra(Alarms.ALARM_RAW_DATA);
+        if (data != null) {
+            Parcel in = Parcel.obtain();
+            in.unmarshall(data, 0, data.length);
+            in.setDataPosition(0);
+            alarm = Alarm.CREATOR.createFromParcel(in);
+        }
+
+        if (alarm == null) {
+            Log.v("AlarmReceiver failed to parse the alarm from the intent");
+            return;
+        }
+
+        // Intentionally verbose: always log the alarm time to provide useful
+        // information in bug reports.
+        long now = System.currentTimeMillis();
+        SimpleDateFormat format =
+                new SimpleDateFormat("HH:mm:ss.SSS aaa");
+        Log.v("AlarmReceiver.onReceive() id " + alarm.id + " setFor "
+                + format.format(new Date(alarm.time)));
+
+        if (now > alarm.time + STALE_WINDOW * 1000) {
+            if (Log.LOGV) {
+                Log.v("AlarmReceiver ignoring stale alarm");
+            }
+            return;
+        }
+
+        // Maintain a cpu wake lock until the AlarmAlert and AlarmKlaxon can
+        // pick it up.
+        AlarmAlertWakeLock.acquireCpuWakeLock(context);
+
+        /* Close dialogs and window shade */
+        Intent closeDialogs = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+        context.sendBroadcast(closeDialogs);
+
+        // Decide which activity to start based on the state of the keyguard.
+        Class c = AlarmAlert.class;
+        KeyguardManager km = (KeyguardManager) context.getSystemService(
+                Context.KEYGUARD_SERVICE);
+        if (km.inKeyguardRestrictedInputMode()) {
+            // Use the full screen activity for security.
+            c = AlarmAlertFullScreen.class;
+        }
+
+        /* launch UI, explicitly stating that this is not due to user action
+         * so that the current app's notification management is not disturbed */
+        Intent alarmAlert = new Intent(context, c);
+        alarmAlert.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);
+        alarmAlert.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
+        context.startActivity(alarmAlert);
+
+        // Disable the snooze alert if this alarm is the snooze.
+        Alarms.disableSnoozeAlert(context, alarm.id);
+        // Disable this alarm if it does not repeat.
+        if (!alarm.daysOfWeek.isRepeatSet()) {
+            Alarms.enableAlarm(context, alarm.id, false);
+        } else {
+            // Enable the next alert if there is one. The above call to
+            // enableAlarm will call setNextAlert so avoid calling it twice.
+            Alarms.setNextAlert(context);
+        }
+
+        // Play the alarm alert and vibrate the device.
+        Intent playAlarm = new Intent(Alarms.ALARM_ALERT_ACTION);
+        playAlarm.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);
+        context.startService(playAlarm);
+
+        // Trigger a notification that, when clicked, will show the alarm alert
+        // dialog. No need to check for fullscreen since this will always be
+        // launched from a user action.
+        Intent notify = new Intent(context, AlarmAlert.class);
+        notify.putExtra(Alarms.ALARM_INTENT_EXTRA, alarm);
+        PendingIntent pendingNotify = PendingIntent.getActivity(context,
+                alarm.id, notify, 0);
+
+        // Use the alarm's label or the default label as the ticker text and
+        // main text of the notification.
+        String label = alarm.getLabelOrDefault(context);
+        Notification n = new Notification(R.drawable.stat_notify_alarm,
+                label, alarm.time);
+        n.setLatestEventInfo(context, label,
+                context.getString(R.string.alarm_notify_text),
+                pendingNotify);
+        n.flags |= Notification.FLAG_SHOW_LIGHTS
+                | Notification.FLAG_ONGOING_EVENT;
+        n.ledARGB = 0xFF00FF00;
+        n.ledOnMS = 500;
+        n.ledOffMS = 500;
+
+        // Send the notification using the alarm id to easily identify the
+        // correct notification.
+        NotificationManager nm = getNotificationManager(context);
+        nm.notify(alarm.id, n);
+    }
+
+    private NotificationManager getNotificationManager(Context context) {
+        return (NotificationManager)
+                context.getSystemService(Context.NOTIFICATION_SERVICE);
+    }
+
+    private void updateNotification(Context context, Alarm alarm, int timeout) {
+        NotificationManager nm = getNotificationManager(context);
+
+        // If the alarm is null, just cancel the notification.
+        if (alarm == null) {
+            if (Log.LOGV) {
+                Log.v("Cannot update notification for killer callback");
+            }
+            return;
+        }
+
+        // Launch SetAlarm when clicked.
+        Intent viewAlarm = new Intent(context, SetAlarm.class);
+        viewAlarm.putExtra(Alarms.ALARM_ID, alarm.id);
+        PendingIntent intent =
+                PendingIntent.getActivity(context, alarm.id, viewAlarm, 0);
+
+        // Update the notification to indicate that the alert has been
+        // silenced.
+        String label = alarm.getLabelOrDefault(context);
+        Notification n = new Notification(R.drawable.stat_notify_alarm,
+                label, alarm.time);
+        n.setLatestEventInfo(context, label,
+                context.getString(R.string.alarm_alert_alert_silenced, timeout),
+                intent);
+        n.flags |= Notification.FLAG_AUTO_CANCEL;
+        // We have to cancel the original notification since it is in the
+        // ongoing section and we want the "killed" notification to be a plain
+        // notification.
+        nm.cancel(alarm.id);
+        nm.notify(alarm.id, n);
+    }
+}
diff --git a/src/com/android/deskclock/Alarms.java b/src/com/android/deskclock/Alarms.java
new file mode 100644 (file)
index 0000000..ebb337b
--- /dev/null
@@ -0,0 +1,538 @@
+/*
+ * Copyright (C) 2007 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.
+ */
+
+package com.android.deskclock;
+
+import android.app.AlarmManager;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.ContentUris;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Parcel;
+import android.provider.Settings;
+import android.text.format.DateFormat;
+
+import java.util.Calendar;
+import java.text.DateFormatSymbols;
+
+/**
+ * The Alarms provider supplies info about Alarm Clock settings
+ */
+public class Alarms {
+
+    // This action triggers the AlarmReceiver as well as the AlarmKlaxon. It
+    // is a public action used in the manifest for receiving Alarm broadcasts
+    // from the alarm manager.
+    public static final String ALARM_ALERT_ACTION = "com.android.deskclock.ALARM_ALERT";
+
+    // This is a private action used by the AlarmKlaxon to update the UI to
+    // show the alarm has been killed.
+    public static final String ALARM_KILLED = "alarm_killed";
+
+    // Extra in the ALARM_KILLED intent to indicate to the user how long the
+    // alarm played before being killed.
+    public static final String ALARM_KILLED_TIMEOUT = "alarm_killed_timeout";
+
+    // This string is used to indicate a silent alarm in the db.
+    public static final String ALARM_ALERT_SILENT = "silent";
+
+    // This intent is sent from the notification when the user cancels the
+    // snooze alert.
+    public static final String CANCEL_SNOOZE = "cancel_snooze";
+
+    // This string is used when passing an Alarm object through an intent.
+    public static final String ALARM_INTENT_EXTRA = "intent.extra.alarm";
+
+    // This extra is the raw Alarm object data. It is used in the
+    // AlarmManagerService to avoid a ClassNotFoundException when filling in
+    // the Intent extras.
+    public static final String ALARM_RAW_DATA = "intent.extra.alarm_raw";
+
+    // This string is used to identify the alarm id passed to SetAlarm from the
+    // list of alarms.
+    public static final String ALARM_ID = "alarm_id";
+
+    final static String PREF_SNOOZE_ID = "snooze_id";
+    final static String PREF_SNOOZE_TIME = "snooze_time";
+
+    private final static String DM12 = "E h:mm aa";
+    private final static String DM24 = "E k:mm";
+
+    private final static String M12 = "h:mm aa";
+    // Shared with DigitalClock
+    final static String M24 = "kk:mm";
+
+    /**
+     * Creates a new Alarm.
+     */
+    public static Uri addAlarm(ContentResolver contentResolver) {
+        ContentValues values = new ContentValues();
+        values.put(Alarm.Columns.HOUR, 8);
+        return contentResolver.insert(Alarm.Columns.CONTENT_URI, values);
+    }
+
+    /**
+     * Removes an existing Alarm.  If this alarm is snoozing, disables
+     * snooze.  Sets next alert.
+     */
+    public static void deleteAlarm(
+            Context context, int alarmId) {
+
+        ContentResolver contentResolver = context.getContentResolver();
+        /* If alarm is snoozing, lose it */
+        disableSnoozeAlert(context, alarmId);
+
+        Uri uri = ContentUris.withAppendedId(Alarm.Columns.CONTENT_URI, alarmId);
+        contentResolver.delete(uri, "", null);
+
+        setNextAlert(context);
+    }
+
+    /**
+     * Queries all alarms
+     * @return cursor over all alarms
+     */
+    public static Cursor getAlarmsCursor(ContentResolver contentResolver) {
+        return contentResolver.query(
+                Alarm.Columns.CONTENT_URI, Alarm.Columns.ALARM_QUERY_COLUMNS,
+                null, null, Alarm.Columns.DEFAULT_SORT_ORDER);
+    }
+
+    // Private method to get a more limited set of alarms from the database.
+    private static Cursor getFilteredAlarmsCursor(
+            ContentResolver contentResolver) {
+        return contentResolver.query(Alarm.Columns.CONTENT_URI,
+                Alarm.Columns.ALARM_QUERY_COLUMNS, Alarm.Columns.WHERE_ENABLED,
+                null, null);
+    }
+
+    /**
+     * Return an Alarm object representing the alarm id in the database.
+     * Returns null if no alarm exists.
+     */
+    public static Alarm getAlarm(ContentResolver contentResolver, int alarmId) {
+        Cursor cursor = contentResolver.query(
+                ContentUris.withAppendedId(Alarm.Columns.CONTENT_URI, alarmId),
+                Alarm.Columns.ALARM_QUERY_COLUMNS,
+                null, null, null);
+        Alarm alarm = null;
+        if (cursor != null) {
+            if (cursor.moveToFirst()) {
+                alarm = new Alarm(cursor);
+            }
+            cursor.close();
+        }
+        return alarm;
+    }
+
+
+    /**
+     * A convenience method to set an alarm in the Alarms
+     * content provider.
+     *
+     * @param id             corresponds to the _id column
+     * @param enabled        corresponds to the ENABLED column
+     * @param hour           corresponds to the HOUR column
+     * @param minutes        corresponds to the MINUTES column
+     * @param daysOfWeek     corresponds to the DAYS_OF_WEEK column
+     * @param time           corresponds to the ALARM_TIME column
+     * @param vibrate        corresponds to the VIBRATE column
+     * @param message        corresponds to the MESSAGE column
+     * @param alert          corresponds to the ALERT column
+     * @return Time when the alarm will fire.
+     */
+    public static long setAlarm(
+            Context context, int id, boolean enabled, int hour, int minutes,
+            Alarm.DaysOfWeek daysOfWeek, boolean vibrate, String message,
+            String alert) {
+
+        ContentValues values = new ContentValues(8);
+        ContentResolver resolver = context.getContentResolver();
+        // Set the alarm_time value if this alarm does not repeat. This will be
+        // used later to disable expired alarms.
+        long time = 0;
+        if (!daysOfWeek.isRepeatSet()) {
+            time = calculateAlarm(hour, minutes, daysOfWeek).getTimeInMillis();
+        }
+
+        if (Log.LOGV) Log.v(
+                "**  setAlarm * idx " + id + " hour " + hour + " minutes " +
+                minutes + " enabled " + enabled + " time " + time);
+
+        values.put(Alarm.Columns.ENABLED, enabled ? 1 : 0);
+        values.put(Alarm.Columns.HOUR, hour);
+        values.put(Alarm.Columns.MINUTES, minutes);
+        values.put(Alarm.Columns.ALARM_TIME, time);
+        values.put(Alarm.Columns.DAYS_OF_WEEK, daysOfWeek.getCoded());
+        values.put(Alarm.Columns.VIBRATE, vibrate);
+        values.put(Alarm.Columns.MESSAGE, message);
+        values.put(Alarm.Columns.ALERT, alert);
+        resolver.update(ContentUris.withAppendedId(Alarm.Columns.CONTENT_URI, id),
+                        values, null, null);
+
+        long timeInMillis =
+                calculateAlarm(hour, minutes, daysOfWeek).getTimeInMillis();
+
+        if (enabled) {
+            // If this alarm fires before the next snooze, clear the snooze to
+            // enable this alarm.
+            SharedPreferences prefs = context.getSharedPreferences(
+                    AlarmClock.PREFERENCES, 0);
+            long snoozeTime = prefs.getLong(PREF_SNOOZE_TIME, 0);
+            if (timeInMillis < snoozeTime) {
+                clearSnoozePreference(context, prefs);
+            }
+        }
+
+        setNextAlert(context);
+
+        return timeInMillis;
+    }
+
+    /**
+     * A convenience method to enable or disable an alarm.
+     *
+     * @param id             corresponds to the _id column
+     * @param enabled        corresponds to the ENABLED column
+     */
+
+    public static void enableAlarm(
+            final Context context, final int id, boolean enabled) {
+        enableAlarmInternal(context, id, enabled);
+        setNextAlert(context);
+    }
+
+    private static void enableAlarmInternal(final Context context,
+            final int id, boolean enabled) {
+        enableAlarmInternal(context, getAlarm(context.getContentResolver(), id),
+                enabled);
+    }
+
+    private static void enableAlarmInternal(final Context context,
+            final Alarm alarm, boolean enabled) {
+        ContentResolver resolver = context.getContentResolver();
+
+        ContentValues values = new ContentValues(2);
+        values.put(Alarm.Columns.ENABLED, enabled ? 1 : 0);
+
+        // If we are enabling the alarm, calculate alarm time since the time
+        // value in Alarm may be old.
+        if (enabled) {
+            long time = 0;
+            if (!alarm.daysOfWeek.isRepeatSet()) {
+                time = calculateAlarm(alarm.hour, alarm.minutes,
+                        alarm.daysOfWeek).getTimeInMillis();
+            }
+            values.put(Alarm.Columns.ALARM_TIME, time);
+        }
+
+        resolver.update(ContentUris.withAppendedId(
+                Alarm.Columns.CONTENT_URI, alarm.id), values, null, null);
+    }
+
+    public static Alarm calculateNextAlert(final Context context) {
+        Alarm alarm = null;
+        long minTime = Long.MAX_VALUE;
+        long now = System.currentTimeMillis();
+        Cursor cursor = getFilteredAlarmsCursor(context.getContentResolver());
+        if (cursor != null) {
+            if (cursor.moveToFirst()) {
+                do {
+                    Alarm a = new Alarm(cursor);
+                    // A time of 0 indicates this is a repeating alarm, so
+                    // calculate the time to get the next alert.
+                    if (a.time == 0) {
+                        a.time = calculateAlarm(a.hour, a.minutes, a.daysOfWeek)
+                                .getTimeInMillis();
+                    } else if (a.time < now) {
+                        // Expired alarm, disable it and move along.
+                        enableAlarmInternal(context, a, false);
+                        continue;
+                    }
+                    if (a.time < minTime) {
+                        minTime = a.time;
+                        alarm = a;
+                    }
+                } while (cursor.moveToNext());
+            }
+            cursor.close();
+        }
+        return alarm;
+    }
+
+    /**
+     * Disables non-repeating alarms that have passed.  Called at
+     * boot.
+     */
+    public static void disableExpiredAlarms(final Context context) {
+        Cursor cur = getFilteredAlarmsCursor(context.getContentResolver());
+        long now = System.currentTimeMillis();
+
+        if (cur.moveToFirst()) {
+            do {
+                Alarm alarm = new Alarm(cur);
+                // A time of 0 means this alarm repeats. If the time is
+                // non-zero, check if the time is before now.
+                if (alarm.time != 0 && alarm.time < now) {
+                    if (Log.LOGV) {
+                        Log.v("** DISABLE " + alarm.id + " now " + now +" set "
+                                + alarm.time);
+                    }
+                    enableAlarmInternal(context, alarm, false);
+                }
+            } while (cur.moveToNext());
+        }
+        cur.close();
+    }
+
+    /**
+     * Called at system startup, on time/timezone change, and whenever
+     * the user changes alarm settings.  Activates snooze if set,
+     * otherwise loads all alarms, activates next alert.
+     */
+    public static void setNextAlert(final Context context) {
+        if (!enableSnoozeAlert(context)) {
+            Alarm alarm = calculateNextAlert(context);
+            if (alarm != null) {
+                enableAlert(context, alarm, alarm.time);
+            } else {
+                disableAlert(context);
+            }
+        }
+    }
+
+    /**
+     * Sets alert in AlarmManger and StatusBar.  This is what will
+     * actually launch the alert when the alarm triggers.
+     *
+     * @param alarm Alarm.
+     * @param atTimeInMillis milliseconds since epoch
+     */
+    private static void enableAlert(Context context, final Alarm alarm,
+            final long atTimeInMillis) {
+        AlarmManager am = (AlarmManager)
+                context.getSystemService(Context.ALARM_SERVICE);
+
+        if (Log.LOGV) {
+            Log.v("** setAlert id " + alarm.id + " atTime " + atTimeInMillis);
+        }
+
+        Intent intent = new Intent(ALARM_ALERT_ACTION);
+
+        // XXX: This is a slight hack to avoid an exception in the remote
+        // AlarmManagerService process. The AlarmManager adds extra data to
+        // this Intent which causes it to inflate. Since the remote process
+        // does not know about the Alarm class, it throws a
+        // ClassNotFoundException.
+        //
+        // To avoid this, we marshall the data ourselves and then parcel a plain
+        // byte[] array. The AlarmReceiver class knows to build the Alarm
+        // object from the byte[] array.
+        Parcel out = Parcel.obtain();
+        alarm.writeToParcel(out, 0);
+        out.setDataPosition(0);
+        intent.putExtra(ALARM_RAW_DATA, out.marshall());
+
+        PendingIntent sender = PendingIntent.getBroadcast(
+                context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
+
+        am.set(AlarmManager.RTC_WAKEUP, atTimeInMillis, sender);
+
+        setStatusBarIcon(context, true);
+
+        Calendar c = Calendar.getInstance();
+        c.setTime(new java.util.Date(atTimeInMillis));
+        String timeString = formatDayAndTime(context, c);
+        saveNextAlarm(context, timeString);
+    }
+
+    /**
+     * Disables alert in AlarmManger and StatusBar.
+     *
+     * @param id Alarm ID.
+     */
+    static void disableAlert(Context context) {
+        AlarmManager am = (AlarmManager)
+                context.getSystemService(Context.ALARM_SERVICE);
+        PendingIntent sender = PendingIntent.getBroadcast(
+                context, 0, new Intent(ALARM_ALERT_ACTION),
+                PendingIntent.FLAG_CANCEL_CURRENT);
+        am.cancel(sender);
+        setStatusBarIcon(context, false);
+        saveNextAlarm(context, "");
+    }
+
+    static void saveSnoozeAlert(final Context context, final int id,
+            final long time) {
+        SharedPreferences prefs = context.getSharedPreferences(
+                AlarmClock.PREFERENCES, 0);
+        if (id == -1) {
+            clearSnoozePreference(context, prefs);
+        } else {
+            SharedPreferences.Editor ed = prefs.edit();
+            ed.putInt(PREF_SNOOZE_ID, id);
+            ed.putLong(PREF_SNOOZE_TIME, time);
+            ed.commit();
+        }
+        // Set the next alert after updating the snooze.
+        setNextAlert(context);
+    }
+
+    /**
+     * Disable the snooze alert if the given id matches the snooze id.
+     */
+    static void disableSnoozeAlert(final Context context, final int id) {
+        SharedPreferences prefs = context.getSharedPreferences(
+                AlarmClock.PREFERENCES, 0);
+        int snoozeId = prefs.getInt(PREF_SNOOZE_ID, -1);
+        if (snoozeId == -1) {
+            // No snooze set, do nothing.
+            return;
+        } else if (snoozeId == id) {
+            // This is the same id so clear the shared prefs.
+            clearSnoozePreference(context, prefs);
+        }
+    }
+
+    // Helper to remove the snooze preference. Do not use clear because that
+    // will erase the clock preferences. Also clear the snooze notification in
+    // the window shade.
+    private static void clearSnoozePreference(final Context context,
+            final SharedPreferences prefs) {
+        final int alarmId = prefs.getInt(PREF_SNOOZE_ID, -1);
+        if (alarmId != -1) {
+            NotificationManager nm = (NotificationManager)
+                    context.getSystemService(Context.NOTIFICATION_SERVICE);
+            nm.cancel(alarmId);
+        }
+
+        final SharedPreferences.Editor ed = prefs.edit();
+        ed.remove(PREF_SNOOZE_ID);
+        ed.remove(PREF_SNOOZE_TIME);
+        ed.commit();
+    };
+
+    /**
+     * If there is a snooze set, enable it in AlarmManager
+     * @return true if snooze is set
+     */
+    private static boolean enableSnoozeAlert(final Context context) {
+        SharedPreferences prefs = context.getSharedPreferences(
+                AlarmClock.PREFERENCES, 0);
+
+        int id = prefs.getInt(PREF_SNOOZE_ID, -1);
+        if (id == -1) {
+            return false;
+        }
+        long time = prefs.getLong(PREF_SNOOZE_TIME, -1);
+
+        // Get the alarm from the db.
+        final Alarm alarm = getAlarm(context.getContentResolver(), id);
+        // The time in the database is either 0 (repeating) or a specific time
+        // for a non-repeating alarm. Update this value so the AlarmReceiver
+        // has the right time to compare.
+        alarm.time = time;
+
+        enableAlert(context, alarm, time);
+        return true;
+    }
+
+    /**
+     * Tells the StatusBar whether the alarm is enabled or disabled
+     */
+    private static void setStatusBarIcon(Context context, boolean enabled) {
+        Intent alarmChanged = new Intent(Intent.ACTION_ALARM_CHANGED);
+        alarmChanged.putExtra("alarmSet", enabled);
+        context.sendBroadcast(alarmChanged);
+    }
+
+    /**
+     * Given an alarm in hours and minutes, return a time suitable for
+     * setting in AlarmManager.
+     * @param hour Always in 24 hour 0-23
+     * @param minute 0-59
+     * @param daysOfWeek 0-59
+     */
+    static Calendar calculateAlarm(int hour, int minute, Alarm.DaysOfWeek daysOfWeek) {
+
+        // start with now
+        Calendar c = Calendar.getInstance();
+        c.setTimeInMillis(System.currentTimeMillis());
+
+        int nowHour = c.get(Calendar.HOUR_OF_DAY);
+        int nowMinute = c.get(Calendar.MINUTE);
+
+        // if alarm is behind current time, advance one day
+        if (hour < nowHour  ||
+            hour == nowHour && minute <= nowMinute) {
+            c.add(Calendar.DAY_OF_YEAR, 1);
+        }
+        c.set(Calendar.HOUR_OF_DAY, hour);
+        c.set(Calendar.MINUTE, minute);
+        c.set(Calendar.SECOND, 0);
+        c.set(Calendar.MILLISECOND, 0);
+
+        int addDays = daysOfWeek.getNextAlarm(c);
+        /* Log.v("** TIMES * " + c.getTimeInMillis() + " hour " + hour +
+           " minute " + minute + " dow " + c.get(Calendar.DAY_OF_WEEK) + " from now " +
+           addDays); */
+        if (addDays > 0) c.add(Calendar.DAY_OF_WEEK, addDays);
+        return c;
+    }
+
+    static String formatTime(final Context context, int hour, int minute,
+                             Alarm.DaysOfWeek daysOfWeek) {
+        Calendar c = calculateAlarm(hour, minute, daysOfWeek);
+        return formatTime(context, c);
+    }
+
+    /* used by AlarmAlert */
+    static String formatTime(final Context context, Calendar c) {
+        String format = get24HourMode(context) ? M24 : M12;
+        return (c == null) ? "" : (String)DateFormat.format(format, c);
+    }
+
+    /**
+     * Shows day and time -- used for lock screen
+     */
+    private static String formatDayAndTime(final Context context, Calendar c) {
+        String format = get24HourMode(context) ? DM24 : DM12;
+        return (c == null) ? "" : (String)DateFormat.format(format, c);
+    }
+
+    /**
+     * Save time of the next alarm, as a formatted string, into the system
+     * settings so those who care can make use of it.
+     */
+    static void saveNextAlarm(final Context context, String timeString) {
+        Settings.System.putString(context.getContentResolver(),
+                                  Settings.System.NEXT_ALARM_FORMATTED,
+                                  timeString);
+    }
+
+    /**
+     * @return true if clock is set to 24-hour mode
+     */
+    static boolean get24HourMode(final Context context) {
+        return android.text.format.DateFormat.is24HourFormat(context);
+    }
+}
diff --git a/src/com/android/deskclock/AnalogAppWidgetProvider.java b/src/com/android/deskclock/AnalogAppWidgetProvider.java
new file mode 100644 (file)
index 0000000..d78f82f
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ */
+
+package com.android.deskclock;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.appwidget.AppWidgetManager;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.graphics.PorterDuff;
+import android.net.Uri;
+import android.provider.Calendar;
+import android.provider.Calendar.Attendees;
+import android.provider.Calendar.Calendars;
+import android.provider.Calendar.EventsColumns;
+import android.provider.Calendar.Instances;
+import android.provider.Calendar.Reminders;
+import android.text.format.DateFormat;
+import android.text.format.DateUtils;
+import android.util.Config;
+import android.util.Log;
+import android.view.View;
+import android.widget.RemoteViews;
+
+import java.util.Arrays;
+
+/**
+ * Simple widget to show analog clock.
+ */
+public class AnalogAppWidgetProvider extends BroadcastReceiver {
+    static final String TAG = "AnalogAppWidgetProvider";
+
+    public void onReceive(Context context, Intent intent) {
+        String action = intent.getAction();
+        
+        if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
+            RemoteViews views = new RemoteViews(context.getPackageName(),
+                    R.layout.analog_appwidget);
+            
+            int[] appWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
+            
+            AppWidgetManager gm = AppWidgetManager.getInstance(context);
+            gm.updateAppWidget(appWidgetIds, views);
+        }
+    }
+}
+
diff --git a/src/com/android/deskclock/DeskClock.java b/src/com/android/deskclock/DeskClock.java
new file mode 100644 (file)
index 0000000..de96e9b
--- /dev/null
@@ -0,0 +1,801 @@
+/*
+ * 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.
+ */
+
+package com.android.deskclock;
+
+import android.app.Activity;
+import android.app.AlarmManager;
+import android.app.AlertDialog;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.database.Cursor;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemClock;
+import android.os.PowerManager;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.ContextMenu;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View.OnClickListener;
+import android.view.View.OnCreateContextMenuListener;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.view.animation.TranslateAnimation;
+import android.widget.AbsoluteLayout;
+import android.widget.AdapterView.AdapterContextMenuInfo;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import static android.os.BatteryManager.BATTERY_STATUS_CHARGING;
+import static android.os.BatteryManager.BATTERY_STATUS_FULL;
+import static android.os.BatteryManager.BATTERY_STATUS_UNKNOWN;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Random;
+
+/**
+ * DeskClock clock view for desk docks.
+ */
+public class DeskClock extends Activity {
+    private static final boolean DEBUG = false;
+
+    private static final String LOG_TAG = "DeskClock";
+
+    // Package ID of the music player.
+    private static final String MUSIC_PACKAGE_ID = "com.android.music";
+
+    // Alarm action for midnight (so we can update the date display).
+    private static final String ACTION_MIDNIGHT = "com.android.deskclock.MIDNIGHT";
+
+    // Intent to broadcast for dock settings.
+    private static final String DOCK_SETTINGS_ACTION = "com.android.settings.DOCK_SETTINGS";
+
+    // Interval between polls of the weather widget. Its refresh period is
+    // likely to be much longer (~3h), but we want to pick up any changes
+    // within 5 minutes.
+    private final long QUERY_WEATHER_DELAY = 5 * 60 * 1000; // 5 min
+
+    // Delay before engaging the burn-in protection mode (green-on-black).
+    private final long SCREEN_SAVER_TIMEOUT = 5* 60 * 1000; // 10 min
+
+    // Repositioning delay in screen saver.
+    private final long SCREEN_SAVER_MOVE_DELAY = 60 * 1000; // 1 min
+
+    // Color to use for text & graphics in screen saver mode.
+    private final int SCREEN_SAVER_COLOR = 0xFF308030;
+    private final int SCREEN_SAVER_COLOR_DIM = 0xFF183018;
+
+    // Opacity of black layer between clock display and wallpaper.
+    private final float DIM_BEHIND_AMOUNT_NORMAL = 0.4f;
+    private final float DIM_BEHIND_AMOUNT_DIMMED = 0.7f; // higher contrast when display dimmed
+
+    // Internal message IDs.
+    private final int QUERY_WEATHER_DATA_MSG     = 0x1000;
+    private final int UPDATE_WEATHER_DISPLAY_MSG = 0x1001;
+    private final int SCREEN_SAVER_TIMEOUT_MSG   = 0x2000;
+    private final int SCREEN_SAVER_MOVE_MSG      = 0x2001;
+
+    // Weather widget query information.
+    private static final String GENIE_PACKAGE_ID = "com.google.android.apps.genie.geniewidget";
+    private static final String WEATHER_CONTENT_AUTHORITY = GENIE_PACKAGE_ID + ".weather";
+    private static final String WEATHER_CONTENT_PATH = "/weather/current";
+    private static final String[] WEATHER_CONTENT_COLUMNS = new String[] {
+            "location",
+            "timestamp",
+            "temperature",
+            "highTemperature",
+            "lowTemperature",
+            "iconUrl",
+            "iconResId",
+            "description",
+        };
+
+    private static final String ACTION_GENIE_REFRESH = "com.google.android.apps.genie.REFRESH";
+
+    // State variables follow.
+    private DigitalClock mTime;
+    private TextView mDate;
+
+    private TextView mNextAlarm = null;
+    private TextView mBatteryDisplay;
+
+    private TextView mWeatherCurrentTemperature;
+    private TextView mWeatherHighTemperature;
+    private TextView mWeatherLowTemperature;
+    private TextView mWeatherLocation;
+    private ImageView mWeatherIcon;
+
+    private String mWeatherCurrentTemperatureString;
+    private String mWeatherHighTemperatureString;
+    private String mWeatherLowTemperatureString;
+    private String mWeatherLocationString;
+    private Drawable mWeatherIconDrawable;
+
+    private Resources mGenieResources = null;
+
+    private boolean mDimmed = false;
+    private boolean mScreenSaverMode = false;
+
+    private String mDateFormat;
+
+    private int mBatteryLevel = -1;
+    private boolean mPluggedIn = false;
+
+    private boolean mLaunchedFromDock = false;
+
+    private Random mRNG;
+
+    private PendingIntent mMidnightIntent;
+
+    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            final String action = intent.getAction();
+            if (DEBUG) Log.d(LOG_TAG, "mIntentReceiver.onReceive: action=" + action + ", intent=" + intent);
+            if (Intent.ACTION_DATE_CHANGED.equals(action) || ACTION_MIDNIGHT.equals(action)) {
+                refreshDate();
+            } else if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
+                handleBatteryUpdate(
+                    intent.getIntExtra("status", BATTERY_STATUS_UNKNOWN),
+                    intent.getIntExtra("level", 0));
+            } else if (Intent.ACTION_DOCK_EVENT.equals(action)) {
+                int state = intent.getIntExtra(Intent.EXTRA_DOCK_STATE, -1);
+                if (DEBUG) Log.d(LOG_TAG, "ACTION_DOCK_EVENT, state=" + state);
+                if (state == Intent.EXTRA_DOCK_STATE_UNDOCKED) {
+                    if (mLaunchedFromDock) {
+                        // moveTaskToBack(false);
+                        finish();
+                    }
+                    mLaunchedFromDock = false;
+                }
+            }
+        }
+    };
+
+    private final Handler mHandy = new Handler() {
+        @Override
+        public void handleMessage(Message m) {
+            if (m.what == QUERY_WEATHER_DATA_MSG) {
+                new Thread() { public void run() { queryWeatherData(); } }.start();
+                scheduleWeatherQueryDelayed(QUERY_WEATHER_DELAY);
+            } else if (m.what == UPDATE_WEATHER_DISPLAY_MSG) {
+                updateWeatherDisplay();
+            } else if (m.what == SCREEN_SAVER_TIMEOUT_MSG) {
+                saveScreen();
+            } else if (m.what == SCREEN_SAVER_MOVE_MSG) {
+                moveScreenSaver();
+            }
+        }
+    };
+
+
+    private void moveScreenSaver() {
+        moveScreenSaverTo(-1,-1);
+    }
+    private void moveScreenSaverTo(int x, int y) {
+        if (!mScreenSaverMode) return;
+
+        final View saver_view = findViewById(R.id.saver_view);
+
+        DisplayMetrics metrics = new DisplayMetrics();
+        getWindowManager().getDefaultDisplay().getMetrics(metrics);
+
+        if (x < 0 || y < 0) {
+            int myWidth = saver_view.getMeasuredWidth();
+            int myHeight = saver_view.getMeasuredHeight();
+            x = (int)(mRNG.nextFloat()*(metrics.widthPixels - myWidth));
+            y = (int)(mRNG.nextFloat()*(metrics.heightPixels - myHeight));
+        }
+
+        if (DEBUG) Log.d(LOG_TAG, String.format("screen saver: %d: jumping to (%d,%d)",
+                System.currentTimeMillis(), x, y));
+
+        saver_view.setLayoutParams(new AbsoluteLayout.LayoutParams(
+            ViewGroup.LayoutParams.WRAP_CONTENT,
+            ViewGroup.LayoutParams.WRAP_CONTENT,
+            x,
+            y));
+
+        // Synchronize our jumping so that it happens exactly on the second.
+        mHandy.sendEmptyMessageDelayed(SCREEN_SAVER_MOVE_MSG,
+            SCREEN_SAVER_MOVE_DELAY +
+            (1000 - (System.currentTimeMillis() % 1000)));
+    }
+
+    private void setWakeLock(boolean hold) {
+        if (DEBUG) Log.d(LOG_TAG, (hold ? "hold" : " releas") + "ing wake lock");
+        Window win = getWindow();
+        WindowManager.LayoutParams winParams = win.getAttributes();
+        winParams.flags |= WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
+        winParams.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
+        winParams.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+        if (hold)
+            winParams.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
+        else
+            winParams.flags &= (~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        win.setAttributes(winParams);
+    }
+
+    private void scheduleScreenSaver() {
+        // reschedule screen saver
+        mHandy.removeMessages(SCREEN_SAVER_TIMEOUT_MSG);
+        mHandy.sendMessageDelayed(
+            Message.obtain(mHandy, SCREEN_SAVER_TIMEOUT_MSG),
+            SCREEN_SAVER_TIMEOUT);
+    }
+
+    private void restoreScreen() {
+        if (!mScreenSaverMode) return;
+        if (DEBUG) Log.d(LOG_TAG, "restoreScreen");
+        mScreenSaverMode = false;
+        initViews();
+        doDim(false); // restores previous dim mode
+        // policy: update weather info when returning from screen saver
+        if (mPluggedIn) requestWeatherDataFetch();
+
+        scheduleScreenSaver();
+
+        refreshAll();
+    }
+
+    // Special screen-saver mode for OLED displays that burn in quickly
+    private void saveScreen() {
+        if (mScreenSaverMode) return;
+        if (DEBUG) Log.d(LOG_TAG, "saveScreen");
+
+        // quickly stash away the x/y of the current date
+        final View oldTimeDate = findViewById(R.id.time_date);
+        int oldLoc[] = new int[2];
+        oldTimeDate.getLocationOnScreen(oldLoc);
+
+        mScreenSaverMode = true;
+        Window win = getWindow();
+        WindowManager.LayoutParams winParams = win.getAttributes();
+        winParams.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
+        win.setAttributes(winParams);
+
+        // give up any internal focus before we switch layouts
+        final View focused = getCurrentFocus();
+        if (focused != null) focused.clearFocus();
+
+        setContentView(R.layout.desk_clock_saver);
+
+        mTime = (DigitalClock) findViewById(R.id.time);
+        mDate = (TextView) findViewById(R.id.date);
+        mNextAlarm = (TextView) findViewById(R.id.nextAlarm);
+
+        final int color = mDimmed ? SCREEN_SAVER_COLOR_DIM : SCREEN_SAVER_COLOR;
+
+        ((TextView)findViewById(R.id.timeDisplay)).setTextColor(color);
+        ((TextView)findViewById(R.id.am_pm)).setTextColor(color);
+        mDate.setTextColor(color);
+        mNextAlarm.setTextColor(color);
+        mNextAlarm.setCompoundDrawablesWithIntrinsicBounds(
+            getResources().getDrawable(mDimmed
+                ? R.drawable.ic_lock_idle_alarm_saver_dim
+                : R.drawable.ic_lock_idle_alarm_saver),
+            null, null, null);
+
+        mBatteryDisplay =
+        mWeatherCurrentTemperature =
+        mWeatherHighTemperature =
+        mWeatherLowTemperature =
+        mWeatherLocation = null;
+        mWeatherIcon = null;
+
+        refreshDate();
+        refreshAlarm();
+
+        moveScreenSaverTo(oldLoc[0], oldLoc[1]);
+    }
+
+    @Override
+    public void onUserInteraction() {
+        if (mScreenSaverMode)
+            restoreScreen();
+    }
+
+    // Tell the Genie widget to load new data from the network.
+    private void requestWeatherDataFetch() {
+        if (DEBUG) Log.d(LOG_TAG, "forcing the Genie widget to update weather now...");
+        sendBroadcast(new Intent(ACTION_GENIE_REFRESH).putExtra("requestWeather", true));
+        // update the display with any new data
+        scheduleWeatherQueryDelayed(5000);
+    }
+
+    private boolean supportsWeather() {
+        return (mGenieResources != null);
+    }
+
+    private void scheduleWeatherQueryDelayed(long delay) {
+        // cancel any existing scheduled queries
+        unscheduleWeatherQuery();
+
+        if (DEBUG) Log.d(LOG_TAG, "scheduling weather fetch message for " + delay + "ms from now");
+
+        mHandy.sendEmptyMessageDelayed(QUERY_WEATHER_DATA_MSG, delay);
+    }
+
+    private void unscheduleWeatherQuery() {
+        mHandy.removeMessages(QUERY_WEATHER_DATA_MSG);
+    }
+
+    private void queryWeatherData() {
+        // if we couldn't load the weather widget's resources, we simply
+        // assume it's not present on the device.
+        if (mGenieResources == null) return;
+
+        Uri queryUri = new Uri.Builder()
+            .scheme(android.content.ContentResolver.SCHEME_CONTENT)
+            .authority(WEATHER_CONTENT_AUTHORITY)
+            .path(WEATHER_CONTENT_PATH)
+            .appendPath(new Long(System.currentTimeMillis()).toString())
+            .build();
+
+        if (DEBUG) Log.d(LOG_TAG, "querying genie: " + queryUri);
+
+        Cursor cur;
+        try {
+            cur = managedQuery(
+                queryUri,
+                WEATHER_CONTENT_COLUMNS,
+                null,
+                null,
+                null);
+        } catch (RuntimeException e) {
+            Log.e(LOG_TAG, "Weather query failed", e);
+            cur = null;
+        }
+
+        if (cur != null && cur.moveToFirst()) {
+            if (DEBUG) {
+                java.lang.StringBuilder sb =
+                    new java.lang.StringBuilder("Weather query result: {");
+                for(int i=0; i<cur.getColumnCount(); i++) {
+                    if (i>0) sb.append(", ");
+                    sb.append(cur.getColumnName(i))
+                        .append("=")
+                        .append(cur.getString(i));
+                }
+                sb.append("}");
+                Log.d(LOG_TAG, sb.toString());
+            }
+
+            mWeatherIconDrawable = mGenieResources.getDrawable(cur.getInt(
+                cur.getColumnIndexOrThrow("iconResId")));
+
+            mWeatherLocationString = cur.getString(
+                cur.getColumnIndexOrThrow("location"));
+
+            // any of these may be NULL
+            final int colTemp = cur.getColumnIndexOrThrow("temperature");
+            final int colHigh = cur.getColumnIndexOrThrow("highTemperature");
+            final int colLow = cur.getColumnIndexOrThrow("lowTemperature");
+
+            mWeatherCurrentTemperatureString =
+                cur.isNull(colTemp)
+                    ? "\u2014"
+                    : String.format("%d\u00b0", cur.getInt(colTemp));
+            mWeatherHighTemperatureString =
+                cur.isNull(colHigh)
+                    ? "\u2014"
+                    : String.format("%d\u00b0", cur.getInt(colHigh));
+            mWeatherLowTemperatureString =
+                cur.isNull(colLow)
+                    ? "\u2014"
+                    : String.format("%d\u00b0", cur.getInt(colLow));
+        } else {
+            Log.w(LOG_TAG, "No weather information available (cur="
+                + cur +")");
+            mWeatherIconDrawable = null;
+            mWeatherLocationString = getString(R.string.weather_fetch_failure);
+            mWeatherCurrentTemperatureString =
+                mWeatherHighTemperatureString =
+                mWeatherLowTemperatureString = "";
+        }
+
+        mHandy.sendEmptyMessage(UPDATE_WEATHER_DISPLAY_MSG);
+    }
+
+    private void refreshWeather() {
+        if (supportsWeather())
+            scheduleWeatherQueryDelayed(0);
+        updateWeatherDisplay(); // in case we have it cached
+    }
+
+    private void updateWeatherDisplay() {
+        if (mWeatherCurrentTemperature == null) return;
+
+        mWeatherCurrentTemperature.setText(mWeatherCurrentTemperatureString);
+        mWeatherHighTemperature.setText(mWeatherHighTemperatureString);
+        mWeatherLowTemperature.setText(mWeatherLowTemperatureString);
+        mWeatherLocation.setText(mWeatherLocationString);
+        mWeatherIcon.setImageDrawable(mWeatherIconDrawable);
+    }
+
+    // Adapted from KeyguardUpdateMonitor.java
+    private void handleBatteryUpdate(int plugStatus, int batteryLevel) {
+        final boolean pluggedIn = (plugStatus == BATTERY_STATUS_CHARGING || plugStatus == BATTERY_STATUS_FULL);
+        if (pluggedIn != mPluggedIn) {
+            setWakeLock(pluggedIn);
+
+            if (pluggedIn) {
+                // policy: update weather info when attaching to power
+                requestWeatherDataFetch();
+            }
+        }
+        if (pluggedIn != mPluggedIn || batteryLevel != mBatteryLevel) {
+            mBatteryLevel = batteryLevel;
+            mPluggedIn = pluggedIn;
+            refreshBattery();
+        }
+    }
+
+    private void refreshBattery() {
+        if (mBatteryDisplay == null) return;
+
+        if (mPluggedIn /* || mBatteryLevel < LOW_BATTERY_THRESHOLD */) {
+            mBatteryDisplay.setCompoundDrawablesWithIntrinsicBounds(
+                0, 0, android.R.drawable.ic_lock_idle_charging, 0);
+            mBatteryDisplay.setText(
+                getString(R.string.battery_charging_level, mBatteryLevel));
+            mBatteryDisplay.setVisibility(View.VISIBLE);
+        } else {
+            mBatteryDisplay.setVisibility(View.INVISIBLE);
+        }
+    }
+
+    private void refreshDate() {
+        final Date now = new Date();
+        if (DEBUG) Log.d(LOG_TAG, "refreshing date..." + now);
+        mDate.setText(DateFormat.format(mDateFormat, now));
+    }
+
+    private void refreshAlarm() {
+        if (mNextAlarm == null) return;
+
+        String nextAlarm = Settings.System.getString(getContentResolver(),
+                Settings.System.NEXT_ALARM_FORMATTED);
+        if (!TextUtils.isEmpty(nextAlarm)) {
+            mNextAlarm.setText(nextAlarm);
+            //mNextAlarm.setCompoundDrawablesWithIntrinsicBounds(
+            //    android.R.drawable.ic_lock_idle_alarm, 0, 0, 0);
+            mNextAlarm.setVisibility(View.VISIBLE);
+        } else {
+            mNextAlarm.setVisibility(View.INVISIBLE);
+        }
+    }
+
+    private void refreshAll() {
+        refreshDate();
+        refreshAlarm();
+        refreshBattery();
+        refreshWeather();
+    }
+
+    private void doDim(boolean fade) {
+        View tintView = findViewById(R.id.window_tint);
+        if (tintView == null) return;
+
+        Window win = getWindow();
+        WindowManager.LayoutParams winParams = win.getAttributes();
+
+        winParams.flags |= (WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
+        winParams.flags |= (WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
+
+        // dim the wallpaper somewhat (how much is determined below)
+        winParams.flags |= (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+
+        if (mDimmed) {
+            winParams.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
+            winParams.dimAmount = DIM_BEHIND_AMOUNT_DIMMED;
+
+            // show the window tint
+            tintView.startAnimation(AnimationUtils.loadAnimation(this,
+                fade ? R.anim.dim
+                     : R.anim.dim_instant));
+        } else {
+            winParams.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
+            winParams.dimAmount = DIM_BEHIND_AMOUNT_NORMAL;
+
+            // hide the window tint
+            tintView.startAnimation(AnimationUtils.loadAnimation(this,
+                fade ? R.anim.undim
+                     : R.anim.undim_instant));
+        }
+
+        win.setAttributes(winParams);
+    }
+
+    @Override
+    public void onNewIntent(Intent newIntent) {
+        super.onNewIntent(newIntent);
+        if (DEBUG) Log.d(LOG_TAG, "onNewIntent with intent: " + newIntent);
+
+        // update our intent so that we can consult it to determine whether or
+        // not the most recent launch was via a dock event 
+        setIntent(newIntent);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        if (DEBUG) Log.d(LOG_TAG, "onResume with intent: " + getIntent());
+
+        // reload the date format in case the user has changed settings
+        // recently
+        mDateFormat = getString(com.android.internal.R.string.full_wday_month_day_no_year);
+
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Intent.ACTION_DATE_CHANGED);
+        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
+        filter.addAction(Intent.ACTION_DOCK_EVENT);
+        filter.addAction(ACTION_MIDNIGHT);
+        registerReceiver(mIntentReceiver, filter);
+
+        Calendar today = Calendar.getInstance();
+        today.set(Calendar.HOUR_OF_DAY, 0);
+        today.set(Calendar.MINUTE, 0);
+        today.set(Calendar.SECOND, 0);
+        today.add(Calendar.DATE, 1);
+        long alarmTimeUTC = today.getTimeInMillis() + today.get(Calendar.ZONE_OFFSET);
+        mMidnightIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_MIDNIGHT), 0);
+        AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
+        am.setRepeating(AlarmManager.RTC, alarmTimeUTC, AlarmManager.INTERVAL_DAY, mMidnightIntent);
+        if (DEBUG) Log.d(LOG_TAG, "set repeating midnight event at "
+            + alarmTimeUTC + " repeating every "
+            + AlarmManager.INTERVAL_DAY + " with intent: " + mMidnightIntent);
+
+        // un-dim when resuming
+        mDimmed = false;
+        doDim(false);
+
+        restoreScreen(); // disable screen saver
+        refreshAll(); // will schedule periodic weather fetch
+
+        setWakeLock(mPluggedIn);
+
+        scheduleScreenSaver();
+
+        final boolean launchedFromDock
+            = getIntent().hasCategory(Intent.CATEGORY_DESK_DOCK);
+
+        if (supportsWeather() && launchedFromDock && !mLaunchedFromDock) {
+            // policy: fetch weather if launched via dock connection
+            if (DEBUG) Log.d(LOG_TAG, "Device now docked; forcing weather to refresh right now");
+            requestWeatherDataFetch();
+        }
+
+        mLaunchedFromDock = launchedFromDock;
+    }
+
+    @Override
+    public void onPause() {
+        if (DEBUG) Log.d(LOG_TAG, "onPause");
+
+        // Turn off the screen saver and cancel any pending timeouts.
+        // (But don't un-dim.)
+        mHandy.removeMessages(SCREEN_SAVER_TIMEOUT_MSG);
+        restoreScreen();
+
+        // Other things we don't want to be doing in the background.
+        unregisterReceiver(mIntentReceiver);
+        AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
+        am.cancel(mMidnightIntent);
+        unscheduleWeatherQuery();
+
+        super.onPause();
+    }
+
+    @Override
+    public void onStop() {
+        if (DEBUG) Log.d(LOG_TAG, "onStop");
+
+        // Avoid situations where the user launches Alarm Clock and is
+        // surprised to find it in dim mode (because it was last used in dim
+        // mode, but that last use is long in the past).
+        mDimmed = false;
+
+        super.onStop();
+    }
+
+    private void initViews() {
+        // give up any internal focus before we switch layouts
+        final View focused = getCurrentFocus();
+        if (focused != null) focused.clearFocus();
+
+        setContentView(R.layout.desk_clock);
+
+        mTime = (DigitalClock) findViewById(R.id.time);
+        mDate = (TextView) findViewById(R.id.date);
+        mBatteryDisplay = (TextView) findViewById(R.id.battery);
+
+        mTime.getRootView().requestFocus();
+
+        mWeatherCurrentTemperature = (TextView) findViewById(R.id.weather_temperature);
+        mWeatherHighTemperature = (TextView) findViewById(R.id.weather_high_temperature);
+        mWeatherLowTemperature = (TextView) findViewById(R.id.weather_low_temperature);
+        mWeatherLocation = (TextView) findViewById(R.id.weather_location);
+        mWeatherIcon = (ImageView) findViewById(R.id.weather_icon);
+
+        final View.OnClickListener alarmClickListener = new View.OnClickListener() {
+            public void onClick(View v) {
+                startActivity(new Intent(DeskClock.this, AlarmClock.class));
+            }
+        };
+
+        mNextAlarm = (TextView) findViewById(R.id.nextAlarm);
+        mNextAlarm.setOnClickListener(alarmClickListener);
+
+        final ImageButton alarmButton = (ImageButton) findViewById(R.id.alarm_button);
+        alarmButton.setOnClickListener(alarmClickListener);
+
+        final ImageButton galleryButton = (ImageButton) findViewById(R.id.gallery_button);
+        galleryButton.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                try {
+                    startActivity(new Intent(
+                        Intent.ACTION_VIEW,
+                        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
+                            .putExtra("slideshow", true)
+                            .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP));
+                } catch (android.content.ActivityNotFoundException e) {
+                    Log.e(LOG_TAG, "Couldn't launch image browser", e);
+                }
+            }
+        });
+
+        final ImageButton musicButton = (ImageButton) findViewById(R.id.music_button);
+        musicButton.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                try {
+                    Intent musicAppQuery = getPackageManager()
+                        .getLaunchIntentForPackage(MUSIC_PACKAGE_ID)
+                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                    if (musicAppQuery != null) {
+                        startActivity(musicAppQuery);
+                    }
+                } catch (android.content.ActivityNotFoundException e) {
+                    Log.e(LOG_TAG, "Couldn't launch music browser", e);
+                }
+            }
+        });
+
+        final ImageButton homeButton = (ImageButton) findViewById(R.id.home_button);
+        homeButton.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                startActivity(
+                    new Intent(Intent.ACTION_MAIN)
+                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP)
+                        .addCategory(Intent.CATEGORY_HOME));
+            }
+        });
+
+        final ImageButton nightmodeButton = (ImageButton) findViewById(R.id.nightmode_button);
+        nightmodeButton.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                mDimmed = ! mDimmed;
+                doDim(true);
+            }
+        });
+
+        nightmodeButton.setOnLongClickListener(new View.OnLongClickListener() {
+            public boolean onLongClick(View v) {
+                saveScreen();
+                return true;
+            }
+        });
+
+        final View weatherView = findViewById(R.id.weather);
+        weatherView.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                if (!supportsWeather()) return;
+
+                Intent genieAppQuery = getPackageManager()
+                    .getLaunchIntentForPackage(GENIE_PACKAGE_ID)
+                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                if (genieAppQuery != null) {
+                    startActivity(genieAppQuery);
+                }
+            }
+        });
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        if (!mScreenSaverMode) {
+            initViews();
+            doDim(false);
+            refreshAll();
+        }
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.menu_item_alarms:
+                startActivity(new Intent(DeskClock.this, AlarmClock.class));
+                return true;
+            case R.id.menu_item_add_alarm:
+                AlarmClock.addNewAlarm(this);
+                return true;
+            case R.id.menu_item_dock_settings:
+                startActivity(new Intent(DOCK_SETTINGS_ACTION));
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        MenuInflater inflater = getMenuInflater();
+        inflater.inflate(R.menu.desk_clock_menu, menu);
+        return true;
+    }
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+
+        mRNG = new Random();
+
+        try {
+            mGenieResources = getPackageManager().getResourcesForApplication(GENIE_PACKAGE_ID);
+        } catch (PackageManager.NameNotFoundException e) {
+            // no weather info available
+            Log.w(LOG_TAG, "Can't find "+GENIE_PACKAGE_ID+". Weather forecast will not be available.");
+        }
+
+        initViews();
+    }
+
+}
diff --git a/src/com/android/deskclock/DigitalClock.java b/src/com/android/deskclock/DigitalClock.java
new file mode 100644 (file)
index 0000000..69a7156
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package com.android.deskclock;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.database.ContentObserver;
+import android.graphics.Typeface;
+import android.os.Handler;
+import android.provider.Settings;
+import android.text.format.DateFormat;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.text.DateFormatSymbols;
+import java.util.Calendar;
+
+/**
+ * Displays the time
+ */
+public class DigitalClock extends LinearLayout {
+
+    private final static String M12 = "h:mm";
+
+    private Calendar mCalendar;
+    private String mFormat;
+    private TextView mTimeDisplay;
+    private AmPm mAmPm;
+    private ContentObserver mFormatChangeObserver;
+    private boolean mLive = true;
+    private boolean mAttached;
+
+    /* called by system on minute ticks */
+    private final Handler mHandler = new Handler();
+    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                if (mLive && intent.getAction().equals(
+                            Intent.ACTION_TIMEZONE_CHANGED)) {
+                    mCalendar = Calendar.getInstance();
+                }
+                // Post a runnable to avoid blocking the broadcast.
+                mHandler.post(new Runnable() {
+                        public void run() {
+                            updateTime();
+                        }
+                });
+            }
+        };
+
+    static class AmPm {
+        private TextView mAmPm;
+        private String mAmString, mPmString;
+
+        AmPm(View parent) {
+            mAmPm = (TextView) parent.findViewById(R.id.am_pm);
+
+            String[] ampm = new DateFormatSymbols().getAmPmStrings();
+            mAmString = ampm[0];
+            mPmString = ampm[1];
+        }
+
+        void setShowAmPm(boolean show) {
+            mAmPm.setVisibility(show ? View.VISIBLE : View.GONE);
+        }
+
+        void setIsMorning(boolean isMorning) {
+            mAmPm.setText(isMorning ? mAmString : mPmString);
+        }
+    }
+
+    private class FormatChangeObserver extends ContentObserver {
+        public FormatChangeObserver() {
+            super(new Handler());
+        }
+        @Override
+        public void onChange(boolean selfChange) {
+            setDateFormat();
+            updateTime();
+        }
+    }
+
+    public DigitalClock(Context context) {
+        this(context, null);
+    }
+
+    public DigitalClock(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
+                "fonts/Clockopia.ttf");
+        mTimeDisplay = (TextView) findViewById(R.id.timeDisplay);
+        mTimeDisplay.setTypeface(tf);
+        mAmPm = new AmPm(this);
+        mCalendar = Calendar.getInstance();
+
+        setDateFormat();
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+
+        if (Log.LOGV) Log.v("onAttachedToWindow " + this);
+
+        if (mAttached) return;
+        mAttached = true;
+
+        if (mLive) {
+            /* monitor time ticks, time changed, timezone */
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(Intent.ACTION_TIME_TICK);
+            filter.addAction(Intent.ACTION_TIME_CHANGED);
+            filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
+            mContext.registerReceiver(mIntentReceiver, filter);
+        }
+
+        /* monitor 12/24-hour display preference */
+        mFormatChangeObserver = new FormatChangeObserver();
+        mContext.getContentResolver().registerContentObserver(
+                Settings.System.CONTENT_URI, true, mFormatChangeObserver);
+
+        updateTime();
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+
+        if (!mAttached) return;
+        mAttached = false;
+
+        if (mLive) {
+            mContext.unregisterReceiver(mIntentReceiver);
+        }
+        mContext.getContentResolver().unregisterContentObserver(
+                mFormatChangeObserver);
+    }
+
+
+    void updateTime(Calendar c) {
+        mCalendar = c;
+        updateTime();
+    }
+
+    private void updateTime() {
+        if (mLive) {
+            mCalendar.setTimeInMillis(System.currentTimeMillis());
+        }
+
+        CharSequence newTime = DateFormat.format(mFormat, mCalendar);
+        mTimeDisplay.setText(newTime);
+        mAmPm.setIsMorning(mCalendar.get(Calendar.AM_PM) == 0);
+    }
+
+    private void setDateFormat() {
+        mFormat = Alarms.get24HourMode(mContext) ? Alarms.M24 : M12;
+        mAmPm.setShowAmPm(mFormat == M12);
+    }
+
+    void setLive(boolean live) {
+        mLive = live;
+    }
+
+    void setTypeface(Typeface tf) {
+        mTimeDisplay.setTypeface(tf);
+    }
+}
diff --git a/src/com/android/deskclock/DontPressWithParentLayout.java b/src/com/android/deskclock/DontPressWithParentLayout.java
new file mode 100644 (file)
index 0000000..6c13998
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+package com.android.deskclock;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.LinearLayout;
+
+/**
+ * Special class to to allow the parent to be pressed without being pressed
+ * itself. This way the time in the alarm list can be pressed without changing
+ * the background of the indicator.
+ */
+public class DontPressWithParentLayout extends LinearLayout {
+
+    public DontPressWithParentLayout(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    @Override
+    public void setPressed(boolean pressed) {
+        // If the parent is pressed, do not set to pressed.
+        if (pressed && ((View) getParent()).isPressed()) {
+            return;
+        }
+        super.setPressed(pressed);
+    }
+}
diff --git a/src/com/android/deskclock/Log.java b/src/com/android/deskclock/Log.java
new file mode 100644 (file)
index 0000000..7e128b9
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+/**
+ * package-level logging flag
+ */
+
+package com.android.deskclock;
+
+import android.os.SystemClock;
+import android.util.Config;
+
+class Log {
+    public final static String LOGTAG = "AlarmClock";
+
+    static final boolean LOGV = AlarmClock.DEBUG ? Config.LOGD : Config.LOGV;
+
+    static void v(String logMe) {
+        android.util.Log.v(LOGTAG, /* SystemClock.uptimeMillis() + " " + */ logMe);
+    }
+
+    static void e(String logMe) {
+        android.util.Log.e(LOGTAG, logMe);
+    }
+
+    static void e(String logMe, Exception ex) {
+        android.util.Log.e(LOGTAG, logMe, ex);
+    }
+}
diff --git a/src/com/android/deskclock/RepeatPreference.java b/src/com/android/deskclock/RepeatPreference.java
new file mode 100644 (file)
index 0000000..8c07c47
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package com.android.deskclock;
+
+import android.app.AlertDialog.Builder;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.preference.ListPreference;
+import android.util.AttributeSet;
+
+import java.text.DateFormatSymbols;
+import java.util.Calendar;
+
+public class RepeatPreference extends ListPreference {
+
+    // Initial value that can be set with the values saved in the database.
+    private Alarm.DaysOfWeek mDaysOfWeek = new Alarm.DaysOfWeek(0);
+    // New value that will be set if a positive result comes back from the
+    // dialog.
+    private Alarm.DaysOfWeek mNewDaysOfWeek = new Alarm.DaysOfWeek(0);
+
+    public RepeatPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        String[] weekdays = new DateFormatSymbols().getWeekdays();
+        String[] values = new String[] {
+            weekdays[Calendar.MONDAY],
+            weekdays[Calendar.TUESDAY],
+            weekdays[Calendar.WEDNESDAY],
+            weekdays[Calendar.THURSDAY],
+            weekdays[Calendar.FRIDAY],
+            weekdays[Calendar.SATURDAY],
+            weekdays[Calendar.SUNDAY],
+        };
+        setEntries(values);
+        setEntryValues(values);
+    }
+
+    @Override
+    protected void onDialogClosed(boolean positiveResult) {
+        if (positiveResult) {
+            mDaysOfWeek.set(mNewDaysOfWeek);
+            setSummary(mDaysOfWeek.toString(getContext(), true));
+        }
+    }
+
+    @Override
+    protected void onPrepareDialogBuilder(Builder builder) {
+        CharSequence[] entries = getEntries();
+        CharSequence[] entryValues = getEntryValues();
+
+        builder.setMultiChoiceItems(
+                entries, mDaysOfWeek.getBooleanArray(),
+                new DialogInterface.OnMultiChoiceClickListener() {
+                    public void onClick(DialogInterface dialog, int which,
+                            boolean isChecked) {
+                        mNewDaysOfWeek.set(which, isChecked);
+                    }
+                });
+    }
+
+    public void setDaysOfWeek(Alarm.DaysOfWeek dow) {
+        mDaysOfWeek.set(dow);
+        mNewDaysOfWeek.set(dow);
+        setSummary(dow.toString(getContext(), true));
+    }
+
+    public Alarm.DaysOfWeek getDaysOfWeek() {
+        return mDaysOfWeek;
+    }
+}
diff --git a/src/com/android/deskclock/SetAlarm.java b/src/com/android/deskclock/SetAlarm.java
new file mode 100644 (file)
index 0000000..ce07cc1
--- /dev/null
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2007 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.
+ */
+
+package com.android.deskclock;
+
+import android.app.AlertDialog;
+import android.app.TimePickerDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Bundle;
+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;
+
+/**
+ * Manages each alarm
+ */
+public class SetAlarm extends PreferenceActivity
+        implements TimePickerDialog.OnTimeSetListener {
+
+    private EditTextPreference mLabel;
+    private CheckBoxPreference mEnabledPref;
+    private Preference mTimePref;
+    private AlarmPreference mAlarmPref;
+    private CheckBoxPreference mVibratePref;
+    private RepeatPreference mRepeatPref;
+    private MenuItem mTestAlarmItem;
+
+    private int     mId;
+    private int     mHour;
+    private int     mMinutes;
+
+    /**
+     * Set an alarm.  Requires an Alarms.ALARM_ID to be passed in as an
+     * extra. FIXME: Pass an Alarm object like every other Activity.
+     */
+    @Override
+    protected void onCreate(Bundle icicle) {
+        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);
+                        return true;
+                    }
+                });
+        mEnabledPref = (CheckBoxPreference) findPreference("enabled");
+        mTimePref = findPreference("time");
+        mAlarmPref = (AlarmPreference) findPreference("alarm");
+        mVibratePref = (CheckBoxPreference) findPreference("vibrate");
+        mRepeatPref = (RepeatPreference) findPreference("setRepeat");
+
+        Intent i = getIntent();
+        mId = i.getIntExtra(Alarms.ALARM_ID, -1);
+        if (Log.LOGV) {
+            Log.v("In SetAlarm, alarm id = " + mId);
+        }
+
+        /* load alarm details from database */
+        Alarm alarm = Alarms.getAlarm(getContentResolver(), mId);
+        mEnabledPref.setChecked(alarm.enabled);
+        mLabel.setText(alarm.label);
+        mLabel.setSummary(alarm.label);
+        mHour = alarm.hour;
+        mMinutes = alarm.minutes;
+        mRepeatPref.setDaysOfWeek(alarm.daysOfWeek);
+        mVibratePref.setChecked(alarm.vibrate);
+        // Give the alert uri to the preference.
+        mAlarmPref.setAlert(alarm.alert);
+        updateTime();
+
+        // 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();
+                }
+        });
+        b = (Button) v.findViewById(R.id.alarm_delete);
+        b.setOnClickListener(new View.OnClickListener() {
+                public void onClick(View v) {
+                    deleteAlarm();
+                }
+        });
+
+        // Replace the old content view with our new one.
+        setContentView(ll);
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+            Preference preference) {
+        if (preference == mTimePref) {
+            new TimePickerDialog(this, this, mHour, mMinutes,
+                    DateFormat.is24HourFormat(this)).show();
+        }
+
+        return super.onPreferenceTreeClick(preferenceScreen, preference);
+    }
+
+    @Override
+    public void onBackPressed() {
+        saveAlarm();
+        finish();
+    }
+
+    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
+        mHour = hourOfDay;
+        mMinutes = minute;
+        updateTime();
+        // If the time has been changed, enable the alarm.
+        mEnabledPref.setChecked(true);
+    }
+
+    private void updateTime() {
+        if (Log.LOGV) {
+            Log.v("updateTime " + mId);
+        }
+        mTimePref.setSummary(Alarms.formatTime(this, mHour, mMinutes,
+                mRepeatPref.getDaysOfWeek()));
+    }
+
+    private void saveAlarm() {
+        final String alert = mAlarmPref.getAlertString();
+        long time = Alarms.setAlarm(this, mId, mEnabledPref.isChecked(), mHour,
+                mMinutes, mRepeatPref.getDaysOfWeek(), mVibratePref.isChecked(),
+                mLabel.getText(), alert);
+
+        if (mEnabledPref.isChecked()) {
+            popAlarmSetToast(this, time);
+        }
+    }
+
+    private void deleteAlarm() {
+        new AlertDialog.Builder(this)
+                .setTitle(getString(R.string.delete_alarm))
+                .setMessage(getString(R.string.delete_alarm_confirm))
+                .setPositiveButton(android.R.string.ok,
+                        new DialogInterface.OnClickListener() {
+                            public void onClick(DialogInterface d, int w) {
+                                Alarms.deleteAlarm(SetAlarm.this, mId);
+                                finish();
+                            }
+                        })
+                .setNegativeButton(android.R.string.cancel, null)
+                .show();
+    }
+
+    /**
+     * Write alarm out to persistent store and pops toast if alarm
+     * enabled.
+     * Used only in test code.
+     */
+    private static void saveAlarm(
+            Context context, int id, boolean enabled, int hour, int minute,
+            Alarm.DaysOfWeek daysOfWeek, boolean vibrate, String label,
+            String alert, boolean popToast) {
+        if (Log.LOGV) Log.v("** saveAlarm " + id + " " + label + " " + enabled
+                + " " + hour + " " + minute + " vibe " + vibrate);
+
+        // Fix alert string first
+        long time = Alarms.setAlarm(context, id, enabled, hour, minute,
+                daysOfWeek, vibrate, label, alert);
+
+        if (enabled && popToast) {
+            popAlarmSetToast(context, time);
+        }
+    }
+
+    /**
+     * Display a toast that tells the user how long until the alarm
+     * goes off.  This helps prevent "am/pm" mistakes.
+     */
+    static void popAlarmSetToast(Context context, int hour, int minute,
+                                 Alarm.DaysOfWeek daysOfWeek) {
+        popAlarmSetToast(context,
+                Alarms.calculateAlarm(hour, minute, daysOfWeek)
+                .getTimeInMillis());
+    }
+
+    private static void popAlarmSetToast(Context context, long timeInMillis) {
+        String toastText = formatToast(context, timeInMillis);
+        Toast toast = Toast.makeText(context, toastText, Toast.LENGTH_LONG);
+        ToastMaster.setToast(toast);
+        toast.show();
+    }
+
+    /**
+     * format "Alarm set for 2 days 7 hours and 53 minutes from
+     * now"
+     */
+    static String formatToast(Context context, long timeInMillis) {
+        long delta = timeInMillis - System.currentTimeMillis();
+        long hours = delta / (1000 * 60 * 60);
+        long minutes = delta / (1000 * 60) % 60;
+        long days = hours / 24;
+        hours = hours % 24;
+
+        String daySeq = (days == 0) ? "" :
+                (days == 1) ? context.getString(R.string.day) :
+                context.getString(R.string.days, Long.toString(days));
+
+        String minSeq = (minutes == 0) ? "" :
+                (minutes == 1) ? context.getString(R.string.minute) :
+                context.getString(R.string.minutes, Long.toString(minutes));
+
+        String hourSeq = (hours == 0) ? "" :
+                (hours == 1) ? context.getString(R.string.hour) :
+                context.getString(R.string.hours, Long.toString(hours));
+
+        boolean dispDays = days > 0;
+        boolean dispHour = hours > 0;
+        boolean dispMinute = minutes > 0;
+
+        int index = (dispDays ? 1 : 0) |
+                    (dispHour ? 2 : 0) |
+                    (dispMinute ? 4 : 0);
+
+        String[] formats = context.getResources().getStringArray(R.array.alarm_set);
+        return String.format(formats[index], daySeq, hourSeq, minSeq);
+    }
+
+    public boolean onCreateOptionsMenu(Menu menu) {
+        super.onCreateOptionsMenu(menu);
+
+        if (AlarmClock.DEBUG) {
+            mTestAlarmItem = menu.add(0, 0, 0, "test alarm");
+        }
+
+        return true;
+    }
+
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (AlarmClock.DEBUG) {
+            if (item == mTestAlarmItem) {
+                setTestAlarm();
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Test code: this is disabled for production build.  Sets
+     * this alarm to go off on the next minute
+     */
+    void setTestAlarm() {
+
+        // start with now
+        java.util.Calendar c = java.util.Calendar.getInstance();
+        c.setTimeInMillis(System.currentTimeMillis());
+
+        int nowHour = c.get(java.util.Calendar.HOUR_OF_DAY);
+        int nowMinute = c.get(java.util.Calendar.MINUTE);
+
+        int minutes = (nowMinute + 1) % 60;
+        int hour = nowHour + (nowMinute == 0 ? 1 : 0);
+
+        saveAlarm(this, mId, true, hour, minutes, mRepeatPref.getDaysOfWeek(),
+                true, mLabel.getText(), mAlarmPref.getAlertString(), true);
+    }
+
+}
diff --git a/src/com/android/deskclock/SettingsActivity.java b/src/com/android/deskclock/SettingsActivity.java
new file mode 100644 (file)
index 0000000..f28d1e7
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * 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.
+ */
+
+package com.android.deskclock;
+
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+
+/**
+ * Settings for the Alarm Clock.
+ */
+public class SettingsActivity extends PreferenceActivity
+        implements Preference.OnPreferenceChangeListener {
+
+    private static final int ALARM_STREAM_TYPE_BIT =
+            1 << AudioManager.STREAM_ALARM;
+
+    private static final String KEY_ALARM_IN_SILENT_MODE =
+            "alarm_in_silent_mode";
+    static final String KEY_ALARM_SNOOZE =
+            "snooze_duration";
+    static final String KEY_VOLUME_BEHAVIOR =
+            "volume_button_setting";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        addPreferencesFromResource(R.xml.settings);
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        refresh();
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+            Preference preference) {
+        if (KEY_ALARM_IN_SILENT_MODE.equals(preference.getKey())) {
+            CheckBoxPreference pref = (CheckBoxPreference) preference;
+            int ringerModeStreamTypes = Settings.System.getInt(
+                    getContentResolver(),
+                    Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
+
+            if (pref.isChecked()) {
+                ringerModeStreamTypes &= ~ALARM_STREAM_TYPE_BIT;
+            } else {
+                ringerModeStreamTypes |= ALARM_STREAM_TYPE_BIT;
+            }
+
+            Settings.System.putInt(getContentResolver(),
+                    Settings.System.MODE_RINGER_STREAMS_AFFECTED,
+                    ringerModeStreamTypes);
+
+            return true;
+        }
+
+        return super.onPreferenceTreeClick(preferenceScreen, preference);
+    }
+
+    public boolean onPreferenceChange(Preference pref, Object newValue) {
+        final ListPreference listPref = (ListPreference) pref;
+        final int idx = listPref.findIndexOfValue((String) newValue);
+        listPref.setSummary(listPref.getEntries()[idx]);
+        return true;
+    }
+
+    private void refresh() {
+        final CheckBoxPreference alarmInSilentModePref =
+                (CheckBoxPreference) findPreference(KEY_ALARM_IN_SILENT_MODE);
+        final int silentModeStreams =
+                Settings.System.getInt(getContentResolver(),
+                        Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
+        alarmInSilentModePref.setChecked(
+                (silentModeStreams & ALARM_STREAM_TYPE_BIT) == 0);
+
+        final ListPreference snooze =
+                (ListPreference) findPreference(KEY_ALARM_SNOOZE);
+        snooze.setSummary(snooze.getEntry());
+        snooze.setOnPreferenceChangeListener(this);
+    }
+
+}
diff --git a/src/com/android/deskclock/ToastMaster.java b/src/com/android/deskclock/ToastMaster.java
new file mode 100644 (file)
index 0000000..4d51696
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+package com.android.deskclock;
+
+import android.widget.Toast;
+
+public class ToastMaster {
+
+    private static Toast sToast = null;
+
+    private ToastMaster() {
+
+    }
+
+    public static void setToast(Toast toast) {
+        if (sToast != null)
+            sToast.cancel();
+        sToast = toast;
+    }
+
+    public static void cancelToast() {
+        if (sToast != null)
+            sToast.cancel();
+        sToast = null;
+    }
+
+}