Merge remote-tracking branch 'goog/ub-deskclock-dazzle_nyc' into master
Change-Id: I319bcdf102b14d919262c676984c200927f4b3d0
diff --git a/Android.mk b/Android.mk
index 89f0c45..b40a57a 100644
--- a/Android.mk
+++ b/Android.mk
@@ -5,11 +5,15 @@
LOCAL_RESOURCE_DIR += frameworks/opt/datetimepicker/res
ifeq ($(TARGET_BUILD_APPS),)
+LOCAL_RESOURCE_DIR += frameworks/support/design/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
LOCAL_RESOURCE_DIR += frameworks/support/v7/gridlayout/res
+LOCAL_RESOURCE_DIR += frameworks/support/v7/recyclerview/res
else
+LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/design/res
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/appcompat/res
LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/gridlayout/res
+LOCAL_RESOURCE_DIR += prebuilts/sdk/current/support/v7/recyclerview/res
endif
LOCAL_MODULE_TAGS := optional
@@ -18,18 +22,24 @@
LOCAL_PACKAGE_NAME := DeskClock
LOCAL_OVERRIDES_PACKAGES := AlarmClock
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src gen)
LOCAL_STATIC_JAVA_LIBRARIES := android-opt-datetimepicker
+LOCAL_STATIC_JAVA_LIBRARIES += messageformat
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-design
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v13
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-appcompat
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-gridlayout
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-recyclerview
LOCAL_AAPT_FLAGS := --auto-add-overlay
+LOCAL_AAPT_FLAGS += --extra-packages android.support.design
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.gridlayout
+LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview
LOCAL_AAPT_FLAGS += --extra-packages com.android.datetimepicker
+LOCAL_AAPT_FLAGS += --extra-packages com.android.messageformat
-LOCAL_PROGUARD_FLAG_FILES := ../../../frameworks/support/design/proguard-rules.pro
+LOCAL_PROGUARD_FLAG_FILES := ../../../frameworks/support/design/proguard-rules.pro
include $(BUILD_PACKAGE)
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a040eb2..a062846 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -17,12 +17,12 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.deskclock"
- android:versionCode="410" android:versionName="4.1.0">
+ android:versionCode="450" android:versionName="4.5.0">
<original-package android:name="com.android.alarmclock" />
<original-package android:name="com.android.deskclock" />
- <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="23" />
+ <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="24" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
@@ -33,7 +33,6 @@
<!-- READ_PHONE_STATE is required to determine when a phone call exists prior to M -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- READ_EXTERNAL_STORAGE is required to play custom ringtones from the SD card prior to M -->
- <!-- It is also required to display user-friendly names for custom ringtones in the UI. -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application android:label="@string/app_label"
@@ -53,7 +52,7 @@
<activity android:name="DeskClock"
android:label="@string/app_label"
- android:theme="@style/DeskClock"
+ android:theme="@style/DeskClockTheme"
android:icon="@mipmap/ic_launcher_alarmclock"
android:launchMode="singleTask">
@@ -67,7 +66,7 @@
<activity-alias android:name="DockClock"
android:targetActivity="DeskClock"
android:label="@string/app_label"
- android:theme="@style/DeskClock"
+ android:theme="@style/DeskClockTheme"
android:icon="@mipmap/ic_launcher_alarmclock"
android:launchMode="singleTask"
android:enabled="@bool/config_dockAppEnabled"
@@ -79,7 +78,7 @@
</intent-filter>
</activity-alias>
- <activity android:name="SettingsActivity"
+ <activity android:name=".settings.SettingsActivity"
android:label="@string/settings"
android:theme="@style/SettingsTheme"
android:taskAffinity=""
@@ -90,12 +89,11 @@
</intent-filter>
</activity>
- <activity android:name=".worldclock.CitiesActivity"
+ <activity android:name=".worldclock.CitySelectionActivity"
android:label="@string/cities_activity_title"
android:theme="@style/CitiesTheme"
android:taskAffinity=""
- android:excludeFromRecents="true"
- >
+ android:excludeFromRecents="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
@@ -195,7 +193,7 @@
<category android:name="android.intent.category.VOICE" />
</intent-filter>
<intent-filter>
- <action android:name="com.android.deskclock.action.STOP_TIMER" />
+ <action android:name="com.android.deskclock.action.PAUSE_TIMER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE" />
</intent-filter>
@@ -220,7 +218,7 @@
<category android:name="android.intent.category.VOICE" />
</intent-filter>
<intent-filter>
- <action android:name="com.android.deskclock.action.STOP_STOPWATCH" />
+ <action android:name="com.android.deskclock.action.PAUSE_STOPWATCH" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.VOICE" />
</intent-filter>
@@ -244,41 +242,50 @@
<action android:name="android.intent.action.TIME_SET" />
<action android:name="android.intent.action.TIMEZONE_CHANGED" />
<action android:name="android.intent.action.LOCALE_CHANGED" />
+ <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
- <receiver android:name="com.android.alarmclock.AnalogAppWidgetProvider" android:label="@string/analog_gadget"
- android:icon="@mipmap/ic_launcher_alarmclock">
+ <receiver
+ android:name="com.android.alarmclock.AnalogAppWidgetProvider"
+ android:icon="@mipmap/ic_launcher_alarmclock"
+ android:label="@string/analog_gadget">
<intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+ <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
- <meta-data android:name="android.appwidget.oldName" android:value="com.android.deskclock.AnalogAppWidgetProvider" />
- <meta-data android:name="android.appwidget.provider" android:resource="@xml/analog_appwidget" />
+
+ <meta-data
+ android:name="android.appwidget.oldName"
+ android:value="com.android.deskclock.AnalogAppWidgetProvider"/>
+ <meta-data
+ android:name="android.appwidget.provider"
+ android:resource="@xml/analog_appwidget"/>
</receiver>
- <receiver android:name="com.android.alarmclock.DigitalAppWidgetProvider" android:label="@string/digital_gadget"
- android:icon="@mipmap/ic_launcher_alarmclock">
+ <receiver
+ android:name="com.android.alarmclock.DigitalAppWidgetProvider"
+ android:icon="@mipmap/ic_launcher_alarmclock"
+ android:label="@string/digital_gadget">
<intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
- <action android:name="com.android.deskclock.ON_QUARTER_HOUR" />
- <action android:name="android.intent.action.DATE_CHANGED" />
- <action android:name="android.intent.action.TIMEZONE_CHANGED" />
- <action android:name="android.intent.action.SCREEN_ON" />
- <action android:name="android.intent.action.TIME_SET" />
- <action android:name="android.intent.action.LOCALE_CHANGED" />
- <action android:name="android.app.action.NEXT_ALARM_CLOCK_CHANGED" />
- <action android:name="com.android.deskclock.worldclock.update" />
- </intent-filter>
- <meta-data android:name="android.appwidget.provider" android:resource="@xml/digital_appwidget" />
+ <action android:name="android.intent.action.TIME_SET"/>
+ <action android:name="android.intent.action.SCREEN_ON"/>
+ <action android:name="android.intent.action.DATE_CHANGED"/>
+ <action android:name="android.intent.action.LOCALE_CHANGED"/>
+ <action android:name="android.intent.action.TIMEZONE_CHANGED"/>
+ <action android:name="com.android.deskclock.DIGITAL_WIDGET_CHANGED"/>
+ <action android:name="com.android.deskclock.ON_QUARTER_HOUR"/>
+ <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
+ <action android:name="android.app.action.NEXT_ALARM_CLOCK_CHANGED"/>
+ </intent-filter>
+ <meta-data
+ android:name="android.appwidget.provider"
+ android:resource="@xml/digital_appwidget"/>
</receiver>
<service android:name="com.android.alarmclock.DigitalAppWidgetService"
android:permission="android.permission.BIND_REMOTEVIEWS"
android:exported="false" />
- <receiver android:name="com.android.alarmclock.DigitalWidgetViewsFactory"
- android:exported="false" />
-
<!-- Dream (screensaver) implementation -->
<service android:name="Screensaver"
android:exported="true"
@@ -295,7 +302,7 @@
</service>
<!-- Settings activity for screensaver -->
- <activity android:name=".ScreensaverSettingsActivity"
+ <activity android:name=".settings.ScreensaverSettingsActivity"
android:label="@string/screensaver_settings"
android:theme="@style/SettingsTheme"
android:taskAffinity=""
@@ -312,54 +319,33 @@
android:label="@string/dismiss_alarm"
android:theme="@android:style/Theme.Holo.Light.Dialog.NoActionBar"/>
- <!-- This activity is basically like the TimerFragment in DeskClock
- but only during lock screen
- so that it only has the fired timers -->
- <activity android:name="com.android.deskclock.timer.TimerAlertFullScreen"
+ <!-- This activity displays only the timers that have expired with only a reset button
+ present. This makes the activity appropriate for display above the lock screen so that
+ users have the limited ability to silence expired timers but nothing else. -->
+ <activity android:name=".timer.ExpiredTimersActivity"
android:excludeFromRecents="true"
- android:theme="@style/TimerAlertFullScreenTheme"
+ android:theme="@style/ExpiredTimersActivityTheme"
android:launchMode="singleInstance"
android:showOnLockScreen="true"
android:taskAffinity=""
android:configChanges="screenSize|keyboardHidden|keyboard|navigation"/>
- <service android:name="TimerRingService"
- android:exported="false"
- android:description="@string/timer_ring_service_desc">
- <intent-filter>
- <action android:name="com.android.deskclock.TIMER_ALERT" />
- </intent-filter>
- </service>
-
+ <!-- Legacy broadcast receiver that honors old scheduled timers across app upgrade. -->
<receiver android:name="com.android.deskclock.timer.TimerReceiver"
- android:exported="false">
+ android:exported="false">
<intent-filter>
- <action android:name="start_timer" />
- <action android:name="stop_timer" />
- <action android:name="delete_timer" />
- <action android:name="reset_timer" />
<action android:name="times_up" />
- <action android:name="timer_done" />
- <action android:name="timer_update" />
- <action android:name="notif_in_use_show" />
- <action android:name="notif_in_use_cancel" />
- <action android:name="notif_times_up_stop" />
- <action android:name="notif_times_up_plus_one" />
- <action android:name="notif_times_up_show" />
- <action android:name="notif_times_up_cancel" />
</intent-filter>
</receiver>
- <service android:name="com.android.deskclock.stopwatch.StopwatchService"
+ <service android:name=".timer.TimerService"
+ android:exported="false"
+ android:description="@string/timer_service_desc">
+ </service>
+
+ <service android:name=".stopwatch.StopwatchService"
android:exported="false"
android:description="@string/stopwatch_service_desc">
- <intent-filter>
- <action android:name="start_stopwatch" />
- <action android:name="lap_stopwatch" />
- <action android:name="stop_stopwatch" />
- <action android:name="reset_stopwatch" />
- <action android:name="share_stopwatch" />
- </intent-filter>
</service>
</application>
</manifest>
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 8fdba0f..0000000
--- a/build.gradle
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
-* Copyright (C) 2015 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.
-*/
-
-apply plugin: "com.android.application"
-
-android {
- sourceSets {
- main {
- manifest.srcFile "AndroidManifest.xml"
- java.srcDir "src"
- res.srcDir "res"
- assets.srcDir "assets"
- }
- }
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_7
- targetCompatibility JavaVersion.VERSION_1_7
- }
-
- dependencies {
- compile (project(":android-opt-datetimepicker")) {
- exclude module: "support-v4"
- }
- compile project(":support-v7-appcompat")
- compile project(":support-v7-gridlayout")
- compile project(":support-v13")
- }
-}
diff --git a/gen/com/android/deskclock/BuildConfig.java b/gen/com/android/deskclock/BuildConfig.java
new file mode 100644
index 0000000..861848f
--- /dev/null
+++ b/gen/com/android/deskclock/BuildConfig.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2015 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;
+
+public final class BuildConfig {
+ public static final String APPLICATION_ID = "com.android.deskclock";
+}
diff --git a/res/animator-v22/ic_alarm_animation_button.xml b/res/animator-v22/ic_alarm_animation_button.xml
new file mode 100644
index 0000000..ab7b3be
--- /dev/null
+++ b/res/animator-v22/ic_alarm_animation_button.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:ordering="sequentially">
+ <objectAnimator
+ android:duration="33"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="rotation"
+ android:valueFrom="0"
+ android:valueTo="8"/>
+ <objectAnimator
+ android:duration="67"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="rotation"
+ android:valueFrom="8"
+ android:valueTo="-8"/>
+ <objectAnimator
+ android:duration="67"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="rotation"
+ android:valueFrom="-8"
+ android:valueTo="8"/>
+ <objectAnimator
+ android:duration="67"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="rotation"
+ android:valueFrom="8"
+ android:valueTo="-8"/>
+ <objectAnimator
+ android:duration="67"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="rotation"
+ android:valueFrom="-8"
+ android:valueTo="8"/>
+ <objectAnimator
+ android:duration="67"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="rotation"
+ android:valueFrom="8"
+ android:valueTo="-8"/>
+ <objectAnimator
+ android:duration="67"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="rotation"
+ android:valueFrom="-8"
+ android:valueTo="8"/>
+ <objectAnimator
+ android:duration="67"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="rotation"
+ android:valueFrom="8"
+ android:valueTo="-8"/>
+ <objectAnimator
+ android:duration="33"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="rotation"
+ android:valueFrom="-8"
+ android:valueTo="0"/>
+</set>
\ No newline at end of file
diff --git a/res/animator-v22/ic_clock_hour_hand_animation.xml b/res/animator-v22/ic_clock_hour_hand_animation.xml
new file mode 100644
index 0000000..7f09360
--- /dev/null
+++ b/res/animator-v22/ic_clock_hour_hand_animation.xml
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 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.
+-->
+
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="translateX"
+ android:valueFrom="117.75"
+ android:valueTo="116.68351"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/ic_clock_animation_interpolator_1" />
+ <objectAnimator
+ android:duration="41"
+ android:propertyName="translateX"
+ android:valueFrom="116.68351"
+ android:valueTo="116.2544"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="translateX"
+ android:valueFrom="116.2544"
+ android:valueTo="115.10072"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateX"
+ android:valueFrom="115.10072"
+ android:valueTo="114.59167"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateX"
+ android:valueFrom="114.59167"
+ android:valueTo="114.07271"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateX"
+ android:valueFrom="114.07271"
+ android:valueTo="113.92814"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateX"
+ android:valueFrom="113.92814"
+ android:valueTo="114.75237"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateX"
+ android:valueFrom="114.75237"
+ android:valueTo="114.32657"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateX"
+ android:valueFrom="114.32657"
+ android:valueTo="114.52556"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="83"
+ android:propertyName="translateX"
+ android:valueFrom="114.52556"
+ android:valueTo="114.26022"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="250"
+ android:propertyName="translateX"
+ android:valueFrom="114.26022"
+ android:valueTo="114.25"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/ic_clock_animation_interpolator_0" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="translateY"
+ android:valueFrom="128.25"
+ android:valueTo="128.05357"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/ic_clock_animation_interpolator_1" />
+ <objectAnimator
+ android:duration="41"
+ android:propertyName="translateY"
+ android:valueFrom="128.05357"
+ android:valueTo="127.39493"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="translateY"
+ android:valueFrom="127.39493"
+ android:valueTo="125.76069"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateY"
+ android:valueFrom="125.76069"
+ android:valueTo="125.76442"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateY"
+ android:valueFrom="125.76442"
+ android:valueTo="125.38347"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateY"
+ android:valueFrom="125.38347"
+ android:valueTo="125.00182"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateY"
+ android:valueFrom="125.00182"
+ android:valueTo="125.27592"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateY"
+ android:valueFrom="125.27592"
+ android:valueTo="125.10044"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateY"
+ android:valueFrom="125.10044"
+ android:valueTo="124.92464"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="83"
+ android:propertyName="translateY"
+ android:valueFrom="124.92464"
+ android:valueTo="124.41091"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="250"
+ android:propertyName="translateY"
+ android:valueFrom="124.41091"
+ android:valueTo="124.0"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/ic_clock_animation_interpolator_0" />
+ </set>
+ <objectAnimator
+ android:duration="833"
+ android:propertyName="rotation"
+ android:valueFrom="0.0"
+ android:valueTo="121.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/res/animator-v22/ic_clock_minute_hand_animation.xml b/res/animator-v22/ic_clock_minute_hand_animation.xml
new file mode 100644
index 0000000..bebb394
--- /dev/null
+++ b/res/animator-v22/ic_clock_minute_hand_animation.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 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.
+-->
+
+<set
+ xmlns:android="http://schemas.android.com/apk/res/android" >
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="translateX"
+ android:valueFrom="114.25"
+ android:valueTo="115.55177"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/ic_clock_animation_interpolator_1" />
+ <objectAnimator
+ android:duration="41"
+ android:propertyName="translateX"
+ android:valueFrom="115.55177"
+ android:valueTo="115.93416"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="translateX"
+ android:valueFrom="115.93416"
+ android:valueTo="116.58852"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateX"
+ android:valueFrom="116.58852"
+ android:valueTo="116.84771"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="41"
+ android:propertyName="translateX"
+ android:valueFrom="116.84771"
+ android:valueTo="117.11524"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateX"
+ android:valueFrom="117.11524"
+ android:valueTo="117.37431"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="41"
+ android:propertyName="translateX"
+ android:valueFrom="117.37431"
+ android:valueTo="117.41381"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="83"
+ android:propertyName="translateX"
+ android:valueFrom="117.41381"
+ android:valueTo="117.74111"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="250"
+ android:propertyName="translateX"
+ android:valueFrom="117.74111"
+ android:valueTo="117.75"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/ic_clock_animation_interpolator_0" />
+ </set>
+ <set
+ android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="translateY"
+ android:valueFrom="124.0"
+ android:valueTo="124.26329"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/ic_clock_animation_interpolator_1" />
+ <objectAnimator
+ android:duration="41"
+ android:propertyName="translateY"
+ android:valueFrom="124.26329"
+ android:valueTo="124.88398"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="translateY"
+ android:valueFrom="124.88398"
+ android:valueTo="125.80391"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateY"
+ android:valueFrom="125.80391"
+ android:valueTo="126.13012"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="41"
+ android:propertyName="translateY"
+ android:valueFrom="126.13012"
+ android:valueTo="125.9482"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="20"
+ android:propertyName="translateY"
+ android:valueFrom="125.9482"
+ android:valueTo="126.92025"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="41"
+ android:propertyName="translateY"
+ android:valueFrom="126.92025"
+ android:valueTo="127.00955"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="83"
+ android:propertyName="translateY"
+ android:valueFrom="127.00955"
+ android:valueTo="127.62279"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="250"
+ android:propertyName="translateY"
+ android:valueFrom="127.62279"
+ android:valueTo="128.25"
+ android:valueType="floatType"
+ android:interpolator="@interpolator/ic_clock_animation_interpolator_0" />
+ </set>
+ <objectAnimator
+ android:duration="833"
+ android:propertyName="rotation"
+ android:valueFrom="121.0"
+ android:valueTo="360.0"
+ android:valueType="floatType"
+ android:interpolator="@android:interpolator/fast_out_slow_in" />
+</set>
diff --git a/res/animator/ic_stopwatch_animation_button.xml b/res/animator-v22/ic_stopwatch_animation_button.xml
similarity index 100%
rename from res/animator/ic_stopwatch_animation_button.xml
rename to res/animator-v22/ic_stopwatch_animation_button.xml
diff --git a/res/animator/ic_stopwatch_animation_hand.xml b/res/animator-v22/ic_stopwatch_animation_hand.xml
similarity index 100%
rename from res/animator/ic_stopwatch_animation_hand.xml
rename to res/animator-v22/ic_stopwatch_animation_hand.xml
diff --git a/res/animator/ic_timer_animation_hourglass_fill.xml b/res/animator-v22/ic_timer_animation_hourglass_fill.xml
similarity index 100%
rename from res/animator/ic_timer_animation_hourglass_fill.xml
rename to res/animator-v22/ic_timer_animation_hourglass_fill.xml
diff --git a/res/animator/ic_timer_animation_hourglass_frame.xml b/res/animator-v22/ic_timer_animation_hourglass_frame.xml
similarity index 100%
rename from res/animator/ic_timer_animation_hourglass_frame.xml
rename to res/animator-v22/ic_timer_animation_hourglass_frame.xml
diff --git a/res/animator-v22/ic_timer_animation_mask_1.xml b/res/animator-v22/ic_timer_animation_mask_1.xml
new file mode 100644
index 0000000..cd8b458
--- /dev/null
+++ b/res/animator-v22/ic_timer_animation_mask_1.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 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.
+-->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+ android:ordering="sequentially">
+ <objectAnimator
+ android:duration="333"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="pathData"
+ android:valueFrom="M 24,13.3999938965 c 0,0.0 -24,0.0 -24,0.0 c 0,0.0 0,10.6000061035 0,10.6000061035 c 0,0 24,0 24,0 c 0,0 0,-10.6000061035 0,-10.6000061035 Z"
+ android:valueTo="M 24,13.3999938965 c 0,0.0 -24,0.0 -24,0.0 c 0,0.0 0,10.6000061035 0,10.6000061035 c 0,0 24,0 24,0 c 0,0 0,-10.6000061035 0,-10.6000061035 Z"
+ android:valueType="pathType"/>
+ <objectAnimator
+ android:duration="1000"
+ android:interpolator="@android:interpolator/fast_out_slow_in"
+ android:propertyName="pathData"
+ android:valueFrom="M 24,13.3999938965 c 0,0.0 -24,0.0 -24,0.0 c 0,0.0 0,10.6000061035 0,10.6000061035 c 0,0 24,0 24,0 c 0,0 0,-10.6000061035 0,-10.6000061035 Z"
+ android:valueTo="M 24,0.00173950195312 c 0,0.0 -24,0.0 -24,0.0 c 0,0.0 0,10.6982574463 0,10.6982574463 c 0,0.0 24,0.0 24,0.0 c 0,0.0 0,-10.6982574463 0,-10.6982574463 Z"
+ android:valueType="pathType"/>
+</set>
\ No newline at end of file
diff --git a/res/animator/fade_in.xml b/res/animator/fade_in.xml
deleted file mode 100644
index 771a4c9..0000000
--- a/res/animator/fade_in.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2012 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
- -->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
- android:valueFrom="0.0"
- android:valueTo="1.0"
- android:propertyName="alpha"
- android:interpolator="@android:interpolator/decelerate_quad"
- android:duration="@integer/fade_duration" />
diff --git a/res/animator/fade_out.xml b/res/animator/fade_out.xml
deleted file mode 100644
index 668e332..0000000
--- a/res/animator/fade_out.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2012 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
- -->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
- android:valueFrom="1.0"
- android:valueTo="0.0"
- android:propertyName="alpha"
- android:interpolator="@android:interpolator/decelerate_quad"
- android:duration="@integer/fade_duration" />
diff --git a/res/animator/ic_alarm_animation_button.xml b/res/animator/ic_alarm_animation_button.xml
deleted file mode 100644
index 83465d3..0000000
--- a/res/animator/ic_alarm_animation_button.xml
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="33"
- android:propertyName="rotation"
- android:valueFrom="0"
- android:valueTo="8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="8"
- android:valueTo="-8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="-8"
- android:valueTo="8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="8"
- android:valueTo="-8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="-8"
- android:valueTo="8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="8"
- android:valueTo="-8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="-8"
- android:valueTo="8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="8"
- android:valueTo="-8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="-8"
- android:valueTo="8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="8"
- android:valueTo="-8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="-8"
- android:valueTo="8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="8"
- android:valueTo="-8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="-8"
- android:valueTo="8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="8"
- android:valueTo="-8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="-8"
- android:valueTo="8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="8"
- android:valueTo="-8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="-8"
- android:valueTo="8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="8"
- android:valueTo="-8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="-8"
- android:valueTo="8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="67"
- android:propertyName="rotation"
- android:valueFrom="8"
- android:valueTo="-8"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="33"
- android:propertyName="rotation"
- android:valueFrom="-8"
- android:valueTo="0"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
-</set>
diff --git a/res/animator/ic_clock_animation_second_hand.xml b/res/animator/ic_clock_animation_second_hand.xml
deleted file mode 100644
index a98e6df..0000000
--- a/res/animator/ic_clock_animation_second_hand.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <objectAnimator
- android:duration="1333"
- android:propertyName="rotation"
- android:valueFrom="0"
- android:valueTo="360"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
-</set>
diff --git a/res/animator/ic_timer_animation_mask_1.xml b/res/animator/ic_timer_animation_mask_1.xml
deleted file mode 100644
index 2e331a7..0000000
--- a/res/animator/ic_timer_animation_mask_1.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 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.
--->
-
-<set xmlns:android="http://schemas.android.com/apk/res/android" >
- <set
- android:ordering="sequentially" >
- <objectAnimator
- android:duration="333"
- android:propertyName="pathData"
- android:valueFrom="M 24,13.3999938965 c 0,0.0 -24,0.0 -24,0.0 c 0,0.0 0,10.6000061035 0,10.6000061035 c 0,0 24,0 24,0 c 0,0 0,-10.6000061035 0,-10.6000061035 Z"
- android:valueTo="M 24,13.3999938965 c 0,0.0 -24,0.0 -24,0.0 c 0,0.0 0,10.6000061035 0,10.6000061035 c 0,0 24,0 24,0 c 0,0 0,-10.6000061035 0,-10.6000061035 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- <objectAnimator
- android:duration="1000"
- android:propertyName="pathData"
- android:valueFrom="M 24,13.3999938965 c 0,0.0 -24,0.0 -24,0.0 c 0,0.0 0,10.6000061035 0,10.6000061035 c 0,0 24,0 24,0 c 0,0 0,-10.6000061035 0,-10.6000061035 Z"
- android:valueTo="M 24,0.00173950195312 c 0,0.0 -24,0.0 -24,0.0 c 0,0.0 0,10.6982574463 0,10.6982574463 c 0,0.0 24,0.0 24,0.0 c 0,0.0 0,-10.6982574463 0,-10.6982574463 Z"
- android:valueType="pathType"
- android:interpolator="@android:interpolator/fast_out_slow_in" />
- </set>
-</set>
diff --git a/res/color/bg_day_tint_color.xml b/res/color/bg_day_tint_color.xml
index 8ccf894..0368475 100644
--- a/res/color/bg_day_tint_color.xml
+++ b/res/color/bg_day_tint_color.xml
@@ -16,6 +16,6 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_activated="true" android:color="@color/clock_white" />
+ <item android:state_checked="true" android:color="@color/clock_white" />
<item android:color="@android:color/transparent" />
-</selector>
\ No newline at end of file
+</selector>
diff --git a/res/drawable-hdpi/alarm_background_expanded.9.png b/res/drawable-hdpi/alarm_background_expanded.9.png
new file mode 100644
index 0000000..d8abf86
--- /dev/null
+++ b/res/drawable-hdpi/alarm_background_expanded.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_alarm_off_white_24dp.png b/res/drawable-hdpi/ic_alarm_off_white_24dp.png
index ad43700..2d7ff0a 100644
--- a/res/drawable-hdpi/ic_alarm_off_white_24dp.png
+++ b/res/drawable-hdpi/ic_alarm_off_white_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_alarm_small_12dp.png b/res/drawable-hdpi/ic_alarm_small_12dp.png
new file mode 100644
index 0000000..7761be9
--- /dev/null
+++ b/res/drawable-hdpi/ic_alarm_small_12dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_alarm_small.png b/res/drawable-hdpi/ic_alarm_small_18dp.png
similarity index 100%
rename from res/drawable-hdpi/ic_alarm_small.png
rename to res/drawable-hdpi/ic_alarm_small_18dp.png
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/ic_alarm_small.png b/res/drawable-hdpi/ic_alarm_small_24dp.png
similarity index 100%
rename from res/drawable-sw600dp-hdpi/ic_alarm_small.png
rename to res/drawable-hdpi/ic_alarm_small_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_fab_pause.png b/res/drawable-hdpi/ic_fab_pause.png
deleted file mode 100644
index b5f76c3..0000000
--- a/res/drawable-hdpi/ic_fab_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_fab_play.png b/res/drawable-hdpi/ic_fab_play.png
deleted file mode 100644
index d8e6fc3..0000000
--- a/res/drawable-hdpi/ic_fab_play.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_fab_plus.png b/res/drawable-hdpi/ic_fab_plus.png
deleted file mode 100644
index 7533292..0000000
--- a/res/drawable-hdpi/ic_fab_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_fab_stop.png b/res/drawable-hdpi/ic_fab_stop.png
deleted file mode 100644
index 43b624d..0000000
--- a/res/drawable-hdpi/ic_fab_stop.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_globe.png b/res/drawable-hdpi/ic_globe.png
deleted file mode 100644
index 52b4e74..0000000
--- a/res/drawable-hdpi/ic_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_language_white_24dp.png b/res/drawable-hdpi/ic_language_white_24dp.png
new file mode 100644
index 0000000..b7c8248
--- /dev/null
+++ b/res/drawable-hdpi/ic_language_white_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_pause_white_24dp.png b/res/drawable-hdpi/ic_pause_white_24dp.png
new file mode 100644
index 0000000..4d2ea05
--- /dev/null
+++ b/res/drawable-hdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/res/drawable-hdpi/panel_undo_holo.9.png b/res/drawable-hdpi/panel_undo_holo.9.png
deleted file mode 100644
index 2396b26..0000000
--- a/res/drawable-hdpi/panel_undo_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/alarm_background_expanded.9.png b/res/drawable-mdpi/alarm_background_expanded.9.png
new file mode 100644
index 0000000..4539033
--- /dev/null
+++ b/res/drawable-mdpi/alarm_background_expanded.9.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_alarm_off_white_24dp.png b/res/drawable-mdpi/ic_alarm_off_white_24dp.png
index 2bb9422..fa37e9d 100644
--- a/res/drawable-mdpi/ic_alarm_off_white_24dp.png
+++ b/res/drawable-mdpi/ic_alarm_off_white_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_alarm_small_12dp.png b/res/drawable-mdpi/ic_alarm_small_12dp.png
new file mode 100644
index 0000000..1f8834a
--- /dev/null
+++ b/res/drawable-mdpi/ic_alarm_small_12dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_alarm_small.png b/res/drawable-mdpi/ic_alarm_small_18dp.png
similarity index 100%
rename from res/drawable-mdpi/ic_alarm_small.png
rename to res/drawable-mdpi/ic_alarm_small_18dp.png
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/ic_alarm_small.png b/res/drawable-mdpi/ic_alarm_small_24dp.png
similarity index 100%
rename from res/drawable-sw600dp-mdpi/ic_alarm_small.png
rename to res/drawable-mdpi/ic_alarm_small_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_fab_pause.png b/res/drawable-mdpi/ic_fab_pause.png
deleted file mode 100644
index ff7c74b..0000000
--- a/res/drawable-mdpi/ic_fab_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_fab_play.png b/res/drawable-mdpi/ic_fab_play.png
deleted file mode 100644
index 9ad2bb2..0000000
--- a/res/drawable-mdpi/ic_fab_play.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_fab_plus.png b/res/drawable-mdpi/ic_fab_plus.png
deleted file mode 100644
index 869d89f..0000000
--- a/res/drawable-mdpi/ic_fab_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_fab_stop.png b/res/drawable-mdpi/ic_fab_stop.png
deleted file mode 100644
index c6bbb06..0000000
--- a/res/drawable-mdpi/ic_fab_stop.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_globe.png b/res/drawable-mdpi/ic_globe.png
deleted file mode 100644
index 2c1b4c3..0000000
--- a/res/drawable-mdpi/ic_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_language_white_24dp.png b/res/drawable-mdpi/ic_language_white_24dp.png
new file mode 100644
index 0000000..0bc7dfd
--- /dev/null
+++ b/res/drawable-mdpi/ic_language_white_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_pause_white_24dp.png b/res/drawable-mdpi/ic_pause_white_24dp.png
new file mode 100644
index 0000000..2272d47
--- /dev/null
+++ b/res/drawable-mdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/res/drawable-mdpi/panel_undo_holo.9.png b/res/drawable-mdpi/panel_undo_holo.9.png
deleted file mode 100644
index 291a936..0000000
--- a/res/drawable-mdpi/panel_undo_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/clock_analog_dial.png b/res/drawable-sw600dp-hdpi/clock_analog_dial.png
deleted file mode 100644
index 98abe16..0000000
--- a/res/drawable-sw600dp-hdpi/clock_analog_dial.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/clock_analog_hour.png b/res/drawable-sw600dp-hdpi/clock_analog_hour.png
deleted file mode 100644
index 8cce270..0000000
--- a/res/drawable-sw600dp-hdpi/clock_analog_hour.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/clock_analog_minute.png b/res/drawable-sw600dp-hdpi/clock_analog_minute.png
deleted file mode 100644
index 6c64954..0000000
--- a/res/drawable-sw600dp-hdpi/clock_analog_minute.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/clock_analog_second.png b/res/drawable-sw600dp-hdpi/clock_analog_second.png
deleted file mode 100644
index 869b02e..0000000
--- a/res/drawable-sw600dp-hdpi/clock_analog_second.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/ic_fab_pause.png b/res/drawable-sw600dp-hdpi/ic_fab_pause.png
deleted file mode 100644
index bd3cfcf..0000000
--- a/res/drawable-sw600dp-hdpi/ic_fab_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/ic_fab_play.png b/res/drawable-sw600dp-hdpi/ic_fab_play.png
deleted file mode 100644
index 3f16e23..0000000
--- a/res/drawable-sw600dp-hdpi/ic_fab_play.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/ic_fab_plus.png b/res/drawable-sw600dp-hdpi/ic_fab_plus.png
deleted file mode 100644
index 95ab0a7..0000000
--- a/res/drawable-sw600dp-hdpi/ic_fab_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/ic_fab_stop.png b/res/drawable-sw600dp-hdpi/ic_fab_stop.png
deleted file mode 100644
index 58e6a8d..0000000
--- a/res/drawable-sw600dp-hdpi/ic_fab_stop.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/ic_globe.png b/res/drawable-sw600dp-hdpi/ic_globe.png
deleted file mode 100644
index 83772bc..0000000
--- a/res/drawable-sw600dp-hdpi/ic_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/ic_label_normal.png b/res/drawable-sw600dp-hdpi/ic_label_normal.png
deleted file mode 100644
index 2e5318d..0000000
--- a/res/drawable-sw600dp-hdpi/ic_label_normal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/clock_analog_dial.png b/res/drawable-sw600dp-mdpi/clock_analog_dial.png
deleted file mode 100644
index 0d11937..0000000
--- a/res/drawable-sw600dp-mdpi/clock_analog_dial.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/clock_analog_hour.png b/res/drawable-sw600dp-mdpi/clock_analog_hour.png
deleted file mode 100644
index 82eba3b..0000000
--- a/res/drawable-sw600dp-mdpi/clock_analog_hour.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/clock_analog_minute.png b/res/drawable-sw600dp-mdpi/clock_analog_minute.png
deleted file mode 100644
index 8430e17..0000000
--- a/res/drawable-sw600dp-mdpi/clock_analog_minute.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/clock_analog_second.png b/res/drawable-sw600dp-mdpi/clock_analog_second.png
deleted file mode 100644
index 2e8e486..0000000
--- a/res/drawable-sw600dp-mdpi/clock_analog_second.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/ic_fab_pause.png b/res/drawable-sw600dp-mdpi/ic_fab_pause.png
deleted file mode 100644
index aead9b2..0000000
--- a/res/drawable-sw600dp-mdpi/ic_fab_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/ic_fab_play.png b/res/drawable-sw600dp-mdpi/ic_fab_play.png
deleted file mode 100644
index 8cbbae0..0000000
--- a/res/drawable-sw600dp-mdpi/ic_fab_play.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/ic_fab_plus.png b/res/drawable-sw600dp-mdpi/ic_fab_plus.png
deleted file mode 100644
index 115f399..0000000
--- a/res/drawable-sw600dp-mdpi/ic_fab_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/ic_fab_stop.png b/res/drawable-sw600dp-mdpi/ic_fab_stop.png
deleted file mode 100644
index f0962f7..0000000
--- a/res/drawable-sw600dp-mdpi/ic_fab_stop.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/ic_globe.png b/res/drawable-sw600dp-mdpi/ic_globe.png
deleted file mode 100644
index bd65e18..0000000
--- a/res/drawable-sw600dp-mdpi/ic_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/ic_label_normal.png b/res/drawable-sw600dp-mdpi/ic_label_normal.png
deleted file mode 100644
index d667352..0000000
--- a/res/drawable-sw600dp-mdpi/ic_label_normal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/clock_analog_dial.png b/res/drawable-sw600dp-xhdpi/clock_analog_dial.png
deleted file mode 100644
index 67b6941..0000000
--- a/res/drawable-sw600dp-xhdpi/clock_analog_dial.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/clock_analog_hour.png b/res/drawable-sw600dp-xhdpi/clock_analog_hour.png
deleted file mode 100644
index 70f194b..0000000
--- a/res/drawable-sw600dp-xhdpi/clock_analog_hour.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/clock_analog_minute.png b/res/drawable-sw600dp-xhdpi/clock_analog_minute.png
deleted file mode 100644
index 5d73559..0000000
--- a/res/drawable-sw600dp-xhdpi/clock_analog_minute.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/clock_analog_second.png b/res/drawable-sw600dp-xhdpi/clock_analog_second.png
deleted file mode 100644
index 213ed46..0000000
--- a/res/drawable-sw600dp-xhdpi/clock_analog_second.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/ic_fab_pause.png b/res/drawable-sw600dp-xhdpi/ic_fab_pause.png
deleted file mode 100644
index 6854cf5..0000000
--- a/res/drawable-sw600dp-xhdpi/ic_fab_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/ic_fab_play.png b/res/drawable-sw600dp-xhdpi/ic_fab_play.png
deleted file mode 100644
index 6ac7f13..0000000
--- a/res/drawable-sw600dp-xhdpi/ic_fab_play.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/ic_fab_plus.png b/res/drawable-sw600dp-xhdpi/ic_fab_plus.png
deleted file mode 100644
index 7688a61..0000000
--- a/res/drawable-sw600dp-xhdpi/ic_fab_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/ic_fab_stop.png b/res/drawable-sw600dp-xhdpi/ic_fab_stop.png
deleted file mode 100644
index b158356..0000000
--- a/res/drawable-sw600dp-xhdpi/ic_fab_stop.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/ic_globe.png b/res/drawable-sw600dp-xhdpi/ic_globe.png
deleted file mode 100644
index 8aee9c2..0000000
--- a/res/drawable-sw600dp-xhdpi/ic_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/ic_label_normal.png b/res/drawable-sw600dp-xhdpi/ic_label_normal.png
deleted file mode 100644
index 70e22cf..0000000
--- a/res/drawable-sw600dp-xhdpi/ic_label_normal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/clock_analog_dial.png b/res/drawable-sw600dp-xxhdpi/clock_analog_dial.png
deleted file mode 100644
index 7464145..0000000
--- a/res/drawable-sw600dp-xxhdpi/clock_analog_dial.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/clock_analog_hour.png b/res/drawable-sw600dp-xxhdpi/clock_analog_hour.png
deleted file mode 100644
index e386819..0000000
--- a/res/drawable-sw600dp-xxhdpi/clock_analog_hour.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/clock_analog_minute.png b/res/drawable-sw600dp-xxhdpi/clock_analog_minute.png
deleted file mode 100644
index eeabc21..0000000
--- a/res/drawable-sw600dp-xxhdpi/clock_analog_minute.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/clock_analog_second.png b/res/drawable-sw600dp-xxhdpi/clock_analog_second.png
deleted file mode 100644
index a6c5f2f..0000000
--- a/res/drawable-sw600dp-xxhdpi/clock_analog_second.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/ic_fab_pause.png b/res/drawable-sw600dp-xxhdpi/ic_fab_pause.png
deleted file mode 100644
index 42c0689..0000000
--- a/res/drawable-sw600dp-xxhdpi/ic_fab_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/ic_fab_play.png b/res/drawable-sw600dp-xxhdpi/ic_fab_play.png
deleted file mode 100644
index f71180e..0000000
--- a/res/drawable-sw600dp-xxhdpi/ic_fab_play.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/ic_fab_plus.png b/res/drawable-sw600dp-xxhdpi/ic_fab_plus.png
deleted file mode 100644
index ef39cfc..0000000
--- a/res/drawable-sw600dp-xxhdpi/ic_fab_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/ic_fab_stop.png b/res/drawable-sw600dp-xxhdpi/ic_fab_stop.png
deleted file mode 100644
index 190857b..0000000
--- a/res/drawable-sw600dp-xxhdpi/ic_fab_stop.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/ic_globe.png b/res/drawable-sw600dp-xxhdpi/ic_globe.png
deleted file mode 100644
index 0c26af8..0000000
--- a/res/drawable-sw600dp-xxhdpi/ic_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/ic_label_normal.png b/res/drawable-sw600dp-xxhdpi/ic_label_normal.png
deleted file mode 100644
index 583fab3..0000000
--- a/res/drawable-sw600dp-xxhdpi/ic_label_normal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/clock_analog_dial.png b/res/drawable-sw600dp-xxxhdpi/clock_analog_dial.png
deleted file mode 100644
index 6b6bb0a..0000000
--- a/res/drawable-sw600dp-xxxhdpi/clock_analog_dial.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/clock_analog_hour.png b/res/drawable-sw600dp-xxxhdpi/clock_analog_hour.png
deleted file mode 100644
index af040e2..0000000
--- a/res/drawable-sw600dp-xxxhdpi/clock_analog_hour.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/clock_analog_minute.png b/res/drawable-sw600dp-xxxhdpi/clock_analog_minute.png
deleted file mode 100644
index 4223579..0000000
--- a/res/drawable-sw600dp-xxxhdpi/clock_analog_minute.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/clock_analog_second.png b/res/drawable-sw600dp-xxxhdpi/clock_analog_second.png
deleted file mode 100644
index 891c55e..0000000
--- a/res/drawable-sw600dp-xxxhdpi/clock_analog_second.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/ic_fab_pause.png b/res/drawable-sw600dp-xxxhdpi/ic_fab_pause.png
deleted file mode 100644
index 13550c4..0000000
--- a/res/drawable-sw600dp-xxxhdpi/ic_fab_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/ic_fab_play.png b/res/drawable-sw600dp-xxxhdpi/ic_fab_play.png
deleted file mode 100644
index 76f278f..0000000
--- a/res/drawable-sw600dp-xxxhdpi/ic_fab_play.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/ic_fab_plus.png b/res/drawable-sw600dp-xxxhdpi/ic_fab_plus.png
deleted file mode 100644
index 8c655c2..0000000
--- a/res/drawable-sw600dp-xxxhdpi/ic_fab_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/ic_fab_stop.png b/res/drawable-sw600dp-xxxhdpi/ic_fab_stop.png
deleted file mode 100644
index 91cfc95..0000000
--- a/res/drawable-sw600dp-xxxhdpi/ic_fab_stop.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/ic_label_normal.png b/res/drawable-sw600dp-xxxhdpi/ic_label_normal.png
deleted file mode 100644
index 99d2c83..0000000
--- a/res/drawable-sw600dp-xxxhdpi/ic_label_normal.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-v19/fastscroll_preview.xml b/res/drawable-v21/horizontal_divider.xml
similarity index 68%
rename from res/drawable-v19/fastscroll_preview.xml
rename to res/drawable-v21/horizontal_divider.xml
index 33424f6..7db71f3 100644
--- a/res/drawable-v19/fastscroll_preview.xml
+++ b/res/drawable-v21/horizontal_divider.xml
@@ -13,13 +13,10 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
<inset xmlns:android="http://schemas.android.com/apk/res/android"
- android:insetRight="@dimen/fastscroll_preview_padding"
- android:insetLeft="@dimen/fastscroll_preview_padding">
- <shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <corners android:radius="44dp"/>
- <solid android:color="@color/color_accent" />
- </shape>
-</inset>
+ android:insetLeft="@dimen/notification_icon_size">
+ <shape>
+ <size android:height="1dip" />
+ <solid android:color="@color/notification_divider" />
+ </shape>
+</inset>
\ No newline at end of file
diff --git a/res/drawable-v21/ic_add_24dp.xml b/res/drawable-v21/ic_add_24dp.xml
index 85532d0..61ef285 100644
--- a/res/drawable-v21/ic_add_24dp.xml
+++ b/res/drawable-v21/ic_add_24dp.xml
@@ -16,4 +16,4 @@
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_add_white_24dp"
- android:tint="@color/black" />
+ android:tint="@color/black_54p" />
diff --git a/res/layout/stopwatch_spacer.xml b/res/drawable-v21/ic_pause_24dp.xml
similarity index 71%
copy from res/layout/stopwatch_spacer.xml
copy to res/drawable-v21/ic_pause_24dp.xml
index 31b648b..92c5e93 100644
--- a/res/layout/stopwatch_spacer.xml
+++ b/res/drawable-v21/ic_pause_24dp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
+<!-- Copyright (C) 2015 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.
@@ -13,8 +13,6 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
-<Space
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="@dimen/stopwatch_list_bottom_spacing" />
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_pause_white_24dp"
+ android:tint="@color/black_54p" />
diff --git a/res/drawable-v21/ic_reset_24dp.xml b/res/drawable-v21/ic_reset_24dp.xml
index a754bd8..b88c04f 100644
--- a/res/drawable-v21/ic_reset_24dp.xml
+++ b/res/drawable-v21/ic_reset_24dp.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_reset_white_24dp"
- android:tint="@color/black" />
+ android:tint="@color/black_54p" />
diff --git a/res/drawable-v21/ic_snooze_24dp.xml b/res/drawable-v21/ic_snooze_24dp.xml
index 29da44d..1968c6d 100644
--- a/res/drawable-v21/ic_snooze_24dp.xml
+++ b/res/drawable-v21/ic_snooze_24dp.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_snooze_white_24dp"
- android:tint="@color/black" />
\ No newline at end of file
+ android:tint="@color/black_54p" />
\ No newline at end of file
diff --git a/res/drawable-v21/ic_start_24dp.xml b/res/drawable-v21/ic_start_24dp.xml
index 655e66d..ebf3083 100644
--- a/res/drawable-v21/ic_start_24dp.xml
+++ b/res/drawable-v21/ic_start_24dp.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_start_white_24dp"
- android:tint="@color/black" />
+ android:tint="@color/black_54p" />
diff --git a/res/drawable-v21/ic_stop_24dp.xml b/res/drawable-v21/ic_stop_24dp.xml
index 0d4c891..e3e3431 100644
--- a/res/drawable-v21/ic_stop_24dp.xml
+++ b/res/drawable-v21/ic_stop_24dp.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_stop_white_24dp"
- android:tint="@color/black" />
+ android:tint="@color/black_54p" />
diff --git a/res/drawable-v21/ic_lap_24dp.xml b/res/drawable-v21/ic_sw_lap_24dp.xml
similarity index 79%
rename from res/drawable-v21/ic_lap_24dp.xml
rename to res/drawable-v21/ic_sw_lap_24dp.xml
index 82f035f..25b0e50 100644
--- a/res/drawable-v21/ic_lap_24dp.xml
+++ b/res/drawable-v21/ic_sw_lap_24dp.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/ic_lap_white_24dp"
- android:tint="@color/black" />
+ android:tint="@color/black_54p" />
diff --git a/res/drawable-v21/ic_sw_reset_24dp.xml b/res/drawable-v21/ic_sw_reset_24dp.xml
new file mode 100644
index 0000000..b88c04f
--- /dev/null
+++ b/res/drawable-v21/ic_sw_reset_24dp.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_reset_white_24dp"
+ android:tint="@color/black_54p" />
diff --git a/res/drawable-v21/ic_sw_start_24dp.xml b/res/drawable-v21/ic_sw_start_24dp.xml
new file mode 100644
index 0000000..ebf3083
--- /dev/null
+++ b/res/drawable-v21/ic_sw_start_24dp.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_start_white_24dp"
+ android:tint="@color/black_54p" />
diff --git a/res/drawable-v22/ic_tab_clock.xml b/res/drawable-v22/ic_tab_clock.xml
index f450731..0f1c740 100644
--- a/res/drawable-v22/ic_tab_clock.xml
+++ b/res/drawable-v22/ic_tab_clock.xml
@@ -29,11 +29,13 @@
<transition android:fromId="@id/off" android:toId="@id/on">
<animated-vector android:drawable="@drawable/ic_clock">
<target
- android:name="second_hand"
- android:animation="@animator/ic_clock_animation_second_hand" />
+ android:name="hour_hand"
+ android:animation="@animator/ic_clock_hour_hand_animation" />
+ <target
+ android:name="minute_hand"
+ android:animation="@animator/ic_clock_minute_hand_animation" />
</animated-vector>
</transition>
-
</animated-selector>
diff --git a/res/drawable-xhdpi/alarm_background_expanded.9.png b/res/drawable-xhdpi/alarm_background_expanded.9.png
new file mode 100644
index 0000000..bb0d814
--- /dev/null
+++ b/res/drawable-xhdpi/alarm_background_expanded.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_alarm_off_white_24dp.png b/res/drawable-xhdpi/ic_alarm_off_white_24dp.png
index 0f2f7c0..c229b48 100644
--- a/res/drawable-xhdpi/ic_alarm_off_white_24dp.png
+++ b/res/drawable-xhdpi/ic_alarm_off_white_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_alarm_small_12dp.png b/res/drawable-xhdpi/ic_alarm_small_12dp.png
new file mode 100644
index 0000000..ac27077
--- /dev/null
+++ b/res/drawable-xhdpi/ic_alarm_small_12dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_alarm_small.png b/res/drawable-xhdpi/ic_alarm_small_18dp.png
similarity index 100%
rename from res/drawable-xhdpi/ic_alarm_small.png
rename to res/drawable-xhdpi/ic_alarm_small_18dp.png
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/ic_alarm_small.png b/res/drawable-xhdpi/ic_alarm_small_24dp.png
similarity index 100%
rename from res/drawable-sw600dp-xhdpi/ic_alarm_small.png
rename to res/drawable-xhdpi/ic_alarm_small_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_fab_pause.png b/res/drawable-xhdpi/ic_fab_pause.png
deleted file mode 100644
index f1a5314..0000000
--- a/res/drawable-xhdpi/ic_fab_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_fab_play.png b/res/drawable-xhdpi/ic_fab_play.png
deleted file mode 100644
index 41d9cd5..0000000
--- a/res/drawable-xhdpi/ic_fab_play.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_fab_plus.png b/res/drawable-xhdpi/ic_fab_plus.png
deleted file mode 100644
index ba7736c..0000000
--- a/res/drawable-xhdpi/ic_fab_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_fab_stop.png b/res/drawable-xhdpi/ic_fab_stop.png
deleted file mode 100644
index a6d1077..0000000
--- a/res/drawable-xhdpi/ic_fab_stop.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_globe.png b/res/drawable-xhdpi/ic_globe.png
deleted file mode 100644
index 46c11d9..0000000
--- a/res/drawable-xhdpi/ic_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_language_white_24dp.png b/res/drawable-xhdpi/ic_language_white_24dp.png
new file mode 100644
index 0000000..eeaab46
--- /dev/null
+++ b/res/drawable-xhdpi/ic_language_white_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pause_white_24dp.png b/res/drawable-xhdpi/ic_pause_white_24dp.png
new file mode 100644
index 0000000..f49aed7
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/panel_undo_holo.9.png b/res/drawable-xhdpi/panel_undo_holo.9.png
deleted file mode 100644
index 1dc4927..0000000
--- a/res/drawable-xhdpi/panel_undo_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/alarm_background_expanded.9.png b/res/drawable-xxhdpi/alarm_background_expanded.9.png
new file mode 100644
index 0000000..83c91f8
--- /dev/null
+++ b/res/drawable-xxhdpi/alarm_background_expanded.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_alarm_off_white_24dp.png b/res/drawable-xxhdpi/ic_alarm_off_white_24dp.png
index 5cb3b7a..2b3f401 100644
--- a/res/drawable-xxhdpi/ic_alarm_off_white_24dp.png
+++ b/res/drawable-xxhdpi/ic_alarm_off_white_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_alarm_small_12dp.png b/res/drawable-xxhdpi/ic_alarm_small_12dp.png
new file mode 100644
index 0000000..b228d20
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_alarm_small_12dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_alarm_small.png b/res/drawable-xxhdpi/ic_alarm_small_18dp.png
similarity index 100%
rename from res/drawable-xxhdpi/ic_alarm_small.png
rename to res/drawable-xxhdpi/ic_alarm_small_18dp.png
Binary files differ
diff --git a/res/drawable-sw600dp-xxhdpi/ic_alarm_small.png b/res/drawable-xxhdpi/ic_alarm_small_24dp.png
similarity index 100%
rename from res/drawable-sw600dp-xxhdpi/ic_alarm_small.png
rename to res/drawable-xxhdpi/ic_alarm_small_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_fab_pause.png b/res/drawable-xxhdpi/ic_fab_pause.png
deleted file mode 100644
index 4a5b683..0000000
--- a/res/drawable-xxhdpi/ic_fab_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_fab_play.png b/res/drawable-xxhdpi/ic_fab_play.png
deleted file mode 100644
index 5c10612..0000000
--- a/res/drawable-xxhdpi/ic_fab_play.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_fab_plus.png b/res/drawable-xxhdpi/ic_fab_plus.png
deleted file mode 100644
index 1f27d3f..0000000
--- a/res/drawable-xxhdpi/ic_fab_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_fab_stop.png b/res/drawable-xxhdpi/ic_fab_stop.png
deleted file mode 100644
index 6da87c3..0000000
--- a/res/drawable-xxhdpi/ic_fab_stop.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_globe.png b/res/drawable-xxhdpi/ic_globe.png
deleted file mode 100644
index fc78843..0000000
--- a/res/drawable-xxhdpi/ic_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_language_white_24dp.png b/res/drawable-xxhdpi/ic_language_white_24dp.png
new file mode 100644
index 0000000..d4b5518
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_language_white_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pause_white_24dp.png b/res/drawable-xxhdpi/ic_pause_white_24dp.png
new file mode 100644
index 0000000..7192ad4
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/panel_undo_holo.9.png b/res/drawable-xxhdpi/panel_undo_holo.9.png
deleted file mode 100644
index 1dc4927..0000000
--- a/res/drawable-xxhdpi/panel_undo_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/alarm_background_expanded.9.png b/res/drawable-xxxhdpi/alarm_background_expanded.9.png
new file mode 100644
index 0000000..c1fb7ff
--- /dev/null
+++ b/res/drawable-xxxhdpi/alarm_background_expanded.9.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/bg_edittext_activated.9.png b/res/drawable-xxxhdpi/bg_edittext_activated.9.png
deleted file mode 100644
index 932a170..0000000
--- a/res/drawable-xxxhdpi/bg_edittext_activated.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/bg_edittext_default.9.png b/res/drawable-xxxhdpi/bg_edittext_default.9.png
deleted file mode 100644
index 932a170..0000000
--- a/res/drawable-xxxhdpi/bg_edittext_default.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_alarm_off_white_24dp.png b/res/drawable-xxxhdpi/ic_alarm_off_white_24dp.png
index d4fc2db..e824dda 100644
--- a/res/drawable-xxxhdpi/ic_alarm_off_white_24dp.png
+++ b/res/drawable-xxxhdpi/ic_alarm_off_white_24dp.png
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/ic_alarm_small.png b/res/drawable-xxxhdpi/ic_alarm_small_12dp.png
similarity index 100%
copy from res/drawable-sw600dp-xhdpi/ic_alarm_small.png
copy to res/drawable-xxxhdpi/ic_alarm_small_12dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_alarm_small.png b/res/drawable-xxxhdpi/ic_alarm_small_18dp.png
similarity index 100%
rename from res/drawable-xxxhdpi/ic_alarm_small.png
rename to res/drawable-xxxhdpi/ic_alarm_small_18dp.png
Binary files differ
diff --git a/res/drawable-sw600dp-xxxhdpi/ic_alarm_small.png b/res/drawable-xxxhdpi/ic_alarm_small_24dp.png
similarity index 100%
rename from res/drawable-sw600dp-xxxhdpi/ic_alarm_small.png
rename to res/drawable-xxxhdpi/ic_alarm_small_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_fab_pause.png b/res/drawable-xxxhdpi/ic_fab_pause.png
deleted file mode 100644
index 47616f1..0000000
--- a/res/drawable-xxxhdpi/ic_fab_pause.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_fab_play.png b/res/drawable-xxxhdpi/ic_fab_play.png
deleted file mode 100644
index 0ae54f0..0000000
--- a/res/drawable-xxxhdpi/ic_fab_play.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_fab_plus.png b/res/drawable-xxxhdpi/ic_fab_plus.png
deleted file mode 100644
index 14ad343..0000000
--- a/res/drawable-xxxhdpi/ic_fab_plus.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_fab_stop.png b/res/drawable-xxxhdpi/ic_fab_stop.png
deleted file mode 100644
index 4c36402..0000000
--- a/res/drawable-xxxhdpi/ic_fab_stop.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_language_white_24dp.png b/res/drawable-xxxhdpi/ic_language_white_24dp.png
new file mode 100644
index 0000000..a576ac7
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_language_white_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_pause_white_24dp.png b/res/drawable-xxxhdpi/ic_pause_white_24dp.png
new file mode 100644
index 0000000..660ac65
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_pause_white_24dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/panel_undo_holo.9.png b/res/drawable-xxxhdpi/panel_undo_holo.9.png
deleted file mode 100644
index 1dc4927..0000000
--- a/res/drawable-xxxhdpi/panel_undo_holo.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/alarm_background_normal.xml b/res/drawable/alarm_background_normal.xml
deleted file mode 100644
index 7c415f3..0000000
--- a/res/drawable/alarm_background_normal.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 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_pressed="true"
- android:drawable="@color/blackish_selected" />
-
- <item android:state_focused="false" android:state_pressed="true"
- android:drawable="@color/blackish_selected" />
-
- <item android:state_focused="true"
- android:drawable="@color/blackish_selected" />
-
-</selector>
diff --git a/res/drawable/fastscroll_preview.xml b/res/drawable/fastscroll_preview.xml
index b4165e0..33424f6 100644
--- a/res/drawable/fastscroll_preview.xml
+++ b/res/drawable/fastscroll_preview.xml
@@ -1,22 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 The Android Open Source Project
+<!-- Copyright (C) 2015 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
+ 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
+ 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.
+ 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.
-->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle">
- <corners android:radius="44dp"/>
- <solid android:color="@color/color_accent" />
-</shape>
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+ android:insetRight="@dimen/fastscroll_preview_padding"
+ android:insetLeft="@dimen/fastscroll_preview_padding">
+ <shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <corners android:radius="44dp"/>
+ <solid android:color="@color/color_accent" />
+ </shape>
+</inset>
diff --git a/res/drawable/ic_clock.xml b/res/drawable/ic_clock.xml
old mode 100644
new mode 100755
index 9fb2cfc..0099989
--- a/res/drawable/ic_clock.xml
+++ b/res/drawable/ic_clock.xml
@@ -15,54 +15,73 @@
limitations under the License.
-->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:height="24dp"
+<vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:name="ic_clock"
android:width="24dp"
- android:viewportHeight="24"
- android:viewportWidth="24" >
+ android:viewportWidth="240"
+ android:height="24dp"
+ android:viewportHeight="240" >
<group
android:name="clock_frame"
- android:translateX="12"
- android:translateY="12" >
+ android:translateX="120"
+ android:translateY="120"
+ android:scaleX="9.91"
+ android:scaleY="9.91" >
<group
android:name="clock_frame_pivot"
android:translateX="-12"
android:translateY="-12" >
<group
- android:name="hour_hand"
- android:translateX="12.00763"
- android:translateY="9.992" >
- <path
- android:name="hour_hand_path"
- android:pathData="M 0.742004394531,2.99200439453 c 0.0,0.0 -1.48400878906,0.0 -1.48400878906,0.0 c 0.0,0.0 0.0,-5.98400878906 0.0,-5.98400878906 c 0.0,0.0 1.48400878906,0.0 1.48400878906,0.0 c 0.0,0.0 0.0,5.98400878906 0.0,5.98400878906 Z"
- android:fillColor="#FFFFFFFF"
- android:fillAlpha="1" />
- </group>
- <group
- android:name="clock_frame_1"
+ android:name="clock_frame_0"
android:translateX="12"
android:translateY="12" >
<path
- android:name="clock_ouline_path"
- android:pathData="M -0.0050048828125,-10 c -5.52699279785,0 -9.99499511719,4.47700500488 -9.99499511719,10 c 0,5.52299499512 4.46800231934,10 9.99499511719,10 c 5.52600097656,0 10.0050048828,-4.47700500488 10.0050048828,-10 c 0,-5.52299499512 -4.47900390625,-10 -10.0050048828,-10 Z M 0,8 c -4.41999816895,0 -8,-3.58200073242 -8,-8 c 0,-4.41799926758 3.58000183105,-8 8,-8 c 4.41999816895,0 8,3.58200073242 8,8 c 0,4.41799926758 -3.58000183105,8 -8,8 Z"
- android:fillColor="#FFFFFFFF"
- android:fillAlpha="1" />
+ android:name="clock_ouline_path_merged"
+ android:pathData="M -0.0050048828125,-10.0 c -5.52699279785,0.0 -9.99499511719,4.47700500488 -9.99499511719,10.0 c 0.0,5.52299499512 4.46800231934,10.0 9.99499511719,10.0 c 5.52600097656,0.0 10.0050048828,-4.47700500488 10.0050048828,-10.0 c 0.0,-5.52299499512 -4.47900390625,-10.0 -10.0050048828,-10.0 Z M 0.0,8.0 c -4.41999816895,0.0 -8.0,-3.58200073242 -8.0,-8.0 c 0.0,-4.41799926758 3.58000183105,-8.0 8.0,-8.0 c 4.41999816895,0.0 8.0,3.58200073242 8.0,8.0 c 0.0,4.41799926758 -3.58000183105,8.0 -8.0,8.0 Z"
+ android:fillColor="#FFFFFFFF" />
</group>
</group>
</group>
<group
- android:name="second_hand"
- android:translateX="12"
- android:translateY="12" >
+ android:name="hour_hand"
+ android:translateX="117.75"
+ android:translateY="128.25"
+ android:scaleX="0.91922"
+ android:scaleY="3.67245" >
<group
- android:name="second_hand_pivot"
- android:translateX="-12"
- android:translateY="-12" >
- <path
- android:name="second_hand_path"
- android:pathData="M 12.7418060303,12.9839935303 c 0.0,0.0 -1.48399353027,0.0 -1.48399353027,0.0 c 0.0,0.0 0.0,-5.98399353027 0.0,-5.98399353027 c 0.0,0 1.48399353027,0 1.48399353027,0 c 0.0,0 0.0,5.98399353027 0.0,5.98399353027 Z"
- android:fillColor="#FFFFFFFF"
- android:fillAlpha="1" />
+ android:name="hour_hand_pivot"
+ android:translateY="-7.69241" >
+ <group
+ android:name="hour_hand_0"
+ android:translateX="-0.25"
+ android:translateY="-0.125" >
+ <path
+ android:name="hour_hand_path"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M -7.986815,-7.986815 l 15.97363,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,15.97363 c 0.0,0.0 0.0,0.0 0.0,0.0 l -15.97363,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-15.97363 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
+ </group>
+ </group>
+ </group>
+ <group
+ android:name="minute_hand"
+ android:translateX="114.25"
+ android:translateY="124"
+ android:scaleX="0.91922"
+ android:scaleY="3.67245"
+ android:rotation="121" >
+ <group
+ android:name="minute_hand_pivot"
+ android:translateY="-7.69241" >
+ <group
+ android:name="minute_hand_0"
+ android:translateX="-0.25"
+ android:translateY="-0.125" >
+ <path
+ android:name="minute_hand_path"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M -7.986815,-7.986815 l 15.97363,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,15.97363 c 0.0,0.0 0.0,0.0 0.0,0.0 l -15.97363,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-15.97363 c 0.0,0.0 0.0,0.0 0.0,0.0 Z" />
+ </group>
</group>
</group>
</vector>
diff --git a/res/layout/stopwatch_spacer.xml b/res/drawable/ic_pause_24dp.xml
similarity index 71%
copy from res/layout/stopwatch_spacer.xml
copy to res/drawable/ic_pause_24dp.xml
index 31b648b..fa2e610 100644
--- a/res/layout/stopwatch_spacer.xml
+++ b/res/drawable/ic_pause_24dp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
+<!-- Copyright (C) 2015 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.
@@ -13,8 +13,5 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
-<Space
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="@dimen/stopwatch_list_bottom_spacing" />
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_pause_white_24dp" />
diff --git a/res/drawable/ic_lap_24dp.xml b/res/drawable/ic_sw_lap_24dp.xml
similarity index 100%
rename from res/drawable/ic_lap_24dp.xml
rename to res/drawable/ic_sw_lap_24dp.xml
diff --git a/res/drawable/ic_sw_reset_24dp.xml b/res/drawable/ic_sw_reset_24dp.xml
new file mode 100644
index 0000000..3a301cd
--- /dev/null
+++ b/res/drawable/ic_sw_reset_24dp.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_reset_white_24dp" />
diff --git a/res/drawable/ic_sw_start_24dp.xml b/res/drawable/ic_sw_start_24dp.xml
new file mode 100644
index 0000000..cb5afbc
--- /dev/null
+++ b/res/drawable/ic_sw_start_24dp.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+ android:src="@drawable/ic_start_white_24dp" />
diff --git a/res/drawable/toggle_circle.xml b/res/drawable/toggle_circle.xml
index d93bed3..574ae8c 100644
--- a/res/drawable/toggle_circle.xml
+++ b/res/drawable/toggle_circle.xml
@@ -16,7 +16,7 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_activated="true">
+ <item android:state_checked="true">
<bitmap
android:src="@drawable/bg_day_selected"
android:gravity="center" />
diff --git a/res/layout/stopwatch_spacer.xml b/res/interpolator/ic_clock_animation_interpolator_0.xml
similarity index 79%
copy from res/layout/stopwatch_spacer.xml
copy to res/interpolator/ic_clock_animation_interpolator_0.xml
index 31b648b..7c938ee 100644
--- a/res/layout/stopwatch_spacer.xml
+++ b/res/interpolator/ic_clock_animation_interpolator_0.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
+<!--
+ Copyright (C) 2015 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.
@@ -14,7 +15,6 @@
limitations under the License.
-->
-<Space
+<pathInterpolator
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="@dimen/stopwatch_list_bottom_spacing" />
+ android:pathData="M 0.0,0.0 c 0.0,0.0 0.618865688196,1.0 1.0,1.0" />
diff --git a/res/layout/stopwatch_spacer.xml b/res/interpolator/ic_clock_animation_interpolator_1.xml
similarity index 79%
rename from res/layout/stopwatch_spacer.xml
rename to res/interpolator/ic_clock_animation_interpolator_1.xml
index 31b648b..3247d36 100644
--- a/res/layout/stopwatch_spacer.xml
+++ b/res/interpolator/ic_clock_animation_interpolator_1.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
+<!--
+ Copyright (C) 2015 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.
@@ -14,7 +15,6 @@
limitations under the License.
-->
-<Space
+<pathInterpolator
xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="@dimen/stopwatch_list_bottom_spacing" />
+ android:pathData="M 0.0,0.0 c 0.45921046959,0.0 1.0,1.0 1.0,1.0" />
diff --git a/res/layout-land/clock_fragment.xml b/res/layout-land/clock_fragment.xml
index 42ecb7c..dc834f5 100644
--- a/res/layout-land/clock_fragment.xml
+++ b/res/layout-land/clock_fragment.xml
@@ -16,33 +16,36 @@
<!-- Use this clock_fragment for landscape, which has main clock frame next to cities,
with a spacing ratio dependent on the number of clocks per row (phone has 1, tablet has 2). -->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:paddingStart="@dimen/clock_side_padding"
+ android:baselineAligned="false"
+ android:orientation="horizontal"
android:paddingEnd="@dimen/clock_side_padding"
- android:orientation="horizontal">
+ android:paddingStart="@dimen/clock_side_padding">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_weight="2"
android:layout_marginBottom="@dimen/main_clock_bottom_margin"
+ android:layout_weight="2"
android:gravity="center">
- <include layout="@layout/main_clock_frame"
+ <include
android:id="@+id/main_clock_left_pane"
+ layout="@layout/main_clock_frame"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"/>
</LinearLayout>
<ListView
- android:id="@+id/cities"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="@integer/world_clocks_per_row"
- android:layout_gravity="center"
- android:clickable="false" />
+ android:id="@+id/cities"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_weight="@integer/world_clocks_per_row"
+ android:clickable="false"/>
</LinearLayout>
\ No newline at end of file
diff --git a/res/layout-land/stopwatch_fragment.xml b/res/layout-land/stopwatch_fragment.xml
index 5c86293..779aba4 100644
--- a/res/layout-land/stopwatch_fragment.xml
+++ b/res/layout-land/stopwatch_fragment.xml
@@ -13,62 +13,47 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent"
+ android:layout_height="wrap_content"
+ android:baselineAligned="false"
android:orientation="horizontal"
- android:baselineAligned="false">
+ android:paddingBottom="@dimen/fab_height">
- <Space
- android:id="@+id/start_space"
- android:visibility="gone"
- android:layout_weight="0.5"
- android:layout_width="0dip"
- android:layout_height="match_parent"/>
-
- <LinearLayout
- android:layout_width="wrap_content"
+ <!-- This FrameLayout reserves half the screen for the stopwatch. -->
+ <FrameLayout
+ android:layout_width="0dp"
android:layout_height="match_parent"
- android:layout_marginBottom="@dimen/stopwatch_circle_margin_bottom"
- android:gravity="center"
- android:orientation="vertical">
+ android:layout_weight="1">
- <com.android.deskclock.CircleButtonsLayout
- android:id="@+id/stopwatch_circle"
+ <!-- This FrameLayout draws the stopwatch centered within its half of the screen. -->
+ <FrameLayout
android:layout_width="@dimen/circle_size"
android:layout_height="@dimen/circle_size"
- android:layout_marginStart="32dip"
- android:layout_marginEnd="32dip"
- android:gravity="center">
+ android:layout_gravity="center"
+ android:gravity="center"
+ android:padding="16dp">
<com.android.deskclock.timer.CountingTimerView
android:id="@+id/stopwatch_time_text"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- <com.android.deskclock.CircleTimerView
+ <com.android.deskclock.stopwatch.StopwatchCircleView
android:id="@+id/stopwatch_time"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@null" />
+ </FrameLayout>
- </com.android.deskclock.CircleButtonsLayout>
+ </FrameLayout>
- </LinearLayout>
-
- <ListView
+ <android.support.v7.widget.RecyclerView
android:id="@+id/laps_list"
- android:layout_width="0dip"
+ android:layout_width="0dp"
android:layout_height="wrap_content"
- android:layout_weight="2"
- android:layout_marginBottom="8dip"
- android:layout_gravity="center" />
+ android:layout_gravity="center"
+ android:layout_weight="1" />
- <Space
- android:id="@+id/end_space"
- android:visibility="gone"
- android:layout_weight="0.5"
- android:layout_width="0dip"
- android:layout_height="match_parent"/>
-
-</LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout-land/time_setup_view.xml b/res/layout-land/time_setup_view.xml
index 26b7aed..b5e68e1 100644
--- a/res/layout-land/time_setup_view.xml
+++ b/res/layout-land/time_setup_view.xml
@@ -20,6 +20,7 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:baselineAligned="false"
android:orientation="horizontal">
<!-- This nested ltr layout cannot be combined with the parent because
@@ -32,8 +33,7 @@
android:layout_marginBottom="@dimen/footer_button_size"
android:layoutDirection="ltr"
android:gravity="center"
- android:orientation="vertical"
- >
+ android:orientation="vertical">
<com.android.deskclock.timer.TimerView
android:id="@+id/timer_time_text"
@@ -88,6 +88,6 @@
</LinearLayout>
- <include layout="@layout/timer_cancel_button" />
+ <include layout="@layout/timer_setup_buttons" />
</FrameLayout>
\ No newline at end of file
diff --git a/res/layout-land/timer_fragment.xml b/res/layout-land/timer_fragment.xml
deleted file mode 100644
index 8bcb1e3..0000000
--- a/res/layout-land/timer_fragment.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<FrameLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/timers_list_page"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:baselineAligned="false">
-
- <include layout="@layout/timer_timer_view"/>
-
- <include layout="@layout/timer_setup_view"/>
-
-</FrameLayout>
\ No newline at end of file
diff --git a/res/layout-sw600dp-land/alarm_clock.xml b/res/layout-sw600dp-land/alarm_clock.xml
index 1e97c33..6587d83 100644
--- a/res/layout-sw600dp-land/alarm_clock.xml
+++ b/res/layout-sw600dp-land/alarm_clock.xml
@@ -24,60 +24,22 @@
android:id="@+id/alarm_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="horizontal"
- android:baselineAligned="false" >
+ android:baselineAligned="false"
+ android:orientation="horizontal">
- <ListView
- android:id="@+id/alarms_list"
- android:layout_width="0dip"
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/alarms_recycler_view"
+ android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_weight="1"
- android:paddingBottom="@dimen/button_footer_height"
android:clipToPadding="false"
android:descendantFocusability="beforeDescendants"
- android:divider="@null"
- android:dividerHeight="0dip" />
+ android:fadingEdgeLength="0dp"
+ android:paddingBottom="@dimen/list_bottom_spacing"
+ android:scrollbarStyle="outsideOverlay"
+ android:scrollbars="vertical" />
</LinearLayout>
- <FrameLayout
- android:id="@+id/alarms_footer_view"
- android:layout_width="@dimen/footer_button_size"
- android:layout_height="@dimen/footer_button_size"
- android:layout_gravity="bottom|end" >
- <ImageButton
- android:id="@+id/menu_button"
- android:contentDescription="@string/button_menu"
- style="?attr/actionOverflowButtonStyle"
- android:layout_gravity="end|center_vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- </FrameLayout>
- <TextView
- android:id="@+id/alarms_empty_view"
- style="@style/no_alarms"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:contentDescription="@string/no_alarms"
- android:drawableTop="@drawable/ic_noalarms"
- android:text="@string/no_alarms"
- android:textColor="#4cffffff"
- android:paddingBottom="88dp" />
- <FrameLayout android:id="@+id/undo_frame"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="gone" >
- <com.android.deskclock.widget.ActionableToastBar
- android:id="@+id/undo_bar"
- android:layout_width="match_parent"
- android:layout_height="64dip"
- android:layout_gravity="bottom"
- android:layout_marginBottom="96dp"
- android:layout_marginLeft="@dimen/alarm_undo_bar_horizontal_margin"
- android:layout_marginStart="@dimen/alarm_undo_bar_horizontal_margin"
- android:layout_marginRight="@dimen/alarm_undo_bar_horizontal_margin"
- android:layout_marginEnd="@dimen/alarm_undo_bar_horizontal_margin"
- style="@style/ToastBarStyle" />
- </FrameLayout>
+ <include layout="@layout/alarm_empty_view" />
+
</FrameLayout>
diff --git a/res/layout-v21/stopwatch_notif_expanded.xml b/res/layout-v21/stopwatch_notif_expanded.xml
new file mode 100644
index 0000000..ae694b3
--- /dev/null
+++ b/res/layout-v21/stopwatch_notif_expanded.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 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="match_parent"
+ android:layout_height="wrap_content"
+ android:divider="@drawable/horizontal_divider"
+ android:orientation="vertical"
+ android:showDividers="middle">
+
+ <FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/swn_expanded_hitspace"
+ android:layout_width="match_parent"
+ android:layout_height="64dp"
+ android:background="@drawable/notification_background">
+
+ <include layout="@layout/stopwatch_notification_icon" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="fill_vertical"
+ android:layout_marginStart="@dimen/notification_icon_size"
+ android:gravity="center"
+ android:minHeight="@dimen/notification_icon_size"
+ android:orientation="vertical"
+ android:paddingBottom="2dp"
+ android:paddingEnd="8dp"
+ android:paddingTop="2dp">
+
+ <LinearLayout
+ android:id="@+id/line1"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <Chronometer
+ android:id="@+id/swn_expanded_chronometer"
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title" />
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/swn_expanded_laps"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="marquee"
+ android:fadingEdge="horizontal"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
+ android:visibility="gone" />
+ </LinearLayout>
+ </FrameLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/notification_icon_size"
+ android:divider="@drawable/divider"
+ android:orientation="horizontal" >
+
+ <TextView
+ android:id="@+id/swn_left_button"
+ android:layout_width="0dp"
+ android:layout_height="48dp"
+ android:layout_weight="1"
+ android:background="@drawable/notification_background"
+ android:drawablePadding="8dp"
+ android:ellipsize="end"
+ android:gravity="start|center_vertical"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Action" />
+
+ <TextView
+ android:id="@+id/swn_right_button"
+ android:layout_width="0dp"
+ android:layout_height="48dp"
+ android:layout_weight="1"
+ android:background="@drawable/notification_background"
+ android:drawablePadding="8dp"
+ android:ellipsize="end"
+ android:gravity="start|center_vertical"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Action" />
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/actionable_toast_row.xml b/res/layout/actionable_toast_row.xml
deleted file mode 100644
index dfffb3d..0000000
--- a/res/layout/actionable_toast_row.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2012 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
- -->
-<merge xmlns:android="http://schemas.android.com/apk/res/android" >
-
- <TextView
- android:id="@+id/description_text"
- android:layout_width="0dip"
- android:layout_height="match_parent"
- android:layout_weight="1"
- android:ellipsize="end"
- android:gravity="center_vertical"
- android:paddingLeft="16dip"
- android:paddingStart="16dip"
- android:singleLine="true"
- android:text="@string/alarm_deleted"
- android:textColor="@android:color/white"
- android:textSize="16sp" />
-
- <LinearLayout
- android:id="@+id/action_button"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:background="?android:attr/selectableItemBackground"
- android:clickable="true" >
- <TextView
- android:id="@+id/action_text"
- style="@style/undo_toast"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_marginLeft="4dip"
- android:layout_marginStart="4dip"
- android:gravity="center_vertical"
- android:paddingRight="16dip"
- android:paddingEnd="16dip" />
- </LinearLayout>
-
-</merge>
diff --git a/res/layout/alarm_clock.xml b/res/layout/alarm_clock.xml
index 3d7610c..af1bfe6 100644
--- a/res/layout/alarm_clock.xml
+++ b/res/layout/alarm_clock.xml
@@ -20,60 +20,17 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <ListView
- android:id="@+id/alarms_list"
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/alarms_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:paddingBottom="@dimen/button_footer_height"
android:clipToPadding="false"
android:descendantFocusability="beforeDescendants"
- android:divider="@null"
- android:dividerHeight="0dip"
- />
+ android:fadingEdgeLength="0dp"
+ android:paddingBottom="@dimen/list_bottom_spacing"
+ android:scrollbarStyle="outsideOverlay"
+ android:scrollbars="vertical" />
- <TextView
- android:id="@+id/alarms_empty_view"
- style="@style/no_alarms"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:contentDescription="@string/no_alarms"
- android:drawableTop="@drawable/ic_noalarms"
- android:gravity="center"
- android:text="@string/no_alarms"
- android:textColor="#4cffffff"
- android:paddingBottom="88dp" />
+ <include layout="@layout/alarm_empty_view" />
- <FrameLayout android:id="@+id/undo_frame"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:visibility="gone" >
- <com.android.deskclock.widget.ActionableToastBar
- android:id="@+id/undo_bar"
- android:layout_width="match_parent"
- android:layout_height="64dip"
- android:layout_gravity="bottom"
- android:layout_marginBottom="96dp"
- android:layout_marginLeft="@dimen/alarm_undo_bar_horizontal_margin"
- android:layout_marginStart="@dimen/alarm_undo_bar_horizontal_margin"
- android:layout_marginRight="@dimen/alarm_undo_bar_horizontal_margin"
- android:layout_marginEnd="@dimen/alarm_undo_bar_horizontal_margin"
- style="@style/ToastBarStyle" />
- </FrameLayout>
-
- <FrameLayout
- android:id="@+id/alarms_footer_view"
- android:layout_width="@dimen/footer_button_size"
- android:layout_height="@dimen/footer_button_size"
- android:layout_gravity="bottom|end"
- android:layout_marginBottom="@dimen/footer_button_layout_margin" >
- <ImageButton
- android:id="@+id/menu_button"
- style="?attr/actionOverflowButtonStyle"
- android:layout_gravity="end|center_vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:accessibilityTraversalAfter="@+id/fab"
- android:contentDescription="@string/button_menu" />
- </FrameLayout>
</FrameLayout>
diff --git a/res/layout/alarm_empty_view.xml b/res/layout/alarm_empty_view.xml
new file mode 100644
index 0000000..fc03e83
--- /dev/null
+++ b/res/layout/alarm_empty_view.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/alarms_empty_view"
+ style="@style/no_alarms"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:contentDescription="@string/no_alarms"
+ android:drawableTop="@drawable/ic_noalarms"
+ android:paddingBottom="@dimen/fab_height"
+ android:text="@string/no_alarms"
+ android:gravity="center_horizontal"
+ android:textColor="#4cffffff"
+ android:visibility="gone" />
diff --git a/res/layout/alarm_row.xml b/res/layout/alarm_row.xml
index 5697e9e..1558ccd 100644
--- a/res/layout/alarm_row.xml
+++ b/res/layout/alarm_row.xml
@@ -1,4 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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"
diff --git a/res/layout/alarm_time.xml b/res/layout/alarm_time.xml
deleted file mode 100644
index fb2fe9a..0000000
--- a/res/layout/alarm_time.xml
+++ /dev/null
@@ -1,239 +0,0 @@
-<?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
- android:id="@+id/alarm_item"
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:dc="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingStart="@dimen/alarm_side_padding"
- android:paddingEnd="@dimen/alarm_side_padding"
- android:background="?android:attr/selectableItemBackground"
- android:gravity="center_horizontal|top"
- android:orientation="vertical">
- <!-- TODO~: flatten this layout using gridLayout which supports layout_weight as of 21 -->
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/alarm_clock_vertical_margin"
- android:orientation="horizontal">
-
- <com.android.deskclock.widget.TextTime
- android:id="@+id/digital_clock"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:textColor="@color/clock_white"
- android:textSize="@dimen/alarm_time_font_size"
- android:fontFamily="sans-serif-thin"
- dc:format12Hour="@string/alarm_time_12_hours_format"
- dc:format24Hour="@string/clock_24_hours_format" />
-
- <Space
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:layout_weight="1" />
-
- <android.support.v7.widget.SwitchCompat
- android:id="@+id/onoff"
- android:theme="@style/ControlAccentThemeOverlay"
- android:layout_width="wrap_content"
- android:layout_height="@dimen/touch_target_min_size"
- android:layout_gravity="center_vertical|end" />
-
- </LinearLayout>
-
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <LinearLayout
- android:id="@+id/expand_area"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom"
- android:layout_marginBottom="@dimen/collapse_expand_height"
- android:orientation="vertical"
- android:visibility="gone">
-
- <CheckBox
- android:id="@+id/repeat_onoff"
- android:layout_width="wrap_content"
- android:layout_height="48dip"
- android:layout_gravity="center_vertical|start"
- android:text="@string/alarm_repeat"
- android:textSize="16sp"
- android:paddingStart="12dip"
- android:textColor="@color/clock_white" />
-
- <LinearLayout
- android:id="@+id/repeat_days"
- android:layout_width="match_parent"
- android:layout_height="48dip"
- android:layout_gravity="top"
- android:orientation="horizontal"
- android:visibility="gone">
- <!-- Day buttons are put here programatically -->
- </LinearLayout>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:orientation="horizontal" >
-
- <TextView
- android:id="@+id/choose_ringtone"
- android:layout_width="0dip"
- android:layout_height="48dip"
- android:layout_weight="1"
- android:layout_alignParentStart="true"
- android:background="?android:attr/selectableItemBackground"
- android:clickable="true"
- android:paddingStart="4dip"
- android:drawablePadding="16dp"
- android:drawableStart="@drawable/ic_ringtone"
- android:ellipsize="marquee"
- android:gravity="center_vertical"
- android:marqueeRepeatLimit="marquee_forever"
- android:scrollHorizontally="true"
- android:singleLine="true"
- android:textAlignment="viewStart"
- android:textSize="16sp"
- android:textColor="@color/clock_white"
- />
-
- <CheckBox
- android:id="@+id/vibrate_onoff"
- android:layout_width="wrap_content"
- android:layout_height="48dip"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
- android:includeFontPadding="false"
- android:text="@string/alarm_vibrate"
- android:paddingStart="16dip"
- android:textSize="16sp"
- android:textColor="@color/white" />
- </LinearLayout>
-
- <TextView
- android:id="@+id/edit_label"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:ellipsize="end"
- android:hint="@string/label"
- android:paddingBottom="12dp"
- android:paddingEnd="12dp"
- android:paddingLeft="18dp"
- android:paddingRight="12dp"
- android:paddingStart="18dp"
- android:paddingTop="12dp"
- android:singleLine="true"
- android:textSize="16sp"
- android:textColor="@color/white" />
-
- <View
- android:layout_width="match_parent"
- android:layout_height="@dimen/hairline_height"
- android:layout_marginLeft="12dip"
- android:layout_marginRight="12dip"
- android:background="@color/hairline" />
-
- </LinearLayout>
-
- <FrameLayout
- android:id="@+id/collapse_expand"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom">
-
- <ImageButton
- android:id="@+id/delete"
- android:layout_width="@dimen/touch_target_min_size"
- android:layout_height="@dimen/touch_target_min_size"
- android:layout_gravity="center_vertical|start"
- android:layout_marginTop="@dimen/alarm_clock_vertical_margin"
- android:layout_marginBottom="@dimen/alarm_clock_vertical_margin"
- android:layout_marginStart="4dip"
- android:contentDescription="@string/delete_alarm"
- android:scaleType="center"
- android:src="@drawable/ic_delete_small" />
-
- <View
- android:id="@+id/hairline"
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:layout_gravity="bottom"
- android:layout_marginEnd="8dp"
- android:layout_marginStart="8dp"
- android:background="@color/hairline" />
-
- <com.android.deskclock.widget.EllipsizeLayout
- android:id="@+id/summary"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginBottom="@dimen/alarm_clock_vertical_margin"
- android:layout_marginEnd="@dimen/touch_target_min_size"
- android:gravity="center_vertical">
-
- <TextView
- android:id="@+id/label"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:ellipsize="none"
- android:singleLine="true"
- android:paddingEnd="4dip"
- android:textSize="16sp"
- android:textColor="@color/clock_gray" />
-
- <TextView
- android:id="@+id/daysOfWeek"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:ellipsize="end"
- android:singleLine="true"
- android:textSize="16sp"
- android:textStyle="bold"
- android:textColor="@color/clock_white" />
-
- <TextView
- android:id="@+id/tomorrowLabel"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:ellipsize="end"
- android:singleLine="true"
- android:textSize="16sp"
- android:textStyle="bold"
- android:textColor="@color/clock_white" />
-
- </com.android.deskclock.widget.EllipsizeLayout>
-
- <ImageButton
- android:id="@+id/arrow"
- android:layout_width="@dimen/touch_target_min_size"
- android:layout_height="@dimen/touch_target_min_size"
- android:layout_gravity="center_vertical|end"
- android:layout_marginTop="@dimen/alarm_clock_vertical_margin"
- android:layout_marginBottom="@dimen/alarm_clock_vertical_margin"
- android:contentDescription="@string/expand_alarm"
- android:scaleType="center"
- android:src="@drawable/ic_expand_down" />
- </FrameLayout>
- </FrameLayout>
-
-</LinearLayout>
diff --git a/res/layout/alarm_time_collapsed.xml b/res/layout/alarm_time_collapsed.xml
new file mode 100644
index 0000000..516cff3
--- /dev/null
+++ b/res/layout/alarm_time_collapsed.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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="match_parent"
+ android:layout_height="wrap_content"
+ android:background="?android:attr/selectableItemBackground"
+ android:gravity="center_horizontal|top"
+ android:orientation="vertical"
+ android:paddingEnd="@dimen/alarm_side_padding"
+ android:paddingStart="@dimen/alarm_side_padding">
+
+ <include layout="@layout/alarm_time_summary" />
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom">
+
+ <View
+ android:id="@+id/hairline"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/hairline_height"
+ android:layout_gravity="bottom"
+ android:layout_marginEnd="@dimen/icon_margin"
+ android:layout_marginStart="@dimen/icon_margin"
+ android:background="@color/hairline" />
+
+ <com.android.deskclock.widget.EllipsizeLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center_vertical"
+ android:layout_marginEnd="@dimen/touch_target_min_size"
+ android:gravity="center_vertical">
+
+ <TextView
+ android:id="@+id/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="none"
+ android:paddingStart="@dimen/icon_margin"
+ android:paddingEnd="@dimen/icon_margin"
+ android:singleLine="true"
+ android:textColor="@color/clock_gray"
+ android:textSize="@dimen/alarm_text_font_size" />
+
+ <TextView
+ android:id="@+id/days_of_week"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:focusable="true"
+ android:singleLine="true"
+ android:textColor="@color/clock_white"
+ android:textSize="@dimen/alarm_text_font_size"
+ android:textStyle="bold" />
+
+ <TextView
+ android:id="@+id/upcoming_instance_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:focusable="true"
+ android:singleLine="true"
+ android:textColor="@color/clock_white"
+ android:textSize="@dimen/alarm_text_font_size"
+ android:textStyle="bold" />
+
+ </com.android.deskclock.widget.EllipsizeLayout>
+
+ <ImageButton
+ android:id="@+id/arrow"
+ android:layout_width="@dimen/touch_target_min_size"
+ android:layout_height="@dimen/touch_target_min_size"
+ android:layout_gravity="center_vertical|end"
+ android:contentDescription="@string/expand_alarm"
+ android:scaleType="center"
+ android:src="@drawable/ic_expand_down" />
+
+ </FrameLayout>
+
+ <include
+ android:id="@+id/preemptive_dismiss_container"
+ layout="@layout/preemptive_dismiss" />
+
+</LinearLayout>
diff --git a/res/layout/alarm_time_expanded.xml b/res/layout/alarm_time_expanded.xml
new file mode 100644
index 0000000..38d24de
--- /dev/null
+++ b/res/layout/alarm_time_expanded.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal|top"
+ android:orientation="vertical"
+ android:paddingEnd="@dimen/alarm_side_padding"
+ android:paddingStart="@dimen/alarm_side_padding">
+
+ <include layout="@layout/alarm_time_summary" />
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:layout_marginBottom="@dimen/collapse_expand_height"
+ android:orientation="vertical">
+
+ <CheckBox
+ android:id="@+id/repeat_onoff"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/touch_target_min_size"
+ android:layout_gravity="center_vertical|start"
+ android:paddingStart="@dimen/alarm_side_padding"
+ android:text="@string/alarm_repeat"
+ android:textColor="@color/clock_white"
+ android:textSize="@dimen/alarm_text_font_size" />
+
+ <!-- Day buttons are put here programmatically -->
+ <LinearLayout
+ android:id="@+id/repeat_days"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/touch_target_min_size"
+ android:layout_gravity="top"
+ android:orientation="horizontal"
+ android:visibility="gone" />
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_vertical"
+ android:orientation="horizontal">
+
+ <TextView
+ android:id="@+id/choose_ringtone"
+ android:layout_width="0dip"
+ android:layout_height="@dimen/touch_target_min_size"
+ android:layout_weight="1"
+ android:background="?android:attr/selectableItemBackground"
+ android:clickable="true"
+ android:drawablePadding="@dimen/alarm_horizontal_padding"
+ android:drawableStart="@drawable/ic_ringtone"
+ android:ellipsize="marquee"
+ android:gravity="center_vertical"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:paddingStart="@dimen/icon_margin"
+ android:scrollHorizontally="true"
+ android:singleLine="true"
+ android:textAlignment="viewStart"
+ android:textColor="@color/clock_white"
+ android:textSize="@dimen/alarm_text_font_size" />
+
+ <CheckBox
+ android:id="@+id/vibrate_onoff"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/touch_target_min_size"
+ android:layout_alignParentEnd="true"
+ android:layout_centerVertical="true"
+ android:includeFontPadding="false"
+ android:paddingStart="@dimen/alarm_horizontal_padding"
+ android:text="@string/alarm_vibrate"
+ android:textColor="@color/white"
+ android:textSize="@dimen/alarm_text_font_size" />
+
+ </LinearLayout>
+
+ <TextView
+ android:id="@+id/edit_label"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:hint="@string/label"
+ android:paddingBottom="12dp"
+ android:paddingEnd="@dimen/alarm_side_padding"
+ android:paddingStart="44dp"
+ android:paddingTop="12dp"
+ android:singleLine="true"
+ android:textColor="@color/white"
+ android:textSize="@dimen/alarm_text_font_size" />
+
+ <View
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/hairline_height"
+ android:layout_marginEnd="@dimen/hairline_side_padding"
+ android:layout_marginStart="@dimen/hairline_side_padding"
+ android:background="@color/hairline" />
+
+ <include
+ android:id="@+id/preemptive_dismiss_container"
+ layout="@layout/preemptive_dismiss" />
+
+ </LinearLayout>
+
+ <FrameLayout
+ android:id="@+id/collapse_expand"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|start">
+
+ <Button
+ android:id="@+id/delete"
+ android:layout_width="@dimen/touch_target_min_size"
+ android:layout_height="@dimen/tall_row_height"
+ android:layout_gravity="center_vertical|start"
+ android:layout_marginTop="@dimen/alarm_clock_vertical_margin"
+ android:layout_marginBottom="@dimen/alarm_clock_vertical_margin"
+ android:background="?attr/selectableItemBackground"
+ android:contentDescription="@string/delete_alarm"
+ android:drawableStart="@drawable/ic_delete_small"
+ android:drawablePadding="@dimen/alarm_horizontal_padding"
+ android:gravity="start|center_vertical"
+ android:scaleType="fitStart" />
+
+ <ImageButton
+ android:id="@+id/arrow"
+ android:layout_width="@dimen/touch_target_min_size"
+ android:layout_height="@dimen/touch_target_min_size"
+ android:layout_gravity="center_vertical|end"
+ android:contentDescription="@string/collapse_alarm"
+ android:rotation="@integer/chevron_rotate_180"
+ android:scaleType="center"
+ android:src="@drawable/ic_expand_down" />
+
+ </FrameLayout>
+
+ </FrameLayout>
+
+</LinearLayout>
diff --git a/res/layout/alarm_time_summary.xml b/res/layout/alarm_time_summary.xml
new file mode 100644
index 0000000..ce28d83
--- /dev/null
+++ b/res/layout/alarm_time_summary.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="@dimen/alarm_clock_vertical_margin"
+ android:orientation="horizontal">
+
+ <com.android.deskclock.widget.TextTime
+ android:id="@+id/digital_clock"
+ app:format12Hour="@string/alarm_time_12_hours_format"
+ app:format24Hour="@string/clock_24_hours_format"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-thin"
+ android:gravity="center"
+ android:textColor="@color/clock_white"
+ android:textSize="@dimen/alarm_time_font_size" />
+
+ <Space
+ android:layout_width="0dip"
+ android:layout_height="wrap_content"
+ android:layout_weight="1" />
+
+ <android.support.v7.widget.SwitchCompat
+ android:id="@+id/onoff"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/touch_target_min_size"
+ android:layout_gravity="center_vertical|end"
+ android:theme="@style/ControlAccentThemeOverlay" />
+
+</LinearLayout>
diff --git a/res/layout/cities_activity.xml b/res/layout/cities_activity.xml
index cbda7c0..55a1591 100644
--- a/res/layout/cities_activity.xml
+++ b/res/layout/cities_activity.xml
@@ -17,8 +17,8 @@
<ListView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/cities_list"
- android:theme="@style/ControlAccentThemeOverlay"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="match_parent"
android:divider="@null"
- android:clipToPadding="false" />
+ android:fitsSystemWindows="true"
+ android:theme="@style/ControlAccentThemeOverlay" />
diff --git a/res/layout/city_list_item.xml b/res/layout/city_list_item.xml
index 2c143b4..a5a6ea8 100644
--- a/res/layout/city_list_item.xml
+++ b/res/layout/city_list_item.xml
@@ -24,11 +24,11 @@
android:orientation="horizontal">
<TextView
android:id="@+id/index"
- android:layout_width="56dip"
+ android:layout_width="74dip"
android:layout_height="match_parent"
android:gravity="center"
android:textStyle="bold"
- android:textSize="14sp"
+ android:textSize="@dimen/label_text_size"
android:textColor="@color/clock_white" />
<CheckBox
android:id="@+id/city_onoff"
diff --git a/res/layout/clock_fragment.xml b/res/layout/clock_fragment.xml
index b1936c9..a9e6715 100644
--- a/res/layout/clock_fragment.xml
+++ b/res/layout/clock_fragment.xml
@@ -14,28 +14,11 @@
limitations under the License.
-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<ListView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/cities"
android:layout_width="match_parent"
- android:layout_height="match_parent">
- <ListView
- android:id="@+id/cities"
- android:clickable="false"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingStart="@dimen/clock_side_padding"
- android:paddingEnd="@dimen/clock_side_padding_reduced" />
- <FrameLayout
- android:layout_width="@dimen/footer_button_size"
- android:layout_height="@dimen/footer_button_size"
- android:layout_gravity="bottom|end"
- android:layout_marginBottom="@dimen/footer_button_layout_margin" >
- <ImageButton
- android:id="@+id/menu_button"
- style="?attr/actionOverflowButtonStyle"
- android:layout_gravity="end|center_vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:accessibilityTraversalAfter="@+id/fab"
- android:contentDescription="@string/button_menu" />
- </FrameLayout>
-</FrameLayout>
+ android:layout_height="match_parent"
+ android:clickable="false"
+ android:paddingEnd="@dimen/clock_side_padding_reduced"
+ android:paddingStart="@dimen/clock_side_padding" />
diff --git a/res/layout/crescendo_length_picker.xml b/res/layout/crescendo_length_picker.xml
new file mode 100644
index 0000000..cadc46e
--- /dev/null
+++ b/res/layout/crescendo_length_picker.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+/**
+ * Copyright (c) 2015, Google Inc.
+ *
+ * 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="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_horizontal">
+
+ <com.android.deskclock.NumberPickerCompat
+ android:id="@+id/seconds_picker"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:focusable="true"
+ android:focusableInTouchMode="true" />
+
+ <TextView
+ android:id="@+id/title"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_marginStart="16dp"
+ android:gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+</LinearLayout>
diff --git a/res/layout/desk_clock.xml b/res/layout/desk_clock.xml
index b66d378..d25a578 100644
--- a/res/layout/desk_clock.xml
+++ b/res/layout/desk_clock.xml
@@ -14,22 +14,52 @@
limitations under the License.
-->
-<FrameLayout
+<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:fitsSystemWindows="true"
android:orientation="vertical">
- <android.support.v4.view.ViewPager
+ <android.support.design.widget.AppBarLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@null"
+ app:elevation="0dp">
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ app:contentInsetLeft="0dp"
+ app:contentInsetStart="0dp">
+
+ <android.support.design.widget.TabLayout
+ android:id="@+id/sliding_tabs"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:tabGravity="fill"
+ app:tabIndicatorColor="@android:color/transparent"
+ app:tabMode="fixed" />
+
+ </android.support.v7.widget.Toolbar>
+
+ </android.support.design.widget.AppBarLayout>
+
+ <com.android.deskclock.widget.RtlViewPager
android:id="@+id/desk_clock_pager"
android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ android:layout_height="match_parent"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
- android:orientation="horizontal">
+ android:baselineAligned="false"
+ android:orientation="horizontal"
+ app:layout_behavior="com.android.deskclock.widget.toast.LinearLayoutWithSnackbarBehavior">
<FrameLayout
android:layout_width="0dp"
@@ -39,11 +69,11 @@
<ImageButton
android:id="@+id/left_button"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_gravity="center_horizontal"
- android:scaleType="center"
- android:contentDescription="@null" />
+ android:layout_width="@dimen/design_fab_size_normal"
+ android:layout_height="@dimen/design_fab_size_normal"
+ android:layout_gravity="center"
+ android:contentDescription="@null"
+ android:scaleType="center" />
</FrameLayout>
@@ -52,16 +82,14 @@
android:layout_height="wrap_content"
android:layout_weight="1">
- <ImageButton
+ <android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
- style="@style/FabStyle"
- android:layout_width="@dimen/footer_button_size"
- android:layout_height="@dimen/footer_button_size"
- android:layout_margin="@dimen/footer_button_layout_margin"
- android:layout_gravity="center_horizontal"
- android:background="@drawable/floating_action_button"
- android:scaleType="center"
- android:contentDescription="@null" />
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_margin="@dimen/fab_margin"
+ app:borderWidth="0dp"
+ app:elevation="@dimen/fab_elevation" />
</FrameLayout>
@@ -73,14 +101,12 @@
<ImageButton
android:id="@+id/right_button"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_gravity="center_horizontal"
- android:scaleType="center"
- android:contentDescription="@null" />
+ android:layout_width="@dimen/design_fab_size_normal"
+ android:layout_height="@dimen/design_fab_size_normal"
+ android:layout_gravity="center"
+ android:contentDescription="@null"
+ android:scaleType="center" />
</FrameLayout>
-
</LinearLayout>
-
-</FrameLayout>
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/res/layout/desk_clock_saver.xml b/res/layout/desk_clock_saver.xml
index 8d173d7..7d3f2f7 100644
--- a/res/layout/desk_clock_saver.xml
+++ b/res/layout/desk_clock_saver.xml
@@ -15,81 +15,81 @@
-->
<!-- Special "screen saver mode" with just the time/date on black. -->
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dc="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- android:background="#FF000000">
+ android:background="@color/black"
+ android:orientation="vertical">
<!-- Extra layout to let the clock float in the window -->
<LinearLayout
android:id="@+id/main_clock"
- android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginLeft="@dimen/screensaver_margin"
- android:layout_marginStart="@dimen/screensaver_margin"
- android:layout_marginRight="@dimen/screensaver_margin"
+ android:layout_marginBottom="@dimen/screensaver_margin"
android:layout_marginEnd="@dimen/screensaver_margin"
+ android:layout_marginStart="@dimen/screensaver_margin"
android:layout_marginTop="@dimen/time_margin_top"
- android:layout_marginBottom="@dimen/screensaver_margin">
+ android:orientation="vertical">
<TextClock
android:id="@+id/digital_clock"
- android:format12Hour="@string/main_clock_12_hours_format"
- android:format24Hour="@string/clock_24_hours_format"
+ style="@style/big_thin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:singleLine="true"
- android:gravity="center"
- android:ellipsize="none"
android:layout_gravity="center"
android:layout_marginBottom="@dimen/bottom_text_spacing_digital"
- style="@style/big_thin"
- android:textColor="@color/clock_white" />
+ android:ellipsize="none"
+ android:format12Hour="@string/main_clock_12_hours_format"
+ android:format24Hour="@string/clock_24_hours_format"
+ android:gravity="center"
+ android:singleLine="true"
+ android:textColor="@color/clock_white"
+ android:textSize="@dimen/main_clock_font_size" />
<com.android.deskclock.AnalogClock
android:id="@+id/analog_clock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- dc:jewelRadius="5dp"
- dc:jewelOffset="23dp"
- dc:jewelColor="@color/clock_white"
+ android:layout_marginBottom="@dimen/bottom_text_spacing_analog"
android:dial="@drawable/clock_analog_dial_mipmap"
android:hand_hour="@drawable/clock_analog_hour_mipmap"
android:hand_minute="@drawable/clock_analog_minute_mipmap"
- android:layout_marginBottom="@dimen/bottom_text_spacing_analog" />
+ dc:jewelColor="@color/clock_white"
+ dc:jewelOffset="23dp"
+ dc:jewelRadius="5dp" />
+
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
- android:gravity="center" >
- <TextView android:id="@+id/date"
+ android:gravity="center">
+
+ <TextView
+ android:id="@+id/date"
+ style="@style/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:textColor="@color/clock_white"
- style="@style/label"
- android:textSize="@dimen/bottom_text_size"
android:gravity="center"
- android:visibility="gone"
- />
- <TextView android:id="@+id/nextAlarm"
+ android:textColor="@color/clock_white"
+ android:textSize="@dimen/bottom_text_size"
+ android:visibility="gone" />
+
+ <TextView
+ android:id="@+id/nextAlarm"
+ style="@style/label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:drawablePadding="2dip"
- android:drawableLeft="@drawable/ic_alarm_small"
- android:drawableStart="@drawable/ic_alarm_small"
- android:textColor="@color/clock_gray"
- style="@style/label"
- android:textSize="@dimen/bottom_text_size"
android:layout_marginLeft="8dip"
android:layout_marginStart="8dip"
+ android:drawablePadding="2dip"
+ android:drawableStart="@drawable/ic_alarm_small"
android:gravity="center"
- android:visibility="gone"
- />
+ android:textColor="@color/clock_gray"
+ android:textSize="@dimen/bottom_text_size"
+ android:visibility="gone" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
diff --git a/res/layout/digital_widget_time.xml b/res/layout/digital_widget_time.xml
index 61bc92a..e0250bf 100644
--- a/res/layout/digital_widget_time.xml
+++ b/res/layout/digital_widget_time.xml
@@ -40,27 +40,30 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:id="@+id/date_and_alarm"
android:gravity="center">
<TextClock android:id="@+id/date"
+ style="@style/widget_label"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="@color/clock_white"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
android:format12Hour=""
android:format24Hour=""
- style="@style/widget_label"
android:gravity="center"
+ android:textColor="@color/clock_white"
/>
- <TextView android:id="@+id/nextAlarm"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:drawablePadding="2dip"
- android:drawableLeft="@drawable/ic_alarm_small"
- android:drawableStart="@drawable/ic_alarm_small"
- android:textColor="@color/clock_gray"
+ <TextView
+ android:id="@+id/nextAlarm"
style="@style/widget_label"
- android:layout_marginLeft="8dip"
- android:layout_marginStart="8dip"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:layout_marginStart="6dp"
+ android:drawablePadding="6dp"
+ android:ellipsize="end"
android:gravity="center"
+ android:singleLine="true"
+ android:textColor="@color/clock_gray"
android:visibility="gone"
/>
</LinearLayout>
diff --git a/res/layout/expired_timers_activity.xml b/res/layout/expired_timers_activity.xml
new file mode 100644
index 0000000..0bd487e
--- /dev/null
+++ b/res/layout/expired_timers_activity.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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.
+-->
+
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:id="@+id/expired_timers_activity"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+ <ScrollView
+ android:id="@+id/expired_timers_scroll"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scrollbars="none">
+
+ <LinearLayout
+ android:id="@+id/expired_timers_list"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clipToPadding="false"
+ android:orientation="vertical"
+ android:paddingTop="?attr/actionBarSize" />
+ </ScrollView>
+
+ <android.support.design.widget.FloatingActionButton
+ android:id="@+id/fab"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal|bottom"
+ android:layout_margin="@dimen/fab_margin"
+ android:contentDescription="@string/timer_stop"
+ android:src="@drawable/ic_stop_white_24dp"
+ app:borderWidth="0dp"
+ app:elevation="@dimen/fab_elevation" />
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/lap_view.xml b/res/layout/lap_view.xml
index 5130c11..a79a8f4 100644
--- a/res/layout/lap_view.xml
+++ b/res/layout/lap_view.xml
@@ -16,6 +16,7 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/lap_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="ltr"
diff --git a/res/layout/main_clock_frame.xml b/res/layout/main_clock_frame.xml
index d4dfe51..240f21a 100644
--- a/res/layout/main_clock_frame.xml
+++ b/res/layout/main_clock_frame.xml
@@ -16,55 +16,63 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_clock_frame"
- android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
- android:paddingEnd="@dimen/clock_fragment_end_padding" >
+ android:orientation="vertical"
+ android:paddingEnd="@dimen/clock_fragment_end_padding">
+
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1">
+
<com.android.deskclock.AnalogClock
android:id="@+id/analog_clock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/circle_margin_top"
- android:layout_marginLeft="@dimen/analog_clock_margin"
- android:layout_marginStart="@dimen/analog_clock_margin"
- android:layout_marginRight="@dimen/analog_clock_margin"
+ android:layout_marginBottom="@dimen/bottom_text_spacing_analog"
android:layout_marginEnd="@dimen/analog_clock_margin"
+ android:layout_marginLeft="@dimen/analog_clock_margin"
+ android:layout_marginRight="@dimen/analog_clock_margin"
+ android:layout_marginStart="@dimen/analog_clock_margin"
+ android:layout_marginTop="@dimen/circle_margin_top"
android:dial="@drawable/clock_analog_dial_mipmap"
android:hand_hour="@drawable/clock_analog_hour_mipmap"
- android:hand_minute="@drawable/clock_analog_minute_mipmap"
- android:layout_marginBottom="@dimen/bottom_text_spacing_analog" />
+ android:hand_minute="@drawable/clock_analog_minute_mipmap" />
+
<TextClock
android:id="@+id/digital_clock"
- android:format12Hour="@string/main_clock_12_hours_format"
- android:format24Hour="@string/clock_24_hours_format"
+ style="@style/big_thin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:singleLine="true"
android:ellipsize="none"
- style="@style/big_thin"
- android:textColor="@color/clock_white" />
+ android:format12Hour="@string/main_clock_12_hours_format"
+ android:format24Hour="@string/clock_24_hours_format"
+ android:singleLine="true"
+ android:textColor="@color/clock_white"
+ android:textSize="@dimen/main_clock_font_size" />
</FrameLayout>
+
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal">
- <TextView android:id="@+id/date"
+
+ <TextView
+ android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/PrimaryLabelTextAppearance" />
- <TextView android:id="@+id/nextAlarm"
+
+ <TextView
+ android:id="@+id/nextAlarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dip"
android:layout_marginStart="8dip"
android:drawablePadding="2dip"
- android:drawableLeft="@drawable/ic_alarm_small"
android:drawableStart="@drawable/ic_alarm_small"
android:textAppearance="@style/SecondaryLabelTextAppearance" />
</LinearLayout>
diff --git a/res/layout/preemptive_dismiss.xml b/res/layout/preemptive_dismiss.xml
new file mode 100644
index 0000000..2a32d7a
--- /dev/null
+++ b/res/layout/preemptive_dismiss.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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
+ android:id="@+id/preemptive_dismiss"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:visibility="gone" >
+
+ <Button
+ android:id="@+id/preemptive_dismiss_button"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/tall_row_height"
+ android:background="?attr/selectableItemBackground"
+ android:drawableStart="@drawable/ic_alarm_off_white_24dp"
+ android:drawablePadding="@dimen/alarm_horizontal_padding"
+ android:gravity="start|center_vertical"
+ android:paddingStart="@dimen/icon_margin"
+ android:textAllCaps="false"
+ android:textColor="@color/clock_white"
+ android:textSize="@dimen/alarm_text_font_size" />
+
+ <View
+ android:id="@+id/preemptive_dismiss_hairline"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/hairline_height"
+ android:layout_marginEnd="@dimen/hairline_side_padding"
+ android:layout_marginStart="@dimen/hairline_side_padding"
+ android:background="@color/hairline" />
+
+</LinearLayout>
diff --git a/res/layout/screensaver_settings.xml b/res/layout/screensaver_settings.xml
index 0e8f2bb..f4b2813 100644
--- a/res/layout/screensaver_settings.xml
+++ b/res/layout/screensaver_settings.xml
@@ -14,9 +14,15 @@
limitations under the License.
-->
-<fragment
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/main"
- android:name="com.android.deskclock.ScreensaverSettingsActivity$PrefsFragment"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
\ No newline at end of file
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+ <fragment
+ android:id="@+id/main"
+ android:name="com.android.deskclock.settings.ScreensaverSettingsActivity$PrefsFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+</FrameLayout>
diff --git a/res/layout/settings.xml b/res/layout/settings.xml
index 207dff5..f587342 100644
--- a/res/layout/settings.xml
+++ b/res/layout/settings.xml
@@ -14,9 +14,15 @@
limitations under the License.
-->
-<fragment
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/main"
- android:name="com.android.deskclock.SettingsActivity$PrefsFragment"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+ <fragment
+ android:id="@+id/main"
+ android:name="com.android.deskclock.settings.SettingsActivity$PrefsFragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+</FrameLayout>
diff --git a/res/layout/snooze_length_picker.xml b/res/layout/snooze_length_picker.xml
index e94e27c..a843681 100644
--- a/res/layout/snooze_length_picker.xml
+++ b/res/layout/snooze_length_picker.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
/**
* Copyright (c) 2012, Google Inc.
*
@@ -18,9 +17,9 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:gravity="center_horizontal"
android:layout_width="wrap_content"
- android:layout_height="match_parent" >
+ android:layout_height="match_parent"
+ android:gravity="center_horizontal">
<com.android.deskclock.NumberPickerCompat
android:id="@+id/minutes_picker"
@@ -29,12 +28,12 @@
android:focusable="true"
android:focusableInTouchMode="true" />
- <TextView android:id="@+id/title"
- android:textAppearance="?android:attr/textAppearanceLarge"
- android:gravity="center_vertical"
- android:layout_marginLeft="16dip"
- android:layout_marginStart="16dip"
+ <TextView
+ android:id="@+id/title"
android:layout_width="wrap_content"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"
+ android:layout_marginStart="16dp"
+ android:gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
diff --git a/res/layout/stopwatch_fragment.xml b/res/layout/stopwatch_fragment.xml
index 1dca235..5ce57af 100644
--- a/res/layout/stopwatch_fragment.xml
+++ b/res/layout/stopwatch_fragment.xml
@@ -13,58 +13,38 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical">
+ android:baselineAligned="false"
+ android:gravity="center"
+ android:orientation="vertical"
+ android:paddingBottom="@dimen/fab_height">
- <Space
- android:id="@+id/start_space"
- android:visibility="gone"
- android:layout_weight="1"
- android:layout_width="match_parent"
- android:layout_height="0dip"/>
-
- <com.android.deskclock.CircleButtonsLayout
- android:id="@+id/stopwatch_circle"
+ <FrameLayout
android:layout_width="@dimen/circle_size"
android:layout_height="@dimen/circle_size"
android:layout_gravity="center"
- android:layout_marginLeft="@dimen/circle_margin"
- android:layout_marginStart="@dimen/circle_margin"
- android:layout_marginRight="@dimen/circle_margin"
- android:layout_marginEnd="@dimen/circle_margin">
+ android:padding="16dp">
<com.android.deskclock.timer.CountingTimerView
android:id="@+id/stopwatch_time_text"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- <com.android.deskclock.CircleTimerView
+
+ <com.android.deskclock.stopwatch.StopwatchCircleView
android:id="@+id/stopwatch_time"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@null" />
+ </FrameLayout>
- </com.android.deskclock.CircleButtonsLayout>
-
- <Space
- android:id="@+id/end_space"
- android:visibility="gone"
- android:layout_weight="1"
- android:layout_width="match_parent"
- android:layout_height="0dip"/>
-
- <ListView
+ <android.support.v7.widget.RecyclerView
android:id="@+id/laps_list"
- android:layout_weight="2"
android:layout_width="match_parent"
- android:layout_height="0dip" />
+ android:layout_height="0dp"
+ android:layout_gravity="center"
+ android:layout_weight="1" />
- <Space
- android:id="@+id/bottom_space"
- android:visibility="gone"
- android:layout_width="match_parent"
- android:layout_height="@dimen/footer_button_size"
- android:layout_margin="@dimen/footer_button_layout_margin" />
-
-</LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/stopwatch_notif_collapsed.xml b/res/layout/stopwatch_notif_collapsed.xml
index 2f5c6cd..a8ec193 100644
--- a/res/layout/stopwatch_notif_collapsed.xml
+++ b/res/layout/stopwatch_notif_collapsed.xml
@@ -39,7 +39,7 @@
android:id="@+id/line1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="8dp"
+ android:layout_marginStart="@dimen/notification_content_margin_start"
android:orientation="horizontal">
<Chronometer
@@ -55,7 +55,7 @@
android:id="@+id/swn_collapsed_laps"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginStart="8dp"
+ android:layout_marginStart="@dimen/notification_content_margin_start"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:visibility="gone"
@@ -63,4 +63,4 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent" />
</LinearLayout>
-</FrameLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/stopwatch_notif_expanded.xml b/res/layout/stopwatch_notif_expanded.xml
index 6e56077..5bb59a5 100644
--- a/res/layout/stopwatch_notif_expanded.xml
+++ b/res/layout/stopwatch_notif_expanded.xml
@@ -108,4 +108,4 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent" />
</LinearLayout>
-</LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/time_setup_view.xml b/res/layout/time_setup_view.xml
index a98d9aa..7d7bb2c 100644
--- a/res/layout/time_setup_view.xml
+++ b/res/layout/time_setup_view.xml
@@ -48,7 +48,7 @@
android:layout_width="match_parent"
android:layout_height="1dip"
android:layout_marginBottom="8dip"
- android:background="@color/dialog_gray" />```
+ android:background="@color/dialog_gray" />
<include
android:id="@+id/first"
@@ -66,6 +66,6 @@
android:id="@+id/fourth"
layout="@layout/three_keys_view" />
- <include layout="@layout/timer_cancel_button" />
+ <include layout="@layout/timer_setup_buttons" />
</LinearLayout>
diff --git a/res/layout/timer_alert_full_screen.xml b/res/layout/timer_alert_full_screen.xml
deleted file mode 100644
index 93edac2..0000000
--- a/res/layout/timer_alert_full_screen.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/fragment_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:fitsSystemWindows="true" />
diff --git a/res/layout/timer_cancel_button.xml b/res/layout/timer_cancel_button.xml
deleted file mode 100644
index bccd4a9..0000000
--- a/res/layout/timer_cancel_button.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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="match_parent"
- android:layout_height="@dimen/footer_button_size"
- android:layout_gravity="bottom"
- android:orientation="horizontal">
-
- <ImageButton
- android:id="@+id/timer_cancel"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:layout_height="match_parent"
- android:paddingEnd="20dip"
- android:contentDescription="@string/timer_cancel"
- android:scaleType="center"
- android:src="@drawable/ic_cancel"
- android:textSize="@dimen/button_font_size" />
-
- <Space
- android:layout_width="0dip"
- android:layout_weight="2"
- android:layout_height="match_parent">
- </Space>
-
-</LinearLayout>
diff --git a/res/layout/timer_fragment.xml b/res/layout/timer_fragment.xml
index 107b6cf..b8c353c 100644
--- a/res/layout/timer_fragment.xml
+++ b/res/layout/timer_fragment.xml
@@ -20,8 +20,63 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <include layout="@layout/timer_timer_view"/>
+ <FrameLayout
+ android:id="@+id/timer_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
- <include layout="@layout/timer_setup_view"/>
+ <LinearLayout
+ android:id="@+id/page_indicators"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_gravity="end|center_vertical"
+ android:layout_marginEnd="24dp"
+ android:gravity="center"
+ android:orientation="vertical">
-</FrameLayout>
+ <ImageView
+ android:id="@+id/page_indicator0"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@null"/>
+
+ <ImageView
+ android:id="@+id/page_indicator1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@null"/>
+
+ <ImageView
+ android:id="@+id/page_indicator2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@null"/>
+
+ <ImageView
+ android:id="@+id/page_indicator3"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:contentDescription="@null"/>
+
+ <Space
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/footer_button_size"
+ android:layout_marginBottom="16dp"
+ android:layout_marginTop="16dp"/>
+
+ </LinearLayout>
+
+ <com.android.deskclock.VerticalViewPager
+ android:id="@+id/vertical_view_pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+
+ </FrameLayout>
+
+ <com.android.deskclock.timer.TimerSetupView
+ android:id="@+id/timer_setup"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_margin="16dp"/>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/timer_full_screen_fragment.xml b/res/layout/timer_full_screen_fragment.xml
deleted file mode 100644
index 1ab5f13..0000000
--- a/res/layout/timer_full_screen_fragment.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <FrameLayout
- android:id="@+id/timers_list_page"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical">
-
- <com.android.deskclock.widget.sgv.StaggeredGridView
- android:id="@+id/timers_list"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center"
- android:divider="@null"
- android:dividerHeight="@dimen/timer_divider_height" />
-
- <ImageButton
- android:id="@+id/fab"
- android:layout_width="@dimen/footer_button_size"
- android:layout_height="@dimen/footer_button_size"
- android:layout_gravity="center_horizontal|bottom"
- android:layout_margin="@dimen/footer_button_layout_margin"
- android:background="@drawable/floating_action_button"
- android:src="@drawable/ic_fab_stop"
- android:contentDescription="@string/timer_stop" />
- </FrameLayout>
-
- <com.android.deskclock.TimerSetupView
- android:id="@+id/timer_setup"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginEnd="16dip"
- android:layout_marginStart="16dip"/>
-
-</FrameLayout>
diff --git a/res/layout/timer_h_mm_ss_view.xml b/res/layout/timer_h_mm_ss_view.xml
index 09b63ff..8261c56 100644
--- a/res/layout/timer_h_mm_ss_view.xml
+++ b/res/layout/timer_h_mm_ss_view.xml
@@ -19,76 +19,85 @@
android:layout_height="match_parent">
<TextView
- android:id="@+id/hours_ones"
- android:singleLine="true"
- android:ellipsize="none"
- style="@style/timer_setup_digit"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:textColor="@color/clock_white"/>
+ android:id="@+id/hours_tens"
+ style="@style/timer_setup_digit"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="none"
+ android:singleLine="true"
+ android:textColor="@color/clock_white"/>
<TextView
- android:id="@+id/hours_label"
- android:singleLine="true"
- android:ellipsize="none"
- style="@style/label"
- android:layout_gravity="bottom"
- android:contentDescription="@string/hours_label_description"
- android:text="@string/hours_label"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:textColor="@color/clock_white"/>
+ android:id="@+id/hours_ones"
+ style="@style/timer_setup_digit"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="none"
+ android:singleLine="true"
+ android:textColor="@color/clock_white"/>
<TextView
- android:id="@+id/minutes_tens"
- android:singleLine="true"
- android:ellipsize="none"
- style="@style/timer_setup_digit"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:textColor="@color/clock_white"/>
+ android:id="@+id/hours_label"
+ style="@style/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:contentDescription="@string/hours_label_description"
+ android:ellipsize="none"
+ android:singleLine="true"
+ android:text="@string/hours_label"
+ android:textColor="@color/clock_white"/>
<TextView
- android:id="@+id/minutes_ones"
- android:singleLine="true"
- android:ellipsize="none"
- style="@style/timer_setup_digit"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:textColor="@color/clock_white"/>
+ android:id="@+id/minutes_tens"
+ style="@style/timer_setup_digit"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="none"
+ android:singleLine="true"
+ android:textColor="@color/clock_white"/>
<TextView
- android:id="@+id/minutes_label"
- android:singleLine="true"
- android:ellipsize="none"
- style="@style/label"
- android:layout_gravity="bottom"
- android:contentDescription="@string/minutes_label_description"
- android:text="@string/minutes_label"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:textColor="@color/clock_white"/>
+ android:id="@+id/minutes_ones"
+ style="@style/timer_setup_digit"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ellipsize="none"
+ android:singleLine="true"
+ android:textColor="@color/clock_white"/>
<TextView
- android:id="@+id/seconds"
- android:singleLine="true"
- android:ellipsize="none"
- style="@style/timer_setup_digit"
- android:layout_gravity="bottom"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:textColor="@color/clock_white"/>
+ android:id="@+id/minutes_label"
+ style="@style/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:contentDescription="@string/minutes_label_description"
+ android:ellipsize="none"
+ android:singleLine="true"
+ android:text="@string/minutes_label"
+ android:textColor="@color/clock_white"/>
<TextView
- android:id="@+id/seconds_label"
- android:singleLine="true"
- android:ellipsize="none"
- style="@style/label"
- android:layout_gravity="bottom"
- android:contentDescription="@string/seconds_label_description"
- android:text="@string/seconds_label"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:textColor="@color/clock_white"/>
+ android:id="@+id/seconds"
+ style="@style/timer_setup_digit"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:ellipsize="none"
+ android:singleLine="true"
+ android:textColor="@color/clock_white"/>
+
+ <TextView
+ android:id="@+id/seconds_label"
+ style="@style/label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:contentDescription="@string/seconds_label_description"
+ android:ellipsize="none"
+ android:singleLine="true"
+ android:text="@string/seconds_label"
+ android:textColor="@color/clock_white"/>
</merge>
diff --git a/res/layout/timer_list_item.xml b/res/layout/timer_item.xml
similarity index 77%
rename from res/layout/timer_list_item.xml
rename to res/layout/timer_item.xml
index 4f1d115..1d97ecb 100644
--- a/res/layout/timer_list_item.xml
+++ b/res/layout/timer_item.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
+<!-- Copyright (C) 2015 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.
@@ -14,8 +14,7 @@
limitations under the License.
-->
-<!-- timer item in the list of active timers -->
-<com.android.deskclock.timer.TimerListItem
+<com.android.deskclock.timer.TimerItem
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -29,24 +28,23 @@
android:layout_width="@dimen/circle_size"
android:layout_height="@dimen/circle_size"
android:layout_gravity="center"
- android:layout_marginEnd="@dimen/timer_circle_margin"
- android:layout_marginStart="@dimen/timer_circle_margin">
+ android:padding="@dimen/timer_padding">
- <com.android.deskclock.CircleTimerView
+ <com.android.deskclock.timer.TimerCircleView
android:id="@+id/timer_time"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"/>
<com.android.deskclock.timer.CountingTimerView
android:id="@+id/timer_time_text"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"/>
<Button
android:id="@+id/timer_label"
style="?android:attr/borderlessButtonStyle"
android:layout_width="wrap_content"
- android:layout_height="56dip"
+ android:layout_height="56dp"
android:layout_gravity="top|center_horizontal"
android:clickable="false"
android:ellipsize="end"
@@ -54,18 +52,18 @@
android:hint="@string/label"
android:singleLine="true"
android:src="@drawable/ic_label"
- android:textAppearance="@style/SecondaryLabelTextAppearance" />
+ android:textAppearance="@style/SecondaryLabelTextAppearance"/>
<ImageButton
android:id="@+id/reset_add"
- android:layout_width="50dip"
- android:layout_height="50dip"
+ android:layout_width="50dp"
+ android:layout_height="50dp"
android:layout_gravity="bottom|center_horizontal"
android:contentDescription="@string/timer_plus_one"
android:gravity="center"
android:scaleType="center"
- android:src="@drawable/ic_plusone" />
+ android:src="@drawable/ic_plusone"/>
</com.android.deskclock.CircleButtonsLayout>
-</com.android.deskclock.timer.TimerListItem>
+</com.android.deskclock.timer.TimerItem>
\ No newline at end of file
diff --git a/res/layout/timer_setup_buttons.xml b/res/layout/timer_setup_buttons.xml
new file mode 100644
index 0000000..f0132f2
--- /dev/null
+++ b/res/layout/timer_setup_buttons.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 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"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:orientation="horizontal">
+
+ <FrameLayout
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_gravity="start|center_vertical"
+ android:layout_weight="1">
+
+ <ImageButton
+ android:id="@+id/timer_cancel"
+ android:layout_width="@dimen/design_fab_size_normal"
+ android:layout_height="@dimen/design_fab_size_normal"
+ android:layout_gravity="center"
+ android:contentDescription="@string/timer_cancel"
+ android:scaleType="center"
+ android:src="@drawable/ic_cancel" />
+
+ </FrameLayout>
+
+ <FrameLayout
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_gravity="start|center_vertical"
+ android:layout_weight="1">
+
+ <android.support.design.widget.FloatingActionButton
+ android:id="@+id/timer_create"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:layout_margin="@dimen/fab_margin"
+ android:contentDescription="@string/timer_start"
+ android:src="@drawable/ic_start_white_24dp"
+ android:visibility="invisible"
+ app:borderWidth="0dp"
+ app:elevation="@dimen/fab_elevation" />
+
+ </FrameLayout>
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1" />
+
+</LinearLayout>
diff --git a/res/layout/timer_setup_view.xml b/res/layout/timer_setup_view.xml
deleted file mode 100644
index 6c437b4..0000000
--- a/res/layout/timer_setup_view.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<com.android.deskclock.TimerSetupView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/timer_setup"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_margin="16dip" />
diff --git a/res/layout/timer_timer_view.xml b/res/layout/timer_timer_view.xml
deleted file mode 100644
index 440e36a..0000000
--- a/res/layout/timer_timer_view.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 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.
--->
-
-<FrameLayout
- android:id="@+id/timer_view"
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal">
-
- <LinearLayout
- android:id="@+id/page_indicators"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:layout_gravity="end|center_vertical"
- android:layout_marginEnd="24dip"
- android:gravity="center"
- android:orientation="vertical">
-
- <ImageView
- android:id="@+id/page_indicator0"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:scaleType="center"
- android:contentDescription="@null" />
-
- <ImageView
- android:id="@+id/page_indicator1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@null" />
-
- <ImageView
- android:id="@+id/page_indicator2"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@null" />
-
- <ImageView
- android:id="@+id/page_indicator3"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:contentDescription="@null" />
-
- <Space
- android:layout_width="match_parent"
- android:layout_height="@dimen/footer_button_size"
- android:layout_marginTop="@dimen/footer_button_layout_margin"
- android:layout_marginBottom="@dimen/footer_button_layout_margin" />
-
- </LinearLayout>
-
- <com.android.deskclock.VerticalViewPager
- android:id="@+id/vertical_view_pager"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
-
-</FrameLayout>
-
-
diff --git a/res/layout/world_clock_item.xml b/res/layout/world_clock_item.xml
index f8d2118..00036dd 100644
--- a/res/layout/world_clock_item.xml
+++ b/res/layout/world_clock_item.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2012 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 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.
diff --git a/res/menu/cities_menu.xml b/res/menu/cities_menu.xml
deleted file mode 100644
index a9b18f4..0000000
--- a/res/menu/cities_menu.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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"
- xmlns:ex="http://schemas.android.com/apk/res-auto">
-
- <item android:id="@+id/menu_item_search"
- android:title="@android:string/search_go"
- android:icon="@android:drawable/ic_menu_search"
- android:imeOptions="actionSearch"
- android:orderInCategory="1"
- ex:showAsAction="ifRoom"
- ex:actionViewClass="android.support.v7.widget.SearchView" />
-
- <item android:id="@+id/menu_item_sort"
- android:title="@string/menu_item_sort_by_gmt_offset"
- ex:showAsAction="never" />
-
- <item android:id="@+id/menu_item_settings"
- android:title="@string/menu_item_settings"
- android:icon="@android:drawable/ic_menu_preferences"
- ex:showAsAction="never"/>
-
- <item android:id="@+id/menu_item_help"
- android:title="@string/menu_item_help"
- android:icon="@android:drawable/ic_menu_preferences"
- ex:showAsAction="never"/>
-
-</menu>
-
-
diff --git a/res/menu/desk_clock_menu.xml b/res/menu/desk_clock_menu.xml
index b242050..4858714 100644
--- a/res/menu/desk_clock_menu.xml
+++ b/res/menu/desk_clock_menu.xml
@@ -14,18 +14,33 @@
limitations under the License.
-->
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
<group android:id="@+id/menu_items">
- <item android:id="@+id/menu_item_night_mode"
- android:title="@string/menu_item_night_mode"
- android:icon="@android:drawable/ic_menu_preferences"/>
- <item android:id="@+id/menu_item_settings"
- android:title="@string/menu_item_settings"
- android:icon="@android:drawable/ic_menu_preferences"/>
- <item android:id="@+id/menu_item_help"
- android:title="@string/menu_item_help"
- android:icon="@android:drawable/ic_menu_preferences"/>
+ <item
+ android:id="@+id/menu_item_search"
+ android:icon="@android:drawable/ic_menu_search"
+ android:imeOptions="actionSearch"
+ android:orderInCategory="1"
+ android:title="@android:string/search_go"
+ android:visible="false"
+ app:actionViewClass="android.support.v7.widget.SearchView"
+ app:showAsAction="ifRoom"/>
+ <item
+ android:id="@+id/menu_item_sort"
+ android:title="@string/menu_item_sort_by_gmt_offset"
+ app:showAsAction="never"/>
+ <item
+ android:id="@+id/menu_item_night_mode"
+ android:icon="@android:drawable/ic_menu_preferences"
+ android:title="@string/menu_item_night_mode"/>
+ <item
+ android:id="@+id/menu_item_settings"
+ android:icon="@android:drawable/ic_menu_preferences"
+ android:title="@string/menu_item_settings"/>
+ <item
+ android:id="@+id/menu_item_help"
+ android:icon="@android:drawable/ic_menu_preferences"
+ android:title="@string/menu_item_help"/>
</group>
-</menu>
-
-
+</menu>
\ No newline at end of file
diff --git a/res/menu/settings_menu.xml b/res/menu/settings_menu.xml
deleted file mode 100644
index 399e393..0000000
--- a/res/menu/settings_menu.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?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_help"
- android:title="@string/menu_item_help"
- android:icon="@android:drawable/ic_menu_preferences"/>
-</menu>
-
-
diff --git a/res/raw/fallbackring.ogg b/res/raw/alarm_expire.ogg
similarity index 97%
rename from res/raw/fallbackring.ogg
rename to res/raw/alarm_expire.ogg
index 9d80037..316e77e 100644
--- a/res/raw/fallbackring.ogg
+++ b/res/raw/alarm_expire.ogg
Binary files differ
diff --git a/res/raw/in_call_alarm.ogg b/res/raw/in_call_alarm.ogg
deleted file mode 100644
index 9d80037..0000000
--- a/res/raw/in_call_alarm.ogg
+++ /dev/null
Binary files differ
diff --git a/assets/sounds/Timer_Expire.ogg b/res/raw/timer_expire.ogg
similarity index 100%
rename from assets/sounds/Timer_Expire.ogg
rename to res/raw/timer_expire.ogg
Binary files differ
diff --git a/res/values-af/array.xml b/res/values-af/array.xml
index a4844fb..4ec3319 100644
--- a/res/values-af/array.xml
+++ b/res/values-af/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemalastad"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guiana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>Suidpool"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>Suidpool<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almati"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gasa"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"D<xliff:g id="SEPARATOR">=</xliff:g>Djakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Maskat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"K<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoen"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riad"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoel"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapoer"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanariese eilande"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Moembai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Haiderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 21eb5cb..df8f2f8 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Vertoon klok"</string>
<string name="hide_clock" msgid="3217727306480505694">"Versteek horlosie"</string>
<string name="label" msgid="162189613902857319">"Etiket"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Aan"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Af"</string>
<string name="default_label" msgid="5590025289805630372">"Wekker"</string>
<string name="set_alarm" msgid="9148359866152726808">"Stel wekker"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibreer"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Herhaal"</string>
<string name="alert" msgid="6506982899651975645">"Alarm se luitoon"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Gepasmaakte luitoon"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Afteller het verstryk"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Stil"</string>
<string name="ringtone" msgid="9110746249688559579">"Luitoon"</string>
<string name="time" msgid="8067216534232296518">"Tyd"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Môre"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Sluimer tot <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Komende wekker"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Die wekker wat jy misgeloop het, is uitgevee"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Minder as \'n minuut oor"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> oor"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> oor"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> oor"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Minder as \'n minuut oor"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> oor"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"oor"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"oor"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarm gestel vir minder as 1 minuut van nou af."</item>
<item msgid="6002066367368421848">"Alarm gestel vir <xliff:g id="DAYS">%1$s</xliff:g> van nou af."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minute</item>
<item quantity="one">minuut</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Verhoog volume geleidelik"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Af"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> sekondes"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sekondes"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Stilte ná"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minute</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Laai terug"</string>
<string name="delete" msgid="5732434972457000541">"Vee uit"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Wekkervolume"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Stil"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Stil"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Onbekend"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Sluimer of sit alarm uit."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (sluimerend)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarm is vir <xliff:g id="TIME">%s</xliff:g> gestel. Raak om te kanselleer."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Laai tans luitoon…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Klankterugspeel-diens vir aftellers word in Horlosie gestel."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Stel wekker"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Wekker"</string>
<string name="menu_timer" msgid="6459070074762877114">"Tydhouer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Horlosie"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Rangskik volgens naam"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Geselekteerde stede"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Hervat"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Begin"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stop"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Rondte"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Stel terug"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Begin"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Laat wag"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Rondte"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Deel"</string>
<string name="hours_label" msgid="3393478155635368097">"u"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"My tyd is <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Rondtetye:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Rondte <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> uur</item>
<item quantity="one">1 uur</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Voeg 1 minuut by"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Voeg 1 min. by"</string>
<string name="timer_stop" msgid="3361154678667736722">"Stop"</string>
- <string name="timer_done" msgid="2375990511982914051">"Klaar"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Stop alle aftellers"</string>
<string name="timer_reset" msgid="7848424809190171640">"Stel terug"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Kanselleer"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Afteller is gekanselleer"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Tyd is op"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> aftellers het verstryk"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Tydhouer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Maksimum van 4 aftellers"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Laat wag"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Stel alle aftellers terug"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Jy\'s \'n regte spoedduiwel."</item>
<item msgid="6332879039890727169">"Geniet die vrugte van jou arbeid."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Stede"</string>
<string name="clock_settings" msgid="8317286807280600391">"Horlosie"</string>
<string name="clock_style" msgid="2265011060429742344">"Styl"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Verander datum en tyd"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analoog"</item>
<item msgid="8483930821046925592">"Digitaal"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> is gemerk"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> is ontmerk"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshalleilande"</item>
<item msgid="4196408495909011020">"Midwayeiland"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Wekkers"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Stophorlosie-diens om die kennisgewing te laat loop"</string>
- <string name="swn_stopped" msgid="783124901663086172">"Gestop"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Verwerk handelinge van tydhouerkennisgewings af."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Verwerk handelinge van stophorlosiekennisgewings af."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Laat wag"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Swiep na regs om toe te maak"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Swiep na links om te laat sluimer"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Swiep links om te sluimer of regs om toe te maak"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Aftellers"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Aftellerluitoon"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Afteller gestop"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> aftellers gestop"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Afteller is laat wag"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> aftellers is laat wag"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Raak om jou aftellers te sien"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> aftellers"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Volgende afteller: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Geen wekkers nie"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Geen wekkers gestel nie"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"GEEN KOMENDE WEKKERS NIE"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE., k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Ongeldige tyd <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Geen wekker om <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> nie"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Geen wekkers is gestel nie"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Geen etiket is gespesifiseer nie"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Geen wekker bevat die etiket nie"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stophorlosie loop reeds"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stophorlosie loop nie"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stophorlosie kan nie teruggestel word nie, want dit loop tans"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stophorlosie is gestop"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stophorlosie is laat wag"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stophorlosie is teruggestel"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stophorlosie het rondte gemerk"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stophorlosie is begin"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Geen wekker is vir hierdie tyd gestel nie"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Wekker vir <xliff:g id="ALARM_TIME">%s</xliff:g> is toegemaak"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Wekker is gestel vir <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Geen afteller is gestel nie"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Afteller is uitgevee"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Afteller loop reeds"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Kan nie jou versoek voltooi nie; veelvuldige aftellers is beskikbaar"</string>
- <string name="timer_started" msgid="6715582052946641641">"Afteller is begin"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Daar bestaan geen aftellers nie"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Daar bestaan meer as een afteller"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Die afteller is verwyder."</string>
<string name="timer_created" msgid="4381027137335885547">"Afteller is geskep"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Ongeldige aftellerlengte"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Afteller is teruggestel"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Afteller kan nie teruggestel word nie, want dit loop nog. Stop afteller om dit terug te stel."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Afteller is reeds gestop"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Afteller is uitgevee"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Afteller is begin"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Ongeldige aftellerlengte"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Geen stad is gekies nie"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Die stad wat jy gespesifiseer het, is nie beskikbaar nie"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Daardie stad is reeds bygevoeg"</string>
diff --git a/res/values-am/array.xml b/res/values-am/array.xml
index 3bb5500..f8e8141 100644
--- a/res/values-am/array.xml
+++ b/res/values-am/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ፈ<xliff:g id="SEPARATOR">=</xliff:g>ፎርታሌዛ"</item>
<item msgid="5801558418916235541">"ገ<xliff:g id="SEPARATOR">=</xliff:g>ግራንድ ትራክ"</item>
<item msgid="2103759276235503048">"ገ<xliff:g id="SEPARATOR">=</xliff:g>ግሬናዳ"</item>
- <item msgid="1490069759176391533">"ገ<xliff:g id="SEPARATOR">=</xliff:g>ጉዋቲማላ"</item>
+ <item msgid="6216160110733510854">"ጓ<xliff:g id="SEPARATOR">=</xliff:g>ጓታሜላ ከተማ"</item>
<item msgid="525959305652046261">"ገ<xliff:g id="SEPARATOR">=</xliff:g>ጉያና"</item>
<item msgid="7565596629973190931">"ሀ<xliff:g id="SEPARATOR">=</xliff:g>ሃሊፋክስ"</item>
<item msgid="3811169155065582644">"ሀ<xliff:g id="SEPARATOR">=</xliff:g>ሀቫና"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ተ<xliff:g id="SEPARATOR">=</xliff:g>ቶሮንቶ"</item>
<item msgid="1506838283840737263">"ቨ<xliff:g id="SEPARATOR">=</xliff:g>ቫንኮቨር"</item>
<item msgid="8935386104773857399">"ወ<xliff:g id="SEPARATOR">=</xliff:g>ዊኒፔግ"</item>
- <item msgid="1132634022412399582">"ደ<xliff:g id="SEPARATOR">=</xliff:g>ደቡብ ዋልታ"</item>
+ <item msgid="498429228419399474">"ደ<xliff:g id="SEPARATOR">=</xliff:g>ደቡብ ዋልታ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ለ<xliff:g id="SEPARATOR">=</xliff:g>ሎንግየርቢየን"</item>
<item msgid="3784788073896028355">"አ<xliff:g id="SEPARATOR">=</xliff:g>አልማቲ"</item>
<item msgid="7895695236056852523">"አ<xliff:g id="SEPARATOR">=</xliff:g>አማን"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ገ<xliff:g id="SEPARATOR">=</xliff:g>ጋዛ"</item>
<item msgid="2359068282340162319">"ሐ<xliff:g id="SEPARATOR">=</xliff:g>ሔብሮን"</item>
<item msgid="6223396610551759129">"ሀ<xliff:g id="SEPARATOR">=</xliff:g>ሆ ቺ ሚንህ"</item>
- <item msgid="4731022818651322736">"ሀ<xliff:g id="SEPARATOR">=</xliff:g>ሆንግ ኮንግ"</item>
+ <item msgid="3439764751788710130">"ሀ<xliff:g id="SEPARATOR">=</xliff:g>ሆንግ ኮንግ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"አ<xliff:g id="SEPARATOR">=</xliff:g>ኢስታንቡል"</item>
<item msgid="758800913783999425">"ጀ<xliff:g id="SEPARATOR">=</xliff:g>ጃካርታ"</item>
<item msgid="8956406398692698126">"አ<xliff:g id="SEPARATOR">=</xliff:g>እየሩሳሌም"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"መ<xliff:g id="SEPARATOR">=</xliff:g>ማኒላ"</item>
<item msgid="6033964325069060422">"መ<xliff:g id="SEPARATOR">=</xliff:g>ሙስካት"</item>
<item msgid="6077458941399984780">"ፈ<xliff:g id="SEPARATOR">=</xliff:g>ፍኖም ፔን"</item>
- <item msgid="935474308903572975">"ፐ‹<xliff:g id="SEPARATOR">=</xliff:g>ፒዮንግያንግ"</item>
+ <item msgid="1245515372520913197">"‹<xliff:g id="SEPARATOR">=</xliff:g>ፒዮንግያንግ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"ከ<xliff:g id="SEPARATOR">=</xliff:g>ኳታር"</item>
<item msgid="1667243110545095146">"ረ<xliff:g id="SEPARATOR">=</xliff:g>ራንጉን"</item>
<item msgid="4460370766685855731">"ረ<xliff:g id="SEPARATOR">=</xliff:g>ሪያድ"</item>
<item msgid="4229224905931739201">"ሰ<xliff:g id="SEPARATOR">=</xliff:g>ሳይጎን"</item>
<item msgid="8705359848250215620">"ሰ<xliff:g id="SEPARATOR">=</xliff:g>ሴዖል"</item>
- <item msgid="583367295371395814">"ሸ<xliff:g id="SEPARATOR">=</xliff:g>ሻንጋይ"</item>
+ <item msgid="3814881931186962624">"ሸ<xliff:g id="SEPARATOR">=</xliff:g>ሻንጋይ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"ሰ<xliff:g id="SEPARATOR">=</xliff:g>ሲንጋፖር"</item>
- <item msgid="1972491729911039207">"ተ<xliff:g id="SEPARATOR">=</xliff:g>ታይፔይ"</item>
+ <item msgid="8982451946156859368">"ተ<xliff:g id="SEPARATOR">=</xliff:g>ታይፔይ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"ተ<xliff:g id="SEPARATOR">=</xliff:g>ቴህራን"</item>
<item msgid="8629402941285674273">"ተ<xliff:g id="SEPARATOR">=</xliff:g>ቴልቪቭ"</item>
- <item msgid="8499164674454654525">"ተ<xliff:g id="SEPARATOR">=</xliff:g>ቶኪዮ"</item>
+ <item msgid="76330681636547168">"ተ<xliff:g id="SEPARATOR">=</xliff:g>ቶኪዮ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"አ<xliff:g id="SEPARATOR">=</xliff:g>ኡላንባታር"</item>
<item msgid="2028626988021468640">"በ<xliff:g id="SEPARATOR">=</xliff:g>ቤርሙዳ"</item>
<item msgid="4527109966513690429">"ከ<xliff:g id="SEPARATOR">=</xliff:g>ካናሪ"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"ረ<xliff:g id="SEPARATOR">=</xliff:g>ሬኖ"</item>
<item msgid="9155068631060038769">"በ<xliff:g id="SEPARATOR">=</xliff:g>ብላክ ሮክ ሲቲ"</item>
<item msgid="8498761319928979900">"ደ<xliff:g id="SEPARATOR">=</xliff:g>ዶሃ"</item>
- <item msgid="8307897251088048641">"በ<xliff:g id="SEPARATOR">=</xliff:g>ቤጂንግ"</item>
+ <item msgid="5327010922199714808">"በ<xliff:g id="SEPARATOR">=</xliff:g>ቤጂንግ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"መ<xliff:g id="SEPARATOR">=</xliff:g>ሙምባይ"</item>
<item msgid="6668274273067049125">"ደ<xliff:g id="SEPARATOR">=</xliff:g>ዴልሂ"</item>
- <item msgid="2933410189478233292">"አ<xliff:g id="SEPARATOR">=</xliff:g>ኦሳካ"</item>
+ <item msgid="7199039603593847813">"አ<xliff:g id="SEPARATOR">=</xliff:g>ኦሳካ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ለ<xliff:g id="SEPARATOR">=</xliff:g>ላሆር"</item>
<item msgid="1448378291805481500">"ሰ<xliff:g id="SEPARATOR">=</xliff:g>ሰነዓ"</item>
<item msgid="5233119846682408301">"በ<xliff:g id="SEPARATOR">=</xliff:g>ባርሴሎና"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"ከ<xliff:g id="SEPARATOR">=</xliff:g>ካምብሪጅ"</item>
<item msgid="759409010285366934">"ከ<xliff:g id="SEPARATOR">=</xliff:g>ኪርክላንድ"</item>
<item msgid="6308007059287569663">"መ<xliff:g id="SEPARATOR">=</xliff:g>ማዲሰን"</item>
- <item msgid="6971636434858330021">"ገ<xliff:g id="SEPARATOR">=</xliff:g>ጓንግንዡ"</item>
+ <item msgid="2077617905582224600">"ገ<xliff:g id="SEPARATOR">=</xliff:g>ጓንግንዡ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"ሀ<xliff:g id="SEPARATOR">=</xliff:g>ሃይደራባድ"</item>
<item msgid="3032295682584784261">"ረ<xliff:g id="SEPARATOR">=</xliff:g>ሬስተን"</item>
<item msgid="7722837296297332268">"በ<xliff:g id="SEPARATOR">=</xliff:g>ቤሎ ሆሪዞንቴ"</item>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 5610f12..5bf749f 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"ሰዓትአሳይ"</string>
<string name="hide_clock" msgid="3217727306480505694">"ሰዓት ደብቅ"</string>
<string name="label" msgid="162189613902857319">"መለያ ስም"</string>
+ <string name="on_switch" msgid="2297966258029227449">"በርቷል"</string>
+ <string name="off_switch" msgid="3381070073851148013">"ጠፍቷል"</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="6506982899651975645">"የማንቂያ ደውል ቅላጼ"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"ብጁ የጥሪ ቅላጼ"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"ሰዓት ቆጣሪው ጊዜው አልፏል"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"ፀጥ ያለ"</string>
<string name="ringtone" msgid="9110746249688559579">"የደወል ቅላጼ"</string>
<string name="time" msgid="8067216534232296518">"ጊዜ"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"ነገ"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"እስከ <xliff:g id="TIME">%s</xliff:g> ድረስ በማሸለብ ላይ"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"በቅርብ ጊዜ የሚሆን ማንቂያ"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"የእርስዎ ያልታየ ማንቂያ ተሰርዟል"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"ከአንድ ደቂቃ በታች ይቀራል"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> ይቀራል"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> ይቀራል"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ይቀራል"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"ከአንድ ደቂቃ በታች ይቀራል"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ይቀራል"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"ቀሪ"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"ቀሪ"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"ማንቂያ ከአሁን ወዲያ ከ1 ደቂቃ በታች የተዘጋጀ ነው፡፡"</item>
<item msgid="6002066367368421848">" ማንቂያ ከአሁን ጀምሮ ለ<xliff:g id="DAYS">%1$s</xliff:g> የተዘጋጀ ነው።"</item>
@@ -101,6 +104,10 @@
<item quantity="one">ደቂቃዎች</item>
<item quantity="other">ደቂቃዎች</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"ቀስ በቀስ ድምጽ ጨምር"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"ጠፍቷል"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> ሰከንዶች"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"ስከንዶች"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"ጸጥታ ከዚህ በኋላ፦"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> ደቂቃዎች</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"አድህር"</string>
<string name="delete" msgid="5732434972457000541">"ሰርዝ"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"የማንቂያ ድምፅ መጠን"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"ፀጥታ"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"ፀጥ ያለ"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"ያልታወቀ"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"ማንቂያ አሸልብ ወይም አሰናብት።"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g>(ቆይቷል)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"ማንቂያ ለ<xliff:g id="TIME">%s</xliff:g> ተዘጋጅቷል።ይቅር ለማለት ይምረጡ።"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"የስልክ ጥሪ ድምፅ በመስቀል ላይ...."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"ድምጽ መልሶ የማጫወት አገልግሎት በሰዓት ውስጥ ለተዘጋጁ የሰዓት ቆጣሪዎች።"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"የማንቂያ ደወልአዘጋጅ"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"ማንቂያ"</string>
<string name="menu_timer" msgid="6459070074762877114">"ሰዓት ቆጣሪ"</string>
<string name="menu_clock" msgid="5612760670606829805">"ሰዓት"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"በስም ደርድር"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"የተመረጡ ከተማዎች"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"ከቆመብት ቀጥል"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"ጀምር"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"አቁም"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ዙር"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"ዳግም አስጀምር"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"ጀምር"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"ለአፍታ አቁም"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"ዙር"</string>
<string name="sw_share_button" msgid="4478648110382859382">"አጋራ"</string>
<string name="hours_label" msgid="3393478155635368097">"ሰ"</string>
<string name="minutes_label" msgid="3568098128251438588">"ደ"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"የእኔ ሰዓት <xliff:g id="TIME">%s</xliff:g> ነው"</string>
<string name="sw_share_laps" msgid="614390674795945007">"የዙር ሰዓት፦"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"ዙር <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ሰዓቶች</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ሰዓቶች</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 ደቂቃ አክል"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 ደቂቃ ያክሉ"</string>
<string name="timer_stop" msgid="3361154678667736722">"አቁም"</string>
- <string name="timer_done" msgid="2375990511982914051">"ተጠናቅቋል"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"ሁሉንም ሰዓት ቆጣሪዎች አቁም"</string>
<string name="timer_reset" msgid="7848424809190171640">"ዳግም አስጀምር"</string>
<string name="timer_cancel" msgid="3572868404230815644">"ይቅር"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"የሰዓት ቆጣሪ ተሰርዟል"</string>
<string name="timer_times_up" msgid="9190440395938519009">"ጊዜው አብቅቷል"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ሰዓት ቆጣሪዎች ጊዜያቸው አልፎባቸዋል"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"የሰዓት ቆጣሪ"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"4 ጊዜ መቁጠሪያዎች ቢበዛ"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"ለአፍታ አቁም"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"ሁሉንም ሰዓት ቆጣሪዎች ዳግም አስጀምር"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"ፈጣን ነዎት።"</item>
<item msgid="6332879039890727169">"በልፋትዎ ውጤት ይደሰቱ።"</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"ከተማዎች"</string>
<string name="clock_settings" msgid="8317286807280600391">"ሰዓት"</string>
<string name="clock_style" msgid="2265011060429742344">"ቅጥ"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"ቀን እና ሰዓት ለውጥ"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"አናሎግ"</item>
<item msgid="8483930821046925592">"ዲጂታል"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ምልክት ተደርጎበታል"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> ምልክቱ ተነስቷል"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"የማርሻል ደሴቶች"</item>
<item msgid="4196408495909011020">"የሚድዌይ ደሴት"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"ጃካርታ"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"ማንቂያዎች"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"የሩጫ ሰዓት አገልግሎት ማሳወቂያውን ሊያሂድ ነው።"</string>
- <string name="swn_stopped" msgid="783124901663086172">"ቆሟል"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"ከጊዜ ቆጣሪ ማሳወቂያዎች እርምጃዎችን ያስኬዳል።"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"ከቆጥሮ የሚቆም ሰዓት ማሳወቂያዎች እርምጃዎችን ያስኬዳል።"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"ለአፍታ ቆሟል"</string>
<string name="description_direction_right" msgid="5709209043267548985">"ለማሰናበት ወደ ቀኝ ያንሸራትቱ"</string>
<string name="description_direction_left" msgid="7448141043674998679">"ለማሸለብ ወደ ግራ ያንሸራትቱ"</string>
<string name="description_direction_both" msgid="1841309486023845685">"ለማሸለብ ወደ ቀኝ ወይም ለማሰናበት ወደ ግራ ጠረግ ያድርጉ"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"የሰዓት ቆጣሪዎች"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"የሰዓት ቆጣሪ የጥሪ ቅላጼ"</string>
<string name="timer_stopped" msgid="2730331837832462008">"የሰዓት ቆጣሪ ቆሟል"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> የሰዓት ቆጣሪዎች ቆመዋል"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"ጊዜ ቆጣሪ ለአፍታ ቆሟል"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> ሰዓት ቆጣሪዎች ለአፍታ ቆመዋል"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"የሰዓት ቆጣሪዎችዎን ለማየት ይንኩ"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ሰዓት ቆጣሪዎች"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"ቀጣዩ የሰዓት ቆጣሪ፦ <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"ማንቂያ የለም"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"ምንም ማንቂያ አልተዘጋጀም"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ምንም በቅርብ ጊዜ የሚሆኑ ማንቂያዎች የሉም"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"ሰ:ደደ a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"ሰ:ደደ"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE፣ ሰ:ደደ a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE፣ k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"ልክ ያልሆነ ሰዓት <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> ላይ ማንቂያ ደወል የለም"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"ምንም መርሐግብር የተያዘላቸው ማንቂያ ደወሎች የሉም"</string>
<string name="no_label_specified" msgid="2008482054428460626">"ምንም መለያ አልተገለጸም"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"መለያው ያላቸው ምንም ማንቂያዎች የሉም"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"የሩጫ ሰዓት አስቀድሞ እየሰራ ነው"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"የሩጫ ሰዓት እየሰራ አይደለም"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"የሩጫ ሰዓት እየሮጠ ስለሆነ ዳግም ማስጀመር አይቻልም"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"የሩጫ ሰዓት ቆሟል"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"የሩጫ ሰዓት ለአፍታ ቆሟል"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"የሩጫ ሰዓት ዳግም ማስጀመር"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"የሩጫ ሰዓት የመዞሪያ ሰዓቱን ይዟል"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"የሩጫ ሰዓት ተጀምሯል"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"ለዚህ ጊዜ ምንም ማንቂያ ደወል መርሐግብር አልተያዘለትም"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> ማንቂያ ደወል ተሰናብቷል"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"ማንቂያ ደወል ለ<xliff:g id="ALARM_TIME">%s</xliff:g> ተዘጋጅቷል"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"ምንም ሰዓት ቆጣሪ አልተዘጋጀም"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"ሰዓት ቆጣሪ ተሰርዟል"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"ሰዓት ቆጣሪ አስቀድሞ እየሰራ ነው"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"ጥያቄዎን ማጠናቀቅ አልተቻለም፣ በርካታ ሰዓት ቆጣሪዎች ይገኛሉ"</string>
- <string name="timer_started" msgid="6715582052946641641">"ሰዓት ቆጣሪ ተጀምሯል"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"ምንም ሰዓት ቆጣሪዎች የሉም"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"ከአንድ በላይ የሰዓት ቆጣሪ አለ"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"ሰዓት ቆጣሪው ተወግዷል።"</string>
<string name="timer_created" msgid="4381027137335885547">"የሰዓት ቆጣሪ ተፈጥሯል"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"ልክ ያልሆነ የሰዓት ቆጣሪ ርዝመት"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"ሰዓት ቆጣሪ ዳግም ተዘጋጅቷል"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"ሰዓት ቆጣሪ አሁንም እየሰራ ስለሆነ ዳግም ሊዘጋጅ አይችልም። ዳግም ለማዘጋጀት ሰዓት ቆጣሪን ያስቁሙት።"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"ሰዓት ቆጣሪ አስቀድሞ ቆሟል"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"ሰዓት ቆጣሪ ተሰርዟል"</string>
+ <string name="timer_started" msgid="6715582052946641641">"ሰዓት ቆጣሪ ተጀምሯል"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"ልክ ያልሆነ የሰዓት ቆጣሪ ርዝመት"</string>
<string name="no_city_selected" msgid="1007596865203283741">"ምንም ከተማ አልተመረጠም"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"የጠቀሱት ከተማ አይገኝም"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"ይሄ ከተማ አስቀድሞ ታክሏል"</string>
diff --git a/res/values-ar/array.xml b/res/values-ar/array.xml
index 2ec8bda..f04897e 100644
--- a/res/values-ar/array.xml
+++ b/res/values-ar/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>فورتاليزا"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>غراند ترك"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>غرينادا"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>غواتيمالا"</item>
+ <item msgid="6216160110733510854">"غ<xliff:g id="SEPARATOR">=</xliff:g>مدينة غواتيمالا"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>غيانا"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>هاليفاكس"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>هافانا"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>تورونتو"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>فانكوفر"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>وينيبيغ"</item>
- <item msgid="1132634022412399582">"ا<xliff:g id="SEPARATOR">=</xliff:g>القطب الجنوبي"</item>
+ <item msgid="498429228419399474">"ا<xliff:g id="SEPARATOR">=</xliff:g>القطب الجنوبي<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>لونغياربين"</item>
<item msgid="3784788073896028355">"ا<xliff:g id="SEPARATOR">=</xliff:g>ألماتي"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>عمّان"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>غزة"</item>
<item msgid="2359068282340162319">"ا<xliff:g id="SEPARATOR">=</xliff:g>الخليل"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>هو تشي منه"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>هونغ كونغ"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>هونغ كونغ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"ا<xliff:g id="SEPARATOR">=</xliff:g>إسطنبول"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>جاكرتا"</item>
<item msgid="8956406398692698126">"ا<xliff:g id="SEPARATOR">=</xliff:g>القدس"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>مانيلا"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>مسقط"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>بنوم بنه"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>بيونغ يانغ"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>بيونغ يانغ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>قطر"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>رانغون"</item>
<item msgid="4460370766685855731">"ا<xliff:g id="SEPARATOR">=</xliff:g>الرياض"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>سايغون"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>سيول"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>شنغهاي"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>شنغهاي<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>سنغافورة"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>تايبيه"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>تايبيه<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>طهران"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>تل أبيب"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>طوكيو"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>طوكيو<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"ا<xliff:g id="SEPARATOR">=</xliff:g>أولان باتور"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>برمودا"</item>
<item msgid="4527109966513690429">"ا<xliff:g id="SEPARATOR">=</xliff:g>الكناري"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>رينو"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>بلاك روك سيتي"</item>
<item msgid="8498761319928979900">"ا<xliff:g id="SEPARATOR">=</xliff:g>الدوحة"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>بكين"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>بكين<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>مومباي"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>دلهي"</item>
- <item msgid="2933410189478233292">"ا<xliff:g id="SEPARATOR">=</xliff:g>أوساكا"</item>
+ <item msgid="7199039603593847813">"ا<xliff:g id="SEPARATOR">=</xliff:g>أوساكا<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>لاهور"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>صنعاء"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>برشلونة"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>كامبريدج"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>كيركلاند"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>ماديسون"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>كوانغتشو"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>كوانغتشو<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>حيدر آباد"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>ريستون"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>بيلو هوريزونتي"</item>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 891751a..c70e8bd 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"إظهار الساعة"</string>
<string name="hide_clock" msgid="3217727306480505694">"إخفاء الساعة"</string>
<string name="label" msgid="162189613902857319">"تصنيف"</string>
+ <string name="on_switch" msgid="2297966258029227449">"تشغيل"</string>
+ <string name="off_switch" msgid="3381070073851148013">"إيقاف"</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="6506982899651975645">"نغمة رنين المنبه"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"نغمة رنين مخصصة"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"انتهت صلاحية الموقِّت"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"صامت"</string>
<string name="ringtone" msgid="9110746249688559579">"نغمة الرنين"</string>
<string name="time" msgid="8067216534232296518">"الوقت"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"غدًا"</string>
@@ -66,12 +69,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"غفوة إلى <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"التنبيه القادم"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"تم حذف التنبيه المفقود"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"يتبقى أقل من دقيقة"</item>
- <item msgid="83197792732433351">"تتبقى <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"تتبقى <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"تتبقى <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"يتبقى أقل من دقيقة"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"تتبقى <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"تتبقى"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"تتبقى"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"تم ضبط المنبه على أقل من دقيقة واحدة من الآن."</item>
<item msgid="6002066367368421848">"تم ضبط المنبه على <xliff:g id="DAYS">%1$s</xliff:g> من الآن."</item>
@@ -129,6 +132,10 @@
<item quantity="other">من الدقائق</item>
<item quantity="one">دقيقة واحدة</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"رفع مستوى الصوت تدريجيًا"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"إيقاف"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> ثانية"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"ثوانٍ"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"صامت بعد"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="zero"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> من الدقائق</item>
@@ -158,7 +165,8 @@
<string name="revert" msgid="9100911171235162926">"تراجع"</string>
<string name="delete" msgid="5732434972457000541">"حذف"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"مستوى صوت المنبّه"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"صامت"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"صامت"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"غير معروف"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"غفوة أو تجاهل المنبه."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (غفوة)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"تم ضبط المنبه على <xliff:g id="TIME">%s</xliff:g>. المس للإلغاء."</string>
@@ -183,8 +191,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"جارٍ تحميل نغمة الرنين…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"خدمة تشغيل الصوت للمؤقتات التي تم تعيينها في الساعة."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"ضبط المنبه"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"المنبه"</string>
<string name="menu_timer" msgid="6459070074762877114">"موقت"</string>
<string name="menu_clock" msgid="5612760670606829805">"الساعة"</string>
@@ -199,10 +205,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"تصنيف بحسب الاسم"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"المدن المحددة"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"استئناف"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"بدء"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"إيقاف"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"المختبر"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"إعادة ضبط"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"بدء"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"إيقاف مؤقت"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"المختبر"</string>
<string name="sw_share_button" msgid="4478648110382859382">"مشاركة"</string>
<string name="hours_label" msgid="3393478155635368097">"س"</string>
<string name="minutes_label" msgid="3568098128251438588">"د"</string>
@@ -214,10 +220,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"وقتي هو <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"مرات الدوران:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"معمل <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"العدد <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"العدد <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="zero"><xliff:g id="NUMBER">%d</xliff:g> hours</item>
<item quantity="two">ساعتان (<xliff:g id="NUMBER">%d</xliff:g>)</item>
@@ -249,12 +251,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"إضافة دقيقة واحدة"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"إضافة دقيقة واحدة"</string>
<string name="timer_stop" msgid="3361154678667736722">"إيقاف"</string>
- <string name="timer_done" msgid="2375990511982914051">"تم"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"إيقاف كل الموقِّتات"</string>
<string name="timer_reset" msgid="7848424809190171640">"إعادة تعيين"</string>
<string name="timer_cancel" msgid="3572868404230815644">"إلغاء"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"تم إلغاء الموقِّت"</string>
<string name="timer_times_up" msgid="9190440395938519009">"انتهى الوقت"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"انتهت صلاحية <xliff:g id="NUM_TIMERS">%d</xliff:g> من الموقِّتات"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"مؤقت"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"يبلغ الحد الأقصى 4 موقّتات"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"إيقاف مؤقت"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"إعادة ضبط الموقتات"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"يمكنك إجراء كل شيء بسرعة البرق."</item>
<item msgid="6332879039890727169">"استمتع بحصاد ثمار تعبك."</item>
@@ -271,6 +277,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"مدن"</string>
<string name="clock_settings" msgid="8317286807280600391">"الساعة"</string>
<string name="clock_style" msgid="2265011060429742344">"النمط"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"تغيير التاريخ والوقت"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"تناظري"</item>
<item msgid="8483930821046925592">"رقمي"</item>
@@ -285,6 +292,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"تم تحديد <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"تم إلغاء تحديد <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"جزر مارشال"</item>
<item msgid="4196408495909011020">"جزيرة ميدواي"</item>
@@ -373,13 +382,17 @@
<item msgid="5176858645450908751">"جاكارتا"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"التنبيهات"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"خدمة ساعة التوقيف لتشغيل التنبيه"</string>
- <string name="swn_stopped" msgid="783124901663086172">"تم الإيقاف"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"لمعالجة الإجراءات من إشعارات الموقِّت."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"لمعالجة الإجراءات من إشعارات ساعة الإيقاف."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"تم الإيقاف مؤقتًا"</string>
<string name="description_direction_right" msgid="5709209043267548985">"مرر بسرعة إلى اليسار للإلغاء"</string>
<string name="description_direction_left" msgid="7448141043674998679">"مرر بسرعة إلى اليمين لإجراء غفوة"</string>
<string name="description_direction_both" msgid="1841309486023845685">"مرر يسارًا للغفوة أو يمينًا للتجاهل"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"الموقتات"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"نغمة رنين الموقِّت"</string>
<string name="timer_stopped" msgid="2730331837832462008">"تم إيقاف الموقت"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"تم إيقاف <xliff:g id="NUMBER">%d</xliff:g> من الموقتات"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"تم إيقاف الموقِّت مؤقتًا"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"تم إيقاف <xliff:g id="NUMBER">%d</xliff:g> موقِّتات مؤقتُا"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"المس للاطلاع على الموقتات"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> من الموقتات"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"الموقت التالي: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -409,35 +422,27 @@
<string name="no_alarms" msgid="6429431324842022917">"ليست هناك اشعارات"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"لم يتم تعيين تنبيهات"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ليست هناك اشعارات مقبلة"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"س:دد ص"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"ك:دد"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE، س:دد ص"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE، س:دد"</string>
<string name="invalid_time" msgid="2782334750243998633">"الوقت غير صالح <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"لم يتم تعيين منبه للوقت <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"لم يتم تعيين أي منبه"</string>
<string name="no_label_specified" msgid="2008482054428460626">"لم يتم تحديد تصنيف"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"لا توجد منبهات تتضمن التصنيف"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"ساعة الإيقاف قيد التشغيل حاليًا"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"ساعة الإيقاف ليست قيد التشغيل"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"تتعذر إعادة ضبط ساعة التوقيف لأنها قيد العمل"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"تم إيقاف ساعة التوقيف"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"تم إيقاف ساعة التوقيف مؤقتًا"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"تمت إعادة ضبط ساعة التوقيف"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"تمت إضافة دورة إلى ساعة التوقيف"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"تم بدء ساعة التوقيف"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"لم يتم تعيين منبه لهذا الوقت"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"تم تجاهل المنبه <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"تم ضبط المنبه على <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"لم يتم تعيين أي موَقِّت"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"تم حذف الموقِّت"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"الموقِّت قيد التشغيل حاليًا"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"تعذر إكمال طلبك، هناك عدة مؤقتات متاحة"</string>
- <string name="timer_started" msgid="6715582052946641641">"تم بدء الموقّت"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"ليس هناك أي موقِّت"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"هناك أكثر من موقِّت واحد"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"تمت إزالة الموقِّت."</string>
<string name="timer_created" msgid="4381027137335885547">"تم إنشاء الموقت"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"مدة الموقت غير صالحة"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"تمت إعادة تعيين الموقِّت"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"لا يمكن إعادة تعيين الموقِّت لأنه لا يزال قيد التشغيل. عليك إيقاف الموقِّت لإعادة تعيينه."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"تم إيقاف الموقِّت من قبل"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"تم حذف الموقِّت"</string>
+ <string name="timer_started" msgid="6715582052946641641">"تم بدء الموقّت"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"مدة الموقت غير صالحة"</string>
<string name="no_city_selected" msgid="1007596865203283741">"لم يتم تحديد أية مدينة"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"المدينة التي حددتها غير متاحة"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"تمت إضافة هذه المدينة من قبل"</string>
diff --git a/res/values-az-rAZ/array.xml b/res/values-az-rAZ/array.xml
index 5596d17..e11df18 100644
--- a/res/values-az-rAZ/array.xml
+++ b/res/values-az-rAZ/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qrand Türk"</item>
<item msgid="2103759276235503048">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qrenada"</item>
- <item msgid="1490069759176391533">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qvatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Qvatemala Şəhəri"</item>
<item msgid="525959305652046261">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qayana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifaks"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vankuver"</item>
<item msgid="8935386104773857399">"V<xliff:g id="SEPARATOR">=</xliff:g>Vinnipeq"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Cənub Qütbü"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Cənub Qütbü<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Lonqyerbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Alma-ata"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qəzza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Hoşimin"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Honq Konq"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Honq Konq<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"İ<xliff:g id="SEPARATOR">=</xliff:g>İstanbul"</item>
<item msgid="758800913783999425">"C<xliff:g id="SEPARATOR">=</xliff:g>Cakarta"</item>
<item msgid="8956406398692698126">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qüds"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Maskat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Pnompen"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pxenyan"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pxenyan<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qətər"</item>
<item msgid="1667243110545095146">"Y<xliff:g id="SEPARATOR">=</xliff:g>Yanqon"</item>
<item msgid="4460370766685855731">"Ə<xliff:g id="SEPARATOR">=</xliff:g>Ər-Riyad"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Sayqon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"Ş<xliff:g id="SEPARATOR">=</xliff:g>Şanxay"</item>
+ <item msgid="3814881931186962624">"Ş<xliff:g id="SEPARATOR">=</xliff:g>Şanxay<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Sinqapur"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taybey"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taybey<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Tehran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Əviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulan-bator"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanar"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahor"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barselona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"K<xliff:g id="SEPARATOR">=</xliff:g>Kembric"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"Q<xliff:g id="SEPARATOR">=</xliff:g>Quançjou"</item>
+ <item msgid="2077617905582224600">"Q<xliff:g id="SEPARATOR">=</xliff:g>Quançjou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Heydərabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-az-rAZ/strings.xml b/res/values-az-rAZ/strings.xml
index 7321752..5352482 100644
--- a/res/values-az-rAZ/strings.xml
+++ b/res/values-az-rAZ/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Saatı göstər"</string>
<string name="hide_clock" msgid="3217727306480505694">"Saatı gizlə"</string>
<string name="label" msgid="162189613902857319">"Etiket"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Aktiv"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Deaktiv"</string>
<string name="default_label" msgid="5590025289805630372">"Siqnal"</string>
<string name="set_alarm" msgid="9148359866152726808">"Siqnal qur"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrasiya etdir"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Təkrarla"</string>
<string name="alert" msgid="6506982899651975645">"Siqnalın Zəng səsi"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Fərdi Zəng"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Taymerin Vaxtı Bitdi"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Səssiz"</string>
<string name="ringtone" msgid="9110746249688559579">"Zəng səsi"</string>
<string name="time" msgid="8067216534232296518">"Vaxt"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Sabah"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> qədər təxirə salma"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Gələcək zənglər"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Buraxdığınız zəng silindi"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Bir dəqiqədən az qaldı."</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> qaldı"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> qaldı"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> qaldı"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Bir dəqiqədən az qaldı."</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> qaldı"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"qaldı"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"qaldı"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Siqnalı ən az 1 dəqiqə sonraya qur."</item>
<item msgid="6002066367368421848">"Siqnalı <xliff:g id="DAYS">%1$s</xliff:g> sonraya qur."</item>
@@ -101,6 +104,10 @@
<item quantity="other">dəqiqə</item>
<item quantity="one">dəqiqə</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Tədricən həcmi artırın"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Deaktiv"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> saniyə"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"saniyə"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Sonra susdur"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> dəqiqə</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Qaytar"</string>
<string name="delete" msgid="5732434972457000541">"Sil"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Siqnal səsi"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Səssiz"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Səssiz"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Naməlum"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Siqnalı ertələ və ya kənarlaşdır."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ertələndi)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Siqnal <xliff:g id="TIME">%s</xliff:g> üçün qurulub. Ləğv etmək üçün toxunun."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Zəng səsi yüklənir..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Saatda qurulmuş vaxtölçənlər üçün playback səs xidməti."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Siqnal qur"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Zəng"</string>
<string name="menu_timer" msgid="6459070074762877114">"Vaxtölçən"</string>
<string name="menu_clock" msgid="5612760670606829805">"Saat"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Ad üzrə sırala"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Seçilmiş şəhərlər"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Davam et"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Başlat"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Dayandır"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Dövrə"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Sıfırla"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Başlat"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Dövrə"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Paylaş"</string>
<string name="hours_label" msgid="3393478155635368097">"st"</string>
<string name="minutes_label" msgid="3568098128251438588">"dq"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Mənim vaxtım <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Dövrə sayısı:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Dövrə <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> saat</item>
<item quantity="one">1 saat</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 Dəqiqə Əlavə et"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 dəqiqə əlavə et"</string>
<string name="timer_stop" msgid="3361154678667736722">"Dayandır"</string>
- <string name="timer_done" msgid="2375990511982914051">"Hazırdır"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Bütün taymerləri durdurun"</string>
<string name="timer_reset" msgid="7848424809190171640">"Sıfırla"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Ləğv et"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Taymer ləğv edildi"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Vaxt bitdi"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> taymerlərin vaxtı keçib"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Vaxtölçən"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Maksimum 4 taymer"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Durdurun"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Bütün taymerləri sıfırlayın"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Dəhşət sürətlisiniz."</item>
<item msgid="6332879039890727169">"Əməyinizin bəhrəsinin dadını çıxardın."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Şəhərlər"</string>
<string name="clock_settings" msgid="8317286807280600391">"Saat"</string>
<string name="clock_style" msgid="2265011060429742344">"Üslub"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Tarix və vaxtı dəyişin"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analoq"</item>
<item msgid="8483930821046925592">"Rəqəmsal"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">": 00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">": 30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> yoxlandı"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> yoxlanmadı"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marşall Adaları"</item>
<item msgid="4196408495909011020">"Miduey adası"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Cakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Siqnallar"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Bildirişi çalışdırmaq üçün saniyəölçən xidməti."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Dayandırıldı"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Taymer bildirişlərindən fəaliyyətlər icra olunur."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Saniyəölçən bildirişlərindən fəaliyyətlər icra olunur."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Durduruldu"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Kənarlaşdırmaq üçün sağa sürüşdürün"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Mürgü üçün sola sürüşdürün"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Mürgü rejimi üçün sola, və ya ləğv etmək üçün sağa sürüşdürün"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Vaxtölçən"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Taymer zəngi"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Vaxtölçən dayandırıldı"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> vaxtölçən dayandırıldı"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Taymer durdurulub"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> taymer durdurulub"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Vaxtölçənlərinizi görmək üçün toxunun"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> vaxtölçən"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Sonrakı vaxtölçən: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Zəng yoxdur"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Heç bir alarm ayarlanmayıb"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"GƏLƏCƏK ZƏNGLƏR YOXDUR"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Yanlış vaxt <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> vaxtına siqnal yoxdur"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Planlaşdırılmış siqnal yoxdur"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Heç bir etiket təyin edilməyib."</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Etiketə aid heç bir alarm yoxdur"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Saniyəölçən artıq işə salınıb"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Saniyəölçən işə salınmayıb"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Saniyəölçən sıfırlana bilməz çünki, hazırda çalışır."</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Saniyəölçən dayandırıldı"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Saniyəölçən durduruldu"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Saniyəölçən sıfırlandı"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Saniyəölçən hissələrə ayrıldı"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Saniyəölçən başladıldı"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Bu vaxt üçün heç bir siqnal təyin olunmayıb"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> siqnal deaktiv edildi"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm <xliff:g id="ALARM_TIME">%s</xliff:g> üçün qurulub"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Heç bir vaxtölçən ayarlanmayıb"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Vaxtölçən silindi"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Vaxtölçən artıq işə salınıb"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Sorğunuzu tamamlamaq olmur, bir neçə vaxtölçən aktivdir"</string>
- <string name="timer_started" msgid="6715582052946641641">"Vaxtölçən başladı"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Heç bir taymer mövcud deyil"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Birdən çox taymer mövcuddur"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Taymer silindi."</string>
<string name="timer_created" msgid="4381027137335885547">"Vaxtölçən yaradıldı"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Yanlış vaxtölçən müddəti"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Vaxtölçən sıfırlandı"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Vaxtölçən sıfırlana bilməz cünki, hələ də çalışmaqdadır. Sıfırlamak üçün vaxtölçəni dayandırın."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Vaxtölçən artıq dayandırılıb"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Vaxtölçən silindi"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Vaxtölçən başladı"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Yanlış vaxtölçən müddəti"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Heç bir şəhər seçilməyib"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Təyin etdiyiniz şəhər əlçatan deyil"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Bu şəhər artıq əlavə edilib"</string>
diff --git a/res/values-b+sr+Latn/array.xml b/res/values-b+sr+Latn/array.xml
deleted file mode 100644
index d0e6651..0000000
--- a/res/values-b+sr+Latn/array.xml
+++ /dev/null
@@ -1,322 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2012 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-array name="cities_names">
- <item msgid="4653806289288974388">"<xliff:g id="SEPARATOR">=</xliff:g>Abidžan"</item>
- <item msgid="4864167603178202155">"<xliff:g id="SEPARATOR">=</xliff:g>Akra"</item>
- <item msgid="6478898553803167749">"<xliff:g id="SEPARATOR">=</xliff:g>Adis Abeba"</item>
- <item msgid="5618029992528436448">"<xliff:g id="SEPARATOR">=</xliff:g>Alžir"</item>
- <item msgid="2906834750114790793">"<xliff:g id="SEPARATOR">=</xliff:g>Blantajer"</item>
- <item msgid="8153571933836629863">"<xliff:g id="SEPARATOR">=</xliff:g>Brazavil"</item>
- <item msgid="3703129580594640833">"<xliff:g id="SEPARATOR">=</xliff:g>Kairo"</item>
- <item msgid="2300915410194647320">"<xliff:g id="SEPARATOR">=</xliff:g>Kazablanka"</item>
- <item msgid="1217039002304887948">"<xliff:g id="SEPARATOR">=</xliff:g>Konakri"</item>
- <item msgid="8775104707806220928">"<xliff:g id="SEPARATOR">=</xliff:g>Dakar"</item>
- <item msgid="5948764589113643811">"<xliff:g id="SEPARATOR">=</xliff:g>Dar es Salam"</item>
- <item msgid="6306254507715416077">"<xliff:g id="SEPARATOR">=</xliff:g>Džibuti"</item>
- <item msgid="4286108029159501866">"<xliff:g id="SEPARATOR">=</xliff:g>Fritaun"</item>
- <item msgid="4514786733035528116">"<xliff:g id="SEPARATOR">=</xliff:g>Gaborone"</item>
- <item msgid="7367496854968219671">"<xliff:g id="SEPARATOR">=</xliff:g>Harare"</item>
- <item msgid="6837746379726020288">"<xliff:g id="SEPARATOR">=</xliff:g>Johanesburg"</item>
- <item msgid="6284185156591171506">"<xliff:g id="SEPARATOR">=</xliff:g>Kampala"</item>
- <item msgid="3299518884693668985">"<xliff:g id="SEPARATOR">=</xliff:g>Kartum"</item>
- <item msgid="4614879508966043969">"<xliff:g id="SEPARATOR">=</xliff:g>Kigali"</item>
- <item msgid="8878437043772547732">"<xliff:g id="SEPARATOR">=</xliff:g>Kinšasa"</item>
- <item msgid="6325601635544067909">"<xliff:g id="SEPARATOR">=</xliff:g>Lagos"</item>
- <item msgid="6094357506290323524">"<xliff:g id="SEPARATOR">=</xliff:g>Maseru"</item>
- <item msgid="7270525814400329098">"<xliff:g id="SEPARATOR">=</xliff:g>Mogadišu"</item>
- <item msgid="353110101402547540">"<xliff:g id="SEPARATOR">=</xliff:g>Najrobi"</item>
- <item msgid="1688121892646984549">"<xliff:g id="SEPARATOR">=</xliff:g>Sao Tome"</item>
- <item msgid="3642219084651687800">"<xliff:g id="SEPARATOR">=</xliff:g>Timbuktu"</item>
- <item msgid="7287513493631179463">"<xliff:g id="SEPARATOR">=</xliff:g>Tripoli"</item>
- <item msgid="5052614613671591560">"<xliff:g id="SEPARATOR">=</xliff:g>Tunis"</item>
- <item msgid="7976303179193839859">"<xliff:g id="SEPARATOR">=</xliff:g>Enkoridž"</item>
- <item msgid="193703779380497120">"<xliff:g id="SEPARATOR">=</xliff:g>Mendoza"</item>
- <item msgid="5448884981082519628">"<xliff:g id="SEPARATOR">=</xliff:g>Aruba"</item>
- <item msgid="1577938273323914773">"<xliff:g id="SEPARATOR">=</xliff:g>Asunsion"</item>
- <item msgid="5617155978105010520">"<xliff:g id="SEPARATOR">=</xliff:g>Barbados"</item>
- <item msgid="3600025702357376322">"<xliff:g id="SEPARATOR">=</xliff:g>Belize"</item>
- <item msgid="2847679817118467051">"<xliff:g id="SEPARATOR">=</xliff:g>Bogota"</item>
- <item msgid="9029003541681282929">"<xliff:g id="SEPARATOR">=</xliff:g>Buenos Ajres"</item>
- <item msgid="2338367960332622522">"<xliff:g id="SEPARATOR">=</xliff:g>Kankun"</item>
- <item msgid="4339797536047170278">"<xliff:g id="SEPARATOR">=</xliff:g>Karakas"</item>
- <item msgid="9199080438977757863">"<xliff:g id="SEPARATOR">=</xliff:g>Kajmanska ostrva"</item>
- <item msgid="1993203473281589891">"<xliff:g id="SEPARATOR">=</xliff:g>Čikago"</item>
- <item msgid="7990342776303470263">"<xliff:g id="SEPARATOR">=</xliff:g>Kostarika"</item>
- <item msgid="5676109900908808628">"<xliff:g id="SEPARATOR">=</xliff:g>Kurasao"</item>
- <item msgid="5519120432577564812">"<xliff:g id="SEPARATOR">=</xliff:g>Doson Krik"</item>
- <item msgid="2126228972377380680">"<xliff:g id="SEPARATOR">=</xliff:g>Denver"</item>
- <item msgid="3298410632922319193">"<xliff:g id="SEPARATOR">=</xliff:g>Detroit"</item>
- <item msgid="2819032085688382805">"<xliff:g id="SEPARATOR">=</xliff:g>Dominika"</item>
- <item msgid="6170433208654553821">"<xliff:g id="SEPARATOR">=</xliff:g>Edmonton"</item>
- <item msgid="795461860173291499">"<xliff:g id="SEPARATOR">=</xliff:g>Salvador"</item>
- <item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
- <item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
- <item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Gvatemala"</item>
- <item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Gvajana"</item>
- <item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifaks"</item>
- <item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
- <item msgid="3733555435078090201">"<xliff:g id="SEPARATOR">=</xliff:g>Indijanapolis"</item>
- <item msgid="226982663848410981">"<xliff:g id="SEPARATOR">=</xliff:g>Noks"</item>
- <item msgid="3815293080342229459">"<xliff:g id="SEPARATOR">=</xliff:g>Marengo"</item>
- <item msgid="6594853515451547389">"<xliff:g id="SEPARATOR">=</xliff:g>Pitersburg"</item>
- <item msgid="6091571889213283534">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Siti"</item>
- <item msgid="3089369312058696669">"<xliff:g id="SEPARATOR">=</xliff:g>Vevej"</item>
- <item msgid="1334860422444068943">"<xliff:g id="SEPARATOR">=</xliff:g>Vensen"</item>
- <item msgid="7775105082093691756">"<xliff:g id="SEPARATOR">=</xliff:g>Vinamak"</item>
- <item msgid="4043335541899184547">"<xliff:g id="SEPARATOR">=</xliff:g>Kingston"</item>
- <item msgid="1063757593477259280">"<xliff:g id="SEPARATOR">=</xliff:g>La Paz"</item>
- <item msgid="349901732062388869">"<xliff:g id="SEPARATOR">=</xliff:g>Lima"</item>
- <item msgid="4977592519316837842">"<xliff:g id="SEPARATOR">=</xliff:g>Los Anđeles"</item>
- <item msgid="7713051790509638572">"<xliff:g id="SEPARATOR">=</xliff:g>Luivil"</item>
- <item msgid="8460620935898405225">"<xliff:g id="SEPARATOR">=</xliff:g>Managva"</item>
- <item msgid="8328345293081464192">"<xliff:g id="SEPARATOR">=</xliff:g>Martinik"</item>
- <item msgid="8010357327448619637">"<xliff:g id="SEPARATOR">=</xliff:g>Mendoza"</item>
- <item msgid="2046777213916219253">"<xliff:g id="SEPARATOR">=</xliff:g>Metlakatla"</item>
- <item msgid="2227885609632709258">"<xliff:g id="SEPARATOR">=</xliff:g>Meksiko Siti"</item>
- <item msgid="9089629663998569289">"<xliff:g id="SEPARATOR">=</xliff:g>Monterej"</item>
- <item msgid="2782276175306930748">"<xliff:g id="SEPARATOR">=</xliff:g>Montevideo"</item>
- <item msgid="4942386959622269480">"<xliff:g id="SEPARATOR">=</xliff:g>Montreal"</item>
- <item msgid="3068203952968918165">"<xliff:g id="SEPARATOR">=</xliff:g>Nasau"</item>
- <item msgid="4234515454127289962">"<xliff:g id="SEPARATOR">=</xliff:g>Njujork"</item>
- <item msgid="1660551302087304308">"<xliff:g id="SEPARATOR">=</xliff:g>Bjula"</item>
- <item msgid="415823390775449071">"<xliff:g id="SEPARATOR">=</xliff:g>Senter"</item>
- <item msgid="6644186958433380884">"<xliff:g id="SEPARATOR">=</xliff:g>Nju Sejlem"</item>
- <item msgid="6408587617047971798">"<xliff:g id="SEPARATOR">=</xliff:g>Panama"</item>
- <item msgid="5576899364199447991">"<xliff:g id="SEPARATOR">=</xliff:g>Feniks"</item>
- <item msgid="5541266909095409447">"<xliff:g id="SEPARATOR">=</xliff:g>Port ov Spejn"</item>
- <item msgid="6417519313622785932">"<xliff:g id="SEPARATOR">=</xliff:g>Port o Prens"</item>
- <item msgid="2078589249210571366">"<xliff:g id="SEPARATOR">=</xliff:g>Portoriko"</item>
- <item msgid="8522030474373927681">"<xliff:g id="SEPARATOR">=</xliff:g>Santo Domingo"</item>
- <item msgid="4763853453317431594">"<xliff:g id="SEPARATOR">=</xliff:g>Sao Paulo"</item>
- <item msgid="2713153284784311646">"<xliff:g id="SEPARATOR">=</xliff:g>Sent Džons"</item>
- <item msgid="8252666620333105271">"<xliff:g id="SEPARATOR">=</xliff:g>Sent Kits"</item>
- <item msgid="4851597775036027515">"<xliff:g id="SEPARATOR">=</xliff:g>Sveta Lucija"</item>
- <item msgid="2395485473100271503">"<xliff:g id="SEPARATOR">=</xliff:g>Sent Tomas"</item>
- <item msgid="4148037555658225145">"<xliff:g id="SEPARATOR">=</xliff:g>Tihuana"</item>
- <item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
- <item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vankuver"</item>
- <item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Vinipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Južni pol"</item>
- <item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longjerbjen"</item>
- <item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almati"</item>
- <item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Aman"</item>
- <item msgid="1795426532295280371">"<xliff:g id="SEPARATOR">=</xliff:g>Anadir"</item>
- <item msgid="7194236926158343552">"<xliff:g id="SEPARATOR">=</xliff:g>Aktau"</item>
- <item msgid="4796350130854360870">"<xliff:g id="SEPARATOR">=</xliff:g>Bagdad"</item>
- <item msgid="4020105434451091851">"<xliff:g id="SEPARATOR">=</xliff:g>Bahrein"</item>
- <item msgid="3895868797052686484">"<xliff:g id="SEPARATOR">=</xliff:g>Baku"</item>
- <item msgid="228001522630057957">"<xliff:g id="SEPARATOR">=</xliff:g>Bangkok"</item>
- <item msgid="5555647809114820537">"B<xliff:g id="SEPARATOR">=</xliff:g>Bejrut"</item>
- <item msgid="2960873998178478784">"K<xliff:g id="SEPARATOR">=</xliff:g>Kalkuta"</item>
- <item msgid="8765555959722950691">"<xliff:g id="SEPARATOR">=</xliff:g>Damask"</item>
- <item msgid="4979709428925196546">"<xliff:g id="SEPARATOR">=</xliff:g>Daka"</item>
- <item msgid="310419600200885308">"<xliff:g id="SEPARATOR">=</xliff:g>Dubai"</item>
- <item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
- <item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
- <item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Ši Min"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
- <item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
- <item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Džakarta"</item>
- <item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jerusalim"</item>
- <item msgid="1664426577433326419">"<xliff:g id="SEPARATOR">=</xliff:g>Kabul"</item>
- <item msgid="7700349511508357396">"<xliff:g id="SEPARATOR">=</xliff:g>Karači"</item>
- <item msgid="5273241794521591984">"<xliff:g id="SEPARATOR">=</xliff:g>Katmandu"</item>
- <item msgid="4754850915168634158">"<xliff:g id="SEPARATOR">=</xliff:g>Kuala Lumpur"</item>
- <item msgid="5187849635785055693">"<xliff:g id="SEPARATOR">=</xliff:g>Kuvajt"</item>
- <item msgid="2923385979252179376">"<xliff:g id="SEPARATOR">=</xliff:g>Makao"</item>
- <item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
- <item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Muskat"</item>
- <item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Pnom Pen"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang"</item>
- <item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
- <item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangun"</item>
- <item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Rijad"</item>
- <item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Sajgon"</item>
- <item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Šangaj"</item>
- <item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Tajpej"</item>
- <item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
- <item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
- <item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulan Bator"</item>
- <item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermudi"</item>
- <item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Kanari"</item>
- <item msgid="4886308317040330383">"<xliff:g id="SEPARATOR">=</xliff:g>Zelenortska Ostrva"</item>
- <item msgid="1003307362164178007">"<xliff:g id="SEPARATOR">=</xliff:g>Rejkjavik"</item>
- <item msgid="6742010412815268657">"<xliff:g id="SEPARATOR">=</xliff:g>Stenli"</item>
- <item msgid="5659389449738592757">"<xliff:g id="SEPARATOR">=</xliff:g>Adelejd"</item>
- <item msgid="4567804576346784523">"<xliff:g id="SEPARATOR">=</xliff:g>Brizbejn"</item>
- <item msgid="8730590400362815585">"<xliff:g id="SEPARATOR">=</xliff:g>Kanbera"</item>
- <item msgid="6416990927714140153">"<xliff:g id="SEPARATOR">=</xliff:g>Darvin"</item>
- <item msgid="3073969292696516135">"<xliff:g id="SEPARATOR">=</xliff:g>Melburn"</item>
- <item msgid="1719286228375722176">"<xliff:g id="SEPARATOR">=</xliff:g>Novi Južni Vels"</item>
- <item msgid="3663940748056976266">"<xliff:g id="SEPARATOR">=</xliff:g>Pert"</item>
- <item msgid="3383881736858438153">"<xliff:g id="SEPARATOR">=</xliff:g>Kvinslend"</item>
- <item msgid="971889339240879138">"<xliff:g id="SEPARATOR">=</xliff:g>Sidnej"</item>
- <item msgid="5542803438162180311">"<xliff:g id="SEPARATOR">=</xliff:g>Viktorija"</item>
- <item msgid="11828841481838883">"<xliff:g id="SEPARATOR">=</xliff:g>Njufaundlend"</item>
- <item msgid="1734331918410561807">"<xliff:g id="SEPARATOR">=</xliff:g>Saskačevan"</item>
- <item msgid="9184412695613864979">"<xliff:g id="SEPARATOR">=</xliff:g>Uskršnje ostrvo"</item>
- <item msgid="1014282454239014527">"<xliff:g id="SEPARATOR">=</xliff:g>Amsterdam"</item>
- <item msgid="4928363054269791193">"<xliff:g id="SEPARATOR">=</xliff:g>Andora"</item>
- <item msgid="912290900213826368">"<xliff:g id="SEPARATOR">=</xliff:g>Atina"</item>
- <item msgid="6097000352459209495">"<xliff:g id="SEPARATOR">=</xliff:g>Belfast"</item>
- <item msgid="3285885824311481790">"<xliff:g id="SEPARATOR">=</xliff:g>Beograd"</item>
- <item msgid="911055049821251982">"<xliff:g id="SEPARATOR">=</xliff:g>Berlin"</item>
- <item msgid="9099244516556291111">"<xliff:g id="SEPARATOR">=</xliff:g>Bratislava"</item>
- <item msgid="158977749726480076">"<xliff:g id="SEPARATOR">=</xliff:g>Brisel"</item>
- <item msgid="8875102297676173346">"<xliff:g id="SEPARATOR">=</xliff:g>Bukurešt"</item>
- <item msgid="804451569472542912">"<xliff:g id="SEPARATOR">=</xliff:g>Budimpešta"</item>
- <item msgid="6827506774445509939">"<xliff:g id="SEPARATOR">=</xliff:g>Kišinjev"</item>
- <item msgid="487345893088732797">"<xliff:g id="SEPARATOR">=</xliff:g>Kopenhagen"</item>
- <item msgid="7760953471297773537">"<xliff:g id="SEPARATOR">=</xliff:g>Dablin"</item>
- <item msgid="323414429034825249">"<xliff:g id="SEPARATOR">=</xliff:g>Gibraltar"</item>
- <item msgid="1785566206078328830">"<xliff:g id="SEPARATOR">=</xliff:g>Helsinki"</item>
- <item msgid="5938185647271923359">"<xliff:g id="SEPARATOR">=</xliff:g>Ostrvo Man"</item>
- <item msgid="5974864320735263245">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
- <item msgid="3567775364750772947">"<xliff:g id="SEPARATOR">=</xliff:g>Kijev"</item>
- <item msgid="540344101798867007">"<xliff:g id="SEPARATOR">=</xliff:g>Lisabon"</item>
- <item msgid="5091062403792923657">"<xliff:g id="SEPARATOR">=</xliff:g>London"</item>
- <item msgid="7075006205000490364">"<xliff:g id="SEPARATOR">=</xliff:g>Luksemburg"</item>
- <item msgid="4901781246584739451">"<xliff:g id="SEPARATOR">=</xliff:g>Madrid"</item>
- <item msgid="9047080834315777144">"<xliff:g id="SEPARATOR">=</xliff:g>Malta"</item>
- <item msgid="8200456520732452034">"<xliff:g id="SEPARATOR">=</xliff:g>Minsk"</item>
- <item msgid="5452744619736513383">"<xliff:g id="SEPARATOR">=</xliff:g>Monako"</item>
- <item msgid="3513517408062322298">"<xliff:g id="SEPARATOR">=</xliff:g>Moskva"</item>
- <item msgid="7917103295878081674">"<xliff:g id="SEPARATOR">=</xliff:g>Oslo"</item>
- <item msgid="4245547231693746977">"<xliff:g id="SEPARATOR">=</xliff:g>Pariz"</item>
- <item msgid="3778652900196715557">"<xliff:g id="SEPARATOR">=</xliff:g>Prag"</item>
- <item msgid="1827175423974383675">"<xliff:g id="SEPARATOR">=</xliff:g>Riga"</item>
- <item msgid="2095130417232677930">"<xliff:g id="SEPARATOR">=</xliff:g>Rim"</item>
- <item msgid="7631654618289353520">"<xliff:g id="SEPARATOR">=</xliff:g>San Marino"</item>
- <item msgid="7219835179107610398">"<xliff:g id="SEPARATOR">=</xliff:g>Sarajevo"</item>
- <item msgid="7199868165463282240">"<xliff:g id="SEPARATOR">=</xliff:g>Simferopolj"</item>
- <item msgid="2786395006682246794">"<xliff:g id="SEPARATOR">=</xliff:g>Skoplje"</item>
- <item msgid="4706927178872100023">"<xliff:g id="SEPARATOR">=</xliff:g>Sofija"</item>
- <item msgid="1982417589953195308">"<xliff:g id="SEPARATOR">=</xliff:g>Stokholm"</item>
- <item msgid="1596083919400921960">"<xliff:g id="SEPARATOR">=</xliff:g>Talin"</item>
- <item msgid="3079313598974879114">"<xliff:g id="SEPARATOR">=</xliff:g>Vatikan"</item>
- <item msgid="6516636001856910888">"<xliff:g id="SEPARATOR">=</xliff:g>Beč"</item>
- <item msgid="6377314532157945456">"<xliff:g id="SEPARATOR">=</xliff:g>Vilnijus"</item>
- <item msgid="3427175235616698721">"<xliff:g id="SEPARATOR">=</xliff:g>Varšava"</item>
- <item msgid="8404354243761332922">"<xliff:g id="SEPARATOR">=</xliff:g>Zagreb"</item>
- <item msgid="1457280242717152391">"<xliff:g id="SEPARATOR">=</xliff:g>Cirih"</item>
- <item msgid="1065940089741359291">"<xliff:g id="SEPARATOR">=</xliff:g>Antananarivo"</item>
- <item msgid="5176181880014090003">"<xliff:g id="SEPARATOR">=</xliff:g>Maldivi"</item>
- <item msgid="8281854645557426433">"<xliff:g id="SEPARATOR">=</xliff:g>Mauricijus"</item>
- <item msgid="2686249517389816420">"<xliff:g id="SEPARATOR">=</xliff:g>Okland"</item>
- <item msgid="279925671775807392">"<xliff:g id="SEPARATOR">=</xliff:g>Fidži"</item>
- <item msgid="7971492669765264840">"<xliff:g id="SEPARATOR">=</xliff:g>Guam"</item>
- <item msgid="889371273355762733">"<xliff:g id="SEPARATOR">=</xliff:g>Honolulu"</item>
- <item msgid="5516500578074269817">"<xliff:g id="SEPARATOR">=</xliff:g>Kiritimati"</item>
- <item msgid="2740704911915073056">"<xliff:g id="SEPARATOR">=</xliff:g>Numea"</item>
- <item msgid="8732832728949672807">"<xliff:g id="SEPARATOR">=</xliff:g>Samoa"</item>
- <item msgid="6489500698846864993">"<xliff:g id="SEPARATOR">=</xliff:g>Tahiti"</item>
- <item msgid="3983121625709442324">"<xliff:g id="SEPARATOR">=</xliff:g>Antigva"</item>
- <item msgid="2650510570709806322">"<xliff:g id="SEPARATOR">=</xliff:g>Ostin"</item>
- <item msgid="5257283506227357911">"<xliff:g id="SEPARATOR">=</xliff:g>Boston"</item>
- <item msgid="6326368958641850267">"<xliff:g id="SEPARATOR">=</xliff:g>Kalgari"</item>
- <item msgid="8830116365016232583">"<xliff:g id="SEPARATOR">=</xliff:g>Kolambus"</item>
- <item msgid="6986556538341883811">"<xliff:g id="SEPARATOR">=</xliff:g>Dalas"</item>
- <item msgid="836479352500251902">"<xliff:g id="SEPARATOR">=</xliff:g>Noksvil"</item>
- <item msgid="8495291458467378851">"<xliff:g id="SEPARATOR">=</xliff:g>Memfis"</item>
- <item msgid="2788807207554683122">"<xliff:g id="SEPARATOR">=</xliff:g>Majami"</item>
- <item msgid="3984640407077208471">"<xliff:g id="SEPARATOR">=</xliff:g>Mineapolis"</item>
- <item msgid="6997305266329324161">"<xliff:g id="SEPARATOR">=</xliff:g>Otava"</item>
- <item msgid="5191741145278683016">"<xliff:g id="SEPARATOR">=</xliff:g>Filadelfija"</item>
- <item msgid="5898032730733441936">"<xliff:g id="SEPARATOR">=</xliff:g>Portland"</item>
- <item msgid="9070160716002203069">"<xliff:g id="SEPARATOR">=</xliff:g>San Dijego"</item>
- <item msgid="1829944133410079040">"<xliff:g id="SEPARATOR">=</xliff:g>San Francisko"</item>
- <item msgid="8407905318529692654">"<xliff:g id="SEPARATOR">=</xliff:g>Solt Lejk Siti"</item>
- <item msgid="3091392589347990898">"<xliff:g id="SEPARATOR">=</xliff:g>San Hoze"</item>
- <item msgid="7080627414383807284">"<xliff:g id="SEPARATOR">=</xliff:g>San Salvador"</item>
- <item msgid="3430371213266252049">"<xliff:g id="SEPARATOR">=</xliff:g>Sijetl"</item>
- <item msgid="9177491393818757071">"<xliff:g id="SEPARATOR">=</xliff:g>Sent Luis"</item>
- <item msgid="6234359686676312837">"<xliff:g id="SEPARATOR">=</xliff:g>Vašington"</item>
- <item msgid="4325057056005132331">"<xliff:g id="SEPARATOR">=</xliff:g>Hjuston"</item>
- <item msgid="38148255938075867">"<xliff:g id="SEPARATOR">=</xliff:g>San Antonio"</item>
- <item msgid="3601481860893666763">"<xliff:g id="SEPARATOR">=</xliff:g>Džeksonvil"</item>
- <item msgid="3987471437354665534">"<xliff:g id="SEPARATOR">=</xliff:g>Baltimor"</item>
- <item msgid="3389674262267006887">"<xliff:g id="SEPARATOR">=</xliff:g>Nešvil"</item>
- <item msgid="7521690366448637309">"<xliff:g id="SEPARATOR">=</xliff:g>Milvoki"</item>
- <item msgid="2231069593975740859">"<xliff:g id="SEPARATOR">=</xliff:g>Oklahoma Siti"</item>
- <item msgid="1970008262236914770">"<xliff:g id="SEPARATOR">=</xliff:g>Las Vegas"</item>
- <item msgid="7113811028304266017">"<xliff:g id="SEPARATOR">=</xliff:g>Albukerki"</item>
- <item msgid="6481469458896644678">"<xliff:g id="SEPARATOR">=</xliff:g>Tuson"</item>
- <item msgid="5970857542995467466">"<xliff:g id="SEPARATOR">=</xliff:g>Sakramento"</item>
- <item msgid="1999267306329214429">"<xliff:g id="SEPARATOR">=</xliff:g>Atlanta"</item>
- <item msgid="8761847787537443648">"<xliff:g id="SEPARATOR">=</xliff:g>Klivlend"</item>
- <item msgid="2987455647692324208">"<xliff:g id="SEPARATOR">=</xliff:g>Nju Orleans"</item>
- <item msgid="8104109426412705845">"<xliff:g id="SEPARATOR">=</xliff:g>Tampa"</item>
- <item msgid="1410067233842240795">"<xliff:g id="SEPARATOR">=</xliff:g>Pitsburg"</item>
- <item msgid="3339955740367374442">"<xliff:g id="SEPARATOR">=</xliff:g>Sinsinati"</item>
- <item msgid="6091407424772799978">"<xliff:g id="SEPARATOR">=</xliff:g>Mauntin Vju"</item>
- <item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Rino"</item>
- <item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Blek Rok Siti"</item>
- <item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
- <item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbaj"</item>
- <item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
- <item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahor"</item>
- <item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sana"</item>
- <item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barselona"</item>
- <item msgid="9146746514265554721">"<xliff:g id="SEPARATOR">=</xliff:g>Minhen"</item>
- <item msgid="157866084892734979">"<xliff:g id="SEPARATOR">=</xliff:g>Milano"</item>
- <item msgid="2787346322341414963">"<xliff:g id="SEPARATOR">=</xliff:g>Frankfurt"</item>
- <item msgid="8407511504088696581">"<xliff:g id="SEPARATOR">=</xliff:g>Hanoj"</item>
- <item msgid="5184417944073499453">"<xliff:g id="SEPARATOR">=</xliff:g>Ankara"</item>
- <item msgid="4028784954452197920">"<xliff:g id="SEPARATOR">=</xliff:g>Bangalor"</item>
- <item msgid="190152483600862776">"<xliff:g id="SEPARATOR">=</xliff:g>Brazilija"</item>
- <item msgid="8009516135735104388">"<xliff:g id="SEPARATOR">=</xliff:g>Kejptaun"</item>
- <item msgid="6057191797622953016">"<xliff:g id="SEPARATOR">=</xliff:g>Islamabad"</item>
- <item msgid="2702029416591153210">"<xliff:g id="SEPARATOR">=</xliff:g>Rio de Žaneiro"</item>
- <item msgid="1753927312634708098">"<xliff:g id="SEPARATOR">=</xliff:g>En Arbor"</item>
- <item msgid="4225721108475278979">"<xliff:g id="SEPARATOR">=</xliff:g>Bolder"</item>
- <item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Kembridž"</item>
- <item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
- <item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Medison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangdžou"</item>
- <item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hajderabad"</item>
- <item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
- <item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
- <item msgid="3593516299122577780">"<xliff:g id="SEPARATOR">=</xliff:g>Santjago"</item>
- <item msgid="2293331653589266583">"<xliff:g id="SEPARATOR">=</xliff:g>Monrovija"</item>
- <item msgid="7899128359620301710">"<xliff:g id="SEPARATOR">=</xliff:g>Kolombo"</item>
- <item msgid="5294489752262543829">"<xliff:g id="SEPARATOR">=</xliff:g>Čivava"</item>
- <item msgid="8066356061184206341">"<xliff:g id="SEPARATOR">=</xliff:g>Salvador"</item>
- <item msgid="4806867741334453982">"<xliff:g id="SEPARATOR">=</xliff:g>Gurgaon"</item>
- <item msgid="2585780177649876827">"<xliff:g id="SEPARATOR">=</xliff:g>Mančester"</item>
- <item msgid="234104953526248139">"<xliff:g id="SEPARATOR">=</xliff:g>Kijev"</item>
- <item msgid="5245429461217350012">"<xliff:g id="SEPARATOR">=</xliff:g>Sankt Peterburg"</item>
- <item msgid="6738531308006017215">"<xliff:g id="SEPARATOR">=</xliff:g>Krakov"</item>
- <item msgid="8972702613339139467">"<xliff:g id="SEPARATOR">=</xliff:g>Vroclav"</item>
- <item msgid="187278924459096566">"<xliff:g id="SEPARATOR">=</xliff:g>Hamburg"</item>
- <item msgid="6173267862207394917">"<xliff:g id="SEPARATOR">=</xliff:g>Oulu"</item>
- <item msgid="5639324478037405990">"<xliff:g id="SEPARATOR">=</xliff:g>Haifa"</item>
- <item msgid="3157180661352354058">"<xliff:g id="SEPARATOR">=</xliff:g>San Huan"</item>
- <item msgid="6995939579417282715">"<xliff:g id="SEPARATOR">=</xliff:g>Tegusigalpa"</item>
- <item msgid="1641840677391275004">"<xliff:g id="SEPARATOR">=</xliff:g>Paramaribo"</item>
- <item msgid="7317049454800260290">"<xliff:g id="SEPARATOR">=</xliff:g>Kito"</item>
- <item msgid="4524380876433343244">"<xliff:g id="SEPARATOR">=</xliff:g>Ljubljana"</item>
- </string-array>
-</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index 121d8af..0000000
--- a/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,415 +0,0 @@
-<?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:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="6674495003718166674">"Sat"</string>
- <string name="alarm_list_title" msgid="7589940465292950600">"Alarmi"</string>
- <string name="add_alarm" msgid="5976616107390962899">"Dodaj alarm"</string>
- <string name="menu_desk_clock" msgid="3241995064554071588">"Stoni alarm"</string>
- <string name="menu_edit_alarm" msgid="7204602994918829751">"Izmeni alarm"</string>
- <string name="delete_alarm" msgid="3457780990646206817">"Izbriši alarm"</string>
- <string name="enable_alarm" msgid="1834599140632142536">"Uključi alarm"</string>
- <string name="disable_alarm" msgid="5889378670229554109">"Isključi alarm"</string>
- <string name="delete_alarm_confirm" msgid="6578572637340860840">"Želite li da izbrišete ovaj alarm?"</string>
- <string name="show_clock" msgid="8358759982675616915">"Prikaži sat"</string>
- <string name="hide_clock" msgid="3217727306480505694">"Sakrij sat"</string>
- <string name="label" msgid="162189613902857319">"Oznaka"</string>
- <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
- <string name="set_alarm" msgid="9148359866152726808">"Podesi alarm"</string>
- <string name="alarm_vibrate" msgid="3476686921490362230">"Vibracija"</string>
- <string name="alarm_repeat" msgid="7242985466344233206">"Ponovi"</string>
- <string name="alert" msgid="6506982899651975645">"Melodija alarma"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Prilagođena melodija zvona"</string>
- <string name="ringtone" msgid="9110746249688559579">"Melodija zvona"</string>
- <string name="time" msgid="8067216534232296518">"Vreme"</string>
- <string name="alarm_tomorrow" msgid="131356848787643420">"Sutra"</string>
- <string name="alarm_today" msgid="7873594221106531654">"Danas"</string>
- <string name="alarm_alert_wake_up" msgid="6790780716498252583">"Buđenje!"</string>
- <string name="alarm_alert_off_action_text" msgid="2459925305288819812">"Isklj."</string>
- <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Odbaci"</string>
- <string name="alarm_alert_dismiss_now_text" msgid="3272183025444682500">"Odbaci odmah"</string>
- <string name="alarm_missed_title" msgid="3828345099754063392">"Propušteni alarm"</string>
- <string name="alarm_missed_text" msgid="6585658367289194023">"<xliff:g id="ALARM_TIME">%s</xliff:g> – <xliff:g id="ALARM_LABEL">%s</xliff:g>"</string>
- <string name="alarm_alert_snoozed_text" msgid="7064642998528766113">"Odloženo"</string>
- <plurals name="alarm_alert_snooze_duration" formatted="false" msgid="7844300009062867865">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> min</item>
- <item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> min</item>
- </plurals>
- <string name="alarm_alert_off_text" msgid="4472073417593915002">"Alarm je isklj."</string>
- <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Odloži"</string>
- <plurals name="alarm_alert_snooze_set" formatted="false" msgid="3212729193036041768">
- <item quantity="one">Odloženo je za <xliff:g id="MINUTES">%d</xliff:g> minut.</item>
- <item quantity="few">Odloženo je za <xliff:g id="MINUTES">%d</xliff:g> minuta.</item>
- <item quantity="other">Odloženo je za <xliff:g id="MINUTES">%d</xliff:g> minuta.</item>
- </plurals>
- <string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Odlaganje do <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Predstojeći alarm"</string>
- <string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Propušteni alarm je izbrisan"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Preostalo je manje od minuta"</item>
- <item msgid="83197792732433351">"Preostalo je <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Preostalo je <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Preostalo je <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
- <string-array name="alarm_set">
- <item msgid="6450913786084215050">"Alarm će se uključiti za manje od 1 minuta."</item>
- <item msgid="6002066367368421848">"Alarm će se uključiti za <xliff:g id="DAYS">%1$s</xliff:g>."</item>
- <item msgid="8824719306247973774">"Alarm će se uključiti za <xliff:g id="HOURS">%2$s</xliff:g>."</item>
- <item msgid="8182406852935468862">"Alarm će se uključiti za <xliff:g id="DAYS">%1$s</xliff:g> i <xliff:g id="HOURS">%2$s</xliff:g>."</item>
- <item msgid="2532279224777213194">"Alarm će se uključiti za <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
- <item msgid="5936557894247187717">"Alarm će se uključiti za <xliff:g id="DAYS">%1$s</xliff:g> i <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
- <item msgid="9115697840826129603">"Alarm će se uključiti za <xliff:g id="HOURS">%2$s</xliff:g> i <xliff:g id="MINUTES">%3$s</xliff:g>."</item>
- <item msgid="2332583385137381060">"Alarm će se uključiti 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>
- <plurals name="days" formatted="false" msgid="3706846447285206235">
- <item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> dan</item>
- <item quantity="few"><xliff:g id="NUMBER">%s</xliff:g> dana</item>
- <item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> dana</item>
- </plurals>
- <plurals name="hours" formatted="false" msgid="3871283109767171655">
- <item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> sat</item>
- <item quantity="few"><xliff:g id="NUMBER">%s</xliff:g> sata</item>
- <item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> sati</item>
- </plurals>
- <plurals name="minutes" formatted="false" msgid="5484431721696058697">
- <item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> minut</item>
- <item quantity="few"><xliff:g id="NUMBER">%s</xliff:g> minuta</item>
- <item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> minuta</item>
- </plurals>
- <string name="every_day" msgid="4100909974923444602">"Svakog dana"</string>
- <string name="day_concat" msgid="971998564991636532">", "</string>
- <string name="clock_instructions" msgid="2656876819515011590">"Izaberite sat"</string>
- <string name="analog_gadget" msgid="1670505720837152766">"Analogni sat"</string>
- <string name="help" msgid="7786263119482654015">"pomoć"</string>
- <string name="settings" msgid="5849739030579520686">"Podešavanja"</string>
- <string name="snooze_duration_title" msgid="1097309861110780483">"Dužina odlaganja"</string>
- <plurals name="snooze_duration" formatted="false" msgid="3112918131095248271">
- <item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> minut</item>
- <item quantity="few"><xliff:g id="NUMBER">%s</xliff:g> minuta</item>
- <item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> minuta</item>
- </plurals>
- <plurals name="snooze_picker_label" formatted="false" msgid="322739253661747732">
- <item quantity="one">minut</item>
- <item quantity="few">minuta</item>
- <item quantity="other">minuta</item>
- </plurals>
- <string name="auto_silence_title" msgid="2012754009554434544">"Utišaj nakon"</string>
- <plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
- <item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minut</item>
- <item quantity="few"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuta</item>
- <item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuta</item>
- </plurals>
- <string name="auto_silence_never" msgid="4821982647348750809">"Nikada"</string>
- <string-array name="auto_silence_entries">
- <item msgid="3024545954917711306">"1 minut"</item>
- <item msgid="5431906692406316549">"5 minuta"</item>
- <item msgid="7742728812068919959">"10 minuta"</item>
- <item msgid="2855948657259647629">"15 minuta"</item>
- <item msgid="6330196381284475079">"20 minuta"</item>
- <item msgid="7809240121716151904">"25 minuta"</item>
- <item msgid="4278641338024561333">"Nemoj utišavati"</item>
- </string-array>
- <string name="week_start_title" msgid="4268917518596832096">"Započni sedmicu u"</string>
- <string-array name="week_start_entries">
- <item msgid="9010198173394482639">"subotu"</item>
- <item msgid="3993530639455360921">"nedelju"</item>
- <item msgid="8594709368683324282">"ponedeljak"</item>
- </string-array>
- <string name="done" msgid="6509722361933858451">"Gotovo"</string>
- <string name="revert" msgid="9100911171235162926">"Vrati"</string>
- <string name="delete" msgid="5732434972457000541">"Izbriši"</string>
- <string name="alarm_volume_title" msgid="8506245173912428522">"Jačina zvuka alarma"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Nečujno"</string>
- <string name="alarm_notify_text" msgid="4891014685945904766">"Odložite ili odbacite alarm."</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="4819324081410990368">"Alarm će se uključiti za <xliff:g id="TIME">%s</xliff:g>. Dodirnite za otkazivanje."</string>
- <string name="volume_button_setting_title" msgid="6937131248843413357">"Dugmad za jačinu"</string>
- <string name="volume_button_dialog_title" msgid="8768042543750036853">"Efekat dugmeta"</string>
- <string-array name="volume_button_setting_entries">
- <item msgid="7972756698723318690">"Odloži"</item>
- <item msgid="3450979320164769576">"Odbaci"</item>
- <item msgid="6302517608411378024">"Ne radi ništa"</item>
- </string-array>
- <string name="default_ringtone_setting_title" msgid="4549726190682964245">"Podešavanje podrazumevanih zvukova zvona"</string>
- <string name="alarm_button_description" msgid="740283647046258651">"Alarmi"</string>
- <string name="gallery_button_description" msgid="1151743663255257668">"Galerija"</string>
- <string name="music_button_description" msgid="1626593420810117999">"Muzika"</string>
- <string name="nightmode_button_description" msgid="990894208217576381">"Zatamnjeno"</string>
- <string name="home_button_description" msgid="3383859096809056157">"Pokretač"</string>
- <string name="desk_clock_button_description" msgid="4207371097361657274">"Prikaz sata"</string>
- <string name="label_description" msgid="8736179296142915727">"Oznaka"</string>
- <string name="ringtone_description" msgid="7580922112921069925">"Melodija zvona"</string>
- <string name="weather_fetch_failure" msgid="3425804832021006835">"Informacije o vremenu trenutno nisu dostupne."</string>
- <string name="alarm_klaxon_service_desc" msgid="2147506334302260256">"Usluga reprodukcije zvuka za alarme podešene u Satu."</string>
- <string name="loading_ringtone" msgid="6523322777415268044">"Učitava se zvuk zvona..."</string>
- <string name="timer_ring_service_desc" msgid="2620214305660322415">"Usluga puštanja zvuka za tajmere podešene u Satu."</string>
- <string name="control_set_alarm" msgid="2194676418924016327">"Podesi alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
- <string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
- <string name="menu_timer" msgid="6459070074762877114">"Tajmer"</string>
- <string name="menu_clock" msgid="5612760670606829805">"Sat"</string>
- <string name="menu_stopwatch" msgid="3396117705293574701">"Štoperica"</string>
- <string name="button_alarms" msgid="3907838219512538763">"Dodaj alarm"</string>
- <string name="button_cities" msgid="4555761857494501363">"Gradovi"</string>
- <string name="button_menu" msgid="6050484561842120282">"Još opcija"</string>
- <string name="menu_item_settings" msgid="1413723516369078665">"Podešavanja"</string>
- <string name="menu_item_help" msgid="4570953476186849841">"Pomoć"</string>
- <string name="menu_item_night_mode" msgid="3486930302245398975">"Noćni režim"</string>
- <string name="menu_item_sort_by_gmt_offset" msgid="3120860422682721706">"Sortiraj prema vremenu"</string>
- <string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sortiraj prema imenu"</string>
- <string name="selected_cities_label" msgid="3607479399424246605">"Izabrani gradovi"</string>
- <string name="sw_resume_button" msgid="2569360966002022248">"Nastavi"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Pokreni"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Zaustavi"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Krug"</string>
- <string name="sw_reset_button" msgid="6616804728322906117">"Resetuj"</string>
- <string name="sw_share_button" msgid="4478648110382859382">"Deli"</string>
- <string name="hours_label" msgid="3393478155635368097">"č"</string>
- <string name="minutes_label" msgid="3568098128251438588">"m"</string>
- <string name="seconds_label" msgid="124655952824003246">"s"</string>
- <string name="hours_label_description" msgid="8652842524970971830">"sati"</string>
- <string name="minutes_label_description" msgid="965686733490357796">"minuti"</string>
- <string name="seconds_label_description" msgid="3821620053141299692">"sekunde"</string>
- <string name="zero" msgid="7102083421938355017">"0"</string>
- <string name="sw_share_main" msgid="7703563468204234405">"Moje vreme je <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="sw_share_laps" msgid="614390674795945007">"Prolazna vremena:"</string>
- <string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. krug"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Br. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Br. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
- <plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> sat</item>
- <item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> sata</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> sati</item>
- </plurals>
- <plurals name="Nminutes_description" formatted="false" msgid="6373760365221990859">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> minut</item>
- <item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> minuta</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> minuta</item>
- </plurals>
- <plurals name="Nseconds_description" formatted="false" msgid="6456500168536594889">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> sekunda</item>
- <item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> sekunde</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> sekundi</item>
- </plurals>
- <string name="timer_add_timer" msgid="862733633862574752">"Dodaj tajmer"</string>
- <string name="timer_start" msgid="6158486445614356442">"Započni"</string>
- <string name="timer_delete" msgid="8699122001991909302">"Izbriši"</string>
- <string name="timer_descriptive_delete" msgid="8794915342760383536">"Izbrišite <xliff:g id="NUMBER_STRING">%s</xliff:g>"</string>
- <string name="timer_plus_one" msgid="6631211310420106116">"Dodaj 1 minut"</string>
- <string name="timer_plus_1_min" msgid="8645224089494875062">"Dodaj 1 min"</string>
- <string name="timer_stop" msgid="3361154678667736722">"Zaustavi"</string>
- <string name="timer_done" msgid="2375990511982914051">"Gotovo"</string>
- <string name="timer_reset" msgid="7848424809190171640">"Ponovo podesi"</string>
- <string name="timer_cancel" msgid="3572868404230815644">"Otkaži"</string>
- <string name="timer_times_up" msgid="9190440395938519009">"Vreme je isteklo"</string>
- <string name="timer_notification_label" msgid="4933184831583137249">"Tajmer"</string>
- <string name="timers_max_count_reached" msgid="9140022846793903813">"Dozvoljeno je najviše 4 tajmera"</string>
- <string-array name="sw_share_strings">
- <item msgid="842841032273927988">"Brzi ste kao munja."</item>
- <item msgid="6332879039890727169">"Uživajte u plodovima svog rada."</item>
- <item msgid="815382761274660130">"Zna se da su Androidi brzi, ali ne kao vi!"</item>
- <item msgid="7916250650982813737">"Uh."</item>
- <item msgid="6836603904515182333">"Elitn@ vremena."</item>
- <item msgid="7508085100680861631">"Kakva vrtoglava brzina."</item>
- <item msgid="5961245252909589573">"Hajde da vidimo ponovo ubrzani prikaz kroz vreme."</item>
- <item msgid="5211891900854545940">"Samo skok ulevo."</item>
- <item msgid="9071353477103826053">"Brzina vam je u krvi."</item>
- <item msgid="3785193933691117181">"Brzina fotona."</item>
- </string-array>
- <string name="home_label" msgid="4436139365695453870">"Kuća"</string>
- <string name="cities_activity_title" msgid="8552462751129256730">"Gradovi"</string>
- <string name="clock_settings" msgid="8317286807280600391">"Sat"</string>
- <string name="clock_style" msgid="2265011060429742344">"Stil"</string>
- <string-array name="clock_style_entries">
- <item msgid="917900462224167608">"Analogni"</item>
- <item msgid="8483930821046925592">"Digitalni"</item>
- </string-array>
- <string name="automatic_home_clock" msgid="6274174710735449252">"Automatski sat sa vremenom kod kuće"</string>
- <string name="automatic_home_clock_summary" msgid="6020476321040807273">"Kad putujem u drugoj vremenskoj zoni, dodaj sat sa vremenom kod kuće"</string>
- <string name="home_time_zone" msgid="9199730676287974501">"Matična vremenska zona"</string>
- <string name="home_time_zone_title" msgid="807894493443834624">"Matična vremenska zona"</string>
- <string name="time_picker_cancel" msgid="7437106489606013077">"Otkaži"</string>
- <string name="time_picker_set" msgid="331153175471468051">"Potvrdi"</string>
- <string name="time_picker_time_seperator" msgid="7484926510054777041">":"</string>
- <string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
- <string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
- <string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
- <string-array name="timezone_labels">
- <item msgid="5495601234086197399">"Maršalska ostrva"</item>
- <item msgid="4196408495909011020">"Ostrvo Midvej"</item>
- <item msgid="1414384194857730006">"Havaji"</item>
- <item msgid="2687091371581931926">"Aljaska"</item>
- <item msgid="1922100269679049660">"Pacifičko vreme"</item>
- <item msgid="7156402158716866161">"Tihuana"</item>
- <item msgid="1144117502254612241">"Arizona"</item>
- <item msgid="101284182011722637">"Čivava"</item>
- <item msgid="689121094232986897">"Planinsko vreme"</item>
- <item msgid="5445331923942302756">"Srednja Amerika"</item>
- <item msgid="2749806434052452351">"Centralno vreme"</item>
- <item msgid="3997138870229703753">"Meksiko Siti"</item>
- <item msgid="5425567073027744888">"Saskačevan"</item>
- <item msgid="2877342865396629368">"Bogota"</item>
- <item msgid="568682398893899670">"Istočno vreme"</item>
- <item msgid="668135984541863866">"Venecuela"</item>
- <item msgid="3737474220861486223">"Atlant. vreme (Barbados)"</item>
- <item msgid="6279116051273436870">"Atlantsko vreme (Kanada)"</item>
- <item msgid="8513382867172014244">"Manaus"</item>
- <item msgid="7776299003105932407">"Santjago"</item>
- <item msgid="8636989494746218677">"Njufaundlend"</item>
- <item msgid="4402541016410147505">"Brazilija"</item>
- <item msgid="2251184440733164084">"Buenos Ajres"</item>
- <item msgid="6202926618569004969">"Grenland"</item>
- <item msgid="2355275037115290628">"Montevideo"</item>
- <item msgid="1377549694711708945">"Srednje-Atlantsko"</item>
- <item msgid="3457671272126347981">"Azori"</item>
- <item msgid="3659315141063710840">"Zelenortska Ostrva"</item>
- <item msgid="1260941741802367635">"Kazablanka"</item>
- <item msgid="8275203689687954762">"London, Dablin"</item>
- <item msgid="5970179539479320905">"Amsterdam, Berlin"</item>
- <item msgid="5396319478750517962">"Beograd"</item>
- <item msgid="8688787475056663004">"Brisel"</item>
- <item msgid="3415827874921681622">"Sarajevo"</item>
- <item msgid="402008965928320066">"Vindhuk"</item>
- <item msgid="6436942724959275569">"Zapadnoafričko vreme"</item>
- <item msgid="954536568417204026">"Aman, Jordan"</item>
- <item msgid="8932745482008902551">"Atina, Istanbul"</item>
- <item msgid="320025725949024510">"Bejrut, Liban"</item>
- <item msgid="7242083112551905970">"Kairo"</item>
- <item msgid="7241520146011450419">"Helsinki"</item>
- <item msgid="2717065017510546526">"Jerusalim"</item>
- <item msgid="8698556287741466553">"Minsk"</item>
- <item msgid="1797598357342084506">"Harare"</item>
- <item msgid="5169119919905066998">"Bagdad"</item>
- <item msgid="2615788116201065182">"Moskva"</item>
- <item msgid="9084354867885584646">"Kuvajt"</item>
- <item msgid="1351570519986178268">"Najrobi"</item>
- <item msgid="7094569580635877460">"Teheran"</item>
- <item msgid="3953138772617909704">"Baku"</item>
- <item msgid="2868893113598800752">"Tbilisi"</item>
- <item msgid="7088581865802476373">"Jerevan"</item>
- <item msgid="1941122257623887992">"Dubai"</item>
- <item msgid="9194797225058249720">"Kabul"</item>
- <item msgid="6486569254364577332">"Islamabad, Karači"</item>
- <item msgid="5487724896895412089">"Uralsk"</item>
- <item msgid="364906869710826982">"Jekaterinburg"</item>
- <item msgid="2106505051751383358">"Kolkata"</item>
- <item msgid="6851586621581501447">"Šri Lanka"</item>
- <item msgid="800438544128213134">"Katmandu"</item>
- <item msgid="6173621471007643021">"Astana"</item>
- <item msgid="8645125891971581128">"Jangon"</item>
- <item msgid="2886407505119737794">"Krasnojarsk"</item>
- <item msgid="3408222398188107090">"Bangkok"</item>
- <item msgid="4441612937172851228">"Peking"</item>
- <item msgid="4936715789028996930">"Hongkong"</item>
- <item msgid="4261031143777385525">"Irkutsk"</item>
- <item msgid="3538060959338191835">"Kuala Lumpur"</item>
- <item msgid="1438847562643099201">"Pert"</item>
- <item msgid="3063913827688244383">"Tajpej"</item>
- <item msgid="3502757135046564209">"Seul"</item>
- <item msgid="6107588684519111669">"Tokio, Osaka"</item>
- <item msgid="4350769099755608471">"Jakutsk"</item>
- <item msgid="2422707004533526462">"Adelejd"</item>
- <item msgid="1292192084554134339">"Darvin"</item>
- <item msgid="1320883699470001716">"Brizbejn"</item>
- <item msgid="5137198806146386527">"Hobart"</item>
- <item msgid="5920063686933941174">"Sidnej, Kanbera"</item>
- <item msgid="615906039696009425">"Vladivostok"</item>
- <item msgid="7738680449356275374">"Guam"</item>
- <item msgid="2882915026380778227">"Magadan"</item>
- <item msgid="8255615641810148152">"Okland"</item>
- <item msgid="3027153773466391728">"Fidži"</item>
- <item msgid="5911600083231840181">"Tonga"</item>
- <item msgid="5176858645450908751">"Džakarta"</item>
- </string-array>
- <string name="alarm_settings" msgid="2947147071388290814">"Alarmi"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Usluga štoperice za upravljanje obaveštenjima."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Zaustavljeno"</string>
- <string name="description_direction_right" msgid="5709209043267548985">"Prevucite nadesno za odbacivanje"</string>
- <string name="description_direction_left" msgid="7448141043674998679">"Prevucite nalevo za odlaganje"</string>
- <string name="description_direction_both" msgid="1841309486023845685">"Prevucite nalevo da biste odložili ili nadesno da biste odbacili"</string>
- <string name="timer_stopped" msgid="2730331837832462008">"Tajmer je zaustavljen"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Tajmeri (<xliff:g id="NUMBER">%d</xliff:g>) su zaustavljeni"</string>
- <string name="all_timers_stopped_notif" msgid="278532320068394600">"Dodirnite da biste videli tajmere"</string>
- <string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> tajmera"</string>
- <string name="next_timer_notif" msgid="6136454740115613653">"Sledeći tajmer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
- <string name="screensaver_settings" msgid="7013450738357352801">"Podešavanja za San"</string>
- <string name="night_mode_title" msgid="5983813889469616299">"Noćni režim"</string>
- <string name="night_mode_summary" msgid="1017350187324162631">"Veoma taman ekran (za mračne sobe)"</string>
- <string name="expand_alarm" msgid="7392616528943305020">"Proširi alarm"</string>
- <string name="collapse_alarm" msgid="3561772046433483980">"Skupi alarm"</string>
- <string name="alarm_undo" msgid="5710042601177655254">"opozovi"</string>
- <string name="alarm_deleted" msgid="6131529309389084785">"Alarm je izbrisan"</string>
- <string name="slash" msgid="2077577763821006919">"/"</string>
- <string name="world_day_of_week_label" msgid="5911196322328341288">"/<xliff:g id="LABEL">%s</xliff:g>"</string>
- <string name="next_alarm_description" msgid="2650244835760747046">"Sledeći alarm: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="alarms_selected" msgid="1075308195332888260">"Izabranih: <xliff:g id="ALARMS">%d</xliff:g>"</string>
- <string name="deleted_message" msgid="1220848140260509437">"Izbrisano je"</string>
- <plurals name="alarm_delete_confirmation" formatted="false" msgid="3591262014329613293">
- <item quantity="one">Želite li da izbrišete izabrane alarme?</item>
- <item quantity="few">Želite li da izbrišete izabrane alarme?</item>
- <item quantity="other">Želite li da izbrišete izabrane alarme?</item>
- </plurals>
- <string name="timer_delete_confirmation" msgid="2815524107015816453">"Želite li da izbrišete ovaj tajmer?"</string>
- <string name="city_delete_confirmation" msgid="1783441538785676299">"Želite li da uklonite ovaj grad?"</string>
- <string name="digital_gadget" msgid="2326954556720571358">"Digitalni sat"</string>
- <string name="no_alarms" msgid="6429431324842022917">"Bez alarma"</string>
- <string name="no_alarms_set" msgid="4887558279496044764">"Nema alarma"</string>
- <string name="no_upcoming_alarms" msgid="2889840988069436254">"NEMA PREDSTOJEĆIH ALARMA"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
- <string name="invalid_time" msgid="2782334750243998633">"Nevažeće vreme <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
- <string name="no_alarm_at" msgid="8140632482969193119">"Nema alarma u <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
- <string name="no_scheduled_alarms" msgid="2115420148192753534">"Nema zakazanih alarma"</string>
- <string name="no_label_specified" msgid="2008482054428460626">"Nije navedena nijedna oznaka"</string>
- <string name="no_alarms_with_label" msgid="6250998794542941665">"Nijedan alarm ne sadrži oznaku"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Štoperica je već pokrenuta"</string>
- <string name="stopwatch_isnt_running" msgid="7147219965448204727">"Štoperica nije pokrenuta"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Štoperica ne može da se resetuje jer je aktivna"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Štoperica je zaustavljena"</string>
- <string name="stopwatch_reset" msgid="7585914953721021042">"Štoperica je resetovana"</string>
- <string name="stopwatch_lapped" msgid="5844686448815550482">"Obeleženo je vreme za krug na štoperici"</string>
- <string name="stopwatch_started" msgid="7843882246387176304">"Štoperica je pokrenuta"</string>
- <string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Nijedan alarm nije zakazan za ovo vreme"</string>
- <string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarm za <xliff:g id="ALARM_TIME">%s</xliff:g> je odbačen"</string>
- <string name="alarm_is_set" msgid="5503226382620011088">"Alarm je podešen za <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Nijedan tajmer nije podešen"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Tajmer je izbrisan"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Tajmer je već pokrenut"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Nije uspelo dovršavanje zahteva jer je dostupno više tajmera"</string>
- <string name="timer_started" msgid="6715582052946641641">"Tajmer je pokrenut"</string>
- <string name="timer_created" msgid="4381027137335885547">"Tajmer je napravljen"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Nevažeća dužina tajmera"</string>
- <string name="timer_was_reset" msgid="6495796785185062631">"Tajmer je resetovan"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Tajmer ne može da se resetuje jer je još uvek pokrenut. Zaustavite tajmer da biste ga resetovali."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Tajmer je već zaustavljen"</string>
- <string name="no_city_selected" msgid="1007596865203283741">"Nijedan grad nije izabran"</string>
- <string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Grad koji ste naveli nije dostupan"</string>
- <string name="the_city_already_added" msgid="3799050213771793020">"Ovaj grad je već dodat"</string>
- <string name="city_added" msgid="1335509457349179514">"Dodali ste: <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
- <string name="city_deleted" msgid="3935141305276867838">"Izbrisali ste: <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
- <string name="alarm_cant_be_dismissed_still_more_than_24_hours_away" msgid="8810520940995307437">"Alarm za <xliff:g id="ALARM_TIME">%s</xliff:g> još uvek ne može da se odbaci, i dalje ima više od 24 sata do vremena alarma"</string>
- <string name="dismiss_alarm" msgid="7204593078688533541">"Odbaci alarm"</string>
- <string name="pick_alarm_to_dismiss" msgid="5408769235866082896">"Izaberite alarm koji želite da odbacite"</string>
- <string name="no_firing_alarms" msgid="4986161963178722289">"Ne aktivira se nijedan alarm"</string>
- <string name="alarm_is_snoozed" msgid="7044644119744928846">"Alarm za <xliff:g id="ALARM_TIME">%s</xliff:g> je odložen za 10 minuta"</string>
-</resources>
diff --git a/res/values-bg/array.xml b/res/values-bg/array.xml
index 34bd5fa..8f2cd4d 100644
--- a/res/values-bg/array.xml
+++ b/res/values-bg/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Форталеза"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Гранд Търк"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Гренада"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Гватемала"</item>
+ <item msgid="6216160110733510854">"<xliff:g id="SEPARATOR">=</xliff:g>Гватемала Сити"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Гаяна"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Халифакс"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Хавана"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Торонто"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Ванкувър"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Уинипег"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Южен полюс"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Южен полюс<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Лонгирбюен"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Алмати"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Аман"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Газа"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Хеброн"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Хо Ши Мин"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Хонконг"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Хонконг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Истанбул"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Джакарта"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Йерусалим"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Манила"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Маскат"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Пном Пен"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Пхенян"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Пхенян<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Катар"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Рангун"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Рияд"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Сайгон"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Сеул"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Шанхай"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Шанхай<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Сингапур"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Тайпей"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Тайпей<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Техеран"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Тел Авив"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Токио"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Токио<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Улан Батор"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Бермуда"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Канарски острови"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Рино"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Блек Рок Сити"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Доха"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Пекин"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Пекин<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Мумбай"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Делхи"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Осака"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Осака<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Лахор"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Сана"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Барселона"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Кеймбридж"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Къркланд"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Медисън"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Гуанджоу"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Гуанджоу<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Хайдерабад"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Рестън"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Бело Оризонте"</item>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index b1db80a..2f879ed 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Показване на часовника"</string>
<string name="hide_clock" msgid="3217727306480505694">"Скриване на часовника"</string>
<string name="label" msgid="162189613902857319">"Етикет"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Включено"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Изключено"</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="6506982899651975645">"Мелодия на будилника"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Персонализирана мелодия"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Изтичане на времето на таймера"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Тих режим"</string>
<string name="ringtone" msgid="9110746249688559579">"Мелодия"</string>
<string name="time" msgid="8067216534232296518">"Час"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Утре"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Отлагане до <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Предстоящ будилник"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Пропуснатият ви будилник е изтрит"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Остава по-малко от минута"</item>
- <item msgid="83197792732433351">"Остават <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Остават <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Остават <xliff:g id="HOURS">%1$s</xliff:g> и <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Остава по-малко от минута"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Остават <xliff:g id="HOURS">%1$s</xliff:g> и <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"Остава"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"Остават"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Будилникът e настроен за след по-малко от минута."</item>
<item msgid="6002066367368421848">"Будилникът е настроен за след <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="other"> минути</item>
<item quantity="one"> минута</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Постепенно увеличаване на силата на звука"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Изключено"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> секунди"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"секунди"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Заглушаване след"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> минути</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Възстановяване"</string>
<string name="delete" msgid="5732434972457000541">"Изтриване"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Сила на звука на будилника"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Тих режим"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Тих режим"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Неизвестно"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Отлагане или отхвърлянe на будилника."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (отложено)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Будилникът е настроен за <xliff:g id="TIME">%s</xliff:g>. Докоснете, за да анулирате."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Мелодията се зарежда..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Услуга за възпроизвеждане на звук за таймерите, зададени в часовника."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Навиване на будилника"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Будилник"</string>
<string name="menu_timer" msgid="6459070074762877114">"Таймер"</string>
<string name="menu_clock" msgid="5612760670606829805">"Часовник"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Сортиране по име"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Избрани градове"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Възобновяване"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Старт"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Стоп"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Етап"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Нулиране"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Старт"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Поставяне на пауза"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Етап"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Споделяне"</string>
<string name="hours_label" msgid="3393478155635368097">"ч"</string>
<string name="minutes_label" msgid="3568098128251438588">"м"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Времето ми е <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Междинни резултати:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Етап <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"№ <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"№ <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> часа</item>
<item quantity="one">1 час</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Добавяне на 1 минута"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Добавяне на 1 мин"</string>
<string name="timer_stop" msgid="3361154678667736722">"Спиране"</string>
- <string name="timer_done" msgid="2375990511982914051">"Готово"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Спиране на всички таймери"</string>
<string name="timer_reset" msgid="7848424809190171640">"Нулиране"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Отказ"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Таймерът е анулиран"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Времето изтече"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> таймера са изтекли"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Таймер"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Максимално 4 таймера"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Пауза"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Таймери: Нулир."</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Развивате светкавична скорост."</item>
<item msgid="6332879039890727169">"Радвайте се на плодовете от труда си."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Градове"</string>
<string name="clock_settings" msgid="8317286807280600391">"Часовник"</string>
<string name="clock_style" msgid="2265011060429742344">"Стил"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Промяна на датата и часа"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Аналогов"</item>
<item msgid="8483930821046925592">"Цифров"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"–"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Поставихте отметка за <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Премахнахте отметката от <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Маршалови острови"</item>
<item msgid="4196408495909011020">"Мидуей, о-в"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Джакарта"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Будилници"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Услуга на хронометъра за пускане на известието."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Спряно"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Обработва действията от известията на таймера."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Обработва действията от известията на хронометъра."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"На пауза"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Прекарайте пръст надясно, за да отхвърлите"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Прекарайте пръст наляво, за да отложите"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Прекарайте пръст наляво, за да отложите, или надясно за отхвърляне"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Таймери"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Мелодия на таймера"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Таймерът е спрян"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> таймера са спрени"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Таймерът е на пауза"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> таймера са на пауза"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Докоснете, за да видите таймерите си"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> таймера"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Следващ таймер: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Няма будилници"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Няма будилници"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"НЯМА ПРЕДСТОЯЩИ БУДИЛНИЦИ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"<xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g> е невалиден час"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Няма будилник за <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Няма насрочени будилници"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Няма посочен етикет"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Етикетът не се съдържа в нито един будилник"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Хронометърът вече работи"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Хронометърът не работи"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Хронометърът не може да бъде нулиран, защото работи"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Хронометърът е спрян"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Хронометърът е на пауза"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Хронометърът е нулиран"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Хронометърът засече междинно време"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Хронометърът е стартиран"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Няма насрочен будилник за този час"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Будилникът за <xliff:g id="ALARM_TIME">%s</xliff:g> е премахнат"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Будилникът е зададен за <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Няма зададен таймер"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Таймерът е изтрит"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Таймерът вече работи"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Заявката ви не може да се изпълни. Налице са няколко таймера"</string>
- <string name="timer_started" msgid="6715582052946641641">"Таймерът е стартиран"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Не съществуват таймери"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Съществува повече от един таймер"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Таймерът е премахнат."</string>
<string name="timer_created" msgid="4381027137335885547">"Таймерът е създаден"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Невалидна продължителност на таймера"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Таймерът е нулиран"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Не можете да нулирате таймера, защото още работи. Трябва първо да го спрете."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Таймерът вече е спрян"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Таймерът е изтрит"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Таймерът е стартиран"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Невалидна продължителност на таймера"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Няма избран град"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Посоченият от вас град не е налице"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Този град вече е добавен"</string>
diff --git a/res/values-bn-rBD/array.xml b/res/values-bn-rBD/array.xml
index 5c1e7a4..6210c8c 100644
--- a/res/values-bn-rBD/array.xml
+++ b/res/values-bn-rBD/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ফ<xliff:g id="SEPARATOR">=</xliff:g>ফোর্তলেজ়া"</item>
<item msgid="5801558418916235541">"গা<xliff:g id="SEPARATOR">=</xliff:g>গ্র্যান্ড টার্ক"</item>
<item msgid="2103759276235503048">"গ্রা<xliff:g id="SEPARATOR">=</xliff:g>গ্রেনাডা"</item>
- <item msgid="1490069759176391533">"গু<xliff:g id="SEPARATOR">=</xliff:g>গুয়াটেমালা"</item>
+ <item msgid="6216160110733510854">"গ<xliff:g id="SEPARATOR">=</xliff:g>গুয়াটেমালা সিটি"</item>
<item msgid="525959305652046261">"গি<xliff:g id="SEPARATOR">=</xliff:g>গিয়ানা"</item>
<item msgid="7565596629973190931">"হা<xliff:g id="SEPARATOR">=</xliff:g>হ্যালিফ্যাক্স"</item>
<item msgid="3811169155065582644">"হা<xliff:g id="SEPARATOR">=</xliff:g>হাভানা"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ট<xliff:g id="SEPARATOR">=</xliff:g>টরন্টো"</item>
<item msgid="1506838283840737263">"ভ্যা<xliff:g id="SEPARATOR">=</xliff:g>ভ্যাঙ্কুভার"</item>
<item msgid="8935386104773857399">"উ<xliff:g id="SEPARATOR">=</xliff:g>উইনিপেগ"</item>
- <item msgid="1132634022412399582">"দ<xliff:g id="SEPARATOR">=</xliff:g>দক্ষিণ মেরু"</item>
+ <item msgid="498429228419399474">"দ<xliff:g id="SEPARATOR">=</xliff:g>দক্ষিণ মেরু<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ল<xliff:g id="SEPARATOR">=</xliff:g>লঞ্জিয়বিয়েঁন"</item>
<item msgid="3784788073896028355">"আ<xliff:g id="SEPARATOR">=</xliff:g>আলমাটি"</item>
<item msgid="7895695236056852523">"আ<xliff:g id="SEPARATOR">=</xliff:g>আম্মান"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"গা<xliff:g id="SEPARATOR">=</xliff:g>গাজা"</item>
<item msgid="2359068282340162319">"হি<xliff:g id="SEPARATOR">=</xliff:g>হিব্রোণ"</item>
<item msgid="6223396610551759129">"হো<xliff:g id="SEPARATOR">=</xliff:g>হো চি মিন"</item>
- <item msgid="4731022818651322736">"হ<xliff:g id="SEPARATOR">=</xliff:g>হংকং"</item>
+ <item msgid="3439764751788710130">"হ<xliff:g id="SEPARATOR">=</xliff:g>হংকং<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"ই<xliff:g id="SEPARATOR">=</xliff:g>ইস্তাম্বুল"</item>
<item msgid="758800913783999425">"জা<xliff:g id="SEPARATOR">=</xliff:g>জাকার্তা"</item>
<item msgid="8956406398692698126">"জে<xliff:g id="SEPARATOR">=</xliff:g>জেরুসালেম"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"ম্যা<xliff:g id="SEPARATOR">=</xliff:g>ম্যানিলা"</item>
<item msgid="6033964325069060422">"মা<xliff:g id="SEPARATOR">=</xliff:g>মাস্কট"</item>
<item msgid="6077458941399984780">"ন<xliff:g id="SEPARATOR">=</xliff:g>নম ফেন"</item>
- <item msgid="935474308903572975">"পি<xliff:g id="SEPARATOR">=</xliff:g>পিয়ংইয়েন"</item>
+ <item msgid="1245515372520913197">"পি<xliff:g id="SEPARATOR">=</xliff:g>পিয়ংইয়েন<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"কা<xliff:g id="SEPARATOR">=</xliff:g>কাতার"</item>
<item msgid="1667243110545095146">"রে<xliff:g id="SEPARATOR">=</xliff:g>রেঙ্গুন"</item>
<item msgid="4460370766685855731">"রি<xliff:g id="SEPARATOR">=</xliff:g>রিয়াদ"</item>
<item msgid="4229224905931739201">"সা<xliff:g id="SEPARATOR">=</xliff:g>সাইগন"</item>
<item msgid="8705359848250215620">"সি<xliff:g id="SEPARATOR">=</xliff:g>সিউল"</item>
- <item msgid="583367295371395814">"সা<xliff:g id="SEPARATOR">=</xliff:g>সাংহাই"</item>
+ <item msgid="3814881931186962624">"সা<xliff:g id="SEPARATOR">=</xliff:g>সাংহাই<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"সি<xliff:g id="SEPARATOR">=</xliff:g>সিঙ্গাপুর"</item>
- <item msgid="1972491729911039207">"তা<xliff:g id="SEPARATOR">=</xliff:g>তাইপেই"</item>
+ <item msgid="8982451946156859368">"তা<xliff:g id="SEPARATOR">=</xliff:g>তাইপেই<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"তে<xliff:g id="SEPARATOR">=</xliff:g>তেহরান"</item>
<item msgid="8629402941285674273">"তে<xliff:g id="SEPARATOR">=</xliff:g>তেল আভিভ"</item>
- <item msgid="8499164674454654525">"টো<xliff:g id="SEPARATOR">=</xliff:g>টোকিও"</item>
+ <item msgid="76330681636547168">"টো<xliff:g id="SEPARATOR">=</xliff:g>টোকিও<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"উ<xliff:g id="SEPARATOR">=</xliff:g>উলানবাটর"</item>
<item msgid="2028626988021468640">"বা<xliff:g id="SEPARATOR">=</xliff:g>বারমুডা"</item>
<item msgid="4527109966513690429">"কা<xliff:g id="SEPARATOR">=</xliff:g>কানারি"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"রে<xliff:g id="SEPARATOR">=</xliff:g>রেনু"</item>
<item msgid="9155068631060038769">"বা<xliff:g id="SEPARATOR">=</xliff:g>ব্ল্যাক রক সিটি"</item>
<item msgid="8498761319928979900">"দো<xliff:g id="SEPARATOR">=</xliff:g>দোহা"</item>
- <item msgid="8307897251088048641">"বে<xliff:g id="SEPARATOR">=</xliff:g>বেইজিং"</item>
+ <item msgid="5327010922199714808">"বে<xliff:g id="SEPARATOR">=</xliff:g>বেইজিং<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"ম<xliff:g id="SEPARATOR">=</xliff:g>মুম্বাই"</item>
<item msgid="6668274273067049125">"দি<xliff:g id="SEPARATOR">=</xliff:g>দিল্লি"</item>
- <item msgid="2933410189478233292">"ও<xliff:g id="SEPARATOR">=</xliff:g>ওসাকা"</item>
+ <item msgid="7199039603593847813">"ও<xliff:g id="SEPARATOR">=</xliff:g>ওসাকা<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"লা<xliff:g id="SEPARATOR">=</xliff:g>লাহোর"</item>
<item msgid="1448378291805481500">"সা<xliff:g id="SEPARATOR">=</xliff:g>সানা"</item>
<item msgid="5233119846682408301">"বা<xliff:g id="SEPARATOR">=</xliff:g>বার্সেলোনা"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"কে<xliff:g id="SEPARATOR">=</xliff:g>কেমব্রিজ"</item>
<item msgid="759409010285366934">"কা<xliff:g id="SEPARATOR">=</xliff:g>কার্কল্যান্ড"</item>
<item msgid="6308007059287569663">"মা<xliff:g id="SEPARATOR">=</xliff:g>ম্যাডিসন"</item>
- <item msgid="6971636434858330021">"গু<xliff:g id="SEPARATOR">=</xliff:g>গুয়াংঝো"</item>
+ <item msgid="2077617905582224600">"গু<xliff:g id="SEPARATOR">=</xliff:g>গুয়াংঝো<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"হা<xliff:g id="SEPARATOR">=</xliff:g>হায়দ্রাবাদ"</item>
<item msgid="3032295682584784261">"রে<xliff:g id="SEPARATOR">=</xliff:g>রেস্টন"</item>
<item msgid="7722837296297332268">"বে<xliff:g id="SEPARATOR">=</xliff:g>বেলো হরিজন্তে"</item>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index 8884bd6..1ae0afa 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"ঘড়ি দেখান"</string>
<string name="hide_clock" msgid="3217727306480505694">"ঘড়ি লুকান"</string>
<string name="label" msgid="162189613902857319">"লেবেল"</string>
+ <string name="on_switch" msgid="2297966258029227449">"চালু আছে"</string>
+ <string name="off_switch" msgid="3381070073851148013">"বন্ধ আছে"</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="6506982899651975645">"অ্যালার্ম রিংটোন"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"কাস্টম রিংটোন"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"টাইমারের মেয়াদ শেষ হয়ে গেছে"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"নীরব"</string>
<string name="ringtone" msgid="9110746249688559579">"রিংটোন"</string>
<string name="time" msgid="8067216534232296518">"সময়"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"আগামীকাল"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> পর্যন্ত স্নুজ হয়ে থাকবে"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"আসন্ন এলার্ম"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"আপনার মিসড অ্যালার্ম মুছে ফেলা হয়েছে"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"এক মিনিটেরও কম সময় বাকি আছে"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> বাকি"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> বাকি"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> বাকি"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"এক মিনিটেরও কম সময় বাকি আছে"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> বাকি আছে"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"বাকি আছে"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"বাকি আছে"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"এখন থেকে ১ মিনিটের কম সময়ের জন্য অ্যালার্ম সেট করা হয়েছে।"</item>
<item msgid="6002066367368421848">"এখন থেকে <xliff:g id="DAYS">%1$s</xliff:g>-র জন্য অ্যালার্ম সেট করা হয়েছে।"</item>
@@ -101,6 +104,10 @@
<item quantity="one">মিনিট</item>
<item quantity="other">মিনিট</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"ধীরে ধীরে ভলিউম বড়ান"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"বন্ধ"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> সেকেন্ড"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"সেকেন্ড"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"এর পরে নীরব করুন"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> মিনিট</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"ফেরান"</string>
<string name="delete" msgid="5732434972457000541">"মুছুন"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"অ্যালার্মের ভলিউম"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"নীরব"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"নীরব"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"অজানা"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"অ্যালার্ম স্নুজ বা খারিজ করুন।"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (পরে মনে করা)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"<xliff:g id="TIME">%s</xliff:g> এর জন্য অ্যালার্ম সেট হয়েছে। বাতিল করার জন্য ছোঁন।"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"রিংটোন লোড হচ্ছে…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"ঘড়িতে টাইমারের জন্য সাউন্ড প্লেব্যাক পরিষেবা।"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"অ্যালার্ম সেট করুন"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"অ্যালার্ম"</string>
<string name="menu_timer" msgid="6459070074762877114">"টাইমার"</string>
<string name="menu_clock" msgid="5612760670606829805">"ঘড়ি"</string>
@@ -167,11 +173,12 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"নাম অনুসারে সাজান"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"নির্বাচন করা শহরগুলি"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"পুনঃসূচনা"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"শুরু করুন"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"থামান"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ল্যাপ"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"পুনরায় সেট করুন"</string>
- <string name="sw_share_button" msgid="4478648110382859382">"শেয়ার করুন"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"শুরু করুন"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"ল্যাপ"</string>
+ <string name="sw_share_button" msgid="4478648110382859382">"ভাগ করুন"</string>
<string name="hours_label" msgid="3393478155635368097">"ঘ."</string>
<string name="minutes_label" msgid="3568098128251438588">"মি."</string>
<string name="seconds_label" msgid="124655952824003246">"সে."</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"আমার সময় <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"ল্যাপ সময়:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g> টি ল্যাপ"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ঘন্টা</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ঘন্টা</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 মিনিট যোগ করুন"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 মিনিট যোগ করুন"</string>
<string name="timer_stop" msgid="3361154678667736722">"থামান"</string>
- <string name="timer_done" msgid="2375990511982914051">"সম্পন্ন"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"সব টাইমার বন্ধ করুন"</string>
<string name="timer_reset" msgid="7848424809190171640">"পুনরায় সেট করুন"</string>
<string name="timer_cancel" msgid="3572868404230815644">"বাতিল করুন"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"টাইমার বাতিল করা হয়েছে"</string>
<string name="timer_times_up" msgid="9190440395938519009">"সময় শেষ"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g>টি টাইমারের সময় শেষ হয়েছে"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"টাইমার"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"সর্বোচ্চ ৪টি টাইমার"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"বিরাম দিন"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"সমস্ত টাইমার পুনরায় সেট করুন"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"আপনি আসলেই এক গতিময় দৈত্য।"</item>
<item msgid="6332879039890727169">"আপনার শ্রমের ফসল উপভোগ করুন।"</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"শহর"</string>
<string name="clock_settings" msgid="8317286807280600391">"ঘড়ি"</string>
<string name="clock_style" msgid="2265011060429742344">"শৈলী"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"তারিখ এবং সময় পরিবর্তন করুন"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"অ্যানালগ"</item>
<item msgid="8483930821046925592">"ডিজিটাল"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> এ টিক চিহ্ন দেওয়া হয়েছে"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> থেকে টিক চিহ্ন সরানো হয়েছে"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"মার্শাল আইল্যান্ডস"</item>
<item msgid="4196408495909011020">"মিডওয়ে আইল্যান্ড"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"জাকার্তা"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"অ্যালার্মগুলি"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"বিজ্ঞপ্তি চালানোর জন্য স্টপওয়াচ পরিষেবা"</string>
- <string name="swn_stopped" msgid="783124901663086172">"থেমেছে"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"টাইমার বিজ্ঞপ্তিগুলি থেকে কাজগুলি প্রক্রিয়া করে"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"স্টপওয়াচ বিজ্ঞপ্তিগুলি থেকে কাজগুলি প্রক্রিয়া করে"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"বিরাম দেওয়া হয়েছে"</string>
<string name="description_direction_right" msgid="5709209043267548985">"খারিজ করতে সোয়াইপ করুন"</string>
<string name="description_direction_left" msgid="7448141043674998679">"পরে মনে করিয়ে দিতে বামে সোয়াইপ করুন"</string>
<string name="description_direction_both" msgid="1841309486023845685">"মনে করিয়ে দিতে বাম দিকে বা খারিজ করতে ডান দিকে সোয়াইপ করুন"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"টাইমারগুলো"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"টাইমার রিংয়ের শব্দ"</string>
<string name="timer_stopped" msgid="2730331837832462008">"টাইমার থেমেছে"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> টি টাইমার বন্ধ হয়েছে"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"টাইমারে বিরাম দেওয়া হয়েছে"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g>টি টাইমারে বিরাম দেওয়া হয়েছে"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"আপনার টাইমারগুলি দেখার জন্য ছোঁন"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> টি টাইমার"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"পরবর্তী টাইমার: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"কোনো অ্যালার্ম নাই"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"কোনো অ্যালার্ম সেট করা নেই"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"কোনো আসন্ন অ্যালার্ম নাই"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"অবৈধ সময় <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> -এ কোনো অ্যালার্ম নেই"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"কোনো সময়সূচী নেই"</string>
<string name="no_label_specified" msgid="2008482054428460626">"কোনো লেবেল নির্দিষ্ট করা নেই"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"লেবেলটিতে কোনো অ্যালার্ম নির্দিষ্ট করা নেই"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"স্টপওয়াচ ইতিমধ্যেই চলছে"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"স্টপওয়াচ চলছে না"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"স্টপওয়াচটি এখন চালু থাকায় এটিকে পুনরায় সেট করা যাবে না"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"স্টপওয়াচ বন্ধ হয়েছে"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"স্টপ ওয়াচকে বিরাম দেওয়া হয়েছে"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"স্টপওয়াচ পুনরায় সেট হয়েছে"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"স্টপওয়াচ ল্যাপ করা হয়েছে"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"স্টপওয়াচ শুরু হয়েছে"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"এই সময়ের জন্য কোনো অ্যালার্ম পূর্বনির্ধারিত করা নেই"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> অ্যালার্ম খারিজ করা হয়েছে"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g> -এ অ্যালার্ম সেট করা আছে"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"কোনো টাইমার সেট করা নেই"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"টাইমার মুছে ফেলা হয়েছে"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"টাইমার ইতিমধ্যেই চলছে"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"আপনার অনুরোধ সম্পূর্ণ করা যায়নি, একাধিক টাইমার উপলব্ধ রয়েছে"</string>
- <string name="timer_started" msgid="6715582052946641641">"টাইমার শুরু হয়েছে"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"কোনো টাইমার বিদ্যমান নেই"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"একটির থেকে বেশি টাইমার বিদ্যমান"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"টাইমরটিকে সরানো হয়েছে৷"</string>
<string name="timer_created" msgid="4381027137335885547">"টাইমার তৈরি হয়েছে"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"অবৈধ টাইমার দৈর্ঘ্য"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"টাইমার পুনরায় সেট করা হয়েছে"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"টাইমার পুনরায় সেট করা যাবে না কারণ এটি এখনও চলছে৷ পুনরায় সেট করতে টাইমার বন্ধ করুন৷"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"টাইমার ইতিমধ্যেই থেমে গেছে"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"টাইমার মুছে ফেলা হয়েছে"</string>
+ <string name="timer_started" msgid="6715582052946641641">"টাইমার শুরু হয়েছে"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"অবৈধ টাইমার দৈর্ঘ্য"</string>
<string name="no_city_selected" msgid="1007596865203283741">"কোনো শহর নির্বাচিত নেই"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"আপনার নির্দিষ্ট করা শহরটি উপলব্ধ নেই"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"এই শহরটি ইতিমধ্যেই যোগ করা হয়েছে"</string>
diff --git a/res/values-bs-rBA/array.xml b/res/values-bs-rBA/array.xml
deleted file mode 100644
index 2c1fad1..0000000
--- a/res/values-bs-rBA/array.xml
+++ /dev/null
@@ -1,322 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Copyright (C) 2012 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-array name="cities_names">
- <item msgid="4653806289288974388">"<xliff:g id="SEPARATOR">=</xliff:g>Abidžan"</item>
- <item msgid="4864167603178202155">"<xliff:g id="SEPARATOR">=</xliff:g>Akra"</item>
- <item msgid="6478898553803167749">"<xliff:g id="SEPARATOR">=</xliff:g>Adis Abeba"</item>
- <item msgid="5618029992528436448">"<xliff:g id="SEPARATOR">=</xliff:g>Alžir"</item>
- <item msgid="2906834750114790793">"<xliff:g id="SEPARATOR">=</xliff:g>Blantyre"</item>
- <item msgid="8153571933836629863">"<xliff:g id="SEPARATOR">=</xliff:g>Brazavil"</item>
- <item msgid="3703129580594640833">"<xliff:g id="SEPARATOR">=</xliff:g>Kairo"</item>
- <item msgid="2300915410194647320">"<xliff:g id="SEPARATOR">=</xliff:g>Kazablanka"</item>
- <item msgid="1217039002304887948">"<xliff:g id="SEPARATOR">=</xliff:g>Konakri"</item>
- <item msgid="8775104707806220928">"<xliff:g id="SEPARATOR">=</xliff:g>Dakar"</item>
- <item msgid="5948764589113643811">"<xliff:g id="SEPARATOR">=</xliff:g>Dar es Salam"</item>
- <item msgid="6306254507715416077">"DŽ<xliff:g id="SEPARATOR">=</xliff:g>Džibuti"</item>
- <item msgid="4286108029159501866">"<xliff:g id="SEPARATOR">=</xliff:g>Freetown"</item>
- <item msgid="4514786733035528116">"<xliff:g id="SEPARATOR">=</xliff:g>Gaborone"</item>
- <item msgid="7367496854968219671">"<xliff:g id="SEPARATOR">=</xliff:g>Harare"</item>
- <item msgid="6837746379726020288">"<xliff:g id="SEPARATOR">=</xliff:g>Johannesburg"</item>
- <item msgid="6284185156591171506">"<xliff:g id="SEPARATOR">=</xliff:g>Kampala"</item>
- <item msgid="3299518884693668985">"<xliff:g id="SEPARATOR">=</xliff:g>Kartum"</item>
- <item msgid="4614879508966043969">"<xliff:g id="SEPARATOR">=</xliff:g>Kigali"</item>
- <item msgid="8878437043772547732">"<xliff:g id="SEPARATOR">=</xliff:g>Kinšasa"</item>
- <item msgid="6325601635544067909">"<xliff:g id="SEPARATOR">=</xliff:g>Lagos"</item>
- <item msgid="6094357506290323524">"<xliff:g id="SEPARATOR">=</xliff:g>Maseru"</item>
- <item msgid="7270525814400329098">"<xliff:g id="SEPARATOR">=</xliff:g>Mogadišu"</item>
- <item msgid="353110101402547540">"<xliff:g id="SEPARATOR">=</xliff:g>Najrobi"</item>
- <item msgid="1688121892646984549">"<xliff:g id="SEPARATOR">=</xliff:g>São Tomé"</item>
- <item msgid="3642219084651687800">"<xliff:g id="SEPARATOR">=</xliff:g>Timbuktu"</item>
- <item msgid="7287513493631179463">"<xliff:g id="SEPARATOR">=</xliff:g>Tripoli"</item>
- <item msgid="5052614613671591560">"<xliff:g id="SEPARATOR">=</xliff:g>Tunis"</item>
- <item msgid="7976303179193839859">"<xliff:g id="SEPARATOR">=</xliff:g>Anchorage"</item>
- <item msgid="193703779380497120">"<xliff:g id="SEPARATOR">=</xliff:g>Mendoza"</item>
- <item msgid="5448884981082519628">"<xliff:g id="SEPARATOR">=</xliff:g>Aruba"</item>
- <item msgid="1577938273323914773">"<xliff:g id="SEPARATOR">=</xliff:g>Asunsion"</item>
- <item msgid="5617155978105010520">"<xliff:g id="SEPARATOR">=</xliff:g>Barbados"</item>
- <item msgid="3600025702357376322">"<xliff:g id="SEPARATOR">=</xliff:g>Belize"</item>
- <item msgid="2847679817118467051">"<xliff:g id="SEPARATOR">=</xliff:g>Bogota"</item>
- <item msgid="9029003541681282929">"<xliff:g id="SEPARATOR">=</xliff:g>Buenos Aires"</item>
- <item msgid="2338367960332622522">"<xliff:g id="SEPARATOR">=</xliff:g>Kankun"</item>
- <item msgid="4339797536047170278">"<xliff:g id="SEPARATOR">=</xliff:g>Karakas"</item>
- <item msgid="9199080438977757863">"<xliff:g id="SEPARATOR">=</xliff:g>Kajman"</item>
- <item msgid="1993203473281589891">"<xliff:g id="SEPARATOR">=</xliff:g>Chicago"</item>
- <item msgid="7990342776303470263">"<xliff:g id="SEPARATOR">=</xliff:g>Kostarika"</item>
- <item msgid="5676109900908808628">"<xliff:g id="SEPARATOR">=</xliff:g>Kurasao"</item>
- <item msgid="5519120432577564812">"<xliff:g id="SEPARATOR">=</xliff:g>Dawson Creek"</item>
- <item msgid="2126228972377380680">"<xliff:g id="SEPARATOR">=</xliff:g>Denver"</item>
- <item msgid="3298410632922319193">"<xliff:g id="SEPARATOR">=</xliff:g>Detroit"</item>
- <item msgid="2819032085688382805">"<xliff:g id="SEPARATOR">=</xliff:g>Dominika"</item>
- <item msgid="6170433208654553821">"<xliff:g id="SEPARATOR">=</xliff:g>Edmonton"</item>
- <item msgid="795461860173291499">"<xliff:g id="SEPARATOR">=</xliff:g>El Salvador"</item>
- <item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
- <item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
- <item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Gvatemala"</item>
- <item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Gvajana"</item>
- <item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
- <item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
- <item msgid="3733555435078090201">"<xliff:g id="SEPARATOR">=</xliff:g>Indianapolis"</item>
- <item msgid="226982663848410981">"<xliff:g id="SEPARATOR">=</xliff:g>Knox"</item>
- <item msgid="3815293080342229459">"<xliff:g id="SEPARATOR">=</xliff:g>Marengo"</item>
- <item msgid="6594853515451547389">"<xliff:g id="SEPARATOR">=</xliff:g>Petersburg"</item>
- <item msgid="6091571889213283534">"<xliff:g id="SEPARATOR">=</xliff:g>Tell City"</item>
- <item msgid="3089369312058696669">"<xliff:g id="SEPARATOR">=</xliff:g>Vevaj"</item>
- <item msgid="1334860422444068943">"<xliff:g id="SEPARATOR">=</xliff:g>Vincennes"</item>
- <item msgid="7775105082093691756">"<xliff:g id="SEPARATOR">=</xliff:g>Winamac"</item>
- <item msgid="4043335541899184547">"<xliff:g id="SEPARATOR">=</xliff:g>Kingston"</item>
- <item msgid="1063757593477259280">"<xliff:g id="SEPARATOR">=</xliff:g>Nuestra Señora de La Paz"</item>
- <item msgid="349901732062388869">"<xliff:g id="SEPARATOR">=</xliff:g>Lima"</item>
- <item msgid="4977592519316837842">"<xliff:g id="SEPARATOR">=</xliff:g>Los Angeles"</item>
- <item msgid="7713051790509638572">"<xliff:g id="SEPARATOR">=</xliff:g>Louisville"</item>
- <item msgid="8460620935898405225">"<xliff:g id="SEPARATOR">=</xliff:g>Managua"</item>
- <item msgid="8328345293081464192">"<xliff:g id="SEPARATOR">=</xliff:g>Martinique"</item>
- <item msgid="8010357327448619637">"<xliff:g id="SEPARATOR">=</xliff:g>Mendoza"</item>
- <item msgid="2046777213916219253">"<xliff:g id="SEPARATOR">=</xliff:g>Metlakatla"</item>
- <item msgid="2227885609632709258">"<xliff:g id="SEPARATOR">=</xliff:g>Mexico City"</item>
- <item msgid="9089629663998569289">"<xliff:g id="SEPARATOR">=</xliff:g>Monterrey"</item>
- <item msgid="2782276175306930748">"<xliff:g id="SEPARATOR">=</xliff:g>Montevideo"</item>
- <item msgid="4942386959622269480">"<xliff:g id="SEPARATOR">=</xliff:g>Montreal"</item>
- <item msgid="3068203952968918165">"<xliff:g id="SEPARATOR">=</xliff:g>Nasau"</item>
- <item msgid="4234515454127289962">"<xliff:g id="SEPARATOR">=</xliff:g>New York"</item>
- <item msgid="1660551302087304308">"<xliff:g id="SEPARATOR">=</xliff:g>Beulah"</item>
- <item msgid="415823390775449071">"<xliff:g id="SEPARATOR">=</xliff:g>Centar"</item>
- <item msgid="6644186958433380884">"<xliff:g id="SEPARATOR">=</xliff:g>Novi Salem"</item>
- <item msgid="6408587617047971798">"<xliff:g id="SEPARATOR">=</xliff:g>Panama"</item>
- <item msgid="5576899364199447991">"<xliff:g id="SEPARATOR">=</xliff:g>Phoenix"</item>
- <item msgid="5541266909095409447">"<xliff:g id="SEPARATOR">=</xliff:g>Port of Spain"</item>
- <item msgid="6417519313622785932">"<xliff:g id="SEPARATOR">=</xliff:g>Port-au-Prince"</item>
- <item msgid="2078589249210571366">"<xliff:g id="SEPARATOR">=</xliff:g>Portoriko"</item>
- <item msgid="8522030474373927681">"<xliff:g id="SEPARATOR">=</xliff:g>Santo Domingo"</item>
- <item msgid="4763853453317431594">"<xliff:g id="SEPARATOR">=</xliff:g>Sao Paolo"</item>
- <item msgid="2713153284784311646">"<xliff:g id="SEPARATOR">=</xliff:g>St. Johns"</item>
- <item msgid="8252666620333105271">"<xliff:g id="SEPARATOR">=</xliff:g>St. Kitts"</item>
- <item msgid="4851597775036027515">"<xliff:g id="SEPARATOR">=</xliff:g>Sv. Lucija"</item>
- <item msgid="2395485473100271503">"<xliff:g id="SEPARATOR">=</xliff:g>Sv. Tomas"</item>
- <item msgid="4148037555658225145">"<xliff:g id="SEPARATOR">=</xliff:g>Tihuana"</item>
- <item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
- <item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
- <item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Južni pol"</item>
- <item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
- <item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almati"</item>
- <item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Aman"</item>
- <item msgid="1795426532295280371">"<xliff:g id="SEPARATOR">=</xliff:g>Anadir"</item>
- <item msgid="7194236926158343552">"<xliff:g id="SEPARATOR">=</xliff:g>Aktau"</item>
- <item msgid="4796350130854360870">"<xliff:g id="SEPARATOR">=</xliff:g>Bagdad"</item>
- <item msgid="4020105434451091851">"<xliff:g id="SEPARATOR">=</xliff:g>Bahrein"</item>
- <item msgid="3895868797052686484">"<xliff:g id="SEPARATOR">=</xliff:g>Baku"</item>
- <item msgid="228001522630057957">"<xliff:g id="SEPARATOR">=</xliff:g>Bangkok"</item>
- <item msgid="5555647809114820537">"<xliff:g id="SEPARATOR">=</xliff:g>Bejrut"</item>
- <item msgid="2960873998178478784">"<xliff:g id="SEPARATOR">=</xliff:g>Kalkuta"</item>
- <item msgid="8765555959722950691">"<xliff:g id="SEPARATOR">=</xliff:g>Damask"</item>
- <item msgid="4979709428925196546">"<xliff:g id="SEPARATOR">=</xliff:g>Daka"</item>
- <item msgid="310419600200885308">"<xliff:g id="SEPARATOR">=</xliff:g>Dubai"</item>
- <item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
- <item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
- <item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Ši Min"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
- <item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
- <item msgid="758800913783999425">"DŽ<xliff:g id="SEPARATOR">=</xliff:g>Džakarta"</item>
- <item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
- <item msgid="1664426577433326419">"<xliff:g id="SEPARATOR">=</xliff:g>Kabul"</item>
- <item msgid="7700349511508357396">"<xliff:g id="SEPARATOR">=</xliff:g>Karači"</item>
- <item msgid="5273241794521591984">"<xliff:g id="SEPARATOR">=</xliff:g>Katmandu"</item>
- <item msgid="4754850915168634158">"<xliff:g id="SEPARATOR">=</xliff:g>Kuala Lumpur"</item>
- <item msgid="5187849635785055693">"<xliff:g id="SEPARATOR">=</xliff:g>Kuvajt"</item>
- <item msgid="2923385979252179376">"<xliff:g id="SEPARATOR">=</xliff:g>Makau"</item>
- <item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
- <item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Muskat"</item>
- <item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Pnom Pen"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang"</item>
- <item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
- <item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangun"</item>
- <item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Rijad"</item>
- <item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Sajgon"</item>
- <item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Šangaj"</item>
- <item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Tajpeh"</item>
- <item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
- <item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
- <item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulan Bator"</item>
- <item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermudi"</item>
- <item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Kanari"</item>
- <item msgid="4886308317040330383">"<xliff:g id="SEPARATOR">=</xliff:g>Kabo Verde"</item>
- <item msgid="1003307362164178007">"<xliff:g id="SEPARATOR">=</xliff:g>Rejkjavik"</item>
- <item msgid="6742010412815268657">"<xliff:g id="SEPARATOR">=</xliff:g>Stanley"</item>
- <item msgid="5659389449738592757">"<xliff:g id="SEPARATOR">=</xliff:g>Adelaide"</item>
- <item msgid="4567804576346784523">"<xliff:g id="SEPARATOR">=</xliff:g>Brisbane"</item>
- <item msgid="8730590400362815585">"<xliff:g id="SEPARATOR">=</xliff:g>Canberra"</item>
- <item msgid="6416990927714140153">"<xliff:g id="SEPARATOR">=</xliff:g>Darwin"</item>
- <item msgid="3073969292696516135">"<xliff:g id="SEPARATOR">=</xliff:g>Melbourne"</item>
- <item msgid="1719286228375722176">"<xliff:g id="SEPARATOR">=</xliff:g>Novi Južni Wales"</item>
- <item msgid="3663940748056976266">"<xliff:g id="SEPARATOR">=</xliff:g>Perth"</item>
- <item msgid="3383881736858438153">"<xliff:g id="SEPARATOR">=</xliff:g>Queensland"</item>
- <item msgid="971889339240879138">"<xliff:g id="SEPARATOR">=</xliff:g>Sydney"</item>
- <item msgid="5542803438162180311">"<xliff:g id="SEPARATOR">=</xliff:g>Victoria"</item>
- <item msgid="11828841481838883">"<xliff:g id="SEPARATOR">=</xliff:g>Newfoundland"</item>
- <item msgid="1734331918410561807">"<xliff:g id="SEPARATOR">=</xliff:g>Saskatchewan"</item>
- <item msgid="9184412695613864979">"<xliff:g id="SEPARATOR">=</xliff:g>Uskršnji otok"</item>
- <item msgid="1014282454239014527">"<xliff:g id="SEPARATOR">=</xliff:g>Amsterdam"</item>
- <item msgid="4928363054269791193">"<xliff:g id="SEPARATOR">=</xliff:g>Andora"</item>
- <item msgid="912290900213826368">"<xliff:g id="SEPARATOR">=</xliff:g>Atina"</item>
- <item msgid="6097000352459209495">"<xliff:g id="SEPARATOR">=</xliff:g>Belfast"</item>
- <item msgid="3285885824311481790">"<xliff:g id="SEPARATOR">=</xliff:g>Beograd"</item>
- <item msgid="911055049821251982">"<xliff:g id="SEPARATOR">=</xliff:g>Berlin"</item>
- <item msgid="9099244516556291111">"<xliff:g id="SEPARATOR">=</xliff:g>Bratislava"</item>
- <item msgid="158977749726480076">"<xliff:g id="SEPARATOR">=</xliff:g>Brisel"</item>
- <item msgid="8875102297676173346">"<xliff:g id="SEPARATOR">=</xliff:g>Bukurešt"</item>
- <item msgid="804451569472542912">"<xliff:g id="SEPARATOR">=</xliff:g>Budimpešta"</item>
- <item msgid="6827506774445509939">"<xliff:g id="SEPARATOR">=</xliff:g>Kišinjev"</item>
- <item msgid="487345893088732797">"<xliff:g id="SEPARATOR">=</xliff:g>Kopenhagen"</item>
- <item msgid="7760953471297773537">"<xliff:g id="SEPARATOR">=</xliff:g>Dublin"</item>
- <item msgid="323414429034825249">"<xliff:g id="SEPARATOR">=</xliff:g>Gibraltar"</item>
- <item msgid="1785566206078328830">"<xliff:g id="SEPARATOR">=</xliff:g>Helsinki"</item>
- <item msgid="5938185647271923359">"<xliff:g id="SEPARATOR">=</xliff:g>Otok Man"</item>
- <item msgid="5974864320735263245">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
- <item msgid="3567775364750772947">"<xliff:g id="SEPARATOR">=</xliff:g>Kijev"</item>
- <item msgid="540344101798867007">"<xliff:g id="SEPARATOR">=</xliff:g>Lisabon"</item>
- <item msgid="5091062403792923657">"<xliff:g id="SEPARATOR">=</xliff:g>London"</item>
- <item msgid="7075006205000490364">"<xliff:g id="SEPARATOR">=</xliff:g>Luksemburg"</item>
- <item msgid="4901781246584739451">"<xliff:g id="SEPARATOR">=</xliff:g>Madrid"</item>
- <item msgid="9047080834315777144">"<xliff:g id="SEPARATOR">=</xliff:g>Malta"</item>
- <item msgid="8200456520732452034">"<xliff:g id="SEPARATOR">=</xliff:g>Minsk"</item>
- <item msgid="5452744619736513383">"<xliff:g id="SEPARATOR">=</xliff:g>Monako"</item>
- <item msgid="3513517408062322298">"<xliff:g id="SEPARATOR">=</xliff:g>Moskva"</item>
- <item msgid="7917103295878081674">"<xliff:g id="SEPARATOR">=</xliff:g>Oslo"</item>
- <item msgid="4245547231693746977">"<xliff:g id="SEPARATOR">=</xliff:g>Pariz"</item>
- <item msgid="3778652900196715557">"<xliff:g id="SEPARATOR">=</xliff:g>Prag"</item>
- <item msgid="1827175423974383675">"<xliff:g id="SEPARATOR">=</xliff:g>Riga"</item>
- <item msgid="2095130417232677930">"<xliff:g id="SEPARATOR">=</xliff:g>Rim"</item>
- <item msgid="7631654618289353520">"<xliff:g id="SEPARATOR">=</xliff:g>San Marino"</item>
- <item msgid="7219835179107610398">"<xliff:g id="SEPARATOR">=</xliff:g>Sarajevo"</item>
- <item msgid="7199868165463282240">"<xliff:g id="SEPARATOR">=</xliff:g>Simferopol"</item>
- <item msgid="2786395006682246794">"<xliff:g id="SEPARATOR">=</xliff:g>Skoplje"</item>
- <item msgid="4706927178872100023">"<xliff:g id="SEPARATOR">=</xliff:g>Sofija"</item>
- <item msgid="1982417589953195308">"<xliff:g id="SEPARATOR">=</xliff:g>Štokholm"</item>
- <item msgid="1596083919400921960">"<xliff:g id="SEPARATOR">=</xliff:g>Tallin"</item>
- <item msgid="3079313598974879114">"<xliff:g id="SEPARATOR">=</xliff:g>Vatikan"</item>
- <item msgid="6516636001856910888">"<xliff:g id="SEPARATOR">=</xliff:g>Beč"</item>
- <item msgid="6377314532157945456">"<xliff:g id="SEPARATOR">=</xliff:g>Viljnus"</item>
- <item msgid="3427175235616698721">"<xliff:g id="SEPARATOR">=</xliff:g>Varšava"</item>
- <item msgid="8404354243761332922">"<xliff:g id="SEPARATOR">=</xliff:g>Zagreb"</item>
- <item msgid="1457280242717152391">"<xliff:g id="SEPARATOR">=</xliff:g>Cirih"</item>
- <item msgid="1065940089741359291">"<xliff:g id="SEPARATOR">=</xliff:g>Antananarivo"</item>
- <item msgid="5176181880014090003">"<xliff:g id="SEPARATOR">=</xliff:g>Maldivi"</item>
- <item msgid="8281854645557426433">"<xliff:g id="SEPARATOR">=</xliff:g>Mauricijus"</item>
- <item msgid="2686249517389816420">"<xliff:g id="SEPARATOR">=</xliff:g>Auckland"</item>
- <item msgid="279925671775807392">"<xliff:g id="SEPARATOR">=</xliff:g>Fidži"</item>
- <item msgid="7971492669765264840">"<xliff:g id="SEPARATOR">=</xliff:g>Guam"</item>
- <item msgid="889371273355762733">"<xliff:g id="SEPARATOR">=</xliff:g>Honolulu"</item>
- <item msgid="5516500578074269817">"<xliff:g id="SEPARATOR">=</xliff:g>Kiritimati"</item>
- <item msgid="2740704911915073056">"<xliff:g id="SEPARATOR">=</xliff:g>Noumea"</item>
- <item msgid="8732832728949672807">"<xliff:g id="SEPARATOR">=</xliff:g>Samoa"</item>
- <item msgid="6489500698846864993">"<xliff:g id="SEPARATOR">=</xliff:g>Tahiti"</item>
- <item msgid="3983121625709442324">"<xliff:g id="SEPARATOR">=</xliff:g>Antigua"</item>
- <item msgid="2650510570709806322">"<xliff:g id="SEPARATOR">=</xliff:g>Austin"</item>
- <item msgid="5257283506227357911">"<xliff:g id="SEPARATOR">=</xliff:g>Boston"</item>
- <item msgid="6326368958641850267">"<xliff:g id="SEPARATOR">=</xliff:g>Calgary"</item>
- <item msgid="8830116365016232583">"<xliff:g id="SEPARATOR">=</xliff:g>Columbus"</item>
- <item msgid="6986556538341883811">"<xliff:g id="SEPARATOR">=</xliff:g>Dallas"</item>
- <item msgid="836479352500251902">"<xliff:g id="SEPARATOR">=</xliff:g>Knoxville"</item>
- <item msgid="8495291458467378851">"<xliff:g id="SEPARATOR">=</xliff:g>Memphis"</item>
- <item msgid="2788807207554683122">"<xliff:g id="SEPARATOR">=</xliff:g>Miami"</item>
- <item msgid="3984640407077208471">"<xliff:g id="SEPARATOR">=</xliff:g>Minneapolis"</item>
- <item msgid="6997305266329324161">"<xliff:g id="SEPARATOR">=</xliff:g>Ottawa"</item>
- <item msgid="5191741145278683016">"<xliff:g id="SEPARATOR">=</xliff:g>Philadelphia"</item>
- <item msgid="5898032730733441936">"<xliff:g id="SEPARATOR">=</xliff:g>Portland"</item>
- <item msgid="9070160716002203069">"<xliff:g id="SEPARATOR">=</xliff:g>San Diego"</item>
- <item msgid="1829944133410079040">"<xliff:g id="SEPARATOR">=</xliff:g>San Francisco"</item>
- <item msgid="8407905318529692654">"<xliff:g id="SEPARATOR">=</xliff:g>Salt Lake City"</item>
- <item msgid="3091392589347990898">"<xliff:g id="SEPARATOR">=</xliff:g>San Jose"</item>
- <item msgid="7080627414383807284">"<xliff:g id="SEPARATOR">=</xliff:g>San Salvador"</item>
- <item msgid="3430371213266252049">"<xliff:g id="SEPARATOR">=</xliff:g>Seattle"</item>
- <item msgid="9177491393818757071">"<xliff:g id="SEPARATOR">=</xliff:g>St. Louis"</item>
- <item msgid="6234359686676312837">"<xliff:g id="SEPARATOR">=</xliff:g>Washington D.C."</item>
- <item msgid="4325057056005132331">"<xliff:g id="SEPARATOR">=</xliff:g>Houston"</item>
- <item msgid="38148255938075867">"<xliff:g id="SEPARATOR">=</xliff:g>San Antonio"</item>
- <item msgid="3601481860893666763">"<xliff:g id="SEPARATOR">=</xliff:g>Jacksonville"</item>
- <item msgid="3987471437354665534">"<xliff:g id="SEPARATOR">=</xliff:g>Baltimore"</item>
- <item msgid="3389674262267006887">"<xliff:g id="SEPARATOR">=</xliff:g>Nashville"</item>
- <item msgid="7521690366448637309">"<xliff:g id="SEPARATOR">=</xliff:g>Milwaukee"</item>
- <item msgid="2231069593975740859">"<xliff:g id="SEPARATOR">=</xliff:g>Oklahoma City"</item>
- <item msgid="1970008262236914770">"<xliff:g id="SEPARATOR">=</xliff:g>Las Vegas"</item>
- <item msgid="7113811028304266017">"<xliff:g id="SEPARATOR">=</xliff:g>Albuquerque"</item>
- <item msgid="6481469458896644678">"<xliff:g id="SEPARATOR">=</xliff:g>Tucson"</item>
- <item msgid="5970857542995467466">"<xliff:g id="SEPARATOR">=</xliff:g>Sacramento"</item>
- <item msgid="1999267306329214429">"<xliff:g id="SEPARATOR">=</xliff:g>Atlanta"</item>
- <item msgid="8761847787537443648">"<xliff:g id="SEPARATOR">=</xliff:g>Cleveland"</item>
- <item msgid="2987455647692324208">"<xliff:g id="SEPARATOR">=</xliff:g>New Orleans"</item>
- <item msgid="8104109426412705845">"<xliff:g id="SEPARATOR">=</xliff:g>Tampa"</item>
- <item msgid="1410067233842240795">"<xliff:g id="SEPARATOR">=</xliff:g>Pittsburgh"</item>
- <item msgid="3339955740367374442">"<xliff:g id="SEPARATOR">=</xliff:g>Cincinnati"</item>
- <item msgid="6091407424772799978">"<xliff:g id="SEPARATOR">=</xliff:g>Mountain View"</item>
- <item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
- <item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
- <item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
- <item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
- <item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
- <item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
- <item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sana"</item>
- <item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barselona"</item>
- <item msgid="9146746514265554721">"<xliff:g id="SEPARATOR">=</xliff:g>Minhen"</item>
- <item msgid="157866084892734979">"<xliff:g id="SEPARATOR">=</xliff:g>Milano"</item>
- <item msgid="2787346322341414963">"<xliff:g id="SEPARATOR">=</xliff:g>Frankfurt"</item>
- <item msgid="8407511504088696581">"<xliff:g id="SEPARATOR">=</xliff:g>Hanoj"</item>
- <item msgid="5184417944073499453">"<xliff:g id="SEPARATOR">=</xliff:g>Ankara"</item>
- <item msgid="4028784954452197920">"<xliff:g id="SEPARATOR">=</xliff:g>Bangalore"</item>
- <item msgid="190152483600862776">"<xliff:g id="SEPARATOR">=</xliff:g>Brazilija"</item>
- <item msgid="8009516135735104388">"<xliff:g id="SEPARATOR">=</xliff:g>Cape Town"</item>
- <item msgid="6057191797622953016">"<xliff:g id="SEPARATOR">=</xliff:g>Islamabad"</item>
- <item msgid="2702029416591153210">"<xliff:g id="SEPARATOR">=</xliff:g>Rio de Žaneiro"</item>
- <item msgid="1753927312634708098">"<xliff:g id="SEPARATOR">=</xliff:g>Ann Arbor"</item>
- <item msgid="4225721108475278979">"<xliff:g id="SEPARATOR">=</xliff:g>Boulder"</item>
- <item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
- <item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
- <item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzou"</item>
- <item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hajderabad"</item>
- <item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
- <item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
- <item msgid="3593516299122577780">"<xliff:g id="SEPARATOR">=</xliff:g>Santjago"</item>
- <item msgid="2293331653589266583">"<xliff:g id="SEPARATOR">=</xliff:g>Monrovija"</item>
- <item msgid="7899128359620301710">"<xliff:g id="SEPARATOR">=</xliff:g>Kolombo"</item>
- <item msgid="5294489752262543829">"<xliff:g id="SEPARATOR">=</xliff:g>Chihuahua"</item>
- <item msgid="8066356061184206341">"<xliff:g id="SEPARATOR">=</xliff:g>Salvador"</item>
- <item msgid="4806867741334453982">"<xliff:g id="SEPARATOR">=</xliff:g>Gurgaon"</item>
- <item msgid="2585780177649876827">"<xliff:g id="SEPARATOR">=</xliff:g>Manchester"</item>
- <item msgid="234104953526248139">"<xliff:g id="SEPARATOR">=</xliff:g>Kijev"</item>
- <item msgid="5245429461217350012">"<xliff:g id="SEPARATOR">=</xliff:g>St. Petersburg"</item>
- <item msgid="6738531308006017215">"<xliff:g id="SEPARATOR">=</xliff:g>Krakov"</item>
- <item msgid="8972702613339139467">"<xliff:g id="SEPARATOR">=</xliff:g>Vroclav"</item>
- <item msgid="187278924459096566">"<xliff:g id="SEPARATOR">=</xliff:g>Hamburg"</item>
- <item msgid="6173267862207394917">"<xliff:g id="SEPARATOR">=</xliff:g>Oulu"</item>
- <item msgid="5639324478037405990">"<xliff:g id="SEPARATOR">=</xliff:g>Haifa"</item>
- <item msgid="3157180661352354058">"<xliff:g id="SEPARATOR">=</xliff:g>San Juan"</item>
- <item msgid="6995939579417282715">"<xliff:g id="SEPARATOR">=</xliff:g>Tegusigalpa"</item>
- <item msgid="1641840677391275004">"<xliff:g id="SEPARATOR">=</xliff:g>Paramaribo"</item>
- <item msgid="7317049454800260290">"<xliff:g id="SEPARATOR">=</xliff:g>Kito"</item>
- <item msgid="4524380876433343244">"LJ<xliff:g id="SEPARATOR">=</xliff:g>Ljubljana"</item>
- </string-array>
-</resources>
diff --git a/res/values-bs-rBA/strings.xml b/res/values-bs-rBA/strings.xml
deleted file mode 100644
index d9c411b..0000000
--- a/res/values-bs-rBA/strings.xml
+++ /dev/null
@@ -1,415 +0,0 @@
-<?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:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="app_label" msgid="6674495003718166674">"Sat"</string>
- <string name="alarm_list_title" msgid="7589940465292950600">"Alarmi"</string>
- <string name="add_alarm" msgid="5976616107390962899">"Dodaj alarm"</string>
- <string name="menu_desk_clock" msgid="3241995064554071588">"Stoni sat"</string>
- <string name="menu_edit_alarm" msgid="7204602994918829751">"Uredi alarm"</string>
- <string name="delete_alarm" msgid="3457780990646206817">"Izbriši alarm"</string>
- <string name="enable_alarm" msgid="1834599140632142536">"Uključi alarm"</string>
- <string name="disable_alarm" msgid="5889378670229554109">"Isključi alarm"</string>
- <string name="delete_alarm_confirm" msgid="6578572637340860840">"Izbrisati ovaj alarm?"</string>
- <string name="show_clock" msgid="8358759982675616915">"Prikaži sat"</string>
- <string name="hide_clock" msgid="3217727306480505694">"Sakrij sat"</string>
- <string name="label" msgid="162189613902857319">"Oznaka"</string>
- <string name="default_label" msgid="5590025289805630372">"Alarm"</string>
- <string name="set_alarm" msgid="9148359866152726808">"Postavi alarm"</string>
- <string name="alarm_vibrate" msgid="3476686921490362230">"Vibracija"</string>
- <string name="alarm_repeat" msgid="7242985466344233206">"Ponovi"</string>
- <string name="alert" msgid="6506982899651975645">"Melodija zvona alarma"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Prilagođena melodija zvona"</string>
- <string name="ringtone" msgid="9110746249688559579">"Melodija zvona"</string>
- <string name="time" msgid="8067216534232296518">"Vrijeme"</string>
- <string name="alarm_tomorrow" msgid="131356848787643420">"Sutra"</string>
- <string name="alarm_today" msgid="7873594221106531654">"Danas"</string>
- <string name="alarm_alert_wake_up" msgid="6790780716498252583">"Buđenje!"</string>
- <string name="alarm_alert_off_action_text" msgid="2459925305288819812">"Isključeno"</string>
- <string name="alarm_alert_dismiss_text" msgid="4942914605480888820">"Odbaci"</string>
- <string name="alarm_alert_dismiss_now_text" msgid="3272183025444682500">"Odbaci sada"</string>
- <string name="alarm_missed_title" msgid="3828345099754063392">"Propušteni alarm"</string>
- <string name="alarm_missed_text" msgid="6585658367289194023">"<xliff:g id="ALARM_TIME">%s</xliff:g> - <xliff:g id="ALARM_LABEL">%s</xliff:g>"</string>
- <string name="alarm_alert_snoozed_text" msgid="7064642998528766113">"Odloženo"</string>
- <plurals name="alarm_alert_snooze_duration" formatted="false" msgid="7844300009062867865">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> min.</item>
- <item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> min.</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> min.</item>
- </plurals>
- <string name="alarm_alert_off_text" msgid="4472073417593915002">"Alarm isključen"</string>
- <string name="alarm_alert_snooze_text" msgid="1774416052207651584">"Odloži"</string>
- <plurals name="alarm_alert_snooze_set" formatted="false" msgid="3212729193036041768">
- <item quantity="one">Odlaganje na <xliff:g id="MINUTES">%d</xliff:g> minutu.</item>
- <item quantity="few">Odlaganje na <xliff:g id="MINUTES">%d</xliff:g> minute.</item>
- <item quantity="other">Odlaganje na <xliff:g id="MINUTES">%d</xliff:g> minuta.</item>
- </plurals>
- <string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Odlaganje do <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Predstojeći alarm"</string>
- <string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Propušteni alarm je izbrisan"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Preostalo je manje od minute"</item>
- <item msgid="83197792732433351">"Preostalo <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Preostalo <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Preostalo <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
- <string-array name="alarm_set">
- <item msgid="6450913786084215050">"Alarm postavljen za manje od 1 minute od sada."</item>
- <item msgid="6002066367368421848">"Alarm postavljen za <xliff:g id="DAYS">%1$s</xliff:g> od sada."</item>
- <item msgid="8824719306247973774">"Alarm postavljen za <xliff:g id="HOURS">%2$s</xliff:g> od sada."</item>
- <item msgid="8182406852935468862">"Alarm postavljen za <xliff:g id="DAYS">%1$s</xliff:g> i <xliff:g id="HOURS">%2$s</xliff:g> od sada."</item>
- <item msgid="2532279224777213194">"Alarm postavljen za <xliff:g id="MINUTES">%3$s</xliff:g> od sada."</item>
- <item msgid="5936557894247187717">"Alarm postavljen za <xliff:g id="DAYS">%1$s</xliff:g> i <xliff:g id="MINUTES">%3$s</xliff:g> od sada."</item>
- <item msgid="9115697840826129603">"Alarm postavljen za <xliff:g id="HOURS">%2$s</xliff:g> i <xliff:g id="MINUTES">%3$s</xliff:g> od sada."</item>
- <item msgid="2332583385137381060">"Alarm postavljen 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> od sada."</item>
- </string-array>
- <plurals name="days" formatted="false" msgid="3706846447285206235">
- <item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> dan</item>
- <item quantity="few"><xliff:g id="NUMBER">%s</xliff:g> dana</item>
- <item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> dana</item>
- </plurals>
- <plurals name="hours" formatted="false" msgid="3871283109767171655">
- <item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> sat</item>
- <item quantity="few"><xliff:g id="NUMBER">%s</xliff:g> sata</item>
- <item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> sati</item>
- </plurals>
- <plurals name="minutes" formatted="false" msgid="5484431721696058697">
- <item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> minuta</item>
- <item quantity="few"><xliff:g id="NUMBER">%s</xliff:g> minute</item>
- <item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> minuta</item>
- </plurals>
- <string name="every_day" msgid="4100909974923444602">"Svakog dana"</string>
- <string name="day_concat" msgid="971998564991636532">", "</string>
- <string name="clock_instructions" msgid="2656876819515011590">"Odaberite sat"</string>
- <string name="analog_gadget" msgid="1670505720837152766">"Analogni sat"</string>
- <string name="help" msgid="7786263119482654015">"pomoć"</string>
- <string name="settings" msgid="5849739030579520686">"Postavke"</string>
- <string name="snooze_duration_title" msgid="1097309861110780483">"Dužina odlaganja"</string>
- <plurals name="snooze_duration" formatted="false" msgid="3112918131095248271">
- <item quantity="one"><xliff:g id="NUMBER">%s</xliff:g> minuta</item>
- <item quantity="few"><xliff:g id="NUMBER">%s</xliff:g> minute</item>
- <item quantity="other"><xliff:g id="NUMBER">%s</xliff:g> minuta</item>
- </plurals>
- <plurals name="snooze_picker_label" formatted="false" msgid="322739253661747732">
- <item quantity="one">minuta</item>
- <item quantity="few">minute</item>
- <item quantity="other">minuta</item>
- </plurals>
- <string name="auto_silence_title" msgid="2012754009554434544">"Utišaj nakon"</string>
- <plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
- <item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuta</item>
- <item quantity="few"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minute</item>
- <item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuta</item>
- </plurals>
- <string name="auto_silence_never" msgid="4821982647348750809">"Nikad"</string>
- <string-array name="auto_silence_entries">
- <item msgid="3024545954917711306">"1 minuta"</item>
- <item msgid="5431906692406316549">"5 minuta"</item>
- <item msgid="7742728812068919959">"10 minuta"</item>
- <item msgid="2855948657259647629">"15 minuta"</item>
- <item msgid="6330196381284475079">"20 minuta"</item>
- <item msgid="7809240121716151904">"25 minuta"</item>
- <item msgid="4278641338024561333">"Nikad"</item>
- </string-array>
- <string name="week_start_title" msgid="4268917518596832096">"Prvi dan sedmice"</string>
- <string-array name="week_start_entries">
- <item msgid="9010198173394482639">"subota"</item>
- <item msgid="3993530639455360921">"nedjelja"</item>
- <item msgid="8594709368683324282">"ponedjeljak"</item>
- </string-array>
- <string name="done" msgid="6509722361933858451">"Gotovo"</string>
- <string name="revert" msgid="9100911171235162926">"Vrati"</string>
- <string name="delete" msgid="5732434972457000541">"Izbriši"</string>
- <string name="alarm_volume_title" msgid="8506245173912428522">"Jačina zvuka alarma"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Nečujno"</string>
- <string name="alarm_notify_text" msgid="4891014685945904766">"Odložite ili odbacite alarm."</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="4819324081410990368">"Alarm postavljen za <xliff:g id="TIME">%s</xliff:g>. Dodirnite da otkažete."</string>
- <string name="volume_button_setting_title" msgid="6937131248843413357">"Dugmad za jačinu zvuka"</string>
- <string name="volume_button_dialog_title" msgid="8768042543750036853">"Radnja dugmeta"</string>
- <string-array name="volume_button_setting_entries">
- <item msgid="7972756698723318690">"Odloži"</item>
- <item msgid="3450979320164769576">"Odbaci"</item>
- <item msgid="6302517608411378024">"Ne radi ništa"</item>
- </string-array>
- <string name="default_ringtone_setting_title" msgid="4549726190682964245">"Postavi zadanu melodiju zvona"</string>
- <string name="alarm_button_description" msgid="740283647046258651">"Alarmi"</string>
- <string name="gallery_button_description" msgid="1151743663255257668">"Galerija"</string>
- <string name="music_button_description" msgid="1626593420810117999">"Muzika"</string>
- <string name="nightmode_button_description" msgid="990894208217576381">"Priguši"</string>
- <string name="home_button_description" msgid="3383859096809056157">"Pokretač"</string>
- <string name="desk_clock_button_description" msgid="4207371097361657274">"Prikaz sata"</string>
- <string name="label_description" msgid="8736179296142915727">"Oznaka"</string>
- <string name="ringtone_description" msgid="7580922112921069925">"Melodija zvona"</string>
- <string name="weather_fetch_failure" msgid="3425804832021006835">"Informacije o vremenskim prilikama trenutno nisu dostupne."</string>
- <string name="alarm_klaxon_service_desc" msgid="2147506334302260256">"Usluga reproduciranja zvuka za alarme postavljene u aplikaciji Sat."</string>
- <string name="loading_ringtone" msgid="6523322777415268044">"Učitavanje melodije zvona…"</string>
- <string name="timer_ring_service_desc" msgid="2620214305660322415">"Usluga reproduciranja zvuka za tajmere postavljene u aplikaciji Sat."</string>
- <string name="control_set_alarm" msgid="2194676418924016327">"Postavi alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
- <string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
- <string name="menu_timer" msgid="6459070074762877114">"Tajmer"</string>
- <string name="menu_clock" msgid="5612760670606829805">"Sat"</string>
- <string name="menu_stopwatch" msgid="3396117705293574701">"Štoperica"</string>
- <string name="button_alarms" msgid="3907838219512538763">"Dodaj alarm"</string>
- <string name="button_cities" msgid="4555761857494501363">"Gradovi"</string>
- <string name="button_menu" msgid="6050484561842120282">"Više opcija"</string>
- <string name="menu_item_settings" msgid="1413723516369078665">"Postavke"</string>
- <string name="menu_item_help" msgid="4570953476186849841">"Pomoć"</string>
- <string name="menu_item_night_mode" msgid="3486930302245398975">"Noćni način rada"</string>
- <string name="menu_item_sort_by_gmt_offset" msgid="3120860422682721706">"Sortiraj po vremenu"</string>
- <string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sortiraj po nazivu"</string>
- <string name="selected_cities_label" msgid="3607479399424246605">"Odabrani gradovi"</string>
- <string name="sw_resume_button" msgid="2569360966002022248">"Nastavi"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Pokreni"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Zaustavi"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Krug"</string>
- <string name="sw_reset_button" msgid="6616804728322906117">"Poništi"</string>
- <string name="sw_share_button" msgid="4478648110382859382">"Podijeli"</string>
- <string name="hours_label" msgid="3393478155635368097">"h"</string>
- <string name="minutes_label" msgid="3568098128251438588">"m"</string>
- <string name="seconds_label" msgid="124655952824003246">"s"</string>
- <string name="hours_label_description" msgid="8652842524970971830">"sati"</string>
- <string name="minutes_label_description" msgid="965686733490357796">"minuta"</string>
- <string name="seconds_label_description" msgid="3821620053141299692">"sekundi"</string>
- <string name="zero" msgid="7102083421938355017">"0"</string>
- <string name="sw_share_main" msgid="7703563468204234405">"Moje vrijeme je <xliff:g id="TIME">%s</xliff:g>"</string>
- <string name="sw_share_laps" msgid="614390674795945007">"Vremena krugova:"</string>
- <string name="sw_notification_lap_number" msgid="3535420316052647126">"Krug <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
- <plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> sat</item>
- <item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> sata</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> sati</item>
- </plurals>
- <plurals name="Nminutes_description" formatted="false" msgid="6373760365221990859">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> minuta</item>
- <item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> minute</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> minuta</item>
- </plurals>
- <plurals name="Nseconds_description" formatted="false" msgid="6456500168536594889">
- <item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> sekunda</item>
- <item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> sekunde</item>
- <item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> sekundi</item>
- </plurals>
- <string name="timer_add_timer" msgid="862733633862574752">"Dodaj tajmer"</string>
- <string name="timer_start" msgid="6158486445614356442">"Pokreni"</string>
- <string name="timer_delete" msgid="8699122001991909302">"Izbriši"</string>
- <string name="timer_descriptive_delete" msgid="8794915342760383536">"Izbriši <xliff:g id="NUMBER_STRING">%s</xliff:g>"</string>
- <string name="timer_plus_one" msgid="6631211310420106116">"Dodajte 1 minutu"</string>
- <string name="timer_plus_1_min" msgid="8645224089494875062">"Dodaj 1 min."</string>
- <string name="timer_stop" msgid="3361154678667736722">"Zaustavi"</string>
- <string name="timer_done" msgid="2375990511982914051">"Gotovo"</string>
- <string name="timer_reset" msgid="7848424809190171640">"Poništi"</string>
- <string name="timer_cancel" msgid="3572868404230815644">"Otkaži"</string>
- <string name="timer_times_up" msgid="9190440395938519009">"Vrijeme je isteklo"</string>
- <string name="timer_notification_label" msgid="4933184831583137249">"Tajmer"</string>
- <string name="timers_max_count_reached" msgid="9140022846793903813">"Maksimalno 4 tajmera"</string>
- <string-array name="sw_share_strings">
- <item msgid="842841032273927988">"Ni ptica trkačica nije ovako brza."</item>
- <item msgid="6332879039890727169">"Uživaj, zasluženo je."</item>
- <item msgid="815382761274660130">"Androidi su brzi, ali ne kao ti!"</item>
- <item msgid="7916250650982813737">"Uh."</item>
- <item msgid="6836603904515182333">"Vrhunsko vrij3m3."</item>
- <item msgid="7508085100680861631">"Monstruozno brzo."</item>
- <item msgid="5961245252909589573">"Ovo je bilo brže od munje, hoćemo još jednom?"</item>
- <item msgid="5211891900854545940">"Idemo ludo, idemo jako."</item>
- <item msgid="9071353477103826053">"Tebi se baš žuri."</item>
- <item msgid="3785193933691117181">"Brže od svjetlosti."</item>
- </string-array>
- <string name="home_label" msgid="4436139365695453870">"Matična"</string>
- <string name="cities_activity_title" msgid="8552462751129256730">"Gradovi"</string>
- <string name="clock_settings" msgid="8317286807280600391">"Sat"</string>
- <string name="clock_style" msgid="2265011060429742344">"Stil"</string>
- <string-array name="clock_style_entries">
- <item msgid="917900462224167608">"Analogni"</item>
- <item msgid="8483930821046925592">"Digitalni"</item>
- </string-array>
- <string name="automatic_home_clock" msgid="6274174710735449252">"Automatski sat s vremenom kod kuće"</string>
- <string name="automatic_home_clock_summary" msgid="6020476321040807273">"Dok putujete u područje u kojem vrijedi drugo vrijeme, dodajte sat za vrijeme kod kuće"</string>
- <string name="home_time_zone" msgid="9199730676287974501">"Matična vremenska zona"</string>
- <string name="home_time_zone_title" msgid="807894493443834624">"Matična vremenska zona"</string>
- <string name="time_picker_cancel" msgid="7437106489606013077">"Otkaži"</string>
- <string name="time_picker_set" msgid="331153175471468051">"Uredu"</string>
- <string name="time_picker_time_seperator" msgid="7484926510054777041">":"</string>
- <string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
- <string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
- <string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
- <string-array name="timezone_labels">
- <item msgid="5495601234086197399">"Marshallovi otoci"</item>
- <item msgid="4196408495909011020">"Otok Midway"</item>
- <item msgid="1414384194857730006">"Havaji"</item>
- <item msgid="2687091371581931926">"Aljaska"</item>
- <item msgid="1922100269679049660">"Pacifičko vrijeme"</item>
- <item msgid="7156402158716866161">"Tihuana"</item>
- <item msgid="1144117502254612241">"Arizona"</item>
- <item msgid="101284182011722637">"Chihuahua"</item>
- <item msgid="689121094232986897">"Planinsko vrijeme"</item>
- <item msgid="5445331923942302756">"Centralna Amerika"</item>
- <item msgid="2749806434052452351">"Centralno vrijeme"</item>
- <item msgid="3997138870229703753">"Mexico City"</item>
- <item msgid="5425567073027744888">"Saskatchewan"</item>
- <item msgid="2877342865396629368">"Bogota"</item>
- <item msgid="568682398893899670">"Istočno vrijeme"</item>
- <item msgid="668135984541863866">"Venecuela"</item>
- <item msgid="3737474220861486223">"Atlantsko vrijeme (Barbados)"</item>
- <item msgid="6279116051273436870">"Atlantsko vrijeme (Kanada)"</item>
- <item msgid="8513382867172014244">"Manaus"</item>
- <item msgid="7776299003105932407">"Santiago"</item>
- <item msgid="8636989494746218677">"Newfoundland"</item>
- <item msgid="4402541016410147505">"Brazilija"</item>
- <item msgid="2251184440733164084">"Buenos Aires"</item>
- <item msgid="6202926618569004969">"Grenland"</item>
- <item msgid="2355275037115290628">"Montevideo"</item>
- <item msgid="1377549694711708945">"Srednje Atlantsko"</item>
- <item msgid="3457671272126347981">"Azori"</item>
- <item msgid="3659315141063710840">"Zelenortski otoci"</item>
- <item msgid="1260941741802367635">"Kazablanka"</item>
- <item msgid="8275203689687954762">"London, Dablin"</item>
- <item msgid="5970179539479320905">"Amsterdam, Berlin"</item>
- <item msgid="5396319478750517962">"Beograd"</item>
- <item msgid="8688787475056663004">"Brisel"</item>
- <item msgid="3415827874921681622">"Sarajevo"</item>
- <item msgid="402008965928320066">"Windhoek"</item>
- <item msgid="6436942724959275569">"Zapadnoafričko vrijeme"</item>
- <item msgid="954536568417204026">"Aman, Jordan"</item>
- <item msgid="8932745482008902551">"Atina, Istanbul"</item>
- <item msgid="320025725949024510">"Bejrut, Liban"</item>
- <item msgid="7242083112551905970">"Kairo"</item>
- <item msgid="7241520146011450419">"Helsinki"</item>
- <item msgid="2717065017510546526">"Jeruzalem"</item>
- <item msgid="8698556287741466553">"Minsk"</item>
- <item msgid="1797598357342084506">"Harare"</item>
- <item msgid="5169119919905066998">"Bagdad"</item>
- <item msgid="2615788116201065182">"Moskva"</item>
- <item msgid="9084354867885584646">"Kuvajt"</item>
- <item msgid="1351570519986178268">"Najrobi"</item>
- <item msgid="7094569580635877460">"Teheran"</item>
- <item msgid="3953138772617909704">"Baku"</item>
- <item msgid="2868893113598800752">"Tbilisi"</item>
- <item msgid="7088581865802476373">"Erevan"</item>
- <item msgid="1941122257623887992">"Dubai"</item>
- <item msgid="9194797225058249720">"Kabul"</item>
- <item msgid="6486569254364577332">"Islamabad, Karači"</item>
- <item msgid="5487724896895412089">"Uralsk"</item>
- <item msgid="364906869710826982">"Ekaterinburg"</item>
- <item msgid="2106505051751383358">"Kolkata"</item>
- <item msgid="6851586621581501447">"Šri Lanka"</item>
- <item msgid="800438544128213134">"Katmandu"</item>
- <item msgid="6173621471007643021">"Astana"</item>
- <item msgid="8645125891971581128">"Jangon"</item>
- <item msgid="2886407505119737794">"Krasnojarsk"</item>
- <item msgid="3408222398188107090">"Bangkok"</item>
- <item msgid="4441612937172851228">"Peking"</item>
- <item msgid="4936715789028996930">"Hong Kong"</item>
- <item msgid="4261031143777385525">"Irkutsk"</item>
- <item msgid="3538060959338191835">"Kuala Lumpur"</item>
- <item msgid="1438847562643099201">"Perth"</item>
- <item msgid="3063913827688244383">"Tajpeh"</item>
- <item msgid="3502757135046564209">"Seul"</item>
- <item msgid="6107588684519111669">"Tokio, Osaka"</item>
- <item msgid="4350769099755608471">"Jakutsk"</item>
- <item msgid="2422707004533526462">"Adelaide"</item>
- <item msgid="1292192084554134339">"Darwin"</item>
- <item msgid="1320883699470001716">"Brisbane"</item>
- <item msgid="5137198806146386527">"Hobart"</item>
- <item msgid="5920063686933941174">"Sydney, Canberra"</item>
- <item msgid="615906039696009425">"Vladivostok"</item>
- <item msgid="7738680449356275374">"Guam"</item>
- <item msgid="2882915026380778227">"Magadan"</item>
- <item msgid="8255615641810148152">"Auckland"</item>
- <item msgid="3027153773466391728">"Fidži"</item>
- <item msgid="5911600083231840181">"Tonga"</item>
- <item msgid="5176858645450908751">"Džakarta"</item>
- </string-array>
- <string name="alarm_settings" msgid="2947147071388290814">"Alarmi"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Usluga štoperice za pokretanje obavještenja."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Zaustavljeno"</string>
- <string name="description_direction_right" msgid="5709209043267548985">"Prevucite desno da odbacite"</string>
- <string name="description_direction_left" msgid="7448141043674998679">"Prevucite lijevo da odložite"</string>
- <string name="description_direction_both" msgid="1841309486023845685">"Prevucite lijevo da odložite ili desno da odbacite"</string>
- <string name="timer_stopped" msgid="2730331837832462008">"Tajmer zaustavljen"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Zaustavljenih tajmera: <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string name="all_timers_stopped_notif" msgid="278532320068394600">"Dodirnite da vidite tajmer"</string>
- <string name="timers_in_use" msgid="5570729467344408506">"Tajmeri: <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string name="next_timer_notif" msgid="6136454740115613653">"Naredni tajmer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
- <string name="screensaver_settings" msgid="7013450738357352801">"Postavke za čuvara ekrana"</string>
- <string name="night_mode_title" msgid="5983813889469616299">"Noćni način rada"</string>
- <string name="night_mode_summary" msgid="1017350187324162631">"Veoma prigušen ekran (za mračne prostorije)"</string>
- <string name="expand_alarm" msgid="7392616528943305020">"Proširi alarm"</string>
- <string name="collapse_alarm" msgid="3561772046433483980">"Skupi alarm"</string>
- <string name="alarm_undo" msgid="5710042601177655254">"opozovi radnju"</string>
- <string name="alarm_deleted" msgid="6131529309389084785">"Alarm izbrisan"</string>
- <string name="slash" msgid="2077577763821006919">"/"</string>
- <string name="world_day_of_week_label" msgid="5911196322328341288">"/ <xliff:g id="LABEL">%s</xliff:g>"</string>
- <string name="next_alarm_description" msgid="2650244835760747046">"Naredni alarm: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="alarms_selected" msgid="1075308195332888260">"Odabrano <xliff:g id="ALARMS">%d</xliff:g>"</string>
- <string name="deleted_message" msgid="1220848140260509437">"Izbrisan"</string>
- <plurals name="alarm_delete_confirmation" formatted="false" msgid="3591262014329613293">
- <item quantity="one">Izbrisati odabrane alarme?</item>
- <item quantity="few">Izbrisati odabrane alarme?</item>
- <item quantity="other">Izbrisati odabrane alarme?</item>
- </plurals>
- <string name="timer_delete_confirmation" msgid="2815524107015816453">"Izbrisati ovaj tajmer?"</string>
- <string name="city_delete_confirmation" msgid="1783441538785676299">"Ukloniti ovaj grad?"</string>
- <string name="digital_gadget" msgid="2326954556720571358">"Digitalni sat"</string>
- <string name="no_alarms" msgid="6429431324842022917">"Nema alarma"</string>
- <string name="no_alarms_set" msgid="4887558279496044764">"Nema postavljenih alarma"</string>
- <string name="no_upcoming_alarms" msgid="2889840988069436254">"NEMA PREDSTOJEĆIH ALARMA"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm prij."</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
- <string name="invalid_time" msgid="2782334750243998633">"Nevažeće vrijeme <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
- <string name="no_alarm_at" msgid="8140632482969193119">"Nema alarma u <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
- <string name="no_scheduled_alarms" msgid="2115420148192753534">"Nema zakazanih alarma"</string>
- <string name="no_label_specified" msgid="2008482054428460626">"Nije navedena oznaka"</string>
- <string name="no_alarms_with_label" msgid="6250998794542941665">"Nijedan alarm nema oznaku"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Štoperica je već pokrenuta"</string>
- <string name="stopwatch_isnt_running" msgid="7147219965448204727">"Štoperica nije pokrenuta"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Štoperica se ne može poništiti jer je pokrenuta"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Štoperica zaustavljena"</string>
- <string name="stopwatch_reset" msgid="7585914953721021042">"Poništavanje štoperice"</string>
- <string name="stopwatch_lapped" msgid="5844686448815550482">"Štoperica je izmjerila krug"</string>
- <string name="stopwatch_started" msgid="7843882246387176304">"Štoperica pokrenuta"</string>
- <string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Nema zakazanih alarma za ovo vrijeme"</string>
- <string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarm za <xliff:g id="ALARM_TIME">%s</xliff:g> odbačen"</string>
- <string name="alarm_is_set" msgid="5503226382620011088">"Alarm postavljen za <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Nije postavljen tajmer"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Tajmer izbrisan"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Tajmer je već pokrenut"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Nije moguće izvršiti zahtjev, dostupno je više tajmera"</string>
- <string name="timer_started" msgid="6715582052946641641">"Tajmer pokrenut"</string>
- <string name="timer_created" msgid="4381027137335885547">"Tajmer kreiran"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Nevažeća dužina tajmera"</string>
- <string name="timer_was_reset" msgid="6495796785185062631">"Tajmer poništen"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Tajmer se ne može poništiti jer je još uvijek aktivan. Zaustavite tajmer kako biste ga poništili."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Tajmer je već zaustavljen"</string>
- <string name="no_city_selected" msgid="1007596865203283741">"Nije odabran grad"</string>
- <string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Grad koji ste naveli nije dostupan"</string>
- <string name="the_city_already_added" msgid="3799050213771793020">"Taj grad je već dodan"</string>
- <string name="city_added" msgid="1335509457349179514">"<xliff:g id="CITY_NAME">%s</xliff:g> dodan"</string>
- <string name="city_deleted" msgid="3935141305276867838">"<xliff:g id="CITY_NAME">%s</xliff:g> izbrisan"</string>
- <string name="alarm_cant_be_dismissed_still_more_than_24_hours_away" msgid="8810520940995307437">"<xliff:g id="ALARM_TIME">%s</xliff:g> alarm se još ne može odbaciti; do njega ima više od 24 sata"</string>
- <string name="dismiss_alarm" msgid="7204593078688533541">"Odbaci alarm"</string>
- <string name="pick_alarm_to_dismiss" msgid="5408769235866082896">"Odaberite koji će se alarm odbaciti"</string>
- <string name="no_firing_alarms" msgid="4986161963178722289">"Nema aktivnih alarma"</string>
- <string name="alarm_is_snoozed" msgid="7044644119744928846">"Alarm za <xliff:g id="ALARM_TIME">%s</xliff:g> odložen na 10 minuta"</string>
-</resources>
diff --git a/res/values-ca/array.xml b/res/values-ca/array.xml
index 0bf7ccf..e66cc43 100644
--- a/res/values-ca/array.xml
+++ b/res/values-ca/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Gran Turca, Illa"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"C<xliff:g id="SEPARATOR">=</xliff:g>Ciutat de Guatemala"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havana, L\'"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Pol sud"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Pol sud<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Masqat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangun"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riad"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seül"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Xangai"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Xangai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tòquio"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tòquio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulan Bator"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermudes, Illes"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Canàries, Illes"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Pequín"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Pequín<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Bombai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sanà"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Canton"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Canton<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 8727b62..88e5611 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Mostra el rellotge"</string>
<string name="hide_clock" msgid="3217727306480505694">"Amaga el rellotge"</string>
<string name="label" msgid="162189613902857319">"Nom de l\'alarma"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Activada"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Desactivada"</string>
<string name="default_label" msgid="5590025289805630372">"Alarma"</string>
<string name="set_alarm" msgid="9148359866152726808">"Defineix l\'alarma"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibra"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Repeteix"</string>
<string name="alert" msgid="6506982899651975645">"So de l\'alarma"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"So de trucada personalitzat"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Temporitzador finalitzat"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silenci"</string>
<string name="ringtone" msgid="9110746249688559579">"So"</string>
<string name="time" msgid="8067216534232296518">"Hora"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Demà"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Es posposarà fins a les <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Pròxima alarma"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"L\'alarma perduda s\'ha suprimit"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Queda menys d\'un minut"</item>
- <item msgid="83197792732433351">"Queden <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Queden <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Queden <xliff:g id="HOURS">%1$s</xliff:g> i <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Queda menys d\'un minut"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Temps restant: <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"restant"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"restants"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"L\'alarma sonarà d\'aquí a menys d\'un minut."</item>
<item msgid="6002066367368421848">"L\'alarma sonarà d\'aquí a <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minuts</item>
<item quantity="one">minut</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Apuja el volum gradualment"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Desactivat"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> segons"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"segons"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Silencia després de"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuts</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Reverteix"</string>
<string name="delete" msgid="5732434972457000541">"Suprimeix"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volum de l\'alarma"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silenciosa"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silenci"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Desconegut"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Posposa o ignora l\'alarma"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (repetida)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarma definida per a les <xliff:g id="TIME">%s</xliff:g>. Toca per cancel·lar."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"S\'està carregant el so..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Servei de reproducció de temporitzadors definits al rellotge."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Defineix l\'alarma"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarma"</string>
<string name="menu_timer" msgid="6459070074762877114">"Temporitzador"</string>
<string name="menu_clock" msgid="5612760670606829805">"Rellotge"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Ordena per nom"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Ciutats seleccionades"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Reprèn"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Inicia"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Atura"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Volta"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Restableix"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Inicia"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Atura"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Volta"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Comparteix"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"La meva hora: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Durada de les voltes:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Volta <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Núm. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Núm. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> hores</item>
<item quantity="one">1 hora</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Afegeix 1 minut"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Afegeix 1 minut"</string>
<string name="timer_stop" msgid="3361154678667736722">"Atura"</string>
- <string name="timer_done" msgid="2375990511982914051">"Fet"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Atura els temporitzadors"</string>
<string name="timer_reset" msgid="7848424809190171640">"Restableix"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Cancel·la"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"S\'ha cancel·lat el temporitzador"</string>
<string name="timer_times_up" msgid="9190440395938519009">"S\'ha esgotat el temps"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Temporitzadors caducats: <xliff:g id="NUM_TIMERS">%d</xliff:g>"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Temporitzador"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"4 temporitzadors com a màxim"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Posa en pausa"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Restableix tots els temporitz."</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Ets un boig del volant."</item>
<item msgid="6332879039890727169">"Gaudeix dels fruits de la teva feina."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Ciutats"</string>
<string name="clock_settings" msgid="8317286807280600391">"Rellotge"</string>
<string name="clock_style" msgid="2265011060429742344">"Estil"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Canvia la data i l\'hora"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analògic"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"S\'ha marcat <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"S\'ha desmarcat <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Illes Marshall"</item>
<item msgid="4196408495909011020">"Illa de Midway"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmes"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Servei de cronòmetre per executar les notificacions."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Aturat"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Processa les accions de les notificacions del temporitzador."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Processa les accions de les notificacions del cronòmetre."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Aturat"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Llisca cap a la dreta per ignorar"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Llisca cap a l\'esquerra per posposar"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Llisca cap a l\'esquerra per posposar l\'alarma o cap a la dreta per ignorar-la"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Temporitzadors"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"So de trucada del temporitzador"</string>
<string name="timer_stopped" msgid="2730331837832462008">"S\'ha aturat el temporitzador"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"S\'han aturat <xliff:g id="NUMBER">%d</xliff:g> temporitzadors"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Temporitzador en pausa"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> temporitzadors en pausa"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Toca per veure els temporitzadors"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> temporitzadors"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Pròxim: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Cap alarma"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Sense alarmes"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NO HI HA ALARMES PROPERAMENT"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"L\'hora no és vàlida (<xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>)"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"No hi ha cap alarma a les <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"No s\'ha programat cap alarma"</string>
<string name="no_label_specified" msgid="2008482054428460626">"No s\'ha especificat cap etiqueta"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"No hi ha cap alarma que contingui l\'etiqueta"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"El cronòmetre ja està en marxa"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"El cronòmetre no s\'ha posat en marxa"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"El cronòmetre no es pot restablir perquè està en funcionament"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"S\'ha aturat el cronòmetre"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"El cronòmetre s\'ha aturat"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"S\'ha restablert el cronòmetre"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"El cronòmetre ha completat una volta"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"S\'ha iniciat el cronòmetre"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"No hi ha cap alarma programada per a aquesta hora"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"L\'alarma <xliff:g id="ALARM_TIME">%s</xliff:g> s\'ha ignorat"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"L\'alarma està definida per a les <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"No s\'ha definit cap temporitzador"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"El temporitzador s\'ha suprimit"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"El temporitzador ja està en marxa"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"No es pot completar la sol·licitud. Hi ha diversos temporitzadors disponibles"</string>
- <string name="timer_started" msgid="6715582052946641641">"El temporitzador s\'ha iniciat"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"No hi ha temporitzadors"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Hi ha més d\'un temporitzador"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"El temporitzador s\'ha suprimit."</string>
<string name="timer_created" msgid="4381027137335885547">"S\'ha creat el temporitzador"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"La durada del temporitzador no és vàlida"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"El temporitzador s\'ha restablert"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"El temporitzador no es pot restablir perquè encara està en marxa. Atura\'l per restablir-lo."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"El temporitzador ja s\'ha aturat"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"El temporitzador s\'ha suprimit"</string>
+ <string name="timer_started" msgid="6715582052946641641">"El temporitzador s\'ha iniciat"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"La durada del temporitzador no és vàlida"</string>
<string name="no_city_selected" msgid="1007596865203283741">"No s\'ha seleccionat cap ciutat"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"La ciutat que has especificat no està disponible"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Aquesta ciutat ja s\'ha afegit"</string>
diff --git a/res/values-cs/array.xml b/res/values-cs/array.xml
index 52c372a..fe2918d 100644
--- a/res/values-cs/array.xml
+++ b/res/values-cs/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"C<xliff:g id="SEPARATOR">=</xliff:g>Ciudad de Guatemala"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"J<xliff:g id="SEPARATOR">=</xliff:g>Jižní pól"</item>
+ <item msgid="498429228419399474">"J<xliff:g id="SEPARATOR">=</xliff:g>Jižní pól<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Ammán"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Či Minovo Město"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jeruzalém"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Maskat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnompenh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pchjongjang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pchjongjang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"K<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangún"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Rijád"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Soul"</item>
- <item msgid="583367295371395814">"Š<xliff:g id="SEPARATOR">=</xliff:g>Šanghaj"</item>
+ <item msgid="3814881931186962624">"Š<xliff:g id="SEPARATOR">=</xliff:g>Šanghaj<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Tchaj-pej"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Tchaj-pej<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teherán"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulánbátar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermudy"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanárské ostrovy"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Dauhá"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Peking<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"B<xliff:g id="SEPARATOR">=</xliff:g>Bombaj"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Dillí"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Ósaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Ósaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Láhaur"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>San\'á"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanton"</item>
+ <item msgid="2077617905582224600">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanton<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hajdarábád"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 0dc2ce8..9b7d80d 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Zobrazit hodiny"</string>
<string name="hide_clock" msgid="3217727306480505694">"Skrýt hodiny"</string>
<string name="label" msgid="162189613902857319">"Popisek"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Zapnuto"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Vypnuto"</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="6506982899651975645">"Vyzváněcí tón budíku"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Vlastní vyzváněcí tón"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Časovač vypršel"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Tiché"</string>
<string name="ringtone" msgid="9110746249688559579">"Vyzváněcí tón"</string>
<string name="time" msgid="8067216534232296518">"Čas"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Zítra"</string>
@@ -62,12 +65,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Odloženo do <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Nadcházející budík"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Zmeškaný budík byl smazán"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Zbývá méně než minuta"</item>
- <item msgid="83197792732433351">"zbývá <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"zbývá <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"zbývá <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Zbývající čas: méně než minuta"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g>: <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g>: <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Zbývající čas: <xliff:g id="HOURS">%1$s</xliff:g> h <xliff:g id="MINUTES">%2$s</xliff:g> min"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"Zbývající čas"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"Zbývající čas"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Budík se spustí za méně než 1 minutu."</item>
<item msgid="6002066367368421848">"Budík se spustí za <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -115,6 +118,10 @@
<item quantity="other">minut</item>
<item quantity="one">1 minuta</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Postupně zvyšovat hlasitost"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Vypnuto"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> s"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"s"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Ztišit po"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="few"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuty</item>
@@ -142,7 +149,8 @@
<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="silent_alarm_summary" msgid="8605302849408279221">"Tichý"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Tiché"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Neznámé"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Odložit nebo zrušit budík"</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="4819324081410990368">"Budík je nastaven na <xliff:g id="TIME">%s</xliff:g>. Dotykem jej zrušíte."</string>
@@ -167,8 +175,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Načítání vyzváněcího tónu..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Služba přehrávání zvuku časovačů nastavených v aplikaci Hodiny."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Nastavit budík"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Budík"</string>
<string name="menu_timer" msgid="6459070074762877114">"Časovač"</string>
<string name="menu_clock" msgid="5612760670606829805">"Hodiny"</string>
@@ -183,10 +189,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Seřadit podle názvu"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Vybraná města"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Obnovit"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Spustit"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Zastavit"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Úsek"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Resetovat"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Spustit"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pozastavit"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Úsek"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Sdílet"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -198,10 +204,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Můj čas je <xliff:g id="TIME">%s</xliff:g>."</string>
<string name="sw_share_laps" msgid="614390674795945007">"Časy etap:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. úsek"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Č. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Č. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> hodiny</item>
<item quantity="many"><xliff:g id="NUMBER">%d</xliff:g> hodiny</item>
@@ -227,12 +229,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Přidat 1 minutu"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Přidat 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Zastavit"</string>
- <string name="timer_done" msgid="2375990511982914051">"Hotovo"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Zastavit všechny časovače"</string>
<string name="timer_reset" msgid="7848424809190171640">"Resetovat"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Zrušit"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Časovač zrušen"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Čas vypršel"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Vypršené časovače: <xliff:g id="NUM_TIMERS">%d</xliff:g>"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Časovač"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Můžete mít maximálně čtyři časovače"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pozastavit"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Reset. časovače"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Jste rychlí jako ďas."</item>
<item msgid="6332879039890727169">"Vychutnejte si plody své práce."</item>
@@ -249,6 +255,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Města"</string>
<string name="clock_settings" msgid="8317286807280600391">"Hodiny"</string>
<string name="clock_style" msgid="2265011060429742344">"Styl"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Změnit datum a čas"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogové"</item>
<item msgid="8483930821046925592">"Digitální"</item>
@@ -263,6 +270,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"–"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Město <xliff:g id="CITY_NAME">%s</xliff:g> je zaškrtnuto"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Město <xliff:g id="CITY_NAME">%s</xliff:g> není zaškrtnuto"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshallovy ostrovy"</item>
<item msgid="4196408495909011020">"Midwayské ostrovy"</item>
@@ -351,13 +360,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Budíky"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Služba Stopky ke spouštění upozornění."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Zastaveno"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Zpracovává akce z oznámení časovače."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Zpracovává akce z oznámení stopek."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Pozastaveno"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Přejetím prstem vpravo budík zrušíte."</string>
<string name="description_direction_left" msgid="7448141043674998679">"Přejetím prsem vlevo budík odložíte."</string>
<string name="description_direction_both" msgid="1841309486023845685">"Přejetím vlevo budík odložíte, přejetím vpravo jej zrušíte"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Časovače"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Vyzváněcí tón časovače"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Časovač zastaven"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Zastavené časovače (<xliff:g id="NUMBER">%d</xliff:g>)"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Časovač pozastaven"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Pozastavené časovače: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Dotykem zobrazíte časovače"</string>
<string name="timers_in_use" msgid="5570729467344408506">"Časovače (<xliff:g id="NUMBER">%d</xliff:g>)"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Další časovač: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -385,35 +398,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Žádné budíky"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Budíky nejsou nastaveny."</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ŽÁDNÉ PLÁNOVANÉ BUDÍKY"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Čas <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g> je neplatný"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Na čas <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> není nastaven žádný budík."</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Žádné plánované budíky"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Není zadán žádný štítek"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Tento štítek neobsahují žádné budíky"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stopky již běží"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stopky neběží"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stopky nelze skrýt, protože jsou momentálně spuštěny"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stopky byly zastaveny"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stopky byly pozastaveny"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stopky byly resetovány"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stopky zaznamenaly mezičas"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stopky byly spuštěny"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Na tento čas není naplánován žádný budík."</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Budík v čase <xliff:g id="ALARM_TIME">%s</xliff:g> byl zrušen"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Budík je nastaven na <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Není nastaven žádný časovač"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Časovač byl smazán"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Časovač již běží"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Požadavek nelze dokončit: časovačů je k dispozici několik."</string>
- <string name="timer_started" msgid="6715582052946641641">"Časovač byl spuštěn"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Nejsou nastaveny žádné časovače"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Je nastaveno několik časovačů"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Časovač byl odstraněn."</string>
<string name="timer_created" msgid="4381027137335885547">"Časovač byl vytvořen"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Neplatná délka časovače"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Časovač byl resetován"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Časovač nelze resetovat, protože stále běží. Chcete-li jej resetovat, nejprve jej zastavte."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Časovač již byl zastaven"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Časovač byl smazán"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Časovač byl spuštěn"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Neplatná délka časovače"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Není vybráno žádné město"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Zadané město není k dispozici"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Toto město již bylo přidáno"</string>
diff --git a/res/values-da/array.xml b/res/values-da/array.xml
index 0096ea1..cb8d357 100644
--- a/res/values-da/array.xml
+++ b/res/values-da/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala City"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Sydpolen"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Sydpolen<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Kanariske Øer"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 9fdd766..7d26fd0 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"Til"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Fra"</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="6506982899651975645">"Ringetone for alarm"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Tilpasset ringtone"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Timeren er udløbet"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Lydløs"</string>
<string name="ringtone" msgid="9110746249688559579">"Ringetone"</string>
<string name="time" msgid="8067216534232296518">"Tid"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"I morgen"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Snoozer indtil <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Kommende alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Din ubesvarede alarm er blevet slettet"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Mindre end 1 minut tilbage"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> tilbage"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> tilbage"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> tilbage"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Mindre end ét minut tilbage"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> og <xliff:g id="MINUTES">%2$s</xliff:g> tilbage"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"tilbage"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"tilbage"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarmen er indstillet til mindre end 1 minut fra nu."</item>
<item msgid="6002066367368421848">"Alarmen er indstillet til <xliff:g id="DAYS">%1$s</xliff:g> fra nu."</item>
@@ -101,6 +104,10 @@
<item quantity="one">minutter</item>
<item quantity="other">minutter</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Skru gradvist op for lyden"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Fra"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> sekunder"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sekunder"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Slukkes efter"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutter</item>
@@ -126,7 +133,8 @@
<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="silent_alarm_summary" msgid="8605302849408279221">"Lydløs"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Lydløs"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Ukendt"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Udsæt eller afvis alarm."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (udsat)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarmen er indstillet til <xliff:g id="TIME">%s</xliff:g>. Vælg for at annullere."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Indlæser ringetone..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Tjenesten til afspilning af alarmlyd, der angives i uret."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Indstil alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Timer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Ur"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sortér efter navn"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Valgte byer"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Genoptag"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stop"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Omgang"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Nulstil"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pause"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Omgang"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Del"</string>
<string name="hours_label" msgid="3393478155635368097">"t"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Min tid er <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Omgangstider:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Omgang <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> timer</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> timer</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Tilføj 1 minut"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Tilføj 1 min."</string>
<string name="timer_stop" msgid="3361154678667736722">"Stop"</string>
- <string name="timer_done" msgid="2375990511982914051">"Afvis"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Stop alle timere"</string>
<string name="timer_reset" msgid="7848424809190171640">"Nulstil"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Annuller"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Timeren blev annulleret"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Tiden er gået"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> timere er udløbet"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Timer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Maks. fire timere"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Sæt på pause"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Nulstil alle timere"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Du er en rigtig fartdjævel."</item>
<item msgid="6332879039890727169">"Nyd frugterne af dit arbejde."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Byer"</string>
<string name="clock_settings" msgid="8317286807280600391">"Ur"</string>
<string name="clock_style" msgid="2265011060429742344">"Urtype"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Skift dato & klokkeslæt"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analog"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> blev markeret"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Markeringen af <xliff:g id="CITY_NAME">%s</xliff:g> blev fjernet"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshalløerne"</item>
<item msgid="4196408495909011020">"Midwayøen"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmer"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Stopurstjeneste, der skal køre underretningen."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Stoppet"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Behandler handlinger fra underretninger for timeren."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Behandler handlinger fra underretninger for stopuret."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Sat på pause"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Stryg til højre for at slå fra"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Stryg til venstre for at udsætte"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Stryg til venstre for at udsætte eller til højre for at slå fra"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Timere"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ringetone for timeren"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Ur stoppet"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> timere stoppet"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Timeren blev sat på pause"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> timere blev sat på pause"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Tryk for at se dine timere"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> timere"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Næste timer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Ingen alarmer"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Ingen alarmer"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"INGEN KOMMENDE ALARMER"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"t.mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k.mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, t.mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Ugyldigt klokkeslæt <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Der er ingen alarm kl. <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Der er ikke nogen planlagte alarmer"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Der er ikke angivet nogen etiket"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Der er ingen alarmer med etiketten"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stopuret er allerede i gang"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stopuret er ikke i gang"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stopuret kan ikke nulstilles, fordi det kører"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stopuret er stoppet"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stopuret er sat på pause"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stopuret blev nulstillet"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stopuret har registreret en omgangstid"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stopuret er startet"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Der er ikke angivet nogen alarm på dette tidspunkt"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarmen kl. <xliff:g id="ALARM_TIME">%s</xliff:g> er afvist"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarmen er indstillet til <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Der er ikke angivet nogen timer"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Timeren blev slettet"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Timeren er allerede i gang"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Din anmodning kunne ikke gennemføres. Der er flere relevante timere."</string>
- <string name="timer_started" msgid="6715582052946641641">"Timeren blev igangsat"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Der er ikke nogen timere"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Der er mere end én timer"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Timeren blev fjernet."</string>
<string name="timer_created" msgid="4381027137335885547">"Timeren er oprettet"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Ugyldig timerlængde"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Timeren blev nulstillet"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Timeren kan ikke nulstilles, da den stadig er i gang. Stop timeren for at nulstille den."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Timeren er allerede stoppet"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Timeren blev slettet"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Timeren blev igangsat"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Ugyldig timerlængde"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Der er ikke valgt nogen by"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Den by, du har angivet, er ikke tilgængelig"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Byen er allerede blevet tilføjet"</string>
diff --git a/res/values-de/array.xml b/res/values-de/array.xml
index 644ddf1..d17cfb7 100644
--- a/res/values-de/array.xml
+++ b/res/values-de/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala-Stadt"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havanna"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Südpol"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Südpol<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho-Chi-Minh-Stadt"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Maskat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pjöngjang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pjöngjang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangun"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riad"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulan-Bator"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Kanarische Inseln"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Peking<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sanaa"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index e1e5c36..b2687a3 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Uhr anzeigen"</string>
<string name="hide_clock" msgid="3217727306480505694">"Uhr ausblenden"</string>
<string name="label" msgid="162189613902857319">"Name"</string>
+ <string name="on_switch" msgid="2297966258029227449">"An"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Aus"</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="6506982899651975645">"Weckton"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Benutzerdefinierter Klingelton"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Timer abgelaufen"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Lautlos"</string>
<string name="ringtone" msgid="9110746249688559579">"Klingelton"</string>
<string name="time" msgid="8067216534232296518">"Uhrzeit"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Morgen"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Schlummern bis <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Anstehender Weckruf"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Der entgangene Weckruf wurde gelöscht."</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Nur noch weniger als eine Minute"</item>
- <item msgid="83197792732433351">"Noch <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Noch <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Noch <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Nur noch weniger als eine Minute"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Noch <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"Noch"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"Noch"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Der Wecker klingelt in weniger als einer Minute."</item>
<item msgid="6002066367368421848">"Der Wecker klingelt in <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="other">Minuten</item>
<item quantity="one">Minute</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Lautstärke schrittweise erhöhen"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Aus"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> Sekunden"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"Sekunden"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Stummschalten nach"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> Minuten</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Rückgängig"</string>
<string name="delete" msgid="5732434972457000541">"Löschen"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Lautstärke für Wecker"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Lautlos-Modus"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Lautlos"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Unbekannt"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Schlummern oder Beenden"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (Schlummern)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Wecker für <xliff:g id="TIME">%s</xliff:g> gestellt. Zum Abbrechen berühren."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Klingelton wird geladen..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Tonwiedergabedienst für in der Weckfunktion eingestellte Timer"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Wecker einstellen"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Wecker"</string>
<string name="menu_timer" msgid="6459070074762877114">"Timer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Uhr"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Nach Namen sortieren"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Ausgewählte Städte"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Fortsetzen"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Starten"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Anhalten"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Runde"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Reset"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Starten"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Anhalten"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Runde"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Teilen"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Meine Zeit: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Rundenzeiten:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. Runde"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Nr. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Nr. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> Stunden</item>
<item quantity="one">1 Stunde</item>
@@ -205,28 +207,33 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 Minute hinzufügen"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 Min. hinzufügen"</string>
<string name="timer_stop" msgid="3361154678667736722">"Anhalten"</string>
- <string name="timer_done" msgid="2375990511982914051">"Fertig"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Alle Timer anhalten"</string>
<string name="timer_reset" msgid="7848424809190171640">"Reset"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Abbrechen"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Timer abgebrochen"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Zeit ist abgelaufen."</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> Timer abgelaufen"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Timer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Es können maximal 4 Timer gestellt werden."</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pausieren"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Alle Timer zurücksetzen"</string>
<string-array name="sw_share_strings">
- <item msgid="842841032273927988">"Du bist teuflisch schnell."</item>
- <item msgid="6332879039890727169">"Ernte die Früchte deiner Arbeit!"</item>
- <item msgid="815382761274660130">"Du bist ja schneller als ein Roboter!"</item>
+ <item msgid="842841032273927988">"Sie sind teuflisch schnell."</item>
+ <item msgid="6332879039890727169">"Ernten Sie die Früchte Ihrer Arbeit!"</item>
+ <item msgid="815382761274660130">"Sie sind ja schneller als ein Roboter!"</item>
<item msgid="7916250650982813737">"Puh!"</item>
<item msgid="6836603904515182333">"L33t-Zeiten"</item>
<item msgid="7508085100680861631">"Wahnsinnsgeschwindigkeit"</item>
<item msgid="5961245252909589573">"Let\'s do the time warp again!"</item>
<item msgid="5211891900854545940">"Just a jump to the left."</item>
- <item msgid="9071353477103826053">"Du hast es ganz schön eilig."</item>
+ <item msgid="9071353477103826053">"Sie haben es ganz schön eilig."</item>
<item msgid="3785193933691117181">"Photonengeschwindigkeit"</item>
</string-array>
<string name="home_label" msgid="4436139365695453870">"Zuhause"</string>
<string name="cities_activity_title" msgid="8552462751129256730">"Städte"</string>
<string name="clock_settings" msgid="8317286807280600391">"Uhr"</string>
<string name="clock_style" msgid="2265011060429742344">"Design"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Datum & Uhrzeit ändern"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analog"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ausgewählt"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> nicht ausgewählt"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshallinseln"</item>
<item msgid="4196408495909011020">"Midwayinseln"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Wecker"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Benachrichtigung über Stoppuhr-Dienst"</string>
- <string name="swn_stopped" msgid="783124901663086172">"Gestoppt"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Verarbeitet Aktionen von Timer-Benachrichtigungen."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Verarbeitet Aktionen von Stoppuhr-Benachrichtigungen."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Angehalten"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Zum Schließen nach rechts wischen"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Zum Schlummern nach links wischen"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Zum Schlummern nach links, zum Schließen nach rechts wischen"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Timer"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Timer-Klingelton"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Timer gestoppt"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> Timer gestoppt"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Timer pausiert"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> Timer pausiert"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Zum Ansehen der Timer berühren"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> Timer"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Nächster Timer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Keine Wecker"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Keine Wecker"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"Keine anstehenden Alarme"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Ungültige Zeit: <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Kein Weckruf um <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> vorhanden"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Keine eingerichteten Weckrufe"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Kein Name angegeben"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Der Name ist in keinem Weckruf enthalten."</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Die Stoppuhr wird bereits ausgeführt."</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Die Stoppuhr wird nicht ausgeführt."</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Die Stoppuhr kann nicht zurückgesetzt werden, da sie gerade läuft."</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stoppuhr angehalten"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stoppuhr angehalten"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stoppuhr zurückgesetzt"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Runden für Stoppuhr festgelegt"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stoppuhr gestartet"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Für diese Zeit ist kein Weckruf eingerichtet."</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Weckruf um <xliff:g id="ALARM_TIME">%s</xliff:g> wurde verworfen."</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Weckzeit: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Kein Timer eingerichtet"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Timer gelöscht"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Der Timer wird bereits ausgeführt."</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Anfrage kann nicht ausgeführt werden. Mehrere Timer verfügbar."</string>
- <string name="timer_started" msgid="6715582052946641641">"Timer gestartet"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Keine Timer vorhanden"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Es sind mehrere Timer vorhanden."</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Der Timer wurde entfernt."</string>
<string name="timer_created" msgid="4381027137335885547">"Timer erstellt"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Ungültige Dauer für Timer"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Timer zurückgesetzt"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Der Timer kann nicht zurückgesetzt werden, da er noch ausgeführt wird. Halte den Timer an, um ihn zurückzusetzen."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Der Timer wurde bereits beendet."</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Timer gelöscht"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Timer gestartet"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Ungültige Dauer für Timer"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Keine Stadt ausgewählt"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Die angegebene Stadt ist nicht verfügbar."</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Diese Stadt wurde bereits hinzugefügt."</string>
diff --git a/res/values-el/array.xml b/res/values-el/array.xml
index a081c04..5cb1ae1 100644
--- a/res/values-el/array.xml
+++ b/res/values-el/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"Φ<xliff:g id="SEPARATOR">=</xliff:g>Φορταλέζα"</item>
<item msgid="5801558418916235541">"Κ<xliff:g id="SEPARATOR">=</xliff:g>Κόκμπερν Τάουν"</item>
<item msgid="2103759276235503048">"Γ<xliff:g id="SEPARATOR">=</xliff:g>Γρενάδα"</item>
- <item msgid="1490069759176391533">"Γ<xliff:g id="SEPARATOR">=</xliff:g>Γουατεμάλα"</item>
+ <item msgid="6216160110733510854">"Γ<xliff:g id="SEPARATOR">=</xliff:g>Γουατεμάλα Σίτι"</item>
<item msgid="525959305652046261">"Γ<xliff:g id="SEPARATOR">=</xliff:g>Γουιάνα"</item>
<item msgid="7565596629973190931">"Χ<xliff:g id="SEPARATOR">=</xliff:g>Χάλιφαξ"</item>
<item msgid="3811169155065582644">"Α<xliff:g id="SEPARATOR">=</xliff:g>Αβάνα"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"Τ<xliff:g id="SEPARATOR">=</xliff:g>Τορόντο"</item>
<item msgid="1506838283840737263">"Β<xliff:g id="SEPARATOR">=</xliff:g>Βανκούβερ"</item>
<item msgid="8935386104773857399">"Γ<xliff:g id="SEPARATOR">=</xliff:g>Γουίνιπεγκ"</item>
- <item msgid="1132634022412399582">"Ν<xliff:g id="SEPARATOR">=</xliff:g>Νότιο Πόλο"</item>
+ <item msgid="498429228419399474">"Ν<xliff:g id="SEPARATOR">=</xliff:g>Νότιο Πόλο<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"Λ<xliff:g id="SEPARATOR">=</xliff:g>Λονγκιαρμπίεν"</item>
<item msgid="3784788073896028355">"Α<xliff:g id="SEPARATOR">=</xliff:g>Αλμάτι"</item>
<item msgid="7895695236056852523">"Α<xliff:g id="SEPARATOR">=</xliff:g>Αμάν"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"Γ<xliff:g id="SEPARATOR">=</xliff:g>Γάζα"</item>
<item msgid="2359068282340162319">"Χ<xliff:g id="SEPARATOR">=</xliff:g>Χεβρώνα"</item>
<item msgid="6223396610551759129">"Χ<xliff:g id="SEPARATOR">=</xliff:g>Χο Τσι Μινχ"</item>
- <item msgid="4731022818651322736">"Χ<xliff:g id="SEPARATOR">=</xliff:g>Χονγκ Κονγκ"</item>
+ <item msgid="3439764751788710130">"Χ<xliff:g id="SEPARATOR">=</xliff:g>Χονγκ Κονγκ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"Κ<xliff:g id="SEPARATOR">=</xliff:g>Κωνσταντινούπολη"</item>
<item msgid="758800913783999425">"Τ<xliff:g id="SEPARATOR">=</xliff:g>Τζακάρτα"</item>
<item msgid="8956406398692698126">"Ι<xliff:g id="SEPARATOR">=</xliff:g>Ιερουσαλήμ"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"Μ<xliff:g id="SEPARATOR">=</xliff:g>Μανίλα"</item>
<item msgid="6033964325069060422">"Μ<xliff:g id="SEPARATOR">=</xliff:g>Μουσκάτ"</item>
<item msgid="6077458941399984780">"Π<xliff:g id="SEPARATOR">=</xliff:g>Πνομ Πενχ"</item>
- <item msgid="935474308903572975">"Π<xliff:g id="SEPARATOR">=</xliff:g>Πιονγκγιάνγκ"</item>
+ <item msgid="1245515372520913197">"Π<xliff:g id="SEPARATOR">=</xliff:g>Πιονγκγιάνγκ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Κ<xliff:g id="SEPARATOR">=</xliff:g>Κατάρ"</item>
<item msgid="1667243110545095146">"Ρ<xliff:g id="SEPARATOR">=</xliff:g>Ρανγκούν"</item>
<item msgid="4460370766685855731">"Ρ<xliff:g id="SEPARATOR">=</xliff:g>Ριάντ"</item>
<item msgid="4229224905931739201">"Σ<xliff:g id="SEPARATOR">=</xliff:g>Σαϊγκόν"</item>
<item msgid="8705359848250215620">"Σ<xliff:g id="SEPARATOR">=</xliff:g>Σεούλ"</item>
- <item msgid="583367295371395814">"Σ<xliff:g id="SEPARATOR">=</xliff:g>Σαγκάη"</item>
+ <item msgid="3814881931186962624">"Σ<xliff:g id="SEPARATOR">=</xliff:g>Σαγκάη<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"Σ<xliff:g id="SEPARATOR">=</xliff:g>Σιγκαπούρη"</item>
- <item msgid="1972491729911039207">"Τ<xliff:g id="SEPARATOR">=</xliff:g>Ταϊπέι"</item>
+ <item msgid="8982451946156859368">"Τ<xliff:g id="SEPARATOR">=</xliff:g>Ταϊπέι<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"Τ<xliff:g id="SEPARATOR">=</xliff:g>Τεχεράνη"</item>
<item msgid="8629402941285674273">"Τ<xliff:g id="SEPARATOR">=</xliff:g>Τελ Αβίβ"</item>
- <item msgid="8499164674454654525">"Τ<xliff:g id="SEPARATOR">=</xliff:g>Τόκιο"</item>
+ <item msgid="76330681636547168">"Τ<xliff:g id="SEPARATOR">=</xliff:g>Τόκιο<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"Ο<xliff:g id="SEPARATOR">=</xliff:g>Ουλάν Μπατόρ"</item>
<item msgid="2028626988021468640">"Β<xliff:g id="SEPARATOR">=</xliff:g>Βερμούδα"</item>
<item msgid="4527109966513690429">"Κ<xliff:g id="SEPARATOR">=</xliff:g>Κανάρια"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"Ρ<xliff:g id="SEPARATOR">=</xliff:g>Ρίνο"</item>
<item msgid="9155068631060038769">"Μ<xliff:g id="SEPARATOR">=</xliff:g>Μπλακ Ροκ Σίτι"</item>
<item msgid="8498761319928979900">"Ν<xliff:g id="SEPARATOR">=</xliff:g>Ντόχα"</item>
- <item msgid="8307897251088048641">"Π<xliff:g id="SEPARATOR">=</xliff:g>Πεκίνο"</item>
+ <item msgid="5327010922199714808">"Π<xliff:g id="SEPARATOR">=</xliff:g>Πεκίνο<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"Β<xliff:g id="SEPARATOR">=</xliff:g>Βομβάη"</item>
<item msgid="6668274273067049125">"Δ<xliff:g id="SEPARATOR">=</xliff:g>Δελχί"</item>
- <item msgid="2933410189478233292">"Ο<xliff:g id="SEPARATOR">=</xliff:g>Οζάκα"</item>
+ <item msgid="7199039603593847813">"Ο<xliff:g id="SEPARATOR">=</xliff:g>Οζάκα<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"Λ<xliff:g id="SEPARATOR">=</xliff:g>Λαχόρη"</item>
<item msgid="1448378291805481500">"Σ<xliff:g id="SEPARATOR">=</xliff:g>Σαναά"</item>
<item msgid="5233119846682408301">"Β<xliff:g id="SEPARATOR">=</xliff:g>Βαρκελώνη"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"Κ<xliff:g id="SEPARATOR">=</xliff:g>Κέιμπριτζ"</item>
<item msgid="759409010285366934">"Κ<xliff:g id="SEPARATOR">=</xliff:g>Κίρκλαντ"</item>
<item msgid="6308007059287569663">"Μ<xliff:g id="SEPARATOR">=</xliff:g>Μάντισον"</item>
- <item msgid="6971636434858330021">"Κ<xliff:g id="SEPARATOR">=</xliff:g>Κουανγκτσόου"</item>
+ <item msgid="2077617905582224600">"Κ<xliff:g id="SEPARATOR">=</xliff:g>Κουανγκτσόου<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"Χ<xliff:g id="SEPARATOR">=</xliff:g>Χαϊντεραμπάντ"</item>
<item msgid="3032295682584784261">"Ρ<xliff:g id="SEPARATOR">=</xliff:g>Ρέστον"</item>
<item msgid="7722837296297332268">"Μ<xliff:g id="SEPARATOR">=</xliff:g>Μπέλο Οριζόντε"</item>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index ae97436..ba757dd 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Εμφάνιση ρολογιού"</string>
<string name="hide_clock" msgid="3217727306480505694">"Απόκρυψη ρολογιού"</string>
<string name="label" msgid="162189613902857319">"Ετικέτα"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Ενεργό"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Ανενεργό"</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="6506982899651975645">"Ήχος κλήσης ξυπνητηριού"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Προσαρμοσμένος ήχος κλήσης"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Η αντίστροφη μέτρηση έληξε"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Αθόρυβο"</string>
<string name="ringtone" msgid="9110746249688559579">"Ήχος κλήσης"</string>
<string name="time" msgid="8067216534232296518">"Ώρα"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Αύριο"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Αναβολή έως τις <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Επόμενο ξυπνητήρι"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Η ειδοποίηση που παραβλέψατε έχει διαγραφεί"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Απομένει λιγότερο από ένα λεπτό"</item>
- <item msgid="83197792732433351">"Απομένουν <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Απομένουν <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Απομένουν <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Απομένει λιγότερο από ένα λεπτό"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Απομένουν <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"απομένουν"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"απομένουν"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Το ξυπνητήρι έχει οριστεί σε λιγότερο από 1 λεπτό από τώρα."</item>
<item msgid="6002066367368421848">"Το ξυπνητήρι έχει οριστεί σε <xliff:g id="DAYS">%1$s</xliff:g> από τώρα."</item>
@@ -101,6 +104,10 @@
<item quantity="other">λεπτά</item>
<item quantity="one">λεπτό</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Σταδιακή αύξηση της έντασης"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Ανενεργό"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> δευτερόλεπτα"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"δευτερόλεπτα"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Σίγαση μετά"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> λεπτά</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Επαναφορά"</string>
<string name="delete" msgid="5732434972457000541">"Διαγραφή"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Ένταση ήχου ξυπνητηριού"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Σίγαση"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Αθόρυβο"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Άγνωστο"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Αναβολή αφύπνισης ή παράβλεψη ξυπνητηριού."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (αναβολή)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Το ξυπνητήρι ρυθμίστηκε για τις <xliff:g id="TIME">%s</xliff:g>. Αγγίξτε για να ακυρώσετε."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Φόρτωση ήχου κλήσης"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Η υπηρεσία αναπαραγωγής ήχου για ξυπνητήρια έχει ρυθμιστεί στο Ρολόι."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Ορισμός ξυπνητηριού"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Ξυπνητήρι"</string>
<string name="menu_timer" msgid="6459070074762877114">"Χρονόμετρο"</string>
<string name="menu_clock" msgid="5612760670606829805">"Ρολόι"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Ταξινόμηση κατά όνομα"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Επιλεγμένες πόλεις"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Συνέχιση"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Εκκίνηση"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Διακοπή"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Γύρος"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Επαναφορά"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Εκκίνηση"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Παύση"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Γύρος"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Κοινή χρήση"</string>
<string name="hours_label" msgid="3393478155635368097">"ω."</string>
<string name="minutes_label" msgid="3568098128251438588">"λ."</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Ο χρόνος μου είναι <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Χρόνοι γύρων:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Γύρος <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ώρες</item>
<item quantity="one">1 ώρα</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Προσθήκη 1 λεπτού"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Προσθήκη 1 λεπτού"</string>
<string name="timer_stop" msgid="3361154678667736722">"Διακοπή"</string>
- <string name="timer_done" msgid="2375990511982914051">"Τέλος"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Διακοπή των χρονομέτρων"</string>
<string name="timer_reset" msgid="7848424809190171640">"Επαναφορά"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Ακύρωση"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Το χρονόμετρο ακυρώθηκε"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Ο χρόνος έχει τελειώσει"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> χρονόμετρα έληξαν"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Χρονόμετρο"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"4 χρονόμετρα το μέγιστο"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Παύση"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Επαν. χρονομ."</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Είστε πάρα πολύ γρήγοροι."</item>
<item msgid="6332879039890727169">"Απολαύστε"</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Πόλεις"</string>
<string name="clock_settings" msgid="8317286807280600391">"Ρολόι"</string>
<string name="clock_style" msgid="2265011060429742344">"Στυλ"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Αλλαγή ημερομηνίας και ώρας"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Αναλογικό"</item>
<item msgid="8483930821046925592">"Ψηφιακό"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Έχει επιλεχθεί η πόλη <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Έχει καταργηθεί η επιλογή της πόλης <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Νήσοι Μάρσαλ"</item>
<item msgid="4196408495909011020">"Νήσος Μιντγουέι"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Τζακάρτα"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Ξυπνητήρια"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Υπηρεσία χρονόμετρου για την εκτέλεση της ειδοποίησης."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Διακόπηκε"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Επεξεργάζεται ενέργειες από τις ειδοποιήσεις αντίστροφης μέτρησης."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Επεξεργάζεται ενέργειες από τις ειδοποιήσεις του χρονομέτρου."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Σε παύση"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Σύρετε δεξιά για παράβλεψη"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Σύρετε αριστερά για αναβολή"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Σύρετε το δάχτυλό σας προς τα αριστερά για αναβολή ή προς τα δεξιά για απόρριψη"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Χρονόμετρα"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ήχος χρονόμετρου"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Το χρονόμετρο διακόπηκε"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> ξυπνητήρια διακόπηκαν"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Χρονόμετρο σε παύση"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> χρονόμετρα σε παύση"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Αγγίξτε για να δείτε τα ξυπνητήρια σας"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> χρονόμετρα"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Επόμενο χρονόμετρο: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Δεν υπάρχουν ξυπνητήρια"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Χωρίς ειδοπ."</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ΧΩΡΙΣ ΠΡΟΣΕΧΕΙΣ ΕΙΔΟΠΟΙΗΣΕΙΣ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"ω:λλ π.μ."</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"ω:λλ"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"ΗΗΗ, ω:λλ π.μ."</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"ΗΗΗ, ω: λλ"</string>
<string name="invalid_time" msgid="2782334750243998633">"Μη έγκυρη ώρα <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Δεν υπάρχει ξυπνητήρι στις <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Δεν υπάρχουν προγραμματισμένα ξυπνητήρια"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Δεν έχει καθοριστεί ετικέτα"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Δεν υπάρχουν ειδοποιήσεις που περιέχουν την ετικέτα"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Το χρονόμετρο λειτουργεί ήδη"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Το χρονόμετρο δεν λειτουργεί"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Δεν είναι δυνατή η εκ νέου ρύθμιση του χρονομέτρου επειδή είναι σε λειτουργία αυτήν τη στιγμή"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Το χρονόμετρο σταμάτησε"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Το χρονόμετρο τέθηκε σε παύση"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Έγινε επαναφορά του χρονομέτρου"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Επανάληψη χρονομέτρου"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Το χρονόμετρο ξεκίνησε"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Δεν προγραμματίστηκε κανένα ξυπνητήρι γι\' αυτήν την ώρα"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Έγινε παράβλεψη του ξυπνητηριού <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Το ξυπνητήρι ορίστηκε στις <xliff:g id="ALARM_TIME">%s</xliff:g>."</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Δεν ορίστηκε αντίστροφη μέτρηση"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Η αντίστροφη μέτρηση διαγράφηκε"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Η αντίστροφη μέτρηση ξεκίνησε ήδη"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Δεν είναι δυνατή η ολοκλήρωση του αιτήματος, διατίθενται πολλές αντίστροφες μετρήσεις"</string>
- <string name="timer_started" msgid="6715582052946641641">"Η αντίστροφη μέτρηση ξεκίνησε"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Δεν υπάρχουν χρονόμετρα"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Υπάρχουν περισσότερα από ένα χρονόμετρα"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Το χρονόμετρο έχει καταργηθεί."</string>
<string name="timer_created" msgid="4381027137335885547">"Δημιουργήθηκε αντίστροφη μέτρηση"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Μη έγκυρη διάρκεια αντίστροφης μέτρησης"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Επαναφορά αντίστροφης μέτρησης"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Δεν είναι δυνατή η επαναφορά της αντίστροφης μέτρησης, επειδή εξακολουθεί να λειτουργεί. Διακόψτε την αντίστροφη μέτρηση για να την επαναφέρετε."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Η αντίστροφη μέτρηση διακόπηκε ήδη"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Η αντίστροφη μέτρηση διαγράφηκε"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Η αντίστροφη μέτρηση ξεκίνησε"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Μη έγκυρη διάρκεια αντίστροφης μέτρησης"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Δεν επιλέχτηκε πόλη"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Η πόλη που καθορίσατε δεν είναι διαθέσιμη"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Αυτή η πόλη προστέθηκε ήδη"</string>
diff --git a/res/values-en-rAU/array.xml b/res/values-en-rAU/array.xml
index c12a7fd..0f09673 100644
--- a/res/values-en-rAU/array.xml
+++ b/res/values-en-rAU/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala City"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>South Pole"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>South Pole<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh City"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Tehran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 81b9679..f6e50f2 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Show clock"</string>
<string name="hide_clock" msgid="3217727306480505694">"Hide clock"</string>
<string name="label" msgid="162189613902857319">"Label"</string>
+ <string name="on_switch" msgid="2297966258029227449">"On"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Off"</string>
<string name="default_label" msgid="5590025289805630372">"Alarm"</string>
<string name="set_alarm" msgid="9148359866152726808">"Set alarm"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrate"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Repeat"</string>
<string name="alert" msgid="6506982899651975645">"Alarm Ringtone"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Customised Ringtone"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Timer Expired"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silent"</string>
<string name="ringtone" msgid="9110746249688559579">"Ring tone"</string>
<string name="time" msgid="8067216534232296518">"Time"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Tomorrow"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Snoozing until <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Upcoming alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Your missed alarm has been deleted"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Less than a minute remaining"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> remaining"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> remaining"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> remaining"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Less than a minute remaining"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"remaining"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"remaining"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarm set for less than 1 minute from now."</item>
<item msgid="6002066367368421848">"Alarm set for <xliff:g id="DAYS">%1$s</xliff:g> from now."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minutes</item>
<item quantity="one">minute</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Gradually increase volume"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Off"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> seconds"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"seconds"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Silence after"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutes</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Revert"</string>
<string name="delete" msgid="5732434972457000541">"Delete"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Alarm volume"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silent"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silent"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Unknown"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Snooze or dismiss alarm."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (snoozed)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarm set for <xliff:g id="TIME">%s</xliff:g>. Touch to cancel."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Loading ringtone…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Sound playback service for timers set in Clock."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Set alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Timer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Clock"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sort by name"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Selected Cities"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Resume"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stop"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Lap"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Reset"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pause"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Lap"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Share"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"My time is <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Lap times:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Lap <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> hours</item>
<item quantity="one">1 hour</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Add 1 minute"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Add 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Stop"</string>
- <string name="timer_done" msgid="2375990511982914051">"Finished"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Stop all timers"</string>
<string name="timer_reset" msgid="7848424809190171640">"Reset"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Cancel"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Timer cancelled"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Time\'s up"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> timers expired"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Timer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"4 timers maximum"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pause"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Reset all timers"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"You\'re quite the speed demon."</item>
<item msgid="6332879039890727169">"Enjoy the fruits of your labour."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Cities"</string>
<string name="clock_settings" msgid="8317286807280600391">"Clock"</string>
<string name="clock_style" msgid="2265011060429742344">"Style"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Change Date & time"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogue"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ticked"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> unticked"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshall Islands"</item>
<item msgid="4196408495909011020">"Midway Island"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarms"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Stopwatch service to run the notification."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Stopped"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Processes actions from timer notifications."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Processes actions from stopwatch notifications."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Paused"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Swipe right to dismiss"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Swipe left to snooze"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Swipe left to snooze or right to dismiss"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Timers"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Timer ring tone"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Timer stopped"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> timers stopped"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Timer paused"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> timers paused"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Touch to see your timers"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> timers"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Next timer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"No Alarms"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"No alarms set"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NO UPCOMING ALARMS"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h.mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h.mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Invalid time <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"No alarm at <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"No scheduled alarms"</string>
<string name="no_label_specified" msgid="2008482054428460626">"No label specified"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"No alarms contain the label"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stopwatch is already running"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stopwatch isn\'t running"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stopwatch cannot be reset because it is running"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stopwatch stopped"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stopwatch paused"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stopwatch reset"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stopwatch lapped"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stopwatch started"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"No alarm scheduled for this time"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> alarm dismissed"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm is set for <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"No timer set"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Timer deleted"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Timer already running"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Unable to complete your request, multiple timers available"</string>
- <string name="timer_started" msgid="6715582052946641641">"Timer started"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"No timers exist"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"More than one timer exists"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"The timer has been removed."</string>
<string name="timer_created" msgid="4381027137335885547">"Timer created"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Invalid timer length"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Timer reset"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Timer can\'t be reset because it\'s still running. Stop timer to reset."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Timer already stopped"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Timer deleted"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Timer started"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Invalid timer length"</string>
<string name="no_city_selected" msgid="1007596865203283741">"No city selected"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"The city you specified is not available"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"That city has already been added"</string>
diff --git a/res/values-en-rGB/array.xml b/res/values-en-rGB/array.xml
index c12a7fd..0f09673 100644
--- a/res/values-en-rGB/array.xml
+++ b/res/values-en-rGB/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala City"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>South Pole"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>South Pole<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh City"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Tehran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 81b9679..f6e50f2 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Show clock"</string>
<string name="hide_clock" msgid="3217727306480505694">"Hide clock"</string>
<string name="label" msgid="162189613902857319">"Label"</string>
+ <string name="on_switch" msgid="2297966258029227449">"On"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Off"</string>
<string name="default_label" msgid="5590025289805630372">"Alarm"</string>
<string name="set_alarm" msgid="9148359866152726808">"Set alarm"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrate"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Repeat"</string>
<string name="alert" msgid="6506982899651975645">"Alarm Ringtone"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Customised Ringtone"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Timer Expired"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silent"</string>
<string name="ringtone" msgid="9110746249688559579">"Ring tone"</string>
<string name="time" msgid="8067216534232296518">"Time"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Tomorrow"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Snoozing until <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Upcoming alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Your missed alarm has been deleted"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Less than a minute remaining"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> remaining"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> remaining"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> remaining"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Less than a minute remaining"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"remaining"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"remaining"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarm set for less than 1 minute from now."</item>
<item msgid="6002066367368421848">"Alarm set for <xliff:g id="DAYS">%1$s</xliff:g> from now."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minutes</item>
<item quantity="one">minute</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Gradually increase volume"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Off"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> seconds"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"seconds"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Silence after"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutes</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Revert"</string>
<string name="delete" msgid="5732434972457000541">"Delete"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Alarm volume"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silent"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silent"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Unknown"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Snooze or dismiss alarm."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (snoozed)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarm set for <xliff:g id="TIME">%s</xliff:g>. Touch to cancel."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Loading ringtone…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Sound playback service for timers set in Clock."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Set alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Timer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Clock"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sort by name"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Selected Cities"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Resume"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stop"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Lap"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Reset"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pause"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Lap"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Share"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"My time is <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Lap times:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Lap <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> hours</item>
<item quantity="one">1 hour</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Add 1 minute"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Add 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Stop"</string>
- <string name="timer_done" msgid="2375990511982914051">"Finished"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Stop all timers"</string>
<string name="timer_reset" msgid="7848424809190171640">"Reset"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Cancel"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Timer cancelled"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Time\'s up"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> timers expired"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Timer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"4 timers maximum"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pause"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Reset all timers"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"You\'re quite the speed demon."</item>
<item msgid="6332879039890727169">"Enjoy the fruits of your labour."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Cities"</string>
<string name="clock_settings" msgid="8317286807280600391">"Clock"</string>
<string name="clock_style" msgid="2265011060429742344">"Style"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Change Date & time"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogue"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ticked"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> unticked"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshall Islands"</item>
<item msgid="4196408495909011020">"Midway Island"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarms"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Stopwatch service to run the notification."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Stopped"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Processes actions from timer notifications."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Processes actions from stopwatch notifications."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Paused"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Swipe right to dismiss"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Swipe left to snooze"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Swipe left to snooze or right to dismiss"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Timers"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Timer ring tone"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Timer stopped"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> timers stopped"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Timer paused"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> timers paused"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Touch to see your timers"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> timers"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Next timer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"No Alarms"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"No alarms set"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NO UPCOMING ALARMS"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h.mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h.mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Invalid time <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"No alarm at <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"No scheduled alarms"</string>
<string name="no_label_specified" msgid="2008482054428460626">"No label specified"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"No alarms contain the label"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stopwatch is already running"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stopwatch isn\'t running"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stopwatch cannot be reset because it is running"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stopwatch stopped"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stopwatch paused"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stopwatch reset"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stopwatch lapped"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stopwatch started"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"No alarm scheduled for this time"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> alarm dismissed"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm is set for <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"No timer set"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Timer deleted"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Timer already running"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Unable to complete your request, multiple timers available"</string>
- <string name="timer_started" msgid="6715582052946641641">"Timer started"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"No timers exist"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"More than one timer exists"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"The timer has been removed."</string>
<string name="timer_created" msgid="4381027137335885547">"Timer created"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Invalid timer length"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Timer reset"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Timer can\'t be reset because it\'s still running. Stop timer to reset."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Timer already stopped"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Timer deleted"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Timer started"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Invalid timer length"</string>
<string name="no_city_selected" msgid="1007596865203283741">"No city selected"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"The city you specified is not available"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"That city has already been added"</string>
diff --git a/res/values-en-rIN/array.xml b/res/values-en-rIN/array.xml
index c12a7fd..0f09673 100644
--- a/res/values-en-rIN/array.xml
+++ b/res/values-en-rIN/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala City"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>South Pole"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>South Pole<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh City"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Tehran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 81b9679..f6e50f2 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Show clock"</string>
<string name="hide_clock" msgid="3217727306480505694">"Hide clock"</string>
<string name="label" msgid="162189613902857319">"Label"</string>
+ <string name="on_switch" msgid="2297966258029227449">"On"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Off"</string>
<string name="default_label" msgid="5590025289805630372">"Alarm"</string>
<string name="set_alarm" msgid="9148359866152726808">"Set alarm"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrate"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Repeat"</string>
<string name="alert" msgid="6506982899651975645">"Alarm Ringtone"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Customised Ringtone"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Timer Expired"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silent"</string>
<string name="ringtone" msgid="9110746249688559579">"Ring tone"</string>
<string name="time" msgid="8067216534232296518">"Time"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Tomorrow"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Snoozing until <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Upcoming alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Your missed alarm has been deleted"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Less than a minute remaining"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> remaining"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> remaining"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> remaining"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Less than a minute remaining"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"remaining"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"remaining"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarm set for less than 1 minute from now."</item>
<item msgid="6002066367368421848">"Alarm set for <xliff:g id="DAYS">%1$s</xliff:g> from now."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minutes</item>
<item quantity="one">minute</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Gradually increase volume"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Off"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> seconds"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"seconds"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Silence after"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutes</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Revert"</string>
<string name="delete" msgid="5732434972457000541">"Delete"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Alarm volume"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silent"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silent"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Unknown"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Snooze or dismiss alarm."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (snoozed)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarm set for <xliff:g id="TIME">%s</xliff:g>. Touch to cancel."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Loading ringtone…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Sound playback service for timers set in Clock."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Set alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Timer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Clock"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sort by name"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Selected Cities"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Resume"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stop"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Lap"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Reset"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pause"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Lap"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Share"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"My time is <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Lap times:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Lap <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> hours</item>
<item quantity="one">1 hour</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Add 1 minute"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Add 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Stop"</string>
- <string name="timer_done" msgid="2375990511982914051">"Finished"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Stop all timers"</string>
<string name="timer_reset" msgid="7848424809190171640">"Reset"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Cancel"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Timer cancelled"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Time\'s up"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> timers expired"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Timer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"4 timers maximum"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pause"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Reset all timers"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"You\'re quite the speed demon."</item>
<item msgid="6332879039890727169">"Enjoy the fruits of your labour."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Cities"</string>
<string name="clock_settings" msgid="8317286807280600391">"Clock"</string>
<string name="clock_style" msgid="2265011060429742344">"Style"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Change Date & time"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogue"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ticked"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> unticked"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshall Islands"</item>
<item msgid="4196408495909011020">"Midway Island"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarms"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Stopwatch service to run the notification."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Stopped"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Processes actions from timer notifications."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Processes actions from stopwatch notifications."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Paused"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Swipe right to dismiss"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Swipe left to snooze"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Swipe left to snooze or right to dismiss"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Timers"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Timer ring tone"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Timer stopped"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> timers stopped"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Timer paused"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> timers paused"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Touch to see your timers"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> timers"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Next timer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"No Alarms"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"No alarms set"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NO UPCOMING ALARMS"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h.mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h.mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Invalid time <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"No alarm at <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"No scheduled alarms"</string>
<string name="no_label_specified" msgid="2008482054428460626">"No label specified"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"No alarms contain the label"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stopwatch is already running"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stopwatch isn\'t running"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stopwatch cannot be reset because it is running"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stopwatch stopped"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stopwatch paused"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stopwatch reset"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stopwatch lapped"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stopwatch started"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"No alarm scheduled for this time"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> alarm dismissed"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm is set for <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"No timer set"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Timer deleted"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Timer already running"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Unable to complete your request, multiple timers available"</string>
- <string name="timer_started" msgid="6715582052946641641">"Timer started"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"No timers exist"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"More than one timer exists"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"The timer has been removed."</string>
<string name="timer_created" msgid="4381027137335885547">"Timer created"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Invalid timer length"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Timer reset"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Timer can\'t be reset because it\'s still running. Stop timer to reset."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Timer already stopped"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Timer deleted"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Timer started"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Invalid timer length"</string>
<string name="no_city_selected" msgid="1007596865203283741">"No city selected"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"The city you specified is not available"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"That city has already been added"</string>
diff --git a/res/values-es-rUS/array.xml b/res/values-es-rUS/array.xml
index 485c258..edde2e5 100644
--- a/res/values-es-rUS/array.xml
+++ b/res/values-es-rUS/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Gran Turca"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Granada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"C<xliff:g id="SEPARATOR">=</xliff:g>Ciudad de Guatemala"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>La Habana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Polo Sur"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Polo Sur<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amán"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebrón"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Estambul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Yakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jerusalén"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Mascate"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pionyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pionyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangún"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riad"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigón"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seúl"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghái"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghái<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipéi"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipéi<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teherán"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulán Bator"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermudas"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Islas Canarias"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Pekín"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Pekín<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Bombay"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Saná"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 7146a1a..17fac9e 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"Activado"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Desactivado"</string>
<string name="default_label" msgid="5590025289805630372">"Alarma"</string>
<string name="set_alarm" msgid="9148359866152726808">"Establecer alarma"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrar"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
<string name="alert" msgid="6506982899651975645">"Tono de alarma"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Tono personalizado"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Caducó el temporizador"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silencio"</string>
<string name="ringtone" msgid="9110746249688559579">"Tono"</string>
<string name="time" msgid="8067216534232296518">"Hora"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Mañana"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Posponer hasta la hora <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Próxima alarma"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Se eliminó la alarma perdida."</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Queda menos de 1 minuto."</item>
- <item msgid="83197792732433351">"Quedan <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Quedan <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Quedan <xliff:g id="HOURS">%1$s</xliff:g> y <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Queda menos de 1 minuto"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Quedan <xliff:g id="HOURS">%1$s</xliff:g> horas y <xliff:g id="MINUTES">%2$s</xliff:g> minutos"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"restante"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"restantes"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"La alarma sonará en menos de un minuto."</item>
<item msgid="6002066367368421848">"La alarma sonará en <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minutos</item>
<item quantity="one">minuto</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Subir el volumen de forma gradual"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Desactivada"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> segundos"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"segundos"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Silenciar automáticamente"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutos</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Revertir"</string>
<string name="delete" msgid="5732434972457000541">"Eliminar"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volumen"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencioso"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silencio"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Desconocido"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Posponer o ignorar 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="4819324081410990368">"La alarma sonará a las <xliff:g id="TIME">%s</xliff:g>. Toca para cancelarla."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Cargando tono..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Servicio de reproducción de sonido de temporizadores definido en Reloj"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Establecer alarma"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarma"</string>
<string name="menu_timer" msgid="6459070074762877114">"Temporizador"</string>
<string name="menu_clock" msgid="5612760670606829805">"Reloj"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Ordenar por nombre"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Ciudades seleccionadas"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Reanudar"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Comenzar"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Detener"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Vuelta"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Restablecer"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Comenzar"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pausa"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Vuelta"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Compartir"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Mi hora es <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Duración:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Vuelta <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"N.º <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"N.º <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> horas</item>
<item quantity="one">1 hora</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Agregar 1 minuto"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Agregar 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Detener"</string>
- <string name="timer_done" msgid="2375990511982914051">"Listo"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Detener todos"</string>
<string name="timer_reset" msgid="7848424809190171640">"Restablecer"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Cancelar"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Se canceló el temporizador"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Se acabó el tiempo"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> temp. finalizaron"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Temporizador"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Máximo: 4 temporizadores"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pausar"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Restablecer"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Vas a la velocidad de la luz."</item>
<item msgid="6332879039890727169">"Disfruta de los frutos de tu trabajo."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Ciudades"</string>
<string name="clock_settings" msgid="8317286807280600391">"Reloj"</string>
<string name="clock_style" msgid="2265011060429742344">"Estilo"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Cambiar fecha y hora"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analógico"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Se marcó <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Se desmarcó <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Islas Marshall"</item>
<item msgid="4196408495909011020">"Islas Midway"</item>
@@ -329,17 +338,21 @@
<item msgid="5176858645450908751">"Yakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmas"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Servicio de cronómetro para ejecutar la notificación"</string>
- <string name="swn_stopped" msgid="783124901663086172">"Detenido"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Procesa acciones de las notificaciones del temporizador."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Procesa acciones de las notificaciones del cronómetro."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"En pausa"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Desliza hacia la derecha para descartar."</string>
<string name="description_direction_left" msgid="7448141043674998679">"Desliza hacia la izquierda para posponer."</string>
<string name="description_direction_both" msgid="1841309486023845685">"Desliza el dedo hacia la izquierda para posponer la alarma o hacia la derecha para ignorarla."</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Temporizadores"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Tono del temporizador"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Temporizador detenido"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores detenidos"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Se pausó el temporizador"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores pausados"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Toca para ver tus temporizadores."</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Próximo temporizador: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
- <string name="screensaver_settings" msgid="7013450738357352801">"Configuración de Dream"</string>
+ <string name="screensaver_settings" msgid="7013450738357352801">"Configuración"</string>
<string name="night_mode_title" msgid="5983813889469616299">"Modo nocturno"</string>
<string name="night_mode_summary" msgid="1017350187324162631">"Pantalla muy atenuada (para ambientes poco iluminados)"</string>
<string name="expand_alarm" msgid="7392616528943305020">"Expandir alarma"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Sin alarmas"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"No hay alarmas."</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NO HAY ALARMAS PRÓXIMAMENTE"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"La hora <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g> no es válida"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"No hay ninguna alarma programada a las <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"No hay alarmas programadas"</string>
<string name="no_label_specified" msgid="2008482054428460626">"No se especificó ninguna etiqueta"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"No hay ninguna alarma con esa etiqueta"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"El cronómetro ya se está ejecutando"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"El cronómetro no se está ejecutando"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"No se puede restablecer el cronómetro porque se está ejecutando"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Se detuvo el cronómetro"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Cronómetro en pausa"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Se restableció el cronómetro"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Se estableció una vuelta en el cronómetro"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Se inició el cronómetro"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"No hay ninguna alarma programada para esta hora"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Se ignoró la alarma <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarma establecida a la(s) <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"No se configuró ningún temporizador"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Se borró el temporizador"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"El temporizador ya se está ejecutando"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"No se puede completar la solicitud porque hay varios temporizadores disponibles"</string>
- <string name="timer_started" msgid="6715582052946641641">"Se inició el temporizador"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"No hay ningún temporizador"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Hay más de un temporizador"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Se quitó el temporizador."</string>
<string name="timer_created" msgid="4381027137335885547">"Se creó el temporizador"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"La duración del temporizador no es válida"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Se restableció el temporizador"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"No se puede restablecer el temporizador porque todavía se está ejecutando. Para restablecerlo, detén el temporizador."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"El temporizador ya se detuvo"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Se borró el temporizador"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Se inició el temporizador"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"La duración del temporizador no es válida"</string>
<string name="no_city_selected" msgid="1007596865203283741">"No se seleccionó ninguna ciudad"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"La ciudad que especificaste no está disponible"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Esa ciudad ya se agregó"</string>
diff --git a/res/values-es/array.xml b/res/values-es/array.xml
index 5a3bef5..a7f6552 100644
--- a/res/values-es/array.xml
+++ b/res/values-es/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"I<xliff:g id="SEPARATOR">=</xliff:g>Isla Gran Turca"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Granada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"C<xliff:g id="SEPARATOR">=</xliff:g>Ciudad de Guatemala"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"L<xliff:g id="SEPARATOR">=</xliff:g>La Habana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"P<xliff:g id="SEPARATOR">=</xliff:g>Polo Sur"</item>
+ <item msgid="498429228419399474">"P<xliff:g id="SEPARATOR">=</xliff:g>Polo Sur<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almatý"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amán"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebrón"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"E<xliff:g id="SEPARATOR">=</xliff:g>Estambul"</item>
<item msgid="758800913783999425">"Y<xliff:g id="SEPARATOR">=</xliff:g>Yakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jerusalén"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Mascate"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pionyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pionyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"C<xliff:g id="SEPARATOR">=</xliff:g>Catar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangún"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riad"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigón"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seúl"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghái"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghái<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipéi"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipéi<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teherán"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulán Bator"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermudas"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Canarias"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Pekín"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Pekín<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"B<xliff:g id="SEPARATOR">=</xliff:g>Bombay"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Saná"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Cantón"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Cantón<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index a1746db..174b996 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Mostrar reloj"</string>
<string name="hide_clock" msgid="3217727306480505694">"Ocultar reloj"</string>
<string name="label" msgid="162189613902857319">"Nombre"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Sí"</string>
+ <string name="off_switch" msgid="3381070073851148013">"No"</string>
<string name="default_label" msgid="5590025289805630372">"Alarma"</string>
<string name="set_alarm" msgid="9148359866152726808">"Establecer alarma"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrar"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
<string name="alert" msgid="6506982899651975645">"Tono de alarma"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Tono de llamada personalizado"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Temporizador agotado"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silencio"</string>
<string name="ringtone" msgid="9110746249688559579">"Tono de llamada"</string>
<string name="time" msgid="8067216534232296518">"Hora"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Mañana"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Repetir a las <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Próxima alarma"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Se han eliminado las alarmas perdidas"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Queda menos de 1 minuto"</item>
- <item msgid="83197792732433351">"Quedan <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Quedan <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Quedan <xliff:g id="HOURS">%1$s</xliff:g> y <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Queda menos de 1 minuto"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Quedan <xliff:g id="HOURS">%1$s</xliff:g> horas y <xliff:g id="MINUTES">%2$s</xliff:g> minutos"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"Queda"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"Quedan"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"La alarma sonará en menos de 1 minuto."</item>
<item msgid="6002066367368421848">"La alarma sonará en <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minutos</item>
<item quantity="one">minuto</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Subir volumen gradualmente"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"No"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> segundos"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"segundos"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Silenciar después de"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutos</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Revertir"</string>
<string name="delete" msgid="5732434972457000541">"Eliminar"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volumen de la alarma"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencio"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silencio"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Desconocido"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Posponer o aceptar 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="4819324081410990368">"La alarma sonará a las <xliff:g id="TIME">%s</xliff:g>. Toca para cancelar."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Cargando tono…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Reproducción de temporizadores definidos en el reloj"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Establecer alarma"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarma"</string>
<string name="menu_timer" msgid="6459070074762877114">"Temporizador"</string>
<string name="menu_clock" msgid="5612760670606829805">"Reloj"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Ordenar por nombre"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Ciudades seleccionadas"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Reanudar"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Iniciar"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Detener"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"+1 vuelta"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Reiniciar"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Iniciar"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pausa"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"+1 vuelta"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Compartir"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Hora: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Duración de las vueltas:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Vuelta <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"N.º <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"N.º <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> horas</item>
<item quantity="one">1 hora</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Añadir 1 minuto"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Añadir 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Detener"</string>
- <string name="timer_done" msgid="2375990511982914051">"Listo"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Detener temporizadores"</string>
<string name="timer_reset" msgid="7848424809190171640">"Reiniciar"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Cancelar"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Temporizador cancelado"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Tiempo agotado"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> temporizadores caducados"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Temporizador"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Máximo: 4 temporizadores"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pausar"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Restablecer todo"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Eres el rey de la velocidad."</item>
<item msgid="6332879039890727169">"Disfruta de los frutos de tu trabajo."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Ciudades"</string>
<string name="clock_settings" msgid="8317286807280600391">"Reloj"</string>
<string name="clock_style" msgid="2265011060429742344">"Estilo"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Cambiar fecha y hora"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analógico"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Has seleccionado <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"No has seleccionado <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Islas Marshall"</item>
<item msgid="4196408495909011020">"Islas Midway"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Yakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmas"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Servicio de cronómetro para ejecutar la notificación"</string>
- <string name="swn_stopped" msgid="783124901663086172">"Detenido"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Procesa acciones de notificaciones del temporizador."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Procesa acciones de notificaciones del cronómetro."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"En pausa"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Deslizar hacia la derecha para aceptar"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Deslizar hacia la izquierda para posponer"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Desliza el dedo hacia la izquierda para posponer la alarma o hacia la derecha para ignorarla"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Temporizadores"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Tono de temporizador"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Temporizador detenido"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores detenidos"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Temporizador pausado"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores en pausa"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Toca para ver tus temporizadores"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Próximo: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"No hay alarmas"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"No hay alarmas"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NO HAY ALARMAS PRÓXIMAMENTE"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"La hora <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g> no es válida"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"No hay ninguna alarma a las <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"No hay ninguna alarma programada"</string>
<string name="no_label_specified" msgid="2008482054428460626">"No se ha especificado ninguna etiqueta"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"No hay ninguna alarma con esa etiqueta"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Ya se está utilizando el cronómetro"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"No se está utilizando el cronómetro"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"El cronómetro no se puede restablecer porque se está ejecutando"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Cronómetro detenido"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Se ha pausado el cronómetro"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Cronómetro restablecido"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Cronómetro con tiempo parcial establecido"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Cronómetro iniciado"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"No hay ninguna alarma programada para esta hora"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarma de las <xliff:g id="ALARM_TIME">%s</xliff:g> ignorada"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarma establecida a las <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"No se ha establecido ningún temporizador"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Temporizador eliminado"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Ya se está utilizando el temporizador"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"No se puede procesar la solicitud porque hay varios temporizadores disponibles"</string>
- <string name="timer_started" msgid="6715582052946641641">"Temporizador iniciado"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"No hay temporizadores"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Hay varios temporizadores"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Se ha quitado el temporizador."</string>
<string name="timer_created" msgid="4381027137335885547">"Temporizador creado"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Duración de temporizador no válida"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Temporizador restablecido"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"No se puede restablecer el temporizador porque aún se está utilizando. Debes detenerlo para restablecerlo."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Ya se ha detenido el temporizador"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Temporizador eliminado"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Temporizador iniciado"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Duración de temporizador no válida"</string>
<string name="no_city_selected" msgid="1007596865203283741">"No has seleccionado ninguna ciudad"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"La ciudad especificada no está disponible"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Esa ciudad ya se ha añadido"</string>
diff --git a/res/values-et-rEE/array.xml b/res/values-et-rEE/array.xml
index 5bfa498..808fb01 100644
--- a/res/values-et-rEE/array.xml
+++ b/res/values-et-rEE/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala City"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havanna"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Lõunapoolus"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Lõunapoolus<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almatõ"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jeruusalemm"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Masqaţ"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Yangon"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Ar-Riyāḑ"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Soul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Kanaarid"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Peking<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sanaa"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderābād"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index d8f92a0..5a4b585 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Näita kella"</string>
<string name="hide_clock" msgid="3217727306480505694">"Peida kell"</string>
<string name="label" msgid="162189613902857319">"Silt"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Sees"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Väljas"</string>
<string name="default_label" msgid="5590025289805630372">"Äratus"</string>
<string name="set_alarm" msgid="9148359866152726808">"Määra äratus"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Värin"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Kordus"</string>
<string name="alert" msgid="6506982899651975645">"Äratuse helin"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Kohandatud helin"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Taimer on aegunud"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Hääletu"</string>
<string name="ringtone" msgid="9110746249688559579">"Helin"</string>
<string name="time" msgid="8067216534232296518">"Kellaaeg"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Homme"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Äratuse edasilükkamine kuni <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Tulevane alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Märkamata jäänud alarm on kustutatud"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Jäänud vähem kui minut"</item>
- <item msgid="83197792732433351">"Jäänud <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Jäänud <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Jäänud <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Jäänud on vähem kui minut"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Jäänud on <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"on jäänud"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"on jäänud"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Äratuseni on jäänud vähem kui 1 minut."</item>
<item msgid="6002066367368421848">"Äratuseni on jäänud <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minutit</item>
<item quantity="one">minut</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Helitugevuse järkjärguline suurendamine"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Väljas"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> sekundit"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sekundid"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Vaikus pärast"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutit</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Ennista"</string>
<string name="delete" msgid="5732434972457000541">"Kustuta"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Äratuse helitugevus"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Hääletu"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Hääletu"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Tundmatu"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Lükake äratus edasi või loobuge sellest."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (edasi lükatud)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Äratus on määratud: <xliff:g id="TIME">%s</xliff:g>. Tühistamiseks puudutage."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Helina laadimine ..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Määratud ajastite heli taasesitamise teenus."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Äratuse määramine"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Taimer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Kell"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sordi nime järgi"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Valitud linnad"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Jätka"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Alusta"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Peata"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Ring"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Lähtesta"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Alusta"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Peata"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Ring"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Jaga"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Minu aeg on <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Ringi ajad:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. ring"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Nr <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Nr <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> tundi</item>
<item quantity="one">1 tund</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Lisa 1 minut"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Lisa 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Peata"</string>
- <string name="timer_done" msgid="2375990511982914051">"Valmis"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Kõigi taimerite peatamine"</string>
<string name="timer_reset" msgid="7848424809190171640">"Lähtesta"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Tühista"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Taimer on tühistatud"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Aeg on läbi"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> taimerit on aegunud"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Taimer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Maksimaalselt võib olla 4 taimerit"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Peatamine"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Taimerite läht."</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Olete ülikiire."</item>
<item msgid="6332879039890727169">"Nautige oma töö vilju."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Linnad"</string>
<string name="clock_settings" msgid="8317286807280600391">"Kell"</string>
<string name="clock_style" msgid="2265011060429742344">"Stiil"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Kuupäeva ja kellaaja muutmine"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analoog"</item>
<item msgid="8483930821046925592">"Digitaalne"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> on märgitud"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> pole märgitud"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshalli saared"</item>
<item msgid="4196408495909011020">"Midway saared"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmid"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Märguandeid käitav stopperiteenus."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Peatatud"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Töötleb taimeri märguannete toiminguid."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Töötleb stopperi märguannete toiminguid."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Peatatud"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Loobumiseks pühkige paremale"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Edasilükkamiseks pühkige vasakule"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Edasilükkamiseks pühkige vasakule ja loobumiseks paremale"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Taimerid"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Taimeri helin"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Taimer on peatatud"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> taimerit on peatatud"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Taimer peatati"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> taimerit peatati"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Puudutage, et näha oma taimereid"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> taimerit"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Järgmine taimer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Alarme pole"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Alarme pole"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"TULEVASI ALARME POLE"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"<xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g> on sobimatu kellaaeg"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Kellaajaks <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> ei ole alarmi määratud"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Ühtegi määratud alarmi pole"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Silti pole määratud"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Ühelgi alarmil pole seda silti"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stopper juba käib"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stopper ei käi"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stopperit ei saa lähtestada, kuna see käib"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stopper peatati"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stopper on peatatud"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stopper lähtestati"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stopper alustas uut ringi"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stopper käivitati"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Selleks kellaajaks ei ole alarmi määratud"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarmist kellaajaks <xliff:g id="ALARM_TIME">%s</xliff:g> loobuti"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm on seatud – <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Taimerit pole määratud"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Taimer kustutati"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Taimer juba käib"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Taotlust ei saa lõpule viia, saadaval on mitu taimerit"</string>
- <string name="timer_started" msgid="6715582052946641641">"Taimer käivitati"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Taimereid ei ole"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Olemas on rohkem kui üks taimer"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Taimer on eemaldatud."</string>
<string name="timer_created" msgid="4381027137335885547">"Taimer on loodud"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Taimeri kestus on sobimatu"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Taimer lähtestati"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Taimerit ei saa lähtestada, kuna see alles käib. Lähtestamiseks peatage taimer."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Taimer juba peatati"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Taimer kustutati"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Taimer käivitati"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Taimeri kestus on sobimatu"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Ühtegi linna pole valitud"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Määratud linn pole saadaval"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"See linn on juba lisatud"</string>
diff --git a/res/values-eu-rES/array.xml b/res/values-eu-rES/array.xml
index 319fd9b..08777e7 100644
--- a/res/values-eu-rES/array.xml
+++ b/res/values-eu-rES/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Turk Handia"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala hiria"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Habana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Hego poloa"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Hego poloa<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Maskat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangun"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulan Bator"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sana"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Bartzelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index 25a1f44..3b5073c 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Erakutsi erlojua"</string>
<string name="hide_clock" msgid="3217727306480505694">"Ezkutatu erlojua"</string>
<string name="label" msgid="162189613902857319">"Etiketa"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Aktibatuta"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Desaktibatuta"</string>
<string name="default_label" msgid="5590025289805630372">"Alarma"</string>
<string name="set_alarm" msgid="9148359866152726808">"Ezarri alarma"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Egin dar-dar"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Errepikapena"</string>
<string name="alert" msgid="6506982899651975645">"Alarmaren tonua"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Tonu pertsonalizatua"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Iraungi egin da tenporizadorea"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Isilik modua"</string>
<string name="ringtone" msgid="9110746249688559579">"Tonua"</string>
<string name="time" msgid="8067216534232296518">"Ordua"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Bihar"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Atzeratu ordu honetara arte: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Alarma jotzear"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Ezikusi egindako alarma ezabatu da"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Minutu bat baino gutxiago geratzen da"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> ordu geratzen dira"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> minutu geratzen dira"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> ordu eta <xliff:g id="MINUTES">%2$s</xliff:g> minutu geratzen dira"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Minutu bat baino gutxiago geratzen da"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> eta <xliff:g id="MINUTES">%2$s</xliff:g> geratzen dira"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"geratzen da"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"geratzen dira"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarma 1 minutu baino gutxiago barru jotzeko ezarri da."</item>
<item msgid="6002066367368421848">"Alarma <xliff:g id="DAYS">%1$s</xliff:g> ordu barru jotzeko ezarri da."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minutu</item>
<item quantity="one">minutu</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Igo bolumena apurka-apurka"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Desaktibatuta"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> segundo"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"segundo"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Gelditu tarte hau igaro ondoren"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutu</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Leheneratu"</string>
<string name="delete" msgid="5732434972457000541">"Ezabatu"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Alarmaren bolumena"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Isilik modua"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Isila"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Ezezaguna"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Atzeratu edo baztertu alarma."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (atzeratuta)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarma ezarri da ordu honetarako: <xliff:g id="TIME">%s</xliff:g>. Uzteko, ukitu hau."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Tonua kargatzen…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Erlojuan ezarritako tenporizadoreetarako soinuen erreprodukzio-zerbitzua."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Ezarri alarma"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarma"</string>
<string name="menu_timer" msgid="6459070074762877114">"Tenporizadorea"</string>
<string name="menu_clock" msgid="5612760670606829805">"Erlojua"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Ordenatu izenaren arabera"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Hautatutako hiriak"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Berrekin"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Hasi"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Gelditu"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Itzulia"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Berrezarri"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Hasi"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Itzulia"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Partekatu"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Nire denbora <xliff:g id="TIME">%s</xliff:g> da"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Itzulien denborak:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. itzulia"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"<xliff:g id="NUMBER">%d</xliff:g>.a"</item>
- <item msgid="316923361931627987">"<xliff:g id="NUMBER">%02d</xliff:g>.a"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ordu</item>
<item quantity="one">1 ordu</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Gehitu 1 minutu"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Gehitu 1 minutu"</string>
<string name="timer_stop" msgid="3361154678667736722">"Gelditu"</string>
- <string name="timer_done" msgid="2375990511982914051">"Eginda"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Gelditu tenporizadoreak"</string>
<string name="timer_reset" msgid="7848424809190171640">"Berrezarri"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Utzi"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Utzi egin da tenporizadorea"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Denbora agortu da"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> tenporizadore iraungi dira"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Tenporizadorea"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Lau tenporizadore gehienez"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pausatu"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Berrezarri guztiak"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Suziria bezain bizkorra zara."</item>
<item msgid="6332879039890727169">"Gozatu zure lanaren fruituez."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Hiriak"</string>
<string name="clock_settings" msgid="8317286807280600391">"Erlojua"</string>
<string name="clock_style" msgid="2265011060429742344">"Estiloa"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Aldatu data eta ordua"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogikoa"</item>
<item msgid="8483930821046925592">"Digitala"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> markatu da"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Marka kendu zaio <xliff:g id="CITY_NAME">%s</xliff:g> koadroari"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshall uharteak"</item>
<item msgid="4196408495909011020">"Midway uhartea"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmak"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Jakinarazpena exekutatzeko kronometro-zerbitzua."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Geldituta"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Ekintzak prozesatzen ditu tenporizadorearen jakinarazpenetatik abiatuta."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Ekintzak prozesatzen ditu kronometroaren jakinarazpenetatik abiatuta."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Pausatu da kronometroa"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Baztertzeko, pasatu hatza eskuinera"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Atzeratzeko, pasatu hatza ezkerrera"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Atzeratzeko, pasatu hatza ezkerrera. Baztertzeko, pasatu hatza eskuinera."</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Tenporizadoreak"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Tenporizadorearen tonua"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Tenporizadorea gelditu da"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> tenporizadore gelditu dira"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Pausatu da tenporizadorea"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> tenporizadore pausatuta"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Tenporizadoreak ikusteko, ukitu hau"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> tenporizadore"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Hurrengo tenporizadorea: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Alarmarik ez"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Ez da alarmarik ezarri"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"EZ DAGO ALARMARIK"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Ordu honek ez du balio: <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Ez dago alarmarik (<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>)"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Ez dago alarmarik programatuta"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Ez da zehaztu etiketarik"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Ez dago etiketa hori duen alarmarik"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Kronometroa abian da dagoeneko"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Kronometroa ez da abian"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Ezin da berrezarri kronometroa, exekutatzen ari delako"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Gelditu da kronometroa"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Gelditu da kronometroa"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Berrezarri da kronometroa"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Ezarri da kronometroaren denbora tarte partziala"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Hasi da kronometroa"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Ez dago alarmarik programatuta ordu horretarako"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Baztertu da <xliff:g id="ALARM_TIME">%s</xliff:g> alarma"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarmaren ordua: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Ez dago tenporizadorerik ezarrita"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Ezabatu da tenporizadorea"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Tenporizadorea abian da dagoeneko"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Ezin da eskaera osatu; tenporizadore bat baino gehiago dago"</string>
- <string name="timer_started" msgid="6715582052946641641">"Abiarazi da tenporizadorea"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Ez dago tenporizadorerik"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Tenporizadore bat baino gehiago daude"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Kendu egin da tenporizadorea."</string>
<string name="timer_created" msgid="4381027137335885547">"Sortu da tenporizadorea"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Tenporizadorearen iraupenak ez du balio"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Berrezarri da tenporizadorea"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Ezin da berrezarri tenporizadorea, oraindik abian baita. Berrezartzeko, gelditu tenporizadorea."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Tenporizadorea gelditu da dagoeneko"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Ezabatu da tenporizadorea"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Abiarazi da tenporizadorea"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Tenporizadorearen iraupenak ez du balio"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Ez da hautatu hiririk"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Adierazi duzun hiria ez dago erabilgarri"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Hiri hori gehitu da dagoeneko"</string>
diff --git a/res/values-fa/array.xml b/res/values-fa/array.xml
index 1b4a322..d170539 100644
--- a/res/values-fa/array.xml
+++ b/res/values-fa/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>فورتالزا"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>گراند تورک"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>گرنادا"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>گواتمالا"</item>
+ <item msgid="6216160110733510854">"گ<xliff:g id="SEPARATOR">=</xliff:g>گواتمالا"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>گویان"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>هالیفاکس"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>هاوانا"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>تورنتو"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>ونکوور"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>وینیپگ"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>قطب جنوب"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>قطب جنوب<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>لانگیربین"</item>
<item msgid="3784788073896028355">"ا<xliff:g id="SEPARATOR">=</xliff:g>آلماتی"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>امان"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>غزه"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>هبرون"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>هو شی مین"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>هنگ کنگ"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>هنگ کنگ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>استانبول"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>جاکارتا"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>اورشلیم"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>مانیل"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>مسقط"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>پنومپن"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>پیونگیانگ"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>پیونگیانگ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>قطر"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>رانگون"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>ریاض"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>سایگون"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>سئول"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>شانگهای"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>شانگهای<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>سنگاپور"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>تایپه"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>تایپه<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>تهران"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>تلآویو"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>توکیو"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>توکیو<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>اولانباتور"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>برمودا"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>قناری"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>رنو"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>بلک راک سیتی"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>دوحه"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>پکن"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>پکن<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>بمبئی"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>دهلی"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>اوزاکا"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>اوزاکا<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>لاهور"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>صنعا"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>بارسلون"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>کمبریج"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>کرکلند"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>مدیسون"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>گوانگژو"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>گوانگژو<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>حیدرآباد"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>رستون"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>بلو هوریزونته"</item>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 4fbdaba..2e7d138 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"نمایش ساعت"</string>
<string name="hide_clock" msgid="3217727306480505694">"پنهان کردن ساعت"</string>
<string name="label" msgid="162189613902857319">"برچسب"</string>
+ <string name="on_switch" msgid="2297966258029227449">"روشن"</string>
+ <string name="off_switch" msgid="3381070073851148013">"خاموش"</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="6506982899651975645">"آهنگ زنگ هشدار"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"آهنگ زنگ سفارشی"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"تایمر به پایان رسید"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"بیصدا"</string>
<string name="ringtone" msgid="9110746249688559579">"آهنگ زنگ"</string>
<string name="time" msgid="8067216534232296518">"زمان"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"فردا"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"تعویق تا <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"هشدار بعدی"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"هشدار بیپاسخ حذف شد"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"کمتر از یک دقیقه باقیمانده است"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> باقیمانده"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> باقیمانده"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> باقیمانده"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"کمتر از یک دقیقه باقیمانده است"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> باقیمانده"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"باقیمانده"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"باقیمانده"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"هشدار برای کمتر از ۱ دقیقه دیگر از حالا تنظیم شد."</item>
<item msgid="6002066367368421848">"هشدار برای <xliff:g id="DAYS">%1$s</xliff:g> دیگر از حالا تنظیم شد."</item>
@@ -101,6 +104,10 @@
<item quantity="one">دقیقه</item>
<item quantity="other">دقیقه</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"افزایش تدریجی صدا"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"خاموش"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> ثانیه"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"ثانیه"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"سکوت پس از"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> دقیقه</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"برگشت"</string>
<string name="delete" msgid="5732434972457000541">"حذف"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"میزان صدای هشدار"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"ساکت"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"بیصدا"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"نامشخص"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"هشدار را قطع کنید یا بهتعویق بیندازید."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (معوق)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"هشدار برای <xliff:g id="TIME">%s</xliff:g> تنظیم شد. جهت لغو لمس کنید."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"در حال بارگیری آهنگ زنگ..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"تنظیم سرویس بازپخش صدا برای تایمرها در «ساعت»."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"تنظیم زنگ ساعت"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"هشدار"</string>
<string name="menu_timer" msgid="6459070074762877114">"تایمر"</string>
<string name="menu_clock" msgid="5612760670606829805">"ساعت"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"مرتبسازی براساس نام"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"شهرهای منتخب"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"ازسرگیری"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"شروع"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"توقف"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"دور"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"بازنشانی"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"شروع"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"مکث"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"دور"</string>
<string name="sw_share_button" msgid="4478648110382859382">"اشتراکگذاری"</string>
<string name="hours_label" msgid="3393478155635368097">"س"</string>
<string name="minutes_label" msgid="3568098128251438588">"د"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"زمان من <xliff:g id="TIME">%s</xliff:g> است"</string>
<string name="sw_share_laps" msgid="614390674795945007">"زمانهای دور:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"دور <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"شماره <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"شماره <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ساعت</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ساعت</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"افزودن ۱ دقیقه"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"افزودن ۱ دقیقه"</string>
<string name="timer_stop" msgid="3361154678667736722">"توقف"</string>
- <string name="timer_done" msgid="2375990511982914051">"تمام"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"توقف همه تایمرها"</string>
<string name="timer_reset" msgid="7848424809190171640">"بازنشانی"</string>
<string name="timer_cancel" msgid="3572868404230815644">"لغو"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"تایمر لغو شد"</string>
<string name="timer_times_up" msgid="9190440395938519009">"وقت تمام است"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> تایمر منقضی شده"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"تایمر"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"حداکثر ۴ تایمر"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"مکث"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"بازنشانی همه تایمرها"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"شما واقعاً خدای سرعت هستید."</item>
<item msgid="6332879039890727169">"از ثمره زحمات خود لذت ببرید."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"شهرها"</string>
<string name="clock_settings" msgid="8317286807280600391">"ساعت"</string>
<string name="clock_style" msgid="2265011060429742344">"سبک"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"تغییر تاریخ و زمان"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"آنالوگ"</item>
<item msgid="8483930821046925592">"دیجیتال"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":۰۰"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">"۳۰:"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> علامتگذاری شد"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"علامت <xliff:g id="CITY_NAME">%s</xliff:g> برداشته شد"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"جزایر مارشال"</item>
<item msgid="4196408495909011020">"جزیره میدوی"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"جاکارتا"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"هشدارها"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"سرویس کرنومتر برای اجرای اعلان."</string>
- <string name="swn_stopped" msgid="783124901663086172">"متوقف شد"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"اقدامات را از اعلانهای تایمر پردازش میکند."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"اقدامات را از اعلانهای کرونومتر پردازش میکند."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"متوقف شد"</string>
<string name="description_direction_right" msgid="5709209043267548985">"برای ردکردن، انگشتتان را روی صفحه تند به راست بکشید"</string>
<string name="description_direction_left" msgid="7448141043674998679">"برای تعویق، انگشتتان را روی صفحه تند به چپ بکشید"</string>
<string name="description_direction_both" msgid="1841309486023845685">"برای تعویق، انگشتتان را روی صفحه به چپ و برای رد کردن به راست بکشید"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"تایمرها"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"آهنگ زنگ تایمر"</string>
<string name="timer_stopped" msgid="2730331837832462008">"تایمر متوقف شد"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> تایمر متوقف شد"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"تایمر متوقف شد"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> تایمر متوقف شد"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"برای دیدن تایمرهای خود لمس کنید"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> تایمر"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"تایمر بعدی: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"بدون هشدار"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"هشداری تنظیم نشده است"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"هشداری در آینده فعال نیست"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE، h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE، k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"زمان نامعتبر است <xliff:g id="INVALID_AMPM">%s</xliff:g> <xliff:g id="INVALID_MINUTES">%d</xliff:g>:<xliff:g id="INVALID_HOUR">%d</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"زنگ هشداری برای <xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>:<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g> تنظیم نشده است"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"هیچ زنگ هشدار زمانبندیشدهای وجود ندارد"</string>
<string name="no_label_specified" msgid="2008482054428460626">"هیچ برچسبی مشخص نشده است"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"هیچ زنگ هشداری دارای این برچسب نیست"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"کرونومتر در حال حاضر فعال است"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"کرونومتر فعال نیست"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"نمیتوان کرنومتر را بازنشانی کرد، چون در حال استفاده است"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"کرنومتر متوقف شد"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"کرونومتر متوقف شد"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"کرنومتر بازنشانی شد"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"صفحه کرنومتر برای خوانش زمان ثابت شد"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"کرنومتر شروع شد"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"هیچ زنگ هشداری برای این زمان برنامهریزی نشده است"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"زنگ هشدار <xliff:g id="ALARM_TIME">%s</xliff:g> خاموش شد"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"هشدار برای <xliff:g id="ALARM_TIME">%s</xliff:g> تنظیم میشود"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"هیچ تایمری تنظیم نشده است"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"تایمر حذف شد"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"تایمر در حال حاضر فعال است"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"تکمیل درخواست شما ممکن نیست، چندین تایمر وجود دارد"</string>
- <string name="timer_started" msgid="6715582052946641641">"تایمر شروع شد"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"تایمری وجود ندارد"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"بیش از یک تایمر وجود دارد"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"تایمر حذف شد."</string>
<string name="timer_created" msgid="4381027137335885547">"تایمر ایجاد شد"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"مدت زمان تایمر نامعتبر است"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"بازنشانی تایمر"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"تایمر بازنشانی نمیشود، چون هنوز فعال است. تایمر را برای بازنشانی متوقف کنید."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"تایمر در حال حاضر متوقف است"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"تایمر حذف شد"</string>
+ <string name="timer_started" msgid="6715582052946641641">"تایمر شروع شد"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"مدت زمان تایمر نامعتبر است"</string>
<string name="no_city_selected" msgid="1007596865203283741">"هیچ شهری انتخاب نشده است"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"شهری که مشخص کردید در دسترس نیست"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"این شهر قبلاً اضافه شده است"</string>
diff --git a/res/values-fi/array.xml b/res/values-fi/array.xml
index 760089e..8d46de5 100644
--- a/res/values-fi/array.xml
+++ b/res/values-fi/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemalan kaupunki"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havanna"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"E<xliff:g id="SEPARATOR">=</xliff:g>Etelänapa"</item>
+ <item msgid="498429228419399474">"E<xliff:g id="SEPARATOR">=</xliff:g>Etelänapa<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Soul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulan Bator"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanaria"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Peking<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sanaa"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanton"</item>
+ <item msgid="2077617905582224600">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanton<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 2379abc..c53290f 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Näytä kello"</string>
<string name="hide_clock" msgid="3217727306480505694">"Piilota kello"</string>
<string name="label" msgid="162189613902857319">"Tunniste"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Käytössä"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Ei käytössä"</string>
<string name="default_label" msgid="5590025289805630372">"Herätys"</string>
<string name="set_alarm" msgid="9148359866152726808">"Aseta herätys"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Värinä"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Toisto"</string>
<string name="alert" msgid="6506982899651975645">"Herätyksen soittoääni"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Muokattu soittoääni"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Ajastin lopussa"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Äänetön"</string>
<string name="ringtone" msgid="9110746249688559579">"Soittoääni"</string>
<string name="time" msgid="8067216534232296518">"Aika"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Huomenna"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Torkkuhälytys <xliff:g id="TIME">%s</xliff:g> saakka"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Tuleva herätys"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Ohitettu herätys on poistettu"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Alle minuutti jäljellä"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> jäljellä"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> jäljellä"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> jäljellä"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Alle minuutti jäljellä"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> jäljellä"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"jäljellä"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"jäljellä"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Herätykseen on aikaa alle minuutti."</item>
<item msgid="6002066367368421848">"Herätykseen on aikaa <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minuuttia</item>
<item quantity="one">minuutti</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Lisää äänenvoimakkuutta vähitellen"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Ei käytössä"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> sekuntia"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sekuntia"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Herätyksen kesto"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuuttia</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Peruuta muutokset"</string>
<string name="delete" msgid="5732434972457000541">"Poista"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Herätysäänen voimakkuus"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Äänetön"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Äänetön"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Tuntematon"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Aseta torkku tai hylkää herätys."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (torkku)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Herätysajaksi on asetettu <xliff:g id="TIME">%s</xliff:g>. Peruuta koskettamalla."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Ladataan soittoääntä..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Äänentoistopalvelu kelloon asetetuille ajastuksille."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Aseta herätys"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Herätys"</string>
<string name="menu_timer" msgid="6459070074762877114">"Ajastin"</string>
<string name="menu_clock" msgid="5612760670606829805">"Kello"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Lajittele nimen mukaan"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Valitut kaupungit"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Jatka"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Käynnistä"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Pysäytä"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Kierros"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Nollaa"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Käynnistä"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Keskeytä"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Kierros"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Jaa"</string>
<string name="hours_label" msgid="3393478155635368097">"t"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Oma aika: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Kierrosajat:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Kierros <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> tuntia</item>
<item quantity="one">1 tunti</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Lisää 1 minuutti"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Lisää 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Pysäytä"</string>
- <string name="timer_done" msgid="2375990511982914051">"Valmis"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Pysäytä kaikki ajastimet"</string>
<string name="timer_reset" msgid="7848424809190171640">"Nollaa"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Peruuta"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Ajastimen asetus peruutettiin."</string>
<string name="timer_times_up" msgid="9190440395938519009">"Aika loppui"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ajastinta umpeutui"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Ajastin"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Enintään neljä ajastinta"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Keskeytä"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Nollaa ajastimet"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Olet supernopea."</item>
<item msgid="6332879039890727169">"Nauti työsi hedelmistä."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Kaupungit"</string>
<string name="clock_settings" msgid="8317286807280600391">"Kello"</string>
<string name="clock_style" msgid="2265011060429742344">"Tyyli"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Vaihda päivämäärä ja aika"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analoginen"</item>
<item msgid="8483930821046925592">"Digitaalinen"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"-"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">".00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">".30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> valittu"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"valinta <xliff:g id="CITY_NAME">%s</xliff:g> poistettu"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshallinsaaret"</item>
<item msgid="4196408495909011020">"Midwaysaari"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Herätykset"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Sekuntikello, joka näyttää ilmoituksen."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Pysäytetty"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Käsittelee ajastimen ilmoitusten toimintoja."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Käsittelee sekuntikellon ilmoitusten toimintoja."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Pysäytetty"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Ohita pyyhkäisemällä oikealle"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Torkuta pyyhkäisemällä vasemmalle"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Torkuta pyyhkäisemällä vasemmalle tai sulje pyyhkäisemällä oikealle."</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Ajastimet"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ajastimen soittoääni"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Ajastin pysäytetty"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> ajastinta pysäytetty"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Ajastin keskeytetty"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> ajastinta keskeytetty"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Kosketa ja näytä ajastimet"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ajastinta"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Seuraava ajastin: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Ei herätyksiä"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Ei herätyksiä"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"EI TULEVIA HÄLYTYKSIÄ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k.mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h.mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k.mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Virheellinen aika <xliff:g id="INVALID_HOUR">%d</xliff:g>.<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Kello <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>.<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> ei ole hälytystä."</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Ei ajastettuja hälytyksiä"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Tunnistetta ei ole määritetty."</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Yksikään herätys ei sisällä tunnistetta."</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Sekuntikello on jo käynnissä."</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Sekuntikello ei ole käynnissä."</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Sekuntikelloa ei voi nollata sen ollessa käynnissä."</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Sekuntikello on pysäytetty."</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Sekuntikello pysäytetty"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Sekuntikello on nollattu."</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Sekuntikellon kierrosaika on asetettu."</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Sekuntikello on käynnistetty."</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Kyseisenä ajankohtana ei ole hälytystä."</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> herätys ohitettiin."</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Herätysajaksi on asetettu <xliff:g id="ALARM_TIME">%s</xliff:g>."</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Ajastinta ei ole asetettu."</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Ajastin poistettiin."</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Ajastin on jo käynnissä."</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Pyynnön suorittaminen ei onnistu. Asetettuna on useita ajastimia."</string>
- <string name="timer_started" msgid="6715582052946641641">"Ajastin käynnistettiin."</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Ajastimia ei ole."</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Ajastimia on useita."</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Ajastin on poistettu."</string>
<string name="timer_created" msgid="4381027137335885547">"Ajastin on luotu."</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Virheellinen ajastimen pituus"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Ajastin nollattiin."</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Ajastinta ei voi nollata, koska se on yhä käynnissä. Pysäytä ajastin ennen nollausta."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Ajastin on jo pysäytetty."</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Ajastin poistettiin."</string>
+ <string name="timer_started" msgid="6715582052946641641">"Ajastin käynnistettiin."</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Virheellinen ajastimen pituus"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Kaupunkia ei ole valittu."</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Määrittämäsi kaupunki ei ole käytettävissä."</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Kaupunki on jo lisätty."</string>
diff --git a/res/values-fr-rCA/array.xml b/res/values-fr-rCA/array.xml
index 2117870..a60b11b 100644
--- a/res/values-fr-rCA/array.xml
+++ b/res/values-fr-rCA/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenade"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala (ville)"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyane"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"L<xliff:g id="SEPARATOR">=</xliff:g>La Havane"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"P<xliff:g id="SEPARATOR">=</xliff:g>Pôle Sud"</item>
+ <item msgid="498429228419399474">"P<xliff:g id="SEPARATOR">=</xliff:g>Pôle Sud<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hébron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Hô-Chi-Minh-Ville"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jérusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manille"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Mascate"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoun"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyad"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saïgon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Séoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapour"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Téhéran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"O<xliff:g id="SEPARATOR">=</xliff:g>Oulan-Bator"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermudes"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canari"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Pékin"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Pékin<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sanaa"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelone"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"C<xliff:g id="SEPARATOR">=</xliff:g>Canton"</item>
+ <item msgid="2077617905582224600">"C<xliff:g id="SEPARATOR">=</xliff:g>Canton<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index db449e7..e8a77ec 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -28,12 +28,15 @@
<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">"Étiquette"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Activée"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Désactivée"</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="6506982899651975645">"Sonnerie de l\'alarme"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Sonnerie personnalisée"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Minuterie expirée"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Mode silencieux"</string>
<string name="ringtone" msgid="9110746249688559579">"Sonnerie"</string>
<string name="time" msgid="8067216534232296518">"Heure"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Demain"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Répétition jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Alarme imminente"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Votre alarme manquée a été supprimée"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Dans moins d\'une minute"</item>
- <item msgid="83197792732433351">"Dans <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Dans <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Dans <xliff:g id="HOURS">%1$s</xliff:g> et <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Il reste moins d\'une minute…"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Il reste <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"Il reste"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"Il reste"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Prochaine alarme prévue dans moins d\'une minute."</item>
<item msgid="6002066367368421848">"Prochaine alarme prévue dans <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="one">minute</item>
<item quantity="other">minutes</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Augmenter le volume progressivement"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Désactivé"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> secondes"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"secondes"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Silencieux automatique après"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minute</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Rétablir"</string>
<string name="delete" msgid="5732434972457000541">"Supprimer"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volume de l\'alarme"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Mode silencieux"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Mode silencieux"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Inconnu"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Répétez ou ignorez l\'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="4819324081410990368">"Prochaine alarme à <xliff:g id="TIME">%s</xliff:g>. Appuyez pour annuler."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Chargement de la sonnerie..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Service de lecture audio pour les minuteurs définis via l\'Horloge."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Régler l\'alarme"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarme"</string>
<string name="menu_timer" msgid="6459070074762877114">"Minuteur"</string>
<string name="menu_clock" msgid="5612760670606829805">"Horloge"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Trier par nom"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Villes sélectionnées"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Reprendre"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Démarrer"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Arrêter"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Intervalle"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Réinitialiser"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Démarrer"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Intervalle"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Partager"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"min"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Mon heure est <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Temps de circuit :"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Tour <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Nº <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Nº <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> heure</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> heures</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Ajouter 1 minute"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Ajouter 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Arrêter"</string>
- <string name="timer_done" msgid="2375990511982914051">"Terminé"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Arrêter tous les minuteurs"</string>
<string name="timer_reset" msgid="7848424809190171640">"Réinitialiser"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Annuler"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Le minuteur a été annulé"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Le temps est écoulé."</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> minuteries expirées"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Minuteur"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Un maximum de quatre minuteries est autorisé"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Interrompre"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Réinit. minut."</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"On peut dire que vous êtes rapide."</item>
<item msgid="6332879039890727169">"Profitez du fruit de votre travail."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Villes"</string>
<string name="clock_settings" msgid="8317286807280600391">"Horloge"</string>
<string name="clock_style" msgid="2265011060429742344">"Style"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Modifier la date et l\'heure"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogique"</item>
<item msgid="8483930821046925592">"Numérique"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"-"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> coché"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> décoché"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Îles Marshall"</item>
<item msgid="4196408495909011020">"Atoll de Midway"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmes"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Chronomètre pour exécuter la notification"</string>
- <string name="swn_stopped" msgid="783124901663086172">"Arrêté"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Traite les actions des notifications du minuteur."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Traite les actions des notifications du chronomètre."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Interrompu"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Glissez vers la droite pour supprimer"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Glissez vers la gauche pour répéter"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Glisser le doigt vers la gauche pour répéter, ou vers la droite pour ignorer"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Minuteurs"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Sonnerie du minuteur"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Arrêt du minuteur"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Arrêt de <xliff:g id="NUMBER">%d</xliff:g> minuteurs"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Minuterie en pause"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> minuteries en pause"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Appuyer ici pour afficher les minuteurs"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> minuteurs"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Minuteur suivant : <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Aucune alarme"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Aucune alarme"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"AUCUNE ALARME À VENIR"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h h mm min"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k h mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h h mm"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k h mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Heure non valide : <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Aucune alarme définie à <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Aucun alarme n\'a été programmée"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Aucune étiquette n\'a été spécifiée"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Aucune alarme ne contient cette étiquette"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Le chronomètre est déjà en cours d\'utilisation"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Le chronomètre n\'est pas lancé"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Le chronomètre ne peut pas être remis à zéro, car il est en cours d\'utilisation"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Chronomètre arrêté"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Le chronomètre est interrompu"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Chronomètre remis à zéro"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Chronomètre en mode tour"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Chronomètre démarré"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Aucune alarme prévue à cette heure"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"L\'alarme de <xliff:g id="ALARM_TIME">%s</xliff:g> a été ignorée"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"L\'alarme est réglée à <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Aucune minuterie n\'est définie"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Minuterie supprimée"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"La minuterie est déjà en cours d\'exécution"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Impossible de traiter votre demande. Plusieurs minuteries sont actives."</string>
- <string name="timer_started" msgid="6715582052946641641">"La minuterie a été lancée"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Aucune minuterie définie"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Plusieurs minuteries existent"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"La minuterie a été supprimée."</string>
<string name="timer_created" msgid="4381027137335885547">"Minuterie créée"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Longueur de minuterie non valide"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"La minuterie a été remise à zéro"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Impossible de remettre la minuterie à zéro, car elle est toujours en cours. Arrêtez-la pour la réinitialiser."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"La minuterie est déjà arrêtée"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Minuterie supprimée"</string>
+ <string name="timer_started" msgid="6715582052946641641">"La minuterie a été lancée"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Longueur de minuterie non valide"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Aucune ville n\'a été sélectionnée"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"La ville que vous avez indiquée n\'a pas été trouvée"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Cette ville a déjà été ajoutée"</string>
diff --git a/res/values-fr/array.xml b/res/values-fr/array.xml
index d91b3f3..68b16a9 100644
--- a/res/values-fr/array.xml
+++ b/res/values-fr/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenade"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala (ville)"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyane"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"L<xliff:g id="SEPARATOR">=</xliff:g>La Havane"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"P<xliff:g id="SEPARATOR">=</xliff:g>Pôle Sud"</item>
+ <item msgid="498429228419399474">"P<xliff:g id="SEPARATOR">=</xliff:g>Pôle Sud<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hébron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Hô-Chi-Minh-Ville"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"D<xliff:g id="SEPARATOR">=</xliff:g>Djakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jérusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manille"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Mascate"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoun"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyad"</item>
<item msgid="4229224905931739201">"H<xliff:g id="SEPARATOR">=</xliff:g>Hô-Chi-Minh-Ville"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Séoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapour"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Téhéran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel-Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"O<xliff:g id="SEPARATOR">=</xliff:g>Oulan-Bator"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermudes"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canaries"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Pékin"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Pékin<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sanaa"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelone"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 9546a2e..d8a7fab 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"Activée"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Désactivée"</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="6506982899651975645">"Sonnerie de l\'alarme"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Sonnerie personnalisée"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Minuteur arrivé à expiration"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silencieux"</string>
<string name="ringtone" msgid="9110746249688559579">"Sonnerie"</string>
<string name="time" msgid="8067216534232296518">"Heure"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Demain"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Répétition jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Alarme imminente"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Votre alarme manquée a été supprimée."</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Dans moins d\'une minute"</item>
- <item msgid="83197792732433351">"Dans <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Dans <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Dans <xliff:g id="HOURS">%1$s</xliff:g> et <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Dans moins d\'une minute"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Dans <xliff:g id="HOURS">%1$s</xliff:g> et <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"Dans"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"Dans"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Prochaine alarme prévue dans moins d\'une minute."</item>
<item msgid="6002066367368421848">"Prochaine alarme prévue dans <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="one">minute</item>
<item quantity="other">minutes</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Augmenter le volume progressivement"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Désactivé"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> secondes"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"secondes"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Arrêter la sonnerie après"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minute</item>
@@ -126,7 +133,8 @@
<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="silent_alarm_summary" msgid="8605302849408279221">"Silencieuse"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silencieux"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Inconnue"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Répétez ou ignorez l\'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="4819324081410990368">"Prochaine alarme à <xliff:g id="TIME">%s</xliff:g>. Appuyez pour annuler."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Chargement de la sonnerie..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Service de lecture audio pour les minuteurs définis via l\'Horloge."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Régler l\'alarme"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarme"</string>
<string name="menu_timer" msgid="6459070074762877114">"Minuteur"</string>
<string name="menu_clock" msgid="5612760670606829805">"Horloge"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Trier par nom"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Villes sélectionnées"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Reprendre"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Démarrer"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Arrêter"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Intervalle"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Réinitialiser"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Démarrer"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pause"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Intervalle"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Partager"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"min"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Mon heure est <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Temps de circuit :"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Tour <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"N° <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"N° <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> heure</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> heures</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Ajouter 1 minute"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Ajouter 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Arrêter"</string>
- <string name="timer_done" msgid="2375990511982914051">"OK"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Arrêter tous les minuteurs"</string>
<string name="timer_reset" msgid="7848424809190171640">"Réinitialiser"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Annuler"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Le minuteur a été annulé."</string>
<string name="timer_times_up" msgid="9190440395938519009">"Le temps est écoulé."</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> minuteurs ont expiré."</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Minuteur"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Quatre minuteurs maximum."</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Interrompre"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Réinit. minuteurs"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"On peut dire que vous êtes rapide."</item>
<item msgid="6332879039890727169">"Profitez du fruit de votre travail."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Villes"</string>
<string name="clock_settings" msgid="8317286807280600391">"Horloge"</string>
<string name="clock_style" msgid="2265011060429742344">"Style"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Modifier la date et l\'heure"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogique"</item>
<item msgid="8483930821046925592">"Numérique"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Case \"<xliff:g id="CITY_NAME">%s</xliff:g>\" cochée"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Case \"<xliff:g id="CITY_NAME">%s</xliff:g>\" décochée"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Îles Marshall"</item>
<item msgid="4196408495909011020">"Atoll de Midway"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmes"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Chronomètre pour exécuter la notification"</string>
- <string name="swn_stopped" msgid="783124901663086172">"Arrêté"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Traite les actions issues des notifications du minuteur."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Traite les actions issues des notifications du chronomètre."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Interrompu"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Faire glisser le doigt vers la droite pour ignorer"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Faire glisser le doigt vers la gauche pour répéter"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Faire glisser le doigt vers la gauche pour répéter ou vers la droite pour ignorer"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Minuteurs"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Sonnerie du minuteur"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Arrêt du minuteur"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Arrêt de <xliff:g id="NUMBER">%d</xliff:g> minuteurs"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Minuteur interrompu"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> minuteurs interrompus"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Appuyer ici pour afficher les minuteurs"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> minuteurs"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Minuteur suivant : <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Aucune alarme"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Aucune alarme"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"AUCUNE ALARME À VENIR"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Heure non valide <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Aucune alarme définie à <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>."</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Aucune alarme n\'est programmée."</string>
<string name="no_label_specified" msgid="2008482054428460626">"Aucun libellé spécifié."</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Aucune alarme ne comporte le libellé"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Le chronomètre est déjà lancé."</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Le chronomètre n\'est pas lancé."</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Impossible de réinitialiser le chronomètre, car il est en cours d\'exécution."</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Le chronomètre a bien été arrêté."</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Le chronomètre a bien été interrompu."</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Le chronomètre a bien été réinitialisé."</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Le chronomètre a bien enregistré un tour."</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Le chronomètre a bien été lancé."</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Aucune alarme n\'est programmée à cette heure."</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"L\'alarme de <xliff:g id="ALARM_TIME">%s</xliff:g> a été ignorée."</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarme à <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Aucun minuteur n\'est défini."</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Le minuteur a été supprimé."</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Le minuteur est déjà lancé."</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Impossible de traiter votre demande. Plusieurs minuteurs sont disponibles."</string>
- <string name="timer_started" msgid="6715582052946641641">"Le minuteur a été lancé."</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Aucun minuteur défini."</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Plusieurs minuteurs sont définis."</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Le minuteur a été supprimé."</string>
<string name="timer_created" msgid="4381027137335885547">"Le minuteur a bien été créé."</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Durée de minuteur incorrecte."</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Le minuteur a été remis à zéro."</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Impossible de remettre le minuteur à zéro, car il est toujours en cours. Arrêtez-le pour le réinitialiser."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Le minuteur est déjà arrêté."</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Le minuteur a été supprimé."</string>
+ <string name="timer_started" msgid="6715582052946641641">"Le minuteur a été lancé."</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Durée de minuteur incorrecte."</string>
<string name="no_city_selected" msgid="1007596865203283741">"Aucune ville n\'a été sélectionnée."</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"La ville indiquée n\'est pas disponible."</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Cette ville a déjà été ajoutée."</string>
diff --git a/res/values-gl-rES/array.xml b/res/values-gl-rES/array.xml
index e07e5eb..3e64c41 100644
--- a/res/values-gl-rES/array.xml
+++ b/res/values-gl-rES/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Granada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"C<xliff:g id="SEPARATOR">=</xliff:g>Cidade de Guatemala"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Güiana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>A Habana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Polo Sur"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Polo Sur<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almati"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amán"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebrón"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istambul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Iacarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Xerusalén"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Mascate"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangún"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riad"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigón"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seúl"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teherán"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Toquio"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Toquio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulán Bátor"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermudas"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Canarias"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Pequín"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Pequín<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sana"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hiderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 6a7304a..1b7e11b 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Mostrar reloxo"</string>
<string name="hide_clock" msgid="3217727306480505694">"Ocultar reloxo"</string>
<string name="label" msgid="162189613902857319">"Etiqueta"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Activada"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Desactivada"</string>
<string name="default_label" msgid="5590025289805630372">"Alarma"</string>
<string name="set_alarm" msgid="9148359866152726808">"Definir alarma"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrar"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Repetir"</string>
<string name="alert" msgid="6506982899651975645">"Ton de chamada da alarma"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Ton de chamada personalizado"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Finalizou o temporizador"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silencio"</string>
<string name="ringtone" msgid="9110746249688559579">"Ton de chamada"</string>
<string name="time" msgid="8067216534232296518">"Hora"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Mañá"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Repetir ás <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Próxima alarma"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Eliminouse a alarma perdida"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Queda menos dun minuto"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> restantes"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> restantes"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> restantes"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Queda menos dun minuto"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Quedan <xliff:g id="HOURS">%1$s</xliff:g> e <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"queda"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"quedan"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarma definida para dentro de menos de 1 minuto a partir de agora."</item>
<item msgid="6002066367368421848">"Alarma definida para dentro de <xliff:g id="DAYS">%1$s</xliff:g> a partir de agora."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minutos</item>
<item quantity="one">minuto</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Aumentar o volume gradualmente"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Desactivado"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> segundos"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"segundos"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Silenciar despois de"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutos</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Reverter"</string>
<string name="delete" msgid="5732434972457000541">"Eliminar"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volume da alarma"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencio"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silencio"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Descoñecido"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Adiar ou ignorar alarma."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (adiada)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarma definida para as <xliff:g id="TIME">%s</xliff:g>. Toca para cancelar."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Cargando ton de chamada..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Servizo de reprodución de son para os temporizadores definidos en Reloxo."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Definir alarma"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarma"</string>
<string name="menu_timer" msgid="6459070074762877114">"Temporizador"</string>
<string name="menu_clock" msgid="5612760670606829805">"Reloxo"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Ordenar por nome"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Cidades seleccionadas"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Continuar"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Iniciar"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Deter"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Volta"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Restablecer"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Iniciar"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Volta"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Compartir"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"O meu tempo é <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Tempos de volta:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Volta <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"N.º <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"N.º <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> horas</item>
<item quantity="one">Unha hora</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Engadir 1 minuto"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Engadir 1 minuto"</string>
<string name="timer_stop" msgid="3361154678667736722">"Deter"</string>
- <string name="timer_done" msgid="2375990511982914051">"Feito"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Deter temporizadores"</string>
<string name="timer_reset" msgid="7848424809190171640">"Restablecer"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Cancelar"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Cancelouse o temporizador"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Acabouse o tempo"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Xa se completaron <xliff:g id="NUM_TIMERS">%d</xliff:g> temporizadores"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Temporizador"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"4 temporizadores como máximo"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pausa"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Restablecer todo"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Es o rei da velocidade."</item>
<item msgid="6332879039890727169">"Goza dos froitos do teu traballo."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Cidades"</string>
<string name="clock_settings" msgid="8317286807280600391">"Reloxo"</string>
<string name="clock_style" msgid="2265011060429742344">"Estilo"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Cambiar data e hora"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analóxico"</item>
<item msgid="8483930821046925592">"Dixital"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Marcouse <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Desmarcouse <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Illas Marshall"</item>
<item msgid="4196408495909011020">"Illas Midway"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Iacarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmas"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Servizo de cronómetro para executar a notificación."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Detido"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Procesa accións das notificacións do temporizador."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Procesa accións das notificacións do cronómetro."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"En pausa"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Pasa o dedo cara a dereita para rexeitar"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Pasa o dedo cara a esquerda para adiar"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Pasa o dedo cara a esquerda para adiar e cara a dereita para ignorar"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Temporizadores"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ton de chamada do temporizador"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Temporizador detido"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores detidos"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Pausouse o temporizador"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores en pausa"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Toca para ver os temporizadores"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Seguinte temporizador: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Non hai alarmas"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Ningunha alarma"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NON HAI ALARMAS PROXIMAMENTE"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Hora non válida <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Non hai ningunha alarma ás <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Non hai ningunha alarma programada"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Non hai etiquetas especificadas"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Ningunha alarma contén a etiqueta"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Xa se está usando o cronómetro"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Non se está usando o cronómetro"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"O cronómetro non se pode restablecer porque está en funcionamento"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Detívose o cronómetro"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Pausouse o cronómetro"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Restableceuse o cronómetro"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Rexistrouse unha volta no cronómetro"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Iniciouse o cronómetro"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Non hai ningunha alarma programada para esta hora"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Ignorouse a alarma das <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"A alarma está definida para as <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Non hai ningún temporizador definido"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Eliminouse o temporizador"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Xa se está usando o temporizador"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Non se puido completar a solicitude porque hai varios temporizadores dispoñibles"</string>
- <string name="timer_started" msgid="6715582052946641641">"Iniciouse o temporizador"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Non hai temporizadores"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Hai máis dun temporizador"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Eliminouse o temporizador."</string>
<string name="timer_created" msgid="4381027137335885547">"Creouse o temporizador"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Duración de temporizador non válida"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Restableceuse o temporizador"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"O temporizador non se pode restablecer porque aínda se está usando. Detén o temporizador para restablecelo."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Xa se detivo o temporizador"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Eliminouse o temporizador"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Iniciouse o temporizador"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Duración de temporizador non válida"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Non hai ningunha cidade seleccionada"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"A cidade que especificaches non está dispoñible"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Xa se engadiu esa cidade"</string>
diff --git a/res/values-gu-rIN/array.xml b/res/values-gu-rIN/array.xml
index f51783b..d0dceb1 100644
--- a/res/values-gu-rIN/array.xml
+++ b/res/values-gu-rIN/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ફ<xliff:g id="SEPARATOR">=</xliff:g>ફોર્ટાલેઝા"</item>
<item msgid="5801558418916235541">"ગ<xliff:g id="SEPARATOR">=</xliff:g>ગ્રાન્ડ ટર્ક"</item>
<item msgid="2103759276235503048">"ગ<xliff:g id="SEPARATOR">=</xliff:g>ગ્રેનેડા"</item>
- <item msgid="1490069759176391533">"ગ<xliff:g id="SEPARATOR">=</xliff:g>ગ્વાટેમાલા"</item>
+ <item msgid="6216160110733510854">"ગ<xliff:g id="SEPARATOR">=</xliff:g>ગ્વાટેમાલા શહેર"</item>
<item msgid="525959305652046261">"ગ<xliff:g id="SEPARATOR">=</xliff:g>ગયાના"</item>
<item msgid="7565596629973190931">"હ<xliff:g id="SEPARATOR">=</xliff:g>હેલિફેક્સ"</item>
<item msgid="3811169155065582644">"હ<xliff:g id="SEPARATOR">=</xliff:g>હવાના"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ટ<xliff:g id="SEPARATOR">=</xliff:g>ટોરોન્ટો"</item>
<item msgid="1506838283840737263">"વ<xliff:g id="SEPARATOR">=</xliff:g>વેન્કુવર"</item>
<item msgid="8935386104773857399">"વ<xliff:g id="SEPARATOR">=</xliff:g>વિન્નિપેગ"</item>
- <item msgid="1132634022412399582">"સ<xliff:g id="SEPARATOR">=</xliff:g>સાઉથ પોલ"</item>
+ <item msgid="498429228419399474">"સ<xliff:g id="SEPARATOR">=</xliff:g>સાઉથ પોલ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"લ<xliff:g id="SEPARATOR">=</xliff:g>લોંગઇયરબિયેન"</item>
<item msgid="3784788073896028355">"અ<xliff:g id="SEPARATOR">=</xliff:g>અલ્માટી"</item>
<item msgid="7895695236056852523">"અ<xliff:g id="SEPARATOR">=</xliff:g>અમ્માન"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ગ<xliff:g id="SEPARATOR">=</xliff:g>ગાઝા"</item>
<item msgid="2359068282340162319">"હ<xliff:g id="SEPARATOR">=</xliff:g>હેબ્રોન"</item>
<item msgid="6223396610551759129">"હ<xliff:g id="SEPARATOR">=</xliff:g>હો ચી મિંહ"</item>
- <item msgid="4731022818651322736">"હ<xliff:g id="SEPARATOR">=</xliff:g>હોંગકોંગ"</item>
+ <item msgid="3439764751788710130">"હ<xliff:g id="SEPARATOR">=</xliff:g>હોંગકોંગ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"ઇ<xliff:g id="SEPARATOR">=</xliff:g>ઇસ્તંબુલ"</item>
<item msgid="758800913783999425">"જ<xliff:g id="SEPARATOR">=</xliff:g>જકાર્તા"</item>
<item msgid="8956406398692698126">"જ<xliff:g id="SEPARATOR">=</xliff:g>જેરુસલેમ"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"મ<xliff:g id="SEPARATOR">=</xliff:g>મનિલા"</item>
<item msgid="6033964325069060422">"મ<xliff:g id="SEPARATOR">=</xliff:g>મસ્કત"</item>
<item msgid="6077458941399984780">"ફ<xliff:g id="SEPARATOR">=</xliff:g>ફ્નોમ પેન્હ"</item>
- <item msgid="935474308903572975">"પ<xliff:g id="SEPARATOR">=</xliff:g>પ્યોંગયાંગ"</item>
+ <item msgid="1245515372520913197">"પ<xliff:g id="SEPARATOR">=</xliff:g>પ્યોંગયાંગ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"ક<xliff:g id="SEPARATOR">=</xliff:g>કતાર"</item>
<item msgid="1667243110545095146">"ર<xliff:g id="SEPARATOR">=</xliff:g>રંગૂન"</item>
<item msgid="4460370766685855731">"ર<xliff:g id="SEPARATOR">=</xliff:g>રિયાધ"</item>
<item msgid="4229224905931739201">"સ<xliff:g id="SEPARATOR">=</xliff:g>સૈગોન"</item>
<item msgid="8705359848250215620">"સ<xliff:g id="SEPARATOR">=</xliff:g>સીઓલ"</item>
- <item msgid="583367295371395814">"સ<xliff:g id="SEPARATOR">=</xliff:g>શંઘાઇ"</item>
+ <item msgid="3814881931186962624">"સ<xliff:g id="SEPARATOR">=</xliff:g>શંઘાઇ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"સ<xliff:g id="SEPARATOR">=</xliff:g>સિંગાપુર"</item>
- <item msgid="1972491729911039207">"ત<xliff:g id="SEPARATOR">=</xliff:g>તાઇપેઇ"</item>
+ <item msgid="8982451946156859368">"ત<xliff:g id="SEPARATOR">=</xliff:g>તાઇપેઇ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"ત<xliff:g id="SEPARATOR">=</xliff:g>તેહરાન"</item>
<item msgid="8629402941285674273">"ત<xliff:g id="SEPARATOR">=</xliff:g>તેલ અવિવ"</item>
- <item msgid="8499164674454654525">"ટ<xliff:g id="SEPARATOR">=</xliff:g>ટોકિયો"</item>
+ <item msgid="76330681636547168">"ટ<xliff:g id="SEPARATOR">=</xliff:g>ટોકિયો<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"ઉ<xliff:g id="SEPARATOR">=</xliff:g>ઉલાંબતાર"</item>
<item msgid="2028626988021468640">"બ<xliff:g id="SEPARATOR">=</xliff:g>બર્મુડા"</item>
<item msgid="4527109966513690429">"ક<xliff:g id="SEPARATOR">=</xliff:g>કૅનેરી"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"ર<xliff:g id="SEPARATOR">=</xliff:g>રેનો"</item>
<item msgid="9155068631060038769">"બ<xliff:g id="SEPARATOR">=</xliff:g>બ્લેક રોક સિટી"</item>
<item msgid="8498761319928979900">"દ<xliff:g id="SEPARATOR">=</xliff:g>દોહા"</item>
- <item msgid="8307897251088048641">"બ<xliff:g id="SEPARATOR">=</xliff:g>બેઇજિંગ"</item>
+ <item msgid="5327010922199714808">"બ<xliff:g id="SEPARATOR">=</xliff:g>બેઇજિંગ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"મ<xliff:g id="SEPARATOR">=</xliff:g>મુંબઈ"</item>
<item msgid="6668274273067049125">"દ<xliff:g id="SEPARATOR">=</xliff:g>દિલ્હી"</item>
- <item msgid="2933410189478233292">"ઓ<xliff:g id="SEPARATOR">=</xliff:g>ઓસાકા"</item>
+ <item msgid="7199039603593847813">"ઓ<xliff:g id="SEPARATOR">=</xliff:g>ઓસાકા<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"લ<xliff:g id="SEPARATOR">=</xliff:g>લાહોર"</item>
<item msgid="1448378291805481500">"સ<xliff:g id="SEPARATOR">=</xliff:g>સાના"</item>
<item msgid="5233119846682408301">"બ<xliff:g id="SEPARATOR">=</xliff:g>બાર્સેલોના"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"ક<xliff:g id="SEPARATOR">=</xliff:g>કેમ્બ્રિજ"</item>
<item msgid="759409010285366934">"ક<xliff:g id="SEPARATOR">=</xliff:g>કિર્કલૅંડ"</item>
<item msgid="6308007059287569663">"મ<xliff:g id="SEPARATOR">=</xliff:g>મેડિસન"</item>
- <item msgid="6971636434858330021">"ગ<xliff:g id="SEPARATOR">=</xliff:g>ગુઆંગઝાઉ"</item>
+ <item msgid="2077617905582224600">"ગ<xliff:g id="SEPARATOR">=</xliff:g>ગુઆંગઝાઉ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"હ<xliff:g id="SEPARATOR">=</xliff:g>હૈદરાબાદ"</item>
<item msgid="3032295682584784261">"ર<xliff:g id="SEPARATOR">=</xliff:g>રેસ્ટોન"</item>
<item msgid="7722837296297332268">"બ<xliff:g id="SEPARATOR">=</xliff:g>બેલો હોરીઝોન્ટે"</item>
diff --git a/res/values-gu-rIN/strings.xml b/res/values-gu-rIN/strings.xml
index e036fab..09d80f0 100644
--- a/res/values-gu-rIN/strings.xml
+++ b/res/values-gu-rIN/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"ઘડિયાળ બતાવો"</string>
<string name="hide_clock" msgid="3217727306480505694">"ઘડિયાળ છુપાવો"</string>
<string name="label" msgid="162189613902857319">"લેબલ"</string>
+ <string name="on_switch" msgid="2297966258029227449">"ચાલુ"</string>
+ <string name="off_switch" msgid="3381070073851148013">"બંધ"</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="6506982899651975645">"એલાર્મ રિંગટોન"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"કસ્ટમ રિંગટોન"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"ટાઇમરની સમય સીમા સમાપ્ત થઈ"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"શાંત"</string>
<string name="ringtone" msgid="9110746249688559579">"રિંગટોન"</string>
<string name="time" msgid="8067216534232296518">"સમય"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"આવતીકાલે"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> સુધી સ્નૂઝ કરીને"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"આગામી એલાર્મ"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"તમારો મિસ્ડ એલાર્મ કાઢી નાખવામાં આવ્યો છે"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"એક મિનિટ કરતા ઓછી બાકી છે"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> બાકી છે"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> બાકી છે"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> બાકી છે"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"એક મિનિટ કરતા ઓછી બાકી છે"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> બાકી છે"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"બાકી"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"બાકી"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"એલાર્મ હવેથી 1 મિનિટથી ઓછા સમય માટે સેટ થયો."</item>
<item msgid="6002066367368421848">"એલાર્મ હવેથી <xliff:g id="DAYS">%1$s</xliff:g> માટે સેટ થયો."</item>
@@ -101,6 +104,10 @@
<item quantity="one">મિનિટ</item>
<item quantity="other">મિનિટ</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"ધીમે-ધીમે વૉલ્યૂમ વધારો"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"બંધ"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> સેકંડ"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"સેકંડ"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"આના પછી શાંતિ"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> મિનિટ</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"પાછા ફરો"</string>
<string name="delete" msgid="5732434972457000541">"કાઢી નાખો"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"એલાર્મ વૉલ્યૂમ"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"શાંત"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"શાંત"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"અજાણ્યું"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"એલાર્મ સ્નૂઝ કરો અથવા કાઢી નાખો."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (સ્નૂઝ કરેલ)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"એલાર્મ <xliff:g id="TIME">%s</xliff:g> માટે સેટ થયો. રદ કરવા માટે ટચ કરો."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"રિંગટોન લોડ કરી રહ્યું છે..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"ઘડિયાળમાં સેટ કરેલ ટાઇમર્સ માટે ધ્વનિ પ્લેબેક સેવા."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"એલાર્મ સેટ કરો"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"એલાર્મ"</string>
<string name="menu_timer" msgid="6459070074762877114">"ટાઇમર"</string>
<string name="menu_clock" msgid="5612760670606829805">"ઘડિયાળ"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"નામ દ્વારા સૉર્ટ કરો"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"પસંદ કરેલ શહેરો"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"ફરી શરૂ કરો"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"પ્રારંભ કરો"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"રોકો"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"લેપ"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"રીસેટ કરો"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"પ્રારંભ કરો"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"લેપ"</string>
<string name="sw_share_button" msgid="4478648110382859382">"શેર કરો"</string>
<string name="hours_label" msgid="3393478155635368097">"ક"</string>
<string name="minutes_label" msgid="3568098128251438588">"મી."</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"મારો સમય છે <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"લેપ સમય:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"લેપ <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> કલાક</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> કલાક</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 મિનિટ ઉમેરો"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 મિનિટ ઉમેરો"</string>
<string name="timer_stop" msgid="3361154678667736722">"રોકો"</string>
- <string name="timer_done" msgid="2375990511982914051">"થઈ ગયું"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"બધા ટાઇમર્સ રોકો"</string>
<string name="timer_reset" msgid="7848424809190171640">"રીસેટ કરો"</string>
<string name="timer_cancel" msgid="3572868404230815644">"રદ કરો"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"ટાઇમર રદ કર્યું"</string>
<string name="timer_times_up" msgid="9190440395938519009">"સમય પૂરો થયો!"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ટાઇમર્સનો સમય સમાપ્ત થયો"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"ટાઇમર"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"મહત્તમ 4 ટાઇમર્સ"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"થોભાવો"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"બધા ટાઇમર્સ ફરીથી સેટ કરો"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"તમે એકદમ વેગવાન રાક્ષસ છો."</item>
<item msgid="6332879039890727169">"તમારી મહેનતના ફળનો આનંદ લો."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"શહેરો"</string>
<string name="clock_settings" msgid="8317286807280600391">"ઘડિયાળ"</string>
<string name="clock_style" msgid="2265011060429742344">"શૈલી"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"તારીખ અને સમય બદલો"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"એનાલોગ"</item>
<item msgid="8483930821046925592">"ડિજિટલ"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ચિહ્નિત કર્યું"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> અચિહ્નિત કર્યું"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"માર્શલ આઇલેન્ડ્સ"</item>
<item msgid="4196408495909011020">"મિડવે આઇલેન્ડ"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"જાકાર્તા"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"એલાર્મ્સ"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"સૂચના ચલાવવા માટે સ્ટોપવૉચ સેવા."</string>
- <string name="swn_stopped" msgid="783124901663086172">"રોક્યું"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"ટાઇમર સૂચનાઓમાંથી ક્રિયાઓ પર પ્રક્રિયા કરે છે."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"સ્ટોપવોચ સૂચનાઓમાંથી ક્રિયાઓ પર પ્રક્રિયા કરે છે."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"થોભાવી"</string>
<string name="description_direction_right" msgid="5709209043267548985">"કાઢી નાખવા માટે જમણે સવાઇપ કરો"</string>
<string name="description_direction_left" msgid="7448141043674998679">"સ્નૂઝ કરવા માટે ડાબે સ્વાઇપ કરો"</string>
<string name="description_direction_both" msgid="1841309486023845685">"સ્નૂઝ કરવા માટે ડાબે અથવા છોડી દેવા માટે જમણે સવાઇપ કરો"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"ટાઇમર્સ"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"ટાઇમર રિંગટોન"</string>
<string name="timer_stopped" msgid="2730331837832462008">"ટાઇમર બંધ કર્યું"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> ટાઇમર્સ બંધ કર્યાં"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"ટાઇમર થોભાવ્યું"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> ટાઇમર્સ થોભાવ્યાં"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"તમારા ટાઇમર્સ જોવા માટે ટચ કરો"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ટાઇમર્સ"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"આગલું ટાઇમર: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"એલાર્મ્સ નથી"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"કોઈ એલાર્મ્સ સેટ નથી"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"કોઈ આગામી એલાર્મ નથી"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"hh:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"અમાન્ય સમય <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> વાગ્યે કોઈ એલાર્મ નથી"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"કોઇ શેડ્યુલ કરેલ એલાર્મ્સ નથી"</string>
<string name="no_label_specified" msgid="2008482054428460626">"કોઈ લેબલ નિર્દિષ્ટ કરવામાં આવ્યું નથી"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"કોઈ એલાર્મ્સ લેબલ ધરાવતું નથી"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"સ્ટોપવૉચ પહેલાથી જ ચાલુ છે"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"સ્ટોપવૉચ ચાલુ નથી"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"સ્ટોપવૉચ ફરીથી સેટ કરી શકાતી નથી કારણ કે તે ચાલુ છે"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"સ્ટોપવૉચ બંધ થઈ"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"સ્ટોપવૉચ થોભાવી"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"સ્ટોપવૉચ ફરીથી સેટ કરવામાં આવી"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"સ્ટોપવૉચ લેપ થઈ ગઈ"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"સ્ટોપવૉચ શરૂ થઈ"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"આ સમય માટે કોઇ એલાર્મ શેડ્યુલ કરેલ નથી"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> એલાર્મ છોડી દીધો"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g> માટે એલાર્મ સેટ કરેલ છે"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"કોઇ ટાઇમર સેટ નથી"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"ટાઇમર કાઢી નાખ્યું"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"ટાઇમર પહેલેથી ચાલુ છે"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"તમારી વિનંતી પૂર્ણ કરવામાં અસમર્થ, બહુવિધ ટાઇમર્સ ઉપલબ્ધ"</string>
- <string name="timer_started" msgid="6715582052946641641">"ટાઇમર શરૂ કર્યું"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"કોઈ ટાઇમર્સ અસ્તિત્વમાં નથી"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"એક કરતાં વધુ ટાઇમર અસ્તિત્વમાં છે"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"ટાઇમર દૂર કરવામાં આવ્યું છે."</string>
<string name="timer_created" msgid="4381027137335885547">"ટાઇમર બનાવ્યું"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"અમાન્ય ટાઇમર લંબાઈ"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"ટાઇમર ફરીથી સેટ કર્યું"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"ટાઇમર ફરીથી સેટ કરી શકાતું નથી કારણ કે તે હજી ચાલુ છે. ફરીથી સેટ કરવા માટે ટાઇમર બંધ કરો."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"ટાઇમર પહેલેથી બંધ કરેલું છે"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"ટાઇમર કાઢી નાખ્યું"</string>
+ <string name="timer_started" msgid="6715582052946641641">"ટાઇમર શરૂ કર્યું"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"અમાન્ય ટાઇમર લંબાઈ"</string>
<string name="no_city_selected" msgid="1007596865203283741">"કોઇ શહેર પસંદ કરેલ નથી"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"તમે ઉલ્લેખ કરેલ શહેર ઉપલબ્ધ નથી"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"તે શહેર પહેલેથી ઉમેરેલું છે"</string>
diff --git a/res/values-hi/array.xml b/res/values-hi/array.xml
index 7912e30..476c7e3 100644
--- a/res/values-hi/array.xml
+++ b/res/values-hi/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"फ़<xliff:g id="SEPARATOR">=</xliff:g>फ़ोर्टालेज़ा"</item>
<item msgid="5801558418916235541">"ग<xliff:g id="SEPARATOR">=</xliff:g>ग्रांड टर्क"</item>
<item msgid="2103759276235503048">"ग<xliff:g id="SEPARATOR">=</xliff:g>ग्रेनेडा"</item>
- <item msgid="1490069759176391533">"ग<xliff:g id="SEPARATOR">=</xliff:g>ग्वाटेमाला"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>ग्वाटेमाला शहर"</item>
<item msgid="525959305652046261">"ग<xliff:g id="SEPARATOR">=</xliff:g>गुयाना"</item>
<item msgid="7565596629973190931">"ह<xliff:g id="SEPARATOR">=</xliff:g>हैलिफ़ैक्स"</item>
<item msgid="3811169155065582644">"ह<xliff:g id="SEPARATOR">=</xliff:g>हवाना"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ट<xliff:g id="SEPARATOR">=</xliff:g>टोरंटो"</item>
<item msgid="1506838283840737263">"व<xliff:g id="SEPARATOR">=</xliff:g>वैंकूवर"</item>
<item msgid="8935386104773857399">"व<xliff:g id="SEPARATOR">=</xliff:g>विनीपेग"</item>
- <item msgid="1132634022412399582">"द<xliff:g id="SEPARATOR">=</xliff:g>दक्षिणी ध्रुव"</item>
+ <item msgid="498429228419399474">"द<xliff:g id="SEPARATOR">=</xliff:g>दक्षिणी ध्रुव<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ल<xliff:g id="SEPARATOR">=</xliff:g>लॉन्जीरब्येन"</item>
<item msgid="3784788073896028355">"अ<xliff:g id="SEPARATOR">=</xliff:g>अल्माटी"</item>
<item msgid="7895695236056852523">"अ<xliff:g id="SEPARATOR">=</xliff:g>अम्मान"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ग<xliff:g id="SEPARATOR">=</xliff:g>गाज़ा"</item>
<item msgid="2359068282340162319">"ह<xliff:g id="SEPARATOR">=</xliff:g>हीब्रन"</item>
<item msgid="6223396610551759129">"ह<xliff:g id="SEPARATOR">=</xliff:g>हो ची मिन्ह"</item>
- <item msgid="4731022818651322736">"ह<xliff:g id="SEPARATOR">=</xliff:g>हांग कांग"</item>
+ <item msgid="3439764751788710130">"ह<xliff:g id="SEPARATOR">=</xliff:g>हांग कांग<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"इ<xliff:g id="SEPARATOR">=</xliff:g>इस्तांबुल"</item>
<item msgid="758800913783999425">"ज<xliff:g id="SEPARATOR">=</xliff:g>जकार्ता"</item>
<item msgid="8956406398692698126">"य<xliff:g id="SEPARATOR">=</xliff:g>यरूशलम"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"म<xliff:g id="SEPARATOR">=</xliff:g>मनीला"</item>
<item msgid="6033964325069060422">"म<xliff:g id="SEPARATOR">=</xliff:g>मस्कट"</item>
<item msgid="6077458941399984780">"न<xliff:g id="SEPARATOR">=</xliff:g>नॉम पेन्ह"</item>
- <item msgid="935474308903572975">"प<xliff:g id="SEPARATOR">=</xliff:g>प्योंगयांग"</item>
+ <item msgid="1245515372520913197">"प<xliff:g id="SEPARATOR">=</xliff:g>प्योंगयांग<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"क<xliff:g id="SEPARATOR">=</xliff:g>कतर"</item>
<item msgid="1667243110545095146">"र<xliff:g id="SEPARATOR">=</xliff:g>रंगून"</item>
<item msgid="4460370766685855731">"र<xliff:g id="SEPARATOR">=</xliff:g>रियाद"</item>
<item msgid="4229224905931739201">"स<xliff:g id="SEPARATOR">=</xliff:g>सेगॉन"</item>
<item msgid="8705359848250215620">"स<xliff:g id="SEPARATOR">=</xliff:g>सियोल"</item>
- <item msgid="583367295371395814">"श<xliff:g id="SEPARATOR">=</xliff:g>शंघाई"</item>
+ <item msgid="3814881931186962624">"श<xliff:g id="SEPARATOR">=</xliff:g>शंघाई<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"स<xliff:g id="SEPARATOR">=</xliff:g>सिंगापुर"</item>
- <item msgid="1972491729911039207">"त<xliff:g id="SEPARATOR">=</xliff:g>ताईपेई"</item>
+ <item msgid="8982451946156859368">"त<xliff:g id="SEPARATOR">=</xliff:g>ताईपेई<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"त<xliff:g id="SEPARATOR">=</xliff:g>तेहरान"</item>
<item msgid="8629402941285674273">"त<xliff:g id="SEPARATOR">=</xliff:g>तेल अवीव"</item>
- <item msgid="8499164674454654525">"ट<xliff:g id="SEPARATOR">=</xliff:g>टोक्यो"</item>
+ <item msgid="76330681636547168">"ट<xliff:g id="SEPARATOR">=</xliff:g>टोक्यो<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"उ<xliff:g id="SEPARATOR">=</xliff:g>उलानबाटार"</item>
<item msgid="2028626988021468640">"ब<xliff:g id="SEPARATOR">=</xliff:g>बरमूडा"</item>
<item msgid="4527109966513690429">"क<xliff:g id="SEPARATOR">=</xliff:g>कैनैरी"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"र<xliff:g id="SEPARATOR">=</xliff:g>रेनो"</item>
<item msgid="9155068631060038769">"ब<xliff:g id="SEPARATOR">=</xliff:g>ब्लैक रॉक सिटी"</item>
<item msgid="8498761319928979900">"द<xliff:g id="SEPARATOR">=</xliff:g>दोहा"</item>
- <item msgid="8307897251088048641">"ब<xliff:g id="SEPARATOR">=</xliff:g>बीजिंग"</item>
+ <item msgid="5327010922199714808">"ब<xliff:g id="SEPARATOR">=</xliff:g>बीजिंग<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"म<xliff:g id="SEPARATOR">=</xliff:g>मुंबई"</item>
<item msgid="6668274273067049125">"द<xliff:g id="SEPARATOR">=</xliff:g>दिल्ली"</item>
- <item msgid="2933410189478233292">"ओ<xliff:g id="SEPARATOR">=</xliff:g>ओसाका"</item>
+ <item msgid="7199039603593847813">"ओ<xliff:g id="SEPARATOR">=</xliff:g>ओसाका<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ल<xliff:g id="SEPARATOR">=</xliff:g>लाहौर"</item>
<item msgid="1448378291805481500">"स<xliff:g id="SEPARATOR">=</xliff:g>साना"</item>
<item msgid="5233119846682408301">"ब<xliff:g id="SEPARATOR">=</xliff:g>बार्सीलोना"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"क<xliff:g id="SEPARATOR">=</xliff:g>कैम्ब्रिज"</item>
<item msgid="759409010285366934">"क<xliff:g id="SEPARATOR">=</xliff:g>किर्कलैंड"</item>
<item msgid="6308007059287569663">"म<xliff:g id="SEPARATOR">=</xliff:g>मेडिसन"</item>
- <item msgid="6971636434858330021">"ग<xliff:g id="SEPARATOR">=</xliff:g>ग्वांगझू"</item>
+ <item msgid="2077617905582224600">"ग<xliff:g id="SEPARATOR">=</xliff:g>ग्वांगझू<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"ह<xliff:g id="SEPARATOR">=</xliff:g>हैदराबाद"</item>
<item msgid="3032295682584784261">"र<xliff:g id="SEPARATOR">=</xliff:g>रेस्टन"</item>
<item msgid="7722837296297332268">"ब<xliff:g id="SEPARATOR">=</xliff:g>बेलो हॉरीज़ोंटे"</item>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 5599172..7a6c306 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"घड़ी दिखाएं"</string>
<string name="hide_clock" msgid="3217727306480505694">"घड़ी छुपाएं"</string>
<string name="label" msgid="162189613902857319">"लेबल"</string>
+ <string name="on_switch" msgid="2297966258029227449">"चालू"</string>
+ <string name="off_switch" msgid="3381070073851148013">"बंद"</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="6506982899651975645">"अलार्म रिंगटोन"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"कस्टम रिंगटोन"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"टाइमर की समय सीमा समाप्त हो गई"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"मौन"</string>
<string name="ringtone" msgid="9110746249688559579">"रिंगटोन"</string>
<string name="time" msgid="8067216534232296518">"समय"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"कल"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> तक स्नूज़ कर रहा है"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"आगामी अलार्म"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"आपका छूटा हुआ अलार्म हटा दिया गया है"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"एक मिनट से कम समय शेष है"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> शेष"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> शेष"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> शेष"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"एक मिनट से कम समय शेष है"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> शेष"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"शेष"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"शेष"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"अब से 1 मिनट या उससे भी कम के भीतर का अलार्म सेट है."</item>
<item msgid="6002066367368421848">"अलार्म अब से <xliff:g id="DAYS">%1$s</xliff:g> के लिए सेट."</item>
@@ -101,6 +104,10 @@
<item quantity="one">मिनट</item>
<item quantity="other">मिनट</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"धीरे-धीरे वॉल्यूम बढ़ाएं"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"बंद"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> सेकंड"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"सेकंड"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"इतनी देर के बाद शांत करें"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> मिनट</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"पहले जैसा करें"</string>
<string name="delete" msgid="5732434972457000541">"हटाएं"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"अलार्म का वॉल्यूम"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"मौन"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"मौन"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"अज्ञात"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"थोडी देर बाद याद दिलाएं/बंद करें."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (याद दिलाया जाएगा)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"अलार्म <xliff:g id="TIME">%s</xliff:g> के लिए सेट. रद्द करने के लिए स्पर्श करें."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"रिंगटोन लोड कर रहा है…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"घड़ी में सेट टाइमर के लिए आवाज़ प्लेबैक सेवा."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"अलार्म सेट करें"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"अलार्म"</string>
<string name="menu_timer" msgid="6459070074762877114">"टाइमर"</string>
<string name="menu_clock" msgid="5612760670606829805">"घड़ी"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"नाम द्वारा क्रमित करें"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"चुनिंदा शहर"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"फिर से शुरू करें"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"प्रारंभ करें"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"रोकें"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"लैप"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"रीसेट करें"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"प्रारंभ करें"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"पॉज़ करें"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"लैप"</string>
<string name="sw_share_button" msgid="4478648110382859382">"साझा करें"</string>
<string name="hours_label" msgid="3393478155635368097">"घं."</string>
<string name="minutes_label" msgid="3568098128251438588">"मि."</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"मेरा समय <xliff:g id="TIME">%s</xliff:g> है"</string>
<string name="sw_share_laps" msgid="614390674795945007">"लैप अवधियां:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"लैप <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> घंटे</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> घंटे</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 मिनट जोड़ें"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 मिनट जोड़ें"</string>
<string name="timer_stop" msgid="3361154678667736722">"रोकें"</string>
- <string name="timer_done" msgid="2375990511982914051">"यहां हटाया गया"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"सभी टाइमर रोकें"</string>
<string name="timer_reset" msgid="7848424809190171640">"रीसेट करें"</string>
<string name="timer_cancel" msgid="3572868404230815644">"अभी नहीं"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"टाइमर रोक दिया गया"</string>
<string name="timer_times_up" msgid="9190440395938519009">"समय समाप्त"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> टाइमर की समय-सीमा समाप्त"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"टाइमर"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"अधिकतम 4 टाइमर"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"रोकें"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"सभी टाइमर रीसेट करें"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"आप गति को बहुत पसंद करते हैं."</item>
<item msgid="6332879039890727169">"अपने परिश्रम के फल का आनंद लें."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"शहर"</string>
<string name="clock_settings" msgid="8317286807280600391">"घड़ी"</string>
<string name="clock_style" msgid="2265011060429742344">"शैली"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"दिनांक और समय बदलना"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"ऐनालॉग"</item>
<item msgid="8483930821046925592">"डिजिटल"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> को चेक किया गया"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> को अनचेक किया गया"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"मार्शल द्वीप समूह"</item>
<item msgid="4196408495909011020">"मिडवे द्वीप"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"जकार्ता"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"अलार्म"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"नोटिफिकेशन चलाने के लिए स्टॉपवॉच सेवा."</string>
- <string name="swn_stopped" msgid="783124901663086172">"रोका गया"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"टाइमर नोटिफिकेशन से कार्यवाइयां संसाधित करती है."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"स्टॉपवॉच नोटिफिकेशन से कार्यवाइयां संसाधित करती है."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"रोका गया"</string>
<string name="description_direction_right" msgid="5709209043267548985">"ख़ारिज करने के लिए दाएं स्वाइप करें"</string>
<string name="description_direction_left" msgid="7448141043674998679">"याद दिलाने के लिए बाएं स्वाइप करें"</string>
<string name="description_direction_both" msgid="1841309486023845685">"याद दिलाने के लिए बाएं या ख़ारिज करने के लिए दाएं स्वाइप करें"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"टाइमर"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"टाइमर रिंगटोन"</string>
<string name="timer_stopped" msgid="2730331837832462008">"टाइमर रुक गया"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> टाइमर रुक गए"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"टाइमर रोका गया"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> टाइमर रोके गए"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"अपने टाइमर देखने के लिए स्पर्श करें"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> टाइमर"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"अगला टाइमर: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"कोई अलार्म नहीं"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"अलार्म सेट नहीं"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"कोई आगामी अलार्म नहीं"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"अमान्य समय <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> बजे का कोई अलार्म नहीं"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"कोई शेड्यूल किया गया अलार्म नहीं"</string>
<string name="no_label_specified" msgid="2008482054428460626">"कोई भी लेबल निर्दिष्ट नहीं है"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"किसी भी अलार्म में लेबल शामिल नहीं है"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"स्टॉपवॉच पहले से ही चल रही है"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"स्टॉपवॉच नहीं चल रही है"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"स्टॉपवॉच को रीसेट नहीं किया जा सकता क्योंकि वह चल रही है"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"स्टॉपवॉच बंद की गई"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"स्टॉपवॉच को रोका गया"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"स्टॉपवॉच को रीसेट किया गया"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"स्टॉपवॉच को लैप किया गया"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"स्टॉपवॉच प्रारंभ की गई"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"इस समय के लिए कोई अलार्म शेड्यूल नहीं किया गया है"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> अलार्म को ख़ारिज किया गया"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g> के लिए अलार्म सेट है"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"कोई टाइमर सेट नहीं किया गया"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"टाइमर हटाया गया"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"टाइमर पहले से चल रहा है"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"आपके अनुरोध को पूरा करने में असमर्थ, एकाधिक टाइमर उपलब्ध हैं"</string>
- <string name="timer_started" msgid="6715582052946641641">"टाइमर प्रारंभ हो गया"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"कोई टाइमर मौजूद नहीं है"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"एक से अधिक टाइमर मौजूद हैं"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"टाइमर निकाल दिया गया है."</string>
<string name="timer_created" msgid="4381027137335885547">"टाइमर बनाया गया"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"अमान्य टाइमर अवधि"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"टाइमर रीसेट किया गया"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"टाइमर को रीसेट नहीं किया जा सकता क्योंकि वह अब भी चल रहा है. टाइमर को रीसेट करने के लिए उसे बंद करें."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"टाइमर पहले से बंद कर दिया गया"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"टाइमर हटाया गया"</string>
+ <string name="timer_started" msgid="6715582052946641641">"टाइमर प्रारंभ हो गया"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"अमान्य टाइमर अवधि"</string>
<string name="no_city_selected" msgid="1007596865203283741">"कोई शहर नहीं चुना गया"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"आपके द्वारा निर्दिष्ट शहर उपलब्ध नहीं है"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"उस शहर को पहले से जोड़ा गया है"</string>
diff --git a/res/values-hr/array.xml b/res/values-hr/array.xml
index 17c8f63..fc310ba 100644
--- a/res/values-hr/array.xml
+++ b/res/values-hr/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Gvatemala"</item>
+ <item msgid="6216160110733510854">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Gvajana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"J<xliff:g id="SEPARATOR">=</xliff:g>Južni Pol"</item>
+ <item msgid="498429228419399474">"J<xliff:g id="SEPARATOR">=</xliff:g>Južni Pol<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Ši Min"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jeruzalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"K<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Rijad"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"Š<xliff:g id="SEPARATOR">=</xliff:g>Šangaj"</item>
+ <item msgid="3814881931186962624">"Š<xliff:g id="SEPARATOR">=</xliff:g>Šangaj<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanari"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Peking<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 43fc193..7bd7619 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Prikaži sat"</string>
<string name="hide_clock" msgid="3217727306480505694">"Sakrij sat"</string>
<string name="label" msgid="162189613902857319">"Oznaka"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Uključeno"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Isključeno"</string>
<string name="default_label" msgid="5590025289805630372">"Alarm"</string>
<string name="set_alarm" msgid="9148359866152726808">"Postavi alarm"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibracija"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Ponovi"</string>
<string name="alert" msgid="6506982899651975645">"Melodija alarma"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Prilagođena melodija zvona"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Tajmer je istekao"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Bešumno"</string>
<string name="ringtone" msgid="9110746249688559579">"Zvuk zvona"</string>
<string name="time" msgid="8067216534232296518">"Vrijeme"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Sutra"</string>
@@ -60,12 +63,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Odgoda alarma do <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Predstojeći alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Propušteni je alarm izbrisan"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Preostalo manje od minute"</item>
- <item msgid="83197792732433351">"Preostalo <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Preostalo <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Preostalo <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Preostalo manje od minute"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Preostalo je <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"preostalo"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"preostalo"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarm će se oglasiti za manje od 1 minute."</item>
<item msgid="6002066367368421848">"Alarm će se oglasiti za <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -108,6 +111,10 @@
<item quantity="few">minute</item>
<item quantity="other">minuta</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Postupno pojačavanje glasnoće"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Isključeno"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> s"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"s"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Utišaj nakon"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuta</item>
@@ -134,7 +141,8 @@
<string name="revert" msgid="9100911171235162926">"Poništi"</string>
<string name="delete" msgid="5732434972457000541">"Izbriši"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Glasnoća alarma"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Bešumno"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Tiho"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Nepoznato"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Odgodite ili obustavite alarm."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (odgoda alarma)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarm će se oglasiti u <xliff:g id="TIME">%s</xliff:g>. Dodirnite za poništavanje."</string>
@@ -159,8 +167,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Učitavanje melodije zvona…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Usluga reprodukcije zvuka za timere postavljena je u aplikaciji Sat."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Postavi alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Mjerač vremena"</string>
<string name="menu_clock" msgid="5612760670606829805">"Sat"</string>
@@ -175,10 +181,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Poredaj po nazivu"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Odabrani gradovi"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Nastavi"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Kreni"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Zaustavi"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Krug"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Poništi"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Kreni"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pauziraj"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Krug"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Dijeli"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -190,10 +196,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Moje je vrijeme <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Vremena krugova:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. krug"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Br. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Br. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> sat</item>
<item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> sata</item>
@@ -216,12 +218,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Dodaj 1 minutu"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Dodaj 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Zaustavi"</string>
- <string name="timer_done" msgid="2375990511982914051">"Završeno"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Zaustavi sve tajmere"</string>
<string name="timer_reset" msgid="7848424809190171640">"Poništi"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Odustani"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Odbrojavanje je otkazano"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Vrijeme je isteklo"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Tajmeri su istekli (<xliff:g id="NUM_TIMERS">%d</xliff:g>)"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Mjerač vremena"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Maksimalno 4 tajmera"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pauziraj"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Poništi tajmere"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Brzi ste kao munja."</item>
<item msgid="6332879039890727169">"Uživajte u plodovima svojeg rada."</item>
@@ -238,6 +244,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Gradovi"</string>
<string name="clock_settings" msgid="8317286807280600391">"Sat"</string>
<string name="clock_style" msgid="2265011060429742344">"Stil"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Promijeni datum i vrijeme"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogni"</item>
<item msgid="8483930821046925592">"Digitalni"</item>
@@ -252,6 +259,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Grad <xliff:g id="CITY_NAME">%s</xliff:g> potvrđen"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Grad <xliff:g id="CITY_NAME">%s</xliff:g> nije potvrđen"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Maršalovi Otoci"</item>
<item msgid="4196408495909011020">"Otok Midway"</item>
@@ -340,13 +349,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmi"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Usluga kronometra za pokretanje obavijesti."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Zaustavljeno"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Obrađuje radnje obavijesti mjerača vremena."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Obrađuje radnje obavijesti štoperice."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Pauzirano"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Prijeđite prstom udesno za odbacivanje"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Prijeđite prstom ulijevo za odgodu"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Prijeđite prstom ulijevo za odgodu ili udesno za odbacivanje"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Tajmeri"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Melodija zvona tajmera"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Mjerač vremena zaustavljen je"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Broj zaustavljenih mjerača vremena: <xliff:g id="NUMBER">%d</xliff:g>"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Tajmer je pauziran"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Broj pauziranih tajmera: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Dodirnite da biste vidjeli svoje mjerače vremena"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> mjerača vremena"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Sljedeći: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -373,35 +386,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Bez alarma"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Nema alarma"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NEMA PREDSTOJEĆIH ALARMA"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Vrijeme <xliff:g id="INVALID_HOUR">%d</xliff:g>.<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g> nije važeće"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Nema alarma u <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>.<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Nema postavljenih alarma"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nije navedena oznaka"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Nema alarma s tom oznakom"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Štoperica je već pokrenuta"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Štoperica nije pokrenuta"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Štoperica se ne može poništiti jer je pokrenuta"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Štoperica je zaustavljena"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Štoperica pauzirana"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Štoperica je poništena"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Novi krug štoperice"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Štoperica je pokrenuta"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Za to vrijeme nema postavljenih alarma"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Odbačen je alarm u <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm će se oglasiti u <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Nema postavljenih tajmera"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Tajmer je izbrisan"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Tajmer je već pokrenut"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Nije moguće dovršiti zahtjev jer je dostupno više tajmera"</string>
- <string name="timer_started" msgid="6715582052946641641">"Tajmer je pokrenut"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Nema mjerača vremena"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Ima više mjerača vremena"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Mjerač vremena je uklonjen."</string>
<string name="timer_created" msgid="4381027137335885547">"Tajmer je izrađen"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Nevažeća duljina tajmera"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Tajmer je poništen"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Tajmer se ne može poništiti jer još uvijek radi. Zaustavite ga da biste ga poništili."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Tajmer je već zaustavljen"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Tajmer je izbrisan"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Tajmer je pokrenut"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Nevažeća duljina tajmera"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Nije odabran nijedan grad"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Grad koji ste naveli nije dostupan"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Taj je grad već dodan"</string>
diff --git a/res/values-hu/array.xml b/res/values-hu/array.xml
index e3342c3..0a59f36 100644
--- a/res/values-hu/array.xml
+++ b/res/values-hu/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk-sziget"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemalaváros"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havanna"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"D<xliff:g id="SEPARATOR">=</xliff:g>Déli-sark"</item>
+ <item msgid="498429228419399474">"D<xliff:g id="SEPARATOR">=</xliff:g>Déli-sark<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almati"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Ammán"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gáza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Si Minh-város"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Isztambul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jeruzsálem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Maszkat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnompen"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Phenjan"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Phenjan<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"K<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangun"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Rijád"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"Sz<xliff:g id="SEPARATOR">=</xliff:g>Szöul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Sanghaj"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Sanghaj<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"Sz<xliff:g id="SEPARATOR">=</xliff:g>Szingapúr"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Tajpej"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Tajpej<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teherán"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel-Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokió"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokió<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulánbátor"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanári-szigetek"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Peking<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Oszaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Oszaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahor"</item>
<item msgid="1448378291805481500">"Sz<xliff:g id="SEPARATOR">=</xliff:g>Szanaa"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanton"</item>
+ <item msgid="2077617905582224600">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanton<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Haidarábád"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index a8ed015..fa29b6f 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Óra megjelenítése"</string>
<string name="hide_clock" msgid="3217727306480505694">"Óra elrejtése"</string>
<string name="label" msgid="162189613902857319">"Címke"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Be"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Ki"</string>
<string name="default_label" msgid="5590025289805630372">"Ébresztő"</string>
<string name="set_alarm" msgid="9148359866152726808">"Ébresztés beállítása"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Rezgés"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Ismétlődés"</string>
<string name="alert" msgid="6506982899651975645">"Ébresztés csengőhangja"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Egyéni csengőhang"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Az időzítő lejárt"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Néma"</string>
<string name="ringtone" msgid="9110746249688559579">"Csengőhang"</string>
<string name="time" msgid="8067216534232296518">"Időpont"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Holnap"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Ébresztés elhalasztása eddig: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Következő ébresztés"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Elmulasztott ébresztés törölve"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Kevesebb mint 1 perc van hátra"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> van hátra"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> van hátra"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> van hátra"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Kevesebb mint 1 perc van hátra"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> óra <xliff:g id="MINUTES">%2$s</xliff:g> perc van hátra"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"hátralévő idő"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"hátralévő idő:"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Riasztás beállítva: a jelenlegi időponttól számított kevesebb mint 1 perc múlva."</item>
<item msgid="6002066367368421848">"Riasztás beállítva: a jelenlegi időponttól számított <xliff:g id="DAYS">%1$s</xliff:g> múlva."</item>
@@ -101,6 +104,10 @@
<item quantity="other">perc</item>
<item quantity="one">perc</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Hangerő fokozatos növelése"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Ki"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> másodperc"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"másodperc"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Elnémítás ennyi idő után:"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> perc</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Visszavonás"</string>
<string name="delete" msgid="5732434972457000541">"Törlés"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Ébresztés hangereje"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Néma"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Néma"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Ismeretlen"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Szundi, vagy riasztás bezárása."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (szundiban)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Riasztás ideje: <xliff:g id="TIME">%s</xliff:g>. Érintse meg a visszavonáshoz."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Csengőhang betöltése..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Hanglejátszó szolgáltatás az Órában beállított időzítőkhöz."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Ébresztés beállítása"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Ébresztő"</string>
<string name="menu_timer" msgid="6459070074762877114">"Időzítő"</string>
<string name="menu_clock" msgid="5612760670606829805">"Óra"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Rendezés név szerint"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Kiválasztott városok"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Folytatás"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Indítás"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Leállítás"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Kör"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Nullázás"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Indítás"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Szünet"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Kör"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Megosztás"</string>
<string name="hours_label" msgid="3393478155635368097">"ó"</string>
<string name="minutes_label" msgid="3568098128251438588">"p"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Az én időm: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Köridők:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. kör"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Körök száma <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Körök száma <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> óra</item>
<item quantity="one">1 óra</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 perc hozzáadása"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 perc hozzáadása"</string>
<string name="timer_stop" msgid="3361154678667736722">"Leállítás"</string>
- <string name="timer_done" msgid="2375990511982914051">"Kész"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Az összes időzítő leállítása"</string>
<string name="timer_reset" msgid="7848424809190171640">"Visszaállítás"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Mégse"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Időzítés visszavonva"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Az idő lejárt!"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> időzítő lejárt"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Időzítő"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Legfeljebb 4 időzítő lehetséges"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Szüneteltetés"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Visszaállítás"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Ön valósággal a sebesség ördöge."</item>
<item msgid="6332879039890727169">"Élvezze a munkája gyümölcsét."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Városok"</string>
<string name="clock_settings" msgid="8317286807280600391">"Óra"</string>
<string name="clock_style" msgid="2265011060429742344">"Stílus"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Dátum és idő módosítása"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analóg"</item>
<item msgid="8483930821046925592">"Digitális"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"–"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> bejelölve"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> jelölése eltávolítva"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshall-szigetek"</item>
<item msgid="4196408495909011020">"Midway-szigetek"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Ébresztés"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Stopperóra az értesítés futtatásához."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Leállítva"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Feldolgozza az időzítő értesítéseiből származó műveleteket."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Feldolgozza a stopperóra értesítéseiből származó műveleteket."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Szüneteltetve"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Az elutasításhoz csúsztassa gyorsan jobbra"</string>
<string name="description_direction_left" msgid="7448141043674998679">"A szundihoz csúsztassa gyorsan balra"</string>
<string name="description_direction_both" msgid="1841309486023845685">"A szundihoz csúsztassa gyorsan balra, az elvetéshez pedig jobbra"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Időzítők"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Időzítő csengőhangja"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Időzítő megállítva"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> időzítő megállítva"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Időzítő szüneteltetve"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> időzítő szüneteltetve"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Érintse meg az időzítők megtekintéséhez"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> időzítő"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Következő időzítő: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Nincs ébresztés"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Nincs ébresztés"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NINCS KÖZELGŐ ÉBRESZTÉS"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Érvénytelen időpont: <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Nincs riasztás ekkor: <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Nincs ütemezett riasztás"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nincs megadva címke"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Egy riasztás sem tartalmazza a címkét"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"A stopper már elindult"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"A stopper nem indult el"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"A stoppert nem lehet visszaállítani, mert már elindult"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stopper megállítva"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stopper szüneteltetve"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stopper visszaállítva"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stopper részidő mérve"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stopper elindítva"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Nincs riasztás beállítva erre az időpontra"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> – riasztás elvetve"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"A riasztás időpontja: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Nincs időzítő beállítva"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Időzítő törölve"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Az időzítő már elindult"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Nem sikerült teljesíteni a műveletet, mert több időzítő áll rendelkezésre"</string>
- <string name="timer_started" msgid="6715582052946641641">"Időzítő elindítva"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Nincs időzítő"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Egynél több időzítő van beállítva"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Az időzítőt eltávolították."</string>
<string name="timer_created" msgid="4381027137335885547">"Időzítő létrehozva"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Az időzítő hossza érvénytelen"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Időzítő visszaállítva"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Az időzítőt nem lehet visszaállítani, mert még mindig fut. Állítsa le a visszaállításhoz."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Az időzítő már megállt"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Időzítő törölve"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Időzítő elindítva"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Az időzítő hossza érvénytelen"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Nincs város kiválasztva"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"A megadott város nem érhető el"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Ez a város már hozzá van adva"</string>
diff --git a/res/values-hy-rAM/array.xml b/res/values-hy-rAM/array.xml
index aa1b741..a84305d 100644
--- a/res/values-hy-rAM/array.xml
+++ b/res/values-hy-rAM/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"Ֆ<xliff:g id="SEPARATOR">=</xliff:g>Ֆորտալեզա"</item>
<item msgid="5801558418916235541">"Գ<xliff:g id="SEPARATOR">=</xliff:g>Գրանդ Տերկ"</item>
<item msgid="2103759276235503048">"Գ<xliff:g id="SEPARATOR">=</xliff:g>Գրենադա"</item>
- <item msgid="1490069759176391533">"Գ<xliff:g id="SEPARATOR">=</xliff:g>Գվատեմալա"</item>
+ <item msgid="6216160110733510854">"Գ<xliff:g id="SEPARATOR">=</xliff:g>Գվատեմալա"</item>
<item msgid="525959305652046261">"Գ<xliff:g id="SEPARATOR">=</xliff:g>Գայանա"</item>
<item msgid="7565596629973190931">"Հ<xliff:g id="SEPARATOR">=</xliff:g>Հալիֆաքս"</item>
<item msgid="3811169155065582644">"Հ<xliff:g id="SEPARATOR">=</xliff:g>Հավանա"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"Տ<xliff:g id="SEPARATOR">=</xliff:g>Տորոնտո"</item>
<item msgid="1506838283840737263">"Վ<xliff:g id="SEPARATOR">=</xliff:g>Վանկուվեր"</item>
<item msgid="8935386104773857399">"Վ<xliff:g id="SEPARATOR">=</xliff:g>Վիննիպեգ"</item>
- <item msgid="1132634022412399582">"Հ<xliff:g id="SEPARATOR">=</xliff:g>Հարավային Բևեռ"</item>
+ <item msgid="498429228419399474">"Հ<xliff:g id="SEPARATOR">=</xliff:g>Հարավային Բևեռ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"Լ<xliff:g id="SEPARATOR">=</xliff:g>Լոնգյերբյեն"</item>
<item msgid="3784788073896028355">"Ա<xliff:g id="SEPARATOR">=</xliff:g>Ալմա Աթա"</item>
<item msgid="7895695236056852523">"Ա<xliff:g id="SEPARATOR">=</xliff:g>Ամման"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"Գ<xliff:g id="SEPARATOR">=</xliff:g>Գազա"</item>
<item msgid="2359068282340162319">"Հ<xliff:g id="SEPARATOR">=</xliff:g>Հևրոն"</item>
<item msgid="6223396610551759129">"Հ<xliff:g id="SEPARATOR">=</xliff:g>Հո Չի Մին"</item>
- <item msgid="4731022818651322736">"Հ<xliff:g id="SEPARATOR">=</xliff:g>Հոնկոնգ"</item>
+ <item msgid="3439764751788710130">"Հ<xliff:g id="SEPARATOR">=</xliff:g>Հոնկոնգ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"Ս<xliff:g id="SEPARATOR">=</xliff:g>Ստամբուլ"</item>
<item msgid="758800913783999425">"Ջ<xliff:g id="SEPARATOR">=</xliff:g>Ջակարտա"</item>
<item msgid="8956406398692698126">"Ե<xliff:g id="SEPARATOR">=</xliff:g>Երուսաղեմ"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"Մ<xliff:g id="SEPARATOR">=</xliff:g>Մանիլա"</item>
<item msgid="6033964325069060422">"Մ<xliff:g id="SEPARATOR">=</xliff:g>Մուսկաթ"</item>
<item msgid="6077458941399984780">"Պ<xliff:g id="SEPARATOR">=</xliff:g>Պնոմպեն"</item>
- <item msgid="935474308903572975">"Փ<xliff:g id="SEPARATOR">=</xliff:g>Փխենյան"</item>
+ <item msgid="1245515372520913197">"Փ<xliff:g id="SEPARATOR">=</xliff:g>Փխենյան<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Ք<xliff:g id="SEPARATOR">=</xliff:g>Քաթար"</item>
<item msgid="1667243110545095146">"Ռ<xliff:g id="SEPARATOR">=</xliff:g>Ռանգուն"</item>
<item msgid="4460370766685855731">"Ռ<xliff:g id="SEPARATOR">=</xliff:g>Ռիադ"</item>
<item msgid="4229224905931739201">"Ս<xliff:g id="SEPARATOR">=</xliff:g>Սայգոն"</item>
<item msgid="8705359848250215620">"Ս<xliff:g id="SEPARATOR">=</xliff:g>Սեուլ"</item>
- <item msgid="583367295371395814">"Շ<xliff:g id="SEPARATOR">=</xliff:g>Շանհայ"</item>
+ <item msgid="3814881931186962624">"Շ<xliff:g id="SEPARATOR">=</xliff:g>Շանհայ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"Ս<xliff:g id="SEPARATOR">=</xliff:g>Սինգապուր"</item>
- <item msgid="1972491729911039207">"Տ<xliff:g id="SEPARATOR">=</xliff:g>Տայպեյ"</item>
+ <item msgid="8982451946156859368">"Տ<xliff:g id="SEPARATOR">=</xliff:g>Տայպեյ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"Թ<xliff:g id="SEPARATOR">=</xliff:g>Թեհրան"</item>
<item msgid="8629402941285674273">"Տ<xliff:g id="SEPARATOR">=</xliff:g>Տել Ավիվ"</item>
- <item msgid="8499164674454654525">"Տ<xliff:g id="SEPARATOR">=</xliff:g>Տոկիո"</item>
+ <item msgid="76330681636547168">"Տ<xliff:g id="SEPARATOR">=</xliff:g>Տոկիո<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"Ու<xliff:g id="SEPARATOR">=</xliff:g>Ուլան Բատոր"</item>
<item msgid="2028626988021468640">"Բ<xliff:g id="SEPARATOR">=</xliff:g>Բերմուդյան կղզիներ"</item>
<item msgid="4527109966513690429">"Կ<xliff:g id="SEPARATOR">=</xliff:g>Կանարյան կղզիներ"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"Ռ<xliff:g id="SEPARATOR">=</xliff:g>Ռենո"</item>
<item msgid="9155068631060038769">"Բ<xliff:g id="SEPARATOR">=</xliff:g>Բլեք Ռոք Սիթի"</item>
<item msgid="8498761319928979900">"Դ<xliff:g id="SEPARATOR">=</xliff:g>Դոհա"</item>
- <item msgid="8307897251088048641">"Պ<xliff:g id="SEPARATOR">=</xliff:g>Պեկին"</item>
+ <item msgid="5327010922199714808">"Պ<xliff:g id="SEPARATOR">=</xliff:g>Պեկին<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"Մ<xliff:g id="SEPARATOR">=</xliff:g>Մումբայ"</item>
<item msgid="6668274273067049125">"Դ<xliff:g id="SEPARATOR">=</xliff:g>Դելի"</item>
- <item msgid="2933410189478233292">"Օ<xliff:g id="SEPARATOR">=</xliff:g>Օսակա"</item>
+ <item msgid="7199039603593847813">"Օ<xliff:g id="SEPARATOR">=</xliff:g>Օսակա<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"Լ<xliff:g id="SEPARATOR">=</xliff:g>Լահոր"</item>
<item msgid="1448378291805481500">"Ս<xliff:g id="SEPARATOR">=</xliff:g>Սանաա"</item>
<item msgid="5233119846682408301">"Բ<xliff:g id="SEPARATOR">=</xliff:g>Բարսելոնա"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"Ք<xliff:g id="SEPARATOR">=</xliff:g>Քեմբրիջ"</item>
<item msgid="759409010285366934">"Կ<xliff:g id="SEPARATOR">=</xliff:g>Կիրկլենդ"</item>
<item msgid="6308007059287569663">"Մ<xliff:g id="SEPARATOR">=</xliff:g>Մեդիսոն"</item>
- <item msgid="6971636434858330021">"Գ<xliff:g id="SEPARATOR">=</xliff:g>Գուանչժոու"</item>
+ <item msgid="2077617905582224600">"Գ<xliff:g id="SEPARATOR">=</xliff:g>Գուանչժոու<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"Հ<xliff:g id="SEPARATOR">=</xliff:g>Հայդարաբադ"</item>
<item msgid="3032295682584784261">"Ռ<xliff:g id="SEPARATOR">=</xliff:g>Ռեստոն"</item>
<item msgid="7722837296297332268">"Բ<xliff:g id="SEPARATOR">=</xliff:g>Բելո Հորիզոնտե"</item>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 8396530..4764169 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Ցուցադրել ժամացույցը"</string>
<string name="hide_clock" msgid="3217727306480505694">"Թաքցնել ժամացույցը"</string>
<string name="label" msgid="162189613902857319">"Պիտակ"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Միացված է"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Անջատված է"</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="6506982899651975645">"Զարթուցիչի զանգերանգը"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Հարմարեցրած զանգերանգ"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Ժամաչափի ժամանակը սպառվել է"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Լուռ"</string>
<string name="ringtone" msgid="9110746249688559579">"Զանգերանգ"</string>
<string name="time" msgid="8067216534232296518">"Ժամանակ"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Վաղը"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Ննջում է մինչև <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Սպասվող ազդանշան"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Ձեր բաց թողած ազդանշանը հեռացված է"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Մնացել է մեկ րոպեից պակաս ժամանակ:"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> մինչ ավարտը"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> մինչ ավարտը"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> մինչ ավարտը"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Մնացել է գրեթե մեկ րոպե:"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Մնացել է <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"մնացել է"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"մնացել է"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Զարթուցիչը դրված է այս պահից 1 րոպեից պակաս:"</item>
<item msgid="6002066367368421848">"Զարթուցիչը դրված է այս պահից <xliff:g id="DAYS">%1$s</xliff:g> օր անց:"</item>
@@ -101,6 +104,10 @@
<item quantity="one">րոպե</item>
<item quantity="other">րոպե</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Աստիճանաբար մեծացնել տևողությունը"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Անջատված է"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> վայրկյան"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"վայրկյան"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Լռել"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> րոպե</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Հետադարձել"</string>
<string name="delete" msgid="5732434972457000541">"Ջնջել"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Զարթուցիչի ձայնի բարձրությունը"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Լուռ"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Լուռ"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Անհայտ"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Ննջել կամ անտեսել զարթուցիչը:"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ննջած է)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Զարթուցիչը դրված է <xliff:g id="TIME">%s</xliff:g>: Հպեք՝ չեղարկելու համար:"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Բեռնվում է զանգերանգը…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Զարթուցիչների ձայնի նվագարկման ծառայությունը դրված է ժամացույցում:"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Դնել զարթուցիչ"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Զարթուցիչ"</string>
<string name="menu_timer" msgid="6459070074762877114">"Ժամաչափ"</string>
<string name="menu_clock" msgid="5612760670606829805">"Ժամացույց"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Դասակարգել ըստ անունների"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Ընտրված քաղաքներ"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Շարունակել"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Մեկնարկել"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Դադարեցնել"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Շրջան"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Վերակայել"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Մեկնարկել"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Շրջան"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Տարածել"</string>
<string name="hours_label" msgid="3393478155635368097">"ժ"</string>
<string name="minutes_label" msgid="3568098128251438588">"ր"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Իմ ժամանակն է <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Շրջանի ժամանակը՝"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Շրջան <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ժամ</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ժամ</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Ավելացնել 1 րոպե"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Ավելացնել 1 րոպե"</string>
<string name="timer_stop" msgid="3361154678667736722">"Դադարեցնել"</string>
- <string name="timer_done" msgid="2375990511982914051">"Կատարված է"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Կանգնեցնել ժամանակաչափերը"</string>
<string name="timer_reset" msgid="7848424809190171640">"Վերակայել"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Չեղարկել"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Ժամաչափը չեղարկվել է"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Ժամանակը սպառվել է"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ժամանակաչափ սպառվել է"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Ժամաչափ"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"թույլատրվում է առավելագույնը 4 ժամաչափ"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Դադարեցնել"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Բոլոր ժամաչափերի վերակայում"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Դուք լրիվ արագության խենթ եք:"</item>
<item msgid="6332879039890727169">"Վայելեք ձեր աշխատանքի պտուղները:"</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Քաղաքներ"</string>
<string name="clock_settings" msgid="8317286807280600391">"Ժամացույց"</string>
<string name="clock_style" msgid="2265011060429742344">"Տեսակը"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Ամսաթվի և ժամի փոփոխում"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Անալոգ"</item>
<item msgid="8483930821046925592">"Թվային"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Նշված է <xliff:g id="CITY_NAME">%s</xliff:g> քաղաքը"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> քաղաքը նշված չէ"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Մարշալյան Կղզիներ"</item>
<item msgid="4196408495909011020">"Միդուեյ Կղզիներ"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Ջակարտա"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Զարթուցիչներ"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Վայկյանաչափի ծառայությունը կգործարկի ծանուցումներ:"</string>
- <string name="swn_stopped" msgid="783124901663086172">"Դադարեցված է"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Մշակում է ժամաչափի ծանուցումներից ծագող գործողությունները:"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Մշակում է վայրկենաչափի ծանուցումներից ծագող գործողությունները:"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Կանգնեցված է"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Անջատելու համար սահեցրեք աջ"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Հետաձգելու համար սահեցրեք ձախ"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Ննջեցնելու համար սահահարվածեք ձախ կամ աջ՝ բաց թողնելու համար"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Ժամանակաչափեր"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ժամանակաչափի զանգերանգ"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Ժամաչափը դադարեցված է"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> ժամաչափ դադարեցված է"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Ժամաչափը դադարեցված է"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> ժամաչափ դադարեցված է"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Հպեք՝ ձեր ժամաչափերը տեսնելու համար"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ժամաչափ"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Հաջորդ զարթուցիչը՝ <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Զարթուցիչներ չկան"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Սահմանված զարթուցիչներ չկան"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"Սպասվող ազդանշաններ չկան"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Անվավեր ժամանակ՝ <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>-ի համար նշանակված զարթուցիչ չկա"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Հերթագրված զարթուցիչներ չկան"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Նշված պիտակ չկա"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Ոչ մի զարթուցիչ պիտակ չունի"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Վայրկյանաչափը արդեն աշխատում է"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Վայրկյանաչափը չի աշխատում"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Հնարավոր չէ վերակայել վայրկյանաչափը: Այն այս պահին աշխատում է"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Վայրկյանաչափը դադարեցված է"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Վայրկենաչափը կանգնեցվել է"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Վայրկյանաչափը վերակայվեց"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Վայրկյանաչափը միացված է"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Վայրկյանաչափը մեկնարկել է"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Այս ժամանակի համար նշանակված զարթուցիչ չկա"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Ժ. <xliff:g id="ALARM_TIME">%s</xliff:g>-ի զարթուցիչը անտեսված է"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Զարթուցիչը դրված է <xliff:g id="ALARM_TIME">%s</xliff:g>-ին"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Տեղակայված ժամաչափ չկա"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Ժամաչափը ջնջված է"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Ժամաչափն արդեն աշխատում է"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Հնարավոր չէ կատարել ձեր հարցումը, քանի որ մի քանի ժամաչափեր կան"</string>
- <string name="timer_started" msgid="6715582052946641641">"Ժամաչափը սկսված է"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Ժամաչափեր չկան"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Առկա է մեկից ավելի ժամաչափ"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Ժամաչափը հեռացվել է:"</string>
<string name="timer_created" msgid="4381027137335885547">"Ժամաչափը ստեղծված է"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Ժամաչափի տևողությունը սխալ է"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Ժամաչափը վերակայված է"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Հնարավոր չէ վերակայել ժամաչափը, քանի որ այն դեռ աշխատում է: Վերակայելու համար նախ դադարեցրեք այն::"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Ժամաչափն արդեն դադարեցված է"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Ժամաչափը ջնջված է"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Ժամաչափը սկսված է"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Ժամաչափի տևողությունը սխալ է"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Ընտրված քաղաք չկա"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Նշված քաղաքը հասանելի չէ"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Այդ քաղաքն արդեն ավելացվել է"</string>
diff --git a/res/values-in/array.xml b/res/values-in/array.xml
index 0f33292..0eebbe8 100644
--- a/res/values-in/array.xml
+++ b/res/values-in/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Kota Guatemala"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Kutub Selatan"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Kutub Selatan<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Yerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Muskat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapura"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulan Bator"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index d4c40e9..4731c27 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Tampilkan jam"</string>
<string name="hide_clock" msgid="3217727306480505694">"Sembunyikan jam"</string>
<string name="label" msgid="162189613902857319">"Label"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Aktif"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Nonaktif"</string>
<string name="default_label" msgid="5590025289805630372">"Alarm"</string>
<string name="set_alarm" msgid="9148359866152726808">"Setel alarm"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Getar"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Ulangi"</string>
<string name="alert" msgid="6506982899651975645">"Nada Dering Alarm"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Nada Dering Khusus"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Pewaktu Berakhir"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Senyap"</string>
<string name="ringtone" msgid="9110746249688559579">"Nada Dering"</string>
<string name="time" msgid="8067216534232296518">"Waktu"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Besok"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Menunda hingga <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Alarm mendatang"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Alarm yang terlewat telah dihapus"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Sisa kurang dari satu menit"</item>
- <item msgid="83197792732433351">"Sisa <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Sisa <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Sisa <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Sisa kurang dari satu menit"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Sisa <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"tersisa"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"tersisa"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarm disetel untuk kurang dari 1 menit dari sekarang."</item>
<item msgid="6002066367368421848">"Alarm disetel untuk <xliff:g id="DAYS">%1$s</xliff:g> dari sekarang."</item>
@@ -101,6 +104,10 @@
<item quantity="other">menit</item>
<item quantity="one">menit</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Keraskan volume secara bertahap"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Nonaktif"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> detik"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"detik"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Senyapkan setelah"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> menit</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Kembalikan"</string>
<string name="delete" msgid="5732434972457000541">"Hapus"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volume alarm"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Senyap"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Senyap"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Tidak diketahui"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Tunda atau tutup alarm."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ditunda)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarm disetel untuk <xliff:g id="TIME">%s</xliff:g>. Sentuh untuk membatalkan."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Memuat nada dering…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Layanan pemutaran suara untuk pewaktu yang disetel di Clock."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Setel alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Pewaktu"</string>
<string name="menu_clock" msgid="5612760670606829805">"Jam"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Urutkan menurut nama"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Kota yang Dipilih"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Lanjutkan"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Mulai"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Berhenti"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Putaran"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Setel ulang"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Mulai"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Jeda"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Putaran"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Bagikan"</string>
<string name="hours_label" msgid="3393478155635368097">"j"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Waktu saya adalah <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Waktu putaran:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Putaran <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> jam</item>
<item quantity="one">1 jam</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Tambah 1 menit"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Tambahkan 1 mnt"</string>
<string name="timer_stop" msgid="3361154678667736722">"Hentikan"</string>
- <string name="timer_done" msgid="2375990511982914051">"Selesai"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Menghentikan semua pewaktu"</string>
<string name="timer_reset" msgid="7848424809190171640">"Setel ulang"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Batal"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Pewaktu dibatalkan"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Waktu habis"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> pewaktu telah berakhir"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Pewaktu"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"maksimum 4 pewaktu"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Jeda"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Setel ulang semua pewaktu"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Anda benar-benar cepat."</item>
<item msgid="6332879039890727169">"Nikmati hasil kerja keras Anda."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Kota"</string>
<string name="clock_settings" msgid="8317286807280600391">"Jam"</string>
<string name="clock_style" msgid="2265011060429742344">"Gaya"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Ubah Tanggal & waktu"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analog"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> dicentang"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> dihapus centangnya"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Kepulauan Marshall"</item>
<item msgid="4196408495909011020">"Pulau Midway"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarm"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Layanan stopwatch untuk menjalankan pemberitahuan."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Dihentikan"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Memproses tindakan dari notifikasi pewaktu."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Memproses tindakan dari notifikasi stopwatch."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Dijeda"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Geser ke kanan untuk menutup"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Geser ke kiri untuk menunda"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Gesek ke kiri untuk menunda atau ke kanan untuk menutup"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Pewaktu"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Nada dering pewaktu"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Pewaktu dihentikan"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> pewaktu dihentikan"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Pewaktu dijeda"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> pewaktu dijeda"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Sentuh untuk melihat pewaktu Anda"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> pewaktu"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Pewaktu Berikutnya: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Tidak Ada Alarm"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Tak ada alarm"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"TIDAK ADA ALARM MENDATANG"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"j.mm"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"j.mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"HHH, j.mm"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"H, j.mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Waktu tidak valid <xliff:g id="INVALID_HOUR">%d</xliff:g>.<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Tidak ada alarm pukul <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>.<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Tidak ada jadwal alarm"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Tidak ada label yang ditentukan"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Tidak ada alarm yang berisi label tersebut"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stopwatch sudah berjalan"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stopwatch tidak berjalan"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stopwatch tidak dapat disetel ulang karena sedang berjalan"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stopwatch dihentikan"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stopwatch dijeda"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stopwatch disetel ulang"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stopwatch diputar"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stopwatch dimulai"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Tidak ada jadwal alarm untuk waktu ini"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarm pukul <xliff:g id="ALARM_TIME">%s</xliff:g> ditutup"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm disetel untuk <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Pewaktu tidak disetel"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Pewaktu dihapus"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Pewaktu sudah berjalan"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Tidak dapat menyelesaikan permintaan, ada beberapa pewaktu"</string>
- <string name="timer_started" msgid="6715582052946641641">"Pewaktu dimulai"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Tidak ada pewaktu"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Ada lebih dari satu pewaktu"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Pewaktu telah dihapus."</string>
<string name="timer_created" msgid="4381027137335885547">"Pewaktu telah dibuat"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Lamanya pewaktu tidak valid"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Pewaktu disetel ulang"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Pewaktu tidak dapat disetel ulang karena masih berjalan. Hentikan pewaktu untuk menyetel ulang."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Pewaktu sudah dihentikan"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Pewaktu dihapus"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Pewaktu dimulai"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Lamanya pewaktu tidak valid"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Tidak ada kota yang dipilih"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Kota yang Anda sebutkan tidak tersedia"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Kota tersebut telah ditambahkan"</string>
diff --git a/res/values-is-rIS/array.xml b/res/values-is-rIS/array.xml
index 1761fd9..013db6e 100644
--- a/res/values-is-rIS/array.xml
+++ b/res/values-is-rIS/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Gvatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Gvatemalaborg"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Gvæjana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Torontó"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>Suðurpóllinn"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>Suðurpóllinn<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbúl"</item>
<item msgid="758800913783999425">"D<xliff:g id="SEPARATOR">=</xliff:g>Djakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerúsalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"K<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Ríad"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seúl"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Sjanghæ"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Sjanghæ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapúr"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taípei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taípei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Avív"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tókýó"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tókýó<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"Ú<xliff:g id="SEPARATOR">=</xliff:g>Úlan Bator"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermúda"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanarí"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delí"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index d08c733..b927e86 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Sýna klukku"</string>
<string name="hide_clock" msgid="3217727306480505694">"Fela klukku"</string>
<string name="label" msgid="162189613902857319">"Skýring"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Kveikt"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Slökkt"</string>
<string name="default_label" msgid="5590025289805630372">"Vekjari"</string>
<string name="set_alarm" msgid="9148359866152726808">"Stilla vekjara"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Titringur"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Endurtaka"</string>
<string name="alert" msgid="6506982899651975645">"Hringitónn vekjara"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Sjálfgefinn hringitónn"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Teljari útrunninn"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Hljóðlaus"</string>
<string name="ringtone" msgid="9110746249688559579">"Hringitónn"</string>
<string name="time" msgid="8067216534232296518">"Tími"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Á morgun"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Blundar fram til <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Næsti vekjari"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Hunsuðum vekjara var eytt"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Innan við mínúta eftir"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> eftir"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> eftir"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> og <xliff:g id="MINUTES">%2$s</xliff:g> eftir"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Innan við mínúta eftir"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> og <xliff:g id="MINUTES">%2$s</xliff:g> eftir"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"eftir"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"eftir"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Vekjari stilltur á innan við mínútu héðan í frá."</item>
<item msgid="6002066367368421848">"Vekjari stilltur á <xliff:g id="DAYS">%1$s</xliff:g> héðan í frá."</item>
@@ -101,6 +104,10 @@
<item quantity="one">mínúta</item>
<item quantity="other">mínútur</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Auka hljóðstyrk smám saman"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Slökkt"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> sekúndur"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sekúndur"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Slökkva á hljóði eftir"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> mínúta</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Snúa í fyrra horf"</string>
<string name="delete" msgid="5732434972457000541">"Eyða"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Hljóðstyrkur vekjara"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Hljóðlaust"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Hljóðlaus"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Óþekktur"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Blunda eða hunsa vekjara."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (blundað)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Vekjari stilltur á <xliff:g id="TIME">%s</xliff:g>. Snertu til að hætta við."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Hleður hringitón…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Hljóðspilunarþjónusta teljara sem stilltir eru í klukkunni."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Stilla vekjara"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Vekjari"</string>
<string name="menu_timer" msgid="6459070074762877114">"Teljari"</string>
<string name="menu_clock" msgid="5612760670606829805">"Klukka"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Raða eftir heiti"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Valdar borgir"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Halda áfram"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Byrja"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stöðva"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Millitími"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Endurstilla"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Byrja"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Millitími"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Deila"</string>
<string name="hours_label" msgid="3393478155635368097">"k"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Tíminn minn er <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Millitímar:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Hringur <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Nr. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Nr. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> klukkustund</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> klukkustundir</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Bæta 1 mínútu við"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Bæta 1 mín. við"</string>
<string name="timer_stop" msgid="3361154678667736722">"Stöðva"</string>
- <string name="timer_done" msgid="2375990511982914051">"Lokið"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Stöðva alla teljara"</string>
<string name="timer_reset" msgid="7848424809190171640">"Endurstilla"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Hætta við"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Hætt við teljara"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Tíminn er liðinn"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> teljarar útrunnir"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Teljari"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Hámark fjórir teljarar"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Gera hlé"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Núlla teljara"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Skolli ferðu hratt yfir."</item>
<item msgid="6332879039890727169">"Njóttu ávaxta erfiðisins."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Borgir"</string>
<string name="clock_settings" msgid="8317286807280600391">"Klukka"</string>
<string name="clock_style" msgid="2265011060429742344">"Stíll"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Breyta dagsetningu og tíma"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Með vísum"</item>
<item msgid="8483930821046925592">"Stafræn"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Merkt við <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Ekki merkt við <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshall-eyjar"</item>
<item msgid="4196408495909011020">"Midway Island"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Djakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Vekjarar"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Skeiðklukkuþjónusta til að keyra tilkynninguna."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Stöðvuð"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Vinnur úr aðgerðum með tilkynningum frá teljara."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Vinnur úr aðgerðum með tilkynningum frá skeiðklukku."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Í bið"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Strjúktu til hægri til að hunsa"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Strjúktu til vinstri til að þagga tímabundið"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Strjúktu til vinstri til að blunda eða til hægri til að hunsa"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Teljarar"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Hringitónn teljara"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Teljari stöðvaður"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> teljarar stöðvaðir"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Hlé gert á teljara"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Hlé gert á <xliff:g id="NUMBER">%d</xliff:g> teljurum"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Snertu til að sjá teljarana þína"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> teljarar"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Næsti teljari: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Engir vekjarar"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Engir vekjarar"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ENGIR VÆNTANLEGIR VEKJARAR"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"HH:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, HH:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Ógildur tími <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Enginn vekjari kl. <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Engir stilltir vekjarar"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Enginn flokkur tilgreindur"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Engir vekjarar eru í flokknum"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Skeiðklukka er nú þegar í gangi"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Skeiðklukka er ekki í gangi"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Ekki er hægt að núllstilla skeiðklukkuna vegna þess að hún er í gangi"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Skeiðklukka stöðvuð"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Hlé gert á skeiðklukku"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Skeiðklukka núllstillt"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Skeiðklukka komin hring"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Skeiðklukka ræst"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Enginn vekjari stilltur fyrir þennan tíma"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Vekjari kl. <xliff:g id="ALARM_TIME">%s</xliff:g> hunsaður"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Vekjari er stilltur á <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Enginn teljari stilltur"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Teljara eytt"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Teljari þegar í gangi"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Ekki hægt að afgreiða beiðnina, margir teljarar í boði"</string>
- <string name="timer_started" msgid="6715582052946641641">"Teljari ræstur"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Engir teljarar fyrir hendi"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Fleiri en einn teljari fyrir hendi"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Teljarinn hefur verið fjarlægður."</string>
<string name="timer_created" msgid="4381027137335885547">"Teljari búinn til"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Ógild teljaralengd"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Teljari endurstilltur"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Ekki er hægt að endurstilla teljara þar sem hann er enn í gangi. Stöðvaðu teljarann til að endurstilla hann."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Teljari þegar stöðvaður"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Teljara eytt"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Teljari ræstur"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Ógild teljaralengd"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Engin borg valin"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Borgin sem þú tilgreindir er ekki tiltæk"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Þessari borg hefur þegar verið bætt við"</string>
diff --git a/res/values-it/array.xml b/res/values-it/array.xml
index ddaa93b..56383f8 100644
--- a/res/values-it/array.xml
+++ b/res/values-it/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"C<xliff:g id="SEPARATOR">=</xliff:g>Città del Guatemala"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>Polo sud"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>Polo sud<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Giacarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Gerusalemme"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Tehran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canaria"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Pechino"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Pechino<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcellona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Canton"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Canton<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 0820a98..34fbb28 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"On"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Off"</string>
<string name="default_label" msgid="5590025289805630372">"Sveglia"</string>
<string name="set_alarm" msgid="9148359866152726808">"Imposta sveglia"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrazione"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Ripeti"</string>
<string name="alert" msgid="6506982899651975645">"Suoneria sveglia"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Suoneria personalizzata"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Timer scaduto"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silenzioso"</string>
<string name="ringtone" msgid="9110746249688559579">"Suoneria"</string>
<string name="time" msgid="8067216534232296518">"Ora"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Domani"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Ripetizione sveglia fino alle <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Prossima sveglia"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"La sveglia ignorata è stata eliminata"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Resta meno di un minuto"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> rimanenti"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> rimanenti"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> e <xliff:g id="MINUTES">%2$s</xliff:g> rimanenti"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Resta meno di un minuto."</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> e <xliff:g id="MINUTES">%2$s</xliff:g> rimanenti"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"rimanente"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"rimanenti"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"La sveglia sarà attivata tra meno di 1 minuto."</item>
<item msgid="6002066367368421848">"La sveglia sarà attivata tra <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minuti</item>
<item quantity="one">minuto</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Aumenta gradualmente il volume"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Non attiva"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> secondi"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"secondi"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Disattiva suoneria dopo"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuti</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Annulla modifiche"</string>
<string name="delete" msgid="5732434972457000541">"Elimina"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volume sveglia"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silenzioso"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silenzioso"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Elemento sconosciuto"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Posticipa o elimina sveglia."</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="4819324081410990368">"La sveglia sarà attivata alle <xliff:g id="TIME">%s</xliff:g>. Tocca per annullare."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Caricamento suoneria..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Servizio di riproduzione dei suoni per i timer impostati in Orologio."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Imposta sveglia"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Sveglia"</string>
<string name="menu_timer" msgid="6459070074762877114">"Timer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Orologio"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Ordina per nome"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Città selezionate"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Riprendi"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Avvia"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Interrompi"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Giro"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Reimposta"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Avvia"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pausa"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Giro"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Condividi"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Il mio tempo è <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Tempi sul giro:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Giro <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"n. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"n. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ore</item>
<item quantity="one">1 ora</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Aggiungi un minuto"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Aggiungi 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Interrompi"</string>
- <string name="timer_done" msgid="2375990511982914051">"Fine"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Interrompi tutti i timer"</string>
<string name="timer_reset" msgid="7848424809190171640">"Azzera"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Annulla"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Timer annullato"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Tempo scaduto"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> timer scaduti"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Timer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Massimo quattro timer"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pausa"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Reimposta timer"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Sei davvero un fulmine."</item>
<item msgid="6332879039890727169">"Goditi i frutti del tuo lavoro."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Città"</string>
<string name="clock_settings" msgid="8317286807280600391">"Orologio"</string>
<string name="clock_style" msgid="2265011060429742344">"Stile"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Modifica data e ora"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogico"</item>
<item msgid="8483930821046925592">"Digitale"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Città <xliff:g id="CITY_NAME">%s</xliff:g> selezionata"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Città <xliff:g id="CITY_NAME">%s</xliff:g> non selezionata"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Isole Marshall"</item>
<item msgid="4196408495909011020">"Isola di Midway"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Giacarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Sveglie"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Servizio cronometro per pubblicare la notifica."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Interrotto"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Consente di elaborare le azioni derivanti dalle notifiche relative al timer."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Consente di elaborare le azioni derivanti dalle notifiche relative al cronometro."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"In pausa"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Fai scorrere a destra per eliminare"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Fai scorrere a sinistra per posticipare"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Fai scorrere a sinistra per posticiparla o a destra per chiuderla"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Timer"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Suoneria del timer"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Timer fermato"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> timer fermati"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Timer in pausa"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> timer in pausa"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Tocca per visualizzare i timer"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> timer"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Prossimo timer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Nessuna sveglia"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Nessuna sveglia"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NESSUNA SVEGLIA A BREVE"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Orario <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g> non valido"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Nessuna sveglia alle <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Nessuna sveglia pianificata"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nessuna etichetta specificata"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Nessuna sveglia con l\'etichetta indicata"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Cronometro già in esecuzione"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Cronometro non in esecuzione"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Impossibile reimpostare il cronometro perché è in funzione"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Cronometro interrotto"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Cronometro in pausa"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Cronometro reimpostato"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Cronometro impostato sul giro"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Cronometro avviato"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Nessuna sveglia pianificata per questo orario"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Sveglia alle <xliff:g id="ALARM_TIME">%s</xliff:g> ignorata"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Sveglia impostata per le ore <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Nessun timer impostato"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Timer eliminato"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Timer già in esecuzione"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Impossibile completare la richiesta. Diversi timer disponibili"</string>
- <string name="timer_started" msgid="6715582052946641641">"Timer avviato"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Non è presente alcun timer"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"È presente più di un timer"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Il timer è stato rimosso."</string>
<string name="timer_created" msgid="4381027137335885547">"Timer creato"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Durata del timer non valida"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Timer reimpostato"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Impossibile reimpostare il timer perché è ancora in esecuzione. Per reimpostare il timer, interrompilo."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Timer già interrotto"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Timer eliminato"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Timer avviato"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Durata del timer non valida"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Nessuna città selezionata"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"La città specificata non è disponibile"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"La città è già stata aggiunta"</string>
diff --git a/res/values-iw/array.xml b/res/values-iw/array.xml
index b2d161f..9b81402 100644
--- a/res/values-iw/array.xml
+++ b/res/values-iw/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"פ<xliff:g id="SEPARATOR">=</xliff:g>פורטלזה"</item>
<item msgid="5801558418916235541">"ג<xliff:g id="SEPARATOR">=</xliff:g>גראנד טורק"</item>
<item msgid="2103759276235503048">"ג<xliff:g id="SEPARATOR">=</xliff:g>גרנדה"</item>
- <item msgid="1490069759176391533">"ג<xliff:g id="SEPARATOR">=</xliff:g>גואטמלה"</item>
+ <item msgid="6216160110733510854">"ג<xliff:g id="SEPARATOR">=</xliff:g>גואטמלה סיטי"</item>
<item msgid="525959305652046261">"ג<xliff:g id="SEPARATOR">=</xliff:g>גיאנה"</item>
<item msgid="7565596629973190931">"ה<xliff:g id="SEPARATOR">=</xliff:g>האליפקס"</item>
<item msgid="3811169155065582644">"ה<xliff:g id="SEPARATOR">=</xliff:g>הוואנה"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ט<xliff:g id="SEPARATOR">=</xliff:g>טורונטו"</item>
<item msgid="1506838283840737263">"ו<xliff:g id="SEPARATOR">=</xliff:g>ונקובר"</item>
<item msgid="8935386104773857399">"ו<xliff:g id="SEPARATOR">=</xliff:g>וויניפג"</item>
- <item msgid="1132634022412399582">"ק<xliff:g id="SEPARATOR">=</xliff:g>הקוטב הדרומי"</item>
+ <item msgid="498429228419399474">"ק<xliff:g id="SEPARATOR">=</xliff:g>הקוטב הדרומי<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ל<xliff:g id="SEPARATOR">=</xliff:g>לונגיירביאן"</item>
<item msgid="3784788073896028355">"א<xliff:g id="SEPARATOR">=</xliff:g>אלמטי"</item>
<item msgid="7895695236056852523">"ע<xliff:g id="SEPARATOR">=</xliff:g>עמאן"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ע<xliff:g id="SEPARATOR">=</xliff:g>עזה"</item>
<item msgid="2359068282340162319">"ח<xliff:g id="SEPARATOR">=</xliff:g>חברון"</item>
<item msgid="6223396610551759129">"ה<xliff:g id="SEPARATOR">=</xliff:g>הו צ\'י מין"</item>
- <item msgid="4731022818651322736">"ה<xliff:g id="SEPARATOR">=</xliff:g>הונג קונג"</item>
+ <item msgid="3439764751788710130">"ה<xliff:g id="SEPARATOR">=</xliff:g>הונג קונג<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"א<xliff:g id="SEPARATOR">=</xliff:g>איסטנבול"</item>
<item msgid="758800913783999425">"ג<xliff:g id="SEPARATOR">=</xliff:g>ג\'קרטה"</item>
<item msgid="8956406398692698126">"י<xliff:g id="SEPARATOR">=</xliff:g>ירושלים"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"מ<xliff:g id="SEPARATOR">=</xliff:g>מנילה"</item>
<item msgid="6033964325069060422">"מ<xliff:g id="SEPARATOR">=</xliff:g>מוסקט"</item>
<item msgid="6077458941399984780">"פ<xliff:g id="SEPARATOR">=</xliff:g>פנום פן"</item>
- <item msgid="935474308903572975">"פ<xliff:g id="SEPARATOR">=</xliff:g>פיונגיאנג"</item>
+ <item msgid="1245515372520913197">"פ<xliff:g id="SEPARATOR">=</xliff:g>פיונגיאנג<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"ק<xliff:g id="SEPARATOR">=</xliff:g>קטאר"</item>
<item msgid="1667243110545095146">"י<xliff:g id="SEPARATOR">=</xliff:g>ינגון"</item>
<item msgid="4460370766685855731">"ר<xliff:g id="SEPARATOR">=</xliff:g>ריאד"</item>
<item msgid="4229224905931739201">"ס<xliff:g id="SEPARATOR">=</xliff:g>סייגון"</item>
<item msgid="8705359848250215620">"ס<xliff:g id="SEPARATOR">=</xliff:g>סיאול"</item>
- <item msgid="583367295371395814">"ש<xliff:g id="SEPARATOR">=</xliff:g>שנגחאי"</item>
+ <item msgid="3814881931186962624">"ש<xliff:g id="SEPARATOR">=</xliff:g>שנגחאי<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"ס<xliff:g id="SEPARATOR">=</xliff:g>סינגפור"</item>
- <item msgid="1972491729911039207">"ט<xliff:g id="SEPARATOR">=</xliff:g>טאיפיי"</item>
+ <item msgid="8982451946156859368">"ט<xliff:g id="SEPARATOR">=</xliff:g>טאיפיי<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"ט<xliff:g id="SEPARATOR">=</xliff:g>טהרן"</item>
<item msgid="8629402941285674273">"ת<xliff:g id="SEPARATOR">=</xliff:g>תל אביב"</item>
- <item msgid="8499164674454654525">"ט<xliff:g id="SEPARATOR">=</xliff:g>טוקיו"</item>
+ <item msgid="76330681636547168">"ט<xliff:g id="SEPARATOR">=</xliff:g>טוקיו<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"א<xliff:g id="SEPARATOR">=</xliff:g>אולאנבאטר"</item>
<item msgid="2028626988021468640">"ב<xliff:g id="SEPARATOR">=</xliff:g>ברמודה"</item>
<item msgid="4527109966513690429">"ק<xliff:g id="SEPARATOR">=</xliff:g>קנארי"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"ר<xliff:g id="SEPARATOR">=</xliff:g>רינו"</item>
<item msgid="9155068631060038769">"ב<xliff:g id="SEPARATOR">=</xliff:g>בלאק רוק סיטי"</item>
<item msgid="8498761319928979900">"ד<xliff:g id="SEPARATOR">=</xliff:g>דוחה"</item>
- <item msgid="8307897251088048641">"ב<xliff:g id="SEPARATOR">=</xliff:g>בייג\'ינג"</item>
+ <item msgid="5327010922199714808">"ב<xliff:g id="SEPARATOR">=</xliff:g>בייג\'ינג<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"מ<xliff:g id="SEPARATOR">=</xliff:g>מומבאי"</item>
<item msgid="6668274273067049125">"ד<xliff:g id="SEPARATOR">=</xliff:g>דלהי"</item>
- <item msgid="2933410189478233292">"א<xliff:g id="SEPARATOR">=</xliff:g>אוסקה"</item>
+ <item msgid="7199039603593847813">"א<xliff:g id="SEPARATOR">=</xliff:g>אוסקה<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ל<xliff:g id="SEPARATOR">=</xliff:g>לאהור"</item>
<item msgid="1448378291805481500">"צ<xliff:g id="SEPARATOR">=</xliff:g>צנעא"</item>
<item msgid="5233119846682408301">"ב<xliff:g id="SEPARATOR">=</xliff:g>ברצלונה"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"ק<xliff:g id="SEPARATOR">=</xliff:g>קיימברידג\'"</item>
<item msgid="759409010285366934">"ק<xliff:g id="SEPARATOR">=</xliff:g>קירקלנד"</item>
<item msgid="6308007059287569663">"מ<xliff:g id="SEPARATOR">=</xliff:g>מדיסון"</item>
- <item msgid="6971636434858330021">"ג<xliff:g id="SEPARATOR">=</xliff:g>גואנגג\'ו"</item>
+ <item msgid="2077617905582224600">"ג<xliff:g id="SEPARATOR">=</xliff:g>גואנגג\'ו<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"ה<xliff:g id="SEPARATOR">=</xliff:g>היידראבאד"</item>
<item msgid="3032295682584784261">"ר<xliff:g id="SEPARATOR">=</xliff:g>רסטון"</item>
<item msgid="7722837296297332268">"ב<xliff:g id="SEPARATOR">=</xliff:g>בלו הוריזונטה"</item>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 06fe4d7..7b6adae 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"הצג שעון"</string>
<string name="hide_clock" msgid="3217727306480505694">"הסתר שעון"</string>
<string name="label" msgid="162189613902857319">"תווית"</string>
+ <string name="on_switch" msgid="2297966258029227449">"פועל"</string>
+ <string name="off_switch" msgid="3381070073851148013">"כבוי"</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="6506982899651975645">"צלצול שעון מעורר"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"רינגטון בהתאמה אישית"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"הטיימר סיים"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"שקט"</string>
<string name="ringtone" msgid="9110746249688559579">"רינגטון"</string>
<string name="time" msgid="8067216534232296518">"שעה"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"מחר"</string>
@@ -62,12 +65,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"מצב נמנום עד <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"התראה קרובה"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"ההתראה שהחמצת נמחקה"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"נותרה פחות מדקה"</item>
- <item msgid="83197792732433351">"נותרו <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"נותרו <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"נותרו <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"נותרה פחות מדקה"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"נותרו <xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"נותרו <xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"נותרו <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"נותרה"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"נותרו"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"ההתראה הוגדרה לעוד פחות מדקה מעכשיו."</item>
<item msgid="6002066367368421848">"ההתראה הוגדרה לעוד <xliff:g id="DAYS">%1$s</xliff:g> מעכשיו."</item>
@@ -115,6 +118,10 @@
<item quantity="other">דקות</item>
<item quantity="one">דקה</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"הגבר בהדרגה את עוצמת הקול"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"כבוי"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> שניות"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"שניות"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"השתק לאחר"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="two"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> דקות</item>
@@ -142,7 +149,8 @@
<string name="revert" msgid="9100911171235162926">"חזור למצב קודם"</string>
<string name="delete" msgid="5732434972457000541">"מחק"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"עוצמת קול של התראה"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"שקט"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"שקט"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"לא ידוע"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"נודניק או ביטול ההתראה."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (מצב נמנום)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"ההתראה מכוונת לשעה <xliff:g id="TIME">%s</xliff:g>. גע כדי לבטל."</string>
@@ -167,8 +175,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"טוען צלצול..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"שירות השמעת צלילים עבור טיימרים שהוגדרו ב\'שעון\'."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"הגדר צלצול"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"התראה"</string>
<string name="menu_timer" msgid="6459070074762877114">"טיימר"</string>
<string name="menu_clock" msgid="5612760670606829805">"שעון"</string>
@@ -183,10 +189,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"מיין לפי שם"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"ערים נבחרות"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"המשך"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"התחל"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"עצור"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"הקפה"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"אפס"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"התחל"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"השהה"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"הקפה"</string>
<string name="sw_share_button" msgid="4478648110382859382">"שתף"</string>
<string name="hours_label" msgid="3393478155635368097">"ש\'"</string>
<string name="minutes_label" msgid="3568098128251438588">"ד\'"</string>
@@ -198,10 +204,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"הזמן שלי הוא <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"זמני הקפה:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"הקפה <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"מס\' <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"מס\' <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="two"><xliff:g id="NUMBER">%d</xliff:g> שעות</item>
<item quantity="many"><xliff:g id="NUMBER">%d</xliff:g> שעות</item>
@@ -227,12 +229,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"הוסף דקה"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"הוסף דקה"</string>
<string name="timer_stop" msgid="3361154678667736722">"עצור"</string>
- <string name="timer_done" msgid="2375990511982914051">"בוצע"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"הפסק את כל הטיימרים"</string>
<string name="timer_reset" msgid="7848424809190171640">"אפס"</string>
<string name="timer_cancel" msgid="3572868404230815644">"בטל"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"הטיימר בוטל"</string>
<string name="timer_times_up" msgid="9190440395938519009">"הזמן נגמר"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"הפעולה של <xliff:g id="NUM_TIMERS">%d</xliff:g> טיימרים הושלמה"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"טיימר"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"4 טיימרים לכל היותר"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"השהה"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"אפס את הטיימרים"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"אתה מהיר כשד משחת."</item>
<item msgid="6332879039890727169">"תיהנה מפירות עמלך."</item>
@@ -249,6 +255,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"ערים"</string>
<string name="clock_settings" msgid="8317286807280600391">"שעון"</string>
<string name="clock_style" msgid="2265011060429742344">"סגנון"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"שנה תאריך ושעה"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"אנלוגי"</item>
<item msgid="8483930821046925592">"דיגיטלי"</item>
@@ -263,6 +270,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">"00:"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">"30:"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> מסומנת"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> לא מסומנת"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"איי מרשל"</item>
<item msgid="4196408495909011020">"האי מידוויי"</item>
@@ -351,13 +360,17 @@
<item msgid="5176858645450908751">"ג\'אקארטה"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"התראות"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"שירות שעון עצר להפעלת ההתראה."</string>
- <string name="swn_stopped" msgid="783124901663086172">"נעצר"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"מעבד פעולות מההודעות של הטיימר."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"מעבד פעולות מההודעות של שעון העצר."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"מושהה"</string>
<string name="description_direction_right" msgid="5709209043267548985">"החלק ימינה כדי לבטל"</string>
<string name="description_direction_left" msgid="7448141043674998679">"החלק שמאלה כדי להפעיל נודניק"</string>
<string name="description_direction_both" msgid="1841309486023845685">"החלק שמאלה כדי להעביר למצב נודניק או ימינה כדי לסגור"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"טיימרים"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"רינגטון של טיימר"</string>
<string name="timer_stopped" msgid="2730331837832462008">"טיימר נעצר"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> טיימרים נעצרו"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"הטיימר מושהה"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> טיימרים הושהו"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"גע כדי לראות את הטיימרים שלך"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> טיימרים"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"הטיימר הבא: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -385,35 +398,27 @@
<string name="no_alarms" msgid="6429431324842022917">"ללא התראות"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"לא הוגדרו התראות"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"אין התראות קרובות"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"שעה לא חוקית <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"אין התראה ב-<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"לא נקבעו התראות"</string>
<string name="no_label_specified" msgid="2008482054428460626">"לא צוינה תווית"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"אין התראות הכוללות את התווית"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"שעון העצר כבר פועל"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"שעון העצר אינו פועל"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"לא ניתן לאפס את שעון העצר מפני שהוא פועל"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"שעון העצר הופסק"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"שעון העצר מושהה"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"שעון העצר אופס"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"שעון העצר סיים סיבוב"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"שעון העצר הופעל"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"לא נקבעה התראה לשעה הזו"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"ההתראה של <xliff:g id="ALARM_TIME">%s</xliff:g> נסגרה"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"הוגדרה התראה לשעה <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"לא הוגדר טיימר"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"הטיימר נמחק"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"הטיימר כבר פועל"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"לא ניתן להשלים את הבקשה. יש מספר טיימרים זמינים"</string>
- <string name="timer_started" msgid="6715582052946641641">"הטיימר הופעל"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"לא קיימים טיימרים"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"קיים יותר מטיימר אחד"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"הטיימר הוסר."</string>
<string name="timer_created" msgid="4381027137335885547">"הטיימר נוצר"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"משך טיימר לא חוקי"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"הטיימר אופס"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"לא ניתן לאפס את הטיימר כי הוא עדיין פועל. הפסק את הטיימר כדי לאפס."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"הטיימר כבר הופסק"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"הטיימר נמחק"</string>
+ <string name="timer_started" msgid="6715582052946641641">"הטיימר הופעל"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"משך טיימר לא חוקי"</string>
<string name="no_city_selected" msgid="1007596865203283741">"לא נבחרה עיר"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"העיר שציינת אינה זמינה"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"העיר הזו כבר נוספה"</string>
diff --git a/res/values-ja/array.xml b/res/values-ja/array.xml
index 8177183..e094325 100644
--- a/res/values-ja/array.xml
+++ b/res/values-ja/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"は<xliff:g id="SEPARATOR">=</xliff:g>フォルタレザ"</item>
<item msgid="5801558418916235541">"か<xliff:g id="SEPARATOR">=</xliff:g>グランドターク"</item>
<item msgid="2103759276235503048">"か<xliff:g id="SEPARATOR">=</xliff:g>グレナダ"</item>
- <item msgid="1490069759176391533">"か<xliff:g id="SEPARATOR">=</xliff:g>グアテマラ"</item>
+ <item msgid="6216160110733510854">"か<xliff:g id="SEPARATOR">=</xliff:g>グアテマラシティ"</item>
<item msgid="525959305652046261">"か<xliff:g id="SEPARATOR">=</xliff:g>ガイアナ"</item>
<item msgid="7565596629973190931">"は<xliff:g id="SEPARATOR">=</xliff:g>ハリファックス"</item>
<item msgid="3811169155065582644">"は<xliff:g id="SEPARATOR">=</xliff:g>ハバナ"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"た<xliff:g id="SEPARATOR">=</xliff:g>トロント"</item>
<item msgid="1506838283840737263">"は<xliff:g id="SEPARATOR">=</xliff:g>バンクーバー"</item>
<item msgid="8935386104773857399">"あ<xliff:g id="SEPARATOR">=</xliff:g>ウィニペグ"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>南極"</item>
+ <item msgid="498429228419399474">"な<xliff:g id="SEPARATOR">=</xliff:g>南極<xliff:g id="PHONETIC">:</xliff:g>ナンキョク"</item>
<item msgid="4076962667198039206">"ら<xliff:g id="SEPARATOR">=</xliff:g>ロングイェールビーン"</item>
<item msgid="3784788073896028355">"あ<xliff:g id="SEPARATOR">=</xliff:g>アルマトイ"</item>
<item msgid="7895695236056852523">"あ<xliff:g id="SEPARATOR">=</xliff:g>アンマン"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"か<xliff:g id="SEPARATOR">=</xliff:g>ガザ"</item>
<item msgid="2359068282340162319">"は<xliff:g id="SEPARATOR">=</xliff:g>ヘブロン"</item>
<item msgid="6223396610551759129">"は<xliff:g id="SEPARATOR">=</xliff:g>ホーチミン"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>香港"</item>
+ <item msgid="3439764751788710130">"は<xliff:g id="SEPARATOR">=</xliff:g>香港<xliff:g id="PHONETIC">:</xliff:g>ホンコン"</item>
<item msgid="8104778702069607166">"あ<xliff:g id="SEPARATOR">=</xliff:g>イスタンブール"</item>
<item msgid="758800913783999425">"さ<xliff:g id="SEPARATOR">=</xliff:g>ジャカルタ"</item>
<item msgid="8956406398692698126">"あ<xliff:g id="SEPARATOR">=</xliff:g>エルサレム"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"ま<xliff:g id="SEPARATOR">=</xliff:g>マニラ"</item>
<item msgid="6033964325069060422">"ま<xliff:g id="SEPARATOR">=</xliff:g>マスカット"</item>
<item msgid="6077458941399984780">"は<xliff:g id="SEPARATOR">=</xliff:g>プノンペン"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>平壌"</item>
+ <item msgid="1245515372520913197">"は<xliff:g id="SEPARATOR">=</xliff:g>平壌<xliff:g id="PHONETIC">:</xliff:g>ピョンヤン"</item>
<item msgid="5336632319992664889">"か<xliff:g id="SEPARATOR">=</xliff:g>カタール"</item>
<item msgid="1667243110545095146">"ら<xliff:g id="SEPARATOR">=</xliff:g>ラングーン"</item>
<item msgid="4460370766685855731">"ら<xliff:g id="SEPARATOR">=</xliff:g>リヤド"</item>
<item msgid="4229224905931739201">"さ<xliff:g id="SEPARATOR">=</xliff:g>サイゴン"</item>
<item msgid="8705359848250215620">"さ<xliff:g id="SEPARATOR">=</xliff:g>ソウル"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>上海"</item>
+ <item msgid="3814881931186962624">"さ<xliff:g id="SEPARATOR">=</xliff:g>上海<xliff:g id="PHONETIC">:</xliff:g>シャンハイ"</item>
<item msgid="1422156732794771136">"さ<xliff:g id="SEPARATOR">=</xliff:g>シンガポール"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>台北"</item>
+ <item msgid="8982451946156859368">"た<xliff:g id="SEPARATOR">=</xliff:g>台北<xliff:g id="PHONETIC">:</xliff:g>タイペイ"</item>
<item msgid="5563193560935461106">"た<xliff:g id="SEPARATOR">=</xliff:g>テヘラン"</item>
<item msgid="8629402941285674273">"た<xliff:g id="SEPARATOR">=</xliff:g>テルアビブ"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>東京"</item>
+ <item msgid="76330681636547168">"た<xliff:g id="SEPARATOR">=</xliff:g>東京<xliff:g id="PHONETIC">:</xliff:g>トウキョウ"</item>
<item msgid="1705804745888992744">"あ<xliff:g id="SEPARATOR">=</xliff:g>ウランバートル"</item>
<item msgid="2028626988021468640">"は<xliff:g id="SEPARATOR">=</xliff:g>バミューダ"</item>
<item msgid="4527109966513690429">"か<xliff:g id="SEPARATOR">=</xliff:g>カナリア"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"ら<xliff:g id="SEPARATOR">=</xliff:g>リノ"</item>
<item msgid="9155068631060038769">"は<xliff:g id="SEPARATOR">=</xliff:g>ブラックロックシティ"</item>
<item msgid="8498761319928979900">"た<xliff:g id="SEPARATOR">=</xliff:g>ドーハ"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>北京"</item>
+ <item msgid="5327010922199714808">"は<xliff:g id="SEPARATOR">=</xliff:g>北京<xliff:g id="PHONETIC">:</xliff:g>ペキン"</item>
<item msgid="8605970953750147428">"ま<xliff:g id="SEPARATOR">=</xliff:g>ムンバイ"</item>
<item msgid="6668274273067049125">"た<xliff:g id="SEPARATOR">=</xliff:g>デリー"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>大阪"</item>
+ <item msgid="7199039603593847813">"あ<xliff:g id="SEPARATOR">=</xliff:g>大阪<xliff:g id="PHONETIC">:</xliff:g>オオサカ"</item>
<item msgid="9011026093638055579">"ら<xliff:g id="SEPARATOR">=</xliff:g>ラホール"</item>
<item msgid="1448378291805481500">"さ<xliff:g id="SEPARATOR">=</xliff:g>サヌア"</item>
<item msgid="5233119846682408301">"は<xliff:g id="SEPARATOR">=</xliff:g>バルセロナ"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"か<xliff:g id="SEPARATOR">=</xliff:g>ケンブリッジ"</item>
<item msgid="759409010285366934">"か<xliff:g id="SEPARATOR">=</xliff:g>カークランド"</item>
<item msgid="6308007059287569663">"ま<xliff:g id="SEPARATOR">=</xliff:g>マディソン"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>広州"</item>
+ <item msgid="2077617905582224600">"か<xliff:g id="SEPARATOR">=</xliff:g>広州<xliff:g id="PHONETIC">:</xliff:g>コウシュウ"</item>
<item msgid="1185109514180068650">"は<xliff:g id="SEPARATOR">=</xliff:g>ハイデラーバード"</item>
<item msgid="3032295682584784261">"ら<xliff:g id="SEPARATOR">=</xliff:g>レストン"</item>
<item msgid="7722837296297332268">"は<xliff:g id="SEPARATOR">=</xliff:g>ベロオリゾンテ"</item>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 9546063..eda6d1d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"時計を表示"</string>
<string name="hide_clock" msgid="3217727306480505694">"時計を隠す"</string>
<string name="label" msgid="162189613902857319">"ラベル"</string>
+ <string name="on_switch" msgid="2297966258029227449">"ON"</string>
+ <string name="off_switch" msgid="3381070073851148013">"OFF"</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="6506982899651975645">"アラーム音"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"カスタム着信音"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"タイマーの完了時"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"マナーモード"</string>
<string name="ringtone" msgid="9110746249688559579">"着信音"</string>
<string name="time" msgid="8067216534232296518">"時刻"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"明日"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"スヌーズ終了時刻: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"次のアラーム"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"聞き逃したアラームを削除しました"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"残り1分未満"</item>
- <item msgid="83197792732433351">"残り<xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"残り<xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"残り<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"残り1分未満"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g><xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g><xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"残り<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"残り"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"残り"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"アラームは今から1分以内に設定されています。"</item>
<item msgid="6002066367368421848">"アラームは<xliff:g id="DAYS">%1$s</xliff:g>後に設定されています。"</item>
@@ -101,6 +104,10 @@
<item quantity="other">分</item>
<item quantity="one">分</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"徐々に音量を上げる"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"OFF"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g>秒"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"秒"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"消音までの時間"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g>分</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"キャンセル"</string>
<string name="delete" msgid="5732434972457000541">"削除"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"アラームの音量"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"マナーモード"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"マナーモード"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"不明"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"アラームをスヌーズ/解除します。"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g>(スヌーズ)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"アラームは<xliff:g id="TIME">%s</xliff:g>に設定されています。選択すると解除されます。"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"着信音を読み込み中..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"時計で設定したタイマー用のサウンド再生サービスです。"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"アラームを設定"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"アラーム"</string>
<string name="menu_timer" msgid="6459070074762877114">"タイマー"</string>
<string name="menu_clock" msgid="5612760670606829805">"時計"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"名前順"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"選択した都市"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"再開"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"開始"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"停止"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ラップ"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"リセット"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"開始"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"一時停止"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"ラップ"</string>
<string name="sw_share_button" msgid="4478648110382859382">"共有"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"私の時間は<xliff:g id="TIME">%s</xliff:g>です"</string>
<string name="sw_share_laps" msgid="614390674795945007">"ラップ時間:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"ラップ<xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g>時間</item>
<item quantity="one">1時間</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1分延長"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1分追加"</string>
<string name="timer_stop" msgid="3361154678667736722">"停止"</string>
- <string name="timer_done" msgid="2375990511982914051">"完了"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"タイマーをすべて停止"</string>
<string name="timer_reset" msgid="7848424809190171640">"リセット"</string>
<string name="timer_cancel" msgid="3572868404230815644">"キャンセル"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"タイマーをキャンセルしました"</string>
<string name="timer_times_up" msgid="9190440395938519009">"タイムアップ"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g>件のタイマーが完了"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"タイマー"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"タイマーは最大4個まで"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"一時停止"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"全タイマーをリセット"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"なかなかのスピード狂です。"</item>
<item msgid="6332879039890727169">"まさに努力の賜物です。"</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"世界時計"</string>
<string name="clock_settings" msgid="8317286807280600391">"時計"</string>
<string name="clock_style" msgid="2265011060429742344">"スタイル"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"日付と時刻の変更"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"アナログ"</item>
<item msgid="8483930821046925592">"デジタル"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"「<xliff:g id="CITY_NAME">%s</xliff:g>」をオンにしました"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"「<xliff:g id="CITY_NAME">%s</xliff:g>」をオフにしました"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"マーシャル諸島"</item>
<item msgid="4196408495909011020">"ミッドウェー諸島"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"ジャカルタ"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"アラーム"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"通知を行うためのストップウォッチサービスです。"</string>
- <string name="swn_stopped" msgid="783124901663086172">"停止"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"タイマーの通知からの操作を処理します。"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"ストップウォッチの通知からの操作を処理します。"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"一時停止しました"</string>
<string name="description_direction_right" msgid="5709209043267548985">"右にスワイプすると解除できます"</string>
<string name="description_direction_left" msgid="7448141043674998679">"左にスワイプするとスヌーズを設定できます"</string>
<string name="description_direction_both" msgid="1841309486023845685">"左にスワイプでスヌーズを設定、右にスワイプで解除できます"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"タイマー"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"タイマーの着信音です"</string>
<string name="timer_stopped" msgid="2730331837832462008">"タイマーが停止しました"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g>件のタイマーが停止しました"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"タイマーを一時停止しました"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g>個のタイマーを一時停止しました"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"タップしてタイマーを表示"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g>件のタイマー"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"次のタイマー: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"アラームはありません"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"アラーム未設定"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"次のアラームはありません"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mma"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE、h:mma"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE、k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"無効な時間<xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g><xliff:g id="INVALID_AMPM">%s</xliff:g>が指定されました"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>に設定されたアラームはありません"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"設定されたアラームはありません"</string>
<string name="no_label_specified" msgid="2008482054428460626">"ラベルは指定されていません"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"ラベルを含むアラームはありません"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"ストップウォッチは既に作動しています"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"ストップウォッチは作動していません"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"ストップウォッチは作動中のためリセットできません"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"ストップウォッチを停止しました"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"ストップウォッチを一時停止しました"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"ストップウォッチをリセットしました"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"ストップウォッチのラップを記録しました"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"ストップウォッチを開始しました"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"この時間に設定されたアラームはありません"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g>のアラームを解除しました"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"アラームは<xliff:g id="ALARM_TIME">%s</xliff:g>に設定されています"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"設定されたタイマーはありません"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"タイマーを削除しました"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"タイマーは既に作動しています"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"リクエストを完了できません。複数のタイマーがあります"</string>
- <string name="timer_started" msgid="6715582052946641641">"タイマーを開始しました"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"タイマーは設定されていません"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"複数のタイマーが設定されています"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"タイマーは削除されています。"</string>
<string name="timer_created" msgid="4381027137335885547">"タイマーを作成しました"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"タイマーの長さが無効です"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"タイマーをリセットしました"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"作動中のため、タイマーをリセットすることはできません。タイマーをリセットするには停止してください。"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"タイマーは既に停止しています"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"タイマーを削除しました"</string>
+ <string name="timer_started" msgid="6715582052946641641">"タイマーを開始しました"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"タイマーの長さが無効です"</string>
<string name="no_city_selected" msgid="1007596865203283741">"都市が選択されていません"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"指定された都市は使用できません"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"この都市は既に追加されています"</string>
diff --git a/res/values-ka-rGE/array.xml b/res/values-ka-rGE/array.xml
index d49dab3..27c09a4 100644
--- a/res/values-ka-rGE/array.xml
+++ b/res/values-ka-rGE/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>ფორტალეზა"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>გრანდ-ტერკი"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>გრენადა"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>გვატემალა"</item>
+ <item msgid="6216160110733510854">"გ<xliff:g id="SEPARATOR">=</xliff:g>გვატემალა"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>გაიანა"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>ჰალიფაქსი"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>ჰავანა"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>ტორონტო"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>ვანკუვერი"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>უინიპეგი"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>სამხრეთი პოლუსი"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>სამხრეთი პოლუსი<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>ლონგირი"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>ალმათი"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>ამანი"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>ღაზა"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>ჰებრონი"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>ჰოშიმინი"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>ჰონგ-კონგი"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>ჰონგ-კონგი<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>სტამბული"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>ჯაკარტა"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>იერუსალიმი"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>მანილა"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>მუსკატი"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>პნომპენი"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>ფხენიანი"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>ფხენიანი<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>კატარი"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>იანგონი"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>ერ-რიადი"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>საიგონი"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>სეული"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>შანხაი"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>შანხაი<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>სინგაპური"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>ტაიბეი"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>ტაიბეი<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>თეირანი"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>თელ-ავივი"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>ტოკიო"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>ტოკიო<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>ულან-ბატორი"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>ბერმუდის კუნძულები"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>კანარის კუნძულები"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>რინო"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>ბლექ-როკ-სიტი"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>დოჰა"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>პეკინი"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>პეკინი<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>მუმბაი"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>დელი"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>ოსაკა"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>ოსაკა<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>ლაჰორი"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>სანა"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>ბარსელონა"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>კემბრიჯი"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>კირკლენდი"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>მედისონი"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>გუანჯოუ"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>გუანჯოუ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>ჰაიდარაბადი"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>რესტონი"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>ბელუ-ორიზონტი"</item>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index f2c015d..26ea70d 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"საათის ჩვენება"</string>
<string name="hide_clock" msgid="3217727306480505694">"საათის დამალვა"</string>
<string name="label" msgid="162189613902857319">"ლეიბლი"</string>
+ <string name="on_switch" msgid="2297966258029227449">"ჩართული"</string>
+ <string name="off_switch" msgid="3381070073851148013">"გამორთული"</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="6506982899651975645">"მაღვიძარას ზარი"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"მორგებული ზარი"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"ტაიმერის დრო ამოიწურა"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"უხმო"</string>
<string name="ringtone" msgid="9110746249688559579">"ზარი"</string>
<string name="time" msgid="8067216534232296518">"დრო"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"ხვალ"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"ჩაჩუმება <xliff:g id="TIME">%s</xliff:g>-მდე"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"მომავალი მაღვიძარა"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"თქვენი გაცდენილი მაღვიძარა წაიშალა"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"დარჩენილია ერთ წუთზე ნაკლები"</item>
- <item msgid="83197792732433351">"დარჩენილია <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"დარჩენილია <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"დარჩენილია <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"დარჩენილია ერთ წუთზე ნაკლები"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g><xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g><xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"დარჩენილია <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"დარჩენილია"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"დარჩენილია"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"მაღვიძარა დაყენებულია ამ მომენტიდან 1 წუთზე ნაკლებ დროზე."</item>
<item msgid="6002066367368421848">"მაღვიძარა დაყენებულია ამ მომენტიდან <xliff:g id="DAYS">%1$s</xliff:g>-ით."</item>
@@ -101,6 +104,10 @@
<item quantity="other">წუთი</item>
<item quantity="one">წუთი</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"ხმის თანდათანობით გაზრდა"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"გამორთული"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> წამი"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"წამები"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"სიჩუმე გააქტიურდება:"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> წუთი</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"წინანდელზე დაბრუნება"</string>
<string name="delete" msgid="5732434972457000541">"წაშლა"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"მაღვიძარას ხმა"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"ჩუმად"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"ჩუმი"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"უცნობი"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"მაღვიძარას ჩაჩუმება ან დახურვა"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ჩაჩუმებული)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"მაღვიძარა დაყენებულია <xliff:g id="TIME">%s</xliff:g>-ზე. შეეხეთ გასაუქმებლად."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"ზარის ჩატვირთვა…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Sound playback service for timers set in Clock."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"მაღვიძარას დაყენება"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"მაღვიძარა"</string>
<string name="menu_timer" msgid="6459070074762877114">"ტაიმერი"</string>
<string name="menu_clock" msgid="5612760670606829805">"საათი"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"სორტირება სახელის მიხედვით"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"არჩეული ქალაქები"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"გაგრძელება"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"დაწყება"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"შეჩერება"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"წრე"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"ჩამოყრა"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"დაწყება"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"წრე"</string>
<string name="sw_share_button" msgid="4478648110382859382">"გაზიარება"</string>
<string name="hours_label" msgid="3393478155635368097">"სთ"</string>
<string name="minutes_label" msgid="3568098128251438588">"წთ"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"ჩემი დრო არის <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"წრის დრო:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"წრე <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> საათი</item>
<item quantity="one">1 საათი</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 წუთის დამატება"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 წუთის დამატება"</string>
<string name="timer_stop" msgid="3361154678667736722">"შეჩერება"</string>
- <string name="timer_done" msgid="2375990511982914051">"დასრულდა"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"ყველა ტაიმერის შეჩერება"</string>
<string name="timer_reset" msgid="7848424809190171640">"ჩამოყრა"</string>
<string name="timer_cancel" msgid="3572868404230815644">"გაუქმება"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"ტაიმერი გაუქმდა"</string>
<string name="timer_times_up" msgid="9190440395938519009">"დრო ამოიწურა"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ტაიმერის დრო ამოიწურა"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"ტაიმერი"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"მაქსიმუმ 4 ტაიმერი"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"პაუზა"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"ტაიმერებ.ჩამოყრა"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"საკმაოდ სწრაფი ხართ."</item>
<item msgid="6332879039890727169">"ისიამოვნეთ თქვენი შრომის ნაყოფით."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"ქალაქები"</string>
<string name="clock_settings" msgid="8317286807280600391">"საათი"</string>
<string name="clock_style" msgid="2265011060429742344">"სტილი"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"დროისა და თარიღის შეცვლა"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"ანალოგი"</item>
<item msgid="8483930821046925592">"ციფრული"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> მონიშნულია"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> არ არის მონიშნული"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"მარშალის კუნძულები"</item>
<item msgid="4196408495909011020">"მიდუეის კუნძული"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"ჯაკარტა"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"მაღვიძარები"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"წამზომის სერვისი შეტყობინებების გასაგზავნად."</string>
- <string name="swn_stopped" msgid="783124901663086172">"შეჩერდა"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"ამუშავებს მოქმედებებს ტაიმერის შეტყობინებებიდან."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"ამუშავებს მოქმედებებს წამზომის შეტყობინებებიდან."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"დაპაუზებულია"</string>
<string name="description_direction_right" msgid="5709209043267548985">"დასახურად გადაფურცლეთ მარჯვნივ"</string>
<string name="description_direction_left" msgid="7448141043674998679">"ჩაჩუმებისათვის გადაფურცლეთ მარცხნივ"</string>
<string name="description_direction_both" msgid="1841309486023845685">"გადაფურცლეთ მარცხნივ ჩასაჩუმებლად, ან მარჯვნივ გასაუქმებლად"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"ტაიმერები"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"ტაიმერის ზარი"</string>
<string name="timer_stopped" msgid="2730331837832462008">"ტაიმერი შეჩერდა"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> ტაიმერი შეჩერდა"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"ტაიმერი დაპაუზებულია"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"დაპაუზებულია <xliff:g id="NUMBER">%d</xliff:g> ტაიმერი"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"შეეხეთ, რათა ნახოთ თქვენი ტაიმერები"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ტაიმერი"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"მომდევნო ტაიმერი: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"მაღვიძარები არ არის"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"მაღვიძ. არ არის"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"მომავალი მაღვიძარები არ არის"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"არასწორი დრო <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>-ზე მაღვიძარა არ არის"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"დაგეგმილი მაღვიძარა არ არის"</string>
<string name="no_label_specified" msgid="2008482054428460626">"ლეიბლი მითითებული არ არის"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"მაღვიძარას არ აქვს ეს ლეიბლი"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"წამზომი უკვე გაშვებულია"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"წამზომი გაშვებული არ არის"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"წამზომის გადაყენება ვერ მოხდება, რადგანაც გაშვებულია"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"წამზომი გაჩერდა"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"წამზომი დაპაუზებულია"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"წამზომის გადაყენება"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"წამზომზე ციკლი აღნიშნულია"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"წამზომი ჩაირთო"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"მაღვიძარა ამ დროს დაგეგმილი არ არის"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g>-ზე მაღვიძარა გაუქმებულია"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"მაღვიძარა დაყენებულია <xliff:g id="ALARM_TIME">%s</xliff:g>-ზე"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"ტაიმერი დაყენებული არ არის"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"ტაიმერი წაშლილია"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"ტაიმერი უკვე გაშვებულია"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"თქვენი მოთხოვნის დასრულება ვერ მოხერხდა, ხელმისაწვდომია რამდენიმე ტაიმერი"</string>
- <string name="timer_started" msgid="6715582052946641641">"ტაიმერი დაწყებულია"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"ტაიმერები არ არის"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"არსებობს ერთზე მეტი ტაიმერი"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"ტაიმერი ამოიშალა."</string>
<string name="timer_created" msgid="4381027137335885547">"ტაიმერი შექმნილია"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"ტაიმერის არასწორი ხანგრძლივობა"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"ტაიმერი ჩამოყრილია"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"ტაიმერის ჩამოყრა ვერ მოხერხდება, რადგანაც ის ჯერ კიდევ გაშვებულია. ჩამოსაყრელად შეაჩერეთ ტაიმერი."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"ტაიმერი უკვე შეჩერდა"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"ტაიმერი წაშლილია"</string>
+ <string name="timer_started" msgid="6715582052946641641">"ტაიმერი დაწყებულია"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"ტაიმერის არასწორი ხანგრძლივობა"</string>
<string name="no_city_selected" msgid="1007596865203283741">"ქალაქი არჩეული არ არის"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"მითითებული ქალაქი ხელმისაწვდომი არ არის"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"ეს ქალაქი უკვე დამატებულია"</string>
diff --git a/res/values-kk-rKZ/array.xml b/res/values-kk-rKZ/array.xml
index 97be64e..360157c 100644
--- a/res/values-kk-rKZ/array.xml
+++ b/res/values-kk-rKZ/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"Ф<xliff:g id="SEPARATOR">=</xliff:g>Форталеза"</item>
<item msgid="5801558418916235541">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гранд-Тёрк"</item>
<item msgid="2103759276235503048">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гренада"</item>
- <item msgid="1490069759176391533">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемала"</item>
+ <item msgid="6216160110733510854">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемала қаласы"</item>
<item msgid="525959305652046261">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гайана"</item>
<item msgid="7565596629973190931">"Г<xliff:g id="SEPARATOR">=</xliff:g>Галифакс"</item>
<item msgid="3811169155065582644">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гавана"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"Т<xliff:g id="SEPARATOR">=</xliff:g>Торонто"</item>
<item msgid="1506838283840737263">"В<xliff:g id="SEPARATOR">=</xliff:g>Ванкувер"</item>
<item msgid="8935386104773857399">"В<xliff:g id="SEPARATOR">=</xliff:g>Виннипег"</item>
- <item msgid="1132634022412399582">"О<xliff:g id="SEPARATOR">=</xliff:g>Оңтүстік Полюс"</item>
+ <item msgid="498429228419399474">"О<xliff:g id="SEPARATOR">=</xliff:g>Оңтүстік Полюс<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"Л<xliff:g id="SEPARATOR">=</xliff:g>Лонгйир"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Алматы"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Амман"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"Г<xliff:g id="SEPARATOR">=</xliff:g>Газа"</item>
<item msgid="2359068282340162319">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хеброн"</item>
<item msgid="6223396610551759129">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хошимин"</item>
- <item msgid="4731022818651322736">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гонконг"</item>
+ <item msgid="3439764751788710130">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гонконг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"Ы<xliff:g id="SEPARATOR">=</xliff:g>Ыстамбұл"</item>
<item msgid="758800913783999425">"Д<xliff:g id="SEPARATOR">=</xliff:g>Джакарта"</item>
<item msgid="8956406398692698126">"И<xliff:g id="SEPARATOR">=</xliff:g>Иерусалим"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"М<xliff:g id="SEPARATOR">=</xliff:g>Манила"</item>
<item msgid="6033964325069060422">"М<xliff:g id="SEPARATOR">=</xliff:g>Мускат"</item>
<item msgid="6077458941399984780">"П<xliff:g id="SEPARATOR">=</xliff:g>Пномпень"</item>
- <item msgid="935474308903572975">"П<xliff:g id="SEPARATOR">=</xliff:g>Пхеньян"</item>
+ <item msgid="1245515372520913197">"П<xliff:g id="SEPARATOR">=</xliff:g>Пхеньян<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"К<xliff:g id="SEPARATOR">=</xliff:g>Катар"</item>
<item msgid="1667243110545095146">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рангун"</item>
<item msgid="4460370766685855731">"Э<xliff:g id="SEPARATOR">=</xliff:g>Эр-Рияд"</item>
<item msgid="4229224905931739201">"С<xliff:g id="SEPARATOR">=</xliff:g>Сайгон"</item>
<item msgid="8705359848250215620">"С<xliff:g id="SEPARATOR">=</xliff:g>Сеул"</item>
- <item msgid="583367295371395814">"Ш<xliff:g id="SEPARATOR">=</xliff:g>Шанхай"</item>
+ <item msgid="3814881931186962624">"Ш<xliff:g id="SEPARATOR">=</xliff:g>Шанхай<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"С<xliff:g id="SEPARATOR">=</xliff:g>Сингапур"</item>
- <item msgid="1972491729911039207">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тайбэй"</item>
+ <item msgid="8982451946156859368">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тайбэй<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тегеран"</item>
<item msgid="8629402941285674273">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тель-Авив"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Токио"</item>
+ <item msgid="76330681636547168">"Т<xliff:g id="SEPARATOR">=</xliff:g>Токио<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"У<xliff:g id="SEPARATOR">=</xliff:g>Улан-Батор"</item>
<item msgid="2028626988021468640">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бермуда"</item>
<item msgid="4527109966513690429">"К<xliff:g id="SEPARATOR">=</xliff:g>Канар"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рено"</item>
<item msgid="9155068631060038769">"Б<xliff:g id="SEPARATOR">=</xliff:g>Блэк-Рок-Сити"</item>
<item msgid="8498761319928979900">"Д<xliff:g id="SEPARATOR">=</xliff:g>Доха"</item>
- <item msgid="8307897251088048641">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бейжің"</item>
+ <item msgid="5327010922199714808">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бейжің<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"М<xliff:g id="SEPARATOR">=</xliff:g>Мумбаи"</item>
<item msgid="6668274273067049125">"Д<xliff:g id="SEPARATOR">=</xliff:g>Дели"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Осака"</item>
+ <item msgid="7199039603593847813">"О<xliff:g id="SEPARATOR">=</xliff:g>Осака<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"Л<xliff:g id="SEPARATOR">=</xliff:g>Лахор"</item>
<item msgid="1448378291805481500">"С<xliff:g id="SEPARATOR">=</xliff:g>Сана"</item>
<item msgid="5233119846682408301">"Б<xliff:g id="SEPARATOR">=</xliff:g>Барселона"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"К<xliff:g id="SEPARATOR">=</xliff:g>Кембридж"</item>
<item msgid="759409010285366934">"К<xliff:g id="SEPARATOR">=</xliff:g>Киркленд"</item>
<item msgid="6308007059287569663">"М<xliff:g id="SEPARATOR">=</xliff:g>Мэдисон"</item>
- <item msgid="6971636434858330021">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гуанчжоу"</item>
+ <item msgid="2077617905582224600">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гуанчжоу<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хайдарабад"</item>
<item msgid="3032295682584784261">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рестон"</item>
<item msgid="7722837296297332268">"Б<xliff:g id="SEPARATOR">=</xliff:g>Белу-Оризонти"</item>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 3964d48..aca0664 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Сағатты көрсету"</string>
<string name="hide_clock" msgid="3217727306480505694">"Сағатты жасыру"</string>
<string name="label" msgid="162189613902857319">"Белгі"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Қосулы"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Өшірулі"</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="6506982899651975645">"Дабылдың қоңырау әуені"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Реттелетін қоңырау әуені"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Таймер мерзімі бітті"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Үнсіз"</string>
<string name="ringtone" msgid="9110746249688559579">"Қоңырау әуені"</string>
<string name="time" msgid="8067216534232296518">"Уақыт"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Ертең"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> дейін кейінге қалдыру"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Келе жатқан дабыл"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Өткізіп алған дабыл жойылды"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Бір минуттан азырақ қалды"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> қалды"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> қалды"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> қалды"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Бір минуттан азырақ қалды"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> қалды"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"қалды"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"қалды"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Дабыл қазірден бастап 1 минуттан аз уақыт өткен соң беріледі."</item>
<item msgid="6002066367368421848">"Дабыл қазірден бастап <xliff:g id="DAYS">%1$s</xliff:g> өткен соң беріледі."</item>
@@ -101,6 +104,10 @@
<item quantity="other">минуттар</item>
<item quantity="one">минут</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Дыбыс деңгейін біртіндеп арттыру"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Өшірулі"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> секунд"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"секундтар"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Дыбысын автоматты өшіру"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> минут</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Қайтару"</string>
<string name="delete" msgid="5732434972457000541">"Жою"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Дабылдың дыбыс деңгейі"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Үнсіз"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Үнсіз"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Белгісіз"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Дабылды кейінге қалдыру немесе одан бас тарту."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (кейінге қалдырылған)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Дабыл <xliff:g id="TIME">%s</xliff:g> уақытына орнатылған. Бас тарту үшін түртіңіз."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Қоңырау әуені жүктелуде…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"«Сағат» қолданбасында орнатылған таймерлер үшін дыбысты ойнату қызметі."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Дабыл орнату"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Дабыл"</string>
<string name="menu_timer" msgid="6459070074762877114">"Таймер"</string>
<string name="menu_clock" msgid="5612760670606829805">"Cағат"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Атауы бойынша сұрыптау"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Таңдалған қалалар"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Жалғастыру"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Бастау"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Тоқтату"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Айналым"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Қалпына келтіру"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Бастау"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Айналым"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Бөлісу"</string>
<string name="hours_label" msgid="3393478155635368097">"с"</string>
<string name="minutes_label" msgid="3568098128251438588">"м"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Менің уақытым – <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Аралық уақыттары:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>-айналым"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"№ <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"№ <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> сағат</item>
<item quantity="one">1 сағат</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 минут қосу"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 мин. қосу"</string>
<string name="timer_stop" msgid="3361154678667736722">"Тоқтату"</string>
- <string name="timer_done" msgid="2375990511982914051">"Дайын"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Барлық таймерлерді тоқтату"</string>
<string name="timer_reset" msgid="7848424809190171640">"Қалпына келтіру"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Бас тарту"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Таймерден бас тартылды"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Уақыт аяқталды"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> таймердің мерзімі өтті"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Таймер"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Ең көбі 4 таймер"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Кідірту"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Барлық таймерлерді ысыру"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Сіз өте жылдамсыз."</item>
<item msgid="6332879039890727169">"Еңбегіңіздің жемістеріне қуаныңыз."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Қалалар"</string>
<string name="clock_settings" msgid="8317286807280600391">"Cағат"</string>
<string name="clock_style" msgid="2265011060429742344">"Стиль"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Күнді және уақытты өзгерту"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Аналогтық"</item>
<item msgid="8483930821046925592">"Сандық"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> құсбелгі қойылды"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> құсбелгі алынды"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Маршалл аралдары"</item>
<item msgid="4196408495909011020">"Мидуэй аралы"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Джакарта"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Дабылдар"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Хабарландыруды орындайтын секундомер қызметі."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Тоқтатылды"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Таймер хабарландыруларынан әрекеттерді өңдейді."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Секундөлшегіш хабарландыруларынан әрекеттерді өңдейді."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Кідіртілген"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Қабылдамау үшін оңға жанаңыз"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Кейінге қалдыру үшін солға жанаңыз"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Кідірту үшін солға, ал өшіру үшін оңға сырғытыңыз"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Таймерлер"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Таймердің әуені"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Таймер тоқтатылды"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> таймер тоқтатылды"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Таймер кідіртілді"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> таймер кідіртілді"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Таймерлерді көру үшін түртіңіз"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> таймер"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Келесі таймер: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Дабылдар жоқ"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Дабылдар орнатылмаған"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"КЕЛЕ ЖАТҚАН ДАБЫЛДАР ЖОҚ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"с:мм a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"к:мм"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, сағ: мм а"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, к: мм"</string>
<string name="invalid_time" msgid="2782334750243998633">"Жарамсыз уақыт: <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> уақытында дабыл жоқ"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Жоспарланған дабылдар жоқ"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Ешбір белгі көрсетілмеген"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Ешбір дабылда белгі жоқ"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Секундомер істеп тұр"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Секундомер істеп тұрған жоқ"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Секунд өлшегішті ысыру мүмкін емес, өйткені ол іске қосылған"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Секунд өлшегіш тоқтатылды"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Секундомер кідіртілді"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Секунд өлшегішті ысыру"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Секунд өлшегіш келесі аралыққа өтті"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Секунд өлшегіш іске қосылды"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Осы уақытқа ешқандай дабыл жоспарланбаған"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> дабылы өшірілді"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Дабыл <xliff:g id="ALARM_TIME">%s</xliff:g> уақытына орнатылған"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Таймер орнатылмаған"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Таймер жойылды"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Таймер істеп тұр"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Сұрауды аяқтау мүмкін емес, бірнеше таймер тұр"</string>
- <string name="timer_started" msgid="6715582052946641641">"Таймер қосылды"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Ешбір таймер жоқ"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Бірден артық таймер бар"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Таймер жойылды."</string>
<string name="timer_created" msgid="4381027137335885547">"Таймер жасалды"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Таймер ұзақтығы дұрыс емес"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Таймер ысырылды"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Таймерді ысыру мүмкін емес, өйткені ол әлі жұмыс істеп тұр. Ысыру үшін таймерді тоқтатыңыз."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Таймер тоқтап қалған"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Таймер жойылды"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Таймер қосылды"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Таймер ұзақтығы дұрыс емес"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Қала таңдалмаған"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Сіз көрсеткен қала қолжетімді емес"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Бұл қала бұрыннан қосылған"</string>
diff --git a/res/values-km-rKH/array.xml b/res/values-km-rKH/array.xml
index c05b796..1d8bd86 100644
--- a/res/values-km-rKH/array.xml
+++ b/res/values-km-rKH/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហ្វតាល់លេសា"</item>
<item msgid="5801558418916235541">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហ្គ្រេនទួក"</item>
<item msgid="2103759276235503048">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហ្គ្រើណាដ"</item>
- <item msgid="1490069759176391533">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហ្គាតេម៉ាឡា"</item>
+ <item msgid="6216160110733510854">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហ្គាតេម៉ាឡា"</item>
<item msgid="525959305652046261">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហ្គុយ៉ាណា"</item>
<item msgid="7565596629973190931">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហាលីហ្វាក់"</item>
<item msgid="3811169155065582644">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហាវ៉ាណា"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ត<xliff:g id="SEPARATOR">=</xliff:g>តូរ៉ន់តូ"</item>
<item msgid="1506838283840737263">"វ<xliff:g id="SEPARATOR">=</xliff:g>វ៉ានខូវើ"</item>
<item msgid="8935386104773857399">"វ<xliff:g id="SEPARATOR">=</xliff:g>វីនីផេក"</item>
- <item msgid="1132634022412399582">"ប<xliff:g id="SEPARATOR">=</xliff:g>ប៉ូលខាងត្បូង"</item>
+ <item msgid="498429228419399474">"ប<xliff:g id="SEPARATOR">=</xliff:g>ប៉ូលខាងត្បូង<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ឡ<xliff:g id="SEPARATOR">=</xliff:g>ឡុងយាប្យេន"</item>
<item msgid="3784788073896028355">"អ<xliff:g id="SEPARATOR">=</xliff:g>អាល់ម៉ាទី"</item>
<item msgid="7895695236056852523">"អ<xliff:g id="SEPARATOR">=</xliff:g>អាម៉ាន"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ក<xliff:g id="SEPARATOR">=</xliff:g>កាហ្សា"</item>
<item msgid="2359068282340162319">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហេប្រន"</item>
<item msgid="6223396610551759129">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហូជីមីញ"</item>
- <item msgid="4731022818651322736">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហុងកុង"</item>
+ <item msgid="3439764751788710130">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហុងកុង<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"អ<xliff:g id="SEPARATOR">=</xliff:g>អ៊ីស្តង់ប៊ុល"</item>
<item msgid="758800913783999425">"ហ<xliff:g id="SEPARATOR">=</xliff:g>ហ្សាការតា"</item>
<item msgid="8956406398692698126">"យ<xliff:g id="SEPARATOR">=</xliff:g>យេរូសាឡឹម"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"ម<xliff:g id="SEPARATOR">=</xliff:g>ម៉ានីល"</item>
<item msgid="6033964325069060422">"ម<xliff:g id="SEPARATOR">=</xliff:g>ម៉ាស្កាត"</item>
<item msgid="6077458941399984780">"ភ<xliff:g id="SEPARATOR">=</xliff:g>ភ្នំពេញ"</item>
- <item msgid="935474308903572975">"ព<xliff:g id="SEPARATOR">=</xliff:g>ព្យុងយ៉ាង"</item>
+ <item msgid="1245515372520913197">"ព<xliff:g id="SEPARATOR">=</xliff:g>ព្យុងយ៉ាង<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"ក<xliff:g id="SEPARATOR">=</xliff:g>កាតា"</item>
<item msgid="1667243110545095146">"រ<xliff:g id="SEPARATOR">=</xliff:g>រ៉ង់ហ្គូន"</item>
<item msgid="4460370766685855731">"រ<xliff:g id="SEPARATOR">=</xliff:g>រីយ៉ាដ"</item>
<item msgid="4229224905931739201">"ស<xliff:g id="SEPARATOR">=</xliff:g>សៃហ្គន"</item>
<item msgid="8705359848250215620">"ស<xliff:g id="SEPARATOR">=</xliff:g>សេអ៊ូល"</item>
- <item msgid="583367295371395814">"ស<xliff:g id="SEPARATOR">=</xliff:g>សៀងហៃ"</item>
+ <item msgid="3814881931186962624">"ស<xliff:g id="SEPARATOR">=</xliff:g>សៀងហៃ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"ស<xliff:g id="SEPARATOR">=</xliff:g>សិង្ហបុរី"</item>
- <item msgid="1972491729911039207">"ត<xliff:g id="SEPARATOR">=</xliff:g>តៃប៉ិ"</item>
+ <item msgid="8982451946156859368">"ត<xliff:g id="SEPARATOR">=</xliff:g>តៃប៉ិ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"ត<xliff:g id="SEPARATOR">=</xliff:g>តេហេរ៉ង់"</item>
<item msgid="8629402941285674273">"ត<xliff:g id="SEPARATOR">=</xliff:g>តែលអាវី"</item>
- <item msgid="8499164674454654525">"ត<xliff:g id="SEPARATOR">=</xliff:g>តូក្យូ"</item>
+ <item msgid="76330681636547168">"ត<xliff:g id="SEPARATOR">=</xliff:g>តូក្យូ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"អ<xliff:g id="SEPARATOR">=</xliff:g>អ៊ូឡង់បាទ័រ"</item>
<item msgid="2028626988021468640">"ប<xliff:g id="SEPARATOR">=</xliff:g>ប៊ឺមុយដា"</item>
<item msgid="4527109966513690429">"ក<xliff:g id="SEPARATOR">=</xliff:g>កាណារី"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"រ<xliff:g id="SEPARATOR">=</xliff:g>រីណូ"</item>
<item msgid="9155068631060038769">"ទ<xliff:g id="SEPARATOR">=</xliff:g>ទីក្រុងប្លេករ៉ុក"</item>
<item msgid="8498761319928979900">"ដ<xliff:g id="SEPARATOR">=</xliff:g>ដូហា"</item>
- <item msgid="8307897251088048641">"ប<xliff:g id="SEPARATOR">=</xliff:g>ប៉េកាំង"</item>
+ <item msgid="5327010922199714808">"ប<xliff:g id="SEPARATOR">=</xliff:g>ប៉េកាំង<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"ម<xliff:g id="SEPARATOR">=</xliff:g>ម៉ុមបៃ"</item>
<item msgid="6668274273067049125">"ដ<xliff:g id="SEPARATOR">=</xliff:g>ដេលី"</item>
- <item msgid="2933410189478233292">"អ<xliff:g id="SEPARATOR">=</xliff:g>អូសាកា"</item>
+ <item msgid="7199039603593847813">"អ<xliff:g id="SEPARATOR">=</xliff:g>អូសាកា<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ឡ<xliff:g id="SEPARATOR">=</xliff:g>ឡាហ័រ"</item>
<item msgid="1448378291805481500">"ស<xliff:g id="SEPARATOR">=</xliff:g>សាណាអា"</item>
<item msgid="5233119846682408301">"ប<xliff:g id="SEPARATOR">=</xliff:g>បាសេឡូណា"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"ខ<xliff:g id="SEPARATOR">=</xliff:g>ខេមប្រីដ"</item>
<item msgid="759409010285366934">"ឃ<xliff:g id="SEPARATOR">=</xliff:g>ឃើកឡែន"</item>
<item msgid="6308007059287569663">"ម<xliff:g id="SEPARATOR">=</xliff:g>ម៉ាឌីសុន"</item>
- <item msgid="6971636434858330021">"ក<xliff:g id="SEPARATOR">=</xliff:g>ក្វាងចូវ"</item>
+ <item msgid="2077617905582224600">"ក<xliff:g id="SEPARATOR">=</xliff:g>ក្វាងចូវ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"អ<xliff:g id="SEPARATOR">=</xliff:g>អ៊ីឌើរ៉ាបាដ"</item>
<item msgid="3032295682584784261">"រ<xliff:g id="SEPARATOR">=</xliff:g>រីស្តូន"</item>
<item msgid="7722837296297332268">"ប<xliff:g id="SEPARATOR">=</xliff:g>បេឡូរីហ្សូនធ៍"</item>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 1434d7d..6e162a2 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"បង្ហាញនាឡិកា"</string>
<string name="hide_clock" msgid="3217727306480505694">"លាក់នាឡិកា"</string>
<string name="label" msgid="162189613902857319">"ស្លាក"</string>
+ <string name="on_switch" msgid="2297966258029227449">"បើក"</string>
+ <string name="off_switch" msgid="3381070073851148013">"បិទ"</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="6506982899651975645">"សំឡេងរោទ៍"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"សំឡេងរោទិ៍ផ្ទាល់ខ្លួន"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"កម្មវិធីកំណត់ពេលបានផុតកំណត់"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"ស្ងាត់"</string>
<string name="ringtone" msgid="9110746249688559579">"សំឡេងរោទ៍"</string>
<string name="time" msgid="8067216534232296518">"ពេលវេលា"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"ថ្ងៃស្អែក"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"ផ្អាករហូតដល់ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"ការជូនដំណឹងដែលនឹងកើតឡើង"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"ការខកខានជូនដំណឹងរបស់អ្នកត្រូវបានលុប"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"នៅសល់តិចជាងមួយនាទី"</item>
- <item msgid="83197792732433351">"នៅសល់ <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"នៅសល់ <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"នៅសល់ <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"នៅសល់តិចជាងមួយនាទី"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"នៅសល់ <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"នៅសល់"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"នៅសល់"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"បានកំណត់សំឡេងរោទ៍តិចជាង១នាទី គិតចាប់ពីឥឡូវ។"</item>
<item msgid="6002066367368421848">"បានកំណត់សំឡេងរោទ៍ក្នុងរយៈពេល <xliff:g id="DAYS">%1$s</xliff:g> ទៀត។"</item>
@@ -101,6 +104,10 @@
<item quantity="other">នាទី</item>
<item quantity="one">នាទី</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"បង្កើនសំឡេងសន្សឹមៗ"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"បិទ"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> វិនាទី"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"វិនាទី"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"បិទសំឡេងបន្ទាប់ពី"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> នាទី</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"ត្រឡប់ទៅដើម"</string>
<string name="delete" msgid="5732434972457000541">"លុប"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"កម្រិតសំឡេងរោទ៍"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"ស្ងាត់"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"ស្ងាត់"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"មិនស្គាល់"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"ផ្អាក ឬបោះបង់សំឡេងរោទ៍។"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (បានផ្អាក)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"បានកំណត់សំឡេងរោទ៍ក្នុងរយៈពេល <xliff:g id="TIME">%s</xliff:g> ទៀត។ ប៉ះដើម្បីបោះបង់។"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"កំពុងផ្ទុកសំឡេងរោទ៍…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"បានកំណត់សេវាកម្មបន្លឺសំឡេងរោទ៍នៅក្នុងនាឡិកា។"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"កំណត់សំឡេងរោទ៍"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"ការជូនដំណឹង"</string>
<string name="menu_timer" msgid="6459070074762877114">"កម្មវិធីកំណត់ពេល"</string>
<string name="menu_clock" msgid="5612760670606829805">"នាឡិកា"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"តម្រៀបតាមឈ្មោះ"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"ទីក្រុងបានជ្រើស"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"បន្ត"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"ចាប់ផ្ដើម"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"ឈប់"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ជាន់គ្នា"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"កំណត់ឡើងវិញ"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"ចាប់ផ្ដើម"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"ជាន់គ្នា"</string>
<string name="sw_share_button" msgid="4478648110382859382">"ចែករំលែក"</string>
<string name="hours_label" msgid="3393478155635368097">"ម៉ោង"</string>
<string name="minutes_label" msgid="3568098128251438588">"នាទី"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"ពេលវេលារបស់ខ្ញុំគឺ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"រយៈពេលជាន់គ្នា៖"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"ជាន់គ្នា <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ម៉ោង</item>
<item quantity="one">1 ម៉ោង</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"បន្ថែម ១ នាទី"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"បន្ថែម ១នាទី"</string>
<string name="timer_stop" msgid="3361154678667736722">"ឈប់"</string>
- <string name="timer_done" msgid="2375990511982914051">"រួចរាល់"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"បញ្ឈប់កម្មវិធីកំណត់ពេលទាំងអស់"</string>
<string name="timer_reset" msgid="7848424809190171640">"កំណត់ឡើងវិញ"</string>
<string name="timer_cancel" msgid="3572868404230815644">"បោះបង់"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"លុបចោលកម្មវិធីកំណត់ពេលវេលា"</string>
<string name="timer_times_up" msgid="9190440395938519009">"ដល់ម៉ោង"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"កម្មវិធីកំណត់ពេល <xliff:g id="NUM_TIMERS">%d</xliff:g> បានផុតកំណត់"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"កម្មវិធីកំណត់ពេល"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"ច្រើនបំផុតកម្មវិធីកំណត់ម៉ោង ៤"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"ផ្អាក"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"កំណត់ការកំណត់ពេលទាំងអស់ឡើងវិញ"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"អ្នកកំពុងស្ថិតក្នុងល្បឿនដ៏អស្ចារ្យ។"</item>
<item msgid="6332879039890727169">"រីករាយជាមួយលទ្ធផលការងាររបស់អ្នក។"</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"ទីក្រុង"</string>
<string name="clock_settings" msgid="8317286807280600391">"នាឡិកា"</string>
<string name="clock_style" msgid="2265011060429742344">"រចនាប័ទ្ម"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"ប្តូរកាលបរិច្ឆេទ និងម៉ោង"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"អាណាឡូក"</item>
<item msgid="8483930821046925592">"ឌីជីថល"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":០០"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":៣០"</string>
+ <string name="city_checked" msgid="616847871968019">"បានធីក <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"បានដោះការធីក <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"កោះម៉ាសាល"</item>
<item msgid="4196408495909011020">"កោះមីតវ៉េ"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"ហ្សាការតា"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"សំឡេងរោទ៍"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"សេវាកម្មនាឡិកាបញ្ឈប់ដើម្បីដំណើរការការជូនដំណឹង។"</string>
- <string name="swn_stopped" msgid="783124901663086172">"បានឈប់"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"ដំណើរការសកម្មភាពពីការជូនដំណឹងកម្មវិធីកំណត់ពេល"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"ដំណើរការសកម្មភាពពីការជូនដំណឹងម៉ោងបញ្ឈប់"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"បានផ្អាក"</string>
<string name="description_direction_right" msgid="5709209043267548985">"អូសទៅស្ដាំដើម្បីបដិសេធ"</string>
<string name="description_direction_left" msgid="7448141043674998679">"អូសទៅឆ្វេងដើម្បីផ្អាក"</string>
<string name="description_direction_both" msgid="1841309486023845685">"អូសទៅឆ្វេងដើម្បីផ្អាក ឬទៅស្តាំដើម្បីបញ្ឈប់"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"កម្មវិធីកំណត់ពេល"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"សំឡេងរោទិ៍កម្មវិធីកំណត់ពេល"</string>
<string name="timer_stopped" msgid="2730331837832462008">"កម្មវិធីកំណត់ពេលបានឈប់"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> កម្មវិធីកំណត់ពេលបានឈប់"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"បានផ្អាកកម្មវិធីកំណត់ពេល"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"បានផ្អាកកម្មវិធីកំណត់ពេល <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"ប៉ះដើម្បីមើលកម្មវិធីកំណត់ពេលរបស់អ្នក"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> កម្មវិធីកំណត់ពេល"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"កម្មវិធីកំណត់ពេលបន្ទាប់៖ <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"គ្មានការជូនដំណឹង"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"មិនមានសំឡេងរោទ៍"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"គ្មានការជូនដំណឹងដែលនឹងកើតឡើង"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"ម៉ោងមិនត្រឹមត្រូវ <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"គ្មានម៉ោងរោទិ៍នៅ <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"គ្មានម៉ោងរោទិ៍បានកំណត់ទេ"</string>
<string name="no_label_specified" msgid="2008482054428460626">"គ្មានការបញ្ជាក់ស្លាកទេ"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"គ្មានម៉ោងរោទិ៍ដែលមានស្លាកទេ"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"នាឡិកាបញ្ឈប់កំពុងដំណើរហើយ"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"នាឡិកាបញ្ឈប់មិនដំណើរការទេ"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"មិនអាចកំណត់នាឡិកាបញ្ឈប់ឡើងវិញបានទេព្រោះវាកំពុងដំណើរការ"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"បានបញ្ឈប់នាឡិកាបញ្ឈប់"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"បានផ្អាកនាឡិកាបញ្ឈប់"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"កំណត់នាឡិកាបញ្ឈប់ឡើងវិញ"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"បានកំណត់ជុំនាឡិកាបញ្ឈប់"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"បានចាប់ផ្តើមនាឡិកាបញ្ឈប់"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"គ្មានការកំណត់ម៉ោងរោទិ៍សម្រាប់ពេលនេះទេ"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"បានបដិសេធម៉ោងរោទិ៍ <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"ម៉ោងរោទ៍ត្រូវបានកំណត់នៅ <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"គ្មានការកំណត់កម្មវិធីកំណត់ពេលទេ"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"បានលុបកម្មវិធីកំណត់ពេល"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"កម្មវិធីកំណត់ពេលកំពុងដំណើរការហើយ"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"មិនអាចបញ្ចប់សំណើរបស់អ្នកបានទេ ព្រោះមានកម្មវិធីកំណត់ម៉ោងច្រើន"</string>
- <string name="timer_started" msgid="6715582052946641641">"ចាប់ផ្ដើមកម្មវិធីកំណត់ពេល"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"គ្មានកម្មវិធីកំណត់ពេលទេ"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"មានកម្មវិធីកំណត់ពេលច្រើនជាងមួយ"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"កម្មវិធីកំណត់ពេលត្រូវបានយកចេញ"</string>
<string name="timer_created" msgid="4381027137335885547">"បានបង្កើតឧបករណ៍កំណត់ពេល"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"រយៈពេលសម្រាប់ឧបករណ៍កំណត់ពេលមិនត្រឹមត្រូវ"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"កំណត់កម្មវិធីកំណត់ពេលឡើងវិញ"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"មិនអាចកំណត់កម្មវិធីកំណត់ពេលឡើងវិញបានទេ វាកំពុងដំណើរការនៅឡើយ។ សូមបញ្ឈប់កម្មវិធីកំណត់ពេលដើម្បីកំណត់ឡើងវិញ។"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"កម្មវិធីកំណត់ពេលបានឈប់ហើយ"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"បានលុបកម្មវិធីកំណត់ពេល"</string>
+ <string name="timer_started" msgid="6715582052946641641">"ចាប់ផ្ដើមកម្មវិធីកំណត់ពេល"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"រយៈពេលសម្រាប់ឧបករណ៍កំណត់ពេលមិនត្រឹមត្រូវ"</string>
<string name="no_city_selected" msgid="1007596865203283741">"មិនបានជ្រើសទីក្រុងទេ"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"ទីក្រុងដែលអ្នកបានបញ្ជាក់មិនមានទេ"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"បានបន្ថែមទីក្រុងនោះរួចហើយ"</string>
diff --git a/res/values-kn-rIN/array.xml b/res/values-kn-rIN/array.xml
index 0497892..f3fb828 100644
--- a/res/values-kn-rIN/array.xml
+++ b/res/values-kn-rIN/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>ಫೋರ್ಟಲೀಜಾ"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>ಗ್ರ್ಯಾಂಡ್ ಟರ್ಕ್"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>ಗ್ರೆನಡಾ"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>ಗ್ವಾಟೆಮಾಲಾ"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>ಗ್ವಾಟೆಮಾಲಾ ನಗರ"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>ಗಯಾನ"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>ಹ್ಯಾಲಿಫ್ಯಾಕ್ಸ್"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>ಹವಾನಾ"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>ಟೊರೊಂಟೊ"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>ವ್ಯಾಂಕೋವರ್"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>ವಿನ್ನಿಪೆಗ್"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>ದಕ್ಷಿಣ ಧ್ರುವ"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>ದಕ್ಷಿಣ ಧ್ರುವ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>ಲಾಂಗ್ಇಯರ್ಬೈನ್"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>ಅಲ್ಮಾಟಿ"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>ಅಮ್ಮಾನ್"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>ಗಾಜಾ"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>ಹೆಬ್ರಾನ್"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>ಹೊ ಚಿ ಮಿನ್ಹ್"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>ಹಾಂಗ್ ಕಾಂಗ್"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>ಹಾಂಗ್ ಕಾಂಗ್<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>ಇಸ್ತಾನ್ಬುಲ್"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>ಜಕಾರ್ತಾ"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>ಜೆರುಸಲೆಮ್"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>ಮನಿಲಾ"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>ಮಸ್ಕತ್"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>ನೋಮ್ ಪೆನ್"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>ಪೋಂಗ್ಯಾಂಗ್"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>ಪೋಂಗ್ಯಾಂಗ್<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>ಕತಾರ್"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>ರಂಗೂನ್"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>ರಿಯಾದ್"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>ಸೈಗಾನ್"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>ಸಿಯೋಲ್"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>ಶಾಂಘೈ"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>ಶಾಂಘೈ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>ಸಿಂಗಪುರ್"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>ಟೈಪೆ"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>ಟೈಪೆ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>ತೆಹ್ರಾನ್"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>ಟೆಲ್ ಅವಿವ್"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>ಟೋಕಿಯೊ"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>ಟೋಕಿಯೊ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>ಉಲಾನ್ಬಾತರ್"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>ಬರ್ಮುಡಾ"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>ಕ್ಯಾನರಿ"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>ರೆನೋ"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>ಬ್ಲಾಕ್ ರಾಕ್ ಸಿಟಿ"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>ದೋಹಾ"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>ಬೀಜಿಂಗ್"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>ಬೀಜಿಂಗ್<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>ಮುಂಬೈ"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>ದೆಹಲಿ"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>ಒಸಾಕಾ"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>ಒಸಾಕಾ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>ಲಾಹೋರ್"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>ಸನಾ"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>ಬಾರ್ಸಿಲೋನಾ"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>ಕೇಂಬ್ರಿಡ್ಜ್"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>ಕಿರ್ಕ್ಲ್ಯಾಂಡ್"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>ಮ್ಯಾಡಿಸನ್"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>ಗುವಾಂಗ್ಝೌ"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>ಗುವಾಂಗ್ಝೌ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>ಹೈದರಾಬಾದ್"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>ರೆಸ್ಟಾನ್"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>ಬೆಲೊ ಹೊರಿಜೊಂಟೆ"</item>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index a3d1bc2..065d484 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"ಗಡಿಯಾರ ತೋರಿಸು"</string>
<string name="hide_clock" msgid="3217727306480505694">"ಗಡಿಯಾರವನ್ನು ಮರೆಮಾಡಿ"</string>
<string name="label" msgid="162189613902857319">"ಲೇಬಲ್"</string>
+ <string name="on_switch" msgid="2297966258029227449">"ಆನ್"</string>
+ <string name="off_switch" msgid="3381070073851148013">"ಆಫ್"</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="6506982899651975645">"ಅಲಾರಂ ರಿಂಗ್ಟೋನ್"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"ಕಸ್ಟಮ್ ರಿಂಗ್ಟೋನ್"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"ಟೈಮರ್ ಅವಧಿ ಮೀರಿದೆ"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"ನಿಶ್ಯಬ್ಧ"</string>
<string name="ringtone" msgid="9110746249688559579">"ರಿಂಗ್ಟೋನ್"</string>
<string name="time" msgid="8067216534232296518">"ಸಮಯ"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"ನಾಳೆ"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> ವರೆಗೆ ಸ್ನೂಜಿಂಗ್ ಆಗುತ್ತದೆ"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"ಮುಂಬರುವ ಅಲಾರಂ"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"ನಿಮ್ಮ ತಪ್ಪಿದ ಅಲಾರಮ್ ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"ಒಂದಕ್ಕಿಂತ ಕಡಿಮೆ ನಿಮಿಷ ಬಾಕಿಯಿದೆ."</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> ಉಳಿದಿದೆ"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> ಉಳಿದಿದೆ"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ಉಳಿದಿದೆ"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"ಒಂದು ನಿಮಿಷಕ್ಕಿಂತ ಕಡಿಮೆ ಉಳಿದಿದೆ"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ಉಳಿದಿದೆ"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"ಉಳಿದಿದೆ"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"ಉಳಿದಿದೆ"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"ಈಗಿನಿಂದ 1 ನಿಮಿಷಕ್ಕೂ ಕಡಿಮೆ ಅವಧಿಗೆ ಅಲಾರಂ ಹೊಂದಿಸಲಾಗಿದೆ."</item>
<item msgid="6002066367368421848">"ಈಗಿನಿಂದ <xliff:g id="DAYS">%1$s</xliff:g> ಅಲಾರಂ ಹೊಂದಿಸಲಾಗಿದೆ."</item>
@@ -101,6 +104,10 @@
<item quantity="one">ನಿಮಿಷಗಳು</item>
<item quantity="other">ನಿಮಿಷಗಳು</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"ಕ್ರಮೇಣವಾಗಿ ವಾಲ್ಯೂಮ್ ಹೆಚ್ಚಿಸಿ"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"ಆಫ್"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> ಸೆಕೆಂಡುಗಳು"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"ಸೆಕೆಂಡುಗಳು"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"ಇಷ್ಟೊತ್ತಿನ ಮೇಲೆ ಮೌನವಾಗು"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> ನಿಮಿಷಗಳು</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"ತಿರುಗಿಸು"</string>
<string name="delete" msgid="5732434972457000541">"ಅಳಿಸು"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"ಅಲಾರಂ ವಾಲ್ಯೂಮ್"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"ಶಾಂತ"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"ನಿಶ್ಯಬ್ಧ"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"ಅಪರಿಚಿತ"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"ಅಲಾರಂ ಸ್ನೂಜ್ ಮಾಡು ಅಥವಾ ವಜಾಗೊಳಿಸು."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ಸ್ನೂಜ್ ಆಗಿದೆ)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"<xliff:g id="TIME">%s</xliff:g> ಗೆ ಅಲಾರಮ್ ಹೊಂದಿಸಲಾಗಿದೆ. ರದ್ದುಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"ರಿಂಗ್ಟೋನ್ ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"ಗಡಿಯಾರದ ಒಳಗೆ ಟೈಮರ್ಗಳ ಹೊಂದಿಕೆಗಾಗಿ ಧ್ವನಿ ಪ್ಲೇಬ್ಯಾಕ್ ಸೇವೆ."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"ಅಲಾರಮ್ ಹೊಂದಿಸಿ"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"ಅಲಾರಮ್"</string>
<string name="menu_timer" msgid="6459070074762877114">"ಟೈಮರ್"</string>
<string name="menu_clock" msgid="5612760670606829805">"ಗಡಿಯಾರ"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"ಹೆಸರಿನ ಪ್ರಕಾರ ವಿಂಗಡಿಸಿ"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"ಆಯ್ದ ನಗರಗಳು"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"ಮುಂದುವರಿಸು"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"ಪ್ರಾರಂಭಿಸು"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"ನಿಲ್ಲಿಸು"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ಲ್ಯಾಪ್"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"ಮರುಹೊಂದಿಸಿ"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"ಪ್ರಾರಂಭಿಸು"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"ಲ್ಯಾಪ್"</string>
<string name="sw_share_button" msgid="4478648110382859382">"ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="hours_label" msgid="3393478155635368097">"ಗ"</string>
<string name="minutes_label" msgid="3568098128251438588">"ನಿ"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"ನನ್ನ ಸಮಯ <xliff:g id="TIME">%s</xliff:g> ಆಗಿದೆ"</string>
<string name="sw_share_laps" msgid="614390674795945007">"ಲ್ಯಾಪ್ ಸಮಯಗಳು:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"ಲ್ಯಾಪ್ <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ಗಂಟೆಗಳು</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ಗಂಟೆಗಳು</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 ನಿಮಿಷ ಸೇರಿಸು"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 ನಿಮಿಷ ಸೇರಿಸು"</string>
<string name="timer_stop" msgid="3361154678667736722">"ನಿಲ್ಲಿಸು"</string>
- <string name="timer_done" msgid="2375990511982914051">"ಮುಗಿದಿದೆ"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"ಎಲ್ಲಾ ಟೈಮರ್ಗಳನ್ನು ನಿಲ್ಲಿಸಿ"</string>
<string name="timer_reset" msgid="7848424809190171640">"ಮರುಹೊಂದಿಸಿ"</string>
<string name="timer_cancel" msgid="3572868404230815644">"ರದ್ದುಮಾಡು"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"ಟೈಮರ್ ರದ್ದುಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="timer_times_up" msgid="9190440395938519009">"ಸಮಯ ಮುಗಿದಿದೆ"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ಟೈಮರ್ಗಳ ಅವಧಿ ಮೀರಿದೆ"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"ಟೈಮರ್"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"ಗರಿಷ್ಠ 4 ಟೈಮರ್ಗಳು"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"ವಿರಾಮ"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"ಎಲ್ಲಾ ಟೈಮರ್ ಮರುಹೊಂದಿಸಿ"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"ನೀವು ಸ್ವಲ್ಪ ಹೆಚ್ಚಿನ ವೇಗಿ."</item>
<item msgid="6332879039890727169">"ನಿಮ್ಮ ಪರಿಶ್ರಮದ ಪ್ರತಿಫಲವನ್ನು ಆನಂದಿಸಿ."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"ನಗರಗಳು"</string>
<string name="clock_settings" msgid="8317286807280600391">"ಗಡಿಯಾರ"</string>
<string name="clock_style" msgid="2265011060429742344">"ಶೈಲಿ"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"ದಿನಾಂಕ ಮತ್ತು ಸಮಯವನ್ನು ಬದಲಾಯಿಸಿ"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"ಅನಲಾಗ್"</item>
<item msgid="8483930821046925592">"ಡಿಜಿಟಲ್"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ಪರಿಶೀಲಿಸಲಾಗಿದೆ"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> ಪರಿಶೀಲನೆ ರದ್ದುಮಾಡಲಾಗಿದೆ"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"ಮಾರ್ಷಲ್ ದ್ವೀಪಗಳು"</item>
<item msgid="4196408495909011020">"ಮಿಡ್ವೇ ಐಲ್ಯಾಂಡ್"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"ಜಕಾರ್ತಾ"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"ಅಲಾರಾಂಗಳು"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"ಅಧಿಸೂಚನೆಗಳನ್ನು ಚಾಲನೆ ಮಾಡಲು ಸ್ಟಾಪ್ವಾಚ್ ಸೇವೆ."</string>
- <string name="swn_stopped" msgid="783124901663086172">"ನಿಲ್ಲಿಸಲಾಗಿದೆ"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"ಟೈಮರ್ ಅಧಿಸೂಚನೆಗಳಿಂದ ಪ್ರಕ್ರಿಯೆಗಳ ಕ್ರಮಗಳು."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"ಸ್ಟಾಪ್ವಾಚ್ ಅಧಿಸೂಚನೆಗಳಿಂದ ಪ್ರಕ್ರಿಯೆಗಳ ಕ್ರಮಗಳು."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="description_direction_right" msgid="5709209043267548985">"ವಜಾಗೊಳಿಸಲು ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string>
<string name="description_direction_left" msgid="7448141043674998679">"ಸ್ನೂಜ್ ಮಾಡಲು ಎಡಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string>
<string name="description_direction_both" msgid="1841309486023845685">"ಸ್ನೂಜ್ ಮಾಡಲು ಎಡಕ್ಕೆ ಅಥವಾ ವಜಾಗೊಳಿಸಲು ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"ಟೈಮರ್ಗಳು"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"ಟೈಮರ್ ರಿಂಗ್ಟೋನ್"</string>
<string name="timer_stopped" msgid="2730331837832462008">"ಟೈಮರ್ ನಿಂತಿದೆ"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> ಟೈಮರ್ಗಳು ನಿಂತಿವೆ"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"ಟೈಮರ್ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> ಟೈಮರ್ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"ನಿಮ್ಮ ಟೈಮರ್ಗಳನ್ನು ನೋಡಲು ಸ್ಪರ್ಶಿಸಿ"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ಟೈಮರ್ಗಳು"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"ಮುಂದಿನ ಟೈಮರ್: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"ಯಾವುದೇ ಅಲಾರಮ್ಗಳಿಲ್ಲ"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"ಅಲಾ. ಹೊಂದಿಸಿಲ್ಲ"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ಮುಂಬರುವ ಯಾವುದೇ ಅಲಾರಮ್ಗಳಿಲ್ಲ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"ಅಮಾನ್ಯ ಸಮಯ <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g> ಸಮಯಕ್ಕೆ ಯಾವುದೇ ಅಲಾರಮ್ ಇಲ್ಲ:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"ಯಾವುದೇ ನಿಗದಿಪಡಿಸಿದ ಅಲಾರಮ್ಗಳಿಲ್ಲ"</string>
<string name="no_label_specified" msgid="2008482054428460626">"ಯಾವುದೇ ಲೇಬಲ್ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿಲ್ಲ"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"ಯಾವುದೇ ಅಲಾರಮ್ಗಳು ಲೇಬಲ್ ಹೊಂದಿಲ್ಲ"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"ಸ್ಟಾಪ್ವಾಚ್ ಈಗಾಗಲೇ ರನ್ ಆಗುತ್ತಿದೆ"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"ಸ್ಟಾಪ್ವಾಚ್ ರನ್ ಆಗುತ್ತಿಲ್ಲ"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"ಸ್ಟಾಪ್ವಾಚ್ ರನ್ ಆಗುತ್ತಿರುವ ಕಾರಣ ಅದನ್ನು ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"ಸ್ಟಾಪ್ವಾಚ್ ನಿಲ್ಲಿಸಲಾಗಿದೆ"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"ಸ್ಟಾಪ್ವಾಚ್ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"ಸ್ಟಾಪ್ವಾಚ್ ಮರುಹೊಂದಿಸಿ"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"ಸ್ಟಾಪ್ವಾಚ್ ಸ್ವೀಕರಿಸಲಾಗಿದೆ"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"ಸ್ಟಾಪ್ವಾಚ್ ಪ್ರಾರಂಭಿಸಲಾಗಿದೆ"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"ಈ ಸಮಯಕ್ಕೆ ಯಾವುದೇ ಅಲಾರಮ್ ನಿಗದಿಪಡಿಸಲಾಗಿಲ್ಲ"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> ಅಲಾರಮ್ ವಜಾಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g> ಗಂಟೆಗೆ ಅಲಾರಮ್ ಹೊಂದಿಸಲಾಗಿದೆ"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"ಯಾವುದೇ ಟೈಮರ್ ಹೊಂದಿಸಲಾಗಿಲ್ಲ"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"ಟೈಮರ್ ಅಳಿಸಲಾಗಿದೆ"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"ಟೈಮರ್ ಈಗಾಗಲೇ ಚಾಲನೆಯಲ್ಲಿದೆ"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"ನಿಮ್ಮ ವಿನಂತಿಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ, ಅನೇಕ ಟೈಮರ್ಗಳು ಲಭ್ಯ"</string>
- <string name="timer_started" msgid="6715582052946641641">"ಟೈಮರ್ ಪ್ರಾರಂಭಿಸಲಾಗಿದೆ"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"ಯಾವುದೇ ಟೈಮರ್ಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚು ಟೈಮರ್ ಅಸ್ತಿತ್ವದಲ್ಲಿವೆ"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"ಟೈಮರ್ ತೆಗೆದುಹಾಕಲಾಗಿದೆ."</string>
<string name="timer_created" msgid="4381027137335885547">"ಟೈಮರ್ ರಚಿಸಲಾಗಿದೆ"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"ಅಮಾನ್ಯ ಟೈಮರ್ ಉದ್ದ"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"ಟೈಮರ್ ಮರುಹೊಂದಿಸಲಾಗಿದೆ"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"ಟೈಮರ್ ಇನ್ನೂ ಚಾಲನೆಯಲ್ಲಿರುವ ಕಾರಣದಿಂದ ಅದನ್ನು ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಮರುಹೊಂದಿಸಲು ಟೈಮರ್ ನಿಲ್ಲಿಸಿ."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"ಟೈಮರ್ ಈಗಾಗಲೇ ನಿಲ್ಲಿಸಲಾಗಿದೆ"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"ಟೈಮರ್ ಅಳಿಸಲಾಗಿದೆ"</string>
+ <string name="timer_started" msgid="6715582052946641641">"ಟೈಮರ್ ಪ್ರಾರಂಭಿಸಲಾಗಿದೆ"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"ಅಮಾನ್ಯ ಟೈಮರ್ ಉದ್ದ"</string>
<string name="no_city_selected" msgid="1007596865203283741">"ಯಾವುದೇ ನಗರ ಆಯ್ಕೆಮಾಡಲಾಗಿಲ್ಲ"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"ನೀವು ಸೂಚಿಸಿದ ನಗರ ಲಭ್ಯವಿಲ್ಲ"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"ಆ ನಗರವನ್ನು ಈಗಾಗಲೇ ಸೇರಿಸಲಾಗಿದೆ"</string>
diff --git a/res/values-ko/array.xml b/res/values-ko/array.xml
index a0c72f2..d1687ec 100644
--- a/res/values-ko/array.xml
+++ b/res/values-ko/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ㅍ<xliff:g id="SEPARATOR">=</xliff:g>포르탈레자"</item>
<item msgid="5801558418916235541">"ㄱ<xliff:g id="SEPARATOR">=</xliff:g>그랜드터크"</item>
<item msgid="2103759276235503048">"ㄱ<xliff:g id="SEPARATOR">=</xliff:g>그라나다"</item>
- <item msgid="1490069759176391533">"ㄱ<xliff:g id="SEPARATOR">=</xliff:g>과테말라"</item>
+ <item msgid="6216160110733510854">"ㄱ<xliff:g id="SEPARATOR">=</xliff:g>과테말라시티"</item>
<item msgid="525959305652046261">"ㄱ<xliff:g id="SEPARATOR">=</xliff:g>가이아나"</item>
<item msgid="7565596629973190931">"ㅎ<xliff:g id="SEPARATOR">=</xliff:g>핼리팩스"</item>
<item msgid="3811169155065582644">"ㅇ<xliff:g id="SEPARATOR">=</xliff:g>아바나"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ㅌ<xliff:g id="SEPARATOR">=</xliff:g>토론토"</item>
<item msgid="1506838283840737263">"ㅂ<xliff:g id="SEPARATOR">=</xliff:g>밴쿠버"</item>
<item msgid="8935386104773857399">"ㅇ<xliff:g id="SEPARATOR">=</xliff:g>위니펙"</item>
- <item msgid="1132634022412399582">"ㄴ<xliff:g id="SEPARATOR">=</xliff:g>남극"</item>
+ <item msgid="498429228419399474">"ㄴ<xliff:g id="SEPARATOR">=</xliff:g>남극<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ㄹ<xliff:g id="SEPARATOR">=</xliff:g>롱위에아르뷔엔"</item>
<item msgid="3784788073896028355">"ㅇ<xliff:g id="SEPARATOR">=</xliff:g>알마티"</item>
<item msgid="7895695236056852523">"ㅇ<xliff:g id="SEPARATOR">=</xliff:g>암만"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ㄱ<xliff:g id="SEPARATOR">=</xliff:g>가자"</item>
<item msgid="2359068282340162319">"ㅎ<xliff:g id="SEPARATOR">=</xliff:g>헤브론"</item>
<item msgid="6223396610551759129">"ㅎ<xliff:g id="SEPARATOR">=</xliff:g>호치민"</item>
- <item msgid="4731022818651322736">"ㅎ<xliff:g id="SEPARATOR">=</xliff:g>홍콩"</item>
+ <item msgid="3439764751788710130">"ㅎ<xliff:g id="SEPARATOR">=</xliff:g>홍콩<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"ㅇ<xliff:g id="SEPARATOR">=</xliff:g>이스탄불"</item>
<item msgid="758800913783999425">"ㅈ<xliff:g id="SEPARATOR">=</xliff:g>자카르타"</item>
<item msgid="8956406398692698126">"ㅇ<xliff:g id="SEPARATOR">=</xliff:g>예루살렘"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"ㅁ<xliff:g id="SEPARATOR">=</xliff:g>마닐라"</item>
<item msgid="6033964325069060422">"ㅁ<xliff:g id="SEPARATOR">=</xliff:g>무스카트"</item>
<item msgid="6077458941399984780">"ㅍ<xliff:g id="SEPARATOR">=</xliff:g>프놈펜"</item>
- <item msgid="935474308903572975">"ㅍ<xliff:g id="SEPARATOR">=</xliff:g>평양"</item>
+ <item msgid="1245515372520913197">"ㅍ<xliff:g id="SEPARATOR">=</xliff:g>평양<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"ㅋ<xliff:g id="SEPARATOR">=</xliff:g>카타르"</item>
<item msgid="1667243110545095146">"ㄹ<xliff:g id="SEPARATOR">=</xliff:g>랑군"</item>
<item msgid="4460370766685855731">"ㄹ<xliff:g id="SEPARATOR">=</xliff:g>리야드"</item>
<item msgid="4229224905931739201">"ㅅ<xliff:g id="SEPARATOR">=</xliff:g>사이공"</item>
<item msgid="8705359848250215620">"ㅅ<xliff:g id="SEPARATOR">=</xliff:g>서울"</item>
- <item msgid="583367295371395814">"ㅅ<xliff:g id="SEPARATOR">=</xliff:g>상하이"</item>
+ <item msgid="3814881931186962624">"ㅅ<xliff:g id="SEPARATOR">=</xliff:g>상하이<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"ㅅ<xliff:g id="SEPARATOR">=</xliff:g>싱가포르"</item>
- <item msgid="1972491729911039207">"ㅌ<xliff:g id="SEPARATOR">=</xliff:g>타이페이"</item>
+ <item msgid="8982451946156859368">"ㅌ<xliff:g id="SEPARATOR">=</xliff:g>타이페이<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"ㅌ<xliff:g id="SEPARATOR">=</xliff:g>테헤란"</item>
<item msgid="8629402941285674273">"ㅌ<xliff:g id="SEPARATOR">=</xliff:g>텔아비브"</item>
- <item msgid="8499164674454654525">"ㄷ<xliff:g id="SEPARATOR">=</xliff:g>도쿄"</item>
+ <item msgid="76330681636547168">"ㄷ<xliff:g id="SEPARATOR">=</xliff:g>도쿄<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"ㅇ<xliff:g id="SEPARATOR">=</xliff:g>울란바토르"</item>
<item msgid="2028626988021468640">"ㅂ<xliff:g id="SEPARATOR">=</xliff:g>버뮤다"</item>
<item msgid="4527109966513690429">"ㅋ<xliff:g id="SEPARATOR">=</xliff:g>카나리아"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"ㄹ<xliff:g id="SEPARATOR">=</xliff:g>리노"</item>
<item msgid="9155068631060038769">"ㅂ<xliff:g id="SEPARATOR">=</xliff:g>블랙록시티"</item>
<item msgid="8498761319928979900">"ㄷ<xliff:g id="SEPARATOR">=</xliff:g>도하"</item>
- <item msgid="8307897251088048641">"ㅂ<xliff:g id="SEPARATOR">=</xliff:g>베이징"</item>
+ <item msgid="5327010922199714808">"ㅂ<xliff:g id="SEPARATOR">=</xliff:g>베이징<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"ㅁ<xliff:g id="SEPARATOR">=</xliff:g>뭄바이"</item>
<item msgid="6668274273067049125">"ㄷ<xliff:g id="SEPARATOR">=</xliff:g>델리"</item>
- <item msgid="2933410189478233292">"ㅇ<xliff:g id="SEPARATOR">=</xliff:g>오사카"</item>
+ <item msgid="7199039603593847813">"ㅇ<xliff:g id="SEPARATOR">=</xliff:g>오사카<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ㄹ<xliff:g id="SEPARATOR">=</xliff:g>라호르"</item>
<item msgid="1448378291805481500">"ㅅ<xliff:g id="SEPARATOR">=</xliff:g>사나"</item>
<item msgid="5233119846682408301">"ㅂ<xliff:g id="SEPARATOR">=</xliff:g>바르셀로나"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"ㅋ<xliff:g id="SEPARATOR">=</xliff:g>케임브리지"</item>
<item msgid="759409010285366934">"ㅋ<xliff:g id="SEPARATOR">=</xliff:g>커클랜드"</item>
<item msgid="6308007059287569663">"ㅁ<xliff:g id="SEPARATOR">=</xliff:g>매디슨"</item>
- <item msgid="6971636434858330021">"ㄱ<xliff:g id="SEPARATOR">=</xliff:g>광저우"</item>
+ <item msgid="2077617905582224600">"ㄱ<xliff:g id="SEPARATOR">=</xliff:g>광저우<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"ㅎ<xliff:g id="SEPARATOR">=</xliff:g>하이데라바드"</item>
<item msgid="3032295682584784261">"ㄹ<xliff:g id="SEPARATOR">=</xliff:g>레스턴"</item>
<item msgid="7722837296297332268">"ㅂ<xliff:g id="SEPARATOR">=</xliff:g>벨루오리존치"</item>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 738c5ff..f7dc66f 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"시계 표시"</string>
<string name="hide_clock" msgid="3217727306480505694">"시계 숨기기"</string>
<string name="label" msgid="162189613902857319">"라벨"</string>
+ <string name="on_switch" msgid="2297966258029227449">"사용"</string>
+ <string name="off_switch" msgid="3381070073851148013">"사용 안함"</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="6506982899651975645">"알람 벨소리"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"맞춤 벨소리"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"타이머 만료됨"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"무음"</string>
<string name="ringtone" msgid="9110746249688559579">"벨소리"</string>
<string name="time" msgid="8067216534232296518">"시간"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"내일"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g>까지 일시 중지"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"예정된 알람"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"부재중 알람이 삭제되었습니다."</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"1분 미만 남음"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> 남음"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> 남음"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> 남음"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"1분 미만 남음"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> 남음"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"남음"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"남음"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"알람 시간이 지금으로부터 1분 이내입니다."</item>
<item msgid="6002066367368421848">"지금부터 <xliff:g id="DAYS">%1$s</xliff:g> 후로 알람이 설정됩니다."</item>
@@ -101,6 +104,10 @@
<item quantity="other">분</item>
<item quantity="one">분</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"볼륨 점점 크게"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"사용 안함"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g>초"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"초"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"알람 해제 시간"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g>분</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"되돌리기"</string>
<string name="delete" msgid="5732434972457000541">"삭제"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"알람 볼륨"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"무음"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"무음"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"알 수 없음"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"알람을 일시 중지하거나 해제합니다."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g>(알람 일시 중지됨)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"<xliff:g id="TIME">%s</xliff:g> 후로 알람이 설정되었습니다. 취소하려면 터치하세요."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"벨소리 로드 중…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"시계에서 설정한 알람에 대한 사운드 재생 서비스"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"알람 설정"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"알람"</string>
<string name="menu_timer" msgid="6459070074762877114">"타이머"</string>
<string name="menu_clock" msgid="5612760670606829805">"시계"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"이름순 정렬"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"선택된 도시"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"다시 시작"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"시작"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"중지"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"랩 타임"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"초기화"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"시작"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"일시중지"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"랩 타임"</string>
<string name="sw_share_button" msgid="4478648110382859382">"공유"</string>
<string name="hours_label" msgid="3393478155635368097">"시"</string>
<string name="minutes_label" msgid="3568098128251438588">"분"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"내 시간: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"랩 타임:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"랩 타임 <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"<xliff:g id="NUMBER">%d</xliff:g>번"</item>
- <item msgid="316923361931627987">"<xliff:g id="NUMBER">%02d</xliff:g>번"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g>시간</item>
<item quantity="one">1시간</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1분 추가"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1분 추가"</string>
<string name="timer_stop" msgid="3361154678667736722">"중지"</string>
- <string name="timer_done" msgid="2375990511982914051">"완료"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"모든 타이머 정지"</string>
<string name="timer_reset" msgid="7848424809190171640">"초기화"</string>
<string name="timer_cancel" msgid="3572868404230815644">"취소"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"타이머 취소됨"</string>
<string name="timer_times_up" msgid="9190440395938519009">"시간이 다 되었습니다."</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g>개 타이머 만료"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"타이머"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"만들 수 있는 타이머는 최대 4개입니다."</string>
+ <string name="timer_pause" msgid="3748323712728398743">"일시중지"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"모든 타이머 재설정"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"속도광이시군요."</item>
<item msgid="6332879039890727169">"결과를 확인하세요."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"도시"</string>
<string name="clock_settings" msgid="8317286807280600391">"시계"</string>
<string name="clock_style" msgid="2265011060429742344">"종류"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"날짜 및 시간 변경"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"아날로그"</item>
<item msgid="8483930821046925592">"디지털"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> 선택됨"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> 선택 해제됨"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"마샬 제도"</item>
<item msgid="4196408495909011020">"미드웨이 제도"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"자카르타"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"알람"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"스톱워치 서비스로 알림을 실행"</string>
- <string name="swn_stopped" msgid="783124901663086172">"중지됨"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"타이머 알림에서 작업 처리"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"스톱워치 알림에서 작업 처리"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"일시중지됨"</string>
<string name="description_direction_right" msgid="5709209043267548985">"오른쪽으로 스와이프하여 해제"</string>
<string name="description_direction_left" msgid="7448141043674998679">"왼쪽으로 스와이프하여 일시 중지"</string>
<string name="description_direction_both" msgid="1841309486023845685">"왼쪽으로 스와이프하여 일시 중지하거나 오른쪽으로 스와이프하여 해제"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"타이머"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"타이머 벨소리"</string>
<string name="timer_stopped" msgid="2730331837832462008">"타이머가 정지됨"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g>개의 타이머가 정지됨"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"타이머가 일시중지됨"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"타이머 <xliff:g id="NUMBER">%d</xliff:g>개 일시중지됨"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"타이머를 보려면 터치하세요."</string>
<string name="timers_in_use" msgid="5570729467344408506">"타이머 <xliff:g id="NUMBER">%d</xliff:g>개"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"다음 타이머: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"알람 없음"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"설정된 알람 없음"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"예정된 알람 없음"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"a h:mm"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, a h:mm"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"잘못된 시간입니다. <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>에 지정된 알람 없음"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"예약된 알람 없음"</string>
<string name="no_label_specified" msgid="2008482054428460626">"지정된 라벨이 없습니다."</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"라벨이 포함된 알람이 없습니다."</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"스톱워치가 이미 실행 중임"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"스톱워치가 실행되고 있지 않음"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"스톱워치가 실행 중이므로 초기화할 수 없습니다."</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"스톱워치가 중지되었습니다."</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"스톱워치가 일시중지됨"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"스톱워치가 초기화되었습니다."</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"랩타임이 측정되었습니다."</string>
<string name="stopwatch_started" msgid="7843882246387176304">"스톱워치가 시작되었습니다."</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"이 시간에 예약된 알람 없음"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> 알람 제거됨"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"알람 설정 시간: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"설정된 타이머 없음"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"타이머 삭제됨"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"타이머가 이미 실행 중임"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"요청을 완료할 수 없습니다. 사용할 수 있는 타이머가 여러 개입니다."</string>
- <string name="timer_started" msgid="6715582052946641641">"타이머 시작됨"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"타이머가 없음"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"타이머가 2개 이상 있습니다."</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"타이머가 삭제되었습니다."</string>
<string name="timer_created" msgid="4381027137335885547">"타이머가 생성됨"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"타이머 기간이 잘못됨"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"타이머 재설정됨"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"타이머가 실행 중이기 때문에 재설정할 수 없습니다. 재설정하려면 타이머를 중지하세요."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"타이머가 이미 중지됨"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"타이머 삭제됨"</string>
+ <string name="timer_started" msgid="6715582052946641641">"타이머 시작됨"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"타이머 기간이 잘못됨"</string>
<string name="no_city_selected" msgid="1007596865203283741">"선택한 도시 없음"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"사용자가 지정한 도시는 사용할 수 없음"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"이미 추가된 도시임"</string>
diff --git a/res/values-ky-rKG/array.xml b/res/values-ky-rKG/array.xml
index 46b59e8..3b78282 100644
--- a/res/values-ky-rKG/array.xml
+++ b/res/values-ky-rKG/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"Ф<xliff:g id="SEPARATOR">=</xliff:g>Форталеза"</item>
<item msgid="5801558418916235541">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гранд Түрк"</item>
<item msgid="2103759276235503048">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гренада"</item>
- <item msgid="1490069759176391533">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемала"</item>
+ <item msgid="6216160110733510854">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемала шаары"</item>
<item msgid="525959305652046261">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гайана"</item>
<item msgid="7565596629973190931">"Г<xliff:g id="SEPARATOR">=</xliff:g>Галифакс"</item>
<item msgid="3811169155065582644">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гавана"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"Т<xliff:g id="SEPARATOR">=</xliff:g>Торонто"</item>
<item msgid="1506838283840737263">"В<xliff:g id="SEPARATOR">=</xliff:g>Ванкувер"</item>
<item msgid="8935386104773857399">"В<xliff:g id="SEPARATOR">=</xliff:g>Виннипег"</item>
- <item msgid="1132634022412399582">"Т<xliff:g id="SEPARATOR">=</xliff:g>Түштүк уюл"</item>
+ <item msgid="498429228419399474">"Т<xliff:g id="SEPARATOR">=</xliff:g>Түштүк уюл<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"Л<xliff:g id="SEPARATOR">=</xliff:g>Лонгйир"</item>
<item msgid="3784788073896028355">"А<xliff:g id="SEPARATOR">=</xliff:g>Алматы"</item>
<item msgid="7895695236056852523">"А<xliff:g id="SEPARATOR">=</xliff:g>Амман"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"Г<xliff:g id="SEPARATOR">=</xliff:g>Газа"</item>
<item msgid="2359068282340162319">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хеброн"</item>
<item msgid="6223396610551759129">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хошимин"</item>
- <item msgid="4731022818651322736">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гонконг"</item>
+ <item msgid="3439764751788710130">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гонконг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"С<xliff:g id="SEPARATOR">=</xliff:g>Стамбул"</item>
<item msgid="758800913783999425">"Ж<xliff:g id="SEPARATOR">=</xliff:g>Жакарта"</item>
<item msgid="8956406398692698126">"И<xliff:g id="SEPARATOR">=</xliff:g>Иерусалим"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"М<xliff:g id="SEPARATOR">=</xliff:g>Манила"</item>
<item msgid="6033964325069060422">"М<xliff:g id="SEPARATOR">=</xliff:g>Мускат"</item>
<item msgid="6077458941399984780">"П<xliff:g id="SEPARATOR">=</xliff:g>Пномпень"</item>
- <item msgid="935474308903572975">"П<xliff:g id="SEPARATOR">=</xliff:g>Пхеньян"</item>
+ <item msgid="1245515372520913197">"П<xliff:g id="SEPARATOR">=</xliff:g>Пхеньян<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"К<xliff:g id="SEPARATOR">=</xliff:g>Катар"</item>
<item msgid="1667243110545095146">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рангун"</item>
<item msgid="4460370766685855731">"Э<xliff:g id="SEPARATOR">=</xliff:g>Эр-Рияд"</item>
<item msgid="4229224905931739201">"С<xliff:g id="SEPARATOR">=</xliff:g>Сайгон"</item>
<item msgid="8705359848250215620">"С<xliff:g id="SEPARATOR">=</xliff:g>Сеул"</item>
- <item msgid="583367295371395814">"Ш<xliff:g id="SEPARATOR">=</xliff:g>Шанхай"</item>
+ <item msgid="3814881931186962624">"Ш<xliff:g id="SEPARATOR">=</xliff:g>Шанхай<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"С<xliff:g id="SEPARATOR">=</xliff:g>Сингапур"</item>
- <item msgid="1972491729911039207">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тайпей"</item>
+ <item msgid="8982451946156859368">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тайпей<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тегеран"</item>
<item msgid="8629402941285674273">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тель-Авив"</item>
- <item msgid="8499164674454654525">"Т<xliff:g id="SEPARATOR">=</xliff:g>Токио"</item>
+ <item msgid="76330681636547168">"Т<xliff:g id="SEPARATOR">=</xliff:g>Токио<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"У<xliff:g id="SEPARATOR">=</xliff:g>Улан-Батор"</item>
<item msgid="2028626988021468640">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бермуд аралдары"</item>
<item msgid="4527109966513690429">"К<xliff:g id="SEPARATOR">=</xliff:g>Канар"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рено"</item>
<item msgid="9155068631060038769">"Б<xliff:g id="SEPARATOR">=</xliff:g>Блэк-Рок-Сити"</item>
<item msgid="8498761319928979900">"Д<xliff:g id="SEPARATOR">=</xliff:g>Доха"</item>
- <item msgid="8307897251088048641">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бээжин"</item>
+ <item msgid="5327010922199714808">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бээжин<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"М<xliff:g id="SEPARATOR">=</xliff:g>Мумбай"</item>
<item msgid="6668274273067049125">"Д<xliff:g id="SEPARATOR">=</xliff:g>Дели"</item>
- <item msgid="2933410189478233292">"О<xliff:g id="SEPARATOR">=</xliff:g>Осака"</item>
+ <item msgid="7199039603593847813">"О<xliff:g id="SEPARATOR">=</xliff:g>Осака<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"Л<xliff:g id="SEPARATOR">=</xliff:g>Лахор"</item>
<item msgid="1448378291805481500">"С<xliff:g id="SEPARATOR">=</xliff:g>Сана"</item>
<item msgid="5233119846682408301">"Б<xliff:g id="SEPARATOR">=</xliff:g>Барселона"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"К<xliff:g id="SEPARATOR">=</xliff:g>Кембридж"</item>
<item msgid="759409010285366934">"К<xliff:g id="SEPARATOR">=</xliff:g>Киркланд"</item>
<item msgid="6308007059287569663">"М<xliff:g id="SEPARATOR">=</xliff:g>Мэдисон"</item>
- <item msgid="6971636434858330021">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гуанчжоу"</item>
+ <item msgid="2077617905582224600">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гуанчжоу<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хайдарабад"</item>
<item msgid="3032295682584784261">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рестон"</item>
<item msgid="7722837296297332268">"Б<xliff:g id="SEPARATOR">=</xliff:g>Белу-Оризонти"</item>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index c90f334..4dd990b 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Саат көрсөтүү"</string>
<string name="hide_clock" msgid="3217727306480505694">"Саатты жашыр"</string>
<string name="label" msgid="162189613902857319">"Белгиси"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Күйүк"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Өчүк"</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="6506982899651975645">"Ойготкучтун шыңгыры"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Ыңгайлаштырылган рингтон"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Таймердин мөөнөтү бүттү"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Үнсүз"</string>
<string name="ringtone" msgid="9110746249688559579">"Шыңгыр"</string>
<string name="time" msgid="8067216534232296518">"Убакыт"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Эртең"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> чейин тындыруу"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Келээрки ойготкуч"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Көз жаздымда калган ойготкучуңуз жок кылынды"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Бир мүнөткө жетпеген убакыт калды"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> саат калды"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> мүнөт калды"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> саат <xliff:g id="MINUTES">%2$s</xliff:g> мүнөт калды"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Бир мүнөткө жетпеген убакыт калды"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> саат <xliff:g id="MINUTES">%2$s</xliff:g> мүнөт калды"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"калды"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"калды"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Ойготкуч 1 мүнөткө жетпеген убакытка коюлуп жатат."</item>
<item msgid="6002066367368421848">"Ойготкуч <xliff:g id="DAYS">%1$s</xliff:g> күнгө коюлган."</item>
@@ -101,6 +104,10 @@
<item quantity="other">мүнөт</item>
<item quantity="one">мүнөт</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Акырындык менен катуулатуу"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Өчүк"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> секунд"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"секунд"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Төмөнкүдөн кийин үнүн басып коюу"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> мүнөт</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Мурунку абалга кайтаруу"</string>
<string name="delete" msgid="5732434972457000541">"Жок кылуу"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Ойготкучтун үнүнүн катуулугу"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Үнсүз"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Үнсүз"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Белгисиз"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Ойготкучту тындыруу же этибарга албоо."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (тындырылды)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Ойготкуч саат <xliff:g id="TIME">%s</xliff:g> коюлган. Жокко чыгаруу үчүн тийип коюңуз."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Шыңгыр жүктөлүүдө…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Сааттагы таймерлерге үн коюу кызматы."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Ойготкуч коюу"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Ойготкуч"</string>
<string name="menu_timer" msgid="6459070074762877114">"Таймер"</string>
<string name="menu_clock" msgid="5612760670606829805">"Саат"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Аталышы боюнча иргөө"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Тандалган шаарлар"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Улантуу"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Баштоо"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Токтотуу"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Жүгүртүм"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Баштапкы абалга келтирүү"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Баштоо"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Жүгүртүм"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Бөлүшүү"</string>
<string name="hours_label" msgid="3393478155635368097">"с"</string>
<string name="minutes_label" msgid="3568098128251438588">"м"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Менин убакытым <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Жүгүртүм убакыттары:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Жүгүртүм <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"#<xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"#<xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> саат</item>
<item quantity="one">1 саат</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 мүнөт кошуу"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 мүн кошуу"</string>
<string name="timer_stop" msgid="3361154678667736722">"Токтотуу"</string>
- <string name="timer_done" msgid="2375990511982914051">"Аткарылды"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Бардык таймрлрди токтотуу"</string>
<string name="timer_reset" msgid="7848424809190171640">"Баштапкы абалга келтирүү"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Жокко чыгаруу"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Таймер жокко чыгарылды"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Бүттү"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> таймердин мөөнөтү бүттү"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Таймер"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Эң көп 4 таймер"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Тындыруу"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Бардык таймерлерди баштапкы абалга келтирүү"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Чагылгандай тездик менен кыймылдайсыз го?!"</item>
<item msgid="6332879039890727169">"Эмгегиңиздин акыбетин көрүңүз."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Шаарлар"</string>
<string name="clock_settings" msgid="8317286807280600391">"Саат"</string>
<string name="clock_style" msgid="2265011060429742344">"Стиль"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Датаны & убакытты өзгөртүү"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Аналог"</item>
<item msgid="8483930821046925592">"Санариптик"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> белгиленди"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> белгиленген жок"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Маршал аралдары"</item>
<item msgid="4196408495909011020">"Мидуэй аралы"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Жакарта"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Ойготкучтар"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Эскертмени иштетүүчү секунда өлчөгүч кызматы."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Токтотулду"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Таймер эскертмелериндеги аракеттерди иштетет."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Секундомер эскертмелериндеги аракеттерди иштетет."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Тындырылды"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Өткөрүп салуу үчүн оңго сүрүңүз"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Тындыруу үчүн солго сүрүңүз."</string>
<string name="description_direction_both" msgid="1841309486023845685">"Тындыруу үчүн солго же этибарга албоо үчүн оңго серпиңиз"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Таймерлер"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Таймердин рингтону"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Таймер токтотулду"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> таймер токтоду"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Таймер тындырылды"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> таймерлер тындырылды"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Таймерлериңизди көрүү үчүн тийип коюңуз"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> таймер"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Кийинки таймер: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Ойготкуч жок"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Ойготкучтар коюлган жок"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"АЛДЫДА ОЙГОТКУЧ ЖОК"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"с:мм"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"к:мм"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, с:мм"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, к:мм"</string>
<string name="invalid_time" msgid="2782334750243998633">"Жараксыз убакыт <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Саат <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> коюлган ойготкуч жок"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Коюлган ойготкучтар жок"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Эч энбелги көрсөтүлгөн жок"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Эч бир ойготкучта энбелги жок"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Секундомер мурунтан эле иштеп жатат"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Секундомер иштеген жок"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Секунд эсептегич иштеп жаткандыктан, аны баштапкы абалга келтирүү мүмкүн эмес"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Секунд эсептегич токтотулду"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Секунд ченегич тындырылды"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Секунд эсептегич баштапкы абалга келтирилди"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Секунд эсептегичте бир айлана кошулду"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Секунд эсептегич башталды"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Бул убакытка коюлган ойготкуч жок"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Саат <xliff:g id="ALARM_TIME">%s</xliff:g> коюлган ойготкуч өчүрүлдү"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Ойготкуч саат <xliff:g id="ALARM_TIME">%s</xliff:g> коюлган"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Коюлган таймер жок"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Таймер жок кылынды"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Таймер мурунтан эле иштеп жатат"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Өтүнүчүңүз аткарылбай койду, бир нече таймер бар"</string>
- <string name="timer_started" msgid="6715582052946641641">"Таймер башталды"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Таймерлер жок"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Бирден ашык таймер бар"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Таймер алынып салынды."</string>
<string name="timer_created" msgid="4381027137335885547">"Таймер түзүлдү"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Таймердин узактыгы жараксыз"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Таймер баштапкы абалга келтирилди"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Таймер дагы эле иштеп жаткандыктан, ал баштапкы абалга келтирилбейт. Баштапкы абалга келтирүү үчүн таймерди токтотуңуз."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Таймер мурунтан эле токтогон"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Таймер жок кылынды"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Таймер башталды"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Таймердин узактыгы жараксыз"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Эч шаар тандалган жок"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Сиз көрсөткөн шаар жеткиликтүү эмес"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Мындай шаар мурунтан эле кошулган"</string>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 2d22f32..b68e145 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -19,7 +19,7 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+<resources>
<dimen name="time_text_size">153dip</dimen>
<dimen name="ampm_text_size">32dip</dimen>
<dimen name="date_text_size">15sp</dimen>
@@ -29,7 +29,6 @@
<dimen name="dialpad_font_size">24sp</dimen>
<dimen name="dialpad_digit_padding">14dip</dimen>
- <dimen name="timer_setup_font_size">48sp</dimen>
<dimen name="timer_setup_delete_start_margin">24sp</dimen>
<dimen name="timer_setup_label_size">16sp</dimen>
@@ -38,7 +37,6 @@
<!-- Size of margin for circles. -->
<dimen name="circle_margin">8dp</dimen>
<dimen name="analog_clock_margin">70dp</dimen>
- <dimen name="timer_circle_margin">8dp</dimen>
<dimen name="main_clock_padding">0dp</dimen>
<dimen name="circle_margin_top">0dp</dimen>
<dimen name="top_text_spacing_digital">-25dp</dimen>
@@ -52,7 +50,6 @@
<dimen name="medium_font_size">48sp</dimen>
<dimen name="circle_size">190dip</dimen>
- <dimen name="stopwatch_list_bottom_spacing">0dip</dimen>
<dimen name="stopwatch_circle_margin_bottom">80dip</dimen>
<dimen name="world_clock_margin">8dp</dimen>
diff --git a/res/values-lo-rLA/array.xml b/res/values-lo-rLA/array.xml
index f6c7334..70b83fe 100644
--- a/res/values-lo-rLA/array.xml
+++ b/res/values-lo-rLA/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>ຟໍຕາເຣຊາ"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>ແກຣນເຕີກ"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>ກຣີນາດາ"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>ກົວເຕມາລາ"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>ເມືອງກົວເຕມາລາ"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>ກາຍອານາ"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>ຮາລິເຟັກ"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>ຮາວານາ"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>ໂຕຣອນໂຕ"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>ແວນຄູເວີ"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>ວິນນິເປັກ"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>ເຊົາໂປເລ"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>ເຊົາໂປເລ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>ລອງເຢຍບີນ"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>ອາລມາຕີ"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>ອຳມັນ"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>ກາຊ່າ"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>ຮີບຣອນ"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>ໂຮ່ຈິມິນ"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>ຮ່ອງກົງ"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>ຮ່ອງກົງ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>ອິດສະຕານບູນ"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>ຈາກາຕ້າ"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>ເຢຣູຊາເລັມ"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>ມະນີລາ"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>ມຸສກັດ"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>ພະນົມເປັນ"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>ພຽງຢາງ"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>ພຽງຢາງ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>ກາຕ້າ"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>ຢ້າງກຸ້ງ"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>ຣິຢາດ"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>ໄຊງ່ອນ"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>ໂຊລ"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>ຊຽງໄຮ"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>ຊຽງໄຮ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>ສິງກະໂປ"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>ໄທເປ"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>ໄທເປ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>ເຕຮາຣານ"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>ເທວອາວິບ"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>ໂຕກຽວ"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>ໂຕກຽວ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>ອູລານບາຕໍ"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>ເບີມິວດາ"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>ຄານາຣີ"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>ເຣໂນ"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>ແບລັກຣັອກຊິຕີ"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>ໂດຮາ"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>ປັກກິ່ງ"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>ປັກກິ່ງ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>ມູມໄບ"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>ເດລິ"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>ໂອຊາກະ"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>ໂອຊາກະ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>ລາຮໍ"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>ຊານາອາ"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>ບາເຊໂລນາ"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>ແຄມບຣິດຈ໌"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>ເກີກແລນ"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>ມາດິສັນ"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>ກວາງໂຈ"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>ກວາງໂຈ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>ໄຮເດີຣາບັດ"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>ເຣັສຕອນ"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>ເບໂຣຮໍຣິຊອນ"</item>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index f446e17..78ea399 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"ສະແດງໂມງ"</string>
<string name="hide_clock" msgid="3217727306480505694">"ເຊື່ອງໂມງ"</string>
<string name="label" msgid="162189613902857319">"ປ້າຍກຳກັບ"</string>
+ <string name="on_switch" msgid="2297966258029227449">"ເປີດ"</string>
+ <string name="off_switch" msgid="3381070073851148013">"ປິດ"</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="6506982899651975645">"ສຽງໂມງປຸກ"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"ສຽງໂທເຂົ້າແບບກຳນົດເອງ"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"ເຄື່ອງຈັບເວລາໝົດອາຍຸແລ້ວ"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"ປິດສຽງ"</string>
<string name="ringtone" msgid="9110746249688559579">"ສຽງໂມງປຸກ"</string>
<string name="time" msgid="8067216534232296518">"ເວລາ"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"ມື້ອື່ນ"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"ປິດສຽງເຕືອນຊົ່ວຄາວຈົນກວ່າຈະຮອດ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"ໂມງປຸກຖັດໄປ"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"ການຕັ້ງໂມງປຸກທີ່ພາດໄປນັ້ນຖືກລຶບແລ້ວ"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"ເຫຼືອໜ້ອຍກວ່າ 1 ນາທີ"</item>
- <item msgid="83197792732433351">"ຍັງເຫຼືອ <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"ຍັງເຫຼືອ <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"ຍັງເຫຼືອ <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"ຍັງເຫຼືອໜ້ອຍກວ່າ 1 ນາທີ"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"ຍັງເຫຼືອ <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"ຍັງເຫຼືອ"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"ຍັງເຫຼືອ"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"ໂມງປຸກຖືກຕັ້ງໄວ້ໜ້ອຍກວ່າ 1 ນາທີຫ່າງຈາກຕອນນີ້."</item>
<item msgid="6002066367368421848">"ໂມງປຸກຕັ້ງໄວ້ <xliff:g id="DAYS">%1$s</xliff:g> ຈາກຕອນນີ້."</item>
@@ -101,6 +104,10 @@
<item quantity="other">ນາທີ</item>
<item quantity="one">ນາທີ</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"ຄ່ອຍໆເພີ່ມລະດັບສຽງ"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"ປິດ"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> ວິນາທີ"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"ວິນາທີ"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"ປິດສຽງຫຼັງຈາກ"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> ນາທີ</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"ປ່ຽນກັບ"</string>
<string name="delete" msgid="5732434972457000541">"ລຶບ"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"ລະດັບສຽງໂມງປຸກ"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"ງຽບ"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"ປິດສຽງ"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"ບໍ່ຮູ້ຈັກ"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"ປິດສຽງເຕືອນຊົ່ວຄາວ ຫຼືປິດໂມງປຸກ."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ຖືກປິດສຽງເຕືອນຊົ່ວຄາວ)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"ໂມງປຸກຖືກຕັ້ງໄວ້ທີ່ <xliff:g id="TIME">%s</xliff:g>. ແຕະເພື່ອຍົກເລີກ."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"ກຳລັງໂຫລດສຽງປຸກ..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"ບໍລິການຫຼິ້ນສຽງສຳລັບໂມງນັບຖອຍຫຼັງ ທີ່ຕັ້ງຢູ່ໃນໂປຣແກຣມໂມງ."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"ຕັ້ງໂມງປຸກ"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"ໂມງປຸກ"</string>
<string name="menu_timer" msgid="6459070074762877114">"ໂມງນັບຖອຍຫຼັງ"</string>
<string name="menu_clock" msgid="5612760670606829805">"ໂມງ"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"ຮຽງຕາມຊື່"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"ເມືອງທີ່ເລືອກແລ້ວ"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"ສືບຕໍ່"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"ເລີ່ມ"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"ຢຸດ"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ຮອບ"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"ນັບໃໝ່"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"ເລີ່ມ"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"ຮອບ"</string>
<string name="sw_share_button" msgid="4478648110382859382">"ແບ່ງປັນ"</string>
<string name="hours_label" msgid="3393478155635368097">"ຊ"</string>
<string name="minutes_label" msgid="3568098128251438588">"ນ"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"ເວລາຂອງຂ້ອຍແມ່ນ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"ເວລາຮອບ:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"ຮອບ <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ຊົ່ວໂມງ</item>
<item quantity="one">1 ຊົ່ວໂມງ</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"ເພີ່ມ 1 ນາທີ"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"ເພີ່ມ 1 ນາທີ"</string>
<string name="timer_stop" msgid="3361154678667736722">"ຢຸດ"</string>
- <string name="timer_done" msgid="2375990511982914051">"ແລ້ວໆ"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"ຢຸດທຸກເວລາ"</string>
<string name="timer_reset" msgid="7848424809190171640">"ນັບໃໝ່"</string>
<string name="timer_cancel" msgid="3572868404230815644">"ຍົກເລີກ"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"ຍົກເລີກການຈັບເວລາແລ້ວ"</string>
<string name="timer_times_up" msgid="9190440395938519009">"ໝົດເວລາ"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ໂມງຈັບເວລາໝົດອາຍຸແລ້ວ"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"ໂມງນັບຖອຍຫລັງ"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"ໂຕຈັບເວລາສູງສຸດ 4 ອັນ"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"ຢຸດຊົ່ວຄາວ"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"ຕັ້ງເຄື່ອງຈັບເວລາທັງໝົດໃໝ່"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"ທ່ານໄວປານຜີພຸ້ນນໍ້."</item>
<item msgid="6332879039890727169">"ຂໍໃຫ້ມີຄວາມສຸກກັບໝາກຜົນຈາກເຫື່ອແຮງຂອງທ່ານ."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"ເມືອງ"</string>
<string name="clock_settings" msgid="8317286807280600391">"ໂມງ"</string>
<string name="clock_style" msgid="2265011060429742344">"ຮູບແບບ"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"ປ່ຽນແປງວັນທີ ແລະ ເວລາ"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"ໂມງເຂັມ"</item>
<item msgid="8483930821046925592">"ດິຈິຕອນ"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ໄດ້ຮັບການໝາຍຕິກແລ້ວ"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> ບໍ່ໄດ້ໝາຍຕິກ"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"ໝູ່ເກາະມາແຊວ"</item>
<item msgid="4196408495909011020">"ເກາະມິດເວ"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"ຈາກາຕາ"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"ໂມງປຸກ"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"ບໍລິການຂອງໂມງຈັບເວລາ ເພື່ອສະແດງໃນການແຈ້ງເຕືອນ."</string>
- <string name="swn_stopped" msgid="783124901663086172">"ຢຸດແລ້ວ"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"ປະມວນຜົນຄຳສັ່ງຕ່າງໆ ຈາກການແຈ້ງເຕືອນຕົວຈັບເວລາ."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"ປະມວນຜົນຄຳສັ່ງຕ່າງໆ ຈາກການແຈ້ງເຕືອນໂມງຈັບເວລາ."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"ຢຸດແລ້ວ"</string>
<string name="description_direction_right" msgid="5709209043267548985">"ປັດໄປຂວາເພື່ອປິດໄວ້"</string>
<string name="description_direction_left" msgid="7448141043674998679">"ປັດໄປຊ້າຍເພື່ອເລື່ອນອອກໄປກ່ອນ"</string>
<string name="description_direction_both" msgid="1841309486023845685">"ປັດໄປທາງຊ້າຍເພື່ອເລື່ອນ ຫຼືທາງຂວາ ເພື່ອປິດໄວ້"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"ໂມງຈັບເວລາ"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"ສຽງເຕືອນໂມງຈັບເວລາ"</string>
<string name="timer_stopped" msgid="2730331837832462008">"ຢຸດນັບຖອຍຫຼັງແລ້ວ"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> ໂມງນັບຖອຍຫຼັງຢຸດແລ້ວ"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"ເຄື່ອງຈັບເວລາຢຸດແລ້ວ"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> ເຄື່ອງຈັບເວລາຢຸດແລ້ວ"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"ແຕະເພື່ອເບິ່ງໂຕຈັບເວລາຂອງທ່ານ"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ໂມງນັບຖອຍຫຼັງ"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"ໂມງຈັບເວລາຄັ້ງຕໍ່ໄປ: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"ບໍ່ມີການຕັ້ງໂມງປຸກ"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"ບໍ່ໄດ້ຕັ້ງໂມງປຸກ"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ບໍ່ມີການຕັ້ງໂມງປຸກແລ້ວ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"ຊມ:ນທ a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"ວວວ, ຊມ:ນທ a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"ວວວ, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"ເວລາໃຊ້ບໍ່ໄດ້ <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"ບໍ່ມີໂມງປຸກຕັ້ງໄວ້ໃນເວລາ <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"ບໍ່ມີການເຕືອນກຳນົດໄວ້"</string>
<string name="no_label_specified" msgid="2008482054428460626">"ບໍ່ມີປ້າຍໝາຍລະບຸໄວ້"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"ບໍ່ມີໂມງປຸກຢູ່ໃນປ້າຍໝາຍ"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"ໂມງຈັບເວລາແລ່ນຢູ່ແລ້ວ"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"ໂມງຈັບເວລາບໍ່ແລ່ນຢູ່"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"ບໍ່ສາມາດຕັ້ງໂມງຈັບເວລາໄດ້ ເພາະວ່າມັນກຳລັງແລ່ນ"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"ໂມງຈັບເວລາຢຸດແລ້ວ"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"ໂມງຈັບເວລາຢຸດແລ້ວ"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"ຕັ້ງໂມງຈັບເວລາຄືນໃໝ່ແລ້ວ"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"ໂມງຈັບເວລາຮອບແລ້ວ"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"ໂມງຈັບເວລາເລີ່ມຕົ້ນແລ້ວ"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"ບໍ່ມີໂມງປຸກກຳນົດເວລາໃຫ້ກັບເວລານີ້"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> ໂມງປຸກຖືກປິດໄວ້ແລ້ວ"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"ໂມງປຸກຖືກຕັ້ງໃນເວລາ <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"ບໍ່ມີການຈັບເວລາກຳນົດໄວ້"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"ລຶບເຄື່ອງຈັບເວລາແລ້ວ"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"ເຄື່ອງຈັບເວລາແລ່ນຢູ່ແລ້ວ"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"ບໍ່ສາມາດດຳເນີນການຂໍຂອງທ່ານໃຫ້ສຳເລັດໄດ້, ມີການຈັບເວລາຫຼາຍອັນຢູ່ໃຫ້"</string>
- <string name="timer_started" msgid="6715582052946641641">"ເລີ່ມການຈັບເວລາແລ້ວ"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"ບໍ່ມີເຄື່ອງຈັບເວລາຢູ່"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"ມີຕົວຈັບເວລາຢູ່ຫຼາຍກ່ວາໜຶ່ງອັນ"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"ຕົວຈັບເວລາຖືກເອົາອອກແລ້ວ."</string>
<string name="timer_created" msgid="4381027137335885547">"ສ້າງການຕັ້ງເວລາແລ້ວ"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"ຄວາມຍາວການຕັ້ງເວລາບໍ່ຖືກຕ້ອງ"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"ການຈັດເວລາຕັ້ງຄ່າຄືນໃໝ່ແລ້ວ"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"ບໍ່ສາມາຕັ້ງຄ່າການຈັບເວລາຄືນໃໝ່ໄດ້ ເພາະວ່າມັນກຳລັງແລ່ນຢູ່. ຢຸດການຈັບເວລາ ເພື່ອຕັ້ງຄືນໃໝ່."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"ເຄື່ອງຈັບເວລາຢຸດແລ້ວ"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"ລຶບເຄື່ອງຈັບເວລາແລ້ວ"</string>
+ <string name="timer_started" msgid="6715582052946641641">"ເລີ່ມການຈັບເວລາແລ້ວ"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"ຄວາມຍາວການຕັ້ງເວລາບໍ່ຖືກຕ້ອງ"</string>
<string name="no_city_selected" msgid="1007596865203283741">"ບໍ່ມີເມືອງຖືກເລືອກໄວ້"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"ບໍ່ມີເມືອງທີ່ທ່ານລະບຸນັ້ນຢູ່"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"ເພີ່ມເມືອງນັ້ນໃສ່ຮຽບຮ້ອຍແລ້ວ"</string>
diff --git a/res/values-lt/array.xml b/res/values-lt/array.xml
index 9b834e4..0c89f00 100644
--- a/res/values-lt/array.xml
+++ b/res/values-lt/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Terkas"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Gvatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Gvatemalos miestas"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Gajana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifaksas"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Torontas"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vankuveris"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Vinipegas"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Pietų ašigalis"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Pietų ašigalis<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longjyrbienas"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almata"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amanas"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebronas"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Či Minis"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Honkongas"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Honkongas<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Stambulas"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Džakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jeruzalė"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Maskatas"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Pnom Penis"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pchenjanas"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pchenjanas<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Kataras"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Jangonas"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Rijadas"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigonas"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seulas"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Šanchajus"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Šanchajus<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapūras"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taibėjus"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taibėjus<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheranas"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Avivas"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokijas"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokijas<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulan Batoras"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Kanarų salos"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Rinas"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Miestas Juodųjų Uolų dykumoje"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Pekinas"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Pekinas<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbajus"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delis"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahoras"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sana"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barselona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Keimbridžas"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kerklandas"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madisonas"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangdžou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangdžou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Haidarabadas"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Restonas"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Orizontė"</item>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 84e818c..7c6af3a 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Rodyti laikrodį"</string>
<string name="hide_clock" msgid="3217727306480505694">"Slėpti laikrodį"</string>
<string name="label" msgid="162189613902857319">"Etiketė"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Įjungta"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Išjungta"</string>
<string name="default_label" msgid="5590025289805630372">"Signalas"</string>
<string name="set_alarm" msgid="9148359866152726808">"Nustatyti signalą"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibruoti"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Kartoti"</string>
<string name="alert" msgid="6506982899651975645">"Signalo skambėjimo tonas"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Tinkintas skambėjimo tonas"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Baigėsi laikmačio galiojimas"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Begarsis"</string>
<string name="ringtone" msgid="9110746249688559579">"Skambėjimo tonas"</string>
<string name="time" msgid="8067216534232296518">"Laikas"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Rytoj"</string>
@@ -62,12 +65,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Snaudžiama iki <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Artimiausias signalas"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Praleistas signalas buvo ištrintas"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Liko mažiau nei minutė"</item>
- <item msgid="83197792732433351">"Liko <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Liko <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Liko <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Liko mažiau nei minutė"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Liko <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"Liko"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"Liko"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Signalas nustatytas skambėti po mažiau nei 1 min. nuo dabar."</item>
<item msgid="6002066367368421848">"Signalas nustatytas skambėti po <xliff:g id="DAYS">%1$s</xliff:g> nuo dabar."</item>
@@ -115,6 +118,10 @@
<item quantity="many">minutės</item>
<item quantity="other">minučių</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Tolygiai didinti garsumą"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Išjungta"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> sek."</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sek."</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Nutildyti po"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutė</item>
@@ -142,7 +149,8 @@
<string name="revert" msgid="9100911171235162926">"Grąžinti"</string>
<string name="delete" msgid="5732434972457000541">"Ištrinti"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Signalo garsumas"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Tylus"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Begarsis"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Nežinomas"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Snausti arba atmesti signalą."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (snaudė)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Signalas nustatytas skambėti <xliff:g id="TIME">%s</xliff:g>. Jei norite atšaukti, palieskite."</string>
@@ -167,8 +175,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Įkeliamas skambėjimo tonas..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Garso atkūrimo paslauga, skirta laikrodžio nustatytiems laikmačiams."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Nustatyti signalą"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Signalas"</string>
<string name="menu_timer" msgid="6459070074762877114">"Laikmatis"</string>
<string name="menu_clock" msgid="5612760670606829805">"Laikrodis"</string>
@@ -183,10 +189,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Rūšiuoti pagal pavadinimą"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Pasirinkti miestai"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Atnaujinti"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Pradėti"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stabdyti"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Ratas"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Nustatyti iš naujo"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Pradėti"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pristabdyti"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Ratas"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Bendrinti"</string>
<string name="hours_label" msgid="3393478155635368097">"val."</string>
<string name="minutes_label" msgid="3568098128251438588">"min."</string>
@@ -198,10 +204,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Mano laikas yra <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Persidengiantis laikas:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g> ratas"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Nr. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Nr. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> valanda</item>
<item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> valandos</item>
@@ -227,12 +229,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Pridėti 1 minutę"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Pridėti 1 min."</string>
<string name="timer_stop" msgid="3361154678667736722">"Stabdyti"</string>
- <string name="timer_done" msgid="2375990511982914051">"Atlikta"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Sustabdyti visus laikmač."</string>
<string name="timer_reset" msgid="7848424809190171640">"Nustatyti iš naujo"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Atšaukti"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Laikmatis atšauktas"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Laikas baigėsi"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Baig. <xliff:g id="NUM_TIMERS">%d</xliff:g> laikm. galioj. l."</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Laikmatis"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Daugiausia 4 laikmačiai"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pristabdyti"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Iš n. nust. vis. laikm."</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Pasiekėte ganėtinai didelį greitį."</item>
<item msgid="6332879039890727169">"Mėgaukitės darbo vaisiais."</item>
@@ -249,6 +255,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Miestai"</string>
<string name="clock_settings" msgid="8317286807280600391">"Laikrodis"</string>
<string name="clock_style" msgid="2265011060429742344">"Stilius"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Pakeisti datą ir laiką"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analoginis"</item>
<item msgid="8483930821046925592">"Skaitmeninis"</item>
@@ -263,6 +270,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"–"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> (pažymėta)"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> (nepažymėta)"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Maršalo Salos"</item>
<item msgid="4196408495909011020">"Midvėjaus Sala"</item>
@@ -351,13 +360,17 @@
<item msgid="5176858645450908751">"Džakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Signalai"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Chronometro paslauga, skirta pranešimui paleisti."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Sustabdyta"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Apdoroja veiksmus iš laikmačio pranešimų."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Apdoroja veiksmus iš chronometro pranešimų."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Pristabdyta"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Perbraukite į dešinę, kad atmestumėte"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Perbraukite į kairę, kad nustatytumėte snaudimą"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Perbraukite į kairę, kad nustatytumėte snaudimą, arba į dešinę, kad atsisakytumėte"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Laikmačiai"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Laikmačio skambėjimo tonas"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Laikmatis sustabdytas"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Sustabdytų laikmačių: <xliff:g id="NUMBER">%d</xliff:g>"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Laikmatis pristabdytas"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Pristabdytų laikmačių: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Palieskite, jei norite peržiūrėti laikmačius"</string>
<string name="timers_in_use" msgid="5570729467344408506">"Laikmačių: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Kitas laikmatis: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -385,35 +398,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Signalų nėra"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Signalų nenust."</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NĖRA BŪSIMŲ SIGNALŲ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Netinkamas laikas <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Nėra signalo <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Nėra suplanuotų signalų"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nenurodyta jokių etikečių"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Nėra jokių signalų su etikete"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Chronometras jau veikia"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Chronometras neveikia"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Negalima iš naujo nustatyti chronometro, nes jis veikia"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Chronometras sustabdytas"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Chronometras pristabdytas"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Chronometras nustatytas iš naujo"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Nustatytas chronometro etapas"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Chronometras paleistas"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Šiuo laiku nėra nesuplanuoto signalo"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> signalo atsisakyta"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Signalas nustatytas <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Laikmatis nenustatytas"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Laikmatis ištrintas"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Laikmatis jau veikia"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Nepavyko įvykdyti užklausos, galimi keli laikmačiai"</string>
- <string name="timer_started" msgid="6715582052946641641">"Laikmatis paleistas"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Nėra laikmačių"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Yra keli laikmačiai"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Laikmatis pašalintas."</string>
<string name="timer_created" msgid="4381027137335885547">"Laikmatis sukurtas"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Netinkama laikmačio trukmė"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Laikmatis nustatytas iš naujo"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Negalima iš naujo nustatyti laikmačio, nes jis dar veikia. Sustabdykite laikmatį, kad nustatytumėte iš naujo."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Laikmatis jau sustabdytas"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Laikmatis ištrintas"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Laikmatis paleistas"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Netinkama laikmačio trukmė"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Nepasirinktas joks miestas"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Nurodytas miestas nepasiekiamas"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Šis miestas jau pridėtas"</string>
diff --git a/res/values-lv/array.xml b/res/values-lv/array.xml
index 3d1f93d..99d75ab 100644
--- a/res/values-lv/array.xml
+++ b/res/values-lv/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grandtkērka"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenāda"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Gvatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Gvatemala"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Gajāna"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Helifeksa"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vankūvera"</item>
<item msgid="8935386104773857399">"V<xliff:g id="SEPARATOR">=</xliff:g>Vinipega"</item>
- <item msgid="1132634022412399582">"D<xliff:g id="SEPARATOR">=</xliff:g>Dienvidpols"</item>
+ <item msgid="498429228419399474">"D<xliff:g id="SEPARATOR">=</xliff:g>Dienvidpols<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longjērbīene"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almati"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Ammāna"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hībrona"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Hošimina"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Honkonga"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Honkonga<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"S<xliff:g id="SEPARATOR">=</xliff:g>Stambula"</item>
<item msgid="758800913783999425">"D<xliff:g id="SEPARATOR">=</xliff:g>Džakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jeruzaleme"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Maskata"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Pnompeņa"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Phenjana"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Phenjana<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"K<xliff:g id="SEPARATOR">=</xliff:g>Katara"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangūna"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Rijāda"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigona"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seula"</item>
- <item msgid="583367295371395814">"Š<xliff:g id="SEPARATOR">=</xliff:g>Šanhaja"</item>
+ <item msgid="3814881931186962624">"Š<xliff:g id="SEPARATOR">=</xliff:g>Šanhaja<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapūra"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipeja"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipeja<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teherāna"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Telaviva"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokija"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokija<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulanbatora"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanāriju salas"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Rīno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Blekroka"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Pekina"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Pekina<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbaja"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Deli"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahora"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barselona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"K<xliff:g id="SEPARATOR">=</xliff:g>Kembridža"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kērklenda"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Medisona"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangžou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangžou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Haidarabada"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Restona"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Orizonte"</item>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 5deef86..eb13ed5 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Rādīt pulksteni"</string>
<string name="hide_clock" msgid="3217727306480505694">"Slēpt pulksteni"</string>
<string name="label" msgid="162189613902857319">"Iezīme"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Ieslēgts"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Izslēgts"</string>
<string name="default_label" msgid="5590025289805630372">"Signāls"</string>
<string name="set_alarm" msgid="9148359866152726808">"Iestatīt signālu"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrozvans"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Atkārtošana"</string>
<string name="alert" msgid="6506982899651975645">"Modinātāja signāls"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Pielāgots zvana signāls"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Taimera laiks ir beidzies"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Klusums"</string>
<string name="ringtone" msgid="9110746249688559579">"Zvana signāls"</string>
<string name="time" msgid="8067216534232296518">"Laiks"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Rīt"</string>
@@ -60,12 +63,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Atlikts līdz: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Gaidāms signāls"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Jūsu nokavētais signāls ir dzēsts."</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Atlikušais laiks: mazāk par minūti"</item>
- <item msgid="83197792732433351">"Atlikušais laiks: <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Atlikušais laiks: <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Atlikušais laiks: <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Atlikušais laiks: mazāk par minūti"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Atlikušais laiks: <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"atlikusi"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"atlikušas"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Signāls iestatīts uz tālāk norādīto laiku kopš šī brīža: mazāk nekā 1 minūte."</item>
<item msgid="6002066367368421848">"Signāls iestatīts uz tālāk norādīto laiku kopš šī brīža: <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -108,6 +111,10 @@
<item quantity="one">minūte</item>
<item quantity="other">minūtes</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Pakāpeniski palielināt skaļumu"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Izslēgts"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> sekundes"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sekundes"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Izslēgt skaņu pēc:"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="zero"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minūtes</item>
@@ -134,7 +141,8 @@
<string name="revert" msgid="9100911171235162926">"Atjaunot"</string>
<string name="delete" msgid="5732434972457000541">"Dzēst"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Signāla skaļums"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Klusums"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Klusums"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Nezināms"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Atlieciet vai noraidiet signālu."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (atlikts)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Signāls iestatīts uz: <xliff:g id="TIME">%s</xliff:g>. Pieskarieties, lai atceltu."</string>
@@ -159,8 +167,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Notiek zvana signāla ielāde…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Skaņas atskaņošanas pakalpojums lietotnē Pulkstenis iestatītajiem taimeriem."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Iestatīt signālu"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Signāls"</string>
<string name="menu_timer" msgid="6459070074762877114">"Taimeris"</string>
<string name="menu_clock" msgid="5612760670606829805">"Pulkstenis"</string>
@@ -175,10 +181,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Kārtot pēc nosaukuma"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Atlasītās pilsētas"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Atsākt"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Sākt"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Apturēt"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Aplis"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Atiestatīt"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Sākt"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pārtraukt"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Aplis"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Kopīgot"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -190,10 +196,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Mans laiks ir: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Intervāla laiki:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. aplis"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Skaits: <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Skaits: <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="zero"><xliff:g id="NUMBER">%d</xliff:g> stundas</item>
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> stunda</item>
@@ -216,12 +218,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Pievienot 1 minūti"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Pievienot 1 minūti"</string>
<string name="timer_stop" msgid="3361154678667736722">"Apturēt"</string>
- <string name="timer_done" msgid="2375990511982914051">"Gatavs"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Apturēt visus taimerus"</string>
<string name="timer_reset" msgid="7848424809190171640">"Atiestatīt"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Atcelt"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Taimera iestatīšana ir atcelta"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Laiks ir beidzies!"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> taimeru termiņš beidzies"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Taimeris"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Ne vairāk kā 4 taimeri"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Apturēt"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Atiest. taimerus"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Jūs gan esat ātrs!"</item>
<item msgid="6332879039890727169">"Baudiet sava darba augļus!"</item>
@@ -238,6 +244,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Pilsētas"</string>
<string name="clock_settings" msgid="8317286807280600391">"Pulkstenis"</string>
<string name="clock_style" msgid="2265011060429742344">"Stils"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Datuma un laika maiņa"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogais"</item>
<item msgid="8483930821046925592">"Digitālais"</item>
@@ -252,6 +259,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"–"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Pilsēta <xliff:g id="CITY_NAME">%s</xliff:g> ir atzīmēta"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Pilsētas <xliff:g id="CITY_NAME">%s</xliff:g> atzīme ir noņemta"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Māršala Salas"</item>
<item msgid="4196408495909011020">"Midveja sala"</item>
@@ -340,13 +349,17 @@
<item msgid="5176858645450908751">"Džakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Signāli"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Hronometra pakalpojums paziņojuma darbībai."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Apturēts"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Apstrādā darbības no taimera paziņojumiem."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Apstrādā darbības no hronometra paziņojumiem."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Pārtraukts"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Lai nerādītu, velciet pa labi"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Lai atliktu, velciet pa kreisi"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Velciet pa kreisi, lai atliktu, vai pa labi, lai noraidītu"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Taimeri"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Taimera zvana signāls"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Taimeris ir apturēts."</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> taimeri ir apturēti."</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Taimeris apturēts"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Apturēti <xliff:g id="NUMBER">%d</xliff:g> taimeri"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Pieskarieties, lai skatītu savus taimerus."</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> taimeri"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Nākamais taimeris: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -373,35 +386,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Bez signāla"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Nav signālu"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NAV GAIDĀMU SIGNĀLU"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm priekšpusdienā"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, plkst. h:mm priekšpusdienā"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, plkst. k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Nederīgs laiks: <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Uz laiku <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> nav iestatīts neviens signāls."</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Nav iestatītu signālu."</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nav norādīts neviens apzīmējums."</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Apzīmējums nav piešķirts nevienam signālam."</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Hronometrs jau darbojas."</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Hronometrs nedarbojas."</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Hronometru nevar atiestatīt, jo tas darbojas."</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Hronometra darbība pārtraukta"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Hronometra darbība pārtraukta"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Hronometrs atiestatīts"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Hronometra laiks pārklāts"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Hronometra darbība sākta"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Uz šo laiku nav iestatīts neviens signāls."</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Signāls plkst. <xliff:g id="ALARM_TIME">%s</xliff:g> atcelts"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Signāls iestatīts uz plkst. <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Taimeris nav iestatīts."</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Taimeris ir izdzēsts."</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Taimeris jau darbojas."</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Nevar izpildīt jūsu pieprasījumu; ir pieejami vairāki taimeri."</string>
- <string name="timer_started" msgid="6715582052946641641">"Taimeris ir iestatīts."</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Nav neviena taimera."</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Ir iestatīti vairāki taimeri."</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Taimeris ir noņemts."</string>
<string name="timer_created" msgid="4381027137335885547">"Taimeris iestatīts"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Nederīgs taimera darbības ilgums"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Taimeris ir atiestatīts."</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Taimeri nevar atiestatīt, jo tas joprojām darbojas. Apturiet taimeri, lai to atiestatītu."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Taimeris jau ir apturēts."</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Taimeris ir izdzēsts."</string>
+ <string name="timer_started" msgid="6715582052946641641">"Taimeris ir iestatīts."</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Nederīgs taimera darbības ilgums"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Nav atlasīta neviena pilsēta."</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Norādītā pilsēta nav pieejama."</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Šī pilsēta jau ir pievienota."</string>
diff --git a/res/values-mk-rMK/array.xml b/res/values-mk-rMK/array.xml
index 71d1253..06cfb40 100644
--- a/res/values-mk-rMK/array.xml
+++ b/res/values-mk-rMK/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Форталеза"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Гранд Турк"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Гренада"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Гватемала"</item>
+ <item msgid="6216160110733510854">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемала"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Гвајана"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Халифакс"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Хавана"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Торонто"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Ванкувер"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Винипег"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Јужен пол"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Јужен пол<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Лонгиербјен"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Алмати"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Аман"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Газа"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Хеброн"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Хо Ши Мин"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Хонг Конг"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Хонг Конг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Истанбул"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Џакарта"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Ерусалим"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Манила"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Мускат"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Пном Пен"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Пјонгјанг"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Пјонгјанг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Катар"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Рангун"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Ријад"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Сајгон"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Сеул"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Шангај"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Шангај<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Сингапур"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Тајпеј"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Тајпеј<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Техеран"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Тел Авив"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Токио"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Токио<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Улан Батор"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Бермуда"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Канари"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Рино"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Блек Рок Сити"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Доха"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Пекинг"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Пекинг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Мумбај"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Делхи"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Осака"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Осака<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Лахор"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Санаа"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Барселона"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Кембриџ"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Киркланд"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Мадисон"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Гуангжу"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Гуангжу<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Хајдерабад"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Рестон"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Бело Хоризонте"</item>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index a5591bf..f61e9dd 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Покажи часовник"</string>
<string name="hide_clock" msgid="3217727306480505694">"Сокриј часовник"</string>
<string name="label" msgid="162189613902857319">"Ознака"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Вклучено"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Исклучено"</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="6506982899651975645">"Мелодија за аларм"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Приспособена мелодија"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Тајмерот истече"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Тивка мелодија"</string>
<string name="ringtone" msgid="9110746249688559579">"Мелодија"</string>
<string name="time" msgid="8067216534232296518">"Време"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Утре"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Одложи до <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Претстоен аларм"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Вашиот пропуштен аларм е избришан"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Преостанува помалку од една минута"</item>
- <item msgid="83197792732433351">"Преостануваат <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Преостануваат <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Преостануваат <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Преостанува помалку од една минута"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g><xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g><xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Преостануваат <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"Преостанува"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"Преостануваат"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Алармот е поставен за помалку од 1 минута од сега."</item>
<item msgid="6002066367368421848">"Алармот е поставен за <xliff:g id="DAYS">%1$s</xliff:g> од сега."</item>
@@ -101,6 +104,10 @@
<item quantity="one">минута</item>
<item quantity="other">минути</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Постепено зголемувај ја јачината на звукот"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Исклучено"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> секунди"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"секунди"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Исклучи звук по"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> минута</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Врати"</string>
<string name="delete" msgid="5732434972457000541">"Избриши"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Јачина на звук на аларм"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"На тивко"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Безгласен режим"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Непознато"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Одложете или отфрлете аларм."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (одложен)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Аларм поставен за <xliff:g id="TIME">%s</xliff:g>. Допрете да откажете."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Вчитување мелодија…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Услуга за репродукција на звук за тајмери поставени во Часовник."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Постави аларм"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Аларм"</string>
<string name="menu_timer" msgid="6459070074762877114">"Тајмер"</string>
<string name="menu_clock" msgid="5612760670606829805">"Часовник"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Подреди по име"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Избрани градови"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Продолжи"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Започни"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Запри"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Круг"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Ресетирај"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Започни"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Круг"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Сподели"</string>
<string name="hours_label" msgid="3393478155635368097">"ч"</string>
<string name="minutes_label" msgid="3568098128251438588">"м"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Моето време е <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Времиња на изминат круг:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Круг <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> час</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> часа</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Додај 1 минута"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Додај 1 мин"</string>
<string name="timer_stop" msgid="3361154678667736722">"Запри"</string>
- <string name="timer_done" msgid="2375990511982914051">"Готово"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Запри ги сите тајмери"</string>
<string name="timer_reset" msgid="7848424809190171640">"Ресетирај"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Откажи"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Тајмерот е откажан"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Времето истече"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> тајмери се истечени"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Тајмер"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Максимум 4 тајмери"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Паузирај"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Ресетирај ги сите тајмери"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Брзи сте како молња."</item>
<item msgid="6332879039890727169">"Уживајте во плодовите од вашата работа."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Градови"</string>
<string name="clock_settings" msgid="8317286807280600391">"Часовник"</string>
<string name="clock_style" msgid="2265011060429742344">"Стил"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Промени ги датумот и времето"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Аналоген"</item>
<item msgid="8483930821046925592">"Дигитален"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> е избрано"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> не е избрано"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Маршалски Острови"</item>
<item msgid="4196408495909011020">"Остров Мидвеј"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Џакарта"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Аларми"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Услуга со стоперка за активирање на известувањето."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Запрено"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Обработува дејства од известувањата на тајмерот."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Обработува дејства од известувањата на стоперката."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Паузирано"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Повлечете надесно за да отфрлите"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Повлечете налево за да одложите"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Повлечете налево за да одложите или надесно за да отфрлите"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Тајмери"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Мелодија на тајмерот"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Тајмерот е запрен"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"запрени <xliff:g id="NUMBER">%d</xliff:g> тајмери"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Тајмерот е паузиран"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> тајмери се паузирани"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Допрете за да ги видите вашите тајмери"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> тајмери"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Следен тајмер: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Нема аларми"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Нема аларм"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"НЕМА ПРЕТСТОЈНИ АЛАРМИ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"ч:мм прет."</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Неважечко време <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Нема аларм во <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Нема закажани аларми"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Не е наведена етикета"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Ниеден аларм не ја содржи етикетата"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Штоперицата веќе работи"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Штоперицата не работи"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Штоперицата работи и не може да се ресетира"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Штоперицата запре"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Стоперката е паузирана"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Штоперицата се ресетираше"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Штоперицата се преклопи"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Штоперицата се вклучи"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Нема закажано аларм во ова време"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Алармот во <xliff:g id="ALARM_TIME">%s</xliff:g> е отфрлен"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Алармот е поставен за <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Нема поставен тајмер"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Тајмерот е избришан"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Тајмерот веќе работи"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Вашето барање не може да се исполни бидејќи има повеќе достапни тајмери"</string>
- <string name="timer_started" msgid="6715582052946641641">"Тајмерот е вклучен"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Нема тајмери"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Има повеќе од еден тајмер"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Тајмерот е отстранет."</string>
<string name="timer_created" msgid="4381027137335885547">"Тајмерот е создаден"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Неважечка должина на тајмер"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Тајмерот е ресетиран"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Тајмер не може да се ресетира бидејќи уште работи. Запрете го тајмерот за да го ресетирате."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Тајмер веќе запре"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Тајмерот е избришан"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Тајмерот е вклучен"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Неважечка должина на тајмер"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Нема избран град"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Градот што го зададовте не е достапен"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Тој град веќе е додаден"</string>
diff --git a/res/values-ml-rIN/array.xml b/res/values-ml-rIN/array.xml
index 9a9176c..0cc6b64 100644
--- a/res/values-ml-rIN/array.xml
+++ b/res/values-ml-rIN/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>ഫോര്ട്ടാലീസ"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>ഗ്രാൻഡ് ടർക്ക്"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>ഗ്രനേഡ"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>ഗ്വാട്ടിമാല"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>ഗ്വാട്ടിമാല സിറ്റി"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>ഗയാന"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>ഹാലിഫാക്സ്"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>ഹവാന"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>ടൊറന്റോ"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>വാൻകൂവർ"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>വിന്നിപെഗ്"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>ദക്ഷിണ ധ്രുവം"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>ദക്ഷിണ ധ്രുവം<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>ലംഗ്യെർബിൻ"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>അൽമാട്ടി"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>അമ്മാൻ"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>ഗാസ"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>ഹെബ്രോൻ"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>ഹോ ചി മിൻ"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>ഹോംഗ് കോംഗ്"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>ഹോംഗ് കോംഗ്<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>ഈസ്താൻബുൾ"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>ജക്കാർത്ത"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>ജറൂസലെം"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>മനില"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>മസ്കറ്റ്"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>ഫ്നോം പെൻ"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>പ്യോംഗ്യാംഗ്"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>പ്യോംഗ്യാംഗ്<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>ഖത്തർ"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>റങ്കൂൺ"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>റിയാദ്"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>സായിഗോൺ"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>സോൾ"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>ഷംഗായി"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>ഷംഗായി<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>സിംഗപ്പൂര്"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>തായ്പേയ്"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>തായ്പേയ്<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>ടെഹ്റാൻ"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>ടെൽ അവീവ്"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>ടോക്കിയോ"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>ടോക്കിയോ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>ഉലാൻബത്തർ"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>ബര്മുഡ"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>കാനറി"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>റെനോ"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>ബ്ലാക്ക് റോക്ക് സിറ്റി"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>ദോഹ"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>ബെയ്ജിംഗ്"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>ബെയ്ജിംഗ്<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>മുംബൈ"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>ഡൽഹി"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>ഒസാകാ"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>ഒസാകാ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>ലാഹോർ"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>സാനാ"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>ബാർസെലോണ"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>കേംബ്രിഡ്ജ്"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>കിർക്ലാന്റ്"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>മാഡിസൺ"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>ഗ്വാങ്ജോ"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>ഗ്വാങ്ജോ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>ഹൈദരാബാദ്"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>റെസ്റ്റൺ"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>ബെലോ ഹൊറിസോണ്ടെ"</item>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index ad3907e..3bbdd16 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"ക്ലോക്ക് കാണിക്കുക"</string>
<string name="hide_clock" msgid="3217727306480505694">"ക്ലോക്ക് മറയ്ക്കുക"</string>
<string name="label" msgid="162189613902857319">"ലേബൽ"</string>
+ <string name="on_switch" msgid="2297966258029227449">"ഓൺ"</string>
+ <string name="off_switch" msgid="3381070073851148013">"ഓഫ്"</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="6506982899651975645">"അലാറം റിംഗ്ടോൺ"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"കസ്റ്റം റിംഗ്ടോൺ"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"ടൈമർ കാലഹരണപ്പെട്ടു"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"നിശബ്ദം"</string>
<string name="ringtone" msgid="9110746249688559579">"റിംഗ്ടോൺ"</string>
<string name="time" msgid="8067216534232296518">"സമയം"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"നാളെ"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> വരെ സ്നൂസ് ചെയ്യുന്നു"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"വരാനിരിക്കുന്ന അലാറം"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"നിങ്ങൾ നഷ്ടപ്പെടുത്തിയ അലാറം ഇല്ലാതാക്കി"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"ഒരു മിനിറ്റിലും താഴെ ശേഷിക്കുന്നു"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> ശേഷിക്കുന്നു"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> ശേഷിക്കുന്നു"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ശേഷിക്കുന്നു"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"ഒരു മിനിറ്റിലും താഴെ ശേഷിക്കുന്നു"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ശേഷിക്കുന്നു"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"ശേഷിക്കുന്നു"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"ശേഷിക്കുന്നു"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"ഇപ്പോൾ 1 മിനിറ്റിൽ താഴെ സമയത്തിനുള്ളിൽ അടിക്കാൻ അലാറം സജ്ജമാക്കി."</item>
<item msgid="6002066367368421848">"ഇപ്പോൾ മുതൽ <xliff:g id="DAYS">%1$s</xliff:g> ദിവസത്തേക്ക് അലാറം സജ്ജീകരിച്ചു."</item>
@@ -101,6 +104,10 @@
<item quantity="other">മിനിറ്റ്</item>
<item quantity="one">മിനിറ്റ്</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"സാവധാനം വോളിയം കൂട്ടിക്കൊണ്ടുവരിക"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"ഓഫ്"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> സെക്കൻഡ്"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"സെക്കൻഡ്"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"ഇതിനുശേഷം നിശബ്ദമാക്കുക"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> മിനിറ്റ്</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"പഴയപടിയാക്കുക"</string>
<string name="delete" msgid="5732434972457000541">"ഇല്ലാതാക്കുക"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"അലാറം വോളിയം"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"നിശബ്ദം"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"നിശബ്ദം"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"അജ്ഞാതം"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"സ്നൂസ് ചെയ്യുക അല്ലെങ്കിൽ അലാറം നിരസിക്കുക."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (സ്നൂസ് ചെയ്തു)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"<xliff:g id="TIME">%s</xliff:g> സമയത്തേക്ക് അലാറം സജ്ജീകരിച്ചു. റദ്ദാക്കുന്നതിന് സ്പർശിക്കുക."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"റിംഗ്ടോൺ ലോഡുചെയ്യുന്നു…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"ടൈമറുകൾക്കായുള്ള ശബ്ദ പ്ലേബാക്ക് സേവനം ക്ലോക്കിൽ സജ്ജമാക്കിയിരിക്കുന്നു."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"അലാറം സജ്ജീകരിക്കുക"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"അലാറം"</string>
<string name="menu_timer" msgid="6459070074762877114">"ടൈമർ"</string>
<string name="menu_clock" msgid="5612760670606829805">"ക്ലോക്ക്"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"പേര് പ്രകാരം അടുക്കുക"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"തിരഞ്ഞെടുത്ത നഗരങ്ങൾ"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"പുനരാരംഭിക്കുക"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"ആരംഭിക്കൂ"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"നിര്ത്തുക"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ലാപ്"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"പുനസജ്ജമാക്കൂ"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"ആരംഭിക്കൂ"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"ലാപ്"</string>
<string name="sw_share_button" msgid="4478648110382859382">"പങ്കിടുക"</string>
<string name="hours_label" msgid="3393478155635368097">"മ."</string>
<string name="minutes_label" msgid="3568098128251438588">"മി."</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"എന്റെ സമയം <xliff:g id="TIME">%s</xliff:g> ആണ്"</string>
<string name="sw_share_laps" msgid="614390674795945007">"ലാപ് തവണകൾ:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"ലാപ് <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> മണിക്കൂർ</item>
<item quantity="one">ഒരു മണിക്കൂർ</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"ഒരു മിനിറ്റ് ചേർക്കുക"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"ഒരു മിനിറ്റ് ചേർക്കുക"</string>
<string name="timer_stop" msgid="3361154678667736722">"നിര്ത്തുക"</string>
- <string name="timer_done" msgid="2375990511982914051">"പൂർത്തിയായി"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"എല്ലാ ടൈമറുകളും നിർത്തുക"</string>
<string name="timer_reset" msgid="7848424809190171640">"പുനസജ്ജമാക്കൂ"</string>
<string name="timer_cancel" msgid="3572868404230815644">"റദ്ദാക്കുക"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"ടൈമർ റദ്ദാക്കി"</string>
<string name="timer_times_up" msgid="9190440395938519009">"സമയം കഴിഞ്ഞു"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ടൈമറുകൾ കാലഹരണപ്പെട്ടു"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"ടൈമർ"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"പരമാവധി 4 ടൈമറുകൾ"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"തൽക്കാലം നിർത്തൂ"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"എല്ലാ ടൈമറുകളും പുനഃസജ്ജമാക്കുക"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"നിങ്ങൾ വളരെ വേഗത്തിലായിരിക്കുന്നു."</item>
<item msgid="6332879039890727169">"നിങ്ങളുടെ കഠിനാദ്ധ്വാനത്തിന്റെ ഫലങ്ങൾ ആസ്വദിക്കുക."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"നഗരങ്ങൾ"</string>
<string name="clock_settings" msgid="8317286807280600391">"ക്ലോക്ക്"</string>
<string name="clock_style" msgid="2265011060429742344">"സ്റ്റൈൽ"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"തീയതിയും സമയവും മാറ്റുക"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"അനലോഗ്"</item>
<item msgid="8483930821046925592">"ഡിജിറ്റൽ"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ചെക്കുചെയ്തു"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> അൺചെക്കുചെയ്തു"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"മാര്ഷല് ഐലന്ഡ്സ്"</item>
<item msgid="4196408495909011020">"മിഡ്വേ ഐലന്റ്"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"ജക്കാര്ത്ത"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"അലാറങ്ങൾ"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"അറിയിപ്പ് പ്രവർത്തിപ്പിക്കുന്നതിനുള്ള സ്റ്റോപ്പ്വാച്ച് സേവനം."</string>
- <string name="swn_stopped" msgid="783124901663086172">"നിർത്തി"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"ടൈമർ അറിയിപ്പുകളിൽ നിന്നുള്ള പ്രവർത്തനങ്ങൾ പ്രോസസ്സുചെയ്യുന്നു."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"സ്റ്റോപ്പ്വാച്ച് അറിയിപ്പുകളിൽ നിന്നുള്ള പ്രവർത്തനങ്ങൾ പ്രോസസ്സുചെയ്യുന്നു."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"താല്ക്കാലം നിര്ത്തി"</string>
<string name="description_direction_right" msgid="5709209043267548985">"നിരസിക്കാൻ വലത്തോട്ട് സ്വൈപ്പുചെയ്യുക"</string>
<string name="description_direction_left" msgid="7448141043674998679">"സ്നൂസ് ചെയ്യാൻ ഇടത്തോട്ട് സ്വൈപ്പുചെയ്യുക"</string>
<string name="description_direction_both" msgid="1841309486023845685">"സ്നൂസ് ചെയ്യാൻ ഇടത്തോട്ടോ നിരസിക്കാൻ വലത്തോട്ടോ സ്വൈപ്പുചെയ്യുക"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"ടൈമറുകൾ"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"ടൈമർ റിംഗ്ടോൺ"</string>
<string name="timer_stopped" msgid="2730331837832462008">"ടൈമർ നിർത്തി"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> ടൈമറുകൾ നിർത്തി"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"ടൈമർ തൽക്കാലം നിർത്തി"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> ടൈമറുകൾ തൽക്കാലം നിർത്തി"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"നിങ്ങളുടെ ടൈമറുകൾ കാണുന്നതിന് സ്പർശിക്കുക"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ടൈമറുകൾ"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"അടുത്ത ടൈമർ: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"അലാറങ്ങളില്ല"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"അലാറങ്ങളൊന്നും സജ്ജീകരിച്ചിട്ടില്ല"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"വരാനിരിക്കുന്ന അലാറങ്ങളൊന്നുമില്ല"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"അസാധുവായ സമയം <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>-ന് അലാറം ഒന്നുമില്ല"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"ഷെഡ്യൂൾ ചെയ്ത അലാറമുകളൊന്നുമില്ല"</string>
<string name="no_label_specified" msgid="2008482054428460626">"ലേബലൊന്നും വ്യക്തമാക്കിയിട്ടില്ല"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"അലാറമുകളിലൊന്നും ഈ ലേബൽ അടങ്ങിയിട്ടില്ല"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"സ്റ്റോപ്പ്വാച്ച് ഇതിനകം തന്നെ പ്രവർത്തിക്കുന്നുണ്ട്"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"സ്റ്റോപ്പ്വാച്ച് പ്രവർത്തിക്കുന്നില്ല"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"പ്രവർത്തിച്ചുകൊണ്ടിരിക്കുന്നതിനാൽ സ്റ്റോപ്പ്വാച്ച് പുനഃക്രമീകരിക്കാൻ കഴിയില്ല"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"സ്റ്റോപ്പ്വാച്ച് നിലച്ചു"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"സ്റ്റോപ്പ്വാച്ച് തൽക്കാലം നിർത്തി"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"സ്റ്റോപ്പ്വാച്ച് പുനഃക്രമീകരിച്ചു"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"സ്റ്റോപ്പ്വാച്ച് ലാപ്പുചെയ്തു"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"സ്റ്റോപ്പ്വാച്ച് ആരംഭിച്ചു"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"ഈ സമയത്തേക്കായി അലാറമുകളൊന്നും ഷെഡ്യൂൾ ചെയ്തിട്ടില്ല"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> അലാറം ഡിസ്മിസ് ചെയ്തു"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g>-ന് അലാറം സജ്ജീകരിച്ചു"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"സജ്ജമാക്കിയ ടൈമറുകളൊന്നുമില്ല"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"ടൈമർ ഇല്ലാതാക്കി"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"ടൈമർ ഇതിനകം തന്നെ പ്രവർത്തിക്കുന്നു"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"അഭ്യർത്ഥന പൂർത്തിയാക്കാനാവുന്നില്ല, ഒന്നിലധികം ടൈമറുകൾ ലഭ്യം"</string>
- <string name="timer_started" msgid="6715582052946641641">"ടൈമർ ആരംഭിച്ചു"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"ടൈമറുകളൊന്നും നിലവിലില്ല"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"ഒന്നിലധികം ടൈമർ നിലവിലുണ്ട്"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"ടൈമർ നീക്കംചെയ്തു."</string>
<string name="timer_created" msgid="4381027137335885547">"ടൈമർ സൃഷ്ടിച്ചു"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"ടൈമർ ദൈർഘ്യം അസാധുവാണ്"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"ടൈമർ പുനഃസജ്ജമാക്കി"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"ടൈമർ ഇതിനകം തന്നെ പ്രവർത്തിക്കുന്നതിനാൽ, പുനഃസജ്ജമാക്കാൻ കഴിയില്ല. പുനഃസജ്ജമാക്കാൻ ടൈമർ നിർത്തുക."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"ടൈമർ ഇതിനകം തന്നെ നിർത്തി"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"ടൈമർ ഇല്ലാതാക്കി"</string>
+ <string name="timer_started" msgid="6715582052946641641">"ടൈമർ ആരംഭിച്ചു"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"ടൈമർ ദൈർഘ്യം അസാധുവാണ്"</string>
<string name="no_city_selected" msgid="1007596865203283741">"നഗരം തിരഞ്ഞെടുത്തിട്ടില്ല"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"നിങ്ങൾ വ്യക്തമാക്കിയ നഗരം ലഭ്യമല്ല"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"ആ നഗരം ഇതിനകം തന്നെ ചേർത്തിട്ടുണ്ട്"</string>
diff --git a/res/values-mn-rMN/array.xml b/res/values-mn-rMN/array.xml
index be1e170d..1b980ee 100644
--- a/res/values-mn-rMN/array.xml
+++ b/res/values-mn-rMN/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"Ф<xliff:g id="SEPARATOR">=</xliff:g>Форталеза"</item>
<item msgid="5801558418916235541">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гранд Tурк"</item>
<item msgid="2103759276235503048">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гренада"</item>
- <item msgid="1490069759176391533">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемал"</item>
+ <item msgid="6216160110733510854">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемал хот"</item>
<item msgid="525959305652046261">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гайана"</item>
<item msgid="7565596629973190931">"Г<xliff:g id="SEPARATOR">=</xliff:g>Галифакс"</item>
<item msgid="3811169155065582644">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гавана"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Торонто"</item>
<item msgid="1506838283840737263">"В<xliff:g id="SEPARATOR">=</xliff:g>Ванкувер"</item>
<item msgid="8935386104773857399">"В<xliff:g id="SEPARATOR">=</xliff:g>Виннипег"</item>
- <item msgid="1132634022412399582">"Ө<xliff:g id="SEPARATOR">=</xliff:g>Өмнөд туйл"</item>
+ <item msgid="498429228419399474">"Ө<xliff:g id="SEPARATOR">=</xliff:g>Өмнөд туйл<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"Л<xliff:g id="SEPARATOR">=</xliff:g>Лонгеарбен"</item>
<item msgid="3784788073896028355">"А<xliff:g id="SEPARATOR">=</xliff:g>Алмата"</item>
<item msgid="7895695236056852523">"А<xliff:g id="SEPARATOR">=</xliff:g>Амман"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"Г<xliff:g id="SEPARATOR">=</xliff:g>Газа"</item>
<item msgid="2359068282340162319">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хеброн"</item>
<item msgid="6223396610551759129">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хо Ши Мин"</item>
- <item msgid="4731022818651322736">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хонг Конг"</item>
+ <item msgid="3439764751788710130">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хонг Конг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"И<xliff:g id="SEPARATOR">=</xliff:g>Истанбул"</item>
<item msgid="758800913783999425">"Ж<xliff:g id="SEPARATOR">=</xliff:g>Жакарта"</item>
<item msgid="8956406398692698126">"И<xliff:g id="SEPARATOR">=</xliff:g>Иерусалим"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"М<xliff:g id="SEPARATOR">=</xliff:g>Манила"</item>
<item msgid="6033964325069060422">"М<xliff:g id="SEPARATOR">=</xliff:g>Мускат"</item>
<item msgid="6077458941399984780">"П<xliff:g id="SEPARATOR">=</xliff:g>Пном Пен"</item>
- <item msgid="935474308903572975">"П<xliff:g id="SEPARATOR">=</xliff:g>Пхеньян"</item>
+ <item msgid="1245515372520913197">"П<xliff:g id="SEPARATOR">=</xliff:g>Пхеньян<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"К<xliff:g id="SEPARATOR">=</xliff:g>Катар"</item>
<item msgid="1667243110545095146">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рангун"</item>
<item msgid="4460370766685855731">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рияд"</item>
<item msgid="4229224905931739201">"С<xliff:g id="SEPARATOR">=</xliff:g>Сайгон"</item>
<item msgid="8705359848250215620">"С<xliff:g id="SEPARATOR">=</xliff:g>Сөүл"</item>
- <item msgid="583367295371395814">"Ш<xliff:g id="SEPARATOR">=</xliff:g>Шанхай"</item>
+ <item msgid="3814881931186962624">"Ш<xliff:g id="SEPARATOR">=</xliff:g>Шанхай<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"С<xliff:g id="SEPARATOR">=</xliff:g>Сингапур"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Тайпей"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Тайпей<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Тегеран"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Тель-Авив"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Токио"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Токио<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"У<xliff:g id="SEPARATOR">=</xliff:g>Улаанбаатар"</item>
<item msgid="2028626988021468640">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бермуд"</item>
<item msgid="4527109966513690429">"К<xliff:g id="SEPARATOR">=</xliff:g>Канари"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рено"</item>
<item msgid="9155068631060038769">"Б<xliff:g id="SEPARATOR">=</xliff:g>БлэкРок Сити"</item>
<item msgid="8498761319928979900">"Д<xliff:g id="SEPARATOR">=</xliff:g>Доха"</item>
- <item msgid="8307897251088048641">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бээжин"</item>
+ <item msgid="5327010922199714808">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бээжин<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"М<xliff:g id="SEPARATOR">=</xliff:g>Мумбай"</item>
<item msgid="6668274273067049125">"Д<xliff:g id="SEPARATOR">=</xliff:g>Дели"</item>
- <item msgid="2933410189478233292">"О<xliff:g id="SEPARATOR">=</xliff:g>Осака"</item>
+ <item msgid="7199039603593847813">"О<xliff:g id="SEPARATOR">=</xliff:g>Осака<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"Л<xliff:g id="SEPARATOR">=</xliff:g>Лахоре"</item>
<item msgid="1448378291805481500">"С<xliff:g id="SEPARATOR">=</xliff:g>Санаа"</item>
<item msgid="5233119846682408301">"Б<xliff:g id="SEPARATOR">=</xliff:g>Барселона"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"К<xliff:g id="SEPARATOR">=</xliff:g>Кембридж"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Киркленд"</item>
<item msgid="6308007059287569663">"М<xliff:g id="SEPARATOR">=</xliff:g>Мaдисон"</item>
- <item msgid="6971636434858330021">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гуанжоу"</item>
+ <item msgid="2077617905582224600">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гуанжоу<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хайдарабад"</item>
<item msgid="3032295682584784261">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рестон"</item>
<item msgid="7722837296297332268">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бело Оризонте"</item>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index 0aa6362..b92e43f 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Цаг харуулах"</string>
<string name="hide_clock" msgid="3217727306480505694">"Цагийг нуух"</string>
<string name="label" msgid="162189613902857319">"Шошго"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Идэвхтэй"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Идэвхгүй"</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="6506982899651975645">"Сэрүүлгийн ая"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Тохируулсан хонхны ая"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Цаг хэмжигчийн хугацаа дууссан"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Чимээгүй"</string>
<string name="ringtone" msgid="9110746249688559579">"Хонхны ая"</string>
<string name="time" msgid="8067216534232296518">"Цаг"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Маргааш"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> хүртэл хойшлуулах"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Удахгүй болох сэрүүлэг"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Таны анзаараагүй сэрүүлгийг устгав"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Минут хүрэхгүй хугацаа үлдлээ"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> үлдсэн"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> үлдсэн"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> үлдсэн"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Минут хүрэхгүй хугацаа үлдлээ"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> үлдсэн"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"үлдсэн"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"үлдсэн"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Сэрүүлгийг одоогоос 1 минутын дотор тохируулсан."</item>
<item msgid="6002066367368421848">"Сэрүүлгийг одоогоос <xliff:g id="DAYS">%1$s</xliff:g>-т тохируулсан."</item>
@@ -101,6 +104,10 @@
<item quantity="other">минут</item>
<item quantity="one">минут</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Хэмжээг аажмаар нэмэгдүүлэх"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Идэвхгүй"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> секунд"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"секунд"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Дуугүй болох"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> минут</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Буцаах"</string>
<string name="delete" msgid="5732434972457000541">"Устгах"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Сэрүүлгийн дуу"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Чимээгүй"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Чимээгүй"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Тодорхойгүй"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Сэрүүлгийг хойшлуулах буюу алгасах."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (хойшлуулсан)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"<xliff:g id="TIME">%s</xliff:g>-т сэрүүлэг тавьсан. Цуцлахын тулд хүрнэ үү."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Хонхны аяыг ачааллаж байна…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Цаганд тохируулсан цаг хэмжигчийн дуу тоглуулах үйлчилгээ."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Сэрүүлэг тавих"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Сэрүүлэг"</string>
<string name="menu_timer" msgid="6459070074762877114">"Цаг хэмжигч"</string>
<string name="menu_clock" msgid="5612760670606829805">"Цаг"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Нэрээр эрэмбэлэх"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Сонгогдсон хотууд"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Үргэлжлүүлэх"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Эхлэх"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Зогсоох"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Тойрог"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Бүгдийг цэвэрлэх"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Эхлэх"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Тойрог"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Хуваалцах"</string>
<string name="hours_label" msgid="3393478155635368097">"ц"</string>
<string name="minutes_label" msgid="3568098128251438588">"м"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Миний цаг <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Тойргийн хугацаа:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Тойрог <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> цаг</item>
<item quantity="one">1 цаг</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 Минут нэмэх"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 мин нэмэх"</string>
<string name="timer_stop" msgid="3361154678667736722">"Зогсоох"</string>
- <string name="timer_done" msgid="2375990511982914051">"Дууссан"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Бүх цаг хэмжигчийг зогсоо"</string>
<string name="timer_reset" msgid="7848424809190171640">"Бүгдийг цэвэрлэх"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Цуцлах"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Цаг хэмжигчийг цуцалсан"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Цаг дууслаа"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> цаг хэмжигч хүчингүй"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Цаг хэмжигч"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"хамгийн ихдээ 4 цаг тоологч"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Түр зогсоох"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Бүх цаг хэмжигчийг шинэчлэх"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Та хурдны мангас юм аа."</item>
<item msgid="6332879039890727169">"Хөдөлмөрийнхөө үр шимийг хүртээрэй."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Хотууд"</string>
<string name="clock_settings" msgid="8317286807280600391">"Цаг"</string>
<string name="clock_style" msgid="2265011060429742344">"Загвар"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Огноо, цагийг өөрчлөх"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Aналог"</item>
<item msgid="8483930821046925592">"Дижитал"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g>-г чагталсан"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g>-г чагтлаагүй"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Маршалын арлууд"</item>
<item msgid="4196408495909011020">"Мидвэй арлууд"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Жакарта"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Сэрүүлэг"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Мэдэгдлийг ажиллуулахын тулд Секунд хэмжигч үйлчилгээ."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Зогсоосон"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Цаг хэмжигчийн мэдэгдлээс үйлдэл боловсруулдаг"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Секунд хэмжигчийн мэдэгдлээс үйлдэл боловсруулдаг"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Түр зогсоосон"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Хаахын тулд баруун шудрана уу"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Түр хойшлуулахын тулд зүүн шудрана уу"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Түр хойшлуулах болон хаахын тулд зүүн тийш нь шударна уу."</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Цаг хэмжигч"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Цаг хэмжигчийн хонхны ая"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Цаг хэмжигч зогссон"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> цаг хэмжигч зогссон"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Цаг хэмжигчийг түр зогсоосон"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> цаг хэмжигчийг түр зогсоосон"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Цаг хэмжигчийг харахын тулд хүрнэ үү"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> цаг хэмжигч"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Дараагийн цаг хэмжигч: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Сэрүүлэг байхгүй"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Сэрүүлэг тохируулаагүй"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"УДАХГҮЙ БОЛОХ СЭРҮҮЛЭГ БАЙХГҮЙ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"цаг:мин өглөө"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"цаг:мин"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"ӨДӨР, цаг:мин өглөө"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"ӨДӨР, цаг:мин"</string>
<string name="invalid_time" msgid="2782334750243998633">"Буруу цаг <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>-д тааруулсан сэрүүлэг байхгүй байна"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Хуваарьт сэрүүлэг байхгүй байна"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Тодорхой хаяг байхгүй байна"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Ямар ч сэрүүлэгт хаяг байхгүй байна"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Секунд хэмжигч аль хэдийн ажиллаж байна"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Секунд хэмжигч ажиллахгүй байна"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Секунд хэмжигч ажиллаж байгаа учир дахин эхлүүлэх боломжгүй байна"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Секунд хэмжигчийг зогсоосон"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Секунд хэмжигчийг түр зогсоосон"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Секунд хэмжигчийг дахин эхлүүлсэн"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Секунд хэмжигчийн завсарлага"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Секунд хэмжигчийг эхлүүлсэн"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Энэ цагт сэрүүлэг тавиагүй байна"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> сэрүүлгийг унртаасан"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g>-д сэрүүлэг тавьсан байна"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Цаг хэмжигч тохируулаагүй байна"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Цаг хэмжигчийг устгасан"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Цаг хэмжигч ажиллаж байна"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Таны хүсэлтийг биелүүлэх боломжгүй байна. Олон төрлийн цаг боломжтой байна"</string>
- <string name="timer_started" msgid="6715582052946641641">"Цаг хэмжигч эхэлсэн"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Ямар ч цаг хэмжигч алга"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Нэгээс олон цаг хэмжигч байна"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Цаг хэмжигчийг устгасан."</string>
<string name="timer_created" msgid="4381027137335885547">"Цаг хэмжигч үүсгэсэн"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Цаг хэмжигчийн урт буруу байна"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Цаг хэмжигчийг дахин эхлүүллээ"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Цаг хэмжигч ажиллаж байгаа учраас дахин эхлүүлэх боломжгүй байна. Цаг хэмжигчийг дахин тааруулахын тулд зогсооно уу."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Цаг хэмжигч зогссон байна"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Цаг хэмжигчийг устгасан"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Цаг хэмжигч эхэлсэн"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Цаг хэмжигчийн урт буруу байна"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Хот сонгоогүй байна"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Таны сонгосон хот байхгүй байна"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Энэ хотыг аль хэдийн нэмсэн"</string>
diff --git a/res/values-mr-rIN/array.xml b/res/values-mr-rIN/array.xml
index f197d53..df42352 100644
--- a/res/values-mr-rIN/array.xml
+++ b/res/values-mr-rIN/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"फ<xliff:g id="SEPARATOR">=</xliff:g>फोर्तालेझा"</item>
<item msgid="5801558418916235541">"ग<xliff:g id="SEPARATOR">=</xliff:g>ग्रँड तुर्क"</item>
<item msgid="2103759276235503048">"ग<xliff:g id="SEPARATOR">=</xliff:g>ग्रेनेडा"</item>
- <item msgid="1490069759176391533">"ग<xliff:g id="SEPARATOR">=</xliff:g>ग्वाटेमाला"</item>
+ <item msgid="6216160110733510854">"ग<xliff:g id="SEPARATOR">=</xliff:g>ग्वाटेमाला शहर"</item>
<item msgid="525959305652046261">"ग<xliff:g id="SEPARATOR">=</xliff:g>गयाना"</item>
<item msgid="7565596629973190931">"ह<xliff:g id="SEPARATOR">=</xliff:g>हॅलिफॅक्स"</item>
<item msgid="3811169155065582644">"ह<xliff:g id="SEPARATOR">=</xliff:g>हवाना"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ट<xliff:g id="SEPARATOR">=</xliff:g>टोराँटो"</item>
<item msgid="1506838283840737263">"व<xliff:g id="SEPARATOR">=</xliff:g>व्हँकूव्हर"</item>
<item msgid="8935386104773857399">"व<xliff:g id="SEPARATOR">=</xliff:g>विनिपेग"</item>
- <item msgid="1132634022412399582">"द<xliff:g id="SEPARATOR">=</xliff:g>दक्षिण ध्रुव"</item>
+ <item msgid="498429228419399474">"द<xliff:g id="SEPARATOR">=</xliff:g>दक्षिण ध्रुव<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ल<xliff:g id="SEPARATOR">=</xliff:g>लाँगइयरबीयेन"</item>
<item msgid="3784788073896028355">"अ<xliff:g id="SEPARATOR">=</xliff:g>अल्माटी"</item>
<item msgid="7895695236056852523">"अ<xliff:g id="SEPARATOR">=</xliff:g>अम्मान"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ग<xliff:g id="SEPARATOR">=</xliff:g>गझा"</item>
<item msgid="2359068282340162319">"ह<xliff:g id="SEPARATOR">=</xliff:g>हेब्रॉन"</item>
<item msgid="6223396610551759129">"ह<xliff:g id="SEPARATOR">=</xliff:g>हो चि मिन्ह"</item>
- <item msgid="4731022818651322736">"ह<xliff:g id="SEPARATOR">=</xliff:g>हाँग काँग"</item>
+ <item msgid="3439764751788710130">"ह<xliff:g id="SEPARATOR">=</xliff:g>हाँग काँग<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"इ<xliff:g id="SEPARATOR">=</xliff:g>इस्तंबूल"</item>
<item msgid="758800913783999425">"ज<xliff:g id="SEPARATOR">=</xliff:g>जकार्ता"</item>
<item msgid="8956406398692698126">"ज<xliff:g id="SEPARATOR">=</xliff:g>जेरुसलेम"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"म<xliff:g id="SEPARATOR">=</xliff:g>मनिला"</item>
<item msgid="6033964325069060422">"म<xliff:g id="SEPARATOR">=</xliff:g>मस्कत"</item>
<item msgid="6077458941399984780">"प<xliff:g id="SEPARATOR">=</xliff:g>पनॉम पेन"</item>
- <item msgid="935474308903572975">"प<xliff:g id="SEPARATOR">=</xliff:g>प्याँगयांग"</item>
+ <item msgid="1245515372520913197">"प<xliff:g id="SEPARATOR">=</xliff:g>प्याँगयांग<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"क<xliff:g id="SEPARATOR">=</xliff:g>कतार"</item>
<item msgid="1667243110545095146">"र<xliff:g id="SEPARATOR">=</xliff:g>रंगून"</item>
<item msgid="4460370766685855731">"र<xliff:g id="SEPARATOR">=</xliff:g>रियाध"</item>
<item msgid="4229224905931739201">"स<xliff:g id="SEPARATOR">=</xliff:g>सैगॉन"</item>
<item msgid="8705359848250215620">"स<xliff:g id="SEPARATOR">=</xliff:g>सोल"</item>
- <item msgid="583367295371395814">"श<xliff:g id="SEPARATOR">=</xliff:g>शांघाय"</item>
+ <item msgid="3814881931186962624">"श<xliff:g id="SEPARATOR">=</xliff:g>शांघाय<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"स<xliff:g id="SEPARATOR">=</xliff:g>सिंगापूर"</item>
- <item msgid="1972491729911039207">"त<xliff:g id="SEPARATOR">=</xliff:g>ताइपेइ"</item>
+ <item msgid="8982451946156859368">"त<xliff:g id="SEPARATOR">=</xliff:g>ताइपेइ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"त<xliff:g id="SEPARATOR">=</xliff:g>तेहरान"</item>
<item msgid="8629402941285674273">"त<xliff:g id="SEPARATOR">=</xliff:g>तेल अवीव"</item>
- <item msgid="8499164674454654525">"ट<xliff:g id="SEPARATOR">=</xliff:g>टोकियो"</item>
+ <item msgid="76330681636547168">"ट<xliff:g id="SEPARATOR">=</xliff:g>टोकियो<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"उ<xliff:g id="SEPARATOR">=</xliff:g>उलानबातर"</item>
<item msgid="2028626988021468640">"ब<xliff:g id="SEPARATOR">=</xliff:g>बर्म्युडा"</item>
<item msgid="4527109966513690429">"क<xliff:g id="SEPARATOR">=</xliff:g>कॅनरी"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"र<xliff:g id="SEPARATOR">=</xliff:g>रीनो"</item>
<item msgid="9155068631060038769">"ब<xliff:g id="SEPARATOR">=</xliff:g>ब्लॅक रॉक सिटी"</item>
<item msgid="8498761319928979900">"द<xliff:g id="SEPARATOR">=</xliff:g>दोहा"</item>
- <item msgid="8307897251088048641">"ब<xliff:g id="SEPARATOR">=</xliff:g>बीजिंग"</item>
+ <item msgid="5327010922199714808">"ब<xliff:g id="SEPARATOR">=</xliff:g>बीजिंग<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"म<xliff:g id="SEPARATOR">=</xliff:g>मुंबई"</item>
<item msgid="6668274273067049125">"द<xliff:g id="SEPARATOR">=</xliff:g>दिल्ली"</item>
- <item msgid="2933410189478233292">"अ<xliff:g id="SEPARATOR">=</xliff:g>ओसाका"</item>
+ <item msgid="7199039603593847813">"अ<xliff:g id="SEPARATOR">=</xliff:g>ओसाका<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ल<xliff:g id="SEPARATOR">=</xliff:g>लाहोर"</item>
<item msgid="1448378291805481500">"स<xliff:g id="SEPARATOR">=</xliff:g>साना"</item>
<item msgid="5233119846682408301">"ब<xliff:g id="SEPARATOR">=</xliff:g>बार्सिलोना"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"क<xliff:g id="SEPARATOR">=</xliff:g>केंब्रिज"</item>
<item msgid="759409010285366934">"क<xliff:g id="SEPARATOR">=</xliff:g>किर्कलँड"</item>
<item msgid="6308007059287569663">"म<xliff:g id="SEPARATOR">=</xliff:g>मॅडिसन"</item>
- <item msgid="6971636434858330021">"ग<xliff:g id="SEPARATOR">=</xliff:g>गुआन्गझोउ"</item>
+ <item msgid="2077617905582224600">"ग<xliff:g id="SEPARATOR">=</xliff:g>गुआन्गझोउ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"ह<xliff:g id="SEPARATOR">=</xliff:g>हैदराबाद"</item>
<item msgid="3032295682584784261">"र<xliff:g id="SEPARATOR">=</xliff:g>रीस्टन"</item>
<item msgid="7722837296297332268">"ब<xliff:g id="SEPARATOR">=</xliff:g>बेलो हॉरिझोंटे"</item>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index ca575bd..851393a 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"घड्याळ दर्शवा"</string>
<string name="hide_clock" msgid="3217727306480505694">"घड्याळ लपवा"</string>
<string name="label" msgid="162189613902857319">"लेबल"</string>
+ <string name="on_switch" msgid="2297966258029227449">"चालू"</string>
+ <string name="off_switch" msgid="3381070073851148013">"बंद"</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="6506982899651975645">"अलार्म रिंगटोन"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"सानुकूल रिंगटोन"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"टायमर कालबाह्य झाला"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"मूक"</string>
<string name="ringtone" msgid="9110746249688559579">"रिंगटोन"</string>
<string name="time" msgid="8067216534232296518">"वेळ"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"उद्या"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> पर्यंत स्नूझ करा"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"आगामी अलार्म"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"आपला सुटलेला अलार्म हटविला गेला आहे"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"एका मिनिटापेक्षा कमी वेळ शिल्लक"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> शिल्लक"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> शिल्लक"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> शिल्लक"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"एका मिनिटापेक्षा कमी वेळ शिल्लक"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> शिल्लक"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"शिल्लक"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"शिल्लक"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"आतापासून 1 मिनिटापेक्षा कमीसाठी अलार्म सेट केला."</item>
<item msgid="6002066367368421848">"आतापासून <xliff:g id="DAYS">%1$s</xliff:g> साठी अलार्म सेट केला."</item>
@@ -101,6 +104,10 @@
<item quantity="one">मिनिट</item>
<item quantity="other">मिनिटे</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"व्हॉल्यूम हळूहळू वाढवा"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"बंद"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> सेकंद"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"सेकंद"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"नंतर शांतता"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> मिनिट</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"परत जा"</string>
<string name="delete" msgid="5732434972457000541">"हटवा"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"अलार्म व्हॉल्यूम"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"मूक"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"मूक"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"अज्ञात"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"अलार्म स्नूझ करा किंवा डिसमिस करा."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (स्नूझ केले)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"<xliff:g id="TIME">%s</xliff:g> साठी अलार्म सेट केला. रद्द करण्यासाठी स्पर्श करा."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"रिंगटोन लोड करत आहे…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"घड्याळात सेट केलेल्या टाइमरसाठी ध्वनी प्लेबॅक सेवा"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"अलार्म सेट करा"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"अलार्म"</string>
<string name="menu_timer" msgid="6459070074762877114">"टाइमर"</string>
<string name="menu_clock" msgid="5612760670606829805">"घड्याळ"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"नावानुसार क्रमवारी लावा"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"निवडक शहरे"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"पुन्हा सुरु करा"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"प्रारंभ करा"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"थांबा"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"लॅप"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"रीसेट करा"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"प्रारंभ करा"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"लॅप"</string>
<string name="sw_share_button" msgid="4478648110382859382">"सामायिक करा"</string>
<string name="hours_label" msgid="3393478155635368097">"ता"</string>
<string name="minutes_label" msgid="3568098128251438588">"मि"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"माझी वेळ <xliff:g id="TIME">%s</xliff:g> आहे"</string>
<string name="sw_share_laps" msgid="614390674795945007">"लॅप वेळा:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"लॅप <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> तास</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> तास</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 मिनिट जोडा"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 मिनिट जोडा"</string>
<string name="timer_stop" msgid="3361154678667736722">"थांबा"</string>
- <string name="timer_done" msgid="2375990511982914051">"पूर्ण केले"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"सर्व टायमर थांबवा"</string>
<string name="timer_reset" msgid="7848424809190171640">"रीसेट करा"</string>
<string name="timer_cancel" msgid="3572868404230815644">"रद्द करा"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"टायमर रद्द केला"</string>
<string name="timer_times_up" msgid="9190440395938519009">"वेळ संपली"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> टायमर कालबाह्य झाले"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"टाइमर"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"जास्तीत जास्त 4 टायमर"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"विराम"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"सर्व टायमर रीसेट करा"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"आपण खरोखर वेगाचे दानव आहात."</item>
<item msgid="6332879039890727169">"आपल्या कष्टाच्या फळांचा आनंद घ्या."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"शहरे"</string>
<string name="clock_settings" msgid="8317286807280600391">"घड्याळ"</string>
<string name="clock_style" msgid="2265011060429742344">"शैली"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"तारीख आणि वेळ बदला"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"अॅनालॉग"</item>
<item msgid="8483930821046925592">"डिजिटल"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> चेक केला"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> अनचेक केला"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"मार्शल बेटे"</item>
<item msgid="4196408495909011020">"मिडवे बेट"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"जकार्ता"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"अलार्म"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"सूचना चालविण्यासाठी स्टॉपवॉच सेवा."</string>
- <string name="swn_stopped" msgid="783124901663086172">"थांबले"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"टाइमर सूचनांमधील क्रियांवर प्रक्रिया करते."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"स्टॉपवॉच सूचनांमधील क्रियांवर प्रक्रिया करते."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"विराम दिला"</string>
<string name="description_direction_right" msgid="5709209043267548985">"डिसमिस करण्यासाठी उजवीकडे स्वाइप करा"</string>
<string name="description_direction_left" msgid="7448141043674998679">"स्नूझ करण्यासाठी डावीकडे स्वाइप करा"</string>
<string name="description_direction_both" msgid="1841309486023845685">"स्नूझ करण्यासाठी डावीकडे किंवा डिसमिस करण्यासाठी उजवीकडे स्वाइप करा"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"टायमर"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"टायमर रिंगटोन"</string>
<string name="timer_stopped" msgid="2730331837832462008">"टाइमर थांबले"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> टाइमर थांबले"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"टायमरला विराम दिला"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> टायमरला विराम दिला"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"आपले टाइमर पाहण्यासाठी स्पर्श करा"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> टाइमर"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"पुढील टाइमर: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"कोणतेही अलार्म नाहीत"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"कोणतेही अलार्म सेट केलेले नाहीत"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"कोणतेही आगामी अलार्म नाहीत"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"अवैध वेळ <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> चा कोणताही अलार्म नाही"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"अनुसूची केलेले अलार्म नाहीत"</string>
<string name="no_label_specified" msgid="2008482054428460626">"कोणतेही लेबल निर्दिष्ट केले नाही"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"कोणत्याही अलार्ममध्ये लेबल नाही"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"स्टॉपवॉच आधीपासून चालू आहे"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"स्टॉपवॉच चालू नाही"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"स्टॉपवॉच चालू असल्याने ते रीसेट केले जाऊ शकत नाही"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"स्टॉपवॉच थांबविले"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"स्टॉपवॉचला विराम दिला"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"स्टॉपवॉच रीसेट केले"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"स्टॉपवॉच लॅप केले"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"स्टॉपवॉच सुरु केले"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"या वेळेसाठी अलार्म अनुसूचित केला नाही"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> अलार्म डिसमिस केला"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g> साठी अलार्म सेट केला"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"टायमर सेट केले नाही"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"टायमर हटविला"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"टायमर आधीपासून चालू आहे"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"आपली विनंती पूर्ण करण्यात अक्षम, एकाधिक टायमर उपलब्ध आहेत"</string>
- <string name="timer_started" msgid="6715582052946641641">"टायमर सुरू झाला"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"कोणतेही टायमर अस्तित्वात नाहीत"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"एकाधिक टायमर अस्तित्वात आहे"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"टायमर काढला गेला आहे."</string>
<string name="timer_created" msgid="4381027137335885547">"टायमर तयार केले"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"अवैध टायमर लांबी"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"टायमर रीसेट केला"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"टायमर अद्याप चालू असल्याने तो रीसेट केला जाऊ शकत नाही. रीसेट करण्यासाठी टायमर थांबवा."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"टायमर आधीपासून थांबला आहे"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"टायमर हटविला"</string>
+ <string name="timer_started" msgid="6715582052946641641">"टायमर सुरू झाला"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"अवैध टायमर लांबी"</string>
<string name="no_city_selected" msgid="1007596865203283741">"कोणतेही शहर निवडले नाही"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"आपण निर्दिष्ट केलेले शहर उपलब्ध नाही"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"ते शहर आधीपासून जोडले गेले आहे"</string>
diff --git a/res/values-ms-rMY/array.xml b/res/values-ms-rMY/array.xml
index e340038..be83b07 100644
--- a/res/values-ms-rMY/array.xml
+++ b/res/values-ms-rMY/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"B<xliff:g id="SEPARATOR">=</xliff:g>Bandar Guatemala"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"K<xliff:g id="SEPARATOR">=</xliff:g>Kutub Selatan"</item>
+ <item msgid="498429228419399474">"K<xliff:g id="SEPARATOR">=</xliff:g>Kutub Selatan<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapura"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Tehran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 579b96a..217e2d2 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Tunjukkan jam"</string>
<string name="hide_clock" msgid="3217727306480505694">"Sembunyikan jam"</string>
<string name="label" msgid="162189613902857319">"Label"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Hidup"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Mati"</string>
<string name="default_label" msgid="5590025289805630372">"Penggera"</string>
<string name="set_alarm" msgid="9148359866152726808">"Tetapkan penggera"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Getar"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Ulang"</string>
<string name="alert" msgid="6506982899651975645">"Nada Dering Penggera"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Nada Dering Tersuai"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Pemasa Tamat"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Senyap"</string>
<string name="ringtone" msgid="9110746249688559579">"Nada dering"</string>
<string name="time" msgid="8067216534232296518">"Masa"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Esok"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Ditunda sehingga <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Penggera akan datang"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Penggera terlepas anda telah dipadamkan"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Tinggal kurang satu minit"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> lagi"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> lagi"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> lagi"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Kurang seminit lagi"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> lagi"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"lagi"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"lagi"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Penggera ditetapkan pada kurang daripada 1 minit dari sekarang."</item>
<item msgid="6002066367368421848">"Penggera ditetapkan pada <xliff:g id="DAYS">%1$s</xliff:g> dari sekarang."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minit</item>
<item quantity="one">minit</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Tinggikan kelantangan beransur-ansur"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Mati"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> saat"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"saat"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Senyap selepas"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minit</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Berbalik"</string>
<string name="delete" msgid="5732434972457000541">"Padam"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Kelantangan penggera"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Senyap"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Senyap"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Tidak diketahui"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Tunda atau tolak penggera."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ditidurkan sekejap)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Penggera ditetapkan pada <xliff:g id="TIME">%s</xliff:g>. Sentuh untuk membatalkan."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Memuatkan nada dering..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Perkhidmatan main balik bunyi untuk pemasa ditetapkan dalam Jam."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Tetapkan penggera"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Penggera"</string>
<string name="menu_timer" msgid="6459070074762877114">"Pemasa"</string>
<string name="menu_clock" msgid="5612760670606829805">"Jam"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Isih mengikut nama"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Bandar Terpilih"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Sambung semula"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Mula"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Berhenti"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Pusingan"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Tetapkan semula"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Mula"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Jeda"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Pusingan"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Kongsi"</string>
<string name="hours_label" msgid="3393478155635368097">"j"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Masa saya ialah <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Masa pusingan:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Pusingan <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> jam</item>
<item quantity="one">1 jam</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Tambah 1 Minit"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Tambah 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Berhenti"</string>
- <string name="timer_done" msgid="2375990511982914051">"Selesai"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Hentikan semua pemasa"</string>
<string name="timer_reset" msgid="7848424809190171640">"Tetapkan semula"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Batalkan"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Pemasa dibatalkan"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Masa tamat"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> pemasa tamat tempoh"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Pemasa"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Maksimum 4 pemasa"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Jeda"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Ttpkn sml pmasa"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Anda memang pantas."</item>
<item msgid="6332879039890727169">"Nikmati hasil usaha anda."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Bandar"</string>
<string name="clock_settings" msgid="8317286807280600391">"Jam"</string>
<string name="clock_style" msgid="2265011060429742344">"Gaya"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Tukar Tarikh & masa"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analog"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ditandai"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> dinyahtanda"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Kepulauan Marshall"</item>
<item msgid="4196408495909011020">"Pulau Midway"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Penggera"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Perkhidmatan jam randik untuk menjalankan pemberitahuan."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Dihentikan"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Memproses tindakan daripada pemberitahuan pemasa."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Memproses tindakan daripada pemberitahuan jam randik."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Dijeda"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Leret ke kanan untuk mengenepikan"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Leret ke kiri untuk menunda"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Leret ke kiri untuk menunda atau ke kanan untuk mengetepikan"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Pemasa"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Nada dering pemasa"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Pemasa berhenti"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> pemasa berhenti"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Pemasa dijeda"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> pemasa dijeda"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Sentuh untuk melihat pemasa anda"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> pemasa"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Pemasa seterusnya: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Tiada Penggera"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Tiada pgera dttpkn"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"TIADA PENGGERA AKAN DATANG"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Masa tidak sah <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Tiada penggera pada <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Tiada penggera yang dijadualkan"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Tiada label dinyatakan"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Tiada penggera yang mengandungi label ini"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Jam randik sudah berjalan"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Jam randik tidak berjalan"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Jam randik tidak dapat ditetapkan semula kerana jam itu sedang berjalan"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Jam randik dihentikan"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Jam randik dijeda"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Jam randik ditetapkan semula"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Jam randik bertindih"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Jam randik dimulakan"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Tiada penggera yang dijadualkan untuk masa ini"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Penggera <xliff:g id="ALARM_TIME">%s</xliff:g> diketepikan"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Penggera ditetapkan pada <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Tiada pemasa yang ditetapkan"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Pemasa dipadamkan"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Pemasa sudah berjalan"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Tidak dapat menyelesaikan permintaan anda, berbilang pemasa tersedia"</string>
- <string name="timer_started" msgid="6715582052946641641">"Pemasa dimulakan"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Pemasa tidak wujud"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Lebih daripada satu pemasa wujud"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Pemasa telah dialih keluar."</string>
<string name="timer_created" msgid="4381027137335885547">"Pemasa dibuat"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Tempoh pemasa tidak sah"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Tetapkan semula pemasa"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Pemasa tidak boleh ditetapkan semula kerana masih berjalan. Hentikan pemasa untuk menetapkan semula."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Pemasa sudah berhenti"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Pemasa dipadamkan"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Pemasa dimulakan"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Tempoh pemasa tidak sah"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Tiada bandar dipilih"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Bandar yang anda nyatakan tidak tersedia"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Bandar itu telah ditambahkan"</string>
diff --git a/res/values-my-rMM/array.xml b/res/values-my-rMM/array.xml
index ef4b15b..dcb29ca 100644
--- a/res/values-my-rMM/array.xml
+++ b/res/values-my-rMM/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>ဖော်တာလီဇာ"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>ဂရန်း တာ့ခ်"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>ဂရီနေဒါ"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>ဂွာတီမာလာ"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>ဂွာတီမာလာမြို့"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>ဂိုင်ယာနာ"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>ဟာလီဖက်စ်"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>ဟာဗားနား"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>တိုရွန်တို"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>ဗန်ကူးဗား"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>ဝင်းနီပက်"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>တောင်ဝင်ရိုးစွန်း"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>တောင်ဝင်ရိုးစွန်း<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>လောင်းန်ရီးယားဘျန်း"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>အယ်လ်မာတီ"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>အာမန်"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>ဂါဇာ"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>ဟေဗြွန်"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>ဟိုချီမင်း"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>ဟောင်ကောင်"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>ဟောင်ကောင်<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>အစ္စတန်ဘူလ်"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>ဂျကာတာ"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>ဂျေရုဆလင်"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>မနီလာ"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>မုစ်ကက်"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>ဖနွမ်းပင်"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>ပြုံယမ်း"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>ပြုံယမ်း<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>ကာတာ"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>ရန်ကုန်"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>ရိယာ့ဒ်"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>ဆိုင်ဂုံ"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>ဆိုးလ်"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>ရှန်ဟိုင်း"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>ရှန်ဟိုင်း<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>စင်္ကာပူ"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>ထိုင်ပေ"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>ထိုင်ပေ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>တီဟီရန်"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>တယ်လ်အေဗစ်"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>တိုကျို"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>တိုကျို<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>ဥလန်ဘာတာ"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>ဘာမြူဒါ"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>ကနေရီ"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>ရီနို"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>ဘလက်ခ်ရော့ခ်မြို့တော်"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>ဒိုဟာ"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>ဘေရှင်း"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>ဘေရှင်း<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>မွမ်ဘိုင်း"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>ဒေလီ"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>အိုဆာကာ"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>အိုဆာကာ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>လာဟိုး"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>ဆာနာအာ"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>ဘာစီလိုနာ"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>ကိန်းဘရစ်ချ်"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>ခရစ်ခ်လန်"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>မာဒီဆန်"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>ကွမ်ကျိုး"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>ကွမ်ကျိုး<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>ဟိုက်ဒြာဘတ်"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>ရက်စ်တန်"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>ဘဲလ်လို ဟွန်ရီဇွန်တဲ"</item>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index fd24711..16b6189 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"နာရီကို ပြရန်"</string>
<string name="hide_clock" msgid="3217727306480505694">"နာရီကို ဝှက်ထားရန်"</string>
<string name="label" msgid="162189613902857319">"အညွှန်း"</string>
+ <string name="on_switch" msgid="2297966258029227449">"ဖွင့်ထားသည်"</string>
+ <string name="off_switch" msgid="3381070073851148013">"ပိတ်ထားသည်"</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="6506982899651975645">"နှိုးစက် သံစဉ်"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"စိတ်ကြိုက်ဖန်တီးထားသည့် မြည်သံ"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"အချိန်တိုင်းကိရိယာ သက်တမ်းကုန်ဆုံးပါပြီ"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"အသံတိတ်ရန်"</string>
<string name="ringtone" msgid="9110746249688559579">"သံစဉ်"</string>
<string name="time" msgid="8067216534232296518">"အချိန်"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"နက်ဖြန်"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g>အထိ မှေးရန်"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"လာတော့မည့် နှိုးစက်"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"သင် လွတ်သွားခဲ့သည့် နှိုးစက်ကို ဖျက်လိုက်ပြီ"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"ကျန်ရှိနေသည်မှာ တစ်မိနစ်ထက် နည်း"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> ကျန်ရှိနေ"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> ကျန်ရှိနေ"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ကျန်ရှိနေ"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"ကျန်ရှိနေသည်မှာ တစ်မိနစ်ထက် နည်း"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ကျန်ရှိနေ"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"ကျန်ရှိနေသော"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"ကျန်ရှိနေသော"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"နှိုးစက် သတ်မှတ်ချိန်မှာ ယခု အချိန်မှ ၁ မိနစ်ထက် နည်းနေသည်။"</item>
<item msgid="6002066367368421848">"ယခု အချိန်မှ စပြီး <xliff:g id="DAYS">%1$s</xliff:g> အကြာမှာ နှိုးစက် သတ်မှတ်ထားသည်။"</item>
@@ -101,6 +104,10 @@
<item quantity="other">မိနစ်</item>
<item quantity="one">မိနစ်</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"တဖြည်းဖြည်း အသံကို ချဲ့ယူပါ"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"ပိတ်ထား"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> စက္ကန့်"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"စက္ကန့်"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"နှိုးစက်သံကြာချိန်"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> မိနစ်</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"ပြန်လှန်"</string>
<string name="delete" msgid="5732434972457000541">"ဖျက်ရန်"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"နှိုးစက်သံ ပမာဏ"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"အသံတိတ်ရန်"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"တိတ်ဆိတ်နေရန်"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"မသိရ"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"နှိုးစက်ကို မှေးရန် သို့မဟုတ် ပယ်ရန်။"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (မှေးထား)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"နှိုးစက်ကို<xliff:g id="TIME">%s</xliff:g> မှာ သတ်မှတ်ထားသည်။ ပယ်ဖျက်ရန် ထိပါ။"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"သံစဉ်ကို တင်နေ…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"နာရီထဲက တိုင်မားများ အတွက် အသံကို ဖွင့်ပြမည်။"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"နှိုးစက် သတ်မှတ်ရန်"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"နှိုးစက်"</string>
<string name="menu_timer" msgid="6459070074762877114">"တိုင်မား"</string>
<string name="menu_clock" msgid="5612760670606829805">"နာရီ"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"အမည်အလိုက် စီရန်"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"ရွေးထားသည့် မြို့များ"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"ပြန်ဆက်လုပ်ရန်"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"စတင်ရန်"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"ရပ်တန့်ရန်"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"တာတစ်ပတ်"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"ပြန်ညှိရန်"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"စတင်ရန်"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"တာတစ်ပတ်"</string>
<string name="sw_share_button" msgid="4478648110382859382">"မျှဝေရန်"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"ကျွန်ုပ်၏ အချိန်မှာ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"တာ အချိန်များ:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"တာ<xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> နာရီ</item>
<item quantity="one">၁ နာရီ</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"၁ မိနစ် ထည့်ရန်"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"၁ မိနစ် ထည့်ရန်"</string>
<string name="timer_stop" msgid="3361154678667736722">"ရပ်တန့်ရန်"</string>
- <string name="timer_done" msgid="2375990511982914051">"လုပ်ပြီး"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"အချိန်တိုင်းကိရိယာများအားလုံး ရပ်ရန်"</string>
<string name="timer_reset" msgid="7848424809190171640">"ပြန်ညှိရန်"</string>
<string name="timer_cancel" msgid="3572868404230815644">"ထားတော့"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"တိုင်မား ဖျက်သိမ်းလိုက်ပြီ"</string>
<string name="timer_times_up" msgid="9190440395938519009">"တိုင်မား အလုပ်ပြီးသွားပြီ"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> အချိန်တိုင်းကိရိယာ သက်တမ်းကုန်ပါပြီ"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"တိုင်မား"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"တိုင်မား အများဆုံး ၄ ခု"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"ရပ်တန့်ရန်"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"တိုင်မား အားလုံး ပြန်ညှိရန်"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"သင်၏ အတော့်ကို နှုန်း မြန်လွန်းနေသည်။"</item>
<item msgid="6332879039890727169">"သင် ကြိုးစားခဲ့မှု အသီးအပွင့်များကို ခံစားနိုင်ပါပြီ။"</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"မြို့များ"</string>
<string name="clock_settings" msgid="8317286807280600391">"နာရီ"</string>
<string name="clock_style" msgid="2265011060429742344">"ပုံစံ"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"ရက်စွဲ & amp; အချိန် ပြောင်းရန်"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"လက်တံနာရီ"</item>
<item msgid="8483930821046925592">"ဒီဂျစ်တယ်"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":၀၀"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":၃၀"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ကို ခြစ်ထားသည်"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> ခြစ်မထား"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"မာရှယ်ကျွန်းစု"</item>
<item msgid="4196408495909011020">"မီးဒ်ဝေးကျွန်းစု"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"ဂျာကာတာ"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"နှိုးစက်များ"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"အချိန်ဖမ်းနာရီ အတွက် အကြောင်းကြားချက်များ ပြသည့် ဝန်ဆောင်မှု။"</string>
- <string name="swn_stopped" msgid="783124901663086172">"ရပ်ထားပြီ"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"အချိန်ကိုက်နာရီ အသိပေးချက်မှ လုပ်ဆောင်ချက်များကို လုပ်ဆောင်ပါ"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"အချိန်ရပ်နာရီ အသိပေးချက်များမှ လုပ်ဆောင်ချက်များကို လုပ်ဆောင်ပါ"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"ဆိုင်းငံ့ထား"</string>
<string name="description_direction_right" msgid="5709209043267548985">"ပယ်ချရန် ညာဘက်သို့ ပွတ်ဆွဲပါ"</string>
<string name="description_direction_left" msgid="7448141043674998679">"တစ်မှေးအိပ်ရန် ဘယ်ဘက်သို့ ပွတ်ဆွဲပါ"</string>
<string name="description_direction_both" msgid="1841309486023845685">"တစ်မှေးအိပ်ရန် ဘယ်ဘက်နှင့် ပယ်ချရန် ညာဘက်သို့ ပွတ်ဆွဲပါ။"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"အချိန်တိုင်းစက်များ"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"အချိန်တိုင်းကိရိယာ မြည်သည့်အသံ"</string>
<string name="timer_stopped" msgid="2730331837832462008">"တိုင်မား ရပ်ထားပြီ"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> တိုင်မားများ ရပ်ထားပြီ"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"တိုင်မား ရပ်တန့်ထား"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"တိုင်မား <xliff:g id="NUMBER">%d</xliff:g> ကြိမ် ရပ်တန့်ခဲ့"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"သင်၏ တိုင်မားများကို ကြည့်ရန် ထိပါ"</string>
<string name="timers_in_use" msgid="5570729467344408506">"တိုင်မား <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"နောက် တိုင်မား တစ်ခု: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"နှိုးစက် မရှိ"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"နှိုးစက်များ သတ်မှတ် မထား"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"လာမည့် နှိုးစက်များ မရှိပါ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE၊ h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE၊ k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"မမှန်ကန်သည့် အချိန် <xliff:g id="INVALID_HOUR">%d</xliff:g> : <xliff:g id="INVALID_MINUTES">%d</xliff:g><xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> တွင် နှိုးစက် မရှိပါ"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"စီစဉ်ထားသည့် နိုးစက်မရှိပါ"</string>
<string name="no_label_specified" msgid="2008482054428460626">"ခေါင်းစဉ်ခွဲအားဖော်ပြထားခြင်းမရှိပါ"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"မည်သည့် နှိုးစက်တွင်မဆို ခေါင်းစဉ်ခွဲမပါပါ"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"အချိန်မှတ်နာရီ ဖွင့်ထားပြီးဖြစ်သည်"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"အချိန်မှတ်နာရီ မဖွင့်ထားပါ"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"ချိန်ကိုက်နာရီသည်လည်နေသည့်အတွက် အစမှပြန်မချိန်နိုင်ပါ"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"ချိန်ကိုက်နာရီ ရပ်တန့်"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"စံချိန်ယူနာရီ ခေတ္တရပ်ထားသည်"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"ချိန်ကိုက်နာရီကို အစမှပြန်ချိန်ခြင်း"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"ချိန်ကိုက်နာရီ စေ့ပြီ"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"ချိန်ကိုင်နာရီအားစတင်ခဲ့"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"ဤအချိန်အတွက် နိုးစက်မစီစဉ်ထားပါ"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> နိုးစက် ဖျက်လိုက်ပြီ"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"နိုးစက်ပေးထားသော အချိန်<xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"အချိန်တိုင်းစက် မသတ်မှတ်ရသေးပါ"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"အချိန်သတ်မှတ်ခြင်း ဖျက်လိုက်ပါပြီ"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"အချိန်သတ်မှတ်ခြင်း ဖွင့်ထားပြီးပါပြီ"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"သင့်တောင်းဆိုချက် မပြီးမြောက်နိုင်ပါ၊ အချိန်တိုင်းစက် များစွာ ရှိနေ၏"</string>
- <string name="timer_started" msgid="6715582052946641641">"တိုင်မားစတင်ပါပြီ"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"တိုင်မား မရှိပါ"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"တိုင်မား တစ်ခုမက ရှိနေသည်"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"တိုင်မားကို ဖယ်ရှားခဲ့သည်။"</string>
<string name="timer_created" msgid="4381027137335885547">"အချိန်ကိုက်ကိရိယာ ဖန်တီးလိုက်ပါပြီ"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"မမှန်ကန်သည့် အချိန်ကိုက် အလျား"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"အချိန်သတ်မှတ်ခြင်း ပြန်လည်သတ်မှတ်လိုက်ပါပြီ"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"အချိန်သတ်မှတ်ခြင်း ဖွင့်ထားသောကြောင့် ပြန်လည်သတ်မှတ်၍မရပါ။ ပြန်လည်သတ်မှတ်ရန် အချိန်သတ်မှတ်ခြင်းကို ရပ်ပါ။"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"အချိန်သတ်မှတ်ခြင်း ရပ်ထားပါပြီ"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"အချိန်သတ်မှတ်ခြင်း ဖျက်လိုက်ပါပြီ"</string>
+ <string name="timer_started" msgid="6715582052946641641">"တိုင်မားစတင်ပါပြီ"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"မမှန်ကန်သည့် အချိန်ကိုက် အလျား"</string>
<string name="no_city_selected" msgid="1007596865203283741">"မြို့မရွေးချယ်ထားပါ"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"သင်သတ်မှတ်သည့် မြို့တော် မရှိသေးပါ"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"၎င်းမြို့တော်ကို ပေါင်းထည့်ပြီးပါပြီ"</string>
diff --git a/res/values-nb/array.xml b/res/values-nb/array.xml
index e2f0ca6..0f0835c 100644
--- a/res/values-nb/array.xml
+++ b/res/values-nb/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala by"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havanna"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>Sydpolen"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>Sydpolen<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh-byen"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muskat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"Y<xliff:g id="SEPARATOR">=</xliff:g>Yangôn"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh-byen"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulan Bator"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 2e9be72..7cb0aeb 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"På"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Av"</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="6506982899651975645">"Ringetone for alarm"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Tilpasset ringelyd"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Tidtakeren er utgått"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Lydløs"</string>
<string name="ringtone" msgid="9110746249688559579">"Ringetone"</string>
<string name="time" msgid="8067216534232296518">"Tidspunkt"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"I morgen"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Slumrer til <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Kommende alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Alarmen du gikk glipp av er slettet"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Mindre enn ett minutt igjen"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> igjen"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> igjen"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> igjen"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Mindre enn ett minutt igjen"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> igjen"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"igjen"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"igjen"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarmen ringer om mindre enn ett minutt."</item>
<item msgid="6002066367368421848">"Alarmen ringer om <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minutter</item>
<item quantity="one">minutt</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Gradvis øk volumet"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Av"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> sekunder"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sekunder"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Slå av etter"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutter</item>
@@ -126,7 +133,8 @@
<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="silent_alarm_summary" msgid="8605302849408279221">"Stille"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Lydløs"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Ukjent"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Slumre eller slå av alarm."</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="4819324081410990368">"Alarmen ringer <xliff:g id="TIME">%s</xliff:g>. Trykk for avbryte."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Laster inn ringetone ..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Lydavspillingstjeneste for nedtellinger som er angitt i Klokke."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Still inn alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Tidtaker"</string>
<string name="menu_clock" msgid="5612760670606829805">"Klokke"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sortér etter navn"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Utvalgte byer"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Gjenoppta"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stopp"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Runde"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Tilbakestill"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pause"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Runde"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Del"</string>
<string name="hours_label" msgid="3393478155635368097">"t"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Tiden min er <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Rundetider:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Runde <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> timer</item>
<item quantity="one">1 time</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Legg til 1 minutt"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Legg til 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Stopp"</string>
- <string name="timer_done" msgid="2375990511982914051">"Ferdig"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Stopp alle tidtakere"</string>
<string name="timer_reset" msgid="7848424809190171640">"Tilbakestill"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Avbryt"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Tidtakeren er avbrutt"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Tiden er ute"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> tidtakere har utløpt"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Tidtaker"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Du kan ha maksimalt fire nedtellinger"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Sett på pause"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Tilbakestill alle tidtakere"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Du er litt av et fartsmonster."</item>
<item msgid="6332879039890727169">"Høst fruktene av arbeidet ditt."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Byer"</string>
<string name="clock_settings" msgid="8317286807280600391">"Klokke"</string>
<string name="clock_style" msgid="2265011060429742344">"Stil"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Endre dato og tid"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analog"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Det er merket av for <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Det er ikke merket av for <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshalløyene"</item>
<item msgid="4196408495909011020">"Midwayøyene"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmer"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Stoppeklokke for å kjøre varslet."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Stoppet"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Prosesserer handlingene fra stoppeklokkevarsler."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Behandler handlingene fra stoppeklokkevarsler."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Satt på pause"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Sveip til høyre for å avvise"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Sveip til venstre for å slumre"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Sveip til venstre for å slumre eller til høyre for å avvise"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Tidtakere"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ringelyd for tidtakeren"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Nedtellingen ble stoppet"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> nedtellinger ble stoppet"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Tidtaker er satt på pause"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> tidtakere satt på pause"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Trykk for å se nedtellingene dine"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> nedtellinger"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Neste nedtelling: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Ingen alarmer"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Ingen alarmer er stilt inn"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"INGEN KOMMENDE VARSLER"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"HH:mm"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"HH:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE – HH:mm"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Ugyldig tid <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Ingen alarm kl. <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Ingen alarmer er angitt"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Ingen etikett er spesifisert"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Ingen alarmer inneholder etiketten"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stoppeklokken er allerede aktiv"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stoppeklokken er ikke aktiv"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stoppeklokken kan ikke tilbakestilles fordi den er aktiv nå"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stoppeklokken er stoppet"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stoppeklokken er satt på pause"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stoppeklokken er tilbakestilt"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stoppeklokken har lagret rundetiden"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stoppeklokken er startet"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Ingen alarm er angitt for dette tidspunktet"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarmen <xliff:g id="ALARM_TIME">%s</xliff:g> er fjernet"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarmen er angitt for <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Ingen tidtaker er angitt"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Tidtakeren er slettet"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"En tidtaker er allerede aktiv"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Kunne ikke fullføre forespørselen – flere tidtakere er tilgjengelige"</string>
- <string name="timer_started" msgid="6715582052946641641">"Tidtakeren er startet"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Det finnes ingen tidtakere"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Det finnes flere enn én tidtaker"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Tidtakeren er fjernet."</string>
<string name="timer_created" msgid="4381027137335885547">"Tidtakeren er opprettet"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Ugyldig tidtakerlengde"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Tidtakeren er tilbakestilt"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Tidtakeren kan ikke tilbakestilles fordi den er aktiv. Stopp tidtakeren for å tilbakestille."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Tidtakeren er allerede stoppet"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Tidtakeren er slettet"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Tidtakeren er startet"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Ugyldig tidtakerlengde"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Ingen by er valgt"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Byen du har angitt, er ikke tilgjengelig"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Den byen er allerede lagt til"</string>
diff --git a/res/values-ne-rNP/array.xml b/res/values-ne-rNP/array.xml
index 89ec474..732e7f3 100644
--- a/res/values-ne-rNP/array.xml
+++ b/res/values-ne-rNP/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"फ <xliff:g id="SEPARATOR">=</xliff:g> फोर्टलेजा"</item>
<item msgid="5801558418916235541">"ग <xliff:g id="SEPARATOR">=</xliff:g> ग्रान्ड टर्क"</item>
<item msgid="2103759276235503048">"ग <xliff:g id="SEPARATOR">=</xliff:g> ग्रेनेडा"</item>
- <item msgid="1490069759176391533">"ग <xliff:g id="SEPARATOR">=</xliff:g> ग्वाटेमालामा"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>ग्वाटेमाला सहर"</item>
<item msgid="525959305652046261">"ग <xliff:g id="SEPARATOR">=</xliff:g> गुयाना"</item>
<item msgid="7565596629973190931">"ह <xliff:g id="SEPARATOR">=</xliff:g> ह्यालिफ्याक्स"</item>
<item msgid="3811169155065582644">"ह <xliff:g id="SEPARATOR">=</xliff:g> हवाना"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ट <xliff:g id="SEPARATOR">=</xliff:g> टोरन्टो"</item>
<item msgid="1506838283840737263">"भ <xliff:g id="SEPARATOR">=</xliff:g> भ्याङ्कुभर"</item>
<item msgid="8935386104773857399">"व <xliff:g id="SEPARATOR">=</xliff:g> विन्निपेग"</item>
- <item msgid="1132634022412399582">"द <xliff:g id="SEPARATOR">=</xliff:g> दक्षिण ध्रुव"</item>
+ <item msgid="498429228419399474">"द <xliff:g id="SEPARATOR">=</xliff:g> दक्षिण ध्रुव<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ल <xliff:g id="SEPARATOR">=</xliff:g> लङ्गिएरबेन"</item>
<item msgid="3784788073896028355">"अ <xliff:g id="SEPARATOR">=</xliff:g> अल्माटी"</item>
<item msgid="7895695236056852523">"अ <xliff:g id="SEPARATOR">=</xliff:g> अम्मान"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ग <xliff:g id="SEPARATOR">=</xliff:g> गाजा"</item>
<item msgid="2359068282340162319">"ह <xliff:g id="SEPARATOR">=</xliff:g> हेब्रोन"</item>
<item msgid="6223396610551759129">"ह <xliff:g id="SEPARATOR">=</xliff:g> हो चि मिन्ह"</item>
- <item msgid="4731022818651322736">"ह <xliff:g id="SEPARATOR">=</xliff:g> हङकङ"</item>
+ <item msgid="3439764751788710130">"ह <xliff:g id="SEPARATOR">=</xliff:g> हङकङ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"इ <xliff:g id="SEPARATOR">=</xliff:g> इस्तान्बुल"</item>
<item msgid="758800913783999425">"ज <xliff:g id="SEPARATOR">=</xliff:g> जकार्ता"</item>
<item msgid="8956406398692698126">"ज <xliff:g id="SEPARATOR">=</xliff:g> जेरुसेलम"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"म <xliff:g id="SEPARATOR">=</xliff:g> मनिला"</item>
<item msgid="6033964325069060422">"म <xliff:g id="SEPARATOR">=</xliff:g> मस्कट"</item>
<item msgid="6077458941399984780">"न <xliff:g id="SEPARATOR">=</xliff:g> नोम पेन"</item>
- <item msgid="935474308903572975">"प <xliff:g id="SEPARATOR">=</xliff:g> प्योङ्याङ"</item>
+ <item msgid="1245515372520913197">"प <xliff:g id="SEPARATOR">=</xliff:g> प्योङ्याङ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"क<xliff:g id="SEPARATOR">=</xliff:g> कतार"</item>
<item msgid="1667243110545095146">"र <xliff:g id="SEPARATOR">=</xliff:g> रङ्गुन"</item>
<item msgid="4460370766685855731">"र <xliff:g id="SEPARATOR">=</xliff:g> रियाद"</item>
<item msgid="4229224905931739201">"स <xliff:g id="SEPARATOR">=</xliff:g> सैगोन"</item>
<item msgid="8705359848250215620">"स <xliff:g id="SEPARATOR">=</xliff:g> सियोल"</item>
- <item msgid="583367295371395814">"स <xliff:g id="SEPARATOR">=</xliff:g> संघाइ"</item>
+ <item msgid="3814881931186962624">"स <xliff:g id="SEPARATOR">=</xliff:g> संघाइ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"स <xliff:g id="SEPARATOR">=</xliff:g> सिंगापुर"</item>
- <item msgid="1972491729911039207">"त <xliff:g id="SEPARATOR">=</xliff:g> ताइपे"</item>
+ <item msgid="8982451946156859368">"त <xliff:g id="SEPARATOR">=</xliff:g> ताइपे<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"त <xliff:g id="SEPARATOR">=</xliff:g> तेहरान"</item>
<item msgid="8629402941285674273">"त <xliff:g id="SEPARATOR">=</xliff:g> तेल अबिब"</item>
- <item msgid="8499164674454654525">"ट <xliff:g id="SEPARATOR">=</xliff:g> टोकियो"</item>
+ <item msgid="76330681636547168">"ट <xliff:g id="SEPARATOR">=</xliff:g> टोकियो<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"उ <xliff:g id="SEPARATOR">=</xliff:g> उल्लानबाटर"</item>
<item msgid="2028626988021468640">"ब <xliff:g id="SEPARATOR">=</xliff:g> बर्मुडा"</item>
<item msgid="4527109966513690429">"क <xliff:g id="SEPARATOR">=</xliff:g> क्यानरी"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"र <xliff:g id="SEPARATOR">=</xliff:g> रेनो"</item>
<item msgid="9155068631060038769">"ब <xliff:g id="SEPARATOR">=</xliff:g> ब्ल्याक रक सिटी"</item>
<item msgid="8498761319928979900">"द <xliff:g id="SEPARATOR">=</xliff:g> दोहा"</item>
- <item msgid="8307897251088048641">"ब <xliff:g id="SEPARATOR">=</xliff:g> बेइजिङ"</item>
+ <item msgid="5327010922199714808">"ब <xliff:g id="SEPARATOR">=</xliff:g> बेइजिङ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"म <xliff:g id="SEPARATOR">=</xliff:g> मुम्बई"</item>
<item msgid="6668274273067049125">"द <xliff:g id="SEPARATOR">=</xliff:g> दिल्ली"</item>
- <item msgid="2933410189478233292">"ओ <xliff:g id="SEPARATOR">=</xliff:g> ओसाका"</item>
+ <item msgid="7199039603593847813">"ओ <xliff:g id="SEPARATOR">=</xliff:g> ओसाका<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ल <xliff:g id="SEPARATOR">=</xliff:g> लाहोर"</item>
<item msgid="1448378291805481500">"स <xliff:g id="SEPARATOR">=</xliff:g> सना"</item>
<item msgid="5233119846682408301">"ब <xliff:g id="SEPARATOR">=</xliff:g> बार्सिलोना"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"क <xliff:g id="SEPARATOR">=</xliff:g> क्याम्ब्रिज"</item>
<item msgid="759409010285366934">"क <xliff:g id="SEPARATOR">=</xliff:g> किर्कल्यान्ड"</item>
<item msgid="6308007059287569663">"म <xliff:g id="SEPARATOR">=</xliff:g> म्याडिसन"</item>
- <item msgid="6971636434858330021">"ग <xliff:g id="SEPARATOR">=</xliff:g> गुआङ्जाओ"</item>
+ <item msgid="2077617905582224600">"ग <xliff:g id="SEPARATOR">=</xliff:g> गुआङ्जाओ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"ह <xliff:g id="SEPARATOR">=</xliff:g> हैदराबाद"</item>
<item msgid="3032295682584784261">"र <xliff:g id="SEPARATOR">=</xliff:g> रेस्टन"</item>
<item msgid="7722837296297332268">"ब <xliff:g id="SEPARATOR">=</xliff:g> बेलो होरिजोन्ट"</item>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index c0ad05f..9b13cf4 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"घडी देखाउनुहोस्"</string>
<string name="hide_clock" msgid="3217727306480505694">"घडी लुकाउनुहोस्"</string>
<string name="label" msgid="162189613902857319">"लेबल"</string>
+ <string name="on_switch" msgid="2297966258029227449">"सक्रिय"</string>
+ <string name="off_switch" msgid="3381070073851148013">"निष्क्रिय"</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="6506982899651975645">"अलार्म रिङटोन"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"अनुकूलन रिङटोन"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"टाइमरको म्याद सकियो"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"मौन"</string>
<string name="ringtone" msgid="9110746249688559579">"रिङटोन"</string>
<string name="time" msgid="8067216534232296518">"समय"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"भोली"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> सम्म स्नुज गर्दै"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"आउने आलार्म"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"छुटेको आलार्म हटाइएको छ"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"एक मिनेटभन्दा कम बाँकी"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> बाँकी"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> बाँकी"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> बाँकी"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"एक मिनेटभन्दा कम बाँकी"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="MINUTES">%2$s</xliff:g> बाँकी"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"बाँकी"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"बाँकी"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"अहिलेबाट एक मिनेटभन्दा कम समयका लागि अलार्म सेट गरिएको छ।"</item>
<item msgid="6002066367368421848">"अहिलेबाट <xliff:g id="DAYS">%1$s</xliff:g>का लागि अलार्म सेट गरिएको छ।"</item>
@@ -101,6 +104,10 @@
<item quantity="other">मिनेट</item>
<item quantity="one">मिनेट</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"बिस्तारै मात्रा बढाउनुहोस्"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"बन्द"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> सेकेन्ड"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"सेकेन्ड"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"यस पछि मौन"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> मिनेट</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"उल्टाउनुहोस्"</string>
<string name="delete" msgid="5732434972457000541">"मेटाउनुहोस्"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"अलार्म भोल्युम"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"मौन"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"मौन"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"अज्ञात"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"अलार्म स्नुज गर्नुहोस् वा खारेज गर्नुहोस्"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (स्नुज भयो)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"<xliff:g id="TIME">%s</xliff:g>का लागि अलार्म सेट गरियो। रद्द गर्न छुनुहोस्।"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"रिङटोन लोड गर्दै…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"घडीहरूका लागि आवाज प्लेब्याक सेवा घडीमा सेट गरियो।"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"अलार्म सेट गर्नुहोस्"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"आलार्म"</string>
<string name="menu_timer" msgid="6459070074762877114">"घडी"</string>
<string name="menu_clock" msgid="5612760670606829805">"घडी"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"नामबाट क्रमबद्ध गर्नुहोस्"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"छानिएका शहरहरू"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"फेरि सुरु गर्नुहोस्"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"सुरु गर्नुहोस्"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"रोक्नुहोस्"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ल्याप"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"पुनःसेट गर्नुहोस्"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"सुरु गर्नुहोस्"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"ल्याप"</string>
<string name="sw_share_button" msgid="4478648110382859382">"साझेदारी गर्नुहोस्"</string>
<string name="hours_label" msgid="3393478155635368097">"घण्टा"</string>
<string name="minutes_label" msgid="3568098128251438588">"मिनेट"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"मेरो समय <xliff:g id="TIME">%s</xliff:g> हो"</string>
<string name="sw_share_laps" msgid="614390674795945007">"ल्याप समय:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"ल्याप <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> घण्टा</item>
<item quantity="one">1 घण्टा</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"१ मिनेट थप्नुहोस्"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"१ मिनट थप्नुहोस्"</string>
<string name="timer_stop" msgid="3361154678667736722">"रोक्नुहोस्"</string>
- <string name="timer_done" msgid="2375990511982914051">"भयो"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"सबै टाइमरहरू रोक्नुहोस्"</string>
<string name="timer_reset" msgid="7848424809190171640">"पुनःसेट गर्नुहोस्"</string>
<string name="timer_cancel" msgid="3572868404230815644">"रद्द गर्नुहोस्"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"टाइमर खारेज गरियो"</string>
<string name="timer_times_up" msgid="9190440395938519009">"समय सकियो"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> टाइमरहरूको म्याद समाप्त भयो"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"घडी"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"४ टाइमर अधिकतम"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"रोक्नुहोस्"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"सबै टाइमरहरू रिसेट गर्नुहोस्"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"तपाईँ पक्कै पनि तेजिलो डेमन हुनुहुन्छ।"</item>
<item msgid="6332879039890727169">"तपाईँको मेहेनतको फलको आनन्द लिनुहोस्।"</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"शहरहरू"</string>
<string name="clock_settings" msgid="8317286807280600391">"घडी"</string>
<string name="clock_style" msgid="2265011060429742344">"शैली"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"मिति र समय परिवर्तन गर्नुहोस्"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"एनालग"</item>
<item msgid="8483930821046925592">"डिजिटल"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":००"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":३०"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> जाँच गरियो"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> जाँच हटाइयो"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"मार्सल टापु"</item>
<item msgid="4196408495909011020">"मिडवे टापु"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"जाकार्ता"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"सचेतकहरू"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"सूचना सञ्चालन गर्न स्टपवाच सेवा"</string>
- <string name="swn_stopped" msgid="783124901663086172">"रोकियो"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"टाइमर सूचनाहरूबाट कार्यहरूको प्रसोधन गर्छ।"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"स्टपवाच सूचनाहरूबाट कार्यहरूको प्रसोधन गर्छ।"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"रोकिएको छ"</string>
<string name="description_direction_right" msgid="5709209043267548985">"खारेज गर्नका लागि दायाँ स्वाइप गर्नुहोस्"</string>
<string name="description_direction_left" msgid="7448141043674998679">"स्नूजको लागि बायाँ स्वाइप गर्नुहोस्"</string>
<string name="description_direction_both" msgid="1841309486023845685">"स्नूजको लागि बायाँ वा खारेज गर्नका लागि दायाँ स्वाइप गर्नुहोस्"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"टाइमरहरू"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"टाइमरको रिङटोन"</string>
<string name="timer_stopped" msgid="2730331837832462008">"घडी रोकियो"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> घडीहरू रोकिए"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"टाइमर रोकियो"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> टाइमरहरू रोकिए"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"तपाईँको घडी हेर्न छुनुहोस्"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> घडीहरू"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"अर्को घडी: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"आलार्महरू छैनन्"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"अलार्म सेट छैन"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"कुनै अगामी आलार्महरू छैनन्"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"अमान्य समय <xliff:g id="INVALID_HOUR">%d</xliff:g> : <xliff:g id="INVALID_MINUTES">%d</xliff:g><xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g> : <xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>मा कुनै अलार्म छैन"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"कुनै तालिकाबद्ध अलार्म छैन"</string>
<string name="no_label_specified" msgid="2008482054428460626">"कुनै लेबल निर्दष्ट गरिएको छैन"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"कुनै अलार्ममा लेबल छैन"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"स्टपवाच पहिले नै चलिरहेको छ"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"स्टपवाच चलिरहेको छैन"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"स्टपवाच चलिरहेका कारणले रिसेट गर्न सकिँदैन"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"स्टपवाच रोकियो"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"स्टपवाच रोकिएको छ"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"स्टपवाच रिसेट गर्नुहोस्"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"स्टपवाचलाई ल्याप गरियो"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"स्टपवाच सुरु भयो"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"यस समयका लागि कुनै कार्यतालिका मिलाइएको छैन"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> अलार्म खारेज गरियो"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g>का लागि अलार्म सेट गरियो"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"कुनै घडी सेट भएको छैन"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"घडी मेटियो"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"घडी पहिले नै चलिरहेको छ"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"तपाईँको अनुरोध सम्पन्न गर्न असमर्थ, धेरै घडीहरू उपलब्ध छन्"</string>
- <string name="timer_started" msgid="6715582052946641641">"घडी सुरु भयो"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"कुनै टाइमरहरू अवस्थित छैनन्"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"एक भन्दा बढी टाइमर अवस्थित छन्"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"टाइमर हटाइएको छ।"</string>
<string name="timer_created" msgid="4381027137335885547">"टाइमर सिर्जना गरियो"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"अमान्य टाइमर लम्बाइ"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"घडी रिसेट गरियो"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"यो अझै चलिरहेका कारणले घडी रिसेट हुन सक्दैन। रिसेट गर्न घडी रोक्नुहोस्।"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"घडी पहिले नै रोकियो"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"घडी मेटियो"</string>
+ <string name="timer_started" msgid="6715582052946641641">"घडी सुरु भयो"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"अमान्य टाइमर लम्बाइ"</string>
<string name="no_city_selected" msgid="1007596865203283741">"कुनै सहर चयन गरिएको छैन"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"तपाईँले निर्दिष्ट गरेको सहर उपलब्ध छैन"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"त्यो सहर पहिले नै थप गरिएको छ"</string>
diff --git a/res/values-nl/array.xml b/res/values-nl/array.xml
index 84b92ca..89b42bb 100644
--- a/res/values-nl/array.xml
+++ b/res/values-nl/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala-stad"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"Z<xliff:g id="SEPARATOR">=</xliff:g>Zuidpool"</item>
+ <item msgid="498429228419399474">"Z<xliff:g id="SEPARATOR">=</xliff:g>Zuidpool<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Alma-Ata"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minhstad"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanboel"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jeruzalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manilla"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyad"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoel"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canarische Eilanden"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Haiderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 9fc72b1..7b1b0a0 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"Aan"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Uit"</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="6506982899651975645">"Beltoon voor alarm"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Aangepaste beltoon"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Timer verlopen"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Stil"</string>
<string name="ringtone" msgid="9110746249688559579">"Beltoon"</string>
<string name="time" msgid="8067216534232296518">"Tijd"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Morgen"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Snoozen tot <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Volgend alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Je gemiste alarm is verwijderd"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Nog minder dan een minuut"</item>
- <item msgid="83197792732433351">"Nog <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Nog <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Nog <xliff:g id="HOURS">%1$s</xliff:g> en <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Nog minder dan een minuut"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> resterend"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"resterend"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"resterend"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarm gaat over minder dan 1 minuut af."</item>
<item msgid="6002066367368421848">"Alarm gaat over <xliff:g id="DAYS">%1$s</xliff:g> af."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minuten</item>
<item quantity="one">minuut</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Volume geleidelijk verhogen"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Uit"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> seconden"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"seconden"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Stil na"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuten</item>
@@ -126,7 +133,8 @@
<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="silent_alarm_summary" msgid="8605302849408279221">"Stil"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Stil"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Onbekend"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Alarm later herhalen of uitschakelen."</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="4819324081410990368">"Alarm is ingesteld voor <xliff:g id="TIME">%s</xliff:g>. Raak aan om te annuleren."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Beltoon laden…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Geluidsweergaveservice voor timers ingesteld in Klok."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Alarm instellen"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Timer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Klok"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sorteren op naam"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Geselecteerde plaatsen"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Hervatten"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Starten"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stoppen"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Ronde"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Resetten"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Starten"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pauze"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Ronde"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Delen"</string>
<string name="hours_label" msgid="3393478155635368097">"u"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Mijn tijd is <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Rondetijden:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Ronde <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Nr. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Nr. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> uur</item>
<item quantity="one">1 uur</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 minuut toevoegen"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 min. toevoegen"</string>
<string name="timer_stop" msgid="3361154678667736722">"Stoppen"</string>
- <string name="timer_done" msgid="2375990511982914051">"Gereed"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Alle timers stoppen"</string>
<string name="timer_reset" msgid="7848424809190171640">"Resetten"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Annuleren"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Timer geannuleerd"</string>
<string name="timer_times_up" msgid="9190440395938519009">"De tijd is om"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> timers verlopen"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Timer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Maximaal 4 timers"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pauzeren"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Alle timers resetten"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Je bent wel erg snel."</item>
<item msgid="6332879039890727169">"Profiteer van je inspanningen."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Plaatsen"</string>
<string name="clock_settings" msgid="8317286807280600391">"Klok"</string>
<string name="clock_style" msgid="2265011060429742344">"Stijl"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Datum en tijd wijzigen"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analoog"</item>
<item msgid="8483930821046925592">"Digitaal"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> aangevinkt"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> niet aangevinkt"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshalleilanden"</item>
<item msgid="4196408495909011020">"Midway Island"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmen"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Stopwatchservice die de melding beheert"</string>
- <string name="swn_stopped" msgid="783124901663086172">"Gestopt"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Verwerkt acties van timermeldingen."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Verwerkt acties van stopwatchmeldingen."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Onderbroken"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Veeg naar rechts om te sluiten"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Veeg naar links om de snoozestand in te schakelen"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Veeg naar links om te snoozen of naar rechts om te sluiten"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Timers"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Beltoon van timer"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Timer gestopt"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> timers gestopt"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Timer gepauzeerd"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> timers gepauzeerd"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Tik om je timers te bekijken"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> timers"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Volgende timer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Geen alarmen"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Geen alarmen"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"GEEN AANKOMENDE ALARMEN"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Ongeldige tijd: <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Geen alarm om <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Geen geplande alarmen"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Geen label opgegeven"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Er zijn geen alarmen die het label bevatten"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stopwatch loopt al"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stopwatch loopt niet"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stopwatch kan niet opnieuw worden ingesteld omdat deze actief is"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stopwatch gestopt"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stopwatch onderbroken"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stopwatch opnieuw ingesteld"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Tussentijd ingesteld door stopwatch"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stopwatch gestart"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Geen alarm gepland op deze tijd"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> alarm gesloten"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm is ingesteld voor <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Geen timer ingesteld"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Timer verwijderd"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Timer loopt al"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Je verzoek kan niet worden voltooid. Er zijn meerdere timers beschikbaar."</string>
- <string name="timer_started" msgid="6715582052946641641">"Timer gestart"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Geen timers ingesteld"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Er zijn meerdere timers ingesteld"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"De timer is verwijderd."</string>
<string name="timer_created" msgid="4381027137335885547">"Timer gemaakt"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Ongeldige timerduur"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Timer gereset"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"De timer kan niet worden gereset omdat deze nog loopt. Stop de timer om deze te resetten."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Timer is al gestopt"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Timer verwijderd"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Timer gestart"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Ongeldige timerduur"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Geen plaats geselecteerd"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"De opgegeven plaats is niet beschikbaar"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Deze plaats is al toegevoegd"</string>
diff --git a/res/values-pa-rIN/array.xml b/res/values-pa-rIN/array.xml
index 06efa2c..5c072f4 100644
--- a/res/values-pa-rIN/array.xml
+++ b/res/values-pa-rIN/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ਫ<xliff:g id="SEPARATOR">=</xliff:g>ਫੋਰਟਾਲੈਜ਼ਾ"</item>
<item msgid="5801558418916235541">"ਗ<xliff:g id="SEPARATOR">=</xliff:g>ਗ੍ਰਾਂਡ ਤੁਰਕ"</item>
<item msgid="2103759276235503048">"ਗ<xliff:g id="SEPARATOR">=</xliff:g>ਗ੍ਰੇਨਾਡਾ"</item>
- <item msgid="1490069759176391533">"ਗ<xliff:g id="SEPARATOR">=</xliff:g>ਗੁਆਟੇਮਾਲਾ"</item>
+ <item msgid="6216160110733510854">"ਗ<xliff:g id="SEPARATOR">=</xliff:g>ਗੁਆਟੇਮਾਲਾ ਸਿਟੀ"</item>
<item msgid="525959305652046261">"ਗ<xliff:g id="SEPARATOR">=</xliff:g>ਗੁਆਨਾ"</item>
<item msgid="7565596629973190931">"ਹ<xliff:g id="SEPARATOR">=</xliff:g>ਹੈਲੀਫੈਕਸ"</item>
<item msgid="3811169155065582644">"ਹ<xliff:g id="SEPARATOR">=</xliff:g>ਹਵਾਨਾ"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ਟ<xliff:g id="SEPARATOR">=</xliff:g>ਟੋਰੰਟੋ"</item>
<item msgid="1506838283840737263">"ਵ<xliff:g id="SEPARATOR">=</xliff:g>ਵੈਨਕੂਵਰ"</item>
<item msgid="8935386104773857399">"ਵ<xliff:g id="SEPARATOR">=</xliff:g>ਵਿਨੀਪੈਗ"</item>
- <item msgid="1132634022412399582">"ਸ<xliff:g id="SEPARATOR">=</xliff:g>ਸਾਊਥ ਪੋਲੈ"</item>
+ <item msgid="498429228419399474">"ਸ<xliff:g id="SEPARATOR">=</xliff:g>ਸਾਊਥ ਪੋਲੈ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ਲ<xliff:g id="SEPARATOR">=</xliff:g>ਲੋਂਗੀਈਅਰਬਿਆਨ"</item>
<item msgid="3784788073896028355">"ਅ<xliff:g id="SEPARATOR">=</xliff:g>ਅਲਮੈਟੀ"</item>
<item msgid="7895695236056852523">"ਅ<xliff:g id="SEPARATOR">=</xliff:g>ਅਮਾਨ"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ਗ<xliff:g id="SEPARATOR">=</xliff:g>ਗਾਜ਼ਾ"</item>
<item msgid="2359068282340162319">"ਹ<xliff:g id="SEPARATOR">=</xliff:g>ਹੈਬਰੋਨ"</item>
<item msgid="6223396610551759129">"ਹ<xliff:g id="SEPARATOR">=</xliff:g>ਹੋ ਚੀ ਮਿਨ੍ਹ"</item>
- <item msgid="4731022818651322736">"ਹ<xliff:g id="SEPARATOR">=</xliff:g>ਹਾਂਗ ਕਾਂਗ"</item>
+ <item msgid="3439764751788710130">"ਹ<xliff:g id="SEPARATOR">=</xliff:g>ਹਾਂਗ ਕਾਂਗ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"ਇ<xliff:g id="SEPARATOR">=</xliff:g>ਇਸਤਾਨਬੁਲ"</item>
<item msgid="758800913783999425">"ਜ<xliff:g id="SEPARATOR">=</xliff:g>ਜਕਾਰਤਾ"</item>
<item msgid="8956406398692698126">"ਜ<xliff:g id="SEPARATOR">=</xliff:g>ਜੇਰੁਸਲੇਮ"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"ਮ<xliff:g id="SEPARATOR">=</xliff:g>ਮਨੀਲਾ"</item>
<item msgid="6033964325069060422">"ਮ<xliff:g id="SEPARATOR">=</xliff:g>ਮਸਕਟ"</item>
<item msgid="6077458941399984780">"ਪ<xliff:g id="SEPARATOR">=</xliff:g>ਫਨੋਮ ਪੈਨ੍ਹ"</item>
- <item msgid="935474308903572975">"ਪ<xliff:g id="SEPARATOR">=</xliff:g>ਪਿਓਂਗਯਾਂਗ"</item>
+ <item msgid="1245515372520913197">"ਪ<xliff:g id="SEPARATOR">=</xliff:g>ਪਿਓਂਗਯਾਂਗ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"ਕ<xliff:g id="SEPARATOR">=</xliff:g>ਕਤਰ"</item>
<item msgid="1667243110545095146">"ਰ<xliff:g id="SEPARATOR">=</xliff:g>ਰੰਗੂਨ"</item>
<item msgid="4460370766685855731">"ਰ<xliff:g id="SEPARATOR">=</xliff:g>ਰਿਆਧ"</item>
<item msgid="4229224905931739201">"ਸ<xliff:g id="SEPARATOR">=</xliff:g>ਸਾਈਗੋਨ"</item>
<item msgid="8705359848250215620">"ਸ<xliff:g id="SEPARATOR">=</xliff:g>ਸਿਓਲ"</item>
- <item msgid="583367295371395814">"ਸ<xliff:g id="SEPARATOR">=</xliff:g>ਸ਼ੰਘਾਈ"</item>
+ <item msgid="3814881931186962624">"ਸ<xliff:g id="SEPARATOR">=</xliff:g>ਸ਼ੰਘਾਈ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"ਸ<xliff:g id="SEPARATOR">=</xliff:g>ਸਿੰਗਾਪੁਰ"</item>
- <item msgid="1972491729911039207">"ਤ<xliff:g id="SEPARATOR">=</xliff:g>ਤਾਈਪੇਈ"</item>
+ <item msgid="8982451946156859368">"ਤ<xliff:g id="SEPARATOR">=</xliff:g>ਤਾਈਪੇਈ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"ਤ<xliff:g id="SEPARATOR">=</xliff:g>ਤੇਹਰਾਨ"</item>
<item msgid="8629402941285674273">"ਤ<xliff:g id="SEPARATOR">=</xliff:g>ਟੈਲ ਅਵੀਵ"</item>
- <item msgid="8499164674454654525">"ਟ<xliff:g id="SEPARATOR">=</xliff:g>ਟੋਕਿਓ"</item>
+ <item msgid="76330681636547168">"ਟ<xliff:g id="SEPARATOR">=</xliff:g>ਟੋਕਿਓ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"ਉ<xliff:g id="SEPARATOR">=</xliff:g>ਉਲਾਨਬਾਤਰ"</item>
<item msgid="2028626988021468640">"ਬ<xliff:g id="SEPARATOR">=</xliff:g>ਬਰਮੁਡਾ"</item>
<item msgid="4527109966513690429">"ਕ<xliff:g id="SEPARATOR">=</xliff:g>ਕੈਨਰੀ"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"ਰ<xliff:g id="SEPARATOR">=</xliff:g>ਰੈਨੋ"</item>
<item msgid="9155068631060038769">"ਬ<xliff:g id="SEPARATOR">=</xliff:g>ਬਲੈਕ ਰੌਕ ਸਿਟੀ"</item>
<item msgid="8498761319928979900">"ਦੋ<xliff:g id="SEPARATOR">=</xliff:g>ਦੋਹਾ"</item>
- <item msgid="8307897251088048641">"ਬ<xliff:g id="SEPARATOR">=</xliff:g>ਬੀਜਿੰਗ"</item>
+ <item msgid="5327010922199714808">"ਬ<xliff:g id="SEPARATOR">=</xliff:g>ਬੀਜਿੰਗ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"ਮ<xliff:g id="SEPARATOR">=</xliff:g>ਮੁੰਬਈ"</item>
<item msgid="6668274273067049125">"ਦ<xliff:g id="SEPARATOR">=</xliff:g>ਦਿੱਲੀ"</item>
- <item msgid="2933410189478233292">"ਓ<xliff:g id="SEPARATOR">=</xliff:g>ਓਸਾਕਾ"</item>
+ <item msgid="7199039603593847813">"ਓ<xliff:g id="SEPARATOR">=</xliff:g>ਓਸਾਕਾ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ਲ<xliff:g id="SEPARATOR">=</xliff:g>ਲਾਹੌਰ"</item>
<item msgid="1448378291805481500">"ਸ<xliff:g id="SEPARATOR">=</xliff:g>ਸਾਨਾ"</item>
<item msgid="5233119846682408301">"ਬ<xliff:g id="SEPARATOR">=</xliff:g>ਬਾਰਸੀਲੋਨਾ"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"ਕ<xliff:g id="SEPARATOR">=</xliff:g>ਕੈਂਬ੍ਰਿਜ਼"</item>
<item msgid="759409010285366934">"ਕ<xliff:g id="SEPARATOR">=</xliff:g>ਕਿਰਕਲੈਂਡ"</item>
<item msgid="6308007059287569663">"ਮ<xliff:g id="SEPARATOR">=</xliff:g>ਮੈਡੀਸਨ"</item>
- <item msgid="6971636434858330021">"ਗ<xliff:g id="SEPARATOR">=</xliff:g>ਗੁਆਂਗਜ਼ੌ"</item>
+ <item msgid="2077617905582224600">"ਗ<xliff:g id="SEPARATOR">=</xliff:g>ਗੁਆਂਗਜ਼ੌ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"ਹ<xliff:g id="SEPARATOR">=</xliff:g>ਹੈਦਰਾਬਾਦ"</item>
<item msgid="3032295682584784261">"ਰ<xliff:g id="SEPARATOR">=</xliff:g>ਰੈਸਟਨ"</item>
<item msgid="7722837296297332268">"ਬ<xliff:g id="SEPARATOR">=</xliff:g>ਬੈਲੋ ਹੋਰੀਜ਼ੋਂਟੈ"</item>
diff --git a/res/values-pa-rIN/strings.xml b/res/values-pa-rIN/strings.xml
index 6c0425d..2de443f 100644
--- a/res/values-pa-rIN/strings.xml
+++ b/res/values-pa-rIN/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"ਘੜੀ ਦਿਖਾਓ"</string>
<string name="hide_clock" msgid="3217727306480505694">"ਘੜੀ ਲੁਕਾਓ"</string>
<string name="label" msgid="162189613902857319">"ਲੇਬਲ"</string>
+ <string name="on_switch" msgid="2297966258029227449">"ਚਾਲੂ"</string>
+ <string name="off_switch" msgid="3381070073851148013">"ਬੰਦ"</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="6506982899651975645">"ਅਲਾਰਮ ਰਿੰਗਟੋਨ"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"ਕਸਟਮ ਰਿੰਗਟੋਨ"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"ਟਾਈਮਰ ਦੀ ਮਿਆਦ ਪੁੱਗੀ"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"ਸਾਈਲੈਂਟ"</string>
<string name="ringtone" msgid="9110746249688559579">"ਰਿੰਗਟੋਨ"</string>
<string name="time" msgid="8067216534232296518">"ਸਮਾਂ"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"ਕੱਲ੍ਹ ਨੂੰ"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> ਤੱਕ ਸਨੂਜ਼ਿੰਗ"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"ਅਪਕਮਿੰਗ ਅਲਾਰਮ"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"ਤੁਹਾਡਾ ਮਿਸਡ ਅਲਾਰਮ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਬਾਕੀ।"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> ਬਾਕੀ"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> ਬਾਕੀ"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ਬਾਕੀ"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਬਾਕੀ।"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ਬਾਕੀ"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"ਬਾਕੀ"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"ਬਾਕੀ"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"ਅਲਾਰਮ ਹੁਣ ਤੋਂ 1 ਮਿੰਟ ਤੋਂ ਘੱਟ ਲਈ ਸੈਟ ਕੀਤਾ।"</item>
<item msgid="6002066367368421848">"ਅਲਾਰਮ ਹੁਣ ਤੋਂ <xliff:g id="DAYS">%1$s</xliff:g> ਲਈ ਸੈਟ ਕੀਤਾ।"</item>
@@ -101,6 +104,10 @@
<item quantity="one">ਮਿੰਟ</item>
<item quantity="other">ਮਿੰਟ</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"ਹੌਲੀ-ਹੌਲੀ ਵੌਲਯੂਮ ਵਧਾਓ"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"ਬੰਦ"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> ਸਕਿੰਟ"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"ਸਕਿੰਟ"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"ਇਸਤੋਂ ਬਾਅਦ ਸਾਈਲੈਂਸ"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> ਮਿੰਟ</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"ਵਾਪਸ ਲਿਆਓ"</string>
<string name="delete" msgid="5732434972457000541">"ਮਿਟਾਓ"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"ਅਲਾਰਮ ਵੌਲਯੂਮ"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"ਸਾਈਲੈਂਟ"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"ਸਾਈਲੈਂਟ"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"ਅਗਿਆਤ"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"ਅਲਾਰਮ ਸਨੂਜ਼ ਕਰੋ ਜਾਂ ਬਰਖਾਸਤ ਕਰੋ।"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ਸਨੂਜ਼ ਕੀਤਾ)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"ਅਲਾਰਮ <xliff:g id="TIME">%s</xliff:g> ਲਈ ਸੈਟ ਕੀਤਾ। ਰੱਦ ਕਰਨ ਲਈ ਛੋਹਵੋ।"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"ਰਿੰਗਟੋਨ ਲੋਡ ਕਰ ਰਿਹਾ ਹੈ…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"ਟਾਈਮਰਾਂ ਲਈ ਅਵਾਜ਼ ਪਲੇਬੈਕ ਸੇਵਾ ਘੜੀ ਵਿੱਚ ਸੈਟ ਕੀਤੀ।"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"ਅਲਾਰਮ ਸੈਟ ਕਰੋ"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"ਅਲਾਰਮ"</string>
<string name="menu_timer" msgid="6459070074762877114">"ਟਾਈਮਰ"</string>
<string name="menu_clock" msgid="5612760670606829805">"ਘੜੀ"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"ਨਾਮ ਮੁਤਾਬਕ ਛਾਂਟੋ"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"ਚੁਣੇ ਗਏ ਸ਼ਹਿਰ"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"ਮੁੜ ਸ਼ੁਰੂ ਕਰੋ"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"ਚਾਲੂ ਕਰੋ"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"ਰੋਕੋ"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ਲੈਪ"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"ਰੀਸੈਟ ਕਰੋ"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"ਚਾਲੂ ਕਰੋ"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"ਲੈਪ"</string>
<string name="sw_share_button" msgid="4478648110382859382">"ਸ਼ੇਅਰ ਕਰੋ"</string>
<string name="hours_label" msgid="3393478155635368097">"ਘੰਟਾ"</string>
<string name="minutes_label" msgid="3568098128251438588">"ਮਿੰਟ"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"ਮੇਰਾ ਸਮਾਂ ਹੈ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"ਲੈਪ ਸਮੇਂ:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"ਲੈਪ <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ਘੰਟੇ</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ਘੰਟੇ</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 ਮਿੰਟ ਜੋੜੋ"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 ਮਿੰਟ ਜੋੜੋ"</string>
<string name="timer_stop" msgid="3361154678667736722">"ਰੋਕੋ"</string>
- <string name="timer_done" msgid="2375990511982914051">"ਹੋ ਗਿਆ"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"ਸਾਰੇ ਟਾਈਮਰ ਬੰਦ ਕਰੋ"</string>
<string name="timer_reset" msgid="7848424809190171640">"ਰੀਸੈਟ ਕਰੋ"</string>
<string name="timer_cancel" msgid="3572868404230815644">"ਰੱਦ ਕਰੋ"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"ਟਾਈਮਰ ਰੱਦ ਕੀਤਾ"</string>
<string name="timer_times_up" msgid="9190440395938519009">"ਟਾਈਪ ਪੂਰਾ ਹੋ ਗਿਆ"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ਟਾਈਮਰਾਂ ਦੀ ਮਿਆਦ ਪੁੱਗੀ"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"ਟਾਈਮਰ"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"ਅਧਿਕਤਮ 4 ਟਾਈਮਰ"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"ਰੋਕੋ"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"ਸਾਰੇ ਟਾਈਮਰ ਰੀਸੈਟ ਕਰੋ"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"ਤੁਸੀਂ ਬਿਲਕੁਲ ਸਪੀਡ ਡੈਮਨ ਹੋ।"</item>
<item msgid="6332879039890727169">"ਆਪਣੀ ਮਿਹਨਤ ਦੇ ਫਲ ਦਾ ਅਨੰਦ ਮਾਣੋ।"</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"ਸ਼ਹਿਰ"</string>
<string name="clock_settings" msgid="8317286807280600391">"ਘੜੀ"</string>
<string name="clock_style" msgid="2265011060429742344">"ਸਟਾਈਲ"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"ਤਾਰੀਖ & ਸਮਾਂ ਬਦਲੋ"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"ਐਨਾਲਾਗ"</item>
<item msgid="8483930821046925592">"ਡਿਜੀਟਲ"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ਚੁਣਿਆ"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> ਨਹੀਂ ਚੁਣਿਆ"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"ਮਾਰਸ਼ਲ ਆਈਲੈਂਡਸ"</item>
<item msgid="4196408495909011020">"ਮਿਡਵੇ ਆਈਲੈਂਡ"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"ਜਕਾਰਤਾ"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"ਅਲਾਰਮ"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"ਸੂਚਨਾ ਚਲਾਉਣ ਲਈ ਸਟੌਪਵੌਚ ਸੇਵਾ।"</string>
- <string name="swn_stopped" msgid="783124901663086172">"ਰੋਕਿਆ ਗਿਆ"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"ਟਾਈਮਰ ਦੀਆਂ ਸੂਚਨਾਵਾਂ ਤੋਂ ਕਾਰਵਾਈਆਂ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਕਰਦੀ ਹੈ।"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"ਵਿਰਾਮ ਘੜੀ ਦੀਆਂ ਸੂਚਨਾਵਾਂ ਤੋਂ ਕਾਰਵਾਈਆਂ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਕਰਦੀ ਹੈ।"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"ਰੁਕਿਆ"</string>
<string name="description_direction_right" msgid="5709209043267548985">"ਬਰਖਾਸਤ ਕਰਨ ਲਈ ਸੱਜੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰੋ"</string>
<string name="description_direction_left" msgid="7448141043674998679">"ਸਨੂਜ਼ ਕਰਨ ਲਈ ਖੱਬੇ ਪਾਸੇ ਸਵਾਈਪ ਕਰੋ"</string>
<string name="description_direction_both" msgid="1841309486023845685">"ਸਨੂਜ਼ ਕਰਨ ਲਈ ਖੱਬੇ ਸਵਾਈਪ ਕਰੋ ਜਾਂ ਬਰਖ਼ਾਸਤ ਕਰਨ ਲਈ ਸੱਜੇ ਸਵਾਈਪ ਕਰੋ"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"ਟਾਈਮਰ"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"ਟਾਈਮਰ ਰਿੰਗਟੋਨ"</string>
<string name="timer_stopped" msgid="2730331837832462008">"ਟਾਈਮਰ ਰੋਕਿਆ ਗਿਆ"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> ਟਾਈਮਰ ਰੋਕੇ ਗਏ"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"ਟਾਈਮਰ ਰੋਕਿਆ"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> ਟਾਈਮਰ ਰੋਕੇ ਗਏ"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"ਆਪਣੇ ਟਾਈਮਰ ਦੇਖਣ ਲਈ ਛੋਹਵੋ"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ਟਾਈਮਰ"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"ਅਗਲਾ ਟਾਈਮਰ: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"ਕੋਈ ਅਲਾਰਮ ਨਹੀਂ"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"ਕੋਈ ਅਲਾਰਮ ਸੈਟ ਨਹੀਂ ਕੀਤੇ"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ਕੋਈ ਅਪਕਮਿੰਗ ਅਲਾਰਮ ਨਹੀਂ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"ਅਪ੍ਰਮਾਣਿਕ ਸਮਾਂ <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> ਤੇ ਕੋਈ ਅਲਾਰਮ ਨਹੀਂ"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"ਕੋਈ ਨਿਯਤ ਕੀਤੇ ਅਲਾਰਮ ਨਹੀਂ"</string>
<string name="no_label_specified" msgid="2008482054428460626">"ਕੋਈ ਲੇਬਲ ਨਿਰਦਿਸ਼ਟ ਨਹੀਂ ਕੀਤਾ"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"ਕਿਸੇ ਅਲਾਰਮ ਵਿੱਚ ਲੇਬਲ ਨਹੀਂ ਹੈ"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"ਸਟੌਪਵੌਚ ਪਹਿਲਾਂ ਹੀ ਚੱਲ ਰਹੀ ਹੈ"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"ਸਟੌਪਵੌਚ ਨਹੀਂ ਚੱਲ ਰਹੀ ਹੈ"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"ਸਟੌਪਵੌਚ ਰੀਸੈਟ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ ਕਿਉਂਕਿ ਇਹ ਚੱਲ ਰਹੀ ਹੈ"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"ਸਟੌਪਵੌਚ ਰੋਕੀ ਗਈ"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"ਸਟੌਪਵਾਚ ਰੁਕਿਆ"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"ਸਟੌਪਵੌਚ ਰੀਸੈਟ ਕੀਤੀ"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"ਸਟੌਪਵੌਚ ਅੱਗੇ ਨਿੱਕਲ ਗਈ"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"ਸਟੌਪਵੌਚ ਚਾਲੂ ਕੀਤੀ"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"ਇਸ ਸਮੇਂ ਲਈ ਨਿਯਤ ਕੀਤਾ ਕੋਈ ਅਲਾਰਮ ਨਹੀਂ"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> ਅਲਾਰਮ ਬਰਖਾਸਤ ਕੀਤਾ"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"ਅਲਾਰਮ <xliff:g id="ALARM_TIME">%s</xliff:g> ਲਈ ਸੈਟ ਕੀਤਾ ਗਿਆ ਹੈ"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"ਕੋਈ ਟਾਈਮਰ ਸੈਟ ਨਹੀਂ ਕੀਤਾ"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"ਟਾਈਮਰ ਮਿਟਾਇਆ ਗਿਆ"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"ਟਾਈਮਰ ਪਹਿਲਾਂ ਹੀ ਚੱਲ ਰਿਹਾ ਹੈ"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"ਤੁਹਾਡੀ ਬੇਨਤੀ ਨੂੰ ਪੂਰਾ ਕਰਨ ਵਿੱਚ ਅਸਮਰੱਥ, ਮਲਟੀਪਲ ਟਾਈਮਰ ਉਪਲਬਧ ਹਨ"</string>
- <string name="timer_started" msgid="6715582052946641641">"ਟਾਈਮਰ ਸ਼ੁਰੂ ਹੋਇਆ"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"ਟਾਈਮਰ ਮੌਜੂਦ ਨਹੀਂ ਹਨ"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"ਇੱਕ ਤੋਂ ਵੱਧ ਟਾਈਮਰ ਮੌਜੂਦ ਹਨ"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"ਟਾਈਮਰ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।"</string>
<string name="timer_created" msgid="4381027137335885547">"ਟਾਈਮਰ ਬਣਾਇਆ"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"ਅਪ੍ਰਮਾਣਿਕ ਟਾਈਮਰ ਲੰਮਾਈ"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"ਟਾਈਮਰ ਰੀਸੈਟ ਕੀਤਾ"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"ਟਾਈਮਰ ਰੀਸੈਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਕਿਉਂਕਿ ਇਹ ਹੁਣ ਵੀ ਚੱਲ ਰਿਹਾ ਹੈ। ਰੀਸੈਟ ਕਰਨ ਲਈ ਟਾਈਮਰ ਰੋਕੋ।"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"ਟਾਈਮਰ ਪਹਿਲਾਂ ਹੀ ਰੋਕਿਆ ਗਿਆ"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"ਟਾਈਮਰ ਮਿਟਾਇਆ ਗਿਆ"</string>
+ <string name="timer_started" msgid="6715582052946641641">"ਟਾਈਮਰ ਸ਼ੁਰੂ ਹੋਇਆ"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"ਅਪ੍ਰਮਾਣਿਕ ਟਾਈਮਰ ਲੰਮਾਈ"</string>
<string name="no_city_selected" msgid="1007596865203283741">"ਕੋਈ ਸ਼ਹਿਰ ਨਹੀਂ ਚੁਣਿਆ ਗਿਆ"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਨਿਰਦਿਸ਼ਟ ਕੀਤਾ ਸ਼ਹਿਰ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"ਉਹ ਸ਼ਹਿਰ ਪਹਿਲਾਂ ਹੀ ਜੋੜਿਆ ਗਿਆ ਹੈ"</string>
diff --git a/res/values-pl/array.xml b/res/values-pl/array.xml
index e12565c..46bfcf5 100644
--- a/res/values-pl/array.xml
+++ b/res/values-pl/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Gwatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Gwatemala"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Gujana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Hawana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"B<xliff:g id="SEPARATOR">=</xliff:g>Biegun południowy"</item>
+ <item msgid="498429228419399474">"B<xliff:g id="SEPARATOR">=</xliff:g>Biegun południowy<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Ałmaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"S<xliff:g id="SEPARATOR">=</xliff:g>Stambuł"</item>
<item msgid="758800913783999425">"D<xliff:g id="SEPARATOR">=</xliff:g>Dżakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerozolima"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muskat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"K<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangun"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Rijad"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Sajgon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Szanghaj"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Szanghaj<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Tajpej"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Tajpej<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Awiw"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ułan Bator"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermudy"</item>
<item msgid="4527109966513690429">"W<xliff:g id="SEPARATOR">=</xliff:g>Wyspy Kanaryjskie"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Pekin"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Pekin<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"B<xliff:g id="SEPARATOR">=</xliff:g>Bombaj"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahaur"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanton"</item>
+ <item msgid="2077617905582224600">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanton<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hajdarabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index d9df069..945fd1c 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"Wł."</string>
+ <string name="off_switch" msgid="3381070073851148013">"Wył."</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="6506982899651975645">"Dźwięk alarmu"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Dzwonek niestandardowy"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Minutnik wygasł"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Cichy"</string>
<string name="ringtone" msgid="9110746249688559579">"Dzwonek"</string>
<string name="time" msgid="8067216534232296518">"Godzina"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Jutro"</string>
@@ -62,12 +65,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Drzemka do <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Nadchodzący alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Zignorowany przez Ciebie alarm został usunięty"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Jeszcze niecała minuta"</item>
- <item msgid="83197792732433351">"Jeszcze <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Jeszcze <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Jeszcze <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Jeszcze niecała minuta"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Jeszcze <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"pozostała"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"pozostało"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarm włączy się za mniej niż 1 minutę"</item>
<item msgid="6002066367368421848">"Alarm włączy się za <xliff:g id="DAYS">%1$s</xliff:g>"</item>
@@ -115,6 +118,10 @@
<item quantity="other">minuty</item>
<item quantity="one">minuta</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Stopniowo zwiększaj głośność"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Wył."</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> s"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"s"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Wycisz za"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="few"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuty</item>
@@ -142,7 +149,8 @@
<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="silent_alarm_summary" msgid="8605302849408279221">"Cichy"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Cichy"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Nieznany"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Włącz drzemkę lub anuluj alarm."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (drzemka)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarm ustawiony na <xliff:g id="TIME">%s</xliff:g>. Dotknij, aby anulować."</string>
@@ -167,8 +175,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Wczytywanie dzwonka…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Usługa odtwarzania dźwięku minutników ustawionych w zegarze."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Ustaw alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Minutnik"</string>
<string name="menu_clock" msgid="5612760670606829805">"Zegar"</string>
@@ -183,10 +189,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sortuj według nazwy"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Wybrane miasta"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Wznów"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stop"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Okrążenie"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Resetuj"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Wstrzymaj"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Okrążenie"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Udostępnij"</string>
<string name="hours_label" msgid="3393478155635368097">"g"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -198,10 +204,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Mój czas to <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Czasy okrążeń:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Okrążenie <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"<xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"<xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> godziny</item>
<item quantity="many"><xliff:g id="NUMBER">%d</xliff:g> godzin</item>
@@ -227,12 +229,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Dodaj 1 minutę"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Dodaj 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Stop"</string>
- <string name="timer_done" msgid="2375990511982914051">"Gotowe"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Zatrzymaj wszystkie minutniki"</string>
<string name="timer_reset" msgid="7848424809190171640">"Resetuj"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Anuluj"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Minutnik anulowany"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Czas minął"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Minutniki, których czas upłynął: <xliff:g id="NUM_TIMERS">%d</xliff:g>"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Minutnik"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"maksymalnie cztery minutniki"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Wstrzymaj"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Resetuj wszystko"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Niezły z Ciebie demon prędkości."</item>
<item msgid="6332879039890727169">"Ciesz się owocami pracy."</item>
@@ -249,6 +255,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Miasta"</string>
<string name="clock_settings" msgid="8317286807280600391">"Zegar"</string>
<string name="clock_style" msgid="2265011060429742344">"Wygląd"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Zmień datę i godzinę"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogowy"</item>
<item msgid="8483930821046925592">"Cyfrowy"</item>
@@ -263,6 +270,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> zaznaczono"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> niezaznaczono"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Wyspy Marshalla"</item>
<item msgid="4196408495909011020">"Midway"</item>
@@ -351,13 +360,17 @@
<item msgid="5176858645450908751">"Dżakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmy"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Usługa stopera odpowiedzialna za powiadamianie."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Zatrzymano"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Przetwarza działania z powiadomień minutnika."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Przetwarza działania z powiadomień stopera."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Wstrzymano"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Przesuń w prawo, by zamknąć"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Przesuń w lewo, by uśpić"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Przesuń w lewo, by odłożyć, lub w prawo, by zamknąć"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Minutniki"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Dzwonek minutnika"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Minutnik zatrzymany"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> zatrzymane minutniki"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Minutnik wstrzymany"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Minutniki (<xliff:g id="NUMBER">%d</xliff:g>) wstrzymane"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Kliknij, by zobaczyć minutniki"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> minutniki"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Następny minutnik: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -385,35 +398,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Brak alarmów"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Brak alarmów"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"BRAK NADCHODZĄCYCH ALARMÓW"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Nieprawidłowa godzina <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Brak alarmu o <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Brak zaplanowanych alarmów"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nie określono etykiety"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Brak alarmów zawierających etykietę"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stoper jest już uruchomiony"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stoper nie jest uruchomiony"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Nie można zresetować stopera, bo jest uruchomiony"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stoper został zatrzymany"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stoper został wstrzymany"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stoper został zresetowany"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stoper zapisał czas pośredni"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stoper został uruchomiony"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Na tę godzinę nie ma żadnego alarmu"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarm na <xliff:g id="ALARM_TIME">%s</xliff:g> został zamknięty"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm jest ustawiony na <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Minutnik nie jest ustawiony"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Minutnik został usunięty"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Minutnik jest już uruchomiony"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Nie można zrealizować żądania, bo dostępnych jest kilka stoperów"</string>
- <string name="timer_started" msgid="6715582052946641641">"Minutnik został uruchomiony"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Brak minutników"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Istnieje więcej niż jeden minutnik"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Minutnik został usunięty."</string>
<string name="timer_created" msgid="4381027137335885547">"Minutnik został utworzony"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Nieprawidłowy czas w minutniku"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Minutnik został zresetowany"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Nie można zresetować minutnika, bo wciąż jest uruchomiony. Najpierw go zatrzymaj."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Minutnik jest już zatrzymany"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Minutnik został usunięty"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Minutnik został uruchomiony"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Nieprawidłowy czas w minutniku"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Nie wybrałeś miasta"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Podane miasto jest niedostępne"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"To miasto zostało już dodane"</string>
diff --git a/res/values-pt-rPT/array.xml b/res/values-pt-rPT/array.xml
index 6c1156b..19b713b 100644
--- a/res/values-pt-rPT/array.xml
+++ b/res/values-pt-rPT/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Granada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"C<xliff:g id="SEPARATOR">=</xliff:g>Cidade da Guatemala"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guiana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>Pólo Sul"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>Pólo Sul<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amã"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hébron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istambul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jacarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalém"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Mascate"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"C<xliff:g id="SEPARATOR">=</xliff:g>Catar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangum"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riade"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigão"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"X<xliff:g id="SEPARATOR">=</xliff:g>Xangai"</item>
+ <item msgid="3814881931186962624">"X<xliff:g id="SEPARATOR">=</xliff:g>Xangai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapura"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipé"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipé<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teerão"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Telavive"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tóquio"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tóquio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermudas"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canárias"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Pequim"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Pequim<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Deli"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaca"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaca<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Saná"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"C<xliff:g id="SEPARATOR">=</xliff:g>Cantão"</item>
+ <item msgid="2077617905582224600">"C<xliff:g id="SEPARATOR">=</xliff:g>Cantão<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hiderabade"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index d79523d..1b38ab3 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"Ativado"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Desativado"</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="6506982899651975645">"Toque do Alarme"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Toque personalizado"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Temporizador expirado"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silencioso"</string>
<string name="ringtone" msgid="9110746249688559579">"Toque"</string>
<string name="time" msgid="8067216534232296518">"Hora"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Amanhã"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Com alarme até <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Próximo alarme"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"O alarme perdido foi eliminado"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Falta menos de um minuto"</item>
- <item msgid="83197792732433351">"Faltam <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Faltam <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Faltam <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Menos de um minuto restante"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> restantes"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"restante"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"restantes"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarme definido para daqui a menos de 1 minuto."</item>
<item msgid="6002066367368421848">"Alarme definido para daqui a <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minutos</item>
<item quantity="one">minuto</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Aumentar o volume gradualmente"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Desativado"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> segundos"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"segundos"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Silenciar depois de"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutos</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Reverter"</string>
<string name="delete" msgid="5732434972457000541">"Eliminar"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volume do alarme"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencioso"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silencioso"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Desconhecido"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Suspender ou ignorar 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="4819324081410990368">"Alarme definido para a(s) <xliff:g id="TIME">%s</xliff:g>. Toque para cancelar."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"A carregar toque..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Serviço de reprodução de som para temporizadores definidos no Relógio."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Configurar alarme"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarme"</string>
<string name="menu_timer" msgid="6459070074762877114">"Temporizador"</string>
<string name="menu_clock" msgid="5612760670606829805">"Relógio"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Ordenar pelo nome"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Cidades selecionadas"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Retomar"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Iniciar"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Parar"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Volta"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Repor"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Iniciar"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pausa"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Volta"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Partilhar"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"O meu tempo é <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Tempos de volta:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Volta <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"N.º <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"N.º <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> horas</item>
<item quantity="one">1 hora</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Adicionar 1 Minuto"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Adicionar 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Parar"</string>
- <string name="timer_done" msgid="2375990511982914051">"Concluído"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Parar todos os temporiz."</string>
<string name="timer_reset" msgid="7848424809190171640">"Repor"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Cancelar"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Temporizador cancelado"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Terminou o tempo"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> temporizadores expiraram"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Temporizador"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Máximo de 4 temporizadores"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Interromper"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Repor tds temp."</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"É um verdadeiro ás da velocidade."</item>
<item msgid="6332879039890727169">"Aproveite os frutos do seu trabalho."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Cidades"</string>
<string name="clock_settings" msgid="8317286807280600391">"Relógio"</string>
<string name="clock_style" msgid="2265011060429742344">"Estilo"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Alterar data e hora"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analógico"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> marcado(a)"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> desmarcado(a)"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Ilhas Marshall"</item>
<item msgid="4196408495909011020">"Ilha de Midway"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jacarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmes"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Serviço de cronómetro para executar a notificação."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Parado"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Processa as ações das notificações do temporizador."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Processa as ações das notificações do cronómetro."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Em pausa"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Deslizar rapidamente para a direita para ignorar"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Deslizar rapidamente para a esquerda para suspender"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Deslizar rapidamente para a esquerda para suspender ou para a direita para ignorar"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Temporizadores"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Toque do temporizador"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Temporizador parado"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores parados"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Temporizador interrompido"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> temporiz. interrompidos"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Toque para ver os seus temporizadores"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> temporizadores"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Temp. seguinte: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Sem alarmes"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Sem alarm. def."</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NENHUM ALARME PRÓXIMO"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Hora inválida <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Nenhum alarme às <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Nenhum alarme programado"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nenhuma etiqueta especificada"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Nenhum alarme contém a etiqueta"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"O cronómetro já está a ser executado"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"O cronómetro não está a ser executado"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Não é possível repor o cronómetro porque está em execução"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Cronómetro interrompido"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Cronómetro colocado em pausa"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Reposição do cronómetro"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Uma volta registada no cronómetro"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Cronómetro iniciado"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Nenhum alarme programado para esta hora"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarme das <xliff:g id="ALARM_TIME">%s</xliff:g> ignorado"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"O alarme está definido para <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Nenhum temporizador definido"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Temporizador eliminado"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"O temporizador já está a ser executado"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Não foi possível concluir o pedido. Estão disponíveis vários temporizadores"</string>
- <string name="timer_started" msgid="6715582052946641641">"Temporizador iniciado"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Não existem temporizadores"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Existe mais do que um temporizador"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"O temporizador foi removido."</string>
<string name="timer_created" msgid="4381027137335885547">"Temporizador criado"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Duração inválida do temporizador"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Temporizador reposto"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Não é possível repor o temporizador porque ainda está a ser executado. Pare-o para o repor."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"O temporizador já foi parado"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Temporizador eliminado"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Temporizador iniciado"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Duração inválida do temporizador"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Nenhuma cidade selecionada"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"A cidade especificada não está disponível"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Essa cidade já foi adicionada"</string>
diff --git a/res/values-pt/array.xml b/res/values-pt/array.xml
index 4c4d607..ad7ddfb 100644
--- a/res/values-pt/array.xml
+++ b/res/values-pt/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Granada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Cidade da Guatemala"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guiana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>Pólo Sul"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>Pólo Sul<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amã"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebrom"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istambul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jacarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalém"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Mascate"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"C<xliff:g id="SEPARATOR">=</xliff:g>Catar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riad"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"X<xliff:g id="SEPARATOR">=</xliff:g>Xangai"</item>
+ <item msgid="3814881931186962624">"X<xliff:g id="SEPARATOR">=</xliff:g>Xangai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"C<xliff:g id="SEPARATOR">=</xliff:g>Cingapura"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teerã"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tóquio"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tóquio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermudas"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canárias"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Pequim"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Pequim<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Délhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Saná"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 800674f..c29ecbe 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"Ativado"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Desativado"</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="6506982899651975645">"Toque do alarme"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Toque personalizado"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Timer expirado"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silencioso"</string>
<string name="ringtone" msgid="9110746249688559579">"Toque"</string>
<string name="time" msgid="8067216534232296518">"Horário"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Amanhã"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Em soneca até <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Alarme próximo"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Seu alarme perdido foi excluído"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Resta menos de um minuto"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> restantes"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> restantes"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> restantes"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Resta menos de um minuto"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> restantes"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"restante"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"restantes"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarme definido para menos de um minuto a partir de agora."</item>
<item msgid="6002066367368421848">"Alarme definido para <xliff:g id="DAYS">%1$s</xliff:g> a partir de agora."</item>
@@ -101,6 +104,10 @@
<item quantity="one">minutes</item>
<item quantity="other">minutos</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Aumentar gradualmente o volume"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Desativado"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> segundos"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"segundos"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Silenciar depois de"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minutos</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Reverter"</string>
<string name="delete" msgid="5732434972457000541">"Excluir"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volume do alarme"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silencioso"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silencioso"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Desconhecido"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Soneca ou cancelar alarme"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (em modo soneca)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarme definido para as <xliff:g id="TIME">%s</xliff:g>. Toque para cancelar."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Carregando toque…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Serviço de reprodução de som para timers definidos no Relógio."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Definir alarme"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarme"</string>
<string name="menu_timer" msgid="6459070074762877114">"Timer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Relógio"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Classificar por nome"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Cidades selecionadas"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Retomar"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Iniciar"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Parar"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Volta"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Zerar"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Iniciar"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pausar"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Volta"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Compartilhar"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Meu tempo é <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Tempos de volta:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Volta <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Nº <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Nº <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> hours</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> horas</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Adicionar um minuto"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Adicionar 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Parar"</string>
- <string name="timer_done" msgid="2375990511982914051">"Concluído"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Parar todos os timers"</string>
<string name="timer_reset" msgid="7848424809190171640">"Zerar"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Cancelar"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Timer cancelado"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Tempo esgotado"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> timers expirados"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Timer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Máximo: 4 timers"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pausar"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Red. timers"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Você é o rei da velocidade."</item>
<item msgid="6332879039890727169">"Colha os frutos de seu trabalho."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Cidades"</string>
<string name="clock_settings" msgid="8317286807280600391">"Relógio"</string>
<string name="clock_style" msgid="2265011060429742344">"Estilo"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Alterar data e hora"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analógico"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Cidade marcada: <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Cidade desmarcada: <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Ilhas Marshall"</item>
<item msgid="4196408495909011020">"Ilhas Midway"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jacarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmes"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Serviço de cronômetro para executar a notificação."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Parado"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Processa ações de notificações do timer."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Processa ações de notificações do cronômetro."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Pausado"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Deslize para a direita para dispensar"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Deslize para a esquerda para adiar"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Deslize para a esquerda para adiar ou para a direita para dispensar"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Timers"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Toque do timer"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Timer parado"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> timers parados"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Timer pausado"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> timers pausados"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Toque para ver seus timers"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> timers"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Próximo timer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Nenhum alarme"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Nenhum alarme"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NENHUM ALARME PRÓXIMO"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"HH:mm"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Hora inválida: <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Nenhum alarme às <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Nenhum alarme programado"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nenhum marcador especificado"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Nenhum alarme contém o marcador"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"O cronômetro já está sendo executado"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"O cronômetro não está em execução"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Não é possível redefinir o cronômetro porque ele está sendo executado"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Cronômetro interrompido"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Cronômetro pausado"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Cronômetro redefinido"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Voltas do cronômetro"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Cronômetro iniciado"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Nenhum alarme programado para este horário"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarme <xliff:g id="ALARM_TIME">%s</xliff:g> dispensado"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"O alarme está definido para <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Nenhum timer definido"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Timer excluído"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Timer já em execução"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Não foi possível concluir a solicitação. Há vários timers disponíveis"</string>
- <string name="timer_started" msgid="6715582052946641641">"Timer iniciado"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Não há nenhum timer"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Existe mais de um timer"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"O timer foi removido."</string>
<string name="timer_created" msgid="4381027137335885547">"Timer criado"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Duração do timer inválida"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Timer redefinido"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Não é possível redefinir o timer porque ele ainda está em execução. Pare o timer para redefini-lo."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Timer já parado"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Timer excluído"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Timer iniciado"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Duração do timer inválida"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Nenhuma cidade selecionada"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"A cidade especificada não está disponível"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Esta cidade já foi adicionada"</string>
diff --git a/res/values-ro/array.xml b/res/values-ro/array.xml
index 8c93252..4b69a8d 100644
--- a/res/values-ro/array.xml
+++ b/res/values-ro/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"C<xliff:g id="SEPARATOR">=</xliff:g>Ciudad de Guatemala"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"P<xliff:g id="SEPARATOR">=</xliff:g>Polul Sud"</item>
+ <item msgid="498429228419399474">"P<xliff:g id="SEPARATOR">=</xliff:g>Polul Sud<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"I<xliff:g id="SEPARATOR">=</xliff:g>Ierusalim"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Phenian"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Phenian<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"Y<xliff:g id="SEPARATOR">=</xliff:g>Yangon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riad"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulan Bator"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canare"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index aef56e8..ab45eb0 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -20,20 +20,23 @@
<string name="alarm_list_title" msgid="7589940465292950600">"Alarme"</string>
<string name="add_alarm" msgid="5976616107390962899">"Adăugați o alarmă"</string>
<string name="menu_desk_clock" msgid="3241995064554071588">"Ceas de birou"</string>
- <string name="menu_edit_alarm" msgid="7204602994918829751">"Modificați alarma"</string>
- <string name="delete_alarm" msgid="3457780990646206817">"Ștergeți alarma"</string>
- <string name="enable_alarm" msgid="1834599140632142536">"Porniți alarma"</string>
+ <string name="menu_edit_alarm" msgid="7204602994918829751">"Modificaţi alarma"</string>
+ <string name="delete_alarm" msgid="3457780990646206817">"Ștergeţi alarma"</string>
+ <string name="enable_alarm" msgid="1834599140632142536">"Porniţi alarma"</string>
<string name="disable_alarm" msgid="5889378670229554109">"Opriți alarma"</string>
- <string name="delete_alarm_confirm" msgid="6578572637340860840">"Ștergeți această alarmă?"</string>
- <string name="show_clock" msgid="8358759982675616915">"Afișați ceasul"</string>
- <string name="hide_clock" msgid="3217727306480505694">"Ascundeți ceasul"</string>
+ <string name="delete_alarm_confirm" msgid="6578572637340860840">"Ștergeţi această alarmă?"</string>
+ <string name="show_clock" msgid="8358759982675616915">"Afişaţi ceasul"</string>
+ <string name="hide_clock" msgid="3217727306480505694">"Ascundeţi ceasul"</string>
<string name="label" msgid="162189613902857319">"Etichetă"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Activată"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Dezactivată"</string>
<string name="default_label" msgid="5590025289805630372">"Alarmă"</string>
- <string name="set_alarm" msgid="9148359866152726808">"Setați alarma"</string>
+ <string name="set_alarm" msgid="9148359866152726808">"Setaţi alarma"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrare"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Repetă"</string>
<string name="alert" msgid="6506982899651975645">"Ton de apel pentru alarmă"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Ton de sonerie personalizat"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Temporizatorul a expirat"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Silențios"</string>
<string name="ringtone" msgid="9110746249688559579">"Ton de apel"</string>
<string name="time" msgid="8067216534232296518">"Ora"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Mâine"</string>
@@ -60,12 +63,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Se amână până la <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Alarma următoare"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Alarma ratată a fost ștearsă"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"A mai rămas mai puțin de un minut"</item>
- <item msgid="83197792732433351">"Au mai rămas <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Au mai rămas <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Au mai rămas <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"A mai rămas mai puțin de un minut"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Timp rămas: <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"rămas"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"rămase"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarmă setată peste mai puțin de 1 minut din acest moment."</item>
<item msgid="6002066367368421848">"Alarmă setată peste <xliff:g id="DAYS">%1$s</xliff:g> din acest moment."</item>
@@ -108,6 +111,10 @@
<item quantity="other">de minute</item>
<item quantity="one">minut</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Măriți volumul treptat"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Dezactivată"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> (de) secunde"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"secunde"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Dezactivare după"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="few"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minute</item>
@@ -131,13 +138,14 @@
<item msgid="8594709368683324282">"Luni"</item>
</string-array>
<string name="done" msgid="6509722361933858451">"Terminat"</string>
- <string name="revert" msgid="9100911171235162926">"Reveniți"</string>
- <string name="delete" msgid="5732434972457000541">"Ștergeți"</string>
+ <string name="revert" msgid="9100911171235162926">"Reveniţi"</string>
+ <string name="delete" msgid="5732434972457000541">"Ștergeţi"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volum alarmă"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Silențios"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Silențios"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Necunoscut"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Amânați sau anulați alarma."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (amânat)"</string>
- <string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarmă setată pentru <xliff:g id="TIME">%s</xliff:g>. Atingeți pentru a anula."</string>
+ <string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarmă setată pentru <xliff:g id="TIME">%s</xliff:g>. Atingeţi pentru a anula."</string>
<string name="volume_button_setting_title" msgid="6937131248843413357">"Butoane de volum"</string>
<string name="volume_button_dialog_title" msgid="8768042543750036853">"Funcții buton"</string>
<string-array name="volume_button_setting_entries">
@@ -145,22 +153,20 @@
<item msgid="3450979320164769576">"Închideți"</item>
<item msgid="6302517608411378024">"Nu faceți nimic"</item>
</string-array>
- <string name="default_ringtone_setting_title" msgid="4549726190682964245">"Setați tonul de apel prestabilit"</string>
+ <string name="default_ringtone_setting_title" msgid="4549726190682964245">"Setaţi tonul de apel prestabilit"</string>
<string name="alarm_button_description" msgid="740283647046258651">"Alarme"</string>
<string name="gallery_button_description" msgid="1151743663255257668">"Galerie"</string>
<string name="music_button_description" msgid="1626593420810117999">"Muzică"</string>
<string name="nightmode_button_description" msgid="990894208217576381">"Luminozitate redusă"</string>
<string name="home_button_description" msgid="3383859096809056157">"Lansator"</string>
- <string name="desk_clock_button_description" msgid="4207371097361657274">"Afișarea ceasului"</string>
+ <string name="desk_clock_button_description" msgid="4207371097361657274">"Afişarea ceasului"</string>
<string name="label_description" msgid="8736179296142915727">"Etichetă"</string>
<string name="ringtone_description" msgid="7580922112921069925">"Ton de apel"</string>
<string name="weather_fetch_failure" msgid="3425804832021006835">"Informațiile meteo nu sunt disponibile în acest moment."</string>
<string name="alarm_klaxon_service_desc" msgid="2147506334302260256">"Serviciul de redare a sunetului pentru setarea alarmelor în aplicația Ceas."</string>
<string name="loading_ringtone" msgid="6523322777415268044">"Se încarcă tonul soneriei..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Serviciul de redare a sunetului pentru setarea temporizatoarelor în aplicația Ceas."</string>
- <string name="control_set_alarm" msgid="2194676418924016327">"Setați alarma"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
+ <string name="control_set_alarm" msgid="2194676418924016327">"Setaţi alarma"</string>
<string name="menu_alarm" msgid="4772010125376647519">"Alarmă"</string>
<string name="menu_timer" msgid="6459070074762877114">"Temporizator"</string>
<string name="menu_clock" msgid="5612760670606829805">"Ceas"</string>
@@ -174,12 +180,12 @@
<string name="menu_item_sort_by_gmt_offset" msgid="3120860422682721706">"Sortați după oră"</string>
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sortați după nume"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Orașele selectate"</string>
- <string name="sw_resume_button" msgid="2569360966002022248">"Reluați"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Porniți"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Opriți"</string>
+ <string name="sw_resume_button" msgid="2569360966002022248">"Reluaţi"</string>
+ <string name="sw_reset_button" msgid="6616804728322906117">"Resetaţi"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Porniţi"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Întrerupeți"</string>
<string name="sw_lap_button" msgid="6992264696039004233">"Circuit"</string>
- <string name="sw_reset_button" msgid="6616804728322906117">"Resetați"</string>
- <string name="sw_share_button" msgid="4478648110382859382">"Distribuiți"</string>
+ <string name="sw_share_button" msgid="4478648110382859382">"Distribuiţi"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
<string name="seconds_label" msgid="124655952824003246">"s"</string>
@@ -190,10 +196,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Ora mea este <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Timpi circuit:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Circuitul <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"<xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"<xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> ore</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> de ore</item>
@@ -211,17 +213,21 @@
</plurals>
<string name="timer_add_timer" msgid="862733633862574752">"Adăugați un temporizator"</string>
<string name="timer_start" msgid="6158486445614356442">"Start"</string>
- <string name="timer_delete" msgid="8699122001991909302">"Ștergeți"</string>
+ <string name="timer_delete" msgid="8699122001991909302">"Ștergeţi"</string>
<string name="timer_descriptive_delete" msgid="8794915342760383536">"Ștergeți <xliff:g id="NUMBER_STRING">%s</xliff:g>"</string>
<string name="timer_plus_one" msgid="6631211310420106116">"Adăugați 1 minut"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Adăugați 1 min."</string>
<string name="timer_stop" msgid="3361154678667736722">"Opriți"</string>
- <string name="timer_done" msgid="2375990511982914051">"Terminat"</string>
- <string name="timer_reset" msgid="7848424809190171640">"Resetați"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Opriți temporizatoarele"</string>
+ <string name="timer_reset" msgid="7848424809190171640">"Resetaţi"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Anulați"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Temporizator anulat"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Timpul a expirat!"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> temporizatoare expirate"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Temporizator"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Cel mult 4 cronometre"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Întrerupeți"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Resetați-le pe toate"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Sunteți demonul vitezei."</item>
<item msgid="6332879039890727169">"Bucurați-vă de roadele muncii dvs."</item>
@@ -238,6 +244,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Orașe"</string>
<string name="clock_settings" msgid="8317286807280600391">"Ceas"</string>
<string name="clock_style" msgid="2265011060429742344">"Stil"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Schimbați Data și ora"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogic"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -252,6 +259,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Orașul <xliff:g id="CITY_NAME">%s</xliff:g> a fost bifat"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Orașul <xliff:g id="CITY_NAME">%s</xliff:g> a fost debifat"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Insulele Marshall"</item>
<item msgid="4196408495909011020">"Insula Midway"</item>
@@ -340,23 +349,27 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarme"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Serviciul Cronometru pentru notificări."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Oprită"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Procesează acțiunile din notificările de la temporizator."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Procesează acțiunile din notificările de la cronometru."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Întrerupt"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Glisați spre dreapta pentru a închide"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Glisați spre stânga pentru a amâna"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Glisați spre stânga pentru a amâna sau spre dreapta pentru a închide"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Temporizatoare"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ton de sonerie pentru temporizator"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Contor oprit"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Au fost oprite <xliff:g id="NUMBER">%d</xliff:g> contoare"</string>
- <string name="all_timers_stopped_notif" msgid="278532320068394600">"Atingeți pentru a vedea contoarele"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Temporizator întrerupt"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> temporizatoare întrerupte"</string>
+ <string name="all_timers_stopped_notif" msgid="278532320068394600">"Atingeţi pentru a vedea contoarele"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> contoare"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Următorul temporizator: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
<string name="screensaver_settings" msgid="7013450738357352801">"Setări Dream"</string>
<string name="night_mode_title" msgid="5983813889469616299">"Modul Noapte"</string>
<string name="night_mode_summary" msgid="1017350187324162631">"Afișaj cu luminozitate redusă (pentru camere întunecate)"</string>
- <string name="expand_alarm" msgid="7392616528943305020">"Extindeți alarma"</string>
+ <string name="expand_alarm" msgid="7392616528943305020">"Extindeţi alarma"</string>
<string name="collapse_alarm" msgid="3561772046433483980">"Restrângeți alarma"</string>
- <string name="alarm_undo" msgid="5710042601177655254">"anulați"</string>
- <string name="alarm_deleted" msgid="6131529309389084785">"Alarma a fost ștearsă"</string>
+ <string name="alarm_undo" msgid="5710042601177655254">"anulaţi"</string>
+ <string name="alarm_deleted" msgid="6131529309389084785">"Alarma a fost ştearsă"</string>
<string name="slash" msgid="2077577763821006919">"/"</string>
<string name="world_day_of_week_label" msgid="5911196322328341288">"/<xliff:g id="LABEL">%s</xliff:g>"</string>
<string name="next_alarm_description" msgid="2650244835760747046">"Alarma următoare: <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
@@ -367,41 +380,33 @@
<item quantity="other">Ștergeți alarmele selectate?</item>
<item quantity="one">Ștergeți alarma selectată?</item>
</plurals>
- <string name="timer_delete_confirmation" msgid="2815524107015816453">"Ștergeți acest contor?"</string>
- <string name="city_delete_confirmation" msgid="1783441538785676299">"Eliminați acest oraș?"</string>
+ <string name="timer_delete_confirmation" msgid="2815524107015816453">"Ștergeţi acest contor?"</string>
+ <string name="city_delete_confirmation" msgid="1783441538785676299">"Eliminaţi acest oraş?"</string>
<string name="digital_gadget" msgid="2326954556720571358">"Ceas digital"</string>
<string name="no_alarms" msgid="6429431324842022917">"Nu sunt alarme"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Nu sunt alarme"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NU SUNT ALARME VIITOARE"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Oră nevalidă <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Nicio alarmă la <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Nicio alarmă programată"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nicio etichetă specificată"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Nicio alarmă nu conține eticheta"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Cronometrul este pornit deja"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Cronometrul nu este pornit"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Cronometrul nu poate fi resetat, deoarece este în uz"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Cronometrul a fost oprit"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Cronometru întrerupt"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Cronometrul a fost resetat"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Cronometrul a înregistrat o tură"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Cronometrul a fost pornit"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Nicio alarmă programată pentru această oră"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarma de la <xliff:g id="ALARM_TIME">%s</xliff:g> a fost închisă"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarma este setată pentru <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Niciun temporizator setat"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Temporizatorul a fost șters"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Temporizatorul este pornit deja"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Solicitarea nu poate fi finalizată, deoarece sunt disponibile mai multe temporizatoare"</string>
- <string name="timer_started" msgid="6715582052946641641">"Temporizatorul a fost pornit"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Nu există niciun temporizator"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Există mai multe temporizatoare"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Temporizatorul a fost eliminat."</string>
<string name="timer_created" msgid="4381027137335885547">"Temporizator creat"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Durată nevalidă pentru temporizator"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Temporizatorul a fost resetat"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Temporizatorul nu poate fi resetat, deoarece încă este pornit. Opriți temporizatorul pentru a-l reseta."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Temporizatorul este oprit deja"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Temporizatorul a fost șters"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Temporizatorul a fost pornit"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Durată nevalidă pentru temporizator"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Niciun oraș selectat"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Orașul pe care l-ați specificat nu este disponibil"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Orașul a fost adăugat deja"</string>
diff --git a/res/values-ru/array.xml b/res/values-ru/array.xml
index 620ca82..34cfcb7 100644
--- a/res/values-ru/array.xml
+++ b/res/values-ru/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"Ф<xliff:g id="SEPARATOR">=</xliff:g>Форталеза"</item>
<item msgid="5801558418916235541">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гранд-Терк"</item>
<item msgid="2103759276235503048">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гренада"</item>
- <item msgid="1490069759176391533">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемала"</item>
+ <item msgid="6216160110733510854">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемала"</item>
<item msgid="525959305652046261">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гайана"</item>
<item msgid="7565596629973190931">"Г<xliff:g id="SEPARATOR">=</xliff:g>Галифакс"</item>
<item msgid="3811169155065582644">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гавана"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"Т<xliff:g id="SEPARATOR">=</xliff:g>Торонто"</item>
<item msgid="1506838283840737263">"В<xliff:g id="SEPARATOR">=</xliff:g>Ванкувер"</item>
<item msgid="8935386104773857399">"В<xliff:g id="SEPARATOR">=</xliff:g>Виннипег"</item>
- <item msgid="1132634022412399582">"Ю<xliff:g id="SEPARATOR">=</xliff:g>Южный полюс"</item>
+ <item msgid="498429228419399474">"Ю<xliff:g id="SEPARATOR">=</xliff:g>Южный полюс<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"Л<xliff:g id="SEPARATOR">=</xliff:g>Лонгйир"</item>
<item msgid="3784788073896028355">"А<xliff:g id="SEPARATOR">=</xliff:g>Алма-Ата"</item>
<item msgid="7895695236056852523">"А<xliff:g id="SEPARATOR">=</xliff:g>Амман"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"Г<xliff:g id="SEPARATOR">=</xliff:g>Газа"</item>
<item msgid="2359068282340162319">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хеврон"</item>
<item msgid="6223396610551759129">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хошимин"</item>
- <item msgid="4731022818651322736">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гонконг"</item>
+ <item msgid="3439764751788710130">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гонконг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"С<xliff:g id="SEPARATOR">=</xliff:g>Стамбул"</item>
<item msgid="758800913783999425">"Д<xliff:g id="SEPARATOR">=</xliff:g>Джакарта"</item>
<item msgid="8956406398692698126">"И<xliff:g id="SEPARATOR">=</xliff:g>Иерусалим"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"М<xliff:g id="SEPARATOR">=</xliff:g>Манила"</item>
<item msgid="6033964325069060422">"М<xliff:g id="SEPARATOR">=</xliff:g>Маскат"</item>
<item msgid="6077458941399984780">"П<xliff:g id="SEPARATOR">=</xliff:g>Пномпень"</item>
- <item msgid="935474308903572975">"П<xliff:g id="SEPARATOR">=</xliff:g>Пхеньян"</item>
+ <item msgid="1245515372520913197">"П<xliff:g id="SEPARATOR">=</xliff:g>Пхеньян<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"К<xliff:g id="SEPARATOR">=</xliff:g>Катар"</item>
<item msgid="1667243110545095146">"Я<xliff:g id="SEPARATOR">=</xliff:g>Янгон"</item>
<item msgid="4460370766685855731">"Э<xliff:g id="SEPARATOR">=</xliff:g>Эр-Рияд"</item>
<item msgid="4229224905931739201">"С<xliff:g id="SEPARATOR">=</xliff:g>Сайгон"</item>
<item msgid="8705359848250215620">"С<xliff:g id="SEPARATOR">=</xliff:g>Сеул"</item>
- <item msgid="583367295371395814">"Ш<xliff:g id="SEPARATOR">=</xliff:g>Шанхай"</item>
+ <item msgid="3814881931186962624">"Ш<xliff:g id="SEPARATOR">=</xliff:g>Шанхай<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"С<xliff:g id="SEPARATOR">=</xliff:g>Сингапур"</item>
- <item msgid="1972491729911039207">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тайбэй"</item>
+ <item msgid="8982451946156859368">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тайбэй<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тегеран"</item>
<item msgid="8629402941285674273">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тель-Авив"</item>
- <item msgid="8499164674454654525">"Т<xliff:g id="SEPARATOR">=</xliff:g>Токио"</item>
+ <item msgid="76330681636547168">"Т<xliff:g id="SEPARATOR">=</xliff:g>Токио<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"У<xliff:g id="SEPARATOR">=</xliff:g>Улан-Батор"</item>
<item msgid="2028626988021468640">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бермудские острова"</item>
<item msgid="4527109966513690429">"К<xliff:g id="SEPARATOR">=</xliff:g>Канарские острова"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рино"</item>
<item msgid="9155068631060038769">"Б<xliff:g id="SEPARATOR">=</xliff:g>Блэк-Рок-Сити"</item>
<item msgid="8498761319928979900">"Д<xliff:g id="SEPARATOR">=</xliff:g>Доха"</item>
- <item msgid="8307897251088048641">"П<xliff:g id="SEPARATOR">=</xliff:g>Пекин"</item>
+ <item msgid="5327010922199714808">"П<xliff:g id="SEPARATOR">=</xliff:g>Пекин<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"М<xliff:g id="SEPARATOR">=</xliff:g>Мумбаи"</item>
<item msgid="6668274273067049125">"Д<xliff:g id="SEPARATOR">=</xliff:g>Дели"</item>
- <item msgid="2933410189478233292">"О<xliff:g id="SEPARATOR">=</xliff:g>Осака"</item>
+ <item msgid="7199039603593847813">"О<xliff:g id="SEPARATOR">=</xliff:g>Осака<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"Л<xliff:g id="SEPARATOR">=</xliff:g>Лахор"</item>
<item msgid="1448378291805481500">"С<xliff:g id="SEPARATOR">=</xliff:g>Сана"</item>
<item msgid="5233119846682408301">"Б<xliff:g id="SEPARATOR">=</xliff:g>Барселона"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"К<xliff:g id="SEPARATOR">=</xliff:g>Кембридж"</item>
<item msgid="759409010285366934">"К<xliff:g id="SEPARATOR">=</xliff:g>Киркленд"</item>
<item msgid="6308007059287569663">"М<xliff:g id="SEPARATOR">=</xliff:g>Мэдисон"</item>
- <item msgid="6971636434858330021">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гуанчжоу"</item>
+ <item msgid="2077617905582224600">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гуанчжоу<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хайдарабад"</item>
<item msgid="3032295682584784261">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рестон"</item>
<item msgid="7722837296297332268">"Б<xliff:g id="SEPARATOR">=</xliff:g>Белу-Оризонти"</item>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 7080490..34e068d 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Показать часы"</string>
<string name="hide_clock" msgid="3217727306480505694">"Спрятать часы"</string>
<string name="label" msgid="162189613902857319">"Описание"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Вкл."</string>
+ <string name="off_switch" msgid="3381070073851148013">"Выкл."</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="6506982899651975645">"Звонок будильника"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Ваш рингтон"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Время истекло"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Без звука"</string>
<string name="ringtone" msgid="9110746249688559579">"Рингтон"</string>
<string name="time" msgid="8067216534232296518">"Время"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Завтра"</string>
@@ -62,12 +65,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Повтор в <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Следующий будильник"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Пропущенный будильник был удален"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Осталось: меньше минуты"</item>
- <item msgid="83197792732433351">"Осталось: <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Осталось: <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Осталось: <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Осталось: меньше минуты"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Осталось: <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"Осталось:"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"Осталось:"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Будильник зазвонит менее чем через минуту."</item>
<item msgid="6002066367368421848">"Будильник зазвонит через <xliff:g id="DAYS">%1$s</xliff:g>"</item>
@@ -115,6 +118,10 @@
<item quantity="many">минут</item>
<item quantity="other">минуты</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Постепенно увеличивать громкость"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"ВЫКЛ"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> сек."</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"сек."</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Автовыключение"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> минута</item>
@@ -142,7 +149,8 @@
<string name="revert" msgid="9100911171235162926">"Отмена"</string>
<string name="delete" msgid="5732434972457000541">"Удалить"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Громкость будильника"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Без звука"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Без звука"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Неизвестно"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Отложить/выключить будильник"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (отложен)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Повтор в <xliff:g id="TIME">%s</xliff:g>. Нажмите для отмены."</string>
@@ -167,8 +175,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Загрузка мелодии звонка..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Модуль воспроизведения сигналов таймера"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Установить будильник"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Будильник"</string>
<string name="menu_timer" msgid="6459070074762877114">"Таймер"</string>
<string name="menu_clock" msgid="5612760670606829805">"Часы"</string>
@@ -183,10 +189,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Сортировать по названию"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Выбранные города"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Продолжить"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Старт"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Стоп"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Круг"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Сбросить"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Старт"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Приостановить"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Круг"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Отправить"</string>
<string name="hours_label" msgid="3393478155635368097">"ч."</string>
<string name="minutes_label" msgid="3568098128251438588">"м."</string>
@@ -198,10 +204,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Мое время: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Время круга"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Круг <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"<xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"<xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> час</item>
<item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> часа</item>
@@ -227,12 +229,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Добавить 1 минуту"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Добавить 1 мин."</string>
<string name="timer_stop" msgid="3361154678667736722">"Стоп"</string>
- <string name="timer_done" msgid="2375990511982914051">"Готово"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Остановить все таймеры"</string>
<string name="timer_reset" msgid="7848424809190171640">"Сбросить"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Отмена"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Таймер удален"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Время вышло"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Завершено таймеров: <xliff:g id="NUM_TIMERS">%d</xliff:g>"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Таймер"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Можно установить не более четырех таймеров"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Приостановить"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Сбросить все"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Да вы просто Шумахер!"</item>
<item msgid="6332879039890727169">"Вы славно потрудились!"</item>
@@ -249,6 +255,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Города"</string>
<string name="clock_settings" msgid="8317286807280600391">"Часы"</string>
<string name="clock_style" msgid="2265011060429742344">"Стиль"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Изменить дату и время"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Стрелки"</item>
<item msgid="8483930821046925592">"Цифры"</item>
@@ -263,6 +270,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"–"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g>, выбрано"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g>, выбор отменен"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Маршалловы Острова"</item>
<item msgid="4196408495909011020">"Остров Мидуэй"</item>
@@ -351,13 +360,17 @@
<item msgid="5176858645450908751">"Джакарта"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Будильник"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Секундомер для запуска уведомлений"</string>
- <string name="swn_stopped" msgid="783124901663086172">"Остановлен"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Обрабатывает действия из уведомлений таймера."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Обрабатывает действия из уведомлений секундомера."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Приостановлено"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Пролистните вправо, чтобы отключить сигнал"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Пролистните влево, чтобы отложить сигнал"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Проведите влево, чтобы отложить сигнал, или вправо, чтобы отменить его"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Таймеры"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Сигнал таймера"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Таймер остановлен"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Таймеров остановлено: <xliff:g id="NUMBER">%d</xliff:g>"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Таймер приостановлен"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Таймеры (<xliff:g id="NUMBER">%d</xliff:g>) приостановлены"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Нажмите, чтобы посмотреть таймеры"</string>
<string name="timers_in_use" msgid="5570729467344408506">"Таймеров: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"След.: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -385,35 +398,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Будильник отключен"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Нет будильников"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"СИГНАЛОВ НЕТ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"H:mm"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Время (<xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>) указано неверно"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"На <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> не установлено ни одного будильника"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Будильники не установлены"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Ярлык не выбран"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Нет будильников с ярлыками"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Секундомер уже запущен"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Секундомер не запущен"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Сбросить секундомер нельзя, так как он включен"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Секундомер отключен"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Секундомер приостановлен"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Секундомер сброшен"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Круг добавлен"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Секундомер включен"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"На это время не установлено ни одного будильника"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Будильник на <xliff:g id="ALARM_TIME">%s</xliff:g> отключен"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Будильник зазвонит в <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Таймер не установлен"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Таймер удален"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Таймер уже запущен"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Не удалось обработать запрос, так как таймеров несколько"</string>
- <string name="timer_started" msgid="6715582052946641641">"Таймер запущен"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Таймеров нет"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Доступно несколько таймеров"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Таймер удален."</string>
<string name="timer_created" msgid="4381027137335885547">"Таймер создан"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Недопустимая длительность таймера"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Таймер сброшен"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Чтобы сбросить таймер, сначала остановите его."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Таймер уже остановлен"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Таймер удален"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Таймер запущен"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Недопустимая длительность таймера"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Город не выбран"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Не удалось найти такой город"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Такой город уже добавлен"</string>
diff --git a/res/values-si-rLK/array.xml b/res/values-si-rLK/array.xml
index 5e79bcf..e1d3ee0 100644
--- a/res/values-si-rLK/array.xml
+++ b/res/values-si-rLK/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ෆ<xliff:g id="SEPARATOR">=</xliff:g>ෆෝරටලෙසා"</item>
<item msgid="5801558418916235541">"ග<xliff:g id="SEPARATOR">=</xliff:g>ග්රෑන්ඩ් ටර්ක්"</item>
<item msgid="2103759276235503048">"ග<xliff:g id="SEPARATOR">=</xliff:g>ග්රෙනේඩා"</item>
- <item msgid="1490069759176391533">"ග<xliff:g id="SEPARATOR">=</xliff:g>ගෝතමාලාව"</item>
+ <item msgid="6216160110733510854">"ග<xliff:g id="SEPARATOR">=</xliff:g>ගෝතමාලාව නගරය"</item>
<item msgid="525959305652046261">"ග<xliff:g id="SEPARATOR">=</xliff:g>ගයනා"</item>
<item msgid="7565596629973190931">"හ<xliff:g id="SEPARATOR">=</xliff:g>හැලිෆැක්ස්"</item>
<item msgid="3811169155065582644">"හ<xliff:g id="SEPARATOR">=</xliff:g>හවානා"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ට<xliff:g id="SEPARATOR">=</xliff:g>ටොරොන්ටෝ"</item>
<item msgid="1506838283840737263">"ව<xliff:g id="SEPARATOR">=</xliff:g>වැන්කුවර්"</item>
<item msgid="8935386104773857399">"ව<xliff:g id="SEPARATOR">=</xliff:g>විනිපෙග්"</item>
- <item msgid="1132634022412399582">"ද<xliff:g id="SEPARATOR">=</xliff:g>දක්ෂිණ ධ්රැවය"</item>
+ <item msgid="498429228419399474">"ද<xliff:g id="SEPARATOR">=</xliff:g>දක්ෂිණ ධ්රැවය<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ල<xliff:g id="SEPARATOR">=</xliff:g>ලෝන්යිඅර්යෙන්"</item>
<item msgid="3784788073896028355">"අ<xliff:g id="SEPARATOR">=</xliff:g>ඇල්මැටි"</item>
<item msgid="7895695236056852523">"අ<xliff:g id="SEPARATOR">=</xliff:g>අම්මාන්"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ග<xliff:g id="SEPARATOR">=</xliff:g>ගාසා"</item>
<item msgid="2359068282340162319">"හ<xliff:g id="SEPARATOR">=</xliff:g>හෙබ්රොන්"</item>
<item msgid="6223396610551759129">"හ<xliff:g id="SEPARATOR">=</xliff:g>හෝ චි මිං"</item>
- <item msgid="4731022818651322736">"හ<xliff:g id="SEPARATOR">=</xliff:g>හොංකොං"</item>
+ <item msgid="3439764751788710130">"හ<xliff:g id="SEPARATOR">=</xliff:g>හොංකොං<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"ඉ<xliff:g id="SEPARATOR">=</xliff:g>ඉස්තාන්බුල්"</item>
<item msgid="758800913783999425">"ජ<xliff:g id="SEPARATOR">=</xliff:g>ජකර්තා"</item>
<item msgid="8956406398692698126">"ජ<xliff:g id="SEPARATOR">=</xliff:g>ජෙරුසලම්"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"ම<xliff:g id="SEPARATOR">=</xliff:g>මැනිලා"</item>
<item msgid="6033964325069060422">"ම<xliff:g id="SEPARATOR">=</xliff:g>මස්කට්"</item>
<item msgid="6077458941399984780">"න<xliff:g id="SEPARATOR">=</xliff:g>නොම් පෙන්"</item>
- <item msgid="935474308903572975">"ප<xliff:g id="SEPARATOR">=</xliff:g>පියොන්යෑන්"</item>
+ <item msgid="1245515372520913197">"ප<xliff:g id="SEPARATOR">=</xliff:g>පියොන්යෑන්<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"ක<xliff:g id="SEPARATOR">=</xliff:g>කටාර්"</item>
<item msgid="1667243110545095146">"ර<xliff:g id="SEPARATOR">=</xliff:g>රැන්ගුන්"</item>
<item msgid="4460370766685855731">"ර<xliff:g id="SEPARATOR">=</xliff:g>රියාද්"</item>
<item msgid="4229224905931739201">"ස<xliff:g id="SEPARATOR">=</xliff:g>සයිගොන්"</item>
<item msgid="8705359848250215620">"ස<xliff:g id="SEPARATOR">=</xliff:g>සියොල්"</item>
- <item msgid="583367295371395814">"ෂ<xliff:g id="SEPARATOR">=</xliff:g>ෂැංහයි"</item>
+ <item msgid="3814881931186962624">"ෂ<xliff:g id="SEPARATOR">=</xliff:g>ෂැංහයි<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"ස<xliff:g id="SEPARATOR">=</xliff:g>සිංගප්පූරුව"</item>
- <item msgid="1972491729911039207">"ත<xliff:g id="SEPARATOR">=</xliff:g>තායිපේ"</item>
+ <item msgid="8982451946156859368">"ත<xliff:g id="SEPARATOR">=</xliff:g>තායිපේ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"ට<xliff:g id="SEPARATOR">=</xliff:g>ටෙහෙරාන්"</item>
<item msgid="8629402941285674273">"ට<xliff:g id="SEPARATOR">=</xliff:g>ටෙල් අවිව්"</item>
- <item msgid="8499164674454654525">"ට<xliff:g id="SEPARATOR">=</xliff:g>ටෝකියෝ"</item>
+ <item msgid="76330681636547168">"ට<xliff:g id="SEPARATOR">=</xliff:g>ටෝකියෝ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"උ<xliff:g id="SEPARATOR">=</xliff:g>උලාන්බටාර්"</item>
<item msgid="2028626988021468640">"බ<xliff:g id="SEPARATOR">=</xliff:g>බර්මියුඩා"</item>
<item msgid="4527109966513690429">"ක<xliff:g id="SEPARATOR">=</xliff:g>කැනරි"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"ර<xliff:g id="SEPARATOR">=</xliff:g>රෙනෝ"</item>
<item msgid="9155068631060038769">"බ<xliff:g id="SEPARATOR">=</xliff:g>බ්ලැක් රොක් නගරය"</item>
<item msgid="8498761319928979900">"ඩ<xliff:g id="SEPARATOR">=</xliff:g>ඩෝහා"</item>
- <item msgid="8307897251088048641">"බ<xliff:g id="SEPARATOR">=</xliff:g>බීජිං"</item>
+ <item msgid="5327010922199714808">"බ<xliff:g id="SEPARATOR">=</xliff:g>බීජිං<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"ම<xliff:g id="SEPARATOR">=</xliff:g>මුම්බායි"</item>
<item msgid="6668274273067049125">"ද<xliff:g id="SEPARATOR">=</xliff:g>දිල්ලි"</item>
- <item msgid="2933410189478233292">"ඔ<xliff:g id="SEPARATOR">=</xliff:g>ඔසකා"</item>
+ <item msgid="7199039603593847813">"ඔ<xliff:g id="SEPARATOR">=</xliff:g>ඔසකා<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ල<xliff:g id="SEPARATOR">=</xliff:g>ලාහෝර්"</item>
<item msgid="1448378291805481500">"ස<xliff:g id="SEPARATOR">=</xliff:g>සනා"</item>
<item msgid="5233119846682408301">"බ<xliff:g id="SEPARATOR">=</xliff:g>බාසිලෝනා"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"ක<xliff:g id="SEPARATOR">=</xliff:g>කේම්බ්රිජ්"</item>
<item msgid="759409010285366934">"ක<xliff:g id="SEPARATOR">=</xliff:g>කර්ක්ලෑන්ඩ්"</item>
<item msgid="6308007059287569663">"ම<xliff:g id="SEPARATOR">=</xliff:g>මැඩිසන්"</item>
- <item msgid="6971636434858330021">"ග<xliff:g id="SEPARATOR">=</xliff:g>ගුආන්සු"</item>
+ <item msgid="2077617905582224600">"ග<xliff:g id="SEPARATOR">=</xliff:g>ගුආන්සු<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"හ<xliff:g id="SEPARATOR">=</xliff:g>හයිඩ්රරාබාද්"</item>
<item msgid="3032295682584784261">"ර<xliff:g id="SEPARATOR">=</xliff:g>රෙස්ටන්"</item>
<item msgid="7722837296297332268">"බ<xliff:g id="SEPARATOR">=</xliff:g>බෙලෝ හොරිසොන්ටේ"</item>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 2784fec..b4df0e2 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"ඔරලෝසුව පෙන්වන්න"</string>
<string name="hide_clock" msgid="3217727306480505694">"ඔරලෝසුව සඟවන්න"</string>
<string name="label" msgid="162189613902857319">"ලේබලය"</string>
+ <string name="on_switch" msgid="2297966258029227449">"ක්රියාත්මකයි"</string>
+ <string name="off_switch" msgid="3381070073851148013">"ක්රියාවිරහිතයි"</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="6506982899651975645">"ඇඟවීම් රිංග්ටෝනය"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"අභිරුචි රිගින් ටෝන්"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"ටයිමරය කල් ඉකුත් විය"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"නිහඬ"</string>
<string name="ringtone" msgid="9110746249688559579">"රිංග්ටෝනය"</string>
<string name="time" msgid="8067216534232296518">"කාලය"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"හෙට"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> තෙක් යළි සිහි කැඳවන්න"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"ඉදිරියට එන සීනුව"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"ඔබට අත හැරුණ සීනුව මකන ලදි"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"තවත් මිනිත්තුවකට අඩුවෙන් ඉතිරිව ඇත"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> ක් ඉතිරිව ඇත"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> ක් ඉතිරිව ඇත"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ක් ඉතිරිව ඇත"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"මිනිත්තුවකට වඩා අඩුවෙන් ඉතිරිව ඇත"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>ක් ඉතිරිව ඇත"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"ඉතිරිව ඇත"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"ඉතිරිව ඇත"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"ඇඟවීම මෙතැන් සිට ම්නිත්තු 1 කට අඩුවෙන් සකසා ඇත."</item>
<item msgid="6002066367368421848">"ඇඟවීම දැන් සිට <xliff:g id="DAYS">%1$s</xliff:g> කින් සකසා ඇත."</item>
@@ -101,6 +104,10 @@
<item quantity="one">මිනිත්තු</item>
<item quantity="other">මිනිත්තු</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"ක්රමයෙන් ශබ්දය ඉහළ දමන්න"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"ක්රියාවිරහිතයි"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"තත්පර <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"තත්පර"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"නිහඬවන්නෙ පසු"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one">මිනිත්තු <xliff:g id="FORMATTED_NUMBER">%s</xliff:g></item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"ප්රතිවර්තනය කරන්න"</string>
<string name="delete" msgid="5732434972457000541">"මකන්න"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"ඇඟවීම් ශබ්දය"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"නිහඬ"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"නිහඬ"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"නොදනී"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"ඇඟවීම ඉවතලන්න හෝ යළි සිහිකැඳවන්න."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (සිහිකැඳවන ලදී)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"<xliff:g id="TIME">%s</xliff:g> ට ඇඟවීම සකසන ලදී. අවලංගු කිරීමට ස්පර්ශ කරන්න."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"රිංග්ටෝන් පුර්ණය වෙමින්…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"ඔරලෝසුවේ සකසා ඇති කාල ගණනයන් සඳහා ශබ්ද පසු ධාවනය කිරීමේ සේවාව."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"ඇඟවීම සකසන්න"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"සීනුව"</string>
<string name="menu_timer" msgid="6459070074762877114">"කාල ගණනය"</string>
<string name="menu_clock" msgid="5612760670606829805">"ඔරලෝසුව"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"නමින් අනුපිළිවෙලට සකසන්න"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"තෝරාගත් නගර"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"නැවත පටන්ගන්න"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"ආරම්භ කරන්න"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"නතර කරන්න"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ලැප්"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"යළි පිහිටුවන්න"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"ආරම්භ කරන්න"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"ලැප්"</string>
<string name="sw_share_button" msgid="4478648110382859382">"බෙදාගන්න"</string>
<string name="hours_label" msgid="3393478155635368097">"පැ"</string>
<string name="minutes_label" msgid="3568098128251438588">"මි"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"මගේ වේලාව <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"ලැප් වේලාවන්:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"ලැප් <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one">පැය <xliff:g id="NUMBER">%d</xliff:g></item>
<item quantity="other">පැය <xliff:g id="NUMBER">%d</xliff:g></item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"මිනිත්තු 1 ක් එක් කරන්න"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 මිනි එකතු කරන්න"</string>
<string name="timer_stop" msgid="3361154678667736722">"නතර කරන්න"</string>
- <string name="timer_done" msgid="2375990511982914051">"අවසන්"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"සියලු ටයිමර නවත්වන්න"</string>
<string name="timer_reset" msgid="7848424809190171640">"යළි පිහිටුවන්න"</string>
<string name="timer_cancel" msgid="3572868404230815644">"අවලංගු කරන්න"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"කාල ගණකය අවලංගු කරන ලදී"</string>
<string name="timer_times_up" msgid="9190440395938519009">"වෙලාව ඉවරයි"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"ටයිමර <xliff:g id="NUM_TIMERS">%d</xliff:g> ක් කල් ඉකුත් වුණි"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"කාල ගණනය"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"උපරිම කාල ගැනීම් 4 යි"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"විරාමය"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"සියලු කාල ගණක යළි සකසන්න"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"ඔබ ඉතා වේගයෙන් යන්නෙක්."</item>
<item msgid="6332879039890727169">"ඔබගේ උත්සාහයේ ප්රතිපල භුක්ති විඳින්න."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"නගර"</string>
<string name="clock_settings" msgid="8317286807280600391">"ඔරලෝසුව"</string>
<string name="clock_style" msgid="2265011060429742344">"විලාසය"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"දිනය සහ වේලාව වෙනස් කරන්න"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"ප්රතිසමය"</item>
<item msgid="8483930821046925592">"ඩිජිටල්"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ලකුණු කරන ලදී"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> ලකුණු නොකරන ලදී"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"මාර්ෂල් දූපත්"</item>
<item msgid="4196408495909011020">"මිඩ්වේ දූපත"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"ජකර්තා"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"අනතුරු ඇඟවීම්"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"දැනුම්දීම් ධාවනය කිරීමට කාල ඝනක සේවාවක්."</string>
- <string name="swn_stopped" msgid="783124901663086172">"නතර කර ඇත"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"කාල ගණක දැනුම්දීම් වෙතින් ක්රියා සකසයි."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"විරාම ඝටිකා දැනුම්දීම් වෙතින් ක්රියා සකසයි."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"විරාම කරන ලදි"</string>
<string name="description_direction_right" msgid="5709209043267548985">"ඉවත ලෑමට දකුණට ස්වයිප් කරන්න"</string>
<string name="description_direction_left" msgid="7448141043674998679">"සිහි කැඳවීමට වමට ස්වයිප් කරන්න"</string>
<string name="description_direction_both" msgid="1841309486023845685">"යළි සිහි කැඳවීමට වමට හෝ අස් කිරීමට දකුණට ස්වයිප් කරන්න"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"ටයිමර"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"ටයිමර රිගින් ටෝනය"</string>
<string name="timer_stopped" msgid="2730331837832462008">"කාල ගණනය නතර කෙරුණි"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"කාල ගැනීම් <xliff:g id="NUMBER">%d</xliff:g> නවතා ඇත"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"කාල ගණකය විරාම කරන ලදී"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"කාල ගණක <xliff:g id="NUMBER">%d</xliff:g>ක් විරාම කරන ලදී"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"ඔබගේ කාල ගණනයන් බැලීමට ස්පර්ශ කරන්න"</string>
<string name="timers_in_use" msgid="5570729467344408506">"කාල ගැනීම් <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"මීළඟ කාල ගණනය කිරීම: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"සීනු නැත"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"සීනු සකසා නැත"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ඉදිරියට එන සීනු නොමැත"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"වලංගු නොවන වේලාව <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> ට සීනු නොමැත"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"කාල සටහන්ගත කළ එලාම නැත"</string>
<string name="no_label_specified" msgid="2008482054428460626">"ලේබලයක් නිශ්චිතව දක්වා නැත"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"එලාම කිසිවක ලේබලය අඩංගු නැත"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"විරාම ඝටිකාව දැනටමත් ධාවනය වේ"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"විරාම ඝටිකාව ධාවනය නොවේ"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"විරාම ඝටිකාව ධාවනය වන නිසා එය යළි සැකසීමට නොහැකිය"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"විරාම ඝටිකාව නතර කරන ලදී"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"විරාම ඝටිකාව විරාම කරන ලදි"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"විරාම ඝටිකාව යළි සකසන ලදී"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"විරාම ඝටිකාව ලැප් කරන ලදී"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"විරාම ඝටිකාව ආරම්භ කරන ලදී"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"මෙම වේලාව සඳහා සීනුවක් නොමැත"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> එලාමය ඉවතලන ලදී"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g> ට සීනුව සකසන ලදි"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"මුහුර්තකය සකසා නැත"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"මුහුර්තකය මකන ලදී"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"මුහුර්තකය දැනටමත් ධාවනය වේ"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"ඔබගේ ඉල්ලීම සම්පූර්ණ කිරීමට නොහැකි විය, ටයිමර කිහිපයක් ඇත"</string>
- <string name="timer_started" msgid="6715582052946641641">"මුහුර්තකය ආරම්භ කරන ලදී"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"කාල ගණක නොපවතී"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"කාල ගණක එකකට වඩා ඇත"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"කාල ගණකය ඉවත් කර ඇත."</string>
<string name="timer_created" msgid="4381027137335885547">"ටයිමරයක් සාදන ලදි"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"වලංගු නොවන ටයිමර වේලාව"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"මුහුර්තකය යළි සකසන ලදී"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"මුහුර්තකය තවම ධාවනය වන බැවින් එය යළි සැකසීමට නොහැකිය. යළි සැකසීමට මුහුර්තකය නවත්වන්න."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"මුහුර්තකය දැනටමත් නතර කර ඇත"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"මුහුර්තකය මකන ලදී"</string>
+ <string name="timer_started" msgid="6715582052946641641">"මුහුර්තකය ආරම්භ කරන ලදී"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"වලංගු නොවන ටයිමර වේලාව"</string>
<string name="no_city_selected" msgid="1007596865203283741">"නගරය තෝරා නොමැත"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"ඔබ නිශ්චිතව දක්වන ලද නගරය ලබා ගත නොහැකිය"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"එම නගරය දැනටමත් එක් කර ඇත"</string>
diff --git a/res/values-sk/array.xml b/res/values-sk/array.xml
index 608204c..f3d5283 100644
--- a/res/values-sk/array.xml
+++ b/res/values-sk/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala (mesto)"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Južný pól"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Južný pól<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Alma-Ata"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Ammán"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Hočiminovo Mesto"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jeruzalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Maskat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pchjongjang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pchjongjang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangún"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Rijád"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Soul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Šanghaj"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Šanghaj<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Tchaj-pej"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Tchaj-pej<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teherán"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulanbátar"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermudy"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Kanárske ostrovy"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Dauha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Peking<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Bombaj"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Dillí"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Láhaur"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Saná"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Kanton"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Kanton<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hajdarábad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 46a7ed1..add4f04 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Zobraziť hodiny"</string>
<string name="hide_clock" msgid="3217727306480505694">"Skryť hodiny"</string>
<string name="label" msgid="162189613902857319">"Štítok"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Zapnuté"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Vypnuté"</string>
<string name="default_label" msgid="5590025289805630372">"Budík"</string>
<string name="set_alarm" msgid="9148359866152726808">"Nastaviť budík"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibrovať"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Opakovať"</string>
<string name="alert" msgid="6506982899651975645">"Tón zvonenia budíka"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Vlastný tón zvonenia"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Časovač vypršal"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Tichý"</string>
<string name="ringtone" msgid="9110746249688559579">"Tón zvonenia"</string>
<string name="time" msgid="8067216534232296518">"Čas"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Zajtra"</string>
@@ -62,12 +65,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Odložené do <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Nadchádzajúci budík"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Zmeškaný budík bol odstránený"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Beží posledná minúta"</item>
- <item msgid="83197792732433351">"Ešte <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Ešte <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Ešte <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Zostáva menej ako minúta"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g>: <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g>: <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Zostávajúci čas: <xliff:g id="HOURS">%1$s</xliff:g> h <xliff:g id="MINUTES">%2$s</xliff:g> min"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"- zostávajúci čas"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"- zostávajúci čas"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Budík sa spustí o menej než 1 minútu"</item>
<item msgid="6002066367368421848">"Budík sa spustí o <xliff:g id="DAYS">%1$s</xliff:g>"</item>
@@ -115,6 +118,10 @@
<item quantity="other"> minút</item>
<item quantity="one"> minúta</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Postupne zvýšiť hlasitosť"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Vypnuté"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> s"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"s"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Stíšiť po uplynutí"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="few"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minúty</item>
@@ -142,7 +149,8 @@
<string name="revert" msgid="9100911171235162926">"Vrátiť"</string>
<string name="delete" msgid="5732434972457000541">"Odstrániť"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Hlasitosť budíkov"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Tichý"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Tichý režim"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Neznáme"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Odložiť alebo zrušiť budík."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (odložené)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Budík je nastavený na <xliff:g id="TIME">%s</xliff:g>. Dotykom ho zrušíte."</string>
@@ -167,8 +175,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Prebieha načítavanie vyzváňacieho tónu..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Služba prehrávania zvuku časovačov nastavených v aplikácii Hodiny."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Nastaviť budík"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Budík"</string>
<string name="menu_timer" msgid="6459070074762877114">"Časovač"</string>
<string name="menu_clock" msgid="5612760670606829805">"Hodiny"</string>
@@ -183,10 +189,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Zoradiť podľa názvu"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Vybrané mestá"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Obnoviť"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Spustiť"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Zastaviť"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Etapa"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Obnoviť"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Spustiť"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pozastaviť"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Etapa"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Zdieľať"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -198,10 +204,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Môj čas je <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Časy etáp:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. etapa"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Č. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Č. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> hodiny</item>
<item quantity="many"><xliff:g id="NUMBER">%d</xliff:g> hodiny</item>
@@ -227,12 +229,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Pridať 1 minútu"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Pridať 1 min."</string>
<string name="timer_stop" msgid="3361154678667736722">"Zastaviť"</string>
- <string name="timer_done" msgid="2375990511982914051">"Hotovo"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Zastaviť všetky časovače"</string>
<string name="timer_reset" msgid="7848424809190171640">"Obnoviť"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Zrušiť"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Časovač bol zrušený"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Čas vypršal"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Vypršané časovače: <xliff:g id="NUM_TIMERS">%d</xliff:g>"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Časovač"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"maximálne 4 časovače"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pozastaviť"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Reset. časovače"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Ste pánom rýchlosti."</item>
<item msgid="6332879039890727169">"Užite si plody svojej práce."</item>
@@ -249,6 +255,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Mestá"</string>
<string name="clock_settings" msgid="8317286807280600391">"Hodiny"</string>
<string name="clock_style" msgid="2265011060429742344">"Štýl"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Zmeniť dátum a čas"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analógové"</item>
<item msgid="8483930821046925592">"Digitálne"</item>
@@ -263,6 +270,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Mesto <xliff:g id="CITY_NAME">%s</xliff:g> je začiarknuté"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Mesto <xliff:g id="CITY_NAME">%s</xliff:g> nie je začiarknuté"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshallove ostrovy"</item>
<item msgid="4196408495909011020">"Midwayské ostrovy"</item>
@@ -351,13 +360,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Budíky"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Služba Stopky na spúšťanie upozornenia."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Zastavené"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Spracuje akcie z upozornení časovača."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Spracuje akcie z upozornení stopiek."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Pozastavené"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Prejdením prstom doprava budík zrušíte"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Prejdením prstom doľava budík odložíte"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Prejdením prstom doľava budík odložíte, prejdením prstom doprava ho zrušíte"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Časovače"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Tón zvonenia časovača"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Časovač sa zastavil"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Zastavené časovače (<xliff:g id="NUMBER">%d</xliff:g>)"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Časovač bol pozastavený"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Pozastavené časovače (<xliff:g id="NUMBER">%d</xliff:g>)"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Dotykom zobrazíte časovače"</string>
<string name="timers_in_use" msgid="5570729467344408506">"Časovače (<xliff:g id="NUMBER">%d</xliff:g>)"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Ďalší časovač: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -385,35 +398,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Žiadne budíky"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Budíky nenastavené"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ŽIADNE PLÁNOVANÉ BUDÍKY"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Neplatný čas <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Žiadny budík na <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Žiadne nastavené budíky"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nebol určený štítok"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Žiadny budík nemá tento štítok"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Stopky sú už spustené"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Stopky nie sú spustené"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Stopky nemôžete resetovať, pretože sú spustené"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Stopky boli zastavené"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stopky boli pozastavené"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Stopky boli resetované"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Stopky spustili ďalší časový interval"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Stopky boli spustené"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Na tento čas nie je nastavený žiadny budík"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Budík na <xliff:g id="ALARM_TIME">%s</xliff:g> bol odmietnutý"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Budík je nastavený na <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Nie je nastavený žiadny časovač"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Časovač bol odstránený"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Časovač je už spustený"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Vašu žiadosť sa nepodarilo dokončiť, pretože je k dispozícii viacero časovačov"</string>
- <string name="timer_started" msgid="6715582052946641641">"Časovač bol spustený"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Neexistujú žiadne časovače"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Existuje viacero časovačov"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Časovač bol odstránený."</string>
<string name="timer_created" msgid="4381027137335885547">"Časovač bol vytvorený"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Neplatná dĺžka časovača"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Časovač bol resetovaný"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Časovač sa nedá resetovať, pretože je stále spustený. Najprv ho zastavte."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Časovač už bol zastavený"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Časovač bol odstránený"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Časovač bol spustený"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Neplatná dĺžka časovača"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Nebolo vybraté mesto"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Zadané mesto nie je k dispozícii"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Dané mesto už bolo pridané"</string>
diff --git a/res/values-sl/array.xml b/res/values-sl/array.xml
index 4553636..397d9a7 100644
--- a/res/values-sl/array.xml
+++ b/res/values-sl/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Gvatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala City"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Gvajana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"J<xliff:g id="SEPARATOR">=</xliff:g>Južni tečaj"</item>
+ <item msgid="498429228419399474">"J<xliff:g id="SEPARATOR">=</xliff:g>Južni tečaj<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Aman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Hošiminh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"C<xliff:g id="SEPARATOR">=</xliff:g>Carigrad"</item>
<item msgid="758800913783999425">"D<xliff:g id="SEPARATOR">=</xliff:g>Džakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jeruzalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muškat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pjongjang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"K<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"Y<xliff:g id="SEPARATOR">=</xliff:g>Yangon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riad"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Sajgon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"Š<xliff:g id="SEPARATOR">=</xliff:g>Šanghaj"</item>
+ <item msgid="3814881931186962624">"Š<xliff:g id="SEPARATOR">=</xliff:g>Šanghaj<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Tajpej"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Tajpej<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulan Bator"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermudi"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanarski otoki"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Peking<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbaj"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 135c939..9c5f515 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Pokaži uro"</string>
<string name="hide_clock" msgid="3217727306480505694">"Skrij uro"</string>
<string name="label" msgid="162189613902857319">"Oznaka"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Vklopljeno"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Izklopljeno"</string>
<string name="default_label" msgid="5590025289805630372">"Alarm"</string>
<string name="set_alarm" msgid="9148359866152726808">"Nastavi alarm"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Vibriranje"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Ponovi"</string>
<string name="alert" msgid="6506982899651975645">"Ton zvonjenja za alarm"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Ton zvonjenja po meri"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Časovnik je potekel"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Tiho"</string>
<string name="ringtone" msgid="9110746249688559579">"Melodija zvonjenja"</string>
<string name="time" msgid="8067216534232296518">"Čas"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Jutri"</string>
@@ -62,12 +65,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Dremež do <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Prihodnji alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Zamujeni alarm je izbrisan"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Še manj kot minuta"</item>
- <item msgid="83197792732433351">"Še <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Še <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Še <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Še manj kot minuta"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Še <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"še"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"še"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarm je nastavljen na manj kot 1 minuto od zdaj."</item>
<item msgid="6002066367368421848">"Alarm je nastavljen na <xliff:g id="DAYS">%1$s</xliff:g> od zdaj."</item>
@@ -115,6 +118,10 @@
<item quantity="few">minute</item>
<item quantity="other">minute</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Postopno večanje glasnosti"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Izklopljeno"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> s"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"s"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Utišanje po"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuta</item>
@@ -142,7 +149,8 @@
<string name="revert" msgid="9100911171235162926">"Povrni"</string>
<string name="delete" msgid="5732434972457000541">"Izbriši"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Glasnost alarma"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Tiho"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Tiho"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Neznano"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Nastavite na dremež ali prezrite alarm."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (dremež)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarm je nastavljen na <xliff:g id="TIME">%s</xliff:g>. Dotaknite se, če želite preklicati."</string>
@@ -167,8 +175,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Nalaganje zvonjenja ..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Storitev predvajanja zvoka za časomere, nastavljene z Budilko."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Nastavi alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Časovnik"</string>
<string name="menu_clock" msgid="5612760670606829805">"Ura"</string>
@@ -183,10 +189,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Razvrsti po imenu"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Izbrani kraji"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Nadaljuj"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Začni"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Ustavi"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Krog"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Ponastavi"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Začni"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Začasno ustavi"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Krog"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Deli z drugimi"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -198,10 +204,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Moj čas je <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Časi kroga:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. krog"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Število: <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Število: <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> ura</item>
<item quantity="two"><xliff:g id="NUMBER">%d</xliff:g> uri</item>
@@ -227,12 +229,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Dodajanje 1 minute"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Dodaj 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Ustavi"</string>
- <string name="timer_done" msgid="2375990511982914051">"Dokončano"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Ustavi vse časovnike"</string>
<string name="timer_reset" msgid="7848424809190171640">"Ponastavi"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Prekliči"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Merilnik časa je preklican"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Čas je potekel"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Pretekli časovniki: <xliff:g id="NUM_TIMERS">%d</xliff:g>"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Časovnik"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Največ 4 časovniki"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Zaustavitev"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Ponast. časov."</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Hitri ste kot blisk."</item>
<item msgid="6332879039890727169">"Uživajte v sadovih svojega dela."</item>
@@ -249,6 +255,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Mesta"</string>
<string name="clock_settings" msgid="8317286807280600391">"Ura"</string>
<string name="clock_style" msgid="2265011060429742344">"Slog"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Spreminjanje datuma in ure"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogno"</item>
<item msgid="8483930821046925592">"Digitalno"</item>
@@ -263,6 +270,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Kraj <xliff:g id="CITY_NAME">%s</xliff:g> je označen"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Kraj <xliff:g id="CITY_NAME">%s</xliff:g> je odznačen"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshallovi otoki"</item>
<item msgid="4196408495909011020">"Otok Midway"</item>
@@ -351,13 +360,17 @@
<item msgid="5176858645450908751">"Džakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmi"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Uporaba štoparice pri objavi obvestila."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Ustavljeno"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Obdela dejanja, ki izhajajo iz obvestil časovnika."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Obdela dejanja, ki izhajajo iz obvestil štoparice."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Zaustavljeno"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Povlecite v desno za opustitev"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Povlecite v levo za dremež"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Povlecite v levo za dremež ali v desno za opustitev"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Časovniki"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ton zvonjenja za časovnik"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Časovnik ustavljen"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Št. ustavljenih časovnikov: <xliff:g id="NUMBER">%d</xliff:g>"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Časovnik je zaustavljen"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Zaustavljeni časovniki: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Dotaknite se za prikaz časovnikov"</string>
<string name="timers_in_use" msgid="5570729467344408506">"Št. časovnikov: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Naslednji časovnik: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -385,35 +398,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Brez opozoril"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Ni nast. alarm."</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NI PRIHAJAJOČIH OPOZORIL"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k.mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Neveljavna ura <xliff:g id="INVALID_HOUR">%d</xliff:g>.<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Ni alarmov ob <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>.<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Ni nastavljenih alarmov"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nobena oznaka ni bila določena"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Noben alarm ne vsebuje oznake"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Štoparica že teče"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Štoparica ne teče"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Štoparice ni mogoče ponastaviti, ker teče"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Štoparica je bila ustavljena"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Štoparica je zaustavljena"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Štoparica je bila ponastavljena"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"V štoparici so bili dodani krogi"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Štoparica je začela teči"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Za to uro ni nastavljenega nobenega alarma"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarm ob <xliff:g id="ALARM_TIME">%s</xliff:g> je opuščen"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm je nastavljen ob <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Ni nastavljenega časovnika"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Časovnik je izbrisan"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Časovnik že teče"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Zahteve ni mogoče dokončati, na voljo je več časovnikov"</string>
- <string name="timer_started" msgid="6715582052946641641">"Časovnik se je začel"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Ni časovnikov"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Obstaja več časovnikov"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Časovnik je odstranjen."</string>
<string name="timer_created" msgid="4381027137335885547">"Časovnik je bil ustvarjen"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Neveljavna dolžina časovnika"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Časovnik je ponastavljen"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Časovnika ni mogoče ponastaviti, ker še teče. Če ga želite ponastaviti, ga ustavite."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Časovnik je že ustavljen"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Časovnik je izbrisan"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Časovnik se je začel"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Neveljavna dolžina časovnika"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Ni izbranega kraja"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Določeni kraj ni na voljo"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Ta kraj je že dodan"</string>
diff --git a/res/values-sq-rAL/array.xml b/res/values-sq-rAL/array.xml
index 74b1730..946b664 100644
--- a/res/values-sq-rAL/array.xml
+++ b/res/values-sq-rAL/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleca"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand-Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenadë"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemalë"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Qyteti i Guatemalës"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guajanë"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifaks"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havanë"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vankuver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Uinipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Poli i Jugut"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Poli i Jugut<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longierbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almati"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Aman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho-Çi-Min"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong-Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hong-Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Stamboll"</item>
<item msgid="758800913783999425">"Xh<xliff:g id="SEPARATOR">=</xliff:g>Xhakartë"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Muskat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Pnom-Pen"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Penian"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Penian<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangun"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Rijad"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"Sh<xliff:g id="SEPARATOR">=</xliff:g>Shangai"</item>
+ <item msgid="3814881931186962624">"Sh<xliff:g id="SEPARATOR">=</xliff:g>Shangai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapor"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Tajpej"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Tajpej<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel-Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulan-Bator"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermude"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Kanarie"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Blek-Rok-Siti"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Pekin"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Pekin<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahor"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelonë"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Kembrixh"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hiderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo-Horizonte"</item>
diff --git a/res/values-sq-rAL/strings.xml b/res/values-sq-rAL/strings.xml
index fa0c279..3ca6a48 100644
--- a/res/values-sq-rAL/strings.xml
+++ b/res/values-sq-rAL/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Shfaq orën"</string>
<string name="hide_clock" msgid="3217727306480505694">"Fshih orën"</string>
<string name="label" msgid="162189613902857319">"Emërtimi"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Aktivizuar"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Joaktiv"</string>
<string name="default_label" msgid="5590025289805630372">"Alarmi"</string>
<string name="set_alarm" msgid="9148359866152726808">"Cakto alarm"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Dridhja"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Përsërit"</string>
<string name="alert" msgid="6506982899651975645">"Zilja e alarmit"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Zilja e personalizuar"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Kohëmatësi skadoi"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Në heshtje"</string>
<string name="ringtone" msgid="9110746249688559579">"Zilja"</string>
<string name="time" msgid="8067216534232296518">"Ora"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Nesër"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Dremit deri në <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Alarmi i ardhshëm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Alarmi i humbur u fshi"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Ka mbetur më pak se një minutë"</item>
- <item msgid="83197792732433351">"Kanë mbetur edhe <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Kanë mbetur edhe <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Kanë mbetur edhe <xliff:g id="HOURS">%1$s</xliff:g> e <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Ka mbetur më pak se një minutë"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Kanë mbetur edhe <xliff:g id="HOURS">%1$s</xliff:g> e <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"Ka mbetur edhe"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"Kanë mbetur edhe"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarmi është vënë për më pak se 1 minutë nga momenti i tanishëm."</item>
<item msgid="6002066367368421848">"Alarmi është vënë për <xliff:g id="DAYS">%1$s</xliff:g> nga momenti i tanishëm."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minuta</item>
<item quantity="one">minutë</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Rrit gradualisht volumin"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Joaktiv"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> sekonda"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sekonda"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Kalo në heshtje për"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuta</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Kthehu"</string>
<string name="delete" msgid="5732434972457000541">"Fshi"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Volumi i alarmit"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Hesht"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Në heshtje"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"E panjohur"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Dremit ose largoje alarmin."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (dremitur)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Alarmi u caktua për në <xliff:g id="TIME">%s</xliff:g>. Prek për ta anuluar."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Po ngarkon zilen…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Shërbimi i ridëgjimit të zërit për kohëmatësit është vënë tek ora."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Vendos alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarmi"</string>
<string name="menu_timer" msgid="6459070074762877114">"Kohëmatësi"</string>
<string name="menu_clock" msgid="5612760670606829805">"Ora"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Klasifiko sipas emrit"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Qytetet e përzgjedhura"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Rifillo"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Fillo"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Ndalo"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Xhiro"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Rivendos"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Fillo"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"Xhiro"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Shpërnda"</string>
<string name="hours_label" msgid="3393478155635368097">"o"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Koha ime është <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Kohët e xhiros:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Xhiroja <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> orë</item>
<item quantity="one">1 orë</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Shto 1 minutë"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Shto 1 minutë"</string>
<string name="timer_stop" msgid="3361154678667736722">"Ndalo"</string>
- <string name="timer_done" msgid="2375990511982914051">"U krye!"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Ndalo të gjithë kohëmatësit"</string>
<string name="timer_reset" msgid="7848424809190171640">"Rivendos"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Anulo"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Kohëmatësi u anulua"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Koha mbaroi"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> kohëmatës kanë skaduar"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Kohëmatësi"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Maksimumi 4 kohëmatës"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pauzë"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Rivendos të gjithë kohëmatësit"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Je mjaft i shpejtë."</item>
<item msgid="6332879039890727169">"Shijo frytet e punës."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Qytetet"</string>
<string name="clock_settings" msgid="8317286807280600391">"Ora"</string>
<string name="clock_style" msgid="2265011060429742344">"Stili"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Ndërro datën dhe kohën"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analog"</item>
<item msgid="8483930821046925592">"Dixhital"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> u shënua"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"U hoq shënimi nga <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Ishujt Marshall"</item>
<item msgid="4196408495909011020">"Ishulli Miduej"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"Xhakartë"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmet"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Njoftimin do ta japë shërbimi i kronometrit."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Ndaloi"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Përpunon veprimet nga njoftimet e kohëmatësit."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Përpunon veprimet nga njoftimet e kronometrit."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"U ndërpre"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Rrëshqit djathtas për ta larguar"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Rrëshqit majtas për ta dremitur"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Rrëshqit majtas për ta shtyrë, ose djathtas për ta hequr"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Kohëmatësit"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Toni i ziles së kohëmatësit"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Kohëmatësi ndaloi"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> kohëmatës ndaluan"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Kohëmatësi u vendos në pauzë"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> kohëmatës u vendosën në pauzë"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Prek për të parë kohëmatësit"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> kohëmatës"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Kohëmatësi tjetër: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Nuk ka alarme"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Nuk është caktuar asnjë alarm"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"NUK KA ALARME TË ARDHSHME"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"<xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g> është orë e pavlefshme"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Nuk ka asnjë alarm në <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Nuk ka asnjë alarm të planifikuar"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Nuk u specifikua asnjë etiketë"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Asnjë alarm nuk e përfshin etiketën"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Kronometri është tashmë në ekzekutim"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Kronometri nuk është në ekzekutim"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Kronometri nuk mund të rivendoset sepse është në funksionim"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Kronometri u ndalua"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Kronometri u ndërpre"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Kronometri u rivendos"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Kronometri e regjistroi xhiron"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Kronometri u nis"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Nuk ka asnjë alarm të planifikuar për këtë orë"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarmi në <xliff:g id="ALARM_TIME">%s</xliff:g> u hoq"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarmi është caktuar në <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Nuk ka asnjë kohëmatës të caktuar"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Kohëmatësi u fshi"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Kohëmatësi është tashmë në ekzekutim"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Kërkesa nuk mund të realizohet, pasi ka shumë kohëmatës të disponueshëm"</string>
- <string name="timer_started" msgid="6715582052946641641">"Kohëmatësi filloi"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Nuk ekzistojnë kohëmatës"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Ekziston më shumë se një kohëmatës"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Kohëmatësi është hequr."</string>
<string name="timer_created" msgid="4381027137335885547">"Kohëmatësi u krijua"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Gjatësia e kohëmatësit e pavlefshme"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Kohëmatësi u rivendos"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Kohëmatësi nuk mund të rivendoset sepse është akoma në ekzekutim. Ndaloje për ta rivendosur."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Kohëmatësi është ndaluar tashmë"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Kohëmatësi u fshi"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Kohëmatësi filloi"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Gjatësia e kohëmatësit e pavlefshme"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Nuk u zgjodh asnjë qytet"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Qyteti që specifikove nuk ekziston të bazën e të dhënave"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Ai qytet është shtuar tashmë"</string>
diff --git a/res/values-sr/array.xml b/res/values-sr/array.xml
index 0950eb2..4aff68f 100644
--- a/res/values-sr/array.xml
+++ b/res/values-sr/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Форталеза"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Гранд Турк"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Гренада"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Гватемала"</item>
+ <item msgid="6216160110733510854">"<xliff:g id="SEPARATOR">=</xliff:g>Гватемала"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Гвајана"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Халифакс"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Хавана"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Торонто"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Ванкувер"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Винипег"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Јужни пол"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Јужни пол<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Лонгјербјен"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Алмати"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Аман"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Газа"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Хеброн"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Хо Ши Мин"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Хонгконг"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Хонгконг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Истанбул"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Џакарта"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Јерусалим"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Манила"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Мускат"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Пном Пен"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Пјонгјанг"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Пјонгјанг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Катар"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Рангун"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Ријад"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Сајгон"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Сеул"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Шангај"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Шангај<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Сингапур"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Тајпеј"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Тајпеј<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Техеран"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Тел Авив"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Токио"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Токио<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Улан Батор"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Бермуди"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Канари"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Рино"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Блек Рок Сити"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Доха"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Пекинг"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Пекинг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Мумбај"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Делхи"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Осака"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Осака<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Лахор"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Сана"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Барселона"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Кембриџ"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Киркланд"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Медисон"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Гуангџоу"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Гуангџоу<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Хајдерабад"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Рестон"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Бело Хоризонте"</item>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 6c3e120..b88158f 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Прикажи сат"</string>
<string name="hide_clock" msgid="3217727306480505694">"Сакриј сат"</string>
<string name="label" msgid="162189613902857319">"Ознака"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Укључено"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Искључено"</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="6506982899651975645">"Мелодија аларма"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Прилагођена мелодија звона"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Тајмер је истекао"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Нечујно"</string>
<string name="ringtone" msgid="9110746249688559579">"Мелодија звона"</string>
<string name="time" msgid="8067216534232296518">"Време"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Сутра"</string>
@@ -60,12 +63,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Одлагање до <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Предстојећи аларм"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Пропуштени аларм је избрисан"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Преостало је мање од минута"</item>
- <item msgid="83197792732433351">"Преостало је <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Преостало је <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Преостало је <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Преостало је мање од минута"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Преостало: <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"преостаје"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"преостаје"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Аларм ће се укључити за мање од 1 минута."</item>
<item msgid="6002066367368421848">"Аларм ће се укључити за <xliff:g id="DAYS">%1$s</xliff:g>."</item>
@@ -108,6 +111,10 @@
<item quantity="few">минута</item>
<item quantity="other">минута</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Постепено повећај јачину звука"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Искључено"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> сек"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"секунде"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Утишај након"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> минут</item>
@@ -134,7 +141,8 @@
<string name="revert" msgid="9100911171235162926">"Врати"</string>
<string name="delete" msgid="5732434972457000541">"Избриши"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Јачина звука аларма"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Нечујно"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Нечујно"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Непозната"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Одложите или одбаците аларм."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (одложено)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Аларм ће се укључити за <xliff:g id="TIME">%s</xliff:g>. Додирните за отказивање."</string>
@@ -159,8 +167,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Учитава се звук звона..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Услуга пуштања звука за тајмере подешене у Сату."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Подеси аларм"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Аларм"</string>
<string name="menu_timer" msgid="6459070074762877114">"Тајмер"</string>
<string name="menu_clock" msgid="5612760670606829805">"Сат"</string>
@@ -175,10 +181,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Сортирај према имену"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Изабрани градови"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Настави"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Покрени"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Заустави"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Круг"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Ресетуј"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Покрени"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Паузирај"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Круг"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Дели"</string>
<string name="hours_label" msgid="3393478155635368097">"ч"</string>
<string name="minutes_label" msgid="3568098128251438588">"м"</string>
@@ -190,10 +196,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Моје време је <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Пролазна времена:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. круг"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Бр. <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Бр. <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> сат</item>
<item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> сата</item>
@@ -216,12 +218,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Додај 1 минут"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Додај 1 мин"</string>
<string name="timer_stop" msgid="3361154678667736722">"Заустави"</string>
- <string name="timer_done" msgid="2375990511982914051">"Готово"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Заустави све тајмере"</string>
<string name="timer_reset" msgid="7848424809190171640">"Поново подеси"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Откажи"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Тајмер је отказан"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Време је истекло"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Истеклих тајмера: <xliff:g id="NUM_TIMERS">%d</xliff:g>"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Тајмер"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Дозвољено је највише 4 тајмера"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Паузирај"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Рес. све тајм."</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Брзи сте као муња."</item>
<item msgid="6332879039890727169">"Уживајте у плодовима свог рада."</item>
@@ -238,6 +244,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Градови"</string>
<string name="clock_settings" msgid="8317286807280600391">"Сат"</string>
<string name="clock_style" msgid="2265011060429742344">"Стил"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Промените датум и време"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Аналогни"</item>
<item msgid="8483930821046925592">"Дигитални"</item>
@@ -252,6 +259,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Град <xliff:g id="CITY_NAME">%s</xliff:g> је означен"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Ознака за град <xliff:g id="CITY_NAME">%s</xliff:g> је уклоњена"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Маршалска острва"</item>
<item msgid="4196408495909011020">"Острво Мидвеј"</item>
@@ -340,13 +349,17 @@
<item msgid="5176858645450908751">"Џакарта"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Аларми"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Услуга штоперице за управљање обавештењима."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Заустављено"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Обрађује радње из обавештења тајмера."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Обрађује радње из обавештења штоперице."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Паузирано"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Превуците надесно за одбацивање"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Превуците налево за одлагање"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Превуците налево да бисте одложили или надесно да бисте одбацили"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Тајмери"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Мелодија звона тајмера"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Тајмер је заустављен"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Тајмери (<xliff:g id="NUMBER">%d</xliff:g>) су заустављени"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Тајмер је паузиран"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Паузираних тајмера: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Додирните да бисте видели тајмере"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> тајмера"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Следећи тајмер: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -373,35 +386,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Без аларма"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Нема аларма"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"НЕМА ПРЕДСТОЈЕЋИХ АЛАРМА"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Неважеће време <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Нема аларма у <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Нема заказаних аларма"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Није наведена ниједна ознака"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Ниједан аларм не садржи ознаку"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Штоперица је већ покренута"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Штоперица није покренута"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Штоперица не може да се ресетује јер је активна"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Штоперица је заустављена"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Штоперица је паузирана"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Штоперица је ресетована"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Обележено је време за круг на штоперици"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Штоперица је покренута"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Ниједан аларм није заказан за ово време"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Аларм за <xliff:g id="ALARM_TIME">%s</xliff:g> је одбачен"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Аларм је подешен за <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Ниједан тајмер није подешен"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Тајмер је избрисан"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Тајмер је већ покренут"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Није успело довршавање захтева јер је доступно више тајмера"</string>
- <string name="timer_started" msgid="6715582052946641641">"Тајмер је покренут"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Не постоје тајмери"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Постоји више тајмера"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Тајмер је уклоњен."</string>
<string name="timer_created" msgid="4381027137335885547">"Тајмер је направљен"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Неважећа дужина тајмера"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Тајмер је ресетован"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Тајмер не може да се ресетује јер је још увек покренут. Зауставите тајмер да бисте га ресетовали."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Тајмер је већ заустављен"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Тајмер је избрисан"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Тајмер је покренут"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Неважећа дужина тајмера"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Ниједан град није изабран"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Град који сте навели није доступан"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Овај град је већ додат"</string>
diff --git a/res/values-sv/array.xml b/res/values-sv/array.xml
index 5d3dca2..e958e73 100644
--- a/res/values-sv/array.xml
+++ b/res/values-sv/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala City"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>Sydpolen"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>Sydpolen<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh-staden"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hongkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manilla"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muskat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Teheran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulan Bator"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanarieöarna"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Peking"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Peking<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sanaa"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 5d62cb0..66bb405 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"På"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Av"</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="6506982899651975645">"Ringsignal för alarm"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Anpassad ringsignal"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Timern har upphört"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Tyst"</string>
<string name="ringtone" msgid="9110746249688559579">"Ringsignal"</string>
<string name="time" msgid="8067216534232296518">"Tid"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"I morgon"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Viloläge till <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Kommande alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Det missade alarmet har tagits bort"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Mindre än en minut kvar"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> timmar kvar"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> kvar"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> kvar"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Mindre än en minut kvar"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> och <xliff:g id="MINUTES">%2$s</xliff:g> kvar"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"kvar"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"kvar"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarmet ringer om mindre än 1 minut från och med nu."</item>
<item msgid="6002066367368421848">"Alarmet ringer om <xliff:g id="DAYS">%1$s</xliff:g> från och med nu."</item>
@@ -101,6 +104,10 @@
<item quantity="other">minuter</item>
<item quantity="one">minut</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Höj volymen gradvis"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Av"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> sekunder"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sekunder"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Alarmet upphör efter"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuter</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Tillbaka"</string>
<string name="delete" msgid="5732434972457000541">"Ta bort"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Alarmvolym"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Tyst"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Tyst"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Okänd"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"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="4819324081410990368">"Alarmet ringer <xliff:g id="TIME">%s</xliff:g>. Tryck här om du vill avbryta."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Läser in ringsignal..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Ljuduppspelningstjänst för timer som ställts in i DeskClock."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Ställ alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Timer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Klocka"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sortera efter namn"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Valda städer"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Återuppta"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Avbryt"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Varv"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Återställ"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pausa"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Varv"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Dela"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Min tid är <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Varvtider:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Varv <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"Antal: <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"Antal: <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> timmar</item>
<item quantity="one">1 timme</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Lägg till 1 minut"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Lägg till 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Stopp"</string>
- <string name="timer_done" msgid="2375990511982914051">"Klart"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Stoppa alla timer"</string>
<string name="timer_reset" msgid="7848424809190171640">"Återställ"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Avbryt"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Timerinställningen avbröts"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Tiden är ute!"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> timer har löpt ut"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Timer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Högst 4 timer"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pausa"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Återställ alla"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Du är snabbheten personifierad."</item>
<item msgid="6332879039890727169">"Njut av frukterna av ditt arbete."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Orter"</string>
<string name="clock_settings" msgid="8317286807280600391">"Klocka"</string>
<string name="clock_style" msgid="2265011060429742344">"Format"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Ändra datum och tid"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analog"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> har markerats"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> har avmarkerats"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshallöarna"</item>
<item msgid="4196408495909011020">"Midwayöarna"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Larm"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Stoppurstjänst som kör meddelandet."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Stoppad"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Bearbetar åtgärder från timeraviseringar."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Bearbetar åtgärder från stoppursaviseringar."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Pausat"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Stäng av alarmet genom att dra åt höger"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Snooza genom att dra åt vänster"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Dra åt vänster för att snooza eller höger för att stänga av"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Timer"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ringsignal för timer"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Timern stannade"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> timer stannade"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Timern har pausats"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> timer har pausats"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Visa timer genom att trycka"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> timer"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Nästa timer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Inga alarm"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Inga alarm"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"INGA KOMMANDE ALARM"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Ogiltig tid: <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Inget alarm den här tiden: <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Inga inställda alarm"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Ingen etikett har angetts"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Inga alarm innehåller den här etiketten"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Tidtagaruret har redan startats"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Tidtagaruret har inte startats"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Tidtagaruret kan inte återställas eftersom det används"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Tidtagaruret har stoppats"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Stoppuret har pausats"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Tidtagaruret har återställts"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Tidtagaruret har gått ett varv"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Tidtagaruret har startat"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Det finns inga alarm den här tiden"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Alarmet som var inställt på <xliff:g id="ALARM_TIME">%s</xliff:g> har ignorerats"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarmet ringer <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Ingen timer har ställts in"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Timern har raderats"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Timern har redan startats"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Det gick inte att slutföra begäran – flera timer är tillgängliga"</string>
- <string name="timer_started" msgid="6715582052946641641">"Timern har startats"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Det finns ingen timer"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Det finns fler än en timer"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Timern har tagits bort."</string>
<string name="timer_created" msgid="4381027137335885547">"En timer har ställts in"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Ogiltig tidslängd för timer"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Timern har återställts"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Det går inte att återställa timern eftersom den är aktiv. Stoppa timern om du vill återställa den."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Timern har redan stoppats"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Timern har raderats"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Timern har startats"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Ogiltig tidslängd för timer"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Ingen stad har valts"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Staden du angav är inte tillgänglig"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Den här staden har redan lagts till"</string>
diff --git a/res/values-sw/array.xml b/res/values-sw/array.xml
index 68ab7c1..de87062 100644
--- a/res/values-sw/array.xml
+++ b/res/values-sw/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala City"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Ncha ya Kusini"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Ncha ya Kusini<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Yerusalemu"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Maskat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Katari"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapuri"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Tehran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bamuda"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sanaa"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index d3a6a45..e53b828 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Onyesha saa"</string>
<string name="hide_clock" msgid="3217727306480505694">"Ficha saa"</string>
<string name="label" msgid="162189613902857319">"Lebo"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Imewashwa"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Imezimwa"</string>
<string name="default_label" msgid="5590025289805630372">"Kengele"</string>
<string name="set_alarm" msgid="9148359866152726808">"Weka kengele"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Mtetemo"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Rudia"</string>
<string name="alert" msgid="6506982899651975645">"Mlio wa Kengele"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Mlio Maalum wa Simu"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Muda wa Kipima wakati Umemalizika"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Kimya"</string>
<string name="ringtone" msgid="9110746249688559579">"Mlio wa simu"</string>
<string name="time" msgid="8067216534232296518">"Saa"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Kesho"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Imeahirishwa hadi <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Kengele ijayo"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Kengele ambayo haikuitikiwa imefutwa"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Imesalia chini ya dakika moja"</item>
- <item msgid="83197792732433351">"Zimesalia <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Zimesalia <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Zimesalia <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Imesalia chini ya dakika moja"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Zimesalia <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"imesalia"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"zimesalia"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Kengele imewekwa na italia baada ya chini ya dakika 1 kutoka sasa."</item>
<item msgid="6002066367368421848">"Kengele imewekwa na italia baada ya <xliff:g id="DAYS">%1$s</xliff:g> kutoka sasa."</item>
@@ -101,6 +104,10 @@
<item quantity="other">dakika </item>
<item quantity="one">dakika</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Ongeza sauti taratibu"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Imezimwa"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"Sekunde <xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"sekunde"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Kimya baada ya"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other">Dakika <xliff:g id="FORMATTED_NUMBER">%s</xliff:g> </item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Rudi"</string>
<string name="delete" msgid="5732434972457000541">"Futa"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Sauti ya kengele"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Kimya"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Kimya"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Isiyojulikana"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Ahirisha au uondoe kengele."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (imesinzia)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Kengele imewekwa na italia <xliff:g id="TIME">%s</xliff:g>. Gusa ili kughairi."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Inapakia mlio..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Huduma ya kuchezesha tena kengele iliyowekwa kwenye Saa."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Weka kengele"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Kengele"</string>
<string name="menu_timer" msgid="6459070074762877114">"Kipima wakati"</string>
<string name="menu_clock" msgid="5612760670606829805">"Saa"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Panga kwa jina"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Miji Iliyochaguliwa"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Endelea"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Anza"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Simama"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Mzunguko"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Weka upya"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Anza"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Sitisha"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Mzunguko"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Shiriki"</string>
<string name="hours_label" msgid="3393478155635368097">"s"</string>
<string name="minutes_label" msgid="3568098128251438588">"d"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Muda wangu ni <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Muda wa mzunguko:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Mzunguko <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other">Saa <xliff:g id="NUMBER">%d</xliff:g></item>
<item quantity="one">Saa 1</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Ongeza Dakika 1"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Ongeza dakika 1"</string>
<string name="timer_stop" msgid="3361154678667736722">"Simama"</string>
- <string name="timer_done" msgid="2375990511982914051">"Imekamilika"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Komesha vipima muda vyote"</string>
<string name="timer_reset" msgid="7848424809190171640">"Weka upya"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Ghairi"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Kipima muda kimeghairiwa"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Muda umekwisha"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Muda wa vipima muda <xliff:g id="NUM_TIMERS">%d</xliff:g> umekwisha"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Kipima wakati"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Kiwango cha juu cha vipima muda 4"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Sitisha"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Weka upya vipima wakati vyote"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Una kasi ya ajabu."</item>
<item msgid="6332879039890727169">"Furahia matunda ya kazi yako."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Miji"</string>
<string name="clock_settings" msgid="8317286807280600391">"Saa"</string>
<string name="clock_style" msgid="2265011060429742344">"Mtindo"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Badilisha Tarehe na wakati"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analogi"</item>
<item msgid="8483930821046925592">"Dijito"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> imeteuliwa"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> imeondolewa uteuzi"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Visiwa vya Marshall"</item>
<item msgid="4196408495909011020">"Kisiwa cha Midway"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Kengele"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Huduma ya saa ya kusitisha kuendesha arifa."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Imekomeshwa"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Huchakata vitendo kutoka arifa za kipima muda."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Huchakata vitendo kutoka arifa za saa ya kupima muda."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Imesitishwa"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Telezesha kidole kulia ili uondoe"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Telezesha kidole kushoto ili uahirishe"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Telezesha kidole kushoto ili uhairishe au kulia ili uondoe"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Vipima muda"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Mlio wa kipima muda"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Kipima wakati kimesimamishwa"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Vipima wakati <xliff:g id="NUMBER">%d</xliff:g> vilivyosimamishwa"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Kipima wakati kimesitishwa"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Vipima wakati <xliff:g id="NUMBER">%d</xliff:g> vimesitishwa"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Gusa ili kuona vipima wakati vyako"</string>
<string name="timers_in_use" msgid="5570729467344408506">"Vipima wakati <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Kipima wakati Kifuatacho: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Hakuna Kengele Zilizowekwa"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Hakuna kengele zilizowekwa"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"HAKUNA KENGELE ZIJAZO"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Wakati usio sahihi <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Hakuna kengele ya saa <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Hakuna kengele zilizoratibiwa"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Hakuna lebo iliyobainishwa"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Hakuna kengele zilizo na lebo hii"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Saa ya kupima muda tayari inatumika"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Saa ya kupima muda haitumiki"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Kipima muda hakiwezi kuwekwa upya kwa sababu kinatumika"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Kipima muda kimesimamishwa"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Saa ya kupima muda imesitishwa"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Muda wa kipima muda umewekwa upya"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Kipima muda kimekamilisha muda wa mzunguko"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Kipima muda kimeanzishwa"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Hakuna kengele iliyoratibiwa wakati huu"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Kengele ya <xliff:g id="ALARM_TIME">%s</xliff:g> imeondolewa"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Kengele imewekwa ya saa <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Hakuna kipima muda"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Kipima muda kimefutwa"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Kipima muda tayari kinatumika"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Tumeshindwa kukamilisha ombi lako, kuna vipimaji vingi vya wakati"</string>
- <string name="timer_started" msgid="6715582052946641641">"Kipima muda kimeanzishwa"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Hakuna vipima muda"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Kuna zaidi ya kipima muda kimoja"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Kipima muda kimeondolewa."</string>
<string name="timer_created" msgid="4381027137335885547">"Kipimaji muda kimewekwa"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Urefu usio sahihi wa kipimaji muda"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Kipima muda kimewekwa upya"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Kipima muda hakiwezi kuwekwa upya kwa sababu bado kinatumika. Simamisha kipima muda ili kukiweka upya."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Kipima muda tayari kimesimamishwa"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Kipima muda kimefutwa"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Kipima muda kimeanzishwa"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Urefu usio sahihi wa kipimaji muda"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Hujachagua jiji"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Jiji ulilobainisha halipo"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Jiji hilo limeongezwa tayari"</string>
diff --git a/res/values-sw360dp-land/dimens.xml b/res/values-sw360dp-land/dimens.xml
index 151caa0..0275592 100644
--- a/res/values-sw360dp-land/dimens.xml
+++ b/res/values-sw360dp-land/dimens.xml
@@ -20,7 +20,6 @@
for different hardware and product builds.
-->
<resources>
-
<dimen name="circle_size">232dip</dimen>
-
+ <dimen name="timer_setup_font_size">48sp</dimen>
</resources>
diff --git a/res/values-sw360dp/dimens.xml b/res/values-sw360dp/dimens.xml
index 3f4aa13..2764fbc 100644
--- a/res/values-sw360dp/dimens.xml
+++ b/res/values-sw360dp/dimens.xml
@@ -1,4 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2015 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>
<dimen name="big_font_size">70sp</dimen>
+ <dimen name="main_clock_font_size">80sp</dimen>
+ <dimen name="timer_setup_font_size">56sp</dimen>
</resources>
\ No newline at end of file
diff --git a/res/layout/stopwatch_spacer.xml b/res/values-sw400dp/dimens.xml
similarity index 71%
copy from res/layout/stopwatch_spacer.xml
copy to res/values-sw400dp/dimens.xml
index 31b648b..3f40d13 100644
--- a/res/layout/stopwatch_spacer.xml
+++ b/res/values-sw400dp/dimens.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
+<!-- Copyright (C) 2015 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.
@@ -14,7 +14,6 @@
limitations under the License.
-->
-<Space
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="@dimen/stopwatch_list_bottom_spacing" />
+<resources>
+ <dimen name="main_clock_font_size">88sp</dimen>
+</resources>
\ No newline at end of file
diff --git a/res/values-sw600dp-land/dimens.xml b/res/values-sw600dp-land/dimens.xml
index 67cfcb5..1afda39 100644
--- a/res/values-sw600dp-land/dimens.xml
+++ b/res/values-sw600dp-land/dimens.xml
@@ -19,7 +19,7 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+<resources>
<dimen name="time_text_size">275dip</dimen>
<dimen name="ampm_text_size">90dip</dimen>
<dimen name="date_text_size">15sp</dimen>
@@ -41,10 +41,8 @@
<dimen name="circle_margin_top">0dp</dimen>
<dimen name="circle_margin">48dp</dimen>
<dimen name="analog_clock_margin">48dp</dimen>
- <dimen name="timer_circle_margin">48dp</dimen>
<dimen name="circle_size">360dip</dimen>
- <dimen name="stopwatch_list_bottom_spacing">0dip</dimen>
<dimen name="stopwatch_circle_margin_bottom">112dip</dimen>
<dimen name="world_clock_margin">48dp</dimen>
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 0a56ca7..efb20fb 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -19,7 +19,7 @@
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+<resources>
<dimen name="label_text_size">18sp</dimen>
<dimen name="time_text_size">180dip</dimen>
<dimen name="ampm_text_size">54dip</dimen>
@@ -40,6 +40,7 @@
<dimen name="clock_side_padding">48dip</dimen>
<dimen name="clock_side_padding_reduced">36dip</dimen>
+ <dimen name="main_clock_font_size">125sp</dimen>
<dimen name="big_font_size">115sp</dimen>
<dimen name="medium_font_size">96sp</dimen>
<dimen name="label_font_size">18sp</dimen>
@@ -74,11 +75,10 @@
<dimen name="circle_margin_top">48dp</dimen>
<dimen name="circle_margin">96dp</dimen>
<dimen name="analog_clock_margin">96dp</dimen>
- <dimen name="timer_circle_margin">96dp</dimen>
<dimen name="circle_size">400dp</dimen>
<!-- stopwatch_list_bottom_spacing = footer_button_size + footer_button_layout_margin -->
- <dimen name="stopwatch_list_bottom_spacing">96dip</dimen>
+ <dimen name="list_bottom_spacing">96dip</dimen>
<!-- Width of the clock, for use with alarm buttons. -->
<dimen name="alarm_alert_display_width">550dip</dimen>
@@ -87,6 +87,8 @@
<dimen name="world_clock_analog_size">200dip</dimen>
<dimen name="world_clock_margin">96dp</dimen>
+ <dimen name="min_analog_widget_size">170dp</dimen>
+
<!-- Digital Widget settings (keyguard|home_screen) -->
<!-- Use larger fonts -->
<!-- Use dp on purpose to ensure consistency across multiple screen sizes -->
diff --git a/res/values-sw600dp/drawables.xml b/res/values-sw600dp/drawables.xml
new file mode 100644
index 0000000..2b6d873
--- /dev/null
+++ b/res/values-sw600dp/drawables.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <item name="ic_alarm_small" type="drawable">@drawable/ic_alarm_small_24dp</item>
+</resources>
\ No newline at end of file
diff --git a/res/values-ta-rIN/array.xml b/res/values-ta-rIN/array.xml
index 90e0ac8..379ba7d 100644
--- a/res/values-ta-rIN/array.xml
+++ b/res/values-ta-rIN/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ஃ<xliff:g id="SEPARATOR">=</xliff:g>ஃபோர்தலேசா"</item>
<item msgid="5801558418916235541">"க<xliff:g id="SEPARATOR">=</xliff:g>கிராண்ட் துர்க்"</item>
<item msgid="2103759276235503048">"க<xliff:g id="SEPARATOR">=</xliff:g>கிரேனடா"</item>
- <item msgid="1490069759176391533">"க<xliff:g id="SEPARATOR">=</xliff:g>கவுதமாலா"</item>
+ <item msgid="6216160110733510854">"க<xliff:g id="SEPARATOR">=</xliff:g>கவுதமாலா நகரம்"</item>
<item msgid="525959305652046261">"க<xliff:g id="SEPARATOR">=</xliff:g>கயானா"</item>
<item msgid="7565596629973190931">"ஹ<xliff:g id="SEPARATOR">=</xliff:g>ஹலிஃபாக்ஸ்"</item>
<item msgid="3811169155065582644">"ஹ<xliff:g id="SEPARATOR">=</xliff:g>ஹவானா"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ட<xliff:g id="SEPARATOR">=</xliff:g>டொரன்டோ"</item>
<item msgid="1506838283840737263">"வ<xliff:g id="SEPARATOR">=</xliff:g>வான்கூவர்"</item>
<item msgid="8935386104773857399">"வ<xliff:g id="SEPARATOR">=</xliff:g>வின்னிபெக்"</item>
- <item msgid="1132634022412399582">"ச<xliff:g id="SEPARATOR">=</xliff:g>சவுத் போல்"</item>
+ <item msgid="498429228419399474">"ச<xliff:g id="SEPARATOR">=</xliff:g>சவுத் போல்<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ல<xliff:g id="SEPARATOR">=</xliff:g>லாங்யெர்பியேன்"</item>
<item msgid="3784788073896028355">"அ<xliff:g id="SEPARATOR">=</xliff:g>அல்மாதி"</item>
<item msgid="7895695236056852523">"அ<xliff:g id="SEPARATOR">=</xliff:g>அம்மான்"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"க<xliff:g id="SEPARATOR">=</xliff:g>காஸா"</item>
<item msgid="2359068282340162319">"ஹ<xliff:g id="SEPARATOR">=</xliff:g>ஹெப்ரன்"</item>
<item msgid="6223396610551759129">"ஹ<xliff:g id="SEPARATOR">=</xliff:g>ஹோ சி மின்"</item>
- <item msgid="4731022818651322736">"ஹ<xliff:g id="SEPARATOR">=</xliff:g>ஹாங்காங்"</item>
+ <item msgid="3439764751788710130">"ஹ<xliff:g id="SEPARATOR">=</xliff:g>ஹாங்காங்<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"இ<xliff:g id="SEPARATOR">=</xliff:g>இஸ்தான்புல்"</item>
<item msgid="758800913783999425">"ஜ<xliff:g id="SEPARATOR">=</xliff:g>ஜகார்த்தா"</item>
<item msgid="8956406398692698126">"ஜ<xliff:g id="SEPARATOR">=</xliff:g>ஜெருசலேம்"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"ம<xliff:g id="SEPARATOR">=</xliff:g>மணிலா"</item>
<item msgid="6033964325069060422">"ம<xliff:g id="SEPARATOR">=</xliff:g>மஸ்கட்"</item>
<item msgid="6077458941399984780">"ஃ<xliff:g id="SEPARATOR">=</xliff:g>ஃப்னோம் பென்"</item>
- <item msgid="935474308903572975">"ப<xliff:g id="SEPARATOR">=</xliff:g>பியொங்யாங்"</item>
+ <item msgid="1245515372520913197">"ப<xliff:g id="SEPARATOR">=</xliff:g>பியொங்யாங்<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"க<xliff:g id="SEPARATOR">=</xliff:g>கத்தார்"</item>
<item msgid="1667243110545095146">"ர<xliff:g id="SEPARATOR">=</xliff:g>ரங்கூன்"</item>
<item msgid="4460370766685855731">"ர<xliff:g id="SEPARATOR">=</xliff:g>ரியாத்"</item>
<item msgid="4229224905931739201">"ச<xliff:g id="SEPARATOR">=</xliff:g>சைகோன்"</item>
<item msgid="8705359848250215620">"ச<xliff:g id="SEPARATOR">=</xliff:g>சியோல்"</item>
- <item msgid="583367295371395814">"ஷ<xliff:g id="SEPARATOR">=</xliff:g>ஷாங்காய்"</item>
+ <item msgid="3814881931186962624">"ஷ<xliff:g id="SEPARATOR">=</xliff:g>ஷாங்காய்<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"ச<xliff:g id="SEPARATOR">=</xliff:g>சிங்கப்பூர்"</item>
- <item msgid="1972491729911039207">"த<xliff:g id="SEPARATOR">=</xliff:g>தைபே"</item>
+ <item msgid="8982451946156859368">"த<xliff:g id="SEPARATOR">=</xliff:g>தைபே<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"த<xliff:g id="SEPARATOR">=</xliff:g>தெஹ்ரான்"</item>
<item msgid="8629402941285674273">"ட<xliff:g id="SEPARATOR">=</xliff:g>டெல் அவீவ்"</item>
- <item msgid="8499164674454654525">"ட<xliff:g id="SEPARATOR">=</xliff:g>டோக்கியோ"</item>
+ <item msgid="76330681636547168">"ட<xliff:g id="SEPARATOR">=</xliff:g>டோக்கியோ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"உ<xliff:g id="SEPARATOR">=</xliff:g>உலான் பாட்டர்"</item>
<item msgid="2028626988021468640">"ப<xliff:g id="SEPARATOR">=</xliff:g>பெர்முடா"</item>
<item msgid="4527109966513690429">"க<xliff:g id="SEPARATOR">=</xliff:g>கேனரி"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"ர<xliff:g id="SEPARATOR">=</xliff:g>ரெனோ"</item>
<item msgid="9155068631060038769">"ப<xliff:g id="SEPARATOR">=</xliff:g>பிளாக் ராக் சிட்டி"</item>
<item msgid="8498761319928979900">"த<xliff:g id="SEPARATOR">=</xliff:g>தோஹா"</item>
- <item msgid="8307897251088048641">"ப<xliff:g id="SEPARATOR">=</xliff:g>பெய்ஜிங்"</item>
+ <item msgid="5327010922199714808">"ப<xliff:g id="SEPARATOR">=</xliff:g>பெய்ஜிங்<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"ம<xliff:g id="SEPARATOR">=</xliff:g>மும்பை"</item>
<item msgid="6668274273067049125">"ட<xliff:g id="SEPARATOR">=</xliff:g>டில்லி"</item>
- <item msgid="2933410189478233292">"ஒ<xliff:g id="SEPARATOR">=</xliff:g>ஒசாகா"</item>
+ <item msgid="7199039603593847813">"ஒ<xliff:g id="SEPARATOR">=</xliff:g>ஒசாகா<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ல<xliff:g id="SEPARATOR">=</xliff:g>லாகூர்"</item>
<item msgid="1448378291805481500">"ச<xliff:g id="SEPARATOR">=</xliff:g>சனா"</item>
<item msgid="5233119846682408301">"ப<xliff:g id="SEPARATOR">=</xliff:g>பார்சிலோனா"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"க<xliff:g id="SEPARATOR">=</xliff:g>கேம்பிரிட்ஜ்"</item>
<item msgid="759409010285366934">"க<xliff:g id="SEPARATOR">=</xliff:g>கிர்க்லாந்து"</item>
<item msgid="6308007059287569663">"ம<xliff:g id="SEPARATOR">=</xliff:g>மேடிசன்"</item>
- <item msgid="6971636434858330021">"கு<xliff:g id="SEPARATOR">=</xliff:g>குவாங்சோவ்"</item>
+ <item msgid="2077617905582224600">"க<xliff:g id="SEPARATOR">=</xliff:g>குவாங்சோவ்<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"ஹ<xliff:g id="SEPARATOR">=</xliff:g>ஹைதராபாத்"</item>
<item msgid="3032295682584784261">"ர<xliff:g id="SEPARATOR">=</xliff:g>ரெஸ்டன்"</item>
<item msgid="7722837296297332268">"ப<xliff:g id="SEPARATOR">=</xliff:g>பெலோ அரிசாஞ்ச்"</item>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 2628db8..c48565e 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"கடிகாரத்தைக் காட்டு"</string>
<string name="hide_clock" msgid="3217727306480505694">"கடிகாரத்தை மறை"</string>
<string name="label" msgid="162189613902857319">"லேபிள்"</string>
+ <string name="on_switch" msgid="2297966258029227449">"இயக்கத்தில்"</string>
+ <string name="off_switch" msgid="3381070073851148013">"முடக்கத்தில்"</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="6506982899651975645">"அலார ரிங்டோன்"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"தனிப்பயன் ரிங்டோன்"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"டைமர் காலாவதியானது"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"நிசப்தம்"</string>
<string name="ringtone" msgid="9110746249688559579">"ரிங்டோன்"</string>
<string name="time" msgid="8067216534232296518">"நேரம்"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"நாளை"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> வரை உறக்கநிலையில் வை"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"அடுத்த அலாரம்"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"உங்கள் தவறிய அலாரம் நீக்கப்பட்டது"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"ஒரு நிமிடத்திற்கும் குறைவான நேரமே மீதமுள்ளது"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> மணிநேரம் மீதமுள்ளது"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> நிமிடங்கள் மீதமுள்ளன"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> மணிநேரம் <xliff:g id="MINUTES">%2$s</xliff:g> நிமிடங்கள் மீதமுள்ளன"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"ஒரு நிமிடத்திற்கும் குறைவான நேரமே மீதமுள்ளது"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> மணிநேரம் <xliff:g id="MINUTES">%2$s</xliff:g> நிமிடங்கள் மீதமுள்ளன"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"மீதமுள்ளது"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"மீதமுள்ளன"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"இப்போதிலிருந்து 1 நிமிடத்திற்கும் குறைவான நேரத்தில் அலாரம் அமைக்கப்பட்டது."</item>
<item msgid="6002066367368421848">"இப்போதிலிருந்து <xliff:g id="DAYS">%1$s</xliff:g> நாட்களுக்கு அலாரம் அமைக்கப்பட்டது."</item>
@@ -101,6 +104,10 @@
<item quantity="other">நிமிடங்கள்</item>
<item quantity="one">நிமிடம்</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"படிப்படியாக ஒலியளவை அதிகரி"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"முடக்கத்தில்"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> வினாடிகள்"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"வினாடிகள்"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"அமைதியாக்க வெண்டியது"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> நிமிடங்கள்</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"மாற்றியமை"</string>
<string name="delete" msgid="5732434972457000541">"நீக்கு"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"அலாரத்தின் ஒலியளவு"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"நிசப்தம்"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"நிசப்தம்"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"அறியப்படாதது"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"அலாரத்தை உறக்கநிலையில் வைக்கவும் அல்லது நிராகரிக்கவும்."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (உறக்கநிலையில் வைக்கப்பட்டது)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"<xliff:g id="TIME">%s</xliff:g> மணிக்கு அலாரம் அமைக்கப்பட்டது. ரத்துசெய்ய தொடவும்."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"ரிங்டோனை ஏற்றுகிறது…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"கடிகாரத்தில் அமைக்கப்பட்ட டைமர்களுக்கான ஒலி ப்ளேபேக் சேவை."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"அலாரத்தை அமை"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"அலாரம்"</string>
<string name="menu_timer" msgid="6459070074762877114">"டைமர்"</string>
<string name="menu_clock" msgid="5612760670606829805">"கடிகாரம்"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"அகர வரிசையில்"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"தேர்ந்தெடுத்த நகரங்கள்"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"மீண்டும் தொடங்கு"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"தொடங்கு"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"நிறுத்து"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"தடம்"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"மீட்டமை"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"தொடங்கு"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"தடம்"</string>
<string name="sw_share_button" msgid="4478648110382859382">"பகிர்"</string>
<string name="hours_label" msgid="3393478155635368097">"ம"</string>
<string name="minutes_label" msgid="3568098128251438588">"நி"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"எனது நேரம் <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"தட நேரங்கள்:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g> தடம்"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> மணிநேரம்</item>
<item quantity="one">1 மணிநேரம்</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 நிமிடத்தைச் சேர்"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 நிமிடம் சேர்"</string>
<string name="timer_stop" msgid="3361154678667736722">"நிறுத்து"</string>
- <string name="timer_done" msgid="2375990511982914051">"முடிந்தது"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"எல்லா டைமர்களையும் நிறுத்து"</string>
<string name="timer_reset" msgid="7848424809190171640">"மீட்டமை"</string>
<string name="timer_cancel" msgid="3572868404230815644">"ரத்துசெய்"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"டைமர் ரத்துசெய்யப்பட்டது"</string>
<string name="timer_times_up" msgid="9190440395938519009">"நேரம் முடிந்தது"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> டைமர்கள் முடிந்துவிட்டன"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"டைமர்"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"அதிகபட்சம் 4 டைமர்கள்"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"இடைநிறுத்து"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"எல்லா டைமர்களையும் மீட்டமை"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"சிறுத்தை போல் வேகமாக உள்ளீர்கள்."</item>
<item msgid="6332879039890727169">"உங்கள் கடின உழைப்பின் பலனை அனுபவிக்கவும்."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"நகரங்கள்"</string>
<string name="clock_settings" msgid="8317286807280600391">"கடிகாரம்"</string>
<string name="clock_style" msgid="2265011060429742344">"வகை"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"தேதி & நேரத்தை மாற்று"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"அனலாக்"</item>
<item msgid="8483930821046925592">"டிஜிட்டல்"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> தேர்ந்தெடுக்கப்பட்டது"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> தேர்வுநீக்கப்பட்டது"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"மார்ஷல் தீவுகள்"</item>
<item msgid="4196408495909011020">"மிட்வே தீவு"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"ஜகார்த்தா"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"அலாரங்கள்"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"அறிவிப்பை இயக்குவதற்கான நிறுத்தக்கடிகார சேவை."</string>
- <string name="swn_stopped" msgid="783124901663086172">"நிறுத்தப்பட்டது"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"டைமர் அறிவிப்புகள் தொடர்பான செயல்பாடுகளைச் செயலாக்கும்."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"ஸ்டாப்வாட்ச் அறிவிப்புகள் தொடர்பான செயல்பாடுகளைச் செயலாக்கும்."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"இடைநிறுத்தப்பட்டது"</string>
<string name="description_direction_right" msgid="5709209043267548985">"நிராகரிக்க வலதுபுறம் ஸ்வைப் செய்யவும்"</string>
<string name="description_direction_left" msgid="7448141043674998679">"உறக்கநிலையில் வைக்க இடதுபுறம் ஸ்வைப் செய்யவும்"</string>
<string name="description_direction_both" msgid="1841309486023845685">"உறக்கநிலையாக்க இடதுபுறம் அல்லது விலக்க வலதுபுறம் ஸ்வைப் செய்யவும்"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"டைமர்கள்"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"டைமர் ரிங்டோன்"</string>
<string name="timer_stopped" msgid="2730331837832462008">"டைமர் நிறுத்தப்பட்டது"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> டைமர்கள் நிறுத்தப்பட்டன"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"டைமர் இடைநிறுத்தப்பட்டது"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> டைமர்கள் இடைநிறுத்தப்பட்டன"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"உங்கள் டைமர்களைப் பார்க்க தொடவும்"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> டைமர்கள்"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"அடுத்த டைமர்: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"அலாரங்கள் இல்லை"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"அலாரம் இல்லை"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"அடுத்ததாக அலாரங்கள் இல்லை"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"தவறான நேரம் <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>க்கு அலாரம் எதுவுமில்லை"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"அலாரங்கள் எதுவும் அமைக்கப்படவில்லை"</string>
<string name="no_label_specified" msgid="2008482054428460626">"லேபிள் எதையும் குறிப்பிடவில்லை"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"இந்த லேபிளின் பெயரில் அலாரங்கள் இல்லை"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"ஸ்டாப்வாட்ச் இயங்கிக்கொண்டிருக்கிறது"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"ஸ்டாப்வாட்ச் இயங்கவில்லை"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"ஸ்டாப்வாட்ச் இயங்குவதால் அதை மீட்டமைக்க முடியாது"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"ஸ்டாப்வாட்ச் நிறுத்தப்பட்டது"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"ஸ்டாப்வாட்ச் இடைநிறுத்தப்பட்டது"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"ஸ்டாப்வாட்ச் மீட்டமைக்கப்பட்டது"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"ஸ்டாப்வாட்ச் லேப் செய்யப்பட்டது"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"ஸ்டாப்வாட்ச் தொடங்கியது"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"இந்த நேரத்திற்கு அலாரம் எதுவும் அமைக்கப்படவில்லை"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> அலாரம் விலக்கப்பட்டது"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"அலாரம் <xliff:g id="ALARM_TIME">%s</xliff:g>க்கு அமைக்கப்பட்டது"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"டைமர் எதுவும் அமைக்கப்படவில்லை"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"டைமர் நீக்கப்பட்டது"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"டைமர் இயங்கிக்கொண்டிருக்கிறது"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"பல டைமர்கள் உள்ளதால், கோரிக்கையை நிறைவேற்ற முடியவில்லை"</string>
- <string name="timer_started" msgid="6715582052946641641">"டைமர் தொடங்கியது"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"டைமர்கள் இல்லை"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"ஒன்றுக்கும் மேற்பட்ட டைமர்கள் உள்ளன"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"டைமர் அகற்றப்பட்டது."</string>
<string name="timer_created" msgid="4381027137335885547">"டைமர் உருவாக்கப்பட்டது"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"தவறான டைமர் நீளம்"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"டைமர் மீட்டமைக்கப்பட்டது"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"டைமர் இயங்குவதால் மீட்டமைக்க முடியாது. மீட்டமைக்க, டைமரை நிறுத்தவும்."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"டைமர் ஏற்கனவே நிறுத்தப்பட்டது"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"டைமர் நீக்கப்பட்டது"</string>
+ <string name="timer_started" msgid="6715582052946641641">"டைமர் தொடங்கியது"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"தவறான டைமர் நீளம்"</string>
<string name="no_city_selected" msgid="1007596865203283741">"நகரம் எதுவும் தேர்ந்தெடுக்கப்படவில்லை"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"குறிப்பிட்ட நகரம் இல்லை"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"நகரம் ஏற்கனவே சேர்க்கப்பட்டுள்ளது"</string>
diff --git a/res/values-te-rIN/array.xml b/res/values-te-rIN/array.xml
index e28baff..773f32b 100644
--- a/res/values-te-rIN/array.xml
+++ b/res/values-te-rIN/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ఫ<xliff:g id="SEPARATOR">=</xliff:g>ఫోర్టలెజా"</item>
<item msgid="5801558418916235541">"గ<xliff:g id="SEPARATOR">=</xliff:g>గ్రాండ్ టర్క్"</item>
<item msgid="2103759276235503048">"గ<xliff:g id="SEPARATOR">=</xliff:g>గ్రెనడా"</item>
- <item msgid="1490069759176391533">"గ<xliff:g id="SEPARATOR">=</xliff:g>గ్వాటిమాలా"</item>
+ <item msgid="6216160110733510854">"గ<xliff:g id="SEPARATOR">=</xliff:g>గ్వాటిమాలా నగరం"</item>
<item msgid="525959305652046261">"గ<xliff:g id="SEPARATOR">=</xliff:g>గయానా"</item>
<item msgid="7565596629973190931">"హ<xliff:g id="SEPARATOR">=</xliff:g>హాలిఫ్యాక్స్"</item>
<item msgid="3811169155065582644">"హ<xliff:g id="SEPARATOR">=</xliff:g>హవానా"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ట<xliff:g id="SEPARATOR">=</xliff:g>టొరంటో"</item>
<item msgid="1506838283840737263">"వ<xliff:g id="SEPARATOR">=</xliff:g>వాంకోవర్"</item>
<item msgid="8935386104773857399">"వ<xliff:g id="SEPARATOR">=</xliff:g>విన్నిపెగ్"</item>
- <item msgid="1132634022412399582">"స<xliff:g id="SEPARATOR">=</xliff:g>సౌత్ పోల్"</item>
+ <item msgid="498429228419399474">"స<xliff:g id="SEPARATOR">=</xliff:g>సౌత్ పోల్<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ల<xliff:g id="SEPARATOR">=</xliff:g>లాంగ్యియర్బ్యెన్"</item>
<item msgid="3784788073896028355">"ఆ<xliff:g id="SEPARATOR">=</xliff:g>ఆల్మటి"</item>
<item msgid="7895695236056852523">"అ<xliff:g id="SEPARATOR">=</xliff:g>అమ్మన్"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"గ<xliff:g id="SEPARATOR">=</xliff:g>గాజా"</item>
<item msgid="2359068282340162319">"హ<xliff:g id="SEPARATOR">=</xliff:g>హెబ్రాన్"</item>
<item msgid="6223396610551759129">"హ<xliff:g id="SEPARATOR">=</xliff:g>హొ చి మిన్హ్"</item>
- <item msgid="4731022818651322736">"హ<xliff:g id="SEPARATOR">=</xliff:g>హాంకాంగ్"</item>
+ <item msgid="3439764751788710130">"హ<xliff:g id="SEPARATOR">=</xliff:g>హాంకాంగ్<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"ఇ<xliff:g id="SEPARATOR">=</xliff:g>ఇస్తాంబుల్"</item>
<item msgid="758800913783999425">"జ<xliff:g id="SEPARATOR">=</xliff:g>జకార్తా"</item>
<item msgid="8956406398692698126">"జ<xliff:g id="SEPARATOR">=</xliff:g>జెరుసలేం"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"మ<xliff:g id="SEPARATOR">=</xliff:g>మనీలా"</item>
<item msgid="6033964325069060422">"మ<xliff:g id="SEPARATOR">=</xliff:g>మస్కట్"</item>
<item msgid="6077458941399984780">"ప<xliff:g id="SEPARATOR">=</xliff:g>ప్నోమ్ పెన్హ్"</item>
- <item msgid="935474308903572975">"ప<xliff:g id="SEPARATOR">=</xliff:g>ప్యాంగ్యాంగ్"</item>
+ <item msgid="1245515372520913197">"ప<xliff:g id="SEPARATOR">=</xliff:g>ప్యాంగ్యాంగ్<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"ఖ<xliff:g id="SEPARATOR">=</xliff:g>ఖతార్"</item>
<item msgid="1667243110545095146">"ర<xliff:g id="SEPARATOR">=</xliff:g>రంగూన్"</item>
<item msgid="4460370766685855731">"ర<xliff:g id="SEPARATOR">=</xliff:g>రియాద్"</item>
<item msgid="4229224905931739201">"స<xliff:g id="SEPARATOR">=</xliff:g>సైగన్"</item>
<item msgid="8705359848250215620">"స<xliff:g id="SEPARATOR">=</xliff:g>సియోల్"</item>
- <item msgid="583367295371395814">"ష<xliff:g id="SEPARATOR">=</xliff:g>షాంఘై"</item>
+ <item msgid="3814881931186962624">"ష<xliff:g id="SEPARATOR">=</xliff:g>షాంఘై<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"స<xliff:g id="SEPARATOR">=</xliff:g>సింగపూర్"</item>
- <item msgid="1972491729911039207">"త<xliff:g id="SEPARATOR">=</xliff:g>తైపై"</item>
+ <item msgid="8982451946156859368">"త<xliff:g id="SEPARATOR">=</xliff:g>తైపై<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"త<xliff:g id="SEPARATOR">=</xliff:g>తెహ్రాన్"</item>
<item msgid="8629402941285674273">"ట<xliff:g id="SEPARATOR">=</xliff:g>టెల్ అవివ్"</item>
- <item msgid="8499164674454654525">"ట<xliff:g id="SEPARATOR">=</xliff:g>టోక్యో"</item>
+ <item msgid="76330681636547168">"ట<xliff:g id="SEPARATOR">=</xliff:g>టోక్యో<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"య<xliff:g id="SEPARATOR">=</xliff:g>యులాన్బాటర్"</item>
<item msgid="2028626988021468640">"బ<xliff:g id="SEPARATOR">=</xliff:g>బెర్ముడా"</item>
<item msgid="4527109966513690429">"క<xliff:g id="SEPARATOR">=</xliff:g>క్యానరీ"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"ర<xliff:g id="SEPARATOR">=</xliff:g>రెనో"</item>
<item msgid="9155068631060038769">"బ<xliff:g id="SEPARATOR">=</xliff:g>బ్లాక్ రాక్ నగరం"</item>
<item msgid="8498761319928979900">"ద<xliff:g id="SEPARATOR">=</xliff:g>దోహా"</item>
- <item msgid="8307897251088048641">"బ<xliff:g id="SEPARATOR">=</xliff:g>బీజింగ్"</item>
+ <item msgid="5327010922199714808">"బ<xliff:g id="SEPARATOR">=</xliff:g>బీజింగ్<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"మ<xliff:g id="SEPARATOR">=</xliff:g>ముంబై"</item>
<item msgid="6668274273067049125">"ఢ<xliff:g id="SEPARATOR">=</xliff:g>ఢిల్లీ"</item>
- <item msgid="2933410189478233292">"ఒ<xliff:g id="SEPARATOR">=</xliff:g>ఒసాకా"</item>
+ <item msgid="7199039603593847813">"ఒ<xliff:g id="SEPARATOR">=</xliff:g>ఒసాకా<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ల<xliff:g id="SEPARATOR">=</xliff:g>లాహోర్"</item>
<item msgid="1448378291805481500">"స<xliff:g id="SEPARATOR">=</xliff:g>సనా"</item>
<item msgid="5233119846682408301">"బ<xliff:g id="SEPARATOR">=</xliff:g>బార్సిలోనా"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"క<xliff:g id="SEPARATOR">=</xliff:g>కేంబ్రిడ్జ్"</item>
<item msgid="759409010285366934">"క<xliff:g id="SEPARATOR">=</xliff:g>కిర్క్ల్యాండ్"</item>
<item msgid="6308007059287569663">"మ<xliff:g id="SEPARATOR">=</xliff:g>మాడిసన్"</item>
- <item msgid="6971636434858330021">"గ<xliff:g id="SEPARATOR">=</xliff:g>గ్వాంగ్జో"</item>
+ <item msgid="2077617905582224600">"గ<xliff:g id="SEPARATOR">=</xliff:g>గ్వాంగ్జో<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"హ<xliff:g id="SEPARATOR">=</xliff:g>హైదరాబాద్"</item>
<item msgid="3032295682584784261">"ర<xliff:g id="SEPARATOR">=</xliff:g>రెస్టన్"</item>
<item msgid="7722837296297332268">"బ<xliff:g id="SEPARATOR">=</xliff:g>బెలొ హారిజాంటో"</item>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index a220608..4599da0 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"గడియారాన్ని చూపు"</string>
<string name="hide_clock" msgid="3217727306480505694">"గడియారాన్ని దాచు"</string>
<string name="label" msgid="162189613902857319">"లేబుల్"</string>
+ <string name="on_switch" msgid="2297966258029227449">"ఆన్లో ఉంది"</string>
+ <string name="off_switch" msgid="3381070073851148013">"ఆఫ్లో ఉంది"</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="6506982899651975645">"అలారం రింగ్టోన్"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"అనుకూల రింగ్టోన్"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"టైమర్ గడువు ముగిసింది"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"నిశ్శబ్దం"</string>
<string name="ringtone" msgid="9110746249688559579">"రింగ్టోన్"</string>
<string name="time" msgid="8067216534232296518">"సమయం"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"రేపు"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> వరకు తాత్కాలికంగా ఆపివేయబడుతోంది"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"అలారం సమయం ఆసన్నం కాబోతోంది"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"మీరు ప్రతిస్పందించని అలారం తొలగించబడింది"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"నిమిషం కంటే తక్కువ సమయం ఉంది"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> మిగిలి ఉంది"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> మిగిలి ఉంది"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> మిగిలి ఉంది"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"నిమిషం కంటే తక్కువ సమయం మిగిలి ఉంది"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> మిగిలి ఉంది"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"మిగిలి ఉంది"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"మిగిలి ఉంది"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"అలారం ఇప్పటి నుండి 1 నిమిషం కంటే తక్కువ సేపటికి సెట్ చేయబడింది."</item>
<item msgid="6002066367368421848">"అలారం ఇప్పటి నుండి <xliff:g id="DAYS">%1$s</xliff:g>కు సెట్ చేయబడింది."</item>
@@ -101,6 +104,10 @@
<item quantity="other">నిమిషాలు</item>
<item quantity="one">నిమిషం</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"వాల్యూమ్ను క్రమంగా పెంచు"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"ఆఫ్లో ఉంది"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> సెకన్లు"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"సెకన్లు"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"ఇంత సమయం తర్వాత నిశ్శబ్దంగా ఉండాలి"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> నిమిషాలు</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"తిరిగి పొందు"</string>
<string name="delete" msgid="5732434972457000541">"తొలగించు"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"అలారం వాల్యూమ్"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"నిశ్శబ్దం"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"నిశ్శబ్దం"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"తెలియనివి"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"అలారంను తాత్కాలికంగా ఆపివేయండి లేదా తీసివేయండి."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (తాత్కాలికంగా ఆపివేయబడింది)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"అలారం <xliff:g id="TIME">%s</xliff:g>కు సెట్ చేయబడింది. రద్దు చేయడానికి తాకండి."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"రింగ్టోన్ను లోడ్ చేస్తోంది…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"గడియారంలో సెట్ చేయబడిన టైమర్ల కోసం సౌండ్ ప్లేబ్యాక్ సేవ."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"అలారం సెట్ చేయి"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"అలారం"</string>
<string name="menu_timer" msgid="6459070074762877114">"టైమర్"</string>
<string name="menu_clock" msgid="5612760670606829805">"గడియారం"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"పేరు ద్వారా క్రమబద్ధీకరించు"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"ఎంచుకున్న నగరాలు"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"పునఃప్రారంభించు"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"ప్రారంభించు"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"ఆపివేయి"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"ల్యాప్"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"రీసెట్ చేయి"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"ప్రారంభించు"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"ల్యాప్"</string>
<string name="sw_share_button" msgid="4478648110382859382">"భాగస్వామ్యం చేయి"</string>
<string name="hours_label" msgid="3393478155635368097">"గం"</string>
<string name="minutes_label" msgid="3568098128251438588">"నిమి"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"నా సమయం <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"ల్యాప్ సమయాలు:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"ల్యాప్ <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> గంటలు</item>
<item quantity="one">1 గంట</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 నిమిషాన్ని జోడించండి"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 నిమి జోడించండి"</string>
<string name="timer_stop" msgid="3361154678667736722">"ఆపివేయి"</string>
- <string name="timer_done" msgid="2375990511982914051">"పూర్తయింది"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"అన్ని టైమర్లు ఆపుతుంది"</string>
<string name="timer_reset" msgid="7848424809190171640">"రీసెట్ చేయి"</string>
<string name="timer_cancel" msgid="3572868404230815644">"రద్దు చేయి"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"టైమర్ రద్దు చేయబడింది"</string>
<string name="timer_times_up" msgid="9190440395938519009">"సమయం ముగిసింది"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> టైమర్ల సమయం గడిచిపోయిం."</string>
<string name="timer_notification_label" msgid="4933184831583137249">"టైమర్"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"గరిష్టంగా 4 టైమర్లు"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"పాజ్ చేస్తుంది"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"టైమర్లన్నీ రీసెట్ చేస్తుంది"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"మీరు చాలా వేగంగా ఉన్నారు."</item>
<item msgid="6332879039890727169">"మీ శ్రమ యొక్క ఫలితాలను ఆస్వాదించండి."</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"నగరాలు"</string>
<string name="clock_settings" msgid="8317286807280600391">"గడియారం"</string>
<string name="clock_style" msgid="2265011060429742344">"శైలి"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"తేదీ & సమయం మార్చండి"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"అనలాగ్"</item>
<item msgid="8483930821046925592">"డిజిటల్"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> ఎంచుకోబడింది"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> ఎంపిక తీసివేయబడింది"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"మార్షల్ దీవులు"</item>
<item msgid="4196408495909011020">"మిడ్వే దీవి"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"జకార్తా"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"అలారాలు"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"నోటిఫికేషన్ను అమలు చేయడానికి స్టాప్ వాచ్ సేవ."</string>
- <string name="swn_stopped" msgid="783124901663086172">"ఆపివేయబడింది"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"టైమర్ నోటిఫికేషన్ల నుండి చర్యలను ప్రాసెస్ చేస్తుంది."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"స్టాప్వాచ్ నోటిఫికేషన్ల నుండి చర్యలను ప్రాసెస్ చేస్తుంది."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"పాజ్ చేయబడింది"</string>
<string name="description_direction_right" msgid="5709209043267548985">"తీసివేయడానికి కుడి వైపుకి స్వైప్ చేయండి"</string>
<string name="description_direction_left" msgid="7448141043674998679">"తాత్కాలికంగా ఆపివేయడానికి ఎడమ వైపుకి స్వైప్ చేయండి"</string>
<string name="description_direction_both" msgid="1841309486023845685">"తాత్కాలికంగా ఆపివేయడానికి ఎడమవైపుకు, తీసివేయడానికి కుడి వైపుకు స్వైప్ చేయండి"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"టైమర్లు"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"టైమర్ రింగ్టోన్"</string>
<string name="timer_stopped" msgid="2730331837832462008">"టైమర్ ఆపివేయబడింది"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> టైమర్లు ఆపివేయబడ్డాయి"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"టైమర్ పాజ్ చేయబడింది"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> టైమర్లు పాజ్ చేయబడ్డాయి"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"మీ టైమర్లను చూడటానికి తాకండి"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> టైమర్లు"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"తదుపరి టైమర్: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"అలారాలు లేవు"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"అలారాలను సెట్ చేయలేదు"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"సమయం ఆసన్నమయ్యే అలారాలు ఏవీ లేవు"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"<xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g> సమయం చెల్లదు"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>కి అలారం ఏదీ లేదు"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"షెడ్యూల్ చేసిన అలారాలు ఏవీ లేవు"</string>
<string name="no_label_specified" msgid="2008482054428460626">"లేబుల్ ఏదీ పేర్కొనలేదు"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"లేబుల్ను కలిగి ఉన్న అలారాలు ఏవీ లేవు"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"స్టాప్వాచ్ ఇప్పటికే అమలవుతోంది"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"స్టాప్వాచ్ అమలు కావడం లేదు"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"స్టాప్వాచ్ అమలవుతున్నందున రీసెట్ చేయడం సాధ్యపడదు"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"స్టాప్వాచ్ ఆపివేయబడింది"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"స్టాప్వాచ్ పాజ్ చేయబడింది"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"స్టాప్వాచ్ రీసెట్ చేయబడింది"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"స్టాప్వాచ్ ల్యాప్ చేయబడింది"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"స్టాప్వాచ్ ప్రారంభించబడింది"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"ఈ సమయానికి అలారం ఏదీ షెడ్యూల్ చేయబడలేదు"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> అలారాన్ని తీసివేసారు"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g>కి అలారాన్ని సెట్ చేసారు"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"టైమర్ ఏదీ సెట్ చేయలేదు"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"టైమర్ను తొలగించారు"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"టైమర్ ఇప్పటికే అమలవుతోంది"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"మీ అభ్యర్థనను పూర్తి చేయడం సాధ్యపడలేదు, పలు టైమర్లు అందుబాటులో ఉన్నాయి"</string>
- <string name="timer_started" msgid="6715582052946641641">"టైమర్ను ప్రారంభించారు"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"టైమర్లేవీ లేవు"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"ఒకటి కంటే ఎక్కువ టైమర్లు ఉన్నాయి"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"టైమర్ తీసివేయబడింది."</string>
<string name="timer_created" msgid="4381027137335885547">"టైమర్ను సృష్టించారు"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"టైమర్ నిడివి చెల్లదు"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"టైమర్ను రీసెట్ చేసారు"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"టైమర్ ఇప్పటికీ అమలవుతూనే ఉన్నందున దాన్ని రీసెట్ చేయలేరు. రీసెట్ చేయడానికి టైమర్ను ఆపివేయండి."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"టైమర్ ఇప్పటికే ఆపివేయబడింది"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"టైమర్ను తొలగించారు"</string>
+ <string name="timer_started" msgid="6715582052946641641">"టైమర్ను ప్రారంభించారు"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"టైమర్ నిడివి చెల్లదు"</string>
<string name="no_city_selected" msgid="1007596865203283741">"నగరం ఏదీ ఎంచుకోలేదు"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"మీరు పేర్కొన్న నగరం అందుబాటులో లేదు"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"ఆ నగరాన్ని ఇప్పటికే జోడించారు"</string>
diff --git a/res/values-th/array.xml b/res/values-th/array.xml
index f6af141..fac4e07 100644
--- a/res/values-th/array.xml
+++ b/res/values-th/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ฟ<xliff:g id="SEPARATOR">=</xliff:g>โฟร์ตาเลซา"</item>
<item msgid="5801558418916235541">"ก<xliff:g id="SEPARATOR">=</xliff:g>แกรนด์เติร์ก"</item>
<item msgid="2103759276235503048">"ก<xliff:g id="SEPARATOR">=</xliff:g>เกรเนดา"</item>
- <item msgid="1490069759176391533">"ก<xliff:g id="SEPARATOR">=</xliff:g>กัวเตมาลา"</item>
+ <item msgid="6216160110733510854">"ก<xliff:g id="SEPARATOR">=</xliff:g>กัวเตมาลาซิตี"</item>
<item msgid="525959305652046261">"ก<xliff:g id="SEPARATOR">=</xliff:g>กายอานา"</item>
<item msgid="7565596629973190931">"ฮ<xliff:g id="SEPARATOR">=</xliff:g>แฮลิแฟกซ์"</item>
<item msgid="3811169155065582644">"ฮ<xliff:g id="SEPARATOR">=</xliff:g>ฮาวานา"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ต<xliff:g id="SEPARATOR">=</xliff:g>โตรอนโต"</item>
<item msgid="1506838283840737263">"ว<xliff:g id="SEPARATOR">=</xliff:g>แวนคูเวอร์"</item>
<item msgid="8935386104773857399">"ว<xliff:g id="SEPARATOR">=</xliff:g>วินนิเพก"</item>
- <item msgid="1132634022412399582">"ข<xliff:g id="SEPARATOR">=</xliff:g>ขั้วโลกใต้"</item>
+ <item msgid="498429228419399474">"ข<xliff:g id="SEPARATOR">=</xliff:g>ขั้วโลกใต้<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ล<xliff:g id="SEPARATOR">=</xliff:g>ลองเยียร์เบียน"</item>
<item msgid="3784788073896028355">"อ<xliff:g id="SEPARATOR">=</xliff:g>อัลมาตี"</item>
<item msgid="7895695236056852523">"อ<xliff:g id="SEPARATOR">=</xliff:g>อัมมาน"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"ก<xliff:g id="SEPARATOR">=</xliff:g>กาซา"</item>
<item msgid="2359068282340162319">"ฮ<xliff:g id="SEPARATOR">=</xliff:g>ฮีบรอน"</item>
<item msgid="6223396610551759129">"ฮ<xliff:g id="SEPARATOR">=</xliff:g>โฮจิมินห์"</item>
- <item msgid="4731022818651322736">"ฮ<xliff:g id="SEPARATOR">=</xliff:g>ฮ่องกง"</item>
+ <item msgid="3439764751788710130">"ฮ<xliff:g id="SEPARATOR">=</xliff:g>ฮ่องกง<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"อ<xliff:g id="SEPARATOR">=</xliff:g>อิสตันบูล"</item>
<item msgid="758800913783999425">"จ<xliff:g id="SEPARATOR">=</xliff:g>จาการ์ตา"</item>
<item msgid="8956406398692698126">"ย<xliff:g id="SEPARATOR">=</xliff:g>เยรูซาเลม"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"ม<xliff:g id="SEPARATOR">=</xliff:g>มะนิลา"</item>
<item msgid="6033964325069060422">"ม<xliff:g id="SEPARATOR">=</xliff:g>มัสกัต"</item>
<item msgid="6077458941399984780">"พ<xliff:g id="SEPARATOR">=</xliff:g>พนมเปญ"</item>
- <item msgid="935474308903572975">"ป<xliff:g id="SEPARATOR">=</xliff:g>เปียงยาง"</item>
+ <item msgid="1245515372520913197">"ป<xliff:g id="SEPARATOR">=</xliff:g>เปียงยาง<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"ก<xliff:g id="SEPARATOR">=</xliff:g>กาตาร์"</item>
<item msgid="1667243110545095146">"ย<xliff:g id="SEPARATOR">=</xliff:g>ย่างกุ้ง"</item>
<item msgid="4460370766685855731">"ร<xliff:g id="SEPARATOR">=</xliff:g>ริยาด"</item>
<item msgid="4229224905931739201">"ซ<xliff:g id="SEPARATOR">=</xliff:g>ไซ่ง่อน"</item>
<item msgid="8705359848250215620">"ซ<xliff:g id="SEPARATOR">=</xliff:g>โซล"</item>
- <item msgid="583367295371395814">"ซ<xliff:g id="SEPARATOR">=</xliff:g>เซี่ยงไฮ้"</item>
+ <item msgid="3814881931186962624">"ซ<xliff:g id="SEPARATOR">=</xliff:g>เซี่ยงไฮ้<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"ส<xliff:g id="SEPARATOR">=</xliff:g>สิงคโปร์"</item>
- <item msgid="1972491729911039207">"ท<xliff:g id="SEPARATOR">=</xliff:g>ไทเป"</item>
+ <item msgid="8982451946156859368">"ท<xliff:g id="SEPARATOR">=</xliff:g>ไทเป<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"ต<xliff:g id="SEPARATOR">=</xliff:g>เตหะราน"</item>
<item msgid="8629402941285674273">"ท<xliff:g id="SEPARATOR">=</xliff:g>เทลอาวีฟ"</item>
- <item msgid="8499164674454654525">"ต<xliff:g id="SEPARATOR">=</xliff:g>โตเกียว"</item>
+ <item msgid="76330681636547168">"ต<xliff:g id="SEPARATOR">=</xliff:g>โตเกียว<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"อ<xliff:g id="SEPARATOR">=</xliff:g>อูลานบาตอร์"</item>
<item msgid="2028626988021468640">"บ<xliff:g id="SEPARATOR">=</xliff:g>เบอร์มิวดา"</item>
<item msgid="4527109966513690429">"ค<xliff:g id="SEPARATOR">=</xliff:g>คะแนรี"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"ร<xliff:g id="SEPARATOR">=</xliff:g>รีโน"</item>
<item msgid="9155068631060038769">"บ<xliff:g id="SEPARATOR">=</xliff:g>แบล็กร็อกซิตี"</item>
<item msgid="8498761319928979900">"ด<xliff:g id="SEPARATOR">=</xliff:g>โดฮา"</item>
- <item msgid="8307897251088048641">"ป<xliff:g id="SEPARATOR">=</xliff:g>ปักกิ่ง"</item>
+ <item msgid="5327010922199714808">"ป<xliff:g id="SEPARATOR">=</xliff:g>ปักกิ่ง<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"ม<xliff:g id="SEPARATOR">=</xliff:g>มุมไบ"</item>
<item msgid="6668274273067049125">"ด<xliff:g id="SEPARATOR">=</xliff:g>เดลี"</item>
- <item msgid="2933410189478233292">"อ<xliff:g id="SEPARATOR">=</xliff:g>โอซะกะ"</item>
+ <item msgid="7199039603593847813">"อ<xliff:g id="SEPARATOR">=</xliff:g>โอซะกะ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ล<xliff:g id="SEPARATOR">=</xliff:g>ละฮอร์"</item>
<item msgid="1448378291805481500">"ซ<xliff:g id="SEPARATOR">=</xliff:g>ซานา"</item>
<item msgid="5233119846682408301">"บ<xliff:g id="SEPARATOR">=</xliff:g>บาร์เซโลนา"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"ค<xliff:g id="SEPARATOR">=</xliff:g>เคมบริดจ์"</item>
<item msgid="759409010285366934">"ค<xliff:g id="SEPARATOR">=</xliff:g>เคิร์กแลนด์"</item>
<item msgid="6308007059287569663">"ม<xliff:g id="SEPARATOR">=</xliff:g>แมดิสัน"</item>
- <item msgid="6971636434858330021">"ก<xliff:g id="SEPARATOR">=</xliff:g>กว่างโจว"</item>
+ <item msgid="2077617905582224600">"ก<xliff:g id="SEPARATOR">=</xliff:g>กว่างโจว<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"ฮ<xliff:g id="SEPARATOR">=</xliff:g>ไฮเดอราบาด"</item>
<item msgid="3032295682584784261">"ร<xliff:g id="SEPARATOR">=</xliff:g>เรสตัน"</item>
<item msgid="7722837296297332268">"บ<xliff:g id="SEPARATOR">=</xliff:g>เบโลโอรีซอนชี"</item>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 87b281b..c360f0f 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"แสดงนาฬิกา"</string>
<string name="hide_clock" msgid="3217727306480505694">"ซ่อนนาฬิกา"</string>
<string name="label" msgid="162189613902857319">"ป้ายกำกับ"</string>
+ <string name="on_switch" msgid="2297966258029227449">"เปิด"</string>
+ <string name="off_switch" msgid="3381070073851148013">"ปิด"</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="6506982899651975645">"เสียงเตือน"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"เสียงเรียกเข้าแบบกำหนดเอง"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"การจับเวลาสิ้นสุด"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"เงียบ"</string>
<string name="ringtone" msgid="9110746249688559579">"เสียงเรียกเข้า"</string>
<string name="time" msgid="8067216534232296518">"เวลา"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"พรุ่งนี้"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"ปิดเสียงเตือนชั่วคราวจนถึง <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"ตั้งปลุกครั้งต่อไป"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"ลบการปลุกที่พลาดออกไปแล้ว"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"เหลืออีกไม่ถึงหนึ่งนาที"</item>
- <item msgid="83197792732433351">"เหลืออีก <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"เหลืออีก <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"เหลืออีก <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"เหลืออีกไม่ถึง 1 นาที"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"เหลืออีก <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"เหลืออีก"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"เหลืออีก"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"ตั้งเวลาปลุกในอีกไม่ถึง 1 นาทีต่อจากนี้"</item>
<item msgid="6002066367368421848">"ตั้งเวลาปลุกในอีก <xliff:g id="DAYS">%1$s</xliff:g> ต่อจากนี้"</item>
@@ -101,6 +104,10 @@
<item quantity="other">นาที</item>
<item quantity="one">นาที</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"ค่อยๆ เพิ่มระดับเสียง"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"ปิด"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> วินาที"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"วินาที"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"ปิดเสียงหลังจาก"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> นาที</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"เปลี่ยนกลับ"</string>
<string name="delete" msgid="5732434972457000541">"ลบ"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"ระดับเสียงปลุก"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"ปิดเสียง"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"เงียบ"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"ไม่ทราบ"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"ปิดเสียงเตือนชั่วคราวหรือปิดการปลุก"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (ปิดเสียงเตือนชั่วคราว)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"ตั้งปลุกไว้ในเวลา <xliff:g id="TIME">%s</xliff:g> แตะเพื่อยกเลิก"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"กำลังโหลดเสียงเรียกเข้า..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"บริการเล่นเสียงสำหรับตัวจับเวลาที่ตั้งไว้ในนาฬิกา"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"ตั้งปลุก"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"เตือน"</string>
<string name="menu_timer" msgid="6459070074762877114">"ตัวจับเวลา"</string>
<string name="menu_clock" msgid="5612760670606829805">"นาฬิกา"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"จัดเรียงตามชื่อ"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"เมืองที่เลือก"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"ดำเนินการต่อ"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"เริ่มต้น"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"หยุด"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"รอบ"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"รีเซ็ต"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"เริ่มต้น"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"หยุดชั่วคราว"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"รอบ"</string>
<string name="sw_share_button" msgid="4478648110382859382">"แชร์"</string>
<string name="hours_label" msgid="3393478155635368097">"ชม."</string>
<string name="minutes_label" msgid="3568098128251438588">"น."</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"เวลาของฉันคือ <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"เวลาสิ้นสุดรอบ:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"สิ้นสุดรอบที่ <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> ชั่วโมง</item>
<item quantity="one">1 ชั่วโมง</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"เพิ่ม 1 นาที"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"เพิ่ม 1 นาที"</string>
<string name="timer_stop" msgid="3361154678667736722">"หยุด"</string>
- <string name="timer_done" msgid="2375990511982914051">"เสร็จสิ้น"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"หยุดใช้ตัวจับเวลาทั้งหมด"</string>
<string name="timer_reset" msgid="7848424809190171640">"รีเซ็ต"</string>
<string name="timer_cancel" msgid="3572868404230815644">"ยกเลิก"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"ยกเลิกการตั้งเวลาแล้ว"</string>
<string name="timer_times_up" msgid="9190440395938519009">"หมดเวลา"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"การจับเวลา <xliff:g id="NUM_TIMERS">%d</xliff:g> ครั้งครบแล้ว"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"ตัวจับเวลา"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"มีตัวจับเวลาได้สูงสุด 4 ตัว"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"หยุดชั่วคราว"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"รีเซ็ตตัวจับเวลาทั้งหมด"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"คุณนี่เป็นพวกคลั่งไคล้ความเร็วเสียจริง"</item>
<item msgid="6332879039890727169">"เริงรื่นกับผลสำเร็จจากความทุ่มเทของคุณ"</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"เมือง"</string>
<string name="clock_settings" msgid="8317286807280600391">"นาฬิกา"</string>
<string name="clock_style" msgid="2265011060429742344">"รูปแบบ"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"เปลี่ยนแปลงวันที่และเวลา"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"แอนะล็อก"</item>
<item msgid="8483930821046925592">"ดิจิทัล"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"เลือก <xliff:g id="CITY_NAME">%s</xliff:g> แล้ว"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"ยกเลิกการเลือก <xliff:g id="CITY_NAME">%s</xliff:g> แล้ว"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"หมู่เกาะมาร์แชล"</item>
<item msgid="4196408495909011020">"เกาะมิดเวย์"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"จาการ์ตา"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"การปลุก"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"บริการนาฬิกาจับเวลาเพื่อเรียกใช้การแจ้งเตือน"</string>
- <string name="swn_stopped" msgid="783124901663086172">"หยุดแล้ว"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"ดำเนินการทำงานจากการแจ้งเตือนของนาฬิกานับถอยหลัง"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"ดำเนินการทำงานจากการแจ้งเตือนของนาฬิกาจับเวลา"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"หยุดชั่วคราวแล้ว"</string>
<string name="description_direction_right" msgid="5709209043267548985">"กวาดไปทางขวาเพื่อปิด"</string>
<string name="description_direction_left" msgid="7448141043674998679">"กวาดไปทางซ้ายเพื่อปิดเสียงเตือนชั่วคราว"</string>
<string name="description_direction_both" msgid="1841309486023845685">"กวาดไปทางซ้ายเพื่อปิดเสียงเตือนชั่วคราวหรือไปทางขวาเพื่อปิด"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"ตัวจับเวลา"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"เสียงเรียกเข้าของตัวจับเวลา"</string>
<string name="timer_stopped" msgid="2730331837832462008">"หยุดนาฬิกาจับเวลาแล้ว"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"หยุดนาฬิกาจับเวลาแล้ว <xliff:g id="NUMBER">%d</xliff:g> เรือน"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"หยุดตัวจับเวลาชั่วคราวแล้ว"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"หยุด <xliff:g id="NUMBER">%d</xliff:g> ตัวจับเวลาชั่วคราว"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"แตะเพื่อดูนาฬิกาจับเวลาของคุณ"</string>
<string name="timers_in_use" msgid="5570729467344408506">"นาฬิกาจับเวลา <xliff:g id="NUMBER">%d</xliff:g> เรือน"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"นาฬิกาจับเวลาถัดไป: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"ไม่มีการเตือน"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"ไม่ได้ตั้งปลุก"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"ไม่มีการปลุกที่กำลังจะมาถึง"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"เวลาไม่ถูกต้อง <xliff:g id="INVALID_HOUR">%d</xliff:g>.<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"ไม่มีการปลุกที่เวลา <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"ไม่มีการตั้งปลุก"</string>
<string name="no_label_specified" msgid="2008482054428460626">"ไม่ได้ระบุป้ายกำกับ"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"ไม่มีการปลุกที่มีป้ายกำกับนี้"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"นาฬิกาจับเวลากำลังทำงานอยู่แล้ว"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"นาฬิกาจับเวลาไม่ได้ทำงานอยู่"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"ไม่สามารถรีเซ็ตนาฬิกาจับเวลา เพราะกำลังทำงานอยู่"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"หยุดจับเวลาแล้ว"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"นาฬิกาจับเวลาหยุดชั่วคราวแล้ว"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"รีเซ็ตนาฬิกาจับเวลาแล้ว"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"จับเวลาที่ล่วงไปแล้ว"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"เริ่มจับเวลาแล้ว"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"ไม่ได้ตั้งปลุกสำหรับเวลานี้"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"ปิดการปลุกเวลา <xliff:g id="ALARM_TIME">%s</xliff:g> แล้ว"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"ตั้งการปลุกที่เวลา <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"ไม่มีการตั้งจับเวลา"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"ลบตัวจับเวลาแล้ว"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"ตัวจับเวลากำลังทำงานอยู่แล้ว"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"ไม่สามารถดำเนินการตามคำขอได้สำเร็จ เพราะมีการจับเวลาหลายรายการ"</string>
- <string name="timer_started" msgid="6715582052946641641">"เริ่มจับเวลาแล้ว"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"ไม่ได้จับเวลาอยู่"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"มีการจับเวลามากกว่า 1 รายการ"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"นำตัวจับเวลาออกแล้ว"</string>
<string name="timer_created" msgid="4381027137335885547">"สร้างการจับเวลาแล้ว"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"ระยะเวลาในการจับเวลาไม่ถูกต้อง"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"รีเซ็ตตัวจับเวลาแล้ว"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"ไม่สามารถรีเซ็ตตัวจับเวลาได้เนื่องจากยังทำงานอยู่ โปรดหยุดตัวจับเวลาเพื่อรีเซ็ต"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"หยุดตัวจับเวลาไปแล้ว"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"ลบตัวจับเวลาแล้ว"</string>
+ <string name="timer_started" msgid="6715582052946641641">"เริ่มจับเวลาแล้ว"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"ระยะเวลาในการจับเวลาไม่ถูกต้อง"</string>
<string name="no_city_selected" msgid="1007596865203283741">"ไม่ได้เลือกเมือง"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"ไม่มีเมืองที่คุณระบุ"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"เพิ่มเมืองนั้นไว้แล้ว"</string>
diff --git a/res/values-tl/array.xml b/res/values-tl/array.xml
index bcf0ee5..54ba5da 100644
--- a/res/values-tl/array.xml
+++ b/res/values-tl/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala City"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>South Pole"</item>
+ <item msgid="498429228419399474">"S<xliff:g id="SEPARATOR">=</xliff:g>South Pole<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Maynila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Tehran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index f792b92..cd19f03 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Ipakita ang orasan"</string>
<string name="hide_clock" msgid="3217727306480505694">"Itago ang orasan"</string>
<string name="label" msgid="162189613902857319">"Label"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Naka-on"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Naka-off"</string>
<string name="default_label" msgid="5590025289805630372">"Alarm"</string>
<string name="set_alarm" msgid="9148359866152726808">"Magtakda ng alarm"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"I-vibrate"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Ulitin"</string>
<string name="alert" msgid="6506982899651975645">"Ringtone ng Alarm"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Custom na Ringtone"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Nag-expire na ang Timer"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Naka-silent"</string>
<string name="ringtone" msgid="9110746249688559579">"Ringtone"</string>
<string name="time" msgid="8067216534232296518">"Oras"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Bukas"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Nag-i-snooze hanggang <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Paparating na alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Na-delete ang iyong nakaligtaang alarm"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Wala nang isang minuto ang natitira"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> ang natitira"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> ang natitira"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> ang natitira"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Wala nang isang minuto ang natitira"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> pa ang natitira"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"natitira"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"natitira"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Nakatakda ang alarm nang mas maikli sa 1 minuto mula ngayon."</item>
<item msgid="6002066367368421848">"Nakatakda ang alarm sa <xliff:g id="DAYS">%1$s</xliff:g> mula ngayon."</item>
@@ -101,6 +104,10 @@
<item quantity="one">minuto</item>
<item quantity="other">na minuto</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Dahan-dahang lakasan ang volume"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Naka-off"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> (na) segundo"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"mga segundo"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Tahimik pagkatapos ng"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> minuto</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Ibalik"</string>
<string name="delete" msgid="5732434972457000541">"Tanggalin"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Lakas ng tunog ng alarm"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Tahimik"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Naka-silent"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Hindi alam"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"I-snooze o huwag pansinin ang alarm."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (naka-snooze)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Nakatakda ang alarm sa <xliff:g id="TIME">%s</xliff:g>. Pindutin upang kanselahin."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Nilo-load ang ringtone…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Serbisyo sa pag-playback ng tunog para sa itinakdang mga timer sa Orasan."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"I-set ang alarm"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Timer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Orasan"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Uriin ayon sa pangalan"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Mga Piniling Lungsod"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Ituloy"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Simulan"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Ihinto"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Lap"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"I-reset"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Simulan"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"I-pause"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Lap"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Ibahagi"</string>
<string name="hours_label" msgid="3393478155635368097">"o"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Ang aking oras ay <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Mga lap time:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Lap <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> oras</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> na oras</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Magdagdag ng 1 minuto"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Magdagdag ng 1 min"</string>
<string name="timer_stop" msgid="3361154678667736722">"Ihinto"</string>
- <string name="timer_done" msgid="2375990511982914051">"Tapos na"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Ihinto ang lahat ng timer"</string>
<string name="timer_reset" msgid="7848424809190171640">"I-reset"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Kanselahin"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Kinansela ang timer"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Oras na"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> (na) timer, nag-expire"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Timer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"4 na timer ang maximum"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"I-pause"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"I-reset lahat ng timer"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Napakabilis mo naman."</item>
<item msgid="6332879039890727169">"I-enjoy ang mga pinagsikapan mo."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Mga Lungsod"</string>
<string name="clock_settings" msgid="8317286807280600391">"Orasan"</string>
<string name="clock_style" msgid="2265011060429742344">"Istilo"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Baguhin ang Petsa & oras"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analog"</item>
<item msgid="8483930821046925592">"Digital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Naka-check ang <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Walang check ang <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshall Islands"</item>
<item msgid="4196408495909011020">"Midway Island"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Mga Alarm"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Serbisyo ng stopwatch upang patakbuhin ang notification."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Itinigil"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Pinoproseso ang mga pagkilos mula sa mga notification sa timer."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Pinoproseso ang mga pagkilos mula sa mga notification sa stopwatch."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Naka-pause"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Mag-swipe pakanan upang i-dismiss"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Mag-swipe pakaliwa upang mag-snooze"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Mag-swipe pakaliwa upang i-snooze o pakanan upang i-dismiss"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Mga Timer"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ringtone ng timer"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Huminto ang timer"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Huminto ang <xliff:g id="NUMBER">%d</xliff:g> (na) timer"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Naka-pause ang timer"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Naka-pause ang <xliff:g id="NUMBER">%d</xliff:g> timer"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Pindutin upang tingnan ang iyong mga timer"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> (na) timer"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Susunod na timer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Walang Mga Alarm"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Wala nakatakda alarm"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"WALANG PAPARATING NA ALARMA"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Di-wastong oras <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Walang alarm sa <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Walang mga naka-iskedyul na alarm"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Walang tinukoy na label"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Walang mga alarm ang may ganitong label"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Gumagana na ang stopwatch"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Hindi gumagana ang stopwatch"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Hindi maaaring i-reset ang stopwatch dahil tumatakbo ito"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Ihininto ang stopwatch"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Na-pause ang stopwatch"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Na-reset ang stopwatch"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Lumipat ng lap ang stopwatch"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Sinimulan ang stopwatch"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Walang nakaiskedyul na alarm para sa oras na ito"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Na-dismiss ang alarm na <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Nakatakda na ang alarm para sa <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Walang nakatakdang timer"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Na-delete ang timer"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Gumagana na ang timer"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Hindi makumpleto ang iyong kahilingan, available ang maraming timer"</string>
- <string name="timer_started" msgid="6715582052946641641">"Sinimulan ang timer"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Walang mga timer sa kasalukuyan"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"May mahigit sa isang timer sa kasalukuyan"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Naalis na ang timer."</string>
<string name="timer_created" msgid="4381027137335885547">"Nagawa ang timer"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Hindi wastong tagal ng timer"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Ni-reset ang timer"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Hindi maaaring i-reset ang timer dahil gumagana pa ito. Ihinto ang timer upang i-reset."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Huminto na ang timer"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Na-delete ang timer"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Sinimulan ang timer"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Hindi wastong tagal ng timer"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Walang napiling lungsod"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Hindi available ang lungsod na tinukoy mo"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Naidagdag na ang lungsod na iyan"</string>
diff --git a/res/values-tr/array.xml b/res/values-tr/array.xml
index af84b90..a3b49ba 100644
--- a/res/values-tr/array.xml
+++ b/res/values-tr/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"<xliff:g id="SEPARATOR">=</xliff:g>Granada"</item>
- <item msgid="1490069759176391533">"<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala Şehri"</item>
<item msgid="525959305652046261">"<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"<xliff:g id="SEPARATOR">=</xliff:g>Güney Kutbu"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>Güney Kutbu<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>Almaata"</item>
<item msgid="7895695236056852523">"<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"<xliff:g id="SEPARATOR">=</xliff:g>Gazze"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>El Halil"</item>
<item msgid="6223396610551759129">"<xliff:g id="SEPARATOR">=</xliff:g>Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>İstanbul"</item>
<item msgid="758800913783999425">"<xliff:g id="SEPARATOR">=</xliff:g>Cakarta"</item>
<item msgid="8956406398692698126">"<xliff:g id="SEPARATOR">=</xliff:g>Kudüs"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"<xliff:g id="SEPARATOR">=</xliff:g>Maskat"</item>
<item msgid="6077458941399984780">"<xliff:g id="SEPARATOR">=</xliff:g>Phnom Penh"</item>
- <item msgid="935474308903572975">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"<xliff:g id="SEPARATOR">=</xliff:g>Katar"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>Riyad"</item>
<item msgid="4229224905931739201">"<xliff:g id="SEPARATOR">=</xliff:g>Saygon"</item>
<item msgid="8705359848250215620">"<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"<xliff:g id="SEPARATOR">=</xliff:g>Şangay"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>Şangay<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"<xliff:g id="SEPARATOR">=</xliff:g>Tahran"</item>
<item msgid="8629402941285674273">"<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>Ulan Batur"</item>
<item msgid="2028626988021468640">"<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"<xliff:g id="SEPARATOR">=</xliff:g>Black Rock City"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"<xliff:g id="SEPARATOR">=</xliff:g>Pekin"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>Pekin<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"<xliff:g id="SEPARATOR">=</xliff:g>Haydarabat"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 4a0b57c..a1312b7 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -28,12 +28,15 @@
<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="on_switch" msgid="2297966258029227449">"Açık"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Kapalı"</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="6506982899651975645">"Alarm Zil Sesi"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Özel Zil Sesi"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Zamanlayıcının Süresi Doldu"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Sessiz"</string>
<string name="ringtone" msgid="9110746249688559579">"Zil sesi"</string>
<string name="time" msgid="8067216534232296518">"Saat"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Yarın"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Şu saate kadar ertelendi: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Yaklaşan alarm"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Kaçırılan alarmınız silindi"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Bir dakikadan az kaldı"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> kaldı"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> kaldı"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> kaldı"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Bir dakikadan az kaldı"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> kaldı"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"kaldı"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"kaldı"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Alarmın çalmasına şu andan itibaren bir dakikadan az var."</item>
<item msgid="6002066367368421848">"Alarmın çalmasına şu andan itibaren <xliff:g id="DAYS">%1$s</xliff:g> var."</item>
@@ -101,6 +104,10 @@
<item quantity="other">dakika</item>
<item quantity="one">dakika</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Ses düzeyini kademeli olarak artır"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Kapalı"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> saniye"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"saniye"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Şu süreden sonra sessiz"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> dakika</item>
@@ -126,7 +133,8 @@
<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="silent_alarm_summary" msgid="8605302849408279221">"Sessiz"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Sessiz"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Bilinmiyor"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Alarmı ertele veya kapat."</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="4819324081410990368">"Alarm <xliff:g id="TIME">%s</xliff:g> için ayarlandı. İptal etmek için dokunun."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Zil sesi yükleniyor..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Clock\'ta ayarlanmış alarmlar için ses çalma hizmeti."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Alarmı ayarla"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Alarm"</string>
<string name="menu_timer" msgid="6459070074762877114">"Zamanlayıcı"</string>
<string name="menu_clock" msgid="5612760670606829805">"Saat"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Ada göre sırala"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Seçilen Şehirler"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Devam Ettir"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Başlat"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Durdur"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Tur"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Sıfırla"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Başlat"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Duraklat"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Tur"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Paylaş"</string>
<string name="hours_label" msgid="3393478155635368097">"s"</string>
<string name="minutes_label" msgid="3568098128251438588">"d"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Saatim: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Tur süreleri:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>. tur"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"<xliff:g id="NUMBER">%d</xliff:g>."</item>
- <item msgid="316923361931627987">"<xliff:g id="NUMBER">%02d</xliff:g>."</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> saat</item>
<item quantity="one">1 saat</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 Dakika Ekle"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 dk ekle"</string>
<string name="timer_stop" msgid="3361154678667736722">"Durdur"</string>
- <string name="timer_done" msgid="2375990511982914051">"Tamamlandı"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Tüm zamanlayıcılr durdur"</string>
<string name="timer_reset" msgid="7848424809190171640">"Sıfırla"</string>
<string name="timer_cancel" msgid="3572868404230815644">"İptal"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Zamanlayıcı iptal edildi"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Süre doldu"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> zamanlayc. süresi doldu"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Zamanlayıcı"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"En fazla 4 zamanlayıcı"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Duraklat"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Tüm zamanlayıcıları sıfırla"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Oldukça yüksek hız tutkunusunuz."</item>
<item msgid="6332879039890727169">"Çalışmanızın meyvesini toplayabilirsiniz."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Şehirler"</string>
<string name="clock_settings" msgid="8317286807280600391">"Saat"</string>
<string name="clock_style" msgid="2265011060429742344">"Stil"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Tarih ve saati değiştir"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Analog"</item>
<item msgid="8483930821046925592">"Dijital"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> işaretlendi"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> işareti kaldırıldı"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshall Adaları"</item>
<item msgid="4196408495909011020">"Midway Adası"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Cakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Alarmlar"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Bildirimleri çalıştırmak için kronometre hizmeti."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Durduruldu"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Zamanlayıcı bildirimlerinden gelen etkinlikleri işler."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Kronometre bildirimlerinden gelen etkinlikleri işler."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Duraklatıldı"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Kapatmak için hızlıca sağa kaydırın"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Ertelemek için hızlıca sola kaydırın"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Ertelemek için sola, kapatmak için sağa hızlıca kaydırın"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Zamanlayıcılar"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Zamanlayıcı zil sesi"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Zamanlayıcı durdu"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> zamanlayıcı durdu"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Zamanlayıcı duraklatıldı"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> zamanlayıcı duraklatıldı"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Zamanlayıcılarınızı görmek için dokunun"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> zamanlayıcı"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Sonraki zamanlayıcı: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Alarm Yok"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Alarm yok"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"YAKLAŞAN ALARM YOK"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Geçersiz saat: <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Şu saate ayarlanmış alarm yok: <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Programlanmış alarm yok"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Etiket belirtilmedi"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Etiketi içeren alarm yok"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Kronomotre zaten çalışıyor"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Kronometre çalışmıyor"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Kronometre çalışıyor olduğundan sıfırlanamaz."</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Kronometre durduruldu"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Kronometre duraklatıldı"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Kronometre sıfırlandı"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Kronometrede tur kaydedildi"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Kronometre başlatıldı"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Bu saat için alarm programlanmadı"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> alarmı kapatıldı"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Alarm <xliff:g id="ALARM_TIME">%s</xliff:g> için ayarlandı"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Zamanlayıcı ayarlanmadı"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Zamanlayıcı silindi"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Zamanlayıcı zaten çalışıyor"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"İsteğiniz tamamlanamadı. Birden fazla zamanlayıcı mevcut"</string>
- <string name="timer_started" msgid="6715582052946641641">"Zamanlayıcı başlatıldı"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Zamanlayıcı yok"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Birden fazla zamanlayıcı mevcut"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Zamanlayıcı kaldırıldı."</string>
<string name="timer_created" msgid="4381027137335885547">"Zamanlayıcı oluşturuldu"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Geçersiz zamanlayıcı uzunluğu"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Zamanlayıcı sıfırlandı"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Zamanlayıcı hâlâ çalıştığından sıfırlanamaz. Sıfırlamak için zamanlayıcıyı durdurun."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Zamanlayıcı zaten durdu"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Zamanlayıcı silindi"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Zamanlayıcı başlatıldı"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Geçersiz zamanlayıcı uzunluğu"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Şehir seçilmedi"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Belirttiğiniz şehir kullanılamıyor"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Bu şehir zaten eklendi"</string>
diff --git a/res/values-uk/array.xml b/res/values-uk/array.xml
index 5ab4a5d..6ae3436 100644
--- a/res/values-uk/array.xml
+++ b/res/values-uk/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"Ф<xliff:g id="SEPARATOR">=</xliff:g>Форталеза"</item>
<item msgid="5801558418916235541">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гранд-Терк"</item>
<item msgid="2103759276235503048">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гренада"</item>
- <item msgid="1490069759176391533">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемала"</item>
+ <item msgid="6216160110733510854">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гватемала (місто)"</item>
<item msgid="525959305652046261">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гаяна"</item>
<item msgid="7565596629973190931">"Г<xliff:g id="SEPARATOR">=</xliff:g>Галіфакс"</item>
<item msgid="3811169155065582644">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гавана"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"Т<xliff:g id="SEPARATOR">=</xliff:g>Торонто"</item>
<item msgid="1506838283840737263">"В<xliff:g id="SEPARATOR">=</xliff:g>Ванкувер"</item>
<item msgid="8935386104773857399">"В<xliff:g id="SEPARATOR">=</xliff:g>Вінніпег"</item>
- <item msgid="1132634022412399582">"П<xliff:g id="SEPARATOR">=</xliff:g>Південний полюс"</item>
+ <item msgid="498429228419399474">"П<xliff:g id="SEPARATOR">=</xliff:g>Південний полюс<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"Л<xliff:g id="SEPARATOR">=</xliff:g>Лонг’їр"</item>
<item msgid="3784788073896028355">"А<xliff:g id="SEPARATOR">=</xliff:g>Алмати"</item>
<item msgid="7895695236056852523">"А<xliff:g id="SEPARATOR">=</xliff:g>Амман"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"С<xliff:g id="SEPARATOR">=</xliff:g>Сектор Гази"</item>
<item msgid="2359068282340162319">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хеврон"</item>
<item msgid="6223396610551759129">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хо Ши Мін"</item>
- <item msgid="4731022818651322736">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гонконг"</item>
+ <item msgid="3439764751788710130">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гонконг<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"С<xliff:g id="SEPARATOR">=</xliff:g>Стамбул"</item>
<item msgid="758800913783999425">"Д<xliff:g id="SEPARATOR">=</xliff:g>Джакарта"</item>
<item msgid="8956406398692698126">"Є<xliff:g id="SEPARATOR">=</xliff:g>Єрусалим"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"М<xliff:g id="SEPARATOR">=</xliff:g>Маніла"</item>
<item msgid="6033964325069060422">"М<xliff:g id="SEPARATOR">=</xliff:g>Маскат"</item>
<item msgid="6077458941399984780">"П<xliff:g id="SEPARATOR">=</xliff:g>Пномпень"</item>
- <item msgid="935474308903572975">"П<xliff:g id="SEPARATOR">=</xliff:g>Пхеньян"</item>
+ <item msgid="1245515372520913197">"П<xliff:g id="SEPARATOR">=</xliff:g>Пхеньян<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"К<xliff:g id="SEPARATOR">=</xliff:g>Катар"</item>
<item msgid="1667243110545095146">"Я<xliff:g id="SEPARATOR">=</xliff:g>Янгон"</item>
<item msgid="4460370766685855731">"Е<xliff:g id="SEPARATOR">=</xliff:g>Ер-Ріяд"</item>
<item msgid="4229224905931739201">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хошимін"</item>
<item msgid="8705359848250215620">"С<xliff:g id="SEPARATOR">=</xliff:g>Сеул"</item>
- <item msgid="583367295371395814">"Ш<xliff:g id="SEPARATOR">=</xliff:g>Шанхай"</item>
+ <item msgid="3814881931186962624">"Ш<xliff:g id="SEPARATOR">=</xliff:g>Шанхай<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"С<xliff:g id="SEPARATOR">=</xliff:g>Сінгапур"</item>
- <item msgid="1972491729911039207">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тайбей"</item>
+ <item msgid="8982451946156859368">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тайбей<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тегеран"</item>
<item msgid="8629402941285674273">"Т<xliff:g id="SEPARATOR">=</xliff:g>Тель-Авів"</item>
- <item msgid="8499164674454654525">"Т<xliff:g id="SEPARATOR">=</xliff:g>Токіо"</item>
+ <item msgid="76330681636547168">"Т<xliff:g id="SEPARATOR">=</xliff:g>Токіо<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"У<xliff:g id="SEPARATOR">=</xliff:g>Улан-Батор"</item>
<item msgid="2028626988021468640">"Б<xliff:g id="SEPARATOR">=</xliff:g>Бермудські острови"</item>
<item msgid="4527109966513690429">"К<xliff:g id="SEPARATOR">=</xliff:g>Канарські острови"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рено"</item>
<item msgid="9155068631060038769">"Б<xliff:g id="SEPARATOR">=</xliff:g>Блек-Рок-Сіті"</item>
<item msgid="8498761319928979900">"Д<xliff:g id="SEPARATOR">=</xliff:g>Доха"</item>
- <item msgid="8307897251088048641">"П<xliff:g id="SEPARATOR">=</xliff:g>Пекін"</item>
+ <item msgid="5327010922199714808">"П<xliff:g id="SEPARATOR">=</xliff:g>Пекін<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"М<xliff:g id="SEPARATOR">=</xliff:g>Мумбаї"</item>
<item msgid="6668274273067049125">"Д<xliff:g id="SEPARATOR">=</xliff:g>Делі"</item>
- <item msgid="2933410189478233292">"О<xliff:g id="SEPARATOR">=</xliff:g>Осака"</item>
+ <item msgid="7199039603593847813">"О<xliff:g id="SEPARATOR">=</xliff:g>Осака<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"Л<xliff:g id="SEPARATOR">=</xliff:g>Лахор"</item>
<item msgid="1448378291805481500">"С<xliff:g id="SEPARATOR">=</xliff:g>Сана"</item>
<item msgid="5233119846682408301">"Б<xliff:g id="SEPARATOR">=</xliff:g>Барселона"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"К<xliff:g id="SEPARATOR">=</xliff:g>Кембридж"</item>
<item msgid="759409010285366934">"К<xliff:g id="SEPARATOR">=</xliff:g>Кіркленд"</item>
<item msgid="6308007059287569663">"М<xliff:g id="SEPARATOR">=</xliff:g>Медісон"</item>
- <item msgid="6971636434858330021">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гуанчжоу"</item>
+ <item msgid="2077617905582224600">"Г<xliff:g id="SEPARATOR">=</xliff:g>Гуанчжоу<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"Х<xliff:g id="SEPARATOR">=</xliff:g>Хайдерабад"</item>
<item msgid="3032295682584784261">"Р<xliff:g id="SEPARATOR">=</xliff:g>Рестон"</item>
<item msgid="7722837296297332268">"Б<xliff:g id="SEPARATOR">=</xliff:g>Белу-Оризонті"</item>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 4056dd1..7476d52 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Показ. годинник"</string>
<string name="hide_clock" msgid="3217727306480505694">"Схов. годинник"</string>
<string name="label" msgid="162189613902857319">"Мітка"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Увімкнено"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Вимкнено"</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="6506982899651975645">"Звук сигналу"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Користувацький сигнал дзвінка"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Час таймера вичерпано"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Без звуку"</string>
<string name="ringtone" msgid="9110746249688559579">"Сигнал дзвінка"</string>
<string name="time" msgid="8067216534232296518">"Час"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Завтра"</string>
@@ -62,12 +65,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Відкласти сигнал до <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Наступний будильник"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Пропущений сигнал видалено"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Залишилося менше хвилини"</item>
- <item msgid="83197792732433351">"Залишилося <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Залишилося <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Залишилося <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Залишилося менше хвилини"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Залишилося <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"залишилося"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"залишилося"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Будильник пролунає за менше 1 хв"</item>
<item msgid="6002066367368421848">"Будильник пролунає за <xliff:g id="DAYS">%1$s</xliff:g>"</item>
@@ -115,6 +118,10 @@
<item quantity="many">хвилин</item>
<item quantity="other">хвилини</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Збільшувати гучність поступово"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Вимкнено"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> с"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"с"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Вимкнути будильник за…"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> хвилина</item>
@@ -142,7 +149,8 @@
<string name="revert" msgid="9100911171235162926">"Відмінити"</string>
<string name="delete" msgid="5732434972457000541">"Видалити"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Гучність будильника"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Беззвучний"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Без звуку"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Невідомий сигнал"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Періодичний сигнал або припинити дію сигналу."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (періодично)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Сигнал установлено на <xliff:g id="TIME">%s</xliff:g>. Торкніться, щоб скасувати."</string>
@@ -167,8 +175,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Завантаж. мелодії…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Служба відтворення звуків для набору таймерів у Годиннику."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Установити сигнал"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Будильник"</string>
<string name="menu_timer" msgid="6459070074762877114">"Таймер"</string>
<string name="menu_clock" msgid="5612760670606829805">"Годинник"</string>
@@ -183,10 +189,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Сортувати за назвою"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Вибрані міста"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Відновити"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Почати"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Зупинити"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Коло"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Скинути"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Почати"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Призупинити"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Коло"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Надіслати"</string>
<string name="hours_label" msgid="3393478155635368097">"г"</string>
<string name="minutes_label" msgid="3568098128251438588">"х"</string>
@@ -198,10 +204,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Мій час – <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Час кола:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Коло <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"№ <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"№ <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> година</item>
<item quantity="few"><xliff:g id="NUMBER">%d</xliff:g> години</item>
@@ -227,12 +229,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Додати 1 хвилину"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Додати 1 хв"</string>
<string name="timer_stop" msgid="3361154678667736722">"Зупинити"</string>
- <string name="timer_done" msgid="2375990511982914051">"Готово"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Зупинити всі таймери"</string>
<string name="timer_reset" msgid="7848424809190171640">"Скинути"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Скасувати"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Таймер скасовано"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Час вийшов"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"Використаних таймерів: <xliff:g id="NUM_TIMERS">%d</xliff:g>"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Таймер"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Не більше 4 таймерів"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Призупинити"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Скинути таймери"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Ну ви й швидкі!"</item>
<item msgid="6332879039890727169">"Насолоджуйтесь плодами своєї праці."</item>
@@ -249,6 +255,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Міста"</string>
<string name="clock_settings" msgid="8317286807280600391">"Годинник"</string>
<string name="clock_style" msgid="2265011060429742344">"Стиль"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Змінити дату й час"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Аналоговий"</item>
<item msgid="8483930821046925592">"Цифровий"</item>
@@ -263,6 +270,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> вибрано"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> не вибрано"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Маршаллові острови"</item>
<item msgid="4196408495909011020">"Острів Мідвей"</item>
@@ -351,13 +360,17 @@
<item msgid="5176858645450908751">"Джакарта"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Будильник"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Послуга \"Секундомір\" для запуску сповіщення."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Зупинено"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Обробляє дії зі сповіщень таймера."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Обробляє дії зі сповіщень секундоміра."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Призупинено"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Щоб відхилити, проведіть пальцем праворуч"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Щоб відкласти, проведіть пальцем ліворуч"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Проведіть пальцем ліворуч, щоб відкласти, або праворуч, щоб вимкнути"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Таймери"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Сигнал таймера"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Таймер зупинився"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Зупинилося таймерів: <xliff:g id="NUMBER">%d</xliff:g>"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Таймер призупинено"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Призупинено таймерів: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Торкніться, щоб переглянути свої таймери"</string>
<string name="timers_in_use" msgid="5570729467344408506">"Таймерів: <xliff:g id="NUMBER">%d</xliff:g>"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Наступний за <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -385,35 +398,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Немає сигналів"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Немає сигналів"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"НЕМАЄ МАЙБУТНІХ СИГНАЛІВ"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm дп"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm дп"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Недійсний час – <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Немає будильника на <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Немає майбутніх будильників"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Укажіть мітку"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Немає будильників із такою міткою"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Секундомір уже запущено"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Секундомір не запущено"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Секундомір не можна скинути, оскільки його запущено"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Секундомір зупинено"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Секундомір призупинено"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Секундомір скинуто"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Секундомір зациклено"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Секундомір запущено"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Немає будильника на цей час"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Будильник на <xliff:g id="ALARM_TIME">%s</xliff:g> вимкнено"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Будильник установлено на <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Таймер не встановлено"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Таймер видалено"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Таймер уже запущено"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Не вдається виконати запит, оскільки налаштовано декілька таймерів"</string>
- <string name="timer_started" msgid="6715582052946641641">"Таймер запущено"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Немає таймерів"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Є кілька таймерів"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Таймер видалено."</string>
<string name="timer_created" msgid="4381027137335885547">"Таймер створено"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Недійсна тривалість таймера"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Таймер скинуто"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Зупиніть таймер, щоб скинути його."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Таймер уже зупинено"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Таймер видалено"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Таймер запущено"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Недійсна тривалість таймера"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Виберіть місто"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Указане місто недоступне"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Це місто вже додано"</string>
diff --git a/res/values-ur-rPK/array.xml b/res/values-ur-rPK/array.xml
index c7eaeef..fb6d269 100644
--- a/res/values-ur-rPK/array.xml
+++ b/res/values-ur-rPK/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"ف<xliff:g id="SEPARATOR">=</xliff:g>فورٹالیزا"</item>
<item msgid="5801558418916235541">"گ<xliff:g id="SEPARATOR">=</xliff:g>گرینڈ ٹرک"</item>
<item msgid="2103759276235503048">"غ<xliff:g id="SEPARATOR">=</xliff:g>غرناطہ"</item>
- <item msgid="1490069759176391533">"گ<xliff:g id="SEPARATOR">=</xliff:g>گوئٹے مالا"</item>
+ <item msgid="6216160110733510854">"گ<xliff:g id="SEPARATOR">=</xliff:g>گوئٹے مالا شہر"</item>
<item msgid="525959305652046261">"گ<xliff:g id="SEPARATOR">=</xliff:g>گیانا"</item>
<item msgid="7565596629973190931">"ہ<xliff:g id="SEPARATOR">=</xliff:g>ہیلیفیکس"</item>
<item msgid="3811169155065582644">"ہ<xliff:g id="SEPARATOR">=</xliff:g>ہوانا"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"ٹ<xliff:g id="SEPARATOR">=</xliff:g>ٹورنٹو"</item>
<item msgid="1506838283840737263">"<xliff:g id="SEPARATOR">=</xliff:g>وینکوور"</item>
<item msgid="8935386104773857399">"<xliff:g id="SEPARATOR">=</xliff:g>ونّیپگ"</item>
- <item msgid="1132634022412399582">"ج<xliff:g id="SEPARATOR">=</xliff:g>جنوبی قطب"</item>
+ <item msgid="498429228419399474">"ج<xliff:g id="SEPARATOR">=</xliff:g>جنوبی قطب<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"ل<xliff:g id="SEPARATOR">=</xliff:g>لانگ ائیر بین"</item>
<item msgid="3784788073896028355">"<xliff:g id="SEPARATOR">=</xliff:g>الماٹی"</item>
<item msgid="7895695236056852523">"ع<xliff:g id="SEPARATOR">=</xliff:g>عمان"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"غ<xliff:g id="SEPARATOR">=</xliff:g>غزّہ"</item>
<item msgid="2359068282340162319">"<xliff:g id="SEPARATOR">=</xliff:g>الخلیل"</item>
<item msgid="6223396610551759129">"ہ<xliff:g id="SEPARATOR">=</xliff:g>ہو چی منہ"</item>
- <item msgid="4731022818651322736">"ہ<xliff:g id="SEPARATOR">=</xliff:g>ہانگ کانگ"</item>
+ <item msgid="3439764751788710130">"ہ<xliff:g id="SEPARATOR">=</xliff:g>ہانگ کانگ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"<xliff:g id="SEPARATOR">=</xliff:g>استنبول"</item>
<item msgid="758800913783999425">"ج<xliff:g id="SEPARATOR">=</xliff:g>جکارتہ"</item>
<item msgid="8956406398692698126">"ی<xliff:g id="SEPARATOR">=</xliff:g>یروشلم"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"م<xliff:g id="SEPARATOR">=</xliff:g>منیلا"</item>
<item msgid="6033964325069060422">"م<xliff:g id="SEPARATOR">=</xliff:g>مسقط"</item>
<item msgid="6077458941399984780">"پ<xliff:g id="SEPARATOR">=</xliff:g>پنوم پن"</item>
- <item msgid="935474308903572975">"پ<xliff:g id="SEPARATOR">=</xliff:g>پیونگ یانگ"</item>
+ <item msgid="1245515372520913197">"پ<xliff:g id="SEPARATOR">=</xliff:g>پیونگ یانگ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"ق<xliff:g id="SEPARATOR">=</xliff:g>قطر"</item>
<item msgid="1667243110545095146">"<xliff:g id="SEPARATOR">=</xliff:g>رنگون"</item>
<item msgid="4460370766685855731">"<xliff:g id="SEPARATOR">=</xliff:g>ریاض"</item>
<item msgid="4229224905931739201">"س<xliff:g id="SEPARATOR">=</xliff:g>سائگون"</item>
<item msgid="8705359848250215620">"س<xliff:g id="SEPARATOR">=</xliff:g>سیول"</item>
- <item msgid="583367295371395814">"ش<xliff:g id="SEPARATOR">=</xliff:g>شنگھائی"</item>
+ <item msgid="3814881931186962624">"ش<xliff:g id="SEPARATOR">=</xliff:g>شنگھائی<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"س<xliff:g id="SEPARATOR">=</xliff:g>سنگاپور"</item>
- <item msgid="1972491729911039207">"ت<xliff:g id="SEPARATOR">=</xliff:g>تائی پے"</item>
+ <item msgid="8982451946156859368">"ت<xliff:g id="SEPARATOR">=</xliff:g>تائی پے<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"ت<xliff:g id="SEPARATOR">=</xliff:g>تہران"</item>
<item msgid="8629402941285674273">"ت<xliff:g id="SEPARATOR">=</xliff:g>تل اویو"</item>
- <item msgid="8499164674454654525">"ٹ<xliff:g id="SEPARATOR">=</xliff:g>ٹوکیو"</item>
+ <item msgid="76330681636547168">"ٹ<xliff:g id="SEPARATOR">=</xliff:g>ٹوکیو<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"<xliff:g id="SEPARATOR">=</xliff:g>اولانباتار"</item>
<item msgid="2028626988021468640">"ب<xliff:g id="SEPARATOR">=</xliff:g>برمودا"</item>
<item msgid="4527109966513690429">"ک<xliff:g id="SEPARATOR">=</xliff:g>کینیری"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"<xliff:g id="SEPARATOR">=</xliff:g>رینو"</item>
<item msgid="9155068631060038769">"ب<xliff:g id="SEPARATOR">=</xliff:g>بلیک راک سٹی"</item>
<item msgid="8498761319928979900">"<xliff:g id="SEPARATOR">=</xliff:g>دوحہ"</item>
- <item msgid="8307897251088048641">"ب<xliff:g id="SEPARATOR">=</xliff:g>بیجنگ"</item>
+ <item msgid="5327010922199714808">"ب<xliff:g id="SEPARATOR">=</xliff:g>بیجنگ<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"م<xliff:g id="SEPARATOR">=</xliff:g>ممبئی"</item>
<item msgid="6668274273067049125">"<xliff:g id="SEPARATOR">=</xliff:g>دہلی"</item>
- <item msgid="2933410189478233292">"<xliff:g id="SEPARATOR">=</xliff:g>اوساکا"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>اوساکا<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"ل<xliff:g id="SEPARATOR">=</xliff:g>لاہور"</item>
<item msgid="1448378291805481500">"ص<xliff:g id="SEPARATOR">=</xliff:g>صنعا"</item>
<item msgid="5233119846682408301">"ب<xliff:g id="SEPARATOR">=</xliff:g>بارسلونا"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"ک<xliff:g id="SEPARATOR">=</xliff:g>کیمبرج"</item>
<item msgid="759409010285366934">"ک<xliff:g id="SEPARATOR">=</xliff:g>کرک لینڈ"</item>
<item msgid="6308007059287569663">"م<xliff:g id="SEPARATOR">=</xliff:g>میڈیسن"</item>
- <item msgid="6971636434858330021">"گ<xliff:g id="SEPARATOR">=</xliff:g>گوانگزو"</item>
+ <item msgid="2077617905582224600">"گ<xliff:g id="SEPARATOR">=</xliff:g>گوانگزو<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"ح<xliff:g id="SEPARATOR">=</xliff:g>حیدرآباد"</item>
<item msgid="3032295682584784261">"<xliff:g id="SEPARATOR">=</xliff:g>ریسٹن"</item>
<item msgid="7722837296297332268">"ب<xliff:g id="SEPARATOR">=</xliff:g>بیلو ہوریزونٹے"</item>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index 53cf183..eb43d0c 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"کلاک دکھائیں"</string>
<string name="hide_clock" msgid="3217727306480505694">"کلاک چھپائیں"</string>
<string name="label" msgid="162189613902857319">"لیبل"</string>
+ <string name="on_switch" msgid="2297966258029227449">"آن"</string>
+ <string name="off_switch" msgid="3381070073851148013">"آف"</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="6506982899651975645">"الارم رنگ ٹون"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"حسب ضرورت رنگ ٹون"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"ٹائمر کی معیاد ختم ہو گئی"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"خاموش"</string>
<string name="ringtone" msgid="9110746249688559579">"رنگ ٹون"</string>
<string name="time" msgid="8067216534232296518">"وقت"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"آئندہ کل"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> تک اسنوز کر رہا ہے"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"آئندہ الارم"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"آپ کا چھوٹا ہوا الارم حذف کر دیا گیا ہے"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"ایک منٹ سے کم باقی ہے"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> باقی"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> باقی"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> باقی"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"ایک منٹ سے کم باقی ہے"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> باقی ہیں"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"باقی ہے"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"باقی ہیں"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"الارم اب سے 1 منٹ سے کم کیلئے سیٹ کیا گیا ہے۔"</item>
<item msgid="6002066367368421848">"الارم اب سے <xliff:g id="DAYS">%1$s</xliff:g> کیلئے سیٹ کیا گیا ہے۔"</item>
@@ -101,6 +104,10 @@
<item quantity="other">منٹ</item>
<item quantity="one">منٹ</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"آواز میں بتدریج اضافہ کریں"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"آف"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> سیکنڈز"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"سیکنڈز"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"خاموش بعد از"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> منٹ</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"لوٹائیں"</string>
<string name="delete" msgid="5732434972457000541">"حذف کریں"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"الارم والیوم"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"خاموش"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"خاموش"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"نامعلوم"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"الارم کو اسنوز یا مسترد کریں۔"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (اسنوز کیا گیا)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"الارم <xliff:g id="TIME">%s</xliff:g> کیلئے سیٹ ہے۔ منسوخ کرنے کیلئے ٹچ کریں۔"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"رنگ ٹون ڈاؤن لوڈ ہو رہا ہے…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"کلاک میں سیٹ کردہ ٹائمرز کیلئے ساؤنڈ پلے بیک سروس۔"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"الارم سیٹ کریں"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"الارم"</string>
<string name="menu_timer" msgid="6459070074762877114">"ٹائمر"</string>
<string name="menu_clock" msgid="5612760670606829805">"گھڑی"</string>
@@ -167,10 +173,11 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"نام کے لحاظ سے ترتیب دیں"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"منتخب کردہ شہر"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"دوبارہ شروع کریں"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"شروع کریں"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"روکیں"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"لیپ"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"دوبارہ ترتیب دیں"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"شروع کریں"</string>
+ <!-- no translation found for sw_pause_button (2422084453454138042) -->
+ <skip />
+ <string name="sw_lap_button" msgid="6992264696039004233">"لیپ"</string>
<string name="sw_share_button" msgid="4478648110382859382">"اشتراک کریں"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +189,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"میرا وقت ہے <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"لیپ اوقات:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"لیپ <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> گھنٹے</item>
<item quantity="one">1 گھنٹہ</item>
@@ -205,12 +208,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 منٹ شامل کریں"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 منٹ شامل کریں"</string>
<string name="timer_stop" msgid="3361154678667736722">"روکیں"</string>
- <string name="timer_done" msgid="2375990511982914051">"ہو گیا"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"تمام ٹائمرز بند کریں"</string>
<string name="timer_reset" msgid="7848424809190171640">"دوبارہ ترتیب دیں"</string>
<string name="timer_cancel" msgid="3572868404230815644">"منسوخ کریں"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"ٹائمر منسوخ ہو گیا"</string>
<string name="timer_times_up" msgid="9190440395938519009">"وقت ختم ہو گیا"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ٹائمرز کی میعاد ختم ہوگئی"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"ٹائمر"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"زیادہ سے زیادہ 4 ٹائمرز"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"موقوف کریں"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"تمام ٹائمرز دوبارہ ترتیب دیں"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"آپ کی رفتار بہت زیادہ ہے۔"</item>
<item msgid="6332879039890727169">"اپنی محنت کا پھل کھائیں۔"</item>
@@ -227,6 +234,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"شہر"</string>
<string name="clock_settings" msgid="8317286807280600391">"گھڑی"</string>
<string name="clock_style" msgid="2265011060429742344">"طرز"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"تاریخ اور وقت تبدیل کریں"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"اینالاگ"</item>
<item msgid="8483930821046925592">"ڈیجیٹل"</item>
@@ -241,6 +249,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> نشان زد ہو گیا"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> غیر نشان زد ہو گیا"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"جزائر مارشل"</item>
<item msgid="4196408495909011020">"مڈوے آئیلینڈ"</item>
@@ -329,13 +339,17 @@
<item msgid="5176858645450908751">"جکارتہ"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"الارمز"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"اطلاع کو چلانے کیلئے اسٹاپ واچ سروس۔"</string>
- <string name="swn_stopped" msgid="783124901663086172">"رک گیا"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"ٹائمر اطلاعات کے اعمال پر کاروائی کرتا ہے۔"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"اسٹاپ واچ اطلاعات کے اعمال پر کاروائی کرتا ہے۔"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"موقوف ہوگئی"</string>
<string name="description_direction_right" msgid="5709209043267548985">"برخاست کرنے کیلئے دائیں سوائپ کریں"</string>
<string name="description_direction_left" msgid="7448141043674998679">"اسنوز کرنے کیلئے بائیں سوائپ کریں"</string>
<string name="description_direction_both" msgid="1841309486023845685">"اسنوز کرنے کیلئے بائیں یا برخاست کرنے کیلئے دائیں سوائپ کریں"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"ٹائمرز"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"ٹائمر رنگ ٹون"</string>
<string name="timer_stopped" msgid="2730331837832462008">"ٹائمر رک گیا"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> ٹائمرز رک گئے"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"ٹائمر موقوف ہو گیا"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> ٹائمرز موقوف ہو گئے"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"اپنے ٹائمرز دیکھنے کیلئے ٹچ کریں"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ٹائمرز"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"اگلا ٹائمر: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +375,27 @@
<string name="no_alarms" msgid="6429431324842022917">"کوئی الارمز نہیں ہیں"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"الارمز سیٹ نہیں"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"کوئی آنے والے الارمز نہیں ہیں"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"غلط وقت <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> پر کوئی الارم نہیں"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"کوئی الارم مقرر نہیں"</string>
<string name="no_label_specified" msgid="2008482054428460626">"کوئی لیبل مختص نہیں کیا گیا"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"کسی الارم میں لیبل شامل نہیں ہے"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"اسٹاپ واچ پہلے سے چل رہی ہے"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"اسٹاپ واچ نہیں چل رہی ہے"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"سٹاپ واچ کو دوبارہ ترتیب نہیں دیا جا سکتا کیونکہ یہ چل رہی ہے"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"سٹاپ واچ رک گئی"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"اسٹاپ واچ موقوف ہوگئی"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"سٹاپ واچ کو دوبارہ ترتیب دے دی گئی"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"سٹاپ واچ لیپ ہو گئی"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"سٹاپ واچ دوبارہ شروع ہو گئی"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"اس وقت کیلئے کوئی الارم مقرر نہیں"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> الارم برخاست ہوگیا"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"<xliff:g id="ALARM_TIME">%s</xliff:g> کیلئے الارم سیٹ ہے"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"کوئی ٹائمر سیٹ نہیں"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"ٹائمر حذف ہوگیا"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"ٹائمر پہلے سے چل رہا ہے"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"آپ کی درخواست مکمل نہیں ہو سکی، ایک سے زیادہ ٹائمرز موجود ہیں"</string>
- <string name="timer_started" msgid="6715582052946641641">"ٹائمر شروع ہوگیا"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"کوئی ٹائمر موجود نہیں"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"ایک سے زائد ٹائمر موجود ہے"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"ٹائمر ہٹا دیا گیا ہے"</string>
<string name="timer_created" msgid="4381027137335885547">"ٹائمر بن گیا"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"ٹائمر کی غلط لمبائی"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"ٹائمر دوبارہ ترتیب دے دیا گیا"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"ٹائمر کو دوبارہ ترتیب نہیں دیا جا سکتا کیوںکہ یہ ابھی چل رہا ہے۔ دوبارہ ترتیب دینے کیلیے ٹائمر کو روک دیں۔"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"ٹائمر پہلے ہی روک دیا گیا"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"ٹائمر حذف ہوگیا"</string>
+ <string name="timer_started" msgid="6715582052946641641">"ٹائمر شروع ہوگیا"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"ٹائمر کی غلط لمبائی"</string>
<string name="no_city_selected" msgid="1007596865203283741">"کوئی شہر منتخب نہیں"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"آپ کا بیان کردہ شہر دستیاب نہیں ہے"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"اس شہر کو پہلے ہی شامل کر دیا گیا ہے"</string>
diff --git a/res/values-uz-rUZ/array.xml b/res/values-uz-rUZ/array.xml
index f1fb2ef..f79bce2 100644
--- a/res/values-uz-rUZ/array.xml
+++ b/res/values-uz-rUZ/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand-Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Gvatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Gvatemala"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Gayana"</item>
<item msgid="7565596629973190931">"G<xliff:g id="SEPARATOR">=</xliff:g>Galifaks"</item>
<item msgid="3811169155065582644">"G<xliff:g id="SEPARATOR">=</xliff:g>Gavana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vankuver"</item>
<item msgid="8935386104773857399">"V<xliff:g id="SEPARATOR">=</xliff:g>Vinnipeg"</item>
- <item msgid="1132634022412399582">"J<xliff:g id="SEPARATOR">=</xliff:g>Janubiy qutb"</item>
+ <item msgid="498429228419399474">"J<xliff:g id="SEPARATOR">=</xliff:g>Janubiy qutb<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyir"</item>
<item msgid="3784788073896028355">"O<xliff:g id="SEPARATOR">=</xliff:g>Olma-Ota"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G‘<xliff:g id="SEPARATOR">=</xliff:g>G‘azo"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Hoshimin"</item>
- <item msgid="4731022818651322736">"G<xliff:g id="SEPARATOR">=</xliff:g>Gonkong"</item>
+ <item msgid="3439764751788710130">"G<xliff:g id="SEPARATOR">=</xliff:g>Gonkong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"Q<xliff:g id="SEPARATOR">=</xliff:g>Quddus"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Maskat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Pnompen"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>Pxenyan"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>Pxenyan<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangun"</item>
<item msgid="4460370766685855731">"A<xliff:g id="SEPARATOR">=</xliff:g>Ar-Riyod"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Saygon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seul"</item>
- <item msgid="583367295371395814">"Sh<xliff:g id="SEPARATOR">=</xliff:g>Shanxay"</item>
+ <item msgid="3814881931186962624">"Sh<xliff:g id="SEPARATOR">=</xliff:g>Shanxay<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapur"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>Taypey"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>Taypey<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Tehron"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel-Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokio<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulanbator"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda orollari"</item>
<item msgid="4527109966513690429">"K<xliff:g id="SEPARATOR">=</xliff:g>Kanar orollari"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Rino"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>Blek-Rok-Siti"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"P<xliff:g id="SEPARATOR">=</xliff:g>Pekin"</item>
+ <item msgid="5327010922199714808">"P<xliff:g id="SEPARATOR">=</xliff:g>Pekin<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbay"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Dehli"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahor"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barselona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"K<xliff:g id="SEPARATOR">=</xliff:g>Kembrij"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirklend"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Medison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>Guanchjou"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>Guanchjou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Haydarobod"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belu-Orizonti"</item>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index 9b6fb59..88d7415 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Soatni ko‘rsatish"</string>
<string name="hide_clock" msgid="3217727306480505694">"Soatni berkitish"</string>
<string name="label" msgid="162189613902857319">"Tavsif"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Yoniq"</string>
+ <string name="off_switch" msgid="3381070073851148013">"O‘chiq"</string>
<string name="default_label" msgid="5590025289805630372">"Uyg‘otkich"</string>
<string name="set_alarm" msgid="9148359866152726808">"Uyg‘otkich o‘rnatish"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Tebranish"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Takrorlash"</string>
<string name="alert" msgid="6506982899651975645">"Uyg‘otkich ringtoni"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Boshqa rington"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Taymer vaqti tugadi"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Ovozsiz"</string>
<string name="ringtone" msgid="9110746249688559579">"Rington"</string>
<string name="time" msgid="8067216534232296518">"Vaqt"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Ertaga"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"<xliff:g id="TIME">%s</xliff:g> gacha kechiktirildi"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Keyingi signal"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"O‘tkazib yuborilgan uyg‘otkich o‘chirib tashlandi"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Bir daqiqadan kamroq qoldi"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> qoldi"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> qoldi"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> qoldi"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Bir daqiqadan kamroq vaqt qoldi"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g> <xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> qoldi"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"qoldi"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"qoldi"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Uyg‘otkich signali 1 daqiqa ichida chalinadi."</item>
<item msgid="6002066367368421848">"Uyg‘otkich signali <xliff:g id="DAYS">%1$s</xliff:g>dan so‘ng chalinadi."</item>
@@ -101,6 +104,10 @@
<item quantity="other">daqiqa</item>
<item quantity="one">daqiqa</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Ovozni asta-sekin ko‘tarish"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"O‘chiq"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> soniya"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"soniya"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Avtomatik o‘chirish"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> daqiqa</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Bekor qilish"</string>
<string name="delete" msgid="5732434972457000541">"O‘chirish"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Signal ovozi"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Ovozsiz"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Ovozsiz"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Noma’lum"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Uyg‘otkichni kechiktirish yoki bekor qilish."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (kechiktirildi)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"<xliff:g id="TIME">%s</xliff:g> uchun uyg‘otkich o‘rnatildi. Bekor qilish uchun bosing."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Rington yuklanmoqda…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Soat ilovasidagi taymerlar uchun signal ijro etish xizmati."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Uyg‘otkich o‘rnatish"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Uyg‘otkich"</string>
<string name="menu_timer" msgid="6459070074762877114">"Taymer"</string>
<string name="menu_clock" msgid="5612760670606829805">"Soat"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Nomi bo‘yicha saralash"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Tanlangan shaharlar"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Davom ettirish"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Stop"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Davra"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Boshidan"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Start"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Pauza"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Davra"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Ulashish"</string>
<string name="hours_label" msgid="3393478155635368097">"s"</string>
<string name="minutes_label" msgid="3568098128251438588">"d"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Mening vaqtim: <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Aylanish vaqti:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"<xliff:g id="NUMBER">%d</xliff:g>-davra"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"#<xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"#<xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> soat</item>
<item quantity="one">1 soat</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"1 daqiqa qo‘shish"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"1 daqiqa qo‘shish"</string>
<string name="timer_stop" msgid="3361154678667736722">"Stop"</string>
- <string name="timer_done" msgid="2375990511982914051">"Tayyor"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Hamma taymerni to‘xtatish"</string>
<string name="timer_reset" msgid="7848424809190171640">"Boshidan"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Bekor qilish"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Taymer bekor qilindi"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Vaqt tugadi"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> ta taymer vaqti tugadi"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Taymer"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Maks. 4 ta taymer o‘rnatish mumkin"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Pauza"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Nolga qaytarish"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Siz haqiqatdan ham Shumaxer ekansiz!"</item>
<item msgid="6332879039890727169">"Siz juda yaxshi mehnat qildingiz."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Shaharlar"</string>
<string name="clock_settings" msgid="8317286807280600391">"Soat"</string>
<string name="clock_style" msgid="2265011060429742344">"Soat turi"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Sana va vaqtni o‘zgartirish"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Soat mili"</item>
<item msgid="8483930821046925592">"Raqamli"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> shahri belgilandi"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> shahri olib tashlandi"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Marshall orollari"</item>
<item msgid="4196408495909011020">"Midvey oroli"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Signallar"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Bildirishnomalarni ishga tushirish uchun sekundomer."</string>
- <string name="swn_stopped" msgid="783124901663086172">"To‘xtatildi"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Taymer bildirishnomalarida harakatlarni amalga oshiradi."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Sekundomer bildirishnomalarida harakatlarni amalga oshiradi."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"To‘xtatildi"</string>
<string name="description_direction_right" msgid="5709209043267548985">"O‘tkazib yuborish uchun o‘ngga suring"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Kechiktirish uchun chapga suring"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Signalni kechiktirish uchun chapga, bekor qilish uchun esa o‘ngga suring"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Taymerlar"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Taymer ringtoni"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Taymer to‘xtatildi"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"To‘xtatilgan taymerlar: <xliff:g id="NUMBER">%d</xliff:g>"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Taymer pauza qilindi"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> ta taymer pauza qilindi"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Taymerlarni ko‘rish uchun bosing"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> ta taymer"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Keyingi taymer: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Hech qanday uyg‘otkich yo‘q"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Signal o‘rnatilmagan"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"SIGNALLAR YO‘Q"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"<xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g> – vaqt noto‘g‘ri"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> uchun hech qanday signal o‘rnatilmagan"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Hech qanday signal o‘rnatilmagan"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Hech qanday tavsif qo‘shilmagan"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Hech qaysi signal tavsifi yo‘q"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Sekundomer allaqachon ishga tushgan"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Sekundomer ishlamayapti"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Sekundomerni nolga qaytarib bo‘lmaydi, chunki u hozir ishlayapti"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Sekundomer to‘xtadi"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Sekundomer to‘xtatildi"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Sekundomer nolga qaytarildi"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Sekundomer bir marta aylanib o‘tdi"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Sekundomer ishga tushdi"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Bu vaqt uchun hech qanday signal o‘rnatilmagan"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> dagi signal rad etildi"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Signal <xliff:g id="ALARM_TIME">%s</xliff:g> ga o‘rnatildi"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Hech qanday taymer o‘rnatilmagan"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Taymer o‘chirib tashlandi"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Taymer allaqachon ishga tushgan"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"So‘rovingizni bajarib bo‘lmaydi, bir nechta taymer o‘rnatilgan"</string>
- <string name="timer_started" msgid="6715582052946641641">"Taymer ishga tushdi"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Hech qanday taymer mavjud emas"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Birdan ortiq taymer mavjud"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Taymer o‘chirib tashlandi."</string>
<string name="timer_created" msgid="4381027137335885547">"Taymer yaratildi"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Taymer vaqti noto‘g‘ri"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Taymer qayta o‘rnatildi"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Taymerni qayta o‘rnatib bo‘lmaydi, chunki u haliyam ishlayapti. Avval taymerni to‘xtating."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Taymer allaqachon to‘xtagan"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Taymer o‘chirib tashlandi"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Taymer ishga tushdi"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Taymer vaqti noto‘g‘ri"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Hech qanday shahar tanlamadi"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Siz aytgan shahar mavjud emas"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Bu shahar allaqachon qo‘shilgan"</string>
diff --git a/res/values-v21/dimens.xml b/res/values-v21/dimens.xml
new file mode 100644
index 0000000..f320981
--- /dev/null
+++ b/res/values-v21/dimens.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 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>
+ <!-- Floating action button style -->
+ <dimen name="fab_margin">16dp</dimen>
+
+ <!-- Size of margin between icon and text / title text. -->
+ <dimen name="notification_content_margin_start">0dp</dimen>
+
+</resources>
diff --git a/res/values-v21/styles.xml b/res/values-v21/styles.xml
index 6bef8d1..f9f0763 100644
--- a/res/values-v21/styles.xml
+++ b/res/values-v21/styles.xml
@@ -16,18 +16,15 @@
<resources>
- <style name="FabStyle">
- <item name="android:elevation">8dip</item>
- </style>
-
- <style name="SettingsTheme" parent="BaseActivityTheme">
+ <style name="SettingsTheme" parent="TranslucentDecorActivityTheme">
<item name="android:alertDialogTheme">@style/SettingsAlertDialogTheme</item>
<item name="android:detailsElementBackground">@null</item>
- <item name="android:windowActionBar">false</item>
- <item name="android:windowNoTitle">true</item>
<!-- Attributes from support.v7.appcompat -->
<item name="actionBarStyle">@style/SettingsActionBarStyle</item>
+ <item name="colorControlActivated">?attr/colorAccent</item>
+ <item name="windowActionBar">true</item>
+ <item name="windowNoTitle">false</item>
</style>
<!-- Theme that will be used by PreferenceFragment (i.e. *not* AppCompat). -->
@@ -36,12 +33,20 @@
</style>
<!-- Custom notification content styles -->
+ <!-- copied TextAppearance.Material.Button -->
+ <style name="TextAppearance.StatusBar.EventContent.Action">
+ <item name="android:textSize">14sp</item>
+ <item name="android:fontFamily">sans-serif-medium</item>
+ <item name="android:textAllCaps">true</item>
+ <item name="android:textColor">@color/black_54p</item>
+ </style>
+
<style name="TextAppearance.StatusBar.EventContent">
- <item name="android:textSize">@dimen/notification_text_size</item>
+ <item name="android:textSize">14sp</item>
<item name="android:textColor">@color/black_54p</item>
</style>
<style name="TextAppearance.StatusBar.EventContent.Title">
- <item name="android:textSize">@dimen/notification_title_text_size</item>
+ <item name="android:textSize">16sp</item>
<item name="android:textColor">@color/black_87p</item>
</style>
@@ -71,25 +76,12 @@
<item name="android:fontFamily">sans-serif-medium</item>
</style>
- <style name="CitiesTheme" parent="BaseActivityTheme">
- <item name="android:fastScrollPreviewBackgroundLeft">
- @drawable/fastscroll_preview_left
- </item>
- <item name="android:fastScrollPreviewBackgroundRight">
- @drawable/fastscroll_preview_right
- </item>
- <item name="android:fastScrollStyle">@style/FastScrollStyle</item>
+ <style name="CitiesTheme" parent="TranslucentDecorActivityTheme">
<item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb</item>
<item name="android:fastScrollTrackDrawable">@drawable/fastscroll_track</item>
<item name="actionBarStyle">@style/CitiesActionBarStyle</item>
- </style>
-
- <style name="FastScrollStyle" parent="android:Widget.Material.FastScroll">
- <item name="android:minWidth">48dip</item>
- <item name="android:minHeight">48dip</item>
- <item name="android:padding">16dip</item>
- <item name="android:textColor">@color/white</item>
- <item name="android:textSize">32sp</item>
+ <item name="windowActionBar">true</item>
+ <item name="windowNoTitle">false</item>
</style>
</resources>
diff --git a/res/values-v23/styles.xml b/res/values-v23/styles.xml
index 0b7ddbd..f394ee1 100644
--- a/res/values-v23/styles.xml
+++ b/res/values-v23/styles.xml
@@ -13,11 +13,17 @@
<style name="widget_big_thin" parent="big_thin">
<item name="android:textSize">@dimen/widget_big_font_size</item>
<item name="android:fontFamily">sans-serif-light</item>
+ <item name="android:shadowRadius">@dimen/digital_widget_shadow_radius</item>
+ <item name="android:shadowColor">@color/digital_widget_shadow_color</item>
+ <item name="android:shadowDy">@dimen/digital_widget_shadow_dy</item>
</style>
<style name="widget_label" parent="label">
<item name="android:textSize">@dimen/widget_label_font_size</item>
<item name="android:textAllCaps">true</item>
<item name="android:letterSpacing">0.15</item>
+ <item name="android:shadowRadius">@dimen/digital_widget_shadow_radius</item>
+ <item name="android:shadowColor">@color/digital_widget_shadow_color</item>
+ <item name="android:shadowDy">@dimen/digital_widget_shadow_dy</item>
</style>
</resources>
\ No newline at end of file
diff --git a/res/values-vi/array.xml b/res/values-vi/array.xml
index 815151b..95690a1 100644
--- a/res/values-vi/array.xml
+++ b/res/values-vi/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Thành phố Guatemala"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>Winnipeg"</item>
- <item msgid="1132634022412399582">"N<xliff:g id="SEPARATOR">=</xliff:g>Nam Cực"</item>
+ <item msgid="498429228419399474">"N<xliff:g id="SEPARATOR">=</xliff:g>Nam Cực<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>Hồ Chí Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>Hồng Kông"</item>
+ <item msgid="3439764751788710130">"H<xliff:g id="SEPARATOR">=</xliff:g>Hồng Kông<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>Phnôm Pênh"</item>
- <item msgid="935474308903572975">"B<xliff:g id="SEPARATOR">=</xliff:g>Bình Nhưỡng"</item>
+ <item msgid="1245515372520913197">"B<xliff:g id="SEPARATOR">=</xliff:g>Bình Nhưỡng<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>Riyadh"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>Sài Gòn"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>Seoul"</item>
- <item msgid="583367295371395814">"T<xliff:g id="SEPARATOR">=</xliff:g>Thượng Hải"</item>
+ <item msgid="3814881931186962624">"T<xliff:g id="SEPARATOR">=</xliff:g>Thượng Hải<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>Singapore"</item>
- <item msgid="1972491729911039207">"Đ<xliff:g id="SEPARATOR">=</xliff:g>Đài Bắc"</item>
+ <item msgid="8982451946156859368">"Đ<xliff:g id="SEPARATOR">=</xliff:g>Đài Bắc<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>Tehran"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo"</item>
+ <item msgid="76330681636547168">"T<xliff:g id="SEPARATOR">=</xliff:g>Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>Reno"</item>
<item msgid="9155068631060038769">"T<xliff:g id="SEPARATOR">=</xliff:g>Thành phố Black Rock"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>Bắc Kinh"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>Bắc Kinh<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka"</item>
+ <item msgid="7199039603593847813">"O<xliff:g id="SEPARATOR">=</xliff:g>Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>Madison"</item>
- <item msgid="6971636434858330021">"Q<xliff:g id="SEPARATOR">=</xliff:g>Quảng Châu"</item>
+ <item msgid="2077617905582224600">"Q<xliff:g id="SEPARATOR">=</xliff:g>Quảng Châu<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>Belo Horizonte"</item>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 4aecc58..1ca7a0a 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Hiển thị đồng hồ"</string>
<string name="hide_clock" msgid="3217727306480505694">"Ẩn đồng hồ"</string>
<string name="label" msgid="162189613902857319">"Nhãn"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Bật"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Tắt"</string>
<string name="default_label" msgid="5590025289805630372">"Báo thức"</string>
<string name="set_alarm" msgid="9148359866152726808">"Đặt báo thức"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Rung"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Lặp lại"</string>
<string name="alert" msgid="6506982899651975645">"Nhạc chuông báo thức"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Nhạc chuông tùy chỉnh"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Bộ hẹn giờ đã hết hạn"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Im lặng"</string>
<string name="ringtone" msgid="9110746249688559579">"Nhạc chuông"</string>
<string name="time" msgid="8067216534232296518">"Giờ"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Ngày mai"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Báo lại cho tới <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"Báo thức sắp tới"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"Báo thức bị nhỡ của bạn đã được xóa"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Còn chưa đầy một phút"</item>
- <item msgid="83197792732433351">"Còn <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"Còn <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"Còn <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Còn chưa đầy một phút"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"Còn <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"còn lại"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"còn lại"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"Báo thức được đặt đổ chuông sau dưới 1 phút nữa tính từ bây giờ."</item>
<item msgid="6002066367368421848">"Báo thức được đặt đổ chuông sau <xliff:g id="DAYS">%1$s</xliff:g> nữa tính từ bây giờ."</item>
@@ -101,6 +104,10 @@
<item quantity="other">phút</item>
<item quantity="one">phút</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Tăng dần âm lượng"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Tắt"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> giây"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"giây"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Im lặng sau"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> phút</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Hoàn nguyên"</string>
<string name="delete" msgid="5732434972457000541">"Xóa"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Âm lượng báo thức"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Im lặng"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Im lặng"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Không xác định"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Báo lại hoặc hủy báo thức."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (báo lại)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"Báo thức được đặt đổ chuông sau <xliff:g id="TIME">%s</xliff:g> nữa. Chạm để hủy."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Đang tải nhạc chuông…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Dịch vụ phát âm thanh cho bộ hẹn giờ đã đặt trong Đồng hồ."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Đặt báo thức"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"Báo thức"</string>
<string name="menu_timer" msgid="6459070074762877114">"Bộ hẹn giờ"</string>
<string name="menu_clock" msgid="5612760670606829805">"Đồng hồ"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Sắp xếp theo tên"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Thành phố đã chọn"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Tiếp tục"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Bắt đầu"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Ngừng"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Vòng chạy"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Đặt lại"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Bắt đầu"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Tạm dừng"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Vòng chạy"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Chia sẻ"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Thời gian của tôi là <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Số vòng chạy:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Vòng chạy <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> giờ</item>
<item quantity="one">1 giờ</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Thêm 1 phút"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Thêm 1 phút"</string>
<string name="timer_stop" msgid="3361154678667736722">"Dừng"</string>
- <string name="timer_done" msgid="2375990511982914051">"Xong"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Dừng tất cả các bộ hẹn giờ"</string>
<string name="timer_reset" msgid="7848424809190171640">"Đặt lại"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Hủy"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Đã hủy bộ tính giờ"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Hết giờ"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> bộ hẹn giờ đã hết hạn"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Bộ hẹn giờ"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"Tối đa 4 bộ hẹn giờ"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Tạm dừng"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Đặt lại hẹn giờ"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Bạn đúng là con quỷ tốc độ."</item>
<item msgid="6332879039890727169">"Tận hưởng thành quả lao động của bạn."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Thành phố"</string>
<string name="clock_settings" msgid="8317286807280600391">"Đồng hồ"</string>
<string name="clock_style" msgid="2265011060429742344">"Kiểu"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Thay đổi ngày và giờ"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"Đồng hồ kim"</item>
<item msgid="8483930821046925592">"Đồng hồ số"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"Đã chọn <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"Đã bỏ chọn <xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"Quần đảo Marshall"</item>
<item msgid="4196408495909011020">"Đảo Midway"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Báo thức"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Dịch vụ đồng hồ bấm giờ để chạy thông báo."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Đã dừng"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Xử lý các tác vụ từ thông báo bộ hẹn giờ."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Xử lý các tác vụ từ thông báo đồng hồ bấm giờ."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Đã tạm dừng"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Vuốt sang phải để loại bỏ"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Vuốt sang trái để báo lại"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Vuốt sang trái để báo lại hoặc phải để bỏ qua"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Bộ hẹn giờ"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Nhạc chuông bộ hẹn giờ"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Đã dừng bộ hẹn giờ"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"Đã dừng <xliff:g id="NUMBER">%d</xliff:g> bộ hẹn giờ"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Đã tạm dừng hẹn giờ"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"Đã tạm dừng <xliff:g id="NUMBER">%d</xliff:g> hẹn giờ"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Chạm để xem bộ hẹn giờ của bạn"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> bộ hẹn giờ"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Bộ hẹn giờ tiếp theo: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Không có báo thức"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Ko đặt báo thức"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"KHÔNG CÓ BÁO THỨC SẮP TỚI"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Thời gian không hợp lệ <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Chưa có báo thức lúc <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Chưa có báo thức nào được lên lịch"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Không chỉ định nhãn nào"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Không có báo thức nào chứa nhãn này"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Đồng hồ bấm giờ vẫn đang chạy"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Đồng hồ bấm giờ hiện không chạy"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Không thể đặt lại đồng hồ bấm giờ do đồng hồ bấm giờ đang chạy"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Đã dừng đồng hồ bấm giờ"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Đã tạm dừng đồng hồ bấm giờ"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Đã đặt lại đồng hồ bấm giờ"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Đã chồng lên đồng hồ bấm giờ"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Đã bắt đầu đồng hồ bấm giờ"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Chưa có báo thức nào được lên lịch cho thời gian này"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"Đã loại bỏ báo thức <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"Đã đặt báo thức đổ chuông lúc <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Chưa đặt bộ hẹn giờ"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Đã xóa bộ hẹn giờ"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Bộ hẹn giờ vẫn đang chạy"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Không thể hoàn tất yêu cầu của bạn, có nhiều bộ hẹn giờ"</string>
- <string name="timer_started" msgid="6715582052946641641">"Đã khởi động bộ hẹn giờ"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Không có bộ hẹn giờ"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Có nhiều bộ hẹn giờ"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Bộ hẹn giờ đã bị xóa."</string>
<string name="timer_created" msgid="4381027137335885547">"Đã tạo bộ hẹn giờ"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Thời lượng không hợp lệ trên bộ hẹn giờ"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Đã đặt lại bộ hẹn giờ"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Không thể đặt lại bộ hẹn giờ vì bộ hẹn giờ vẫn đang chạy. Dừng bộ hẹn giờ để đặt lại."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Bộ hẹn giờ đã dừng"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Đã xóa bộ hẹn giờ"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Đã khởi động bộ hẹn giờ"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Thời lượng không hợp lệ trên bộ hẹn giờ"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Chưa có thành phố nào được chọn"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Thành phố bạn chỉ định không có sẵn"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Thành phố này đã được thêm"</string>
diff --git a/res/values-zh-rCN/array.xml b/res/values-zh-rCN/array.xml
index 7d3c9ff..adb08b0 100644
--- a/res/values-zh-rCN/array.xml
+++ b/res/values-zh-rCN/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>福塔雷萨"</item>
<item msgid="5801558418916235541">"D<xliff:g id="SEPARATOR">=</xliff:g>大特克"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>格林纳达"</item>
- <item msgid="1490069759176391533">"W<xliff:g id="SEPARATOR">=</xliff:g>危地马拉"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>危地马拉"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>圭亚那"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>哈利法克斯"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>哈瓦那"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"D<xliff:g id="SEPARATOR">=</xliff:g>多伦多"</item>
<item msgid="1506838283840737263">"W<xliff:g id="SEPARATOR">=</xliff:g>温哥华"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>温尼伯"</item>
- <item msgid="1132634022412399582">"N<xliff:g id="SEPARATOR">=</xliff:g>南极"</item>
+ <item msgid="498429228419399474">"N<xliff:g id="SEPARATOR">=</xliff:g>南极<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>朗伊尔城"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>阿拉木图"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>安曼"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"J<xliff:g id="SEPARATOR">=</xliff:g>加沙"</item>
<item msgid="2359068282340162319">"X<xliff:g id="SEPARATOR">=</xliff:g>希伯伦"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>胡志明市"</item>
- <item msgid="4731022818651322736">"X<xliff:g id="SEPARATOR">=</xliff:g>香港"</item>
+ <item msgid="3439764751788710130">"X<xliff:g id="SEPARATOR">=</xliff:g>香港<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"Y<xliff:g id="SEPARATOR">=</xliff:g>伊斯坦布尔"</item>
<item msgid="758800913783999425">"Y<xliff:g id="SEPARATOR">=</xliff:g>雅加达"</item>
<item msgid="8956406398692698126">"Y<xliff:g id="SEPARATOR">=</xliff:g>耶路撒冷"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>马尼拉"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>马斯喀特"</item>
<item msgid="6077458941399984780">"J<xliff:g id="SEPARATOR">=</xliff:g>金边"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>平壤"</item>
+ <item msgid="1245515372520913197">"P<xliff:g id="SEPARATOR">=</xliff:g>平壤<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"K<xliff:g id="SEPARATOR">=</xliff:g>卡塔尔"</item>
<item msgid="1667243110545095146">"Y<xliff:g id="SEPARATOR">=</xliff:g>仰光"</item>
<item msgid="4460370766685855731">"L<xliff:g id="SEPARATOR">=</xliff:g>利雅得"</item>
<item msgid="4229224905931739201">"X<xliff:g id="SEPARATOR">=</xliff:g>西贡"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>首尔"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>上海"</item>
+ <item msgid="3814881931186962624">"S<xliff:g id="SEPARATOR">=</xliff:g>上海<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"X<xliff:g id="SEPARATOR">=</xliff:g>新加坡"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>台北"</item>
+ <item msgid="8982451946156859368">"T<xliff:g id="SEPARATOR">=</xliff:g>台北<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"D<xliff:g id="SEPARATOR">=</xliff:g>德黑兰"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>特拉维夫"</item>
- <item msgid="8499164674454654525">"D<xliff:g id="SEPARATOR">=</xliff:g>东京"</item>
+ <item msgid="76330681636547168">"D<xliff:g id="SEPARATOR">=</xliff:g>东京<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"W<xliff:g id="SEPARATOR">=</xliff:g>乌兰巴托"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>百慕大"</item>
<item msgid="4527109966513690429">"J<xliff:g id="SEPARATOR">=</xliff:g>加那利"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"L<xliff:g id="SEPARATOR">=</xliff:g>里诺"</item>
<item msgid="9155068631060038769">"H<xliff:g id="SEPARATOR">=</xliff:g>黑岩城"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>多哈"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>北京"</item>
+ <item msgid="5327010922199714808">"B<xliff:g id="SEPARATOR">=</xliff:g>北京<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>孟买"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>德里"</item>
- <item msgid="2933410189478233292">"D<xliff:g id="SEPARATOR">=</xliff:g>大阪"</item>
+ <item msgid="7199039603593847813">"D<xliff:g id="SEPARATOR">=</xliff:g>大阪<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>拉合尔"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>萨那"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>巴塞罗那"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"J<xliff:g id="SEPARATOR">=</xliff:g>剑桥"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>柯克兰"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>麦迪逊"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>广州"</item>
+ <item msgid="2077617905582224600">"G<xliff:g id="SEPARATOR">=</xliff:g>广州<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>海得拉巴"</item>
<item msgid="3032295682584784261">"L<xliff:g id="SEPARATOR">=</xliff:g>雷斯顿"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>贝洛奥里藏特"</item>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 03c00f9..f00f207 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"显示时钟"</string>
<string name="hide_clock" msgid="3217727306480505694">"隐藏时钟"</string>
<string name="label" msgid="162189613902857319">"标签"</string>
+ <string name="on_switch" msgid="2297966258029227449">"开启"</string>
+ <string name="off_switch" msgid="3381070073851148013">"关闭"</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="6506982899651975645">"闹钟铃声"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"自定义铃声"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"计时器已结束"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"静音"</string>
<string name="ringtone" msgid="9110746249688559579">"铃声"</string>
<string name="time" msgid="8067216534232296518">"时间"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"明天"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"闹钟已暂停,将于<xliff:g id="TIME">%s</xliff:g>再响"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"预定的闹钟"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"错过的闹钟已删除"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"还剩不到1分钟"</item>
- <item msgid="83197792732433351">"还剩<xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"还剩<xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"还剩<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"还剩不到 1 分钟"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"还剩 <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"还剩"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"还剩"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"闹钟时间已设为不到1分钟后。"</item>
<item msgid="6002066367368421848">"闹钟时间已设为<xliff:g id="DAYS">%1$s</xliff:g>后。"</item>
@@ -101,6 +104,10 @@
<item quantity="other">分钟</item>
<item quantity="one">分钟</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"逐步增大音量"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"关闭"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> 秒"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"秒"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"闹铃时长"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> 分钟</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"还原"</string>
<string name="delete" msgid="5732434972457000541">"删除闹钟"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"闹钟音量"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"静音"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"静音"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"未知"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"暂停或关闭闹钟。"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g>(已暂停)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"闹钟时间已设为<xliff:g id="TIME">%s</xliff:g>后。触摸可取消。"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"正在加载铃声..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"用于“时钟”内设置的计时器的音效播放服务。"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"设置闹钟"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"闹钟"</string>
<string name="menu_timer" msgid="6459070074762877114">"计时器"</string>
<string name="menu_clock" msgid="5612760670606829805">"时钟"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"按名称排序"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"所选城市"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"继续"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"开始"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"停止"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"一圈"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"重置"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"开始"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"暂停"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"一圈"</string>
<string name="sw_share_button" msgid="4478648110382859382">"分享"</string>
<string name="hours_label" msgid="3393478155635368097">"小时"</string>
<string name="minutes_label" msgid="3568098128251438588">"分"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"我的时间:<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"各圈时间:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"第<xliff:g id="NUMBER">%d</xliff:g>圈"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> 小时</item>
<item quantity="one">1 小时</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"增加1分钟"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"加上1分钟"</string>
<string name="timer_stop" msgid="3361154678667736722">"停止"</string>
- <string name="timer_done" msgid="2375990511982914051">"完成"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"停止所有计时器"</string>
<string name="timer_reset" msgid="7848424809190171640">"重置"</string>
<string name="timer_cancel" msgid="3572868404230815644">"取消"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"已取消计时器"</string>
<string name="timer_times_up" msgid="9190440395938519009">"时间到"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> 个计时器已到期"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"计时器"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"最多只能设置4个计时器"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"暂停"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"重置所有计时器"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"您简直就像闪电侠。"</item>
<item msgid="6332879039890727169">"享受一下您大汗淋漓的成果吧。"</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"城市"</string>
<string name="clock_settings" msgid="8317286807280600391">"时钟"</string>
<string name="clock_style" msgid="2265011060429742344">"样式"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"更改日期和时间"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"指针"</item>
<item msgid="8483930821046925592">"数字"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"已选中<xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"已取消选中<xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"马绍尔群岛"</item>
<item msgid="4196408495909011020">"中途岛"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"雅加达"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"闹钟"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"使用秒表服务执行通知功能。"</string>
- <string name="swn_stopped" msgid="783124901663086172">"已停止"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"处理可通过计时器通知执行的操作。"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"处理可通过秒表通知执行的操作。"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"已暂停"</string>
<string name="description_direction_right" msgid="5709209043267548985">"向右滑动可关闭闹钟"</string>
<string name="description_direction_left" msgid="7448141043674998679">"向左滑动可暂停闹钟"</string>
<string name="description_direction_both" msgid="1841309486023845685">"向左滑动可暂停,向右滑动可关闭"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"计时器"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"计时器铃声"</string>
<string name="timer_stopped" msgid="2730331837832462008">"计时器已停止"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g>个计时器已停止"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"计时器已暂停"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> 个计时器已暂停"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"触摸可查看您的计时器"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g>个计时器"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"下一个计时器:<xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"没有闹钟"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"未设置闹钟"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"没有预定的闹钟"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"a h:mm"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEEa h:mm"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"时间无效:<xliff:g id="INVALID_AMPM">%s</xliff:g> <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"未设置 <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> 的闹钟"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"未设置任何闹钟"</string>
<string name="no_label_specified" msgid="2008482054428460626">"未指定任何标签"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"没有闹钟包含此标签"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"秒表已在计时"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"秒表目前未运行"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"秒表正在运行,因此无法重置"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"秒表已停止"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"秒表已暂停"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"秒表已重置"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"秒表已分圈计时"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"秒表已开始"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"未设置这个时间的闹钟"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"已关闭 <xliff:g id="ALARM_TIME">%s</xliff:g> 的闹钟"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"已设置 <xliff:g id="ALARM_TIME">%s</xliff:g> 的闹钟"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"未设置任何计时器"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"已删除计时器"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"计时器已在计时"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"有多个相符的计时器,因而无法完成您的请求"</string>
- <string name="timer_started" msgid="6715582052946641641">"已启动计时器"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"没有任何计时器"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"有多个计时器存在"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"已移除计时器。"</string>
<string name="timer_created" msgid="4381027137335885547">"已创建计时器"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"计时器时长无效"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"已重置计时器"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"计时器仍在计时,无法重置。停止计时器即可重置。"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"计时器之前已停止"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"已删除计时器"</string>
+ <string name="timer_started" msgid="6715582052946641641">"已启动计时器"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"计时器时长无效"</string>
<string name="no_city_selected" msgid="1007596865203283741">"未选择任何城市"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"数据库中没有您指定的城市"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"已添加过该城市"</string>
diff --git a/res/values-zh-rHK/array.xml b/res/values-zh-rHK/array.xml
index c19a651..108130a 100644
--- a/res/values-zh-rHK/array.xml
+++ b/res/values-zh-rHK/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"14劃<xliff:g id="SEPARATOR">=</xliff:g>福塔萊薩"</item>
<item msgid="5801558418916235541">"3劃<xliff:g id="SEPARATOR">=</xliff:g>大特克"</item>
<item msgid="2103759276235503048">"10劃<xliff:g id="SEPARATOR">=</xliff:g>格瑞納達"</item>
- <item msgid="1490069759176391533">"6劃<xliff:g id="SEPARATOR">=</xliff:g>危地馬拉"</item>
+ <item msgid="6216160110733510854">"6劃<xliff:g id="SEPARATOR">=</xliff:g>危地馬拉城"</item>
<item msgid="525959305652046261">"6劃<xliff:g id="SEPARATOR">=</xliff:g>圭亞那"</item>
<item msgid="7565596629973190931">"9劃<xliff:g id="SEPARATOR">=</xliff:g>哈利法克斯"</item>
<item msgid="3811169155065582644">"9劃<xliff:g id="SEPARATOR">=</xliff:g>哈瓦那"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"6劃<xliff:g id="SEPARATOR">=</xliff:g>多倫多"</item>
<item msgid="1506838283840737263">"13劃<xliff:g id="SEPARATOR">=</xliff:g>溫哥華"</item>
<item msgid="8935386104773857399">"13劃<xliff:g id="SEPARATOR">=</xliff:g>溫尼伯"</item>
- <item msgid="1132634022412399582">"9劃<xliff:g id="SEPARATOR">=</xliff:g>南極"</item>
+ <item msgid="498429228419399474">"9劃<xliff:g id="SEPARATOR">=</xliff:g>南極<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"10劃<xliff:g id="SEPARATOR">=</xliff:g>朗伊爾城"</item>
<item msgid="3784788073896028355">"8劃<xliff:g id="SEPARATOR">=</xliff:g>阿拉木圖"</item>
<item msgid="7895695236056852523">"6劃<xliff:g id="SEPARATOR">=</xliff:g>安曼"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"5劃<xliff:g id="SEPARATOR">=</xliff:g>加沙"</item>
<item msgid="2359068282340162319">"7劃<xliff:g id="SEPARATOR">=</xliff:g>希伯崙"</item>
<item msgid="6223396610551759129">"9劃<xliff:g id="SEPARATOR">=</xliff:g>胡志明市"</item>
- <item msgid="4731022818651322736">"9劃<xliff:g id="SEPARATOR">=</xliff:g>香港"</item>
+ <item msgid="3439764751788710130">"9劃<xliff:g id="SEPARATOR">=</xliff:g>香港<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"6劃<xliff:g id="SEPARATOR">=</xliff:g>伊斯坦布爾"</item>
<item msgid="758800913783999425">"12劃<xliff:g id="SEPARATOR">=</xliff:g>雅加達"</item>
<item msgid="8956406398692698126">"9劃<xliff:g id="SEPARATOR">=</xliff:g>耶路撒冷"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"10劃<xliff:g id="SEPARATOR">=</xliff:g>馬尼拉"</item>
<item msgid="6033964325069060422">"10劃<xliff:g id="SEPARATOR">=</xliff:g>馬斯喀特"</item>
<item msgid="6077458941399984780">"8劃<xliff:g id="SEPARATOR">=</xliff:g>金邊"</item>
- <item msgid="935474308903572975">"5劃<xliff:g id="SEPARATOR">=</xliff:g>平壤"</item>
+ <item msgid="1245515372520913197">"5劃<xliff:g id="SEPARATOR">=</xliff:g>平壤<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"5劃<xliff:g id="SEPARATOR">=</xliff:g>卡塔爾"</item>
<item msgid="1667243110545095146">"6劃<xliff:g id="SEPARATOR">=</xliff:g>仰光"</item>
<item msgid="4460370766685855731">"7劃<xliff:g id="SEPARATOR">=</xliff:g>利雅得"</item>
<item msgid="4229224905931739201">"9劃<xliff:g id="SEPARATOR">=</xliff:g>胡志明市"</item>
<item msgid="8705359848250215620">"9劃<xliff:g id="SEPARATOR">=</xliff:g>首爾"</item>
- <item msgid="583367295371395814">"3劃<xliff:g id="SEPARATOR">=</xliff:g>上海"</item>
+ <item msgid="3814881931186962624">"3劃<xliff:g id="SEPARATOR">=</xliff:g>上海<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"13劃<xliff:g id="SEPARATOR">=</xliff:g>新加坡"</item>
- <item msgid="1972491729911039207">"5劃<xliff:g id="SEPARATOR">=</xliff:g>台北"</item>
+ <item msgid="8982451946156859368">"5劃<xliff:g id="SEPARATOR">=</xliff:g>台北<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"15劃<xliff:g id="SEPARATOR">=</xliff:g>德黑蘭"</item>
<item msgid="8629402941285674273">"10劃<xliff:g id="SEPARATOR">=</xliff:g>特拉維夫"</item>
- <item msgid="8499164674454654525">"8劃<xliff:g id="SEPARATOR">=</xliff:g>東京"</item>
+ <item msgid="76330681636547168">"8劃<xliff:g id="SEPARATOR">=</xliff:g>東京<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"10劃<xliff:g id="SEPARATOR">=</xliff:g>烏蘭巴托"</item>
<item msgid="2028626988021468640">"6劃<xliff:g id="SEPARATOR">=</xliff:g>百慕達"</item>
<item msgid="4527109966513690429">"5劃<xliff:g id="SEPARATOR">=</xliff:g>加納利"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"7劃<xliff:g id="SEPARATOR">=</xliff:g>里諾"</item>
<item msgid="9155068631060038769">"12劃<xliff:g id="SEPARATOR">=</xliff:g>黑岩城"</item>
<item msgid="8498761319928979900">"6劃<xliff:g id="SEPARATOR">=</xliff:g>多哈"</item>
- <item msgid="8307897251088048641">"5劃<xliff:g id="SEPARATOR">=</xliff:g>北京"</item>
+ <item msgid="5327010922199714808">"5劃<xliff:g id="SEPARATOR">=</xliff:g>北京<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"8劃<xliff:g id="SEPARATOR">=</xliff:g>孟買"</item>
<item msgid="6668274273067049125">"15劃<xliff:g id="SEPARATOR">=</xliff:g>德里"</item>
- <item msgid="2933410189478233292">"3劃<xliff:g id="SEPARATOR">=</xliff:g>大阪"</item>
+ <item msgid="7199039603593847813">"3劃<xliff:g id="SEPARATOR">=</xliff:g>大阪<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"8劃<xliff:g id="SEPARATOR">=</xliff:g>拉合爾"</item>
<item msgid="1448378291805481500">"7劃<xliff:g id="SEPARATOR">=</xliff:g>沙那"</item>
<item msgid="5233119846682408301">"4劃<xliff:g id="SEPARATOR">=</xliff:g>巴塞隆拿"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"15劃<xliff:g id="SEPARATOR">=</xliff:g>劍橋"</item>
<item msgid="759409010285366934">"9劃<xliff:g id="SEPARATOR">=</xliff:g>科克蘭"</item>
<item msgid="6308007059287569663">"11劃 <xliff:g id="SEPARATOR">=</xliff:g>麥迪遜"</item>
- <item msgid="6971636434858330021">"15劃<xliff:g id="SEPARATOR">=</xliff:g>廣州"</item>
+ <item msgid="2077617905582224600">"15劃<xliff:g id="SEPARATOR">=</xliff:g>廣州<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"10劃<xliff:g id="SEPARATOR">=</xliff:g>海得拉巴"</item>
<item msgid="3032295682584784261">"13劃<xliff:g id="SEPARATOR">=</xliff:g>雷斯頓"</item>
<item msgid="7722837296297332268">"9劃<xliff:g id="SEPARATOR">=</xliff:g>美景市"</item>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index c238e67..f5f77ed 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"顯示時鐘"</string>
<string name="hide_clock" msgid="3217727306480505694">"隱藏時鐘"</string>
<string name="label" msgid="162189613902857319">"標籤"</string>
+ <string name="on_switch" msgid="2297966258029227449">"開啟"</string>
+ <string name="off_switch" msgid="3381070073851148013">"關閉"</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="6506982899651975645">"鬧鐘鈴聲"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"自訂鈴聲"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"計時器已逾時"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"靜音"</string>
<string name="ringtone" msgid="9110746249688559579">"鈴聲"</string>
<string name="time" msgid="8067216534232296518">"時間"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"明天"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"到 <xliff:g id="TIME">%s</xliff:g> 才重響"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"預定的鬧鐘"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"您錯過的鬧鐘已刪除"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"剩下不到一分鐘"</item>
- <item msgid="83197792732433351">"剩下 <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"剩下 <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"剩下 <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"尚餘少於一分鐘"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"尚餘 <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"尚餘"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"尚餘"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"已將鬧鐘設定在不到 1 分鐘後啟動。"</item>
<item msgid="6002066367368421848">"已將鬧鐘設定在 <xliff:g id="DAYS">%1$s</xliff:g>後啟動。"</item>
@@ -101,6 +104,10 @@
<item quantity="other"> 分鐘</item>
<item quantity="one">1 分鐘</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"逐步提高音量"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"關閉"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> 秒"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"秒"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"以下時間過後停止鈴聲:"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> 分鐘</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"復原"</string>
<string name="delete" msgid="5732434972457000541">"刪除"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"鬧鐘音量"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"無聲"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"靜音"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"不明"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"稍後重響或關閉鬧鐘。"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (延遲)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"已將鬧鐘設定在 <xliff:g id="TIME">%s</xliff:g>,輕觸即可取消。"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"正在載入鈴聲..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"在「時鐘」設定的計時器音效播放服務。"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"設定鬧鐘"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"鬧鐘"</string>
<string name="menu_timer" msgid="6459070074762877114">"計時器"</string>
<string name="menu_clock" msgid="5612760670606829805">"時鐘"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"按名稱排序"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"選取的城市"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"恢復"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"開始"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"停止"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"單圈"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"重設"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"開始"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"暫停"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"單圈"</string>
<string name="sw_share_button" msgid="4478648110382859382">"分享"</string>
<string name="hours_label" msgid="3393478155635368097">"時"</string>
<string name="minutes_label" msgid="3568098128251438588">"分"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"我的時間:<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"單圈時間:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"第 <xliff:g id="NUMBER">%d</xliff:g> 圈"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> 小時</item>
<item quantity="one">1 小時</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"增加 1 分鐘"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"多加 1 分鐘"</string>
<string name="timer_stop" msgid="3361154678667736722">"停止"</string>
- <string name="timer_done" msgid="2375990511982914051">"完成"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"停止所有倒數計時器"</string>
<string name="timer_reset" msgid="7848424809190171640">"重設"</string>
<string name="timer_cancel" msgid="3572868404230815644">"取消"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"已取消計時"</string>
<string name="timer_times_up" msgid="9190440395938519009">"時間已到"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> 個倒數計時器逾時"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"計時器"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"最多 4 個計時器"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"暫停"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"重設所有計時器"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"您就像閃電俠。"</item>
<item msgid="6332879039890727169">"享受辛勞的成果。"</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"城市"</string>
<string name="clock_settings" msgid="8317286807280600391">"時鐘"</string>
<string name="clock_style" msgid="2265011060429742344">"樣式"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"更改日期和時間"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"類比"</item>
<item msgid="8483930821046925592">"數碼"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"已勾選<xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"未勾選<xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"馬紹爾群島"</item>
<item msgid="4196408495909011020">"中途島"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"雅加達"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"鬧鐘"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"使用秒錶服務發出通知。"</string>
- <string name="swn_stopped" msgid="783124901663086172">"已停止"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"計時器通知的處理操作。"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"秒錶通知的處理操作。"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"已暫停"</string>
<string name="description_direction_right" msgid="5709209043267548985">"向右快速滑動可關閉鬧鐘"</string>
<string name="description_direction_left" msgid="7448141043674998679">"向左快速滑動可重響鬧鐘"</string>
<string name="description_direction_both" msgid="1841309486023845685">"向左快速滑動以重響,或向右關閉"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"倒數計時器"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"倒數計時器鈴聲"</string>
<string name="timer_stopped" msgid="2730331837832462008">"計時器已停止"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> 個計時器已停止"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"計時器已暫停"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> 個計時器已暫停"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"輕觸即可查看您的計時器"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> 個計時器"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"下一個計時器:<xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"沒有設定鬧鐘"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"未設定鬧鐘"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"沒有啟用中的鬧鐘"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"a h:mm"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE,a h:mm"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE,K:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"無效時間 <xliff:g id="INVALID_AMPM">%s</xliff:g> <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"沒有 <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g> 的鬧鐘"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"沒有已預設的鬧鐘"</string>
<string name="no_label_specified" msgid="2008482054428460626">"沒有指定標籤"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"此標籤沒有設定鬧鐘"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"秒錶已開始計時"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"秒錶尚未開始計時"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"秒錶正在運行,因此無法重設。"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"已停止秒錶"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"已暫停秒錶"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"已重設秒錶"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"秒錶已分段計時"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"已啟動秒錶"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"尚未為這個時間預設鬧鐘"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"已關閉 <xliff:g id="ALARM_TIME">%s</xliff:g> 的鬧鐘"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"鬧鐘已設定為 <xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"尚未設定倒數計時器"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"已刪除倒數計時器"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"倒數計時器已開始計時"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"無法完成您的要求,已設定多個倒數計時器"</string>
- <string name="timer_started" msgid="6715582052946641641">"已開始倒數計時器"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"沒有已設定的計時器"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"已設定超過一個計時器"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"計時器已移除。"</string>
<string name="timer_created" msgid="4381027137335885547">"已建立倒數計時器"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"倒數計時器長度無效"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"已重設倒數計時器"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"倒數計時器仍在計時中,無法重設。停止倒數計時器即可重設。"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"倒數計時器已停止"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"已刪除倒數計時器"</string>
+ <string name="timer_started" msgid="6715582052946641641">"已開始倒數計時器"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"倒數計時器長度無效"</string>
<string name="no_city_selected" msgid="1007596865203283741">"尚未選取城市"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"資料庫中找不到您指定的城市"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"已新增該城市"</string>
diff --git a/res/values-zh-rTW/array.xml b/res/values-zh-rTW/array.xml
index 9f02bac..9a1119e 100644
--- a/res/values-zh-rTW/array.xml
+++ b/res/values-zh-rTW/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"14 劃<xliff:g id="SEPARATOR">=</xliff:g>福塔力沙"</item>
<item msgid="5801558418916235541">"3 劃<xliff:g id="SEPARATOR">=</xliff:g>大特克"</item>
<item msgid="2103759276235503048">"10 劃<xliff:g id="SEPARATOR">=</xliff:g>格瑞那達"</item>
- <item msgid="1490069759176391533">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>瓜地馬拉"</item>
+ <item msgid="6216160110733510854">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>瓜地馬拉市"</item>
<item msgid="525959305652046261">"16 劃<xliff:g id="SEPARATOR">=</xliff:g>蓋亞那"</item>
<item msgid="7565596629973190931">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>哈利法克斯"</item>
<item msgid="3811169155065582644">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>哈瓦那"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"6 劃<xliff:g id="SEPARATOR">=</xliff:g>多倫多"</item>
<item msgid="1506838283840737263">"13 劃<xliff:g id="SEPARATOR">=</xliff:g>溫哥華"</item>
<item msgid="8935386104773857399">"13 劃<xliff:g id="SEPARATOR">=</xliff:g>溫尼伯"</item>
- <item msgid="1132634022412399582">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>南極"</item>
+ <item msgid="498429228419399474">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>南極<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"11 劃<xliff:g id="SEPARATOR">=</xliff:g>隆意耳拜恩"</item>
<item msgid="3784788073896028355">"7 劃<xliff:g id="SEPARATOR">=</xliff:g>阿爾馬提"</item>
<item msgid="7895695236056852523">"6 劃<xliff:g id="SEPARATOR">=</xliff:g>安曼"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>加薩"</item>
<item msgid="2359068282340162319">"7 劃<xliff:g id="SEPARATOR">=</xliff:g>希伯倫"</item>
<item msgid="6223396610551759129">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>胡志明市"</item>
- <item msgid="4731022818651322736">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>香港"</item>
+ <item msgid="3439764751788710130">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>香港<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"6 劃<xliff:g id="SEPARATOR">=</xliff:g>伊斯坦堡"</item>
<item msgid="758800913783999425">"12 劃<xliff:g id="SEPARATOR">=</xliff:g>雅加達"</item>
<item msgid="8956406398692698126">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>耶路撒冷"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"10 劃<xliff:g id="SEPARATOR">=</xliff:g>馬尼拉"</item>
<item msgid="6033964325069060422">"10 劃<xliff:g id="SEPARATOR">=</xliff:g>馬斯喀特"</item>
<item msgid="6077458941399984780">"8 劃<xliff:g id="SEPARATOR">=</xliff:g>金邊"</item>
- <item msgid="935474308903572975">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>平壤"</item>
+ <item msgid="1245515372520913197">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>平壤<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>卡達"</item>
<item msgid="1667243110545095146">"6 劃<xliff:g id="SEPARATOR">=</xliff:g>仰光"</item>
<item msgid="4460370766685855731">"7 劃<xliff:g id="SEPARATOR">=</xliff:g>利雅得"</item>
<item msgid="4229224905931739201">"6 劃<xliff:g id="SEPARATOR">=</xliff:g>西貢"</item>
<item msgid="8705359848250215620">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>首爾"</item>
- <item msgid="583367295371395814">"3 劃<xliff:g id="SEPARATOR">=</xliff:g>上海"</item>
+ <item msgid="3814881931186962624">"3 劃<xliff:g id="SEPARATOR">=</xliff:g>上海<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"13 劃<xliff:g id="SEPARATOR">=</xliff:g>新加坡"</item>
- <item msgid="1972491729911039207">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>台北"</item>
+ <item msgid="8982451946156859368">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>台北<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"15 劃<xliff:g id="SEPARATOR">=</xliff:g>德黑蘭"</item>
<item msgid="8629402941285674273">"10 劃<xliff:g id="SEPARATOR">=</xliff:g>特拉維夫"</item>
- <item msgid="8499164674454654525">"8 劃<xliff:g id="SEPARATOR">=</xliff:g>東京"</item>
+ <item msgid="76330681636547168">"8 劃<xliff:g id="SEPARATOR">=</xliff:g>東京<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"10 劃<xliff:g id="SEPARATOR">=</xliff:g>庫倫"</item>
<item msgid="2028626988021468640">"6 劃<xliff:g id="SEPARATOR">=</xliff:g>百慕達"</item>
<item msgid="4527109966513690429">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>加納利"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"13 劃<xliff:g id="SEPARATOR">=</xliff:g>雷諾"</item>
<item msgid="9155068631060038769">"12 劃<xliff:g id="SEPARATOR">=</xliff:g>黑岩市"</item>
<item msgid="8498761319928979900">"6 劃<xliff:g id="SEPARATOR">=</xliff:g>多哈"</item>
- <item msgid="8307897251088048641">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>北京"</item>
+ <item msgid="5327010922199714808">"5 劃<xliff:g id="SEPARATOR">=</xliff:g>北京<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"8 劃<xliff:g id="SEPARATOR">=</xliff:g>孟買"</item>
<item msgid="6668274273067049125">"15 劃<xliff:g id="SEPARATOR">=</xliff:g>德里"</item>
- <item msgid="2933410189478233292">"3 劃<xliff:g id="SEPARATOR">=</xliff:g>大阪"</item>
+ <item msgid="7199039603593847813">"3 劃<xliff:g id="SEPARATOR">=</xliff:g>大阪<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"8 劃<xliff:g id="SEPARATOR">=</xliff:g>拉合爾"</item>
<item msgid="1448378291805481500">"18 劃<xliff:g id="SEPARATOR">=</xliff:g>薩那"</item>
<item msgid="5233119846682408301">"4 劃<xliff:g id="SEPARATOR">=</xliff:g>巴塞隆納"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"15 劃<xliff:g id="SEPARATOR">=</xliff:g>劍橋"</item>
<item msgid="759409010285366934">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>科克蘭"</item>
<item msgid="6308007059287569663">"11 劃<xliff:g id="SEPARATOR">=</xliff:g>麥迪遜"</item>
- <item msgid="6971636434858330021">"15 劃<xliff:g id="SEPARATOR">=</xliff:g>廣州"</item>
+ <item msgid="2077617905582224600">"15 劃<xliff:g id="SEPARATOR">=</xliff:g>廣州<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"10 劃<xliff:g id="SEPARATOR">=</xliff:g>海得拉巴"</item>
<item msgid="3032295682584784261">"13 劃<xliff:g id="SEPARATOR">=</xliff:g>雷斯頓"</item>
<item msgid="7722837296297332268">"9 劃<xliff:g id="SEPARATOR">=</xliff:g>美景市"</item>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 4158b65..f8f0832 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"顯示時鐘"</string>
<string name="hide_clock" msgid="3217727306480505694">"隱藏時鐘"</string>
<string name="label" msgid="162189613902857319">"標籤"</string>
+ <string name="on_switch" msgid="2297966258029227449">"開啟"</string>
+ <string name="off_switch" msgid="3381070073851148013">"關閉"</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="6506982899651975645">"鬧鐘鈴聲"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"自訂鈴聲"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"計時完畢"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"靜音"</string>
<string name="ringtone" msgid="9110746249688559579">"鈴聲"</string>
<string name="time" msgid="8067216534232296518">"時間"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"明天"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"延後到 <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"預定的鬧鐘"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"您錯過的鬧鐘已刪除"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"還剩下不到 1 分鐘"</item>
- <item msgid="83197792732433351">"還剩下 <xliff:g id="HOURS">%1$s</xliff:g>"</item>
- <item msgid="8919698220200894252">"還剩下 <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- <item msgid="8458069283817013813">"還剩下 <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"還剩下不到 1 分鐘"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="HOURS">%1$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="REMAINING"> %3$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"還剩下 <xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g>"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"還剩下"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"還剩下"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"已將鬧鐘設定在 1 分鐘內啟動。"</item>
<item msgid="6002066367368421848">"已將鬧鐘設定在 <xliff:g id="DAYS">%1$s</xliff:g>後啟動。"</item>
@@ -101,6 +104,10 @@
<item quantity="other">分鐘</item>
<item quantity="one">分鐘</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"漸漸提高音量"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"關閉"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> 秒"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"秒"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"鬧鐘鈴響持續時間:"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="other"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> 分鐘</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"復原"</string>
<string name="delete" msgid="5732434972457000541">"刪除"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"鬧鐘音量"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"靜音"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"靜音"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"不明"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"繼續貪睡或關閉鬧鐘。"</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (貪睡)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"已將鬧鐘設定在 <xliff:g id="TIME">%s</xliff:g>,輕觸即可取消。"</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"正在載入鈴聲…"</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"「時鐘」設定的計時器音效播放服務。"</string>
<string name="control_set_alarm" msgid="2194676418924016327">"設定鬧鐘"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"鬧鐘"</string>
<string name="menu_timer" msgid="6459070074762877114">"計時器"</string>
<string name="menu_clock" msgid="5612760670606829805">"時鐘"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"依名稱排序"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"選取的城市"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"繼續"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"開始"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"停止"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"單圈計時"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"重設"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"開始"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"暫停"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"單圈計時"</string>
<string name="sw_share_button" msgid="4478648110382859382">"分享"</string>
<string name="hours_label" msgid="3393478155635368097">"時"</string>
<string name="minutes_label" msgid="3568098128251438588">"分"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"我的時間:<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"單圈時間:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"第 <xliff:g id="NUMBER">%d</xliff:g> 圈"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> 小時</item>
<item quantity="one">1 小時</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"增加 1 分鐘"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"增加 1 分鐘"</string>
<string name="timer_stop" msgid="3361154678667736722">"停止"</string>
- <string name="timer_done" msgid="2375990511982914051">"完成"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"停止所有計時器"</string>
<string name="timer_reset" msgid="7848424809190171640">"重設"</string>
<string name="timer_cancel" msgid="3572868404230815644">"取消"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"已取消計時器"</string>
<string name="timer_times_up" msgid="9190440395938519009">"時間到"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> 個計時器到期"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"計時器"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"最多只能建立 4 個計時器"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"暫停"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"重設所有計時器"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"您簡直就像閃電俠。"</item>
<item msgid="6332879039890727169">"盡情享受辛勞過後的果實。"</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"城市"</string>
<string name="clock_settings" msgid="8317286807280600391">"時鐘"</string>
<string name="clock_style" msgid="2265011060429742344">"樣式"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"變更日期和時間"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"類比"</item>
<item msgid="8483930821046925592">"數位"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"已勾選<xliff:g id="CITY_NAME">%s</xliff:g>"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"已取消勾選<xliff:g id="CITY_NAME">%s</xliff:g>"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"馬歇爾群島"</item>
<item msgid="4196408495909011020">"中途島"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"雅加達"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"鬧鐘"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"使用碼表服務執行通知功能。"</string>
- <string name="swn_stopped" msgid="783124901663086172">"已停止"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"處理計時器通知所指定的操作。"</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"處理碼錶通知所指定的操作。"</string>
+ <string name="swn_paused" msgid="6364358842808263589">"已暫停"</string>
<string name="description_direction_right" msgid="5709209043267548985">"向右滑動可關閉鈴響"</string>
<string name="description_direction_left" msgid="7448141043674998679">"向左滑動可延後鈴響"</string>
<string name="description_direction_both" msgid="1841309486023845685">"向左滑動可延後鈴響,向右滑動可關閉鈴響"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"計時器"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"計時器鈴聲"</string>
<string name="timer_stopped" msgid="2730331837832462008">"計時器已停止"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> 個計時器已停止"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"計時器已暫停"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> 個計時器已暫停"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"輕觸即可查看您的計時器"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> 個計時器"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"下一個計時器:<xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"沒有設定鬧鐘"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"未設定鬧鐘"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"沒有預定的鬧鐘"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm (a)"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE h:mm (a)"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"<xliff:g id="INVALID_AMPM">%s</xliff:g> <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> 是無效的時間"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"目前沒有鬧鐘設在 <xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"未設定鬧鐘"</string>
<string name="no_label_specified" msgid="2008482054428460626">"未指定任何標籤"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"沒有任何鬧鐘包含指定標籤"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"碼錶已在執行中"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"碼錶目前未啟動"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"碼錶正在執行中,因此無法重設"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"碼錶停止計時"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"已暫停碼錶"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"碼錶已重設"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"碼錶已記錄單圈時間"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"碼錶開始計時"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"目前沒有鬧鐘設在這個時間"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"已關閉 <xliff:g id="ALARM_TIME">%s</xliff:g> 的鬧鐘"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"已設定鬧鐘時間:<xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"未設定計時器"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"已刪除計時器"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"計時器已在執行中"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"無法完成要求,目前有多個相符的計時器"</string>
- <string name="timer_started" msgid="6715582052946641641">"已啟動計時器"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"沒有任何計時器"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"有多個計時器存在"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"已移除計時器。"</string>
<string name="timer_created" msgid="4381027137335885547">"已建立計時器"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"計時器時間長度無效"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"已重設計時器"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"計時器仍在執行中,因此無法重設。停止計時器後才可重設。"</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"計時器先前已停止"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"已刪除計時器"</string>
+ <string name="timer_started" msgid="6715582052946641641">"已啟動計時器"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"計時器時間長度無效"</string>
<string name="no_city_selected" msgid="1007596865203283741">"未選取任何城市"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"資料庫中沒有您指定的城市"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"先前已新增該城市"</string>
diff --git a/res/values-zu/array.xml b/res/values-zu/array.xml
index 0ad29ad..e373b62 100644
--- a/res/values-zu/array.xml
+++ b/res/values-zu/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -69,7 +69,7 @@
<item msgid="7872196528637597794">"F<xliff:g id="SEPARATOR">=</xliff:g>I-Fortaleza"</item>
<item msgid="5801558418916235541">"G<xliff:g id="SEPARATOR">=</xliff:g>I-Grand Turk"</item>
<item msgid="2103759276235503048">"G<xliff:g id="SEPARATOR">=</xliff:g>I-Grenada"</item>
- <item msgid="1490069759176391533">"G<xliff:g id="SEPARATOR">=</xliff:g>I-Guatemala"</item>
+ <item msgid="6216160110733510854">"G<xliff:g id="SEPARATOR">=</xliff:g>Guatemala City"</item>
<item msgid="525959305652046261">"G<xliff:g id="SEPARATOR">=</xliff:g>I-Guyana"</item>
<item msgid="7565596629973190931">"H<xliff:g id="SEPARATOR">=</xliff:g>I-Halifax"</item>
<item msgid="3811169155065582644">"H<xliff:g id="SEPARATOR">=</xliff:g>I-Havana"</item>
@@ -114,7 +114,7 @@
<item msgid="3491199166042475853">"T<xliff:g id="SEPARATOR">=</xliff:g>I-Toronto"</item>
<item msgid="1506838283840737263">"V<xliff:g id="SEPARATOR">=</xliff:g>I-Vancouver"</item>
<item msgid="8935386104773857399">"W<xliff:g id="SEPARATOR">=</xliff:g>I-Winnipeg"</item>
- <item msgid="1132634022412399582">"S<xliff:g id="SEPARATOR">=</xliff:g>I-South Pole"</item>
+ <item msgid="498429228419399474">"<xliff:g id="SEPARATOR">=</xliff:g>I-South Pole<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="4076962667198039206">"L<xliff:g id="SEPARATOR">=</xliff:g>I-Longyearbyen"</item>
<item msgid="3784788073896028355">"A<xliff:g id="SEPARATOR">=</xliff:g>I-Almaty"</item>
<item msgid="7895695236056852523">"A<xliff:g id="SEPARATOR">=</xliff:g>I-Amman"</item>
@@ -132,7 +132,7 @@
<item msgid="1203379132329159260">"G<xliff:g id="SEPARATOR">=</xliff:g>I-Gaza"</item>
<item msgid="2359068282340162319">"H<xliff:g id="SEPARATOR">=</xliff:g>I-Hebron"</item>
<item msgid="6223396610551759129">"H<xliff:g id="SEPARATOR">=</xliff:g>I-Ho Chi Minh"</item>
- <item msgid="4731022818651322736">"H<xliff:g id="SEPARATOR">=</xliff:g>I-Hong Kong"</item>
+ <item msgid="3439764751788710130">"<xliff:g id="SEPARATOR">=</xliff:g>I-Hong Kong<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8104778702069607166">"I<xliff:g id="SEPARATOR">=</xliff:g>I-Istanbul"</item>
<item msgid="758800913783999425">"J<xliff:g id="SEPARATOR">=</xliff:g>I-Jakarta"</item>
<item msgid="8956406398692698126">"J<xliff:g id="SEPARATOR">=</xliff:g>I-Jerusalem"</item>
@@ -145,18 +145,18 @@
<item msgid="722458682107911739">"M<xliff:g id="SEPARATOR">=</xliff:g>I-Manila"</item>
<item msgid="6033964325069060422">"M<xliff:g id="SEPARATOR">=</xliff:g>I-Muscat"</item>
<item msgid="6077458941399984780">"P<xliff:g id="SEPARATOR">=</xliff:g>I-Phnom Penh"</item>
- <item msgid="935474308903572975">"P<xliff:g id="SEPARATOR">=</xliff:g>I-Pyongyang"</item>
+ <item msgid="1245515372520913197">"<xliff:g id="SEPARATOR">=</xliff:g>I-Pyongyang<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5336632319992664889">"Q<xliff:g id="SEPARATOR">=</xliff:g>I-Qatar"</item>
<item msgid="1667243110545095146">"R<xliff:g id="SEPARATOR">=</xliff:g>I-Rangoon"</item>
<item msgid="4460370766685855731">"R<xliff:g id="SEPARATOR">=</xliff:g>I-Riyadh"</item>
<item msgid="4229224905931739201">"S<xliff:g id="SEPARATOR">=</xliff:g>I-Saigon"</item>
<item msgid="8705359848250215620">"S<xliff:g id="SEPARATOR">=</xliff:g>I-Seoul"</item>
- <item msgid="583367295371395814">"S<xliff:g id="SEPARATOR">=</xliff:g>I-Shanghai"</item>
+ <item msgid="3814881931186962624">"<xliff:g id="SEPARATOR">=</xliff:g>I-Shanghai<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1422156732794771136">"S<xliff:g id="SEPARATOR">=</xliff:g>I-Singapore"</item>
- <item msgid="1972491729911039207">"T<xliff:g id="SEPARATOR">=</xliff:g>I-Taipei"</item>
+ <item msgid="8982451946156859368">"<xliff:g id="SEPARATOR">=</xliff:g>I-Taipei<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="5563193560935461106">"T<xliff:g id="SEPARATOR">=</xliff:g>I-Caracas"</item>
<item msgid="8629402941285674273">"T<xliff:g id="SEPARATOR">=</xliff:g>I-Tel Aviv"</item>
- <item msgid="8499164674454654525">"T<xliff:g id="SEPARATOR">=</xliff:g>I-Tokyo"</item>
+ <item msgid="76330681636547168">"<xliff:g id="SEPARATOR">=</xliff:g>I-Tokyo<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1705804745888992744">"U<xliff:g id="SEPARATOR">=</xliff:g>I-Ulaanbaatar"</item>
<item msgid="2028626988021468640">"B<xliff:g id="SEPARATOR">=</xliff:g>I-Bermuda"</item>
<item msgid="4527109966513690429">"C<xliff:g id="SEPARATOR">=</xliff:g>I-Canary"</item>
@@ -273,10 +273,10 @@
<item msgid="150299708499753555">"R<xliff:g id="SEPARATOR">=</xliff:g>I-Reno"</item>
<item msgid="9155068631060038769">"B<xliff:g id="SEPARATOR">=</xliff:g>I-Black Rock City"</item>
<item msgid="8498761319928979900">"D<xliff:g id="SEPARATOR">=</xliff:g>I-Doha"</item>
- <item msgid="8307897251088048641">"B<xliff:g id="SEPARATOR">=</xliff:g>I-Beijing"</item>
+ <item msgid="5327010922199714808">"<xliff:g id="SEPARATOR">=</xliff:g>I-Beijing<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="8605970953750147428">"M<xliff:g id="SEPARATOR">=</xliff:g>I-Mumbai"</item>
<item msgid="6668274273067049125">"D<xliff:g id="SEPARATOR">=</xliff:g>I-Delhi"</item>
- <item msgid="2933410189478233292">"O<xliff:g id="SEPARATOR">=</xliff:g>I-Osaka"</item>
+ <item msgid="7199039603593847813">"<xliff:g id="SEPARATOR">=</xliff:g>I-Osaka<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="9011026093638055579">"L<xliff:g id="SEPARATOR">=</xliff:g>I-Lahore"</item>
<item msgid="1448378291805481500">"S<xliff:g id="SEPARATOR">=</xliff:g>I-Sana\'a"</item>
<item msgid="5233119846682408301">"B<xliff:g id="SEPARATOR">=</xliff:g>I-Barcelona"</item>
@@ -295,7 +295,7 @@
<item msgid="6393177386755796069">"C<xliff:g id="SEPARATOR">=</xliff:g>I-Cambridge"</item>
<item msgid="759409010285366934">"K<xliff:g id="SEPARATOR">=</xliff:g>I-Kirkland"</item>
<item msgid="6308007059287569663">"M<xliff:g id="SEPARATOR">=</xliff:g>I-Madison"</item>
- <item msgid="6971636434858330021">"G<xliff:g id="SEPARATOR">=</xliff:g>I-Guangzhou"</item>
+ <item msgid="2077617905582224600">"<xliff:g id="SEPARATOR">=</xliff:g>I-Guangzhou<xliff:g id="PHONETIC">:</xliff:g>"</item>
<item msgid="1185109514180068650">"H<xliff:g id="SEPARATOR">=</xliff:g>I-Hyderabad"</item>
<item msgid="3032295682584784261">"R<xliff:g id="SEPARATOR">=</xliff:g>I-Reston"</item>
<item msgid="7722837296297332268">"B<xliff:g id="SEPARATOR">=</xliff:g>I-Belo Horizonte"</item>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 44d90df..e88bf40 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -28,12 +28,15 @@
<string name="show_clock" msgid="8358759982675616915">"Bonisa iwashi"</string>
<string name="hide_clock" msgid="3217727306480505694">"Fihla iwashi"</string>
<string name="label" msgid="162189613902857319">"Ilebula"</string>
+ <string name="on_switch" msgid="2297966258029227449">"Vuliwe"</string>
+ <string name="off_switch" msgid="3381070073851148013">"Valiwe"</string>
<string name="default_label" msgid="5590025289805630372">"I-alamu"</string>
<string name="set_alarm" msgid="9148359866152726808">"Setha i-alamu"</string>
<string name="alarm_vibrate" msgid="3476686921490362230">"Dlidliza"</string>
<string name="alarm_repeat" msgid="7242985466344233206">"Phindaphinda"</string>
<string name="alert" msgid="6506982899651975645">"Ithoni yokukhala ye-alamu"</string>
- <string name="custom_ringtone" msgid="3477418548382111184">"Ithoni yokukhala yangokwezifiso"</string>
+ <string name="default_timer_ringtone_title" msgid="1370799536406862317">"Isibali sikhathi siphelelwe yisikhathi"</string>
+ <string name="silent_timer_ringtone_title" msgid="7588723137323327647">"Thulile"</string>
<string name="ringtone" msgid="9110746249688559579">"Ithoni yokukhala"</string>
<string name="time" msgid="8067216534232296518">"Isikhathi"</string>
<string name="alarm_tomorrow" msgid="131356848787643420">"Kusasa"</string>
@@ -58,12 +61,12 @@
<string name="alarm_alert_snooze_until" msgid="6958013659168344550">"Snuza kuze kube ngu-<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="alarm_alert_predismiss_title" msgid="5723945586913705445">"I-Alamu ezayo"</string>
<string name="missed_alarm_has_been_deleted" msgid="5295473204045979335">"I-Alamu yakho ekuphuthele isusiwe"</string>
- <string-array name="timer_notifications">
- <item msgid="7760558912503484257">"Ngaphansi kweminithi okusele"</item>
- <item msgid="83197792732433351">"<xliff:g id="HOURS">%1$s</xliff:g> asele"</item>
- <item msgid="8919698220200894252">"<xliff:g id="MINUTES">%2$s</xliff:g> asele"</item>
- <item msgid="8458069283817013813">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> asele"</item>
- </string-array>
+ <string name="timer_notifications_less_min" msgid="5481375048976427255">"Ngaphansi kweminithi okusele"</string>
+ <string name="timer_notifications_hours" msgid="1613266446037145138">"<xliff:g id="HOURS">%1$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_minutes" msgid="8543138714519498893">"<xliff:g id="MINUTES">%2$s</xliff:g><xliff:g id="REMAINING"> %3$s</xliff:g>"</string>
+ <string name="timer_notifications_hours_minutes" msgid="4301167788642025702">"<xliff:g id="HOURS">%1$s</xliff:g> <xliff:g id="MINUTES">%2$s</xliff:g> asele"</string>
+ <string name="timer_remaining_single" msgid="6782851171906765864">"asele"</string>
+ <string name="timer_remaining_multiple" msgid="6052775962092160851">"asele"</string>
<string-array name="alarm_set">
<item msgid="6450913786084215050">"I-alamu isethelwe iminithi elingaphansi ku-1 kusukela manje."</item>
<item msgid="6002066367368421848">"I-alamu isethelwe <xliff:g id="DAYS">%1$s</xliff:g> ukusuka manje."</item>
@@ -101,6 +104,10 @@
<item quantity="one">amaminithi</item>
<item quantity="other">amaminithi</item>
</plurals>
+ <string name="crescendo_duration_title" msgid="8606408542726189528">"Khuphula kancane kancane ivolumu"</string>
+ <string name="no_crescendo_duration" msgid="383801592865899932">"Valiwe"</string>
+ <string name="crescendo_duration" msgid="6641284876778266541">"<xliff:g id="NUMBER">%s</xliff:g> amasekhondi"</string>
+ <string name="crescendo_picker_label" msgid="7758024047003091056">"amasekhondi"</string>
<string name="auto_silence_title" msgid="2012754009554434544">"Ukuthula ngemuva"</string>
<plurals name="auto_silence_summary" formatted="false" msgid="6579258788774360396">
<item quantity="one"><xliff:g id="FORMATTED_NUMBER">%s</xliff:g> amaminithi</item>
@@ -126,7 +133,8 @@
<string name="revert" msgid="9100911171235162926">"Buyela emuva"</string>
<string name="delete" msgid="5732434972457000541">"Susa"</string>
<string name="alarm_volume_title" msgid="8506245173912428522">"Ivolumu ye-alamu"</string>
- <string name="silent_alarm_summary" msgid="8605302849408279221">"Thulile"</string>
+ <string name="silent_ringtone_title" msgid="6177287302898634765">"Thulile"</string>
+ <string name="unknown_ringtone_title" msgid="6637522029614550112">"Akwaziwa"</string>
<string name="alarm_notify_text" msgid="4891014685945904766">"Misa okwesikhashana noma cima i-alamu."</string>
<string name="alarm_notify_snooze_label" msgid="5404083762646377829">"<xliff:g id="LABEL">%s</xliff:g> (snuziwe)"</string>
<string name="alarm_notify_snooze_text" msgid="4819324081410990368">"I-alamu isethelwe <xliff:g id="TIME">%s</xliff:g>. Thinta ukukhansela."</string>
@@ -151,8 +159,6 @@
<string name="loading_ringtone" msgid="6523322777415268044">"Ilayisha iringithoni..."</string>
<string name="timer_ring_service_desc" msgid="2620214305660322415">"Isevisi yokudlala umsindo yezikhathi ezisethwe kwiwashi."</string>
<string name="control_set_alarm" msgid="2194676418924016327">"Setha i-alamu"</string>
- <!-- no translation found for control_set_alarm_with_existing (3359285346655630660) -->
- <skip />
<string name="menu_alarm" msgid="4772010125376647519">"I-Alamu"</string>
<string name="menu_timer" msgid="6459070074762877114">"Isikali sesikhathi"</string>
<string name="menu_clock" msgid="5612760670606829805">"Iwashi"</string>
@@ -167,10 +173,10 @@
<string name="menu_item_sort_by_name" msgid="1762931290495104106">"Hlunga ngegama"</string>
<string name="selected_cities_label" msgid="3607479399424246605">"Amadolobha akhethiwe"</string>
<string name="sw_resume_button" msgid="2569360966002022248">"Qala futhi"</string>
- <string name="sw_start_button" msgid="8373422516681242270">"Qala"</string>
- <string name="sw_stop_button" msgid="8322958613123274451">"Misa"</string>
- <string name="sw_lap_button" msgid="6992264696039004233">"Ilephu"</string>
<string name="sw_reset_button" msgid="6616804728322906117">"Setha kabusha"</string>
+ <string name="sw_start_button" msgid="8373422516681242270">"Qala"</string>
+ <string name="sw_pause_button" msgid="2422084453454138042">"Misa okwesikhashana"</string>
+ <string name="sw_lap_button" msgid="6992264696039004233">"Ilephu"</string>
<string name="sw_share_button" msgid="4478648110382859382">"Yabelana"</string>
<string name="hours_label" msgid="3393478155635368097">"h"</string>
<string name="minutes_label" msgid="3568098128251438588">"m"</string>
@@ -182,10 +188,6 @@
<string name="sw_share_main" msgid="7703563468204234405">"Isikhathi sami ngu-<xliff:g id="TIME">%s</xliff:g>"</string>
<string name="sw_share_laps" msgid="614390674795945007">"Ukuhluka kwezikhathi:"</string>
<string name="sw_notification_lap_number" msgid="3535420316052647126">"Xhapha <xliff:g id="NUMBER">%d</xliff:g>"</string>
- <string-array name="sw_lap_number_set">
- <item msgid="2816627565030953899">"# <xliff:g id="NUMBER">%d</xliff:g>"</item>
- <item msgid="316923361931627987">"# <xliff:g id="NUMBER">%02d</xliff:g>"</item>
- </string-array>
<plurals name="Nhours_description" formatted="false" msgid="4539186407746763655">
<item quantity="one"><xliff:g id="NUMBER">%d</xliff:g> amahora</item>
<item quantity="other"><xliff:g id="NUMBER">%d</xliff:g> amahora</item>
@@ -205,12 +207,16 @@
<string name="timer_plus_one" msgid="6631211310420106116">"Engeza 1 imininithi"</string>
<string name="timer_plus_1_min" msgid="8645224089494875062">"Engeza iminithi elingu-1"</string>
<string name="timer_stop" msgid="3361154678667736722">"Misa"</string>
- <string name="timer_done" msgid="2375990511982914051">"Kwenziwe"</string>
+ <string name="timer_stop_all" msgid="9080780442843034376">"Misa zonke izibali-sikhathi"</string>
<string name="timer_reset" msgid="7848424809190171640">"Setha kabusha"</string>
<string name="timer_cancel" msgid="3572868404230815644">"Khansela"</string>
+ <string name="timer_canceled" msgid="7327923392567128060">"Isikhathi sikhanseliwe"</string>
<string name="timer_times_up" msgid="9190440395938519009">"Isikhathi siphelile"</string>
+ <string name="timer_multi_times_up" msgid="1239104626836080409">"<xliff:g id="NUM_TIMERS">%d</xliff:g> izibali-skhathi ziphelelwe isikhathi"</string>
<string name="timer_notification_label" msgid="4933184831583137249">"Isikali sesikhathi"</string>
<string name="timers_max_count_reached" msgid="9140022846793903813">"4 ubukhulu bezibali sikhathi"</string>
+ <string name="timer_pause" msgid="3748323712728398743">"Misa isikhashana"</string>
+ <string name="timer_reset_all" msgid="7530633132757866087">"Setha kabusha zonke izibali sikhathi"</string>
<string-array name="sw_share_strings">
<item msgid="842841032273927988">"Ulidimoni elisheshayo."</item>
<item msgid="6332879039890727169">"Thokozela izithelo zomsebenzi wakho."</item>
@@ -227,6 +233,7 @@
<string name="cities_activity_title" msgid="8552462751129256730">"Amadolobha"</string>
<string name="clock_settings" msgid="8317286807280600391">"Iwashi"</string>
<string name="clock_style" msgid="2265011060429742344">"Isitayela"</string>
+ <string name="open_date_settings" msgid="5915966847691221307">"Guqula idethi nesikhathi"</string>
<string-array name="clock_style_entries">
<item msgid="917900462224167608">"I-Analog"</item>
<item msgid="8483930821046925592">"Idijithali"</item>
@@ -241,6 +248,8 @@
<string name="time_picker_ampm_label" msgid="6754113715199751083">"--"</string>
<string name="time_picker_00_label" msgid="6001006474735281911">":00"</string>
<string name="time_picker_30_label" msgid="1027250857384838129">":30"</string>
+ <string name="city_checked" msgid="616847871968019">"<xliff:g id="CITY_NAME">%s</xliff:g> kungeniwe"</string>
+ <string name="city_unchecked" msgid="710212932781145918">"<xliff:g id="CITY_NAME">%s</xliff:g> phumile"</string>
<string-array name="timezone_labels">
<item msgid="5495601234086197399">"esase-Marshall Islands"</item>
<item msgid="4196408495909011020">"esase-Midway Island"</item>
@@ -329,13 +338,17 @@
<item msgid="5176858645450908751">"I-Jakarta"</item>
</string-array>
<string name="alarm_settings" msgid="2947147071388290814">"Ama-alamu"</string>
- <string name="stopwatch_service_desc" msgid="8416624630388063996">"Isevisi yewashi lokumisa izoqalisa isaziso."</string>
- <string name="swn_stopped" msgid="783124901663086172">"Imisiwe"</string>
+ <string name="timer_service_desc" msgid="2256002649882602433">"Icubungula izenzo kusuka kuzaziso zesibalisikhathi."</string>
+ <string name="stopwatch_service_desc" msgid="9220132827343760767">"Icubungula izenzo kusuka kuzaziso zewashi lokubala."</string>
+ <string name="swn_paused" msgid="6364358842808263589">"Kumiswe okwesikhashana"</string>
<string name="description_direction_right" msgid="5709209043267548985">"Swayipha ngakwesokudla ukuze ucashise"</string>
<string name="description_direction_left" msgid="7448141043674998679">"Swayipha ngakwesokunxele ukuze usnuze"</string>
<string name="description_direction_both" msgid="1841309486023845685">"Swayiphela ngakwesokunxele ukuze usnuze noma ngakwesokudla ukuze ucashise"</string>
+ <string name="timer_settings" msgid="7955522143086154795">"Izibali sikhathi"</string>
+ <string name="timer_ringtone_title" msgid="7630214935791599619">"Ithoni yokukhala yesibali-sikhathi"</string>
<string name="timer_stopped" msgid="2730331837832462008">"Isikhathi simisiwe"</string>
- <string name="timers_stopped" msgid="2393640808691864520">"<xliff:g id="NUMBER">%d</xliff:g> izikhathi ezimisiwe"</string>
+ <string name="timer_paused" msgid="5941160896040771462">"Isibali sikhathi simiswe isikhashana"</string>
+ <string name="timers_stopped" msgid="3186191253226005149">"<xliff:g id="NUMBER">%d</xliff:g> izibali sikhathi ezimiswe isikhashana"</string>
<string name="all_timers_stopped_notif" msgid="278532320068394600">"Thinta ukuze ubone izikhathi zakho"</string>
<string name="timers_in_use" msgid="5570729467344408506">"<xliff:g id="NUMBER">%d</xliff:g> izikhathi"</string>
<string name="next_timer_notif" msgid="6136454740115613653">"Isikhathi esilandelayo: <xliff:g id="TIME_REMAINING">%s</xliff:g>"</string>
@@ -361,35 +374,27 @@
<string name="no_alarms" msgid="6429431324842022917">"Awekho ama-alamu"</string>
<string name="no_alarms_set" msgid="4887558279496044764">"Awekho ama-alamu asethiwe"</string>
<string name="no_upcoming_alarms" msgid="2889840988069436254">"AWEKHO AMA-ALAMU EZAYO"</string>
- <string name="time_format_12_mode" msgid="1619464909892545536">"h:mm a"</string>
- <string name="time_format_24_mode" msgid="7998512313148074539">"k:mm"</string>
- <string name="weekday_time_format_12_mode" msgid="8648842975829470646">"EEE, h:mm a"</string>
- <string name="weekday_time_format_24_mode" msgid="152964494051478631">"EEE, k:mm"</string>
<string name="invalid_time" msgid="2782334750243998633">"Isikhathi esingavumelekile <xliff:g id="INVALID_HOUR">%d</xliff:g>:<xliff:g id="INVALID_MINUTES">%d</xliff:g> <xliff:g id="INVALID_AMPM">%s</xliff:g>"</string>
<string name="no_alarm_at" msgid="8140632482969193119">"Ayikho i-alamu ngo-<xliff:g id="ALARM_TIME_HOUR">%d</xliff:g>:<xliff:g id="ALARM_TIME_MINUTES">%d</xliff:g>"</string>
<string name="no_scheduled_alarms" msgid="2115420148192753534">"Awekho ama-alamu ashejuliwe"</string>
<string name="no_label_specified" msgid="2008482054428460626">"Ayikho ilebula ecacisiwe"</string>
<string name="no_alarms_with_label" msgid="6250998794542941665">"Awekho ama-alamu aqukethe ilebula"</string>
- <string name="stopwatch_already_running" msgid="6598258908106423672">"Isitopuwashi sesivele siqalisiwe"</string>
<string name="stopwatch_isnt_running" msgid="7147219965448204727">"Isitopuwashi asiqaliswanga"</string>
- <string name="stopwatch_cant_be_reset_because_is_running" msgid="5713134605500796186">"Isitophuwashi asikwazi ukusethwa kabusha ngoba siyagijima"</string>
- <string name="stopwatch_stopped" msgid="6927081018816192999">"Isitophuwashi simisiwe"</string>
+ <string name="stopwatch_paused" msgid="2187615623275408601">"Iwashi elimiswayo limiswe isikhashana"</string>
<string name="stopwatch_reset" msgid="7585914953721021042">"Ukusetha kabusha isitophuwashi"</string>
<string name="stopwatch_lapped" msgid="5844686448815550482">"Isitophuwashi seqiswe ilephu"</string>
<string name="stopwatch_started" msgid="7843882246387176304">"Isitophuwashi siqalisiwe"</string>
<string name="no_alarm_scheduled_for_this_time" msgid="4463069177414482818">"Ayikho i-alamu eshejulelwe lesi sikhathi"</string>
<string name="alarm_is_dismissed" msgid="5509897230565826642">"<xliff:g id="ALARM_TIME">%s</xliff:g> i-alamu icashisiwe"</string>
<string name="alarm_is_set" msgid="5503226382620011088">"I-alamu isethelwe u-<xliff:g id="ALARM_TIME">%s</xliff:g>"</string>
- <string name="no_timer_set" msgid="3326365650863016606">"Asikho isibali sikhathi esisethiwe"</string>
- <string name="timer_deleted" msgid="9110322362460029392">"Isibali sikhathi sisusiwe"</string>
- <string name="timer_already_running" msgid="1259351124772803097">"Isibali sikhathi sesivele siqalisiwe"</string>
- <string name="multiple_timers_available" msgid="6722110840279707462">"Ayikwazi ukuqedela isicelo sakho, izikhathi eziningi ziyatholakala"</string>
- <string name="timer_started" msgid="6715582052946641641">"Isibali sikhathi siqalisiwe"</string>
+ <string name="no_timers_exist" msgid="7062019300048831373">"Azikho izibalizikhathi ezikhona"</string>
+ <string name="too_many_timers_exist" msgid="6339194231767431627">"Izibalizikhathi ezingaphezu kwesisodwa"</string>
+ <string name="timer_does_not_exist" msgid="4457482976523984231">"Isibalisikhathi sisusiwe."</string>
<string name="timer_created" msgid="4381027137335885547">"Isibali sikhathi sidaliwe"</string>
- <string name="invalid_timer_length" msgid="3104567893212932487">"Ubude besibali sikhathi obungavumelekile"</string>
<string name="timer_was_reset" msgid="6495796785185062631">"Isibali sikhathi sisethwe kabusha"</string>
- <string name="timer_cant_be_reset_because_its_running" msgid="7880015473706806640">"Isibali sikhathi asikwazi ukusethwa kabusha ngoba sisaqalisiwe. Misa isibali sikhathi ukuze usethe kabusha."</string>
- <string name="timer_already_stopped" msgid="8865820275829449054">"Isibali sikhathi sesivele simisiwe"</string>
+ <string name="timer_deleted" msgid="9110322362460029392">"Isibali sikhathi sisusiwe"</string>
+ <string name="timer_started" msgid="6715582052946641641">"Isibali sikhathi siqalisiwe"</string>
+ <string name="invalid_timer_length" msgid="3104567893212932487">"Ubude besibali sikhathi obungavumelekile"</string>
<string name="no_city_selected" msgid="1007596865203283741">"Alikho idolobha elikhethiwe"</string>
<string name="the_city_you_specified_is_not_available" msgid="1753597460426454543">"Idolobha olicacisile alitholakali"</string>
<string name="the_city_already_added" msgid="3799050213771793020">"Lelo dolobha selivele lingeziwe"</string>
diff --git a/res/values/animation_constants.xml b/res/values/animation_constants.xml
index 6931191..65123fe 100644
--- a/res/values/animation_constants.xml
+++ b/res/values/animation_constants.xml
@@ -15,21 +15,6 @@
~ limitations under the License
-->
<resources>
- <!--
- <integer name="activity_slide_left_duration">475</integer>
- <integer name="activity_slide_right_duration">525</integer>
- <integer name="activity_collapse_duration">125</integer>
- <integer name="expand_cc_bcc_dur">150</integer>
- <integer name="fadein_cc_bcc_dur">150</integer>
-
- <integer name="dialog_animationDefaultDur">220</integer>
- <integer name="dialog_animationShortDur">150</integer>
- <integer name="shrink_animation_duration">350</integer>
- <integer name="slide_animation_duration">320</integer>
- <integer name="fade_in_animation_duration">350</integer>
- -->
- <integer name="fade_duration">250</integer>
-
<!-- Swipe constants -->
<integer name="swipe_escape_velocity">100</integer>
<integer name="escape_animation_duration">200</integer>
diff --git a/res/values/array.xml b/res/values/array.xml
index 0cd358e..2898e15 100644
--- a/res/values/array.xml
+++ b/res/values/array.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2012 The Android Open Source Project
+ Copyright (C) 2015 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.
@@ -21,11 +21,16 @@
The section header is the "index" of all the cities in the section. By default, the section
header is the first character of the city name.
- However, in some languages, cities are listed under an incorrect index.
+ Format of providing a city name:
+ <item>[index]<xliff:g id="separator">=</xliff:g>[city name]<xliff:g id="phonetic">:</xliff:g>[phonetic name]</item>
+
+ Index and phonetic name are optional.
+
+ In some languages, cities are listed under an incorrect index or sorted incorrectly within an
+ index.
Should a city be listed under an incorrect index, the correct index can be manually specified
- by adding an index to the translation string before the "=" placeholder:
- <item>[index]<xliff:g id="separator">=</xliff:g>[city name]</item>
+ by adding an index to the translation string before the "=" placeholder.
Ex. <item>A<xliff:g id="separator">=</xliff:g>Abidjan</item>
Now Abidjan will be classified under the "A" index.
@@ -33,9 +38,12 @@
Note that the separator "=" should NOT be localized. The index can be multi-character; it will
consist of all specified characters before the "=" separator.
- This will NOT change the sort order of the cities list. It will solve issues where a city is
- mistakenly listed under its own index instead of being included in a section immediately
- before or after its listing.
+ If a city is sorted incorrectly, provide a phonetic name for the city by adding
+ <xliff:g id="phonetic">:</xliff:g>[PHONETIC_NAME]. The city now will be sorted based on phonetic
+ name. The phonetic should use the alphabet that makes the most sense for the locale. For
+ example, Japanese city can use Katakana to provide phonetic name.
+
+ Providing index and/or phonetic name will change the sort order of the cities list.
-->
<string-array name="cities_names">
@@ -90,7 +98,7 @@
<item>F<xliff:g id="separator">=</xliff:g>Fortaleza</item>
<item>G<xliff:g id="separator">=</xliff:g>Grand Turk</item>
<item>G<xliff:g id="separator">=</xliff:g>Grenada</item>
- <item>G<xliff:g id="separator">=</xliff:g>Guatemala</item>
+ <item>G<xliff:g id="separator">=</xliff:g>Guatemala City</item>
<item>G<xliff:g id="separator">=</xliff:g>Guyana</item>
<item>H<xliff:g id="separator">=</xliff:g>Halifax</item>
<item>H<xliff:g id="separator">=</xliff:g>Havana</item>
@@ -135,7 +143,7 @@
<item>T<xliff:g id="separator">=</xliff:g>Toronto</item>
<item>V<xliff:g id="separator">=</xliff:g>Vancouver</item>
<item>W<xliff:g id="separator">=</xliff:g>Winnipeg</item>
- <item>S<xliff:g id="separator">=</xliff:g>South Pole</item>
+ <item>S<xliff:g id="separator">=</xliff:g>South Pole<xliff:g id="phonetic">:</xliff:g></item>
<item>L<xliff:g id="separator">=</xliff:g>Longyearbyen</item>
<item>A<xliff:g id="separator">=</xliff:g>Almaty</item>
<item>A<xliff:g id="separator">=</xliff:g>Amman</item>
@@ -153,7 +161,7 @@
<item>G<xliff:g id="separator">=</xliff:g>Gaza</item>
<item>H<xliff:g id="separator">=</xliff:g>Hebron</item>
<item>H<xliff:g id="separator">=</xliff:g>Ho Chi Minh</item>
- <item>H<xliff:g id="separator">=</xliff:g>Hong Kong</item>
+ <item>H<xliff:g id="separator">=</xliff:g>Hong Kong<xliff:g id="phonetic">:</xliff:g></item>
<item>I<xliff:g id="separator">=</xliff:g>Istanbul</item>
<item>J<xliff:g id="separator">=</xliff:g>Jakarta</item>
<item>J<xliff:g id="separator">=</xliff:g>Jerusalem</item>
@@ -166,18 +174,18 @@
<item>M<xliff:g id="separator">=</xliff:g>Manila</item>
<item>M<xliff:g id="separator">=</xliff:g>Muscat</item>
<item>P<xliff:g id="separator">=</xliff:g>Phnom Penh</item>
- <item>P<xliff:g id="separator">=</xliff:g>Pyongyang</item>
+ <item>P<xliff:g id="separator">=</xliff:g>Pyongyang<xliff:g id="phonetic">:</xliff:g></item>
<item>Q<xliff:g id="separator">=</xliff:g>Qatar</item>
<item>R<xliff:g id="separator">=</xliff:g>Rangoon</item>
<item>R<xliff:g id="separator">=</xliff:g>Riyadh</item>
<item>S<xliff:g id="separator">=</xliff:g>Saigon</item>
<item>S<xliff:g id="separator">=</xliff:g>Seoul</item>
- <item>S<xliff:g id="separator">=</xliff:g>Shanghai</item>
+ <item>S<xliff:g id="separator">=</xliff:g>Shanghai<xliff:g id="phonetic">:</xliff:g></item>
<item>S<xliff:g id="separator">=</xliff:g>Singapore</item>
- <item>T<xliff:g id="separator">=</xliff:g>Taipei</item>
+ <item>T<xliff:g id="separator">=</xliff:g>Taipei<xliff:g id="phonetic">:</xliff:g></item>
<item>T<xliff:g id="separator">=</xliff:g>Tehran</item>
<item>T<xliff:g id="separator">=</xliff:g>Tel Aviv</item>
- <item>T<xliff:g id="separator">=</xliff:g>Tokyo</item>
+ <item>T<xliff:g id="separator">=</xliff:g>Tokyo<xliff:g id="phonetic">:</xliff:g></item>
<item>U<xliff:g id="separator">=</xliff:g>Ulaanbaatar</item>
<item>B<xliff:g id="separator">=</xliff:g>Bermuda</item>
<item>C<xliff:g id="separator">=</xliff:g>Canary</item>
@@ -294,10 +302,10 @@
<item>R<xliff:g id="separator">=</xliff:g>Reno</item>
<item>B<xliff:g id="separator">=</xliff:g>Black Rock City</item>
<item>D<xliff:g id="separator">=</xliff:g>Doha</item>
- <item>B<xliff:g id="separator">=</xliff:g>Beijing</item>
+ <item>B<xliff:g id="separator">=</xliff:g>Beijing<xliff:g id="phonetic">:</xliff:g></item>
<item>M<xliff:g id="separator">=</xliff:g>Mumbai</item>
<item>D<xliff:g id="separator">=</xliff:g>Delhi</item>
- <item>O<xliff:g id="separator">=</xliff:g>Osaka</item>
+ <item>O<xliff:g id="separator">=</xliff:g>Osaka<xliff:g id="phonetic">:</xliff:g></item>
<item>L<xliff:g id="separator">=</xliff:g>Lahore</item>
<item>S<xliff:g id="separator">=</xliff:g>Sana\'a</item>
<item>B<xliff:g id="separator">=</xliff:g>Barcelona</item>
@@ -316,7 +324,7 @@
<item>C<xliff:g id="separator">=</xliff:g>Cambridge</item>
<item>K<xliff:g id="separator">=</xliff:g>Kirkland</item>
<item>M<xliff:g id="separator">=</xliff:g>Madison</item>
- <item>G<xliff:g id="separator">=</xliff:g>Guangzhou</item>
+ <item>G<xliff:g id="separator">=</xliff:g>Guangzhou<xliff:g id="phonetic">:</xliff:g></item>
<item>H<xliff:g id="separator">=</xliff:g>Hyderabad</item>
<item>R<xliff:g id="separator">=</xliff:g>Reston</item>
<item>B<xliff:g id="separator">=</xliff:g>Belo Horizonte</item>
@@ -696,7 +704,7 @@
<item>C49</item>
<item>C50</item>
<item>C51</item>
- <item>C0</item>
+ <item>C52</item>
<item>C53</item>
<item>C54</item>
<item>C55</item>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 355a218..c1b5eac 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -56,4 +56,6 @@
<color name="notification_pressed">#333333</color>
<color name="notification_divider">#272727</color>
+ <!-- shadowColor for digital widget text -->
+ <color name="digital_widget_shadow_color">#DD000000</color>
</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 9884671..855923d 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -1,25 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-** Copyright 2011, 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.
-*/
+<!-- Copyright (C) 2011 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.
-->
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. -->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+<resources>
<bool name="config_requiresScreenSaver">true</bool>
<bool name="config_dockAppEnabled">true</bool>
<bool name="config_rotateAlarmAlert">false</bool>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 1d919b3..4184cbc 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -21,12 +21,13 @@
for different hardware and product builds. -->
<resources>
<dimen name="label_text_size">14sp</dimen>
+ <dimen name="label_edittext_padding">21dp</dimen>
<dimen name="time_text_size">120dip</dimen>
<dimen name="ampm_text_size">20dip</dimen>
<dimen name="date_text_size">15sp</dimen>
<dimen name="next_alarm_text_size">15sp</dimen>
<dimen name="time_margin_top">32dip</dimen>
- <dimen name="timer_padding_left">16dip</dimen>
+ <dimen name="timer_padding">16dp</dimen>
<dimen name="timer_list_padding_bottom">88dip</dimen>
<!-- 88dip + 0.5 of footer_button_size -->
<dimen name="timer_cancel_end_margin">116dip</dimen>
@@ -52,12 +53,10 @@
<dimen name="actionbar_title_font_size">18sp</dimen>
<dimen name="footer_button_size">56dip</dimen>
- <dimen name="footer_button_layout_margin">16dip</dimen>
<dimen name="alarm_text_padding">15dp</dimen>
<dimen name="alarm_text_font_size">16sp</dimen>
<dimen name="alarm_min_distance">2dp</dimen>
- <dimen name="alarm_undo_bar_horizontal_margin">8dp</dimen>
<dimen name="circletimer_dot_size">12dip</dimen>
<dimen name="circletimer_circle_size">4dip</dimen>
<dimen name="circletimer_marker_size">16dip</dimen>
@@ -67,13 +66,15 @@
<dimen name="alarm_lockscreen_pulse_radius">128dp</dimen>
<dimen name="alarm_lockscreen_bottom_margin">40dp</dimen>
+ <dimen name="main_clock_font_size">70sp</dimen>
<dimen name="big_font_size">60sp</dimen>
<dimen name="medium_font_size">56sp</dimen>
<dimen name="small_font_size">32sp</dimen>
<dimen name="label_font_size">16sp</dimen>
<!-- Use dp on purpose to ensure consistency across multiple screen sizes. -->
<dimen name="widget_label_font_size">14dp</dimen>
- <dimen name="main_ampm_font_size">32sp</dimen>
+ <item name="ampm_font_size_scale" type="fraction">50%</item>
+ <item name="reduced_clock_font_size_scale" type="fraction">65%</item>
<dimen name="header_font_size">24sp</dimen>
<dimen name="body_font_size">18sp</dimen>
<dimen name="day_button_font_size">18sp</dimen>
@@ -106,7 +107,7 @@
<dimen name="dialpad_font_size">36sp</dimen>
<!--padding should be (in dip) ~ 60% dialpad_font_size -->
<dimen name="dialpad_digit_padding">22dip</dimen>
- <dimen name="timer_setup_font_size">56sp</dimen>
+ <dimen name="timer_setup_font_size">38sp</dimen>
<dimen name="timer_setup_button_size">24sp</dimen>
<!--margin should be ~ half timer_setup_font_size -->
<dimen name="timer_setup_delete_start_margin">28sp</dimen>
@@ -119,11 +120,13 @@
<dimen name="circle_margin_top">16dp</dimen>
<dimen name="circle_margin">32dp</dimen>
<dimen name="analog_clock_margin">60dp</dimen>
- <dimen name="timer_circle_margin">32dp</dimen>
<dimen name="circle_size">280dp</dimen>
- <!-- stopwatch_list_bottom_spacing = footer_button_size + footer_button_layout_margin -->
- <dimen name="stopwatch_list_bottom_spacing">72dip</dimen>
+ <!--
+ list_bottom_spacing = footer_button_size + footer_button_layout_margin.
+ Used by both StopwatchFragment and AlarmFragment.
+ -->
+ <dimen name="list_bottom_spacing">72dip</dimen>
<dimen name="sw_padding_end">32dp</dimen>
@@ -133,6 +136,8 @@
<dimen name="notification_text_size">14dp</dimen>
<!-- Size of notification text titles (see TextAppearance.StatusBar.EventContent.Title) -->
<dimen name="notification_title_text_size">18dp</dimen>
+ <!-- Size of margin between icon and text / title text. -->
+ <dimen name="notification_content_margin_start">8dp</dimen>
<!-- Width of the clock, for use with alarm buttons. -->
<dimen name="alarm_alert_display_width">304dip</dimen>
@@ -143,14 +148,10 @@
<dimen name="world_clock_analog_size">100dip</dimen>
<dimen name="world_clock_margin">32dp</dimen>
- <dimen name="toast_bar_bottom_margin_in_conversation">24dip</dimen>
-
<!-- Height of the button footers. 56 height and 16 on top and bottom. -->
<dimen name="button_footer_height">88dip</dimen>
<!-- Negative value of the height of the button footers, for use with lightsout. -->
<dimen name="button_footer_height_neg">-48dip</dimen>
- <!-- Height of space between timers. -->
- <dimen name="timer_divider_height">24dip</dimen>
<!-- Digital Widget settings (keyguard|home_screen) -->
<!-- Clock and world clock sizes -->
@@ -163,9 +164,13 @@
<dimen name="widget_big_time_margin_right">10dip</dimen>
<dimen name="widget_medium_time_margin_right">5dip</dimen>
+ <dimen name="min_analog_widget_size">110dp</dimen>
+
<!-- width/height of layout/digital_widget_time -->
<dimen name="min_digital_widget_width">206dip</dimen>
+ <dimen name="min_digital_widget_resize_width">136dip</dimen>
<dimen name="min_digital_widget_height">129dip</dimen>
+ <dimen name="min_digital_widget_resize_height">59dip</dimen>
<!-- sum of scaled heights -->
<dimen name="digital_widget_list_min_scaled_height">162dp</dimen>
@@ -175,12 +180,19 @@
<dimen name="digital_widget_list_margin_top">20dp</dimen>
<dimen name="digital_widget_city_margin_bottom">10dp</dimen>
+ <!-- shadow styles for digital widget text -->
+ <item name="digital_widget_shadow_radius" format="float" type="dimen">2.75</item>
+ <item name="digital_widget_shadow_dy" format="float" type="dimen">2.0</item>
+
<!-- Bottom margin for the expand area -->
<dimen name="collapse_expand_height">72dip</dimen>
<!-- Divider height -->
<dimen name="hairline_height">1dip</dimen>
+ <!-- Divider side padding -->
+ <dimen name="hairline_side_padding">6dp</dimen>
+
<!-- The minimum height/width of any touch target -->
<dimen name="touch_target_min_size">48dip</dimen>
@@ -190,4 +202,19 @@
<dimen name="fastscroll_preview_padding">8dp</dimen>
<dimen name="fastscroll_track_width">8dp</dimen>
+ <!-- Dimens for drawable padding on Alarms tab -->
+ <dimen name="alarm_horizontal_padding">16dp</dimen>
+
+ <!-- Dimens for icon padding on Alarms tab -->
+ <dimen name="icon_margin">4dp</dimen>
+
+ <!-- Dimens for taller rows on Alarms tab -->
+ <dimen name="tall_row_height">58dp</dimen>
+
+ <!-- Floating action button style -->
+ <dimen name="fab_margin">0dp</dimen>
+ <dimen name="fab_elevation">8dp</dimen>
+
+ <!-- Height of the bar containing the floating action button -->
+ <dimen name="fab_height">88dp</dimen>
</resources>
diff --git a/res/values/donottranslate.xml b/res/values/donottranslate.xml
index eec8127..ce3808d 100644
--- a/res/values/donottranslate.xml
+++ b/res/values/donottranslate.xml
@@ -14,11 +14,15 @@
limitations under the License.
-->
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+<resources>
<!-- String matching the lock screen format for displaying the date. -->
<string name="abbrev_wday_month_day_no_year">EEEMMMMd</string>
+ <!-- Abbreviated format for describing the date. -->
+ <string name="abbrev_wday_abbrev_month_day_no_year">EEEMMMd</string>
<!-- Format for describing the date, for accessibility. -->
<string name="full_wday_month_day_no_year">EEEEMMMMd</string>
<!-- Default clock style. -->
<string name="default_clock_style">digital</string>
+ <!-- Behavior that coordinates LinearLayout and snackbar inside a CoordinatorLayout-->
+ <string name="linear_layout_with_snackbar_behavior">com.android.deskclock.widget.toast.LinearLayoutWithSnackbarBehavior</string>
</resources>
diff --git a/res/values/donottranslate_events.xml b/res/values/donottranslate_events.xml
index 40ba2d4..3caaa00 100644
--- a/res/values/donottranslate_events.xml
+++ b/res/values/donottranslate_events.xml
@@ -22,20 +22,27 @@
<!-- Action names for events describe what type of manipulation was performed. -->
<string name="action_dismiss">Dismiss</string>
+ <string name="action_hide">Hide</string>
<string name="action_snooze">Snooze</string>
<string name="action_create">Create</string>
+ <string name="action_add">Add</string>
<string name="action_delete">Delete</string>
<string name="action_update">Update</string>
<string name="action_start">Start</string>
<string name="action_stop">Stop</string>
+ <string name="action_pause">Pause</string>
<string name="action_fire">Fire</string>
<string name="action_reset">Reset</string>
<string name="action_show">Show</string>
<string name="action_add_minute">Add Minute</string>
+ <string name="action_resume">Resume</string>
<string name="action_lap">Lap</string>
<!-- Label names for events describe the entity responsible for the event. -->
<string name="label_deskclock">DeskClock</string>
<string name="label_notification">Notification</string>
<string name="label_intent">Intent</string>
+ <string name="label_widget">Widget</string>
+ <string name="label_hardware_button">HardwareButton</string>
+ <string name="label_reboot">Reboot</string>
</resources>
diff --git a/res/values/drawables.xml b/res/values/drawables.xml
new file mode 100644
index 0000000..7dc82c3
--- /dev/null
+++ b/res/values/drawables.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <item name="ic_alarm_small" type="drawable">@drawable/ic_alarm_small_18dp</item>
+</resources>
\ No newline at end of file
diff --git a/res/values/ids.xml b/res/values/ids.xml
index fe91eeb..f31a5e4 100644
--- a/res/values/ids.xml
+++ b/res/values/ids.xml
@@ -15,5 +15,7 @@
-->
<resources>
- <item type="id" name="numbers_key" />
+ <item name="numbers_key" type="id" />
+ <item name="request_code_ringtone" type="id" />
+ <item name="request_permission_code_external_storage" type="id" />
</resources>
diff --git a/res/layout/stopwatch_spacer.xml b/res/values/integers.xml
similarity index 71%
copy from res/layout/stopwatch_spacer.xml
copy to res/values/integers.xml
index 31b648b..76565ba 100644
--- a/res/layout/stopwatch_spacer.xml
+++ b/res/values/integers.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2014 The Android Open Source Project
+<!-- Copyright (C) 2015 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.
@@ -14,7 +14,6 @@
limitations under the License.
-->
-<Space
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="@dimen/stopwatch_list_bottom_spacing" />
+<resources>
+ <integer name="chevron_rotate_180">180</integer>
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4f2814d..5f18d1d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -54,6 +54,12 @@
<!-- Setting label on Set alarm screen: Label -->
<string name="label">Label</string>
+ <!-- Content description for alarm on/off switch in On state -->
+ <string name="on_switch">On</string>
+
+ <!-- Content description for alarm on/off switch in Off state -->
+ <string name="off_switch">Off</string>
+
<!-- Default label to display for an alarm -->
<string name="default_label">Alarm</string>
@@ -70,8 +76,11 @@
<!-- Setting labels on Set alarm screen: Select alarm ringtone -->
<string name="alert">Alarm Ringtone</string>
- <!-- Label on expanded alarm edit view indicating the ringtone is custom. -->
- <string name="custom_ringtone">Custom Ringtone</string>
+ <!-- Title of default ringtone played when a timer expires. -->
+ <string name="default_timer_ringtone_title">Timer Expired</string>
+
+ <!-- Title of silent ringtone played when a timer expires. -->
+ <string name="silent_timer_ringtone_title">Silent</string>
<!-- Label on expanded alarm edit view. -->
<string name="ringtone">Ringtone</string>
@@ -159,15 +168,23 @@
--><skip />
<!-- Timer notification: how long from now until timer goes off. -->
- <string-array name="timer_notifications">
- <item>Less than a minute remaining</item>
- <item><xliff:g id="HOURS" example="2 hours">%1$s</xliff:g> remaining</item>
- <item><xliff:g id="MINUTES" example="2 minutes">%2$s</xliff:g> remaining</item>
- <item><xliff:g id="HOURS" example="2 hours">%1$s</xliff:g> <xliff:g id="MINUTES" example="2 minutes">%2$s</xliff:g> remaining</item>
- </string-array>
+ <string name="timer_notifications_less_min">Less than a minute remaining</string>
+ <string name="timer_notifications_hours"><xliff:g id="HOURS" example="2 hours">%1$s</xliff:g><xliff:g id="REMAINING" example="remaining"> %3$s</xliff:g></string>
+ <string name="timer_notifications_minutes"><xliff:g id="MINUTES" example="2 minutes">%2$s</xliff:g><xliff:g id="REMAINING" example="remaining"> %3$s</xliff:g></string>
+ <string name="timer_notifications_hours_minutes"><xliff:g id="HOURS" example="2 hours">%1$s</xliff:g> <xliff:g id="MINUTES" example="2 minutes">%2$s</xliff:g> remaining</string>
- <!-- Alarm confirmation toast: Describes how long from now until
- alarm fires -->
+ <!--
+ Verb inflection to use for single time units remaining
+ Ex. "1 minute remaining"
+ -->
+ <string name="timer_remaining_single">remaining</string>
+ <!--
+ Verb inflection to use for multiple time units remaining
+ Ex. "2 minutes remaining"
+ -->
+ <string name="timer_remaining_multiple">remaining</string>
+
+ <!-- Alarm confirmation toast: Describes how long from now until alarm fires -->
<string-array name="alarm_set">
<item>Alarm set for less than 1 minute from now.</item>
<item>Alarm set for <xliff:g id="DAYS" example="2 days">%1$s</xliff:g> from now.</item>
@@ -244,6 +261,18 @@
<item quantity="other">minutes</item>
</plurals>
+ <!-- Setting title for changing the crescendo duration. -->
+ <string name="crescendo_duration_title">Gradually increase volume</string>
+
+ <!-- Summary value for changing the crescendo duration to 0. -->
+ <string name="no_crescendo_duration">Off</string>
+
+ <!-- Summary value for changing the crescendo duration. -->
+ <string name="crescendo_duration"><xliff:g id="number" example="7">%s</xliff:g> seconds</string>
+
+ <!-- Setting label when changing the crescendo duration. -->
+ <string name="crescendo_picker_label">seconds</string>
+
<!-- Auto silence preference title -->
<string name="auto_silence_title">Silence after</string>
@@ -312,8 +341,11 @@
<!-- Setting title for changing the alarm volume. -->
<string name="alarm_volume_title">Alarm volume</string>
- <!-- Summary for the alarm preference when silent is chosen. -->
- <string name="silent_alarm_summary">Silent</string>
+ <!-- Title for the silent ringtone. -->
+ <string name="silent_ringtone_title">Silent</string>
+
+ <!-- Title for ringtones that cannot be located by uri. -->
+ <string name="unknown_ringtone_title">Unknown</string>
<!-- Text to display in the small text of the notification -->
<string name="alarm_notify_text">Snooze or dismiss alarm.</string>
@@ -380,9 +412,6 @@
<!-- Label on the main screen control used to set alarm [CHAR LIMIT=30]-->
<string name="control_set_alarm">Set alarm</string>
- <!-- Label on the main screen control used to set alarm when there is already an existing alarm [CHAR LIMIT=30]-->
- <string name="control_set_alarm_with_existing"><xliff:g id="time">%s</xliff:g></string>
-
<!-- ActionBar strings -->
<!-- Describes the purpose of the tab button which which switches the activity to the Alarm page -->
<string name="menu_alarm">Alarm</string>
@@ -414,17 +443,24 @@
<!-- Label for selected cities in Cities list view -->
<string name="selected_cities_label">Selected Cities</string>
- <!-- Stop Watch strings -->
- <!-- Describes the purpose of the button to resume running a stopwatch -->
+ <!-- Stopwatch and Timer shared strings -->
+ <!-- Describes the purpose of the button to resume running timer. [CHAR LIMIT=15] -->
<string name="sw_resume_button">Resume</string>
+ <!--
+ Describes the purpose of the button
+ for stopwatch: return stopwatch to zero and remove the lap times.
+ for timer: return timer to originally set duration.
+ [CHAR LIMIT=15]
+ -->
+ <string name="sw_reset_button">Reset</string>
+
+ <!-- Stopwatch strings -->
<!-- Describes the purpose of the button to begin running a stopwatch -->
<string name="sw_start_button">Start</string>
<!-- Describes the purpose of the button to pause a stopwatch. -->
- <string name="sw_stop_button">Stop</string>
- <!-- Describes the purpose of the button to record current the stopwatch value into the4 collection of lap times. -->
+ <string name="sw_pause_button">Pause</string>
+ <!-- Describes the purpose of the button to record current the stopwatch value into the collection of lap times. -->
<string name="sw_lap_button">Lap</string>
- <!-- Describes the purpose of the button to return the stopwatch to zero and remove the lap times. -->
- <string name="sw_reset_button">Reset</string>
<!-- Describes the purpose of the button to share the stopwatch value.
Also used as title for chooser when sharing stopwatch results. -->
<string name="sw_share_button">Share</string>
@@ -449,49 +485,6 @@
<string name="sw_share_laps">Lap times:</string>
<!-- Label to enumerate the number of laps in the notification the user has counted -->
<string name="sw_notification_lap_number">Lap <xliff:g id="number">%d</xliff:g></string>
- <!-- Formatted stopwatch time -->
- <string-array name="stopwatch_format_set" translatable="false">
- <item> <!-- <10 minutes - example "1 02.03" -->
- <xliff:g id="M">%2$d</xliff:g> ‎<xliff:g id="S">%3$02d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g><xliff:g id="D">%4$02d</xliff:g>
- </item>
- <item> <!-- <1 hour - example "12 03.04" -->
- <xliff:g id="M">%2$02d</xliff:g> ‎<xliff:g id="S">%3$02d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g><xliff:g id="D">%4$02d</xliff:g>
- </item>
- <item> <!-- <10 hours - example "1 02 03.04" -->
- <xliff:g id="H">%1$d</xliff:g> ‎<xliff:g id="M">%2$02d</xliff:g> ‎<xliff:g id="S">%3$02d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g><xliff:g id="D">%4$02d</xliff:g>
- </item>
- <item> <!-- <100 hours - example "12 03 04.05" -->
- <xliff:g id="H">%1$02d</xliff:g> ‎<xliff:g id="M">%2$02d</xliff:g> ‎<xliff:g id="S">%3$02d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g><xliff:g id="D">%4$02d</xliff:g>
- </item>
- <item> <!-- <1000 hours - example "123 04 05.06" -->
- <xliff:g id="H">%1$03d</xliff:g> ‎<xliff:g id="M">%2$02d</xliff:g> ‎<xliff:g id="S">%3$02d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g><xliff:g id="D">%4$02d</xliff:g>
- </item>
- </string-array>
-
- <!-- Formatted stopwatch time for laps shared using the share button -->
- <string-array name="shared_laps_format_set" translatable="false">
- <item> <!-- <10 minutes - example "1 02.03" -->
- <xliff:g id="lap">%6$d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g> ‎<xliff:g id="M">%2$d</xliff:g> ‎<xliff:g id="S">%3$02d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g><xliff:g id="D">%4$02d</xliff:g>
- </item>
- <item> <!-- <1 hour - example "12 03.04" -->
- <xliff:g id="lap">%6$d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g> ‎<xliff:g id="M">%2$02d</xliff:g> ‎<xliff:g id="S">%3$02d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g><xliff:g id="D">%4$02d</xliff:g>
- </item>
- <item> <!-- <10 hours - example "1 02 03.04" -->
- <xliff:g id="lap">%6$d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g> ‎<xliff:g id="H">%1$d</xliff:g> ‎<xliff:g id="M">%2$02d</xliff:g> ‎<xliff:g id="S">%3$02d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g><xliff:g id="D">%4$02d</xliff:g>
- </item>
- <item> <!-- <100 hours - example "12 03 04.05" -->
- <xliff:g id="lap">%6$d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g> ‎<xliff:g id="H">%1$02d</xliff:g> ‎<xliff:g id="M">%2$02d</xliff:g> ‎<xliff:g id="S">%3$02d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g><xliff:g id="D">%4$02d</xliff:g>
- </item>
- <item> <!-- <1000 hours - example "123 04 05.06" -->
- <xliff:g id="lap">%6$d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g> ‎<xliff:g id="H">%1$03d</xliff:g> ‎<xliff:g id="M">%2$02d</xliff:g> ‎<xliff:g id="S">%3$02d</xliff:g><xliff:g id="decimal_separator">%5$c</xliff:g><xliff:g id="D">%4$02d</xliff:g>
- </item>
- </string-array>
-
- <!-- Label to enumerate the number of laps the user has counted -->
- <string-array name="sw_lap_number_set" translatable="true">
- <item># <xliff:g id="number">%d</xliff:g></item>
- <item># <xliff:g id="number">%02d</xliff:g></item>
- </string-array>
<!-- Stopwatch accessibility strings -->
<plurals name="Nhours_description">
@@ -528,18 +521,29 @@
<string name="timer_plus_1_min">Add 1 min</string>
<!-- Describes the purpose of the button to stop the timer. -->
<string name="timer_stop">Stop</string>
- <!-- Describes the purpose of the button to stop and delete the timer. -->
- <string name="timer_done">Done</string>
+ <!-- Describes the purpose of the button to stop all currently firing timers. [CHAR LIMIT=25] -->
+ <string name="timer_stop_all">Stop all timers</string>
<!-- Describes the purpose of the button to return the timer to it's original starting value. -->
<string name="timer_reset">Reset</string>
<!-- Describes the purpose of the button to discard the current dialog values. Will also close the dialog if other time's exist -->
<string name="timer_cancel">Cancel</string>
+ <!-- Accessibility announcement when a timer is canceled. -->
+ <string name="timer_canceled">Timer canceled</string>
<!-- Notification content shown when a timer has completed and has no more time remaining -->
<string name="timer_times_up">Time\'s up</string>
+ <!--
+ Notification content shown when multiple timers have completed and have no more time
+ remaining. Arg is the number of timers. [CHAR LIMIT=25]
+ -->
+ <string name="timer_multi_times_up"><xliff:g id="NUM_TIMERS" example="2">%d</xliff:g> timers expired</string>
<!-- Label associated with a notification for a Timer -->
<string name="timer_notification_label">Timer</string>
<!-- Toast content shown when user attempts to create a new timer when there are already 4 timers -->
<string name="timers_max_count_reached">4 timers maximum</string>
+ <!-- Describes the purpose of the notification button to pause the timer. [CHAR LIMIT=15] -->
+ <string name="timer_pause">Pause</string>
+ <!-- Describes the purpose of the notification button to reset all running timers. [CHAR LIMIT=31] -->
+ <string name="timer_reset_all">Reset all timers</string>
<!-- Jocular content that user may append when sharing the lap times -->
<string-array name="sw_share_strings" translatable="true">
@@ -566,6 +570,9 @@
<!-- Header for a Clock Dream Setting referring to choosing analog or digital style -->
<string name="clock_style">Style</string>
+ <!-- Title for preference to change date & time -->
+ <string name="open_date_settings">Change Date \u0026 time</string>
+
<!-- Entries listed in the ListPreference when invoking the clock style
preference. -->
<string-array name="clock_style_entries">
@@ -580,7 +587,7 @@
<item>digital</item>
</string-array>
- <!-- Title for an option that will automtically show a clock representing the user's regular timezone on the main fragment whenever the user leaves their regular timezone-->
+ <!-- Title for an option that will automatically show a clock representing the user's regular timezone on the main fragment whenever the user leaves their regular timezone-->
<string name="automatic_home_clock">Automatic home clock</string>
<!-- Describes the functionality provided by the automatic_home_clock option -->
<string name="automatic_home_clock_summary">While traveling in an area where the time is different, add a clock for home</string>
@@ -601,6 +608,17 @@
<!-- add 30 as minutes to the time when pressing this button -->
<string name="time_picker_30_label">:30</string>
+ <!--
+ Accessibility string read when a city checkbox is checked.
+ Ex. "Ann Arbor checked"
+ -->
+ <string name="city_checked"><xliff:g id="city_name">%s</xliff:g> checked</string>
+ <!--
+ Accessibility string read when a city checkbox is unchecked.
+ Ex. "Ann Arbor unchecked"
+ -->
+ <string name="city_unchecked"><xliff:g id="city_name">%s</xliff:g> unchecked</string>
+
<!-- Choices for timezones, must be kept in sync with timezone_values. CHAR LIMIT=25] -->
<string-array name="timezone_labels">
<item>"Marshall Islands"</item>
@@ -780,13 +798,14 @@
<item>"Asia/Jakarta"</item>
</string-array>
- <!-- Header in the preferences settings for the section pertaining to alarms -->
- <string name="alarm_settings">Alarms</string>
- <string name="desk_clock_help_url" translatable="false"></string>
- <!-- Describes the running service for the stopwatch -->
- <string name="stopwatch_service_desc">Stopwatch service to run the notification.</string>
- <!-- Desription for the stopped stop watch -->
- <string name="swn_stopped">Stopped</string>
+ <!-- Header in the preferences settings for the section pertaining to alarms -->
+ <string name="alarm_settings">Alarms</string>
+ <!-- Describes the service that processes actions originating from timer notifications. -->
+ <string name="timer_service_desc">Processes actions from timer notifications.</string>
+ <!-- Describes the service that processes actions originating from stopwatch notifications. -->
+ <string name="stopwatch_service_desc">Processes actions from stopwatch notifications.</string>
+ <!-- Description for the paused stop watch -->
+ <string name="swn_paused">Paused</string>
<!-- Text instruction for dismiss alarm on alarm lock screen. The dismiss button will still
be on the right even on RTL languages so please do not reverse this during
@@ -801,11 +820,19 @@
translation. -->
<string name="description_direction_both">Swipe left to snooze or right to dismiss</string>
- <!-- Notification title when timer is stopped. -->
+ <!-- Header in the preferences settings for the section pertaining to timers. -->
+ <string name="timer_settings">Timers</string>
+ <!-- Description for timer ringtone setting. -->
+ <string name="timer_ringtone_title">Timer ringtone</string>
+
+ <!-- Description when timer is stopped. -->
<string name="timer_stopped">Timer stopped</string>
- <!-- Notification title when multiple timers are stopped. -->
- <string name="timers_stopped"><xliff:g id="number" example="7">%d</xliff:g> timers stopped</string>
- <!-- Notification text when multiple timers are stopped. -->
+
+ <!-- Notification title when timer is paused. [CHAR LIMIT=25] -->
+ <string name="timer_paused">Timer paused</string>
+ <!-- Notification title when multiple timers are paused. [CHAR LIMIT = 30] -->
+ <string name="timers_stopped"><xliff:g id="number" example="7">%d</xliff:g> timers paused</string>
+ <!-- Notification text when multiple timers are paused. -->
<string name="all_timers_stopped_notif">Touch to see your timers</string>
<!-- Notification title when at least one timer, of those in use, is counting down. -->
<string name="timers_in_use"><xliff:g id="number" example="7">%d</xliff:g> timers</string>
@@ -839,7 +866,7 @@
<!-- Displays the number of alarms selected from the list of alarms. -->
<string name="alarms_selected"><xliff:g id="alarms">%d</xliff:g> selected</string>
- <!-- message used by the talkback accessebility app to say that something was deleted -->
+ <!-- message used by the talkback accessibility app to say that something was deleted -->
<string name="deleted_message">Deleted</string>
<!-- Alarm deletion confirmation message-->
@@ -880,42 +907,6 @@
<!-- String for no enabled alarms in timeline view [CHAR LIMIT=30] -->
<string name="no_upcoming_alarms">NO UPCOMING ALARMS</string>
- <!--
- String that represents time format for 12-hour time.
- h represents hour in range (1-12) with the minimum number of digits
- mm represents minute with leading 0 in case of values < 10
- a represents am/pm
- Ex: h:mm a = 12:54 am, 8:05 pm
- -->
- <string name="time_format_12_mode">h:mm a</string>
-
- <!--
- String that represents time format for 24-hour time.
- k represents hour in range (0-23) with the minimum number of digits
- mm represents minute with leading 0 in case of values < 10
- Ex: k:mm = 13:51, 5:05
- -->
- <string name="time_format_24_mode">k:mm</string>
-
- <!--
- String that represents weekday, time format for 12-hour time.
- EEE represents weekday name in short form (ex. Mon, Tue, Wed)
- h represents hour in range (1-12) with the minimum number of digits
- mm represents minute with leading 0 in case of values < 10
- a represents am/pm
- Ex: EEE, h:mm a = Mon, 2:55 pm
- -->
- <string name="weekday_time_format_12_mode">EEE, h:mm a</string>
-
- <!--
- String that represents weekday, time format for 24-hour time.
- EEE represents weekday name in short form (ex. Mon, Tue, Wed)
- k represents hour in range (0-23) with the minimum number of digits
- mm represents minute with leading 0 in case of values < 10
- Ex: EEE, k:mm = Mon, 2:55
- -->
- <string name="weekday_time_format_24_mode">EEE, k:mm</string>
-
<!-- String that represents that invalid time for an alarm was specified, e.g. 23:00am
or 27:68pm.
First %d represents hour, second %d represents minutes, %s represents am/pm,
@@ -951,29 +942,17 @@
-->
<string name="no_alarms_with_label">No alarms contain the label</string>
- <!-- String that represents that the user has sent a voice command 'start a stopwatch' when
- the stopwatch was already running so the command wasn't executed.
- [CHAR LIMIT=NONE]
- -->
- <string name="stopwatch_already_running">Stopwatch is already running</string>
-
<!-- String that represents that the user has sent a voice command 'stop the stopwatch' or
'lap the stopwatch' when the stopwatch wasn't running so the command wasn't executed.
[CHAR LIMIT=NONE]
-->
<string name="stopwatch_isnt_running">Stopwatch isn\'t running</string>
- <!-- String that represents that the user has sent a voice command 'reset the stopwatch' or
- when the stopwatch was running so the command wasn't executed.
- [CHAR LIMIT=NONE]
- -->
- <string name="stopwatch_cant_be_reset_because_is_running">Stopwatch cannot be reset because it is running</string>
-
- <!-- String that represents that the user has successfully sent a voice command stopping
+ <!-- String that represents that the user has successfully sent a voice command pausing
the stopwatch.
[CHAR LIMIT=NONE]
-->
- <string name="stopwatch_stopped">Stopwatch stopped</string>
+ <string name="stopwatch_paused">Stopwatch paused</string>
<!-- String that represents that the user has successfully sent a voice command resetting
the stopwatch.
@@ -1012,62 +991,50 @@
-->
<string name="alarm_is_set">Alarm is set for <xliff:g id="alarm_time" example="14:20">%s</xliff:g></string>
- <!-- String that represents that the user attempted to send a voice action 'delete a timer'
- when there were no timers available.
+ <!-- String that represents that the user attempted to control a timer with a voice action when
+ no timers are defined.
[CHAR LIMIT=NONE]
-->
- <string name="no_timer_set">No timer set</string>
+ <string name="no_timers_exist">No timers exist</string>
- <!-- String that represents that the user has successfully deleted a timer through a voice action.
+ <!-- String that represents that the user attempted to control a timer with a voice action when
+ more than one timer is defined.
[CHAR LIMIT=NONE]
-->
- <string name="timer_deleted">Timer deleted</string>
+ <string name="too_many_timers_exist">More than one timer exists</string>
- <!-- String that represents that the user has attempted to start a timer when a timer was
- already running.
+ <!-- String that represents that the user attempted to control a timer with a voice action but
+ the timer could not be located.
[CHAR LIMIT=NONE]
-->
- <string name="timer_already_running">Timer already running</string>
-
- <!-- String that represents that the user has attempted to start or reset a timer when
- there were more than 1 timer of desired state in which case it's ambiguous
- which timer the user meant.
- [CHAR LIMIT=NONE]
- -->
- <string name="multiple_timers_available">Unable to complete your request, multiple timers available</string>
-
- <!-- String that represents that the user has successfully started a timer through a voice action.
- [CHAR LIMIT=NONE]
- -->
- <string name="timer_started">Timer started</string>
+ <string name="timer_does_not_exist">The timer has been removed.</string>
<!-- String that represents that the user has successfully created a timer through a voice action.
[CHAR LIMIT=NONE]
-->
<string name="timer_created">Timer created</string>
- <!-- String that represents that the user attempted to start a timer through a voice action
- but specified invalid length.
- [CHAR LIMIT=NONE]
- -->
- <string name="invalid_timer_length">Invalid timer length</string>
-
<!-- String that represents that the user has successfully reset a timer through a voice action.
[CHAR LIMIT=NONE]
-->
<string name="timer_was_reset">Timer reset</string>
- <!-- String that represents that the user attempted to reset a timer through a voice action but
- the timer wasn't stopped (resetting is only allowed when a timer is stopped).
+ <!-- String that represents that the user has successfully reset a timer through a voice action
+ that was marked as deleteAfterUse and was thus deleted instead.
[CHAR LIMIT=NONE]
-->
- <string name="timer_cant_be_reset_because_its_running">Timer can\'t be reset because it\'s still running. Stop timer to reset.</string>
+ <string name="timer_deleted">Timer deleted</string>
- <!-- String that represents that the user attempted to stop a timer through a voice action but
- the timer was already stopped (resetting is only allowed when a timer is stopped).
+ <!-- String that represents that the user has successfully started a timer through a voice action.
[CHAR LIMIT=NONE]
-->
- <string name="timer_already_stopped">Timer already stopped</string>
+ <string name="timer_started">Timer started</string>
+
+ <!-- String that represents that the user attempted to start a timer through a voice action
+ but specified invalid length.
+ [CHAR LIMIT=NONE]
+ -->
+ <string name="invalid_timer_length">Invalid timer length</string>
<!-- String that represents that the user attempted to add or delete a world clock through
a voice action
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 3a5345b..d2ccdf6 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -23,9 +23,10 @@
</style>
<style name="BaseActivityTheme" parent="Theme.AppCompat">
- <item name="android:imageButtonStyle">@style/ImageButtonStyle</item>
+ <item name="android:windowBackground">@color/default_background</item>
<item name="alertDialogTheme">@style/AlertDialogTheme</item>
+ <item name="imageButtonStyle">@style/ImageButtonStyle</item>
<item name="colorAccent">@color/color_accent</item>
<item name="colorPrimaryDark">@color/status_bar</item>
<item name="colorControlActivated">@color/white</item>
@@ -62,48 +63,18 @@
<item name="android:textSize">16sp</item>
</style>
- <style name="DeskClock" parent="@style/BaseActivityTheme">
- <item name="android:windowActionBarOverlay">true</item>
- <item name="android:windowBackground">@color/default_background</item>
-
- <!-- Attributes from support.v7.appcompat -->
- <item name="actionBarStyle">@style/DeskClockActionBarStyle</item>
- <item name="actionBarTabStyle">@style/DeskClockTabStyle</item>
- <item name="actionBarTabBarStyle">@style/DeskClockTabBarStyle</item>
- </style>
-
<style name="DeskClockTabBaseStyle" parent="Widget.AppCompat.ActionBar.TabView">
<item name="android:paddingLeft">@dimen/actionbar_tab_padding</item>
<item name="android:paddingRight">@dimen/actionbar_tab_padding</item>
<item name="android:gravity">center</item>
</style>
- <style name="DeskClockTabStyle" parent="DeskClockTabBaseStyle">
- <item name="android:background">?attr/selectableItemBackgroundBorderless</item>
- </style>
-
- <style name="DeskClockTabBarStyle" parent="Widget.AppCompat.ActionBar.TabBar">
- <item name="android:dividerPadding">12dp</item>
- <item name="android:gravity">center</item>
- <!-- Attributes from support.v7.appcompat -->
- <item name="showDividers">none</item>
- </style>
-
- <style name="DeskClockActionBarStyle" parent="Widget.AppCompat.ActionBar">
- <item name="android:background">@null</item>
- <item name="android:backgroundStacked">@null</item>
- <item name="android:backgroundSplit">@null</item>
- <!--suppress CheckTagEmptyBody Empty displayOptions to hide app title at launch. -->
- <item name="displayOptions"></item>
- </style>
-
- <style name="SettingsTheme" parent="BaseActivityTheme">
+ <style name="SettingsTheme" parent="TranslucentDecorActivityTheme">
<item name="android:detailsElementBackground">@null</item>
- <item name="android:windowActionBar">false</item>
- <item name="android:windowNoTitle">true</item>
-
<!-- Attributes from support.v7.appcompat -->
<item name="actionBarStyle">@style/SettingsActionBarStyle</item>
+ <item name="windowActionBar">true</item>
+ <item name="windowNoTitle">false</item>
</style>
<style name="SettingsActionBarStyle" parent="@style/Widget.AppCompat.Toolbar">
@@ -113,14 +84,15 @@
<item name="displayOptions">showTitle|homeAsUp</item>
</style>
- <style name="CitiesTheme" parent="BaseActivityTheme">
+ <style name="CitiesTheme" parent="TranslucentDecorActivityTheme">
<item name="android:fastScrollPreviewBackgroundLeft">@drawable/fastscroll_preview</item>
<item name="android:fastScrollPreviewBackgroundRight">@drawable/fastscroll_preview</item>
<item name="android:fastScrollTextColor">@color/white</item>
<item name="android:fastScrollThumbDrawable">@drawable/fastscroll_thumb</item>
<item name="android:fastScrollTrackDrawable">@drawable/fastscroll_track</item>
-
<!-- Attributes from support.v7.appcompat -->
+ <item name="windowActionBar">true</item>
+ <item name="windowNoTitle">false</item>
<item name="actionBarStyle">@style/CitiesActionBarStyle</item>
</style>
@@ -131,16 +103,15 @@
<item name="displayOptions">homeAsUp</item>
</style>
- <!-- variants: v21 -->
- <style name="FabStyle" />
-
<style name="AlarmAlertFullScreenTheme" parent="TranslucentDecorActivityTheme" />
- <style name="TimerAlertFullScreenTheme" parent="TranslucentDecorActivityTheme" />
+ <style name="DeskClockTheme" parent="@style/TranslucentDecorActivityTheme" />
+
+ <style name="ExpiredTimersActivityTheme" parent="TranslucentDecorActivityTheme" />
<style name="ScreensaverActivityTheme" parent="Theme.AppCompat.NoActionBar" />
- <style name="ImageButtonStyle" parent="android:Widget.DeviceDefault.ImageButton">
+ <style name="ImageButtonStyle" parent="Widget.AppCompat.ImageButton">
<item name="android:background">?attr/selectableItemBackgroundBorderless</item>
</style>
@@ -193,6 +164,9 @@
<style name="widget_medium_thin">
<item name="android:textSize">@dimen/widget_medium_font_size</item>
<item name="android:fontFamily">sans-serif-thin</item>
+ <item name="android:shadowRadius">@dimen/digital_widget_shadow_radius</item>
+ <item name="android:shadowColor">@color/digital_widget_shadow_color</item>
+ <item name="android:shadowDy">@dimen/digital_widget_shadow_dy</item>
</style>
<style name="label">
@@ -205,6 +179,9 @@
<style name="widget_label" parent="label">
<item name="android:textSize">@dimen/widget_label_font_size</item>
+ <item name="android:shadowRadius">@dimen/digital_widget_shadow_radius</item>
+ <item name="android:shadowColor">@color/digital_widget_shadow_color</item>
+ <item name="android:shadowDy">@dimen/digital_widget_shadow_dy</item>
</style>
<style name="header">
@@ -228,6 +205,9 @@
<style name="widget_big_thin" parent="big_thin">
<item name="android:textSize">@dimen/widget_big_font_size</item>
+ <item name="android:shadowRadius">@dimen/digital_widget_shadow_radius</item>
+ <item name="android:shadowColor">@color/digital_widget_shadow_color</item>
+ <item name="android:shadowDy">@dimen/digital_widget_shadow_dy</item>
</style>
<style name="alarm_label">
@@ -306,18 +286,4 @@
<item name="android:textColor">@color/white</item>
</style>
- <style name="ToastBarStyle">
- <item name="android:layout_width">match_parent</item>
- <item name="android:layout_height">48dip</item>
- <item name="android:layout_gravity">bottom</item>
- <item name="android:layout_marginLeft">4dip</item>
- <item name="android:layout_marginRight">4dip</item>
- <item name="android:orientation">horizontal</item>
- <item name="android:gravity">center_vertical</item>
- <item name="android:background">@drawable/panel_undo_holo</item>
- <item name="android:visibility">gone</item>
- <item name="android:alpha">0</item>
- <item name="android:clickable">true</item>
- </style>
-
</resources>
diff --git a/res/xml/analog_appwidget.xml b/res/xml/analog_appwidget.xml
index ec46019..e6f6144 100644
--- a/res/xml/analog_appwidget.xml
+++ b/res/xml/analog_appwidget.xml
@@ -15,10 +15,11 @@
-->
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="110dip"
- android:minHeight="110dip"
- android:updatePeriodMillis="0"
- android:previewImage="@drawable/appwidget_analog_clock_preview"
android:initialLayout="@layout/analog_appwidget"
- >
-</appwidget-provider>
+ android:minHeight="@dimen/min_analog_widget_size"
+ android:minResizeHeight="55dp"
+ android:minResizeWidth="55dp"
+ android:minWidth="@dimen/min_analog_widget_size"
+ android:previewImage="@drawable/appwidget_analog_clock_preview"
+ android:resizeMode="horizontal|vertical"
+ android:updatePeriodMillis="0" />
diff --git a/res/xml/digital_appwidget.xml b/res/xml/digital_appwidget.xml
index 49d87fd..da28a88 100644
--- a/res/xml/digital_appwidget.xml
+++ b/res/xml/digital_appwidget.xml
@@ -17,12 +17,10 @@
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="@dimen/min_digital_widget_width"
android:minHeight="@dimen/min_digital_widget_height"
- android:minResizeWidth="@dimen/min_digital_widget_width"
- android:minResizeHeight="@dimen/min_digital_widget_height"
+ android:minResizeWidth="@dimen/min_digital_widget_resize_width"
+ android:minResizeHeight="@dimen/min_digital_widget_resize_height"
android:updatePeriodMillis="0"
android:previewImage="@drawable/appwidget_digital_clock_preview"
android:initialLayout="@layout/digital_appwidget"
android:resizeMode="vertical|horizontal"
- android:widgetCategory="keyguard|home_screen"
- >
-</appwidget-provider>
+ android:widgetCategory="keyguard|home_screen" />
diff --git a/res/xml/dream_info.xml b/res/xml/dream_info.xml
index 2add99b..57508f3 100644
--- a/res/xml/dream_info.xml
+++ b/res/xml/dream_info.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<dream xmlns:android="http://schemas.android.com/apk/res/android"
- android:settingsActivity="com.android.deskclock.ScreensaverSettingsActivity"
+ android:settingsActivity="com.android.deskclock.settings.ScreensaverSettingsActivity"
/>
diff --git a/res/xml/settings.xml b/res/xml/settings.xml
index 88cf3cd..37b416a 100644
--- a/res/xml/settings.xml
+++ b/res/xml/settings.xml
@@ -24,17 +24,23 @@
android:entryValues="@array/clock_style_values"
android:defaultValue="@string/default_clock_style"
android:dialogTitle="@string/clock_style" />
- <CheckBoxPreference
+
+ <SwitchPreference
android:key="automatic_home_clock"
android:title="@string/automatic_home_clock"
android:summary="@string/automatic_home_clock_summary"
android:defaultValue="true" />
+
<ListPreference
android:key="home_time_zone"
android:entries="@array/timezone_labels"
android:entryValues="@array/timezone_values"
android:dialogTitle="@string/home_time_zone_title"
android:title="@string/home_time_zone" />
+
+ <Preference
+ android:key="date_time"
+ android:title="@string/open_date_settings" />
</PreferenceCategory>
<PreferenceCategory
@@ -47,7 +53,7 @@
android:defaultValue="10"
android:dialogTitle="@string/auto_silence_title" />
- <com.android.deskclock.SnoozeLengthDialog
+ <com.android.deskclock.settings.SnoozeLengthDialog
android:key="snooze_duration"
android:title="@string/snooze_duration_title"
android:defaultValue="10"/>
@@ -56,6 +62,11 @@
android:key="volume_setting"
android:title="@string/alarm_volume_title" />
+ <com.android.deskclock.settings.CrescendoLengthDialog
+ android:key="alarm_crescendo_duration"
+ android:title="@string/crescendo_duration_title"
+ android:defaultValue="0"/>
+
<ListPreference
android:key="volume_button_setting"
android:title="@string/volume_button_setting_title"
@@ -71,4 +82,18 @@
android:entries="@array/week_start_entries"
android:entryValues="@array/week_start_values" />
</PreferenceCategory>
+
+ <PreferenceCategory
+ android:title="@string/timer_settings">
+ <com.android.deskclock.settings.TimerRingtonePreference
+ android:key="timer_ringtone"
+ android:title="@string/timer_ringtone_title"
+ android:ringtoneType="alarm" />
+
+ <com.android.deskclock.settings.CrescendoLengthDialog
+ android:key="timer_crescendo_duration"
+ android:title="@string/crescendo_duration_title"
+ android:defaultValue="0"/>
+ </PreferenceCategory>
+
</PreferenceScreen>
diff --git a/src/com/android/alarmclock/AnalogAppWidgetProvider.java b/src/com/android/alarmclock/AnalogAppWidgetProvider.java
index fdcd8f3..312b75e 100644
--- a/src/com/android/alarmclock/AnalogAppWidgetProvider.java
+++ b/src/com/android/alarmclock/AnalogAppWidgetProvider.java
@@ -16,7 +16,7 @@
package com.android.alarmclock;
-import com.android.deskclock.DeskClock;
+import com.android.deskclock.HandleDeskClockApiCalls;
import com.android.deskclock.R;
import android.app.PendingIntent;
@@ -27,29 +27,24 @@
import android.widget.RemoteViews;
/**
- * Simple widget to show analog clock.
+ * Simple widget to show an analog clock.
*/
public class AnalogAppWidgetProvider extends BroadcastReceiver {
- static final String TAG = "AnalogAppWidgetProvider";
-
@Override
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);
-
- views.setOnClickPendingIntent(R.id.analog_appwidget,
- PendingIntent.getActivity(context, 0,
- new Intent(context, DeskClock.class), 0));
-
- int[] appWidgetIds = intent.getIntArrayExtra(
- AppWidgetManager.EXTRA_APPWIDGET_IDS);
-
- AppWidgetManager gm = AppWidgetManager.getInstance(context);
- gm.updateAppWidget(appWidgetIds, views);
+ if (!AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(intent.getAction())) {
+ return;
}
- }
-}
+ final String packageName = context.getPackageName();
+ final RemoteViews views = new RemoteViews(packageName, R.layout.analog_appwidget);
+
+ final Intent showClock = new Intent(HandleDeskClockApiCalls.ACTION_SHOW_CLOCK)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_FROM_WIDGET, true);
+ final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, showClock, 0);
+ views.setOnClickPendingIntent(R.id.analog_appwidget, pendingIntent);
+
+ final int[] appWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
+ AppWidgetManager.getInstance(context).updateAppWidget(appWidgetIds, views);
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/alarmclock/DigitalAppWidgetProvider.java b/src/com/android/alarmclock/DigitalAppWidgetProvider.java
index 7c78d71..5b22544 100644
--- a/src/com/android/alarmclock/DigitalAppWidgetProvider.java
+++ b/src/com/android/alarmclock/DigitalAppWidgetProvider.java
@@ -26,24 +26,25 @@
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.util.Log;
+import android.util.TypedValue;
import android.view.View;
import android.widget.RemoteViews;
-import com.android.deskclock.DeskClock;
+import com.android.deskclock.HandleDeskClockApiCalls;
import com.android.deskclock.R;
import com.android.deskclock.Utils;
import com.android.deskclock.alarms.AlarmStateManager;
-import com.android.deskclock.worldclock.Cities;
-import com.android.deskclock.worldclock.CitiesActivity;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.worldclock.CitySelectionActivity;
-import java.text.SimpleDateFormat;
import java.util.Locale;
public class DigitalAppWidgetProvider extends AppWidgetProvider {
- private static final String TAG = "DigitalAppWidgetProvider";
+ private static final String TAG = "DigAppWidgetProvider";
/**
* Intent to be used for checking if a world clock's date has changed. Must be every fifteen
@@ -72,7 +73,7 @@
}
@Override
- public void onReceive(Context context, Intent intent) {
+ public void onReceive(@NonNull Context context, @NonNull Intent intent) {
String action = intent.getAction();
if (DigitalAppWidgetService.LOGGING) {
Log.i(TAG, "onReceive: " + action);
@@ -94,9 +95,10 @@
RemoteViews widget = new RemoteViews(context.getPackageName(),
R.layout.digital_appwidget);
float ratio = WidgetUtils.getScaleRatio(context, null, appWidgetId);
- WidgetUtils.setTimeFormat(context, widget, 0/*no am/pm*/, R.id.the_clock);
+ WidgetUtils.setTimeFormat(context, widget, false /* showAmPm */,
+ R.id.the_clock);
WidgetUtils.setClockSize(context, widget, ratio);
- refreshAlarm(context, widget);
+ refreshAlarm(context, widget, ratio);
appWidgetManager.partiallyUpdateAppWidget(appWidgetId, widget);
}
}
@@ -104,27 +106,15 @@
cancelAlarmOnQuarterHour(context);
}
startAlarmOnQuarterHour(context);
- } else if (isNextAlarmChangedAction(action) || Intent.ACTION_SCREEN_ON.equals(action)) {
- // Refresh the next alarm
+ } else if (isNextAlarmChangedAction(action)
+ || Intent.ACTION_SCREEN_ON.equals(action)
+ || DataModel.ACTION_DIGITAL_WIDGET_CHANGED.equals(action)) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
if (appWidgetManager != null) {
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(getComponentName(context));
for (int appWidgetId : appWidgetIds) {
- RemoteViews widget = new RemoteViews(context.getPackageName(),
- R.layout.digital_appwidget);
- refreshAlarm(context, widget);
- appWidgetManager.partiallyUpdateAppWidget(appWidgetId, widget);
- }
- }
- } else if (Cities.WORLDCLOCK_UPDATE_INTENT.equals(action)) {
- // Refresh the world cities list
- AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
- if (appWidgetManager != null) {
- int[] appWidgetIds = appWidgetManager.getAppWidgetIds(getComponentName(context));
- for (int appWidgetId : appWidgetIds) {
- appWidgetManager.
- notifyAppWidgetViewDataChanged(appWidgetId,
- R.id.digital_appwidget_listview);
+ final float ratio = WidgetUtils.getScaleRatio(context, null, appWidgetId);
+ updateClock(context, appWidgetManager, appWidgetId, ratio);
}
}
}
@@ -175,24 +165,18 @@
if (newOptions != null &&
newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, -1)
!= AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD) {
- widget.setOnClickPendingIntent(R.id.digital_appwidget,
- PendingIntent.getActivity(context, 0, new Intent(context, DeskClock.class), 0));
+ final Intent showClock = new Intent(HandleDeskClockApiCalls.ACTION_SHOW_CLOCK)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_FROM_WIDGET, true);
+ final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, showClock, 0);
+ widget.setOnClickPendingIntent(R.id.digital_appwidget, pendingIntent);
}
- // Setup alarm text clock's format and font sizes
- refreshAlarm(context, widget);
- WidgetUtils.setTimeFormat(context, widget, 0/*no am/pm*/, R.id.the_clock);
+ // Setup formats and font sizes
+ refreshDate(context, widget, ratio);
+ refreshAlarm(context, widget, ratio);
+ WidgetUtils.setTimeFormat(context, widget, false /* showAmPm */, R.id.the_clock);
WidgetUtils.setClockSize(context, widget, ratio);
- // Set today's date format
- final CharSequence dateFormat = Utils.isJBMR2OrLater()
- ? DateFormat.getBestDateTimePattern(Locale.getDefault(),
- context.getString(R.string.abbrev_wday_month_day_no_year))
- : ((SimpleDateFormat) SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT))
- .toPattern();
- widget.setCharSequence(R.id.date, "setFormat12Hour", dateFormat);
- widget.setCharSequence(R.id.date, "setFormat24Hour", dateFormat);
-
// Set up R.id.digital_appwidget_listview to use a remote views adapter
// That remote views adapter connects to a RemoteViewsService through intent.
final Intent intent = new Intent(context, DigitalAppWidgetService.class);
@@ -202,9 +186,9 @@
// Set up the click on any world clock to start the Cities Activity
//TODO: Should this be in the options guard above?
+ final Intent selectCitiesIntent = new Intent(context, CitySelectionActivity.class);
widget.setPendingIntentTemplate(R.id.digital_appwidget_listview,
- PendingIntent.
- getActivity(context, 0, new Intent(context, CitiesActivity.class), 0));
+ PendingIntent.getActivity(context, 0, selectCitiesIntent, 0));
// Refresh the widget
appWidgetManager.notifyAppWidgetViewDataChanged(
@@ -212,11 +196,48 @@
appWidgetManager.updateAppWidget(appWidgetId, widget);
}
- protected void refreshAlarm(Context context, RemoteViews widget) {
+ private void refreshDate(Context context, RemoteViews widget, float ratio) {
+ if (ratio < 1) {
+ // The time text normally has a negative bottom margin to reduce the space between the
+ // time and the date. When we scale down they overlap, so give the date a positive
+ // top padding.
+ final float padding = (1 - ratio) *
+ -context.getResources().getDimension(R.dimen.bottom_text_spacing_digital);
+ widget.setViewPadding(R.id.date_and_alarm, 0, (int) padding, 0, 0);
+ }
+
+ // Set today's date format
+ final Locale locale = Locale.getDefault();
+ final String skeleton = context.getString(R.string.abbrev_wday_abbrev_month_day_no_year);
+ final CharSequence timeFormat = DateFormat.getBestDateTimePattern(locale, skeleton);
+ widget.setCharSequence(R.id.date, "setFormat12Hour", timeFormat);
+ widget.setCharSequence(R.id.date, "setFormat24Hour", timeFormat);
+ final float fontSize = context.getResources().getDimension(R.dimen.widget_label_font_size);
+ widget.setTextViewTextSize(R.id.date, TypedValue.COMPLEX_UNIT_PX, fontSize * ratio);
+ }
+
+ protected void refreshAlarm(Context context, RemoteViews widget, float ratio) {
final String nextAlarm = Utils.getNextAlarm(context);
if (!TextUtils.isEmpty(nextAlarm)) {
- widget.setTextViewText(R.id.nextAlarm,
- context.getString(R.string.control_set_alarm_with_existing, nextAlarm));
+ final float fontSize =
+ context.getResources().getDimension(R.dimen.widget_label_font_size);
+ widget.setTextViewTextSize(
+ R.id.nextAlarm, TypedValue.COMPLEX_UNIT_PX, fontSize * ratio);
+
+ int alarmDrawableResId;
+ if (ratio < .72f) {
+ alarmDrawableResId = R.drawable.ic_alarm_small_12dp;
+ }
+ else if (ratio < .95f) {
+ alarmDrawableResId = R.drawable.ic_alarm_small_18dp;
+ }
+ else {
+ alarmDrawableResId = R.drawable.ic_alarm_small_24dp;
+ }
+ widget.setTextViewCompoundDrawablesRelative(
+ R.id.nextAlarm, alarmDrawableResId, 0, 0, 0);
+
+ widget.setTextViewText(R.id.nextAlarm, nextAlarm);
widget.setViewVisibility(R.id.nextAlarm, View.VISIBLE);
if (DigitalAppWidgetService.LOGGING) {
Log.v(TAG, "DigitalWidget sets next alarm string to " + nextAlarm);
@@ -237,15 +258,10 @@
*/
private void startAlarmOnQuarterHour(Context context) {
if (context != null) {
- long onQuarterHour = Utils.getAlarmOnQuarterHour();
- PendingIntent quarterlyIntent = getOnQuarterHourPendingIntent(context);
- AlarmManager alarmManager = ((AlarmManager) context
- .getSystemService(Context.ALARM_SERVICE));
- if (Utils.isKitKatOrLater()) {
- alarmManager.setExact(AlarmManager.RTC, onQuarterHour, quarterlyIntent);
- } else {
- alarmManager.set(AlarmManager.RTC, onQuarterHour, quarterlyIntent);
- }
+ final long onQuarterHour = Utils.getAlarmOnQuarterHour();
+ final PendingIntent quarterlyIntent = getOnQuarterHourPendingIntent(context);
+ final AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ am.setExact(AlarmManager.RTC, onQuarterHour, quarterlyIntent);
if (DigitalAppWidgetService.LOGGING) {
Log.v(TAG, "startAlarmOnQuarterHour " + context.toString());
}
diff --git a/src/com/android/alarmclock/DigitalAppWidgetService.java b/src/com/android/alarmclock/DigitalAppWidgetService.java
index 7b33475..fab1156 100644
--- a/src/com/android/alarmclock/DigitalAppWidgetService.java
+++ b/src/com/android/alarmclock/DigitalAppWidgetService.java
@@ -17,16 +17,24 @@
package com.android.alarmclock;
import android.content.Intent;
-import android.util.Log;
+import android.content.res.Configuration;
import android.widget.RemoteViewsService;
+import com.android.deskclock.data.DataModel;
+
public class DigitalAppWidgetService extends RemoteViewsService {
+
public static final boolean LOGGING = false;
@Override
public RemoteViewsFactory onGetViewFactory(Intent i) {
- return new DigitalWidgetViewsFactory(this.getApplicationContext(), i);
+ return new DigitalWidgetViewsFactory(getApplicationContext(), i);
}
-}
-
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ // Orientation possibly changed, so notify the widgets.
+ sendBroadcast(new Intent(DataModel.ACTION_DIGITAL_WIDGET_CHANGED));
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/alarmclock/DigitalWidgetViewsFactory.java b/src/com/android/alarmclock/DigitalWidgetViewsFactory.java
index 4649144..e8bb776 100644
--- a/src/com/android/alarmclock/DigitalWidgetViewsFactory.java
+++ b/src/com/android/alarmclock/DigitalWidgetViewsFactory.java
@@ -16,7 +16,6 @@
package com.android.alarmclock;
-import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -28,130 +27,118 @@
import android.widget.RemoteViewsService.RemoteViewsFactory;
import com.android.deskclock.R;
-import com.android.deskclock.Utils;
-import com.android.deskclock.worldclock.CityObj;
-import com.android.deskclock.worldclock.WorldClockAdapter;
+import com.android.deskclock.data.City;
+import com.android.deskclock.data.DataModel;
+import java.util.ArrayList;
import java.util.Calendar;
+import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
-public class DigitalWidgetViewsFactory implements RemoteViewsFactory {
- private static final String TAG = "DigitalWidgetViewsFactory";
+import static android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID;
+import static android.appwidget.AppWidgetManager.INVALID_APPWIDGET_ID;
+import static com.android.deskclock.Utils.enforceMainLooper;
+import static java.util.Calendar.DAY_OF_WEEK;
- private Context mContext;
- private Resources mResources;
- private int mId = AppWidgetManager.INVALID_APPWIDGET_ID;
- private RemoteWorldClockAdapter mAdapter;
+public class DigitalWidgetViewsFactory implements RemoteViewsFactory {
+
+ private static final String TAG = "DigWidgetViewsFactory";
+
+ private final Intent mFillInIntent = new Intent();
+
+ private final Context mContext;
+ private final Resources mResources;
+ private final float mFontSize;
+ private final float mFont24Size;
+ private final int mWidgetId;
private float mFontScale = 1;
- // An adapter to provide the view for the list of cities in the world clock.
- private class RemoteWorldClockAdapter extends WorldClockAdapter {
- private final float mFontSize;
- private final float mFont24Size;
-
- public RemoteWorldClockAdapter(Context context) {
- super(context);
- mClocksPerRow = context.getResources().getInteger(
- R.integer.appwidget_world_clocks_per_row);
- mFontSize = context.getResources().getDimension(R.dimen.widget_medium_font_size);
- mFont24Size = context.getResources().getDimension(R.dimen.widget_24_medium_font_size);
- }
-
- public RemoteViews getViewAt(int position) {
- // There are 2 cities per item
- int index = position * 2;
- if (index < 0 || index >= mCitiesList.length) {
- return null;
- }
-
- RemoteViews views = new RemoteViews(
- mContext.getPackageName(), R.layout.world_clock_remote_list_item);
-
- // Always how the left clock
- updateView(views, (CityObj) mCitiesList[index], R.id.left_clock,
- R.id.city_name_left, R.id.city_day_left);
- // Show the right clock if any, make it invisible if there is no
- // clock on the right
- // to keep the left view on the left.
- if (index + 1 < mCitiesList.length) {
- updateView(views, (CityObj) mCitiesList[index + 1], R.id.right_clock,
- R.id.city_name_right, R.id.city_day_right);
- } else {
- hideView(views, R.id.right_clock, R.id.city_name_right,
- R.id.city_day_right);
- }
-
- // Hide last spacer if last row
- int lastRow = ((mCitiesList.length + 1) / 2) - 1;
- if (position == lastRow) {
- views.setViewVisibility(R.id.city_spacer, View.GONE);
- } else {
- views.setViewVisibility(R.id.city_spacer, View.VISIBLE);
- }
-
- return views;
- }
-
- private void updateView(RemoteViews clock, CityObj cityObj, int clockId,
- int labelId, int dayId) {
- final Calendar now = Calendar.getInstance();
- now.setTimeInMillis(System.currentTimeMillis());
- int myDayOfWeek = now.get(Calendar.DAY_OF_WEEK);
- CityObj cityInDb = mCitiesDb.get(cityObj.mCityId);
- String cityTZ = (cityInDb != null) ? cityInDb.mTimeZone : cityObj.mTimeZone;
- now.setTimeZone(TimeZone.getTimeZone(cityTZ));
- int cityDayOfWeek = now.get(Calendar.DAY_OF_WEEK);
-
- final int labelSize = mResources.getDimensionPixelSize(R.dimen.widget_label_font_size);
- WidgetUtils.setTimeFormat(mContext, clock, labelSize, clockId);
- float fontSize = mFontScale * (DateFormat.is24HourFormat(mContext)
- ? mFont24Size : mFontSize);
- clock.setTextViewTextSize(clockId, TypedValue.COMPLEX_UNIT_PX, fontSize * mFontScale);
- clock.setString(clockId, "setTimeZone", cityObj.mTimeZone);
-
- // Home city or city not in DB , use data from the save selected cities list
- clock.setTextViewText(labelId, Utils.getCityName(cityObj, cityInDb));
-
- if (myDayOfWeek != cityDayOfWeek) {
- clock.setTextViewText(dayId, mContext.getString(
- R.string.world_day_of_week_label, now.getDisplayName(
- Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.getDefault())));
- clock.setViewVisibility(dayId, View.VISIBLE);
- } else {
- clock.setViewVisibility(dayId, View.GONE);
- }
-
- clock.setViewVisibility(clockId, View.VISIBLE);
- clock.setViewVisibility(labelId, View.VISIBLE);
- }
-
- private void hideView(
- RemoteViews clock, int clockId, int labelId, int dayId) {
- clock.setViewVisibility(clockId, View.INVISIBLE);
- clock.setViewVisibility(labelId, View.INVISIBLE);
- clock.setViewVisibility(dayId, View.INVISIBLE);
- }
- }
+ private City mHomeCity;
+ private List<City> mCities;
+ private boolean mShowHomeClock;
public DigitalWidgetViewsFactory(Context context, Intent intent) {
mContext = context;
- mResources = mContext.getResources();
- mId = intent.getIntExtra(
- AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
- mAdapter = new RemoteWorldClockAdapter(context);
- }
-
- @SuppressWarnings("unused")
- public DigitalWidgetViewsFactory() {
+ mResources = context.getResources();
+ mFontSize = mResources.getDimension(R.dimen.widget_medium_font_size);
+ mFont24Size = mResources.getDimension(R.dimen.widget_24_medium_font_size);
+ mWidgetId = intent.getIntExtra(EXTRA_APPWIDGET_ID, INVALID_APPWIDGET_ID);
}
@Override
- public int getCount() {
- if (WidgetUtils.showList(mContext, mId, mFontScale)) {
- return mAdapter.getCount();
+ public void onCreate() {
+ if (DigitalAppWidgetService.LOGGING) {
+ Log.i(TAG, "DigitalWidget onCreate " + mWidgetId);
}
- return 0;
+ }
+
+ @Override
+ public void onDestroy() {
+ if (DigitalAppWidgetService.LOGGING) {
+ Log.i(TAG, "DigitalWidget onDestroy " + mWidgetId);
+ }
+ }
+
+ /**
+ * <p>Synchronized to ensure single-threaded reading/writing of mCities, mHomeCity and
+ * mShowHomeClock.</p>
+ *
+ * {@inheritDoc}
+ */
+ @Override
+ public synchronized int getCount() {
+ if (!WidgetUtils.showList(mContext, mWidgetId, mFontScale)) {
+ return 0;
+ }
+
+ final int homeClockCount = mShowHomeClock ? 1 : 0;
+ final int worldClockCount = mCities.size();
+ final double totalClockCount = homeClockCount + worldClockCount;
+
+ // number of clocks / 2 clocks per row
+ return (int) Math.ceil(totalClockCount / 2);
+ }
+
+ /**
+ * <p>Synchronized to ensure single-threaded reading/writing of mCities, mHomeCity and
+ * mShowHomeClock.</p>
+ *
+ * {@inheritDoc}
+ */
+ @Override
+ public synchronized RemoteViews getViewAt(int position) {
+ final int homeClockOffset = mShowHomeClock ? -1 : 0;
+ final int leftIndex = position * 2 + homeClockOffset;
+ final int rightIndex = leftIndex + 1;
+
+ final City left = leftIndex == -1 ? mHomeCity :
+ (leftIndex < mCities.size() ? mCities.get(leftIndex) : null);
+ final City right = rightIndex < mCities.size() ? mCities.get(rightIndex) : null;
+
+ final RemoteViews clock =
+ new RemoteViews(mContext.getPackageName(), R.layout.world_clock_remote_list_item);
+
+ // Show the left clock if one exists.
+ if (left != null) {
+ update(clock, left, R.id.left_clock, R.id.city_name_left, R.id.city_day_left);
+ } else {
+ hide(clock, R.id.left_clock, R.id.city_name_left, R.id.city_day_left);
+ }
+
+ // Show the right clock if one exists.
+ if (right != null) {
+ update(clock, right, R.id.right_clock, R.id.city_name_right, R.id.city_day_right);
+ } else {
+ hide(clock, R.id.right_clock, R.id.city_name_right, R.id.city_day_right);
+ }
+
+ // Hide last spacer in last row; show for all others.
+ final boolean lastRow = position == getCount() - 1;
+ clock.setViewVisibility(R.id.city_spacer, lastRow ? View.GONE : View.VISIBLE);
+
+ clock.setOnClickFillInIntent(R.id.widget_item, mFillInIntent);
+ return clock;
}
@Override
@@ -165,16 +152,6 @@
}
@Override
- public RemoteViews getViewAt(int position) {
- RemoteViews v = mAdapter.getViewAt(position);
- if (v != null) {
- Intent fillInIntent = new Intent();
- v.setOnClickFillInIntent(R.id.widget_item, fillInIntent);
- }
- return v;
- }
-
- @Override
public int getViewTypeCount() {
return 1;
}
@@ -184,27 +161,74 @@
return true;
}
+ /**
+ * <p>Synchronized to ensure single-threaded reading/writing of mCities, mHomeCity and
+ * mShowHomeClock.</p>
+ *
+ * {@inheritDoc}
+ */
@Override
- public void onCreate() {
- if (DigitalAppWidgetService.LOGGING) {
- Log.i(TAG, "DigitalWidget onCreate " + mId);
+ public synchronized void onDataSetChanged() {
+ // Fetch the data on the main Looper.
+ final RefreshRunnable refreshRunnable = new RefreshRunnable();
+ DataModel.getDataModel().run(refreshRunnable);
+
+ // Store the data in local variables.
+ mFontScale = WidgetUtils.getScaleRatio(mContext, null, mWidgetId);
+ mHomeCity = refreshRunnable.mHomeCity;
+ mCities = refreshRunnable.mCities;
+ mShowHomeClock = refreshRunnable.mShowHomeClock;
+ }
+
+ private void update(RemoteViews clock, City city, int clockId, int labelId, int dayId) {
+ WidgetUtils.setTimeFormat(mContext, clock, true /* showAmPm */, clockId);
+
+ final float fontSize = DateFormat.is24HourFormat(mContext) ? mFont24Size : mFontSize;
+ clock.setTextViewTextSize(clockId, TypedValue.COMPLEX_UNIT_PX, fontSize * mFontScale);
+ clock.setString(clockId, "setTimeZone", city.getTimeZoneId());
+ clock.setTextViewText(labelId, city.getName());
+
+ // Compute if the city week day matches the weekday of the current timezone.
+ final Calendar localCal = Calendar.getInstance(TimeZone.getDefault());
+ final Calendar cityCal = Calendar.getInstance(city.getTimeZone());
+ final boolean displayDayOfWeek = localCal.get(DAY_OF_WEEK) != cityCal.get(DAY_OF_WEEK);
+
+ // Bind the week day display.
+ if (displayDayOfWeek) {
+ final Locale locale = Locale.getDefault();
+ final String weekday = cityCal.getDisplayName(DAY_OF_WEEK, Calendar.SHORT, locale);
+ final String slashDay = mContext.getString(R.string.world_day_of_week_label, weekday);
+ clock.setTextViewText(dayId, slashDay);
+ }
+
+ clock.setViewVisibility(dayId, displayDayOfWeek ? View.VISIBLE : View.GONE);
+ clock.setViewVisibility(clockId, View.VISIBLE);
+ clock.setViewVisibility(labelId, View.VISIBLE);
+ }
+
+ private void hide(RemoteViews clock, int clockId, int labelId, int dayId) {
+ clock.setViewVisibility(dayId, View.INVISIBLE);
+ clock.setViewVisibility(clockId, View.INVISIBLE);
+ clock.setViewVisibility(labelId, View.INVISIBLE);
+ }
+
+ /**
+ * This Runnable fetches data for this factory on the main thread to ensure all DataModel reads
+ * occur on the main thread.
+ */
+ private static final class RefreshRunnable implements Runnable {
+
+ private City mHomeCity;
+ private List<City> mCities;
+ private boolean mShowHomeClock;
+
+ @Override
+ public void run() {
+ enforceMainLooper();
+
+ mHomeCity = DataModel.getDataModel().getHomeCity();
+ mCities = new ArrayList<>(DataModel.getDataModel().getSelectedCities());
+ mShowHomeClock = DataModel.getDataModel().getShowHomeClock();
}
}
-
- @Override
- public void onDataSetChanged() {
- mAdapter.loadData(mContext);
- mAdapter.loadCitiesDb(mContext);
- mAdapter.updateHomeLabel(mContext);
-
- mFontScale = WidgetUtils.getScaleRatio(mContext, null, mId);
- }
-
- @Override
- public void onDestroy() {
- if (DigitalAppWidgetService.LOGGING) {
- Log.i(TAG, "DigitalWidget onDestroy " + mId);
- }
- }
-}
-
+}
\ No newline at end of file
diff --git a/src/com/android/alarmclock/WidgetUtils.java b/src/com/android/alarmclock/WidgetUtils.java
index e163294..f4ce1f8 100644
--- a/src/com/android/alarmclock/WidgetUtils.java
+++ b/src/com/android/alarmclock/WidgetUtils.java
@@ -26,6 +26,7 @@
import com.android.deskclock.R;
import com.android.deskclock.Utils;
+import com.android.deskclock.data.DataModel;
public class WidgetUtils {
static final String TAG = "WidgetUtils";
@@ -55,15 +56,25 @@
Resources res = context.getResources();
float density = res.getDisplayMetrics().density;
float ratio = (density * minWidth) / res.getDimension(R.dimen.min_digital_widget_width);
- // Check if the height could introduce a font size constraint
- int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
- if (minHeight > 0 && (density * minHeight)
- < res.getDimension(R.dimen.min_digital_widget_height)) {
- ratio = Math.min(ratio, getHeightScaleRatio(context, options, id));
+ ratio = Math.min(ratio, getHeightScaleRatio(context, options, id));
+ ratio *= .83f;
+
+ final SelectedCitiesRunnable selectedCitiesRunnable = new SelectedCitiesRunnable();
+ DataModel.getDataModel().run(selectedCitiesRunnable);
+ if (selectedCitiesRunnable.mAnyCitiesSelected) {
+ return (ratio > 1f) ? 1f : ratio;
}
- return (ratio > 1) ? 1 : ratio;
+
+ ratio = Math.min(ratio, 1.6f);
+ if (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
+ ratio = Math.max(ratio, .71f);
+ }
+ else {
+ ratio = Math.max(ratio, .45f);
+ }
+ return ratio;
}
- return 1;
+ return 1f;
}
// Calculate the scale factor of the fonts in the list of the widget using the widget height
@@ -84,14 +95,11 @@
}
Resources res = context.getResources();
float density = res.getDisplayMetrics().density;
- // Estimate height of date text box - 1.35 roughly approximates the text box padding
- float lblBox = 1.35f * res.getDimension(R.dimen.label_font_size);
- // Ensure divisor for ratio is positive number
- if (res.getDimension(R.dimen.min_digital_widget_height) - lblBox > 0) {
- float ratio = ((density * minHeight) - lblBox)
- / (res.getDimension(R.dimen.min_digital_widget_height) - lblBox);
- return (ratio > 1) ? 1 : ratio;
+ float ratio = density * minHeight / res.getDimension(R.dimen.min_digital_widget_height);
+ if (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
+ return ratio * 1.75f;
}
+ return ratio;
}
return 1;
}
@@ -133,18 +141,28 @@
* Set the format of the time on the clock according to the locale
* @param context - Context used to get user's locale and time preferences
* @param clock - view to format
- * @param amPmFontSize - size of am/pm label, zero size means no am/om label
+ * @param showAmPm - show am/pm label if true
* @param clockId - id of TextClock view as defined in the clock's layout.
*/
- public static void setTimeFormat(Context context, RemoteViews clock, int amPmFontSize,
+ public static void setTimeFormat(Context context, RemoteViews clock, boolean showAmPm,
int clockId) {
if (clock != null) {
// Set the best format for 12 hours mode according to the locale
clock.setCharSequence(clockId, "setFormat12Hour",
- Utils.get12ModeFormat(context, amPmFontSize));
+ Utils.get12ModeFormat(context, showAmPm));
// Set the best format for 24 hours mode according to the locale
clock.setCharSequence(clockId, "setFormat24Hour", Utils.get24ModeFormat());
}
}
+
+ private static class SelectedCitiesRunnable implements Runnable {
+
+ private boolean mAnyCitiesSelected;
+
+ @Override
+ public void run() {
+ mAnyCitiesSelected = !DataModel.getDataModel().getSelectedCities().isEmpty();
+ }
+ }
}
diff --git a/src/com/android/deskclock/AlarmClockFragment.java b/src/com/android/deskclock/AlarmClockFragment.java
index 69c6ed4..d443ba5 100644
--- a/src/com/android/deskclock/AlarmClockFragment.java
+++ b/src/com/android/deskclock/AlarmClockFragment.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2007 The Android Open Source Project
+ * Copyright (C) 2015 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.
@@ -16,101 +16,38 @@
package com.android.deskclock;
-import android.Manifest;
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ValueAnimator;
import android.app.Activity;
-import android.app.Fragment;
-import android.app.FragmentTransaction;
import android.app.LoaderManager;
-import android.content.ContentResolver;
-import android.content.Context;
import android.content.Intent;
import android.content.Loader;
-import android.content.SharedPreferences;
-import android.content.res.Configuration;
-import android.content.res.Resources;
import android.database.Cursor;
-import android.database.DataSetObserver;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
-import android.os.AsyncTask;
import android.os.Bundle;
-import android.os.Vibrator;
-import android.preference.PreferenceManager;
-import android.support.v4.view.ViewCompat;
-import android.transition.AutoTransition;
-import android.transition.Fade;
-import android.transition.Transition;
-import android.transition.TransitionManager;
-import android.transition.TransitionSet;
+import android.support.design.widget.Snackbar;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.text.format.DateFormat;
import android.view.LayoutInflater;
-import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewTreeObserver;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.CursorAdapter;
-import android.widget.FrameLayout;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.TextView;
-import android.widget.Toast;
-import com.android.deskclock.alarms.AlarmStateManager;
-import com.android.deskclock.events.Events;
+import com.android.deskclock.alarms.AlarmTimeClickHandler;
+import com.android.deskclock.alarms.AlarmUpdateHandler;
+import com.android.deskclock.alarms.ScrollHandler;
+import com.android.deskclock.alarms.TimePickerCompat;
+import com.android.deskclock.alarms.dataadapter.AlarmTimeAdapter;
+import com.android.deskclock.data.DataModel;
import com.android.deskclock.provider.Alarm;
-import com.android.deskclock.provider.AlarmInstance;
-import com.android.deskclock.provider.DaysOfWeek;
-import com.android.deskclock.widget.ActionableToastBar;
-import com.android.deskclock.widget.TextTime;
-
-import java.util.Calendar;
-import java.util.HashSet;
+import com.android.deskclock.widget.EmptyViewController;
+import com.android.deskclock.widget.toast.SnackbarManager;
+import com.android.deskclock.widget.toast.ToastManager;
/**
- * AlarmClock application.
+ * A fragment that displays a list of alarm time and allows interaction with them.
*/
-public abstract class AlarmClockFragment extends DeskClockFragment implements
- LoaderManager.LoaderCallbacks<Cursor>, View.OnTouchListener {
- private static final float EXPAND_DECELERATION = 1f;
- private static final float COLLAPSE_DECELERATION = 0.7f;
-
- private static final int ANIMATION_DURATION = 300;
- private static final int EXPAND_DURATION = 300;
- private static final int COLLAPSE_DURATION = 250;
-
- private static final int ROTATE_180_DEGREE = 180;
- private static final float ALARM_ELEVATION = 8f;
- private static final float TINTED_LEVEL = 0.09f;
-
- private static final String KEY_EXPANDED_ID = "expandedId";
- private static final String KEY_REPEAT_CHECKED_IDS = "repeatCheckedIds";
- private static final String KEY_RINGTONE_TITLE_CACHE = "ringtoneTitleCache";
- private static final String KEY_SELECTED_ALARMS = "selectedAlarms";
- private static final String KEY_DELETED_ALARM = "deletedAlarm";
- private static final String KEY_UNDO_SHOWING = "undoShowing";
- private static final String KEY_PREVIOUS_DAY_MAP = "previousDayMap";
- private static final String KEY_SELECTED_ALARM = "selectedAlarm";
-
- private static final int REQUEST_CODE_RINGTONE = 1;
- private static final int REQUEST_CODE_PERMISSIONS = 2;
- private static final long INVALID_ID = -1;
- private static final String PREF_KEY_DEFAULT_ALARM_RINGTONE_URI = "default_alarm_ringtone_uri";
-
- // Use transitions only in API 21+
- private static final boolean USE_TRANSITION_FRAMEWORK = Utils.isLOrLater();
+public final class AlarmClockFragment extends DeskClockFragment implements
+ LoaderManager.LoaderCallbacks<Cursor>, ScrollHandler, TimePickerCompat.OnTimeSetListener {
// This extra is used when receiving an intent to create an alarm, but no alarm details
// have been passed in, so the alarm page should start the process of creating a new alarm.
@@ -120,64 +57,24 @@
// can not be found, and toast message will pop up that the alarm has be deleted.
public static final String SCROLL_TO_ALARM_INTENT_EXTRA = "deskclock.scroll.to.alarm";
- private FrameLayout mMainLayout;
- private ListView mAlarmsList;
- private AlarmItemAdapter mAdapter;
- private View mEmptyView;
- private View mFooterView;
+ // Views
+ private ViewGroup mMainLayout;
+ private RecyclerView mRecyclerView;
- private Bundle mRingtoneTitleCache; // Key: ringtone uri, value: ringtone title
- private ActionableToastBar mUndoBar;
- private View mUndoFrame;
-
- protected Alarm mSelectedAlarm;
- protected long mScrollToAlarmId = INVALID_ID;
-
+ // Data
+ private long mScrollToAlarmId = Alarm.INVALID_ID;
private Loader mCursorLoader = null;
- // Saved states for undo
- private Alarm mDeletedAlarm;
- protected Alarm mAddedAlarm;
- private boolean mUndoShowing;
+ // Controllers
+ private AlarmTimeAdapter mAlarmTimeAdapter;
+ private AlarmUpdateHandler mAlarmUpdateHandler;
+ private EmptyViewController mEmptyViewController;
+ private AlarmTimeClickHandler mAlarmTimeClickHandler;
+ private LinearLayoutManager mLayoutManager;
- private Interpolator mExpandInterpolator;
- private Interpolator mCollapseInterpolator;
-
- private Transition mAddRemoveTransition;
- private Transition mRepeatTransition;
- private Transition mEmptyViewTransition;
-
- // Abstract methods to to be overridden by for post- and pre-L implementations as necessary
- protected abstract void setTimePickerListener();
- protected abstract void showTimeEditDialog(Alarm alarm);
- protected abstract void startCreatingAlarm();
-
- protected void processTimeSet(int hourOfDay, int minute) {
- if (mSelectedAlarm == null) {
- // If mSelectedAlarm is null then we're creating a new alarm.
- Alarm a = new Alarm();
- a.alert = getDefaultRingtoneUri();
- if (a.alert == null) {
- a.alert = Uri.parse("content://settings/system/alarm_alert");
- }
- a.hour = hourOfDay;
- a.minutes = minute;
- a.enabled = true;
-
- mAddedAlarm = a;
- asyncAddAlarm(a);
- } else {
- mSelectedAlarm.hour = hourOfDay;
- mSelectedAlarm.minutes = minute;
- mSelectedAlarm.enabled = true;
- mScrollToAlarmId = mSelectedAlarm.id;
- asyncUpdateAlarm(mSelectedAlarm, true);
- mSelectedAlarm = null;
- }
- }
-
- public AlarmClockFragment() {
- // Basic provider required by Fragment.java
+ @Override
+ public void processTimeSet(int hourOfDay, int minute) {
+ mAlarmTimeClickHandler.processTimeSet(hourOfDay, minute);
}
@Override
@@ -187,106 +84,23 @@
}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedState) {
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
// Inflate the layout for this fragment
final View v = inflater.inflate(R.layout.alarm_clock, container, false);
- long expandedId = INVALID_ID;
- long[] repeatCheckedIds = null;
- long[] selectedAlarms = null;
- Bundle previousDayMap = null;
- if (savedState != null) {
- expandedId = savedState.getLong(KEY_EXPANDED_ID);
- repeatCheckedIds = savedState.getLongArray(KEY_REPEAT_CHECKED_IDS);
- mRingtoneTitleCache = savedState.getBundle(KEY_RINGTONE_TITLE_CACHE);
- mDeletedAlarm = savedState.getParcelable(KEY_DELETED_ALARM);
- mUndoShowing = savedState.getBoolean(KEY_UNDO_SHOWING);
- selectedAlarms = savedState.getLongArray(KEY_SELECTED_ALARMS);
- previousDayMap = savedState.getBundle(KEY_PREVIOUS_DAY_MAP);
- mSelectedAlarm = savedState.getParcelable(KEY_SELECTED_ALARM);
- }
+ mRecyclerView = (RecyclerView) v.findViewById(R.id.alarms_recycler_view);
+ mLayoutManager = new LinearLayoutManager(getActivity());
+ mRecyclerView.setLayoutManager(mLayoutManager);
+ mMainLayout = (ViewGroup) v.findViewById(R.id.main);
+ mAlarmUpdateHandler = new AlarmUpdateHandler(getActivity(), this, mMainLayout);
+ mEmptyViewController = new EmptyViewController(mMainLayout, mRecyclerView,
+ v.findViewById(R.id.alarms_empty_view));
+ mAlarmTimeClickHandler = new AlarmTimeClickHandler(this, savedState, mAlarmUpdateHandler,
+ this);
+ mAlarmTimeAdapter = new AlarmTimeAdapter(getActivity(), savedState,
+ mAlarmTimeClickHandler, this);
+ mRecyclerView.setAdapter(mAlarmTimeAdapter);
- mExpandInterpolator = new DecelerateInterpolator(EXPAND_DECELERATION);
- mCollapseInterpolator = new DecelerateInterpolator(COLLAPSE_DECELERATION);
-
- if (USE_TRANSITION_FRAMEWORK) {
- mAddRemoveTransition = new AutoTransition();
- mAddRemoveTransition.setDuration(ANIMATION_DURATION);
-
- mRepeatTransition = new AutoTransition();
- mRepeatTransition.setDuration(ANIMATION_DURATION / 2);
- mRepeatTransition.setInterpolator(new AccelerateDecelerateInterpolator());
-
- mEmptyViewTransition = new TransitionSet()
- .setOrdering(TransitionSet.ORDERING_SEQUENTIAL)
- .addTransition(new Fade(Fade.OUT))
- .addTransition(new Fade(Fade.IN))
- .setDuration(ANIMATION_DURATION);
- }
-
- boolean isLandscape = getResources().getConfiguration().orientation
- == Configuration.ORIENTATION_LANDSCAPE;
- View menuButton = v.findViewById(R.id.menu_button);
- if (menuButton != null) {
- if (isLandscape) {
- menuButton.setVisibility(View.GONE);
- } else {
- menuButton.setVisibility(View.VISIBLE);
- setupFakeOverflowMenuButton(menuButton);
- }
- }
-
- mEmptyView = v.findViewById(R.id.alarms_empty_view);
-
- mMainLayout = (FrameLayout) v.findViewById(R.id.main);
- mAlarmsList = (ListView) v.findViewById(R.id.alarms_list);
-
- mUndoBar = (ActionableToastBar) v.findViewById(R.id.undo_bar);
- mUndoFrame = v.findViewById(R.id.undo_frame);
- mUndoFrame.setOnTouchListener(this);
-
- mFooterView = v.findViewById(R.id.alarms_footer_view);
- mFooterView.setOnTouchListener(this);
-
- mAdapter = new AlarmItemAdapter(getActivity(),
- expandedId, repeatCheckedIds, selectedAlarms, previousDayMap, mAlarmsList);
- mAdapter.registerDataSetObserver(new DataSetObserver() {
-
- private int prevAdapterCount = -1;
-
- @Override
- public void onChanged() {
-
- final int count = mAdapter.getCount();
- if (mDeletedAlarm != null && prevAdapterCount > count) {
- showUndoBar();
- }
-
- if (USE_TRANSITION_FRAMEWORK &&
- ((count == 0 && prevAdapterCount > 0) || /* should fade in */
- (count > 0 && prevAdapterCount == 0) /* should fade out */)) {
- TransitionManager.beginDelayedTransition(mMainLayout, mEmptyViewTransition);
- }
- mEmptyView.setVisibility(count == 0 ? View.VISIBLE : View.GONE);
-
- // Cache this adapter's count for when the adapter changes.
- prevAdapterCount = count;
- super.onChanged();
- }
- });
-
- if (mRingtoneTitleCache == null) {
- mRingtoneTitleCache = new Bundle();
- }
-
- mAlarmsList.setAdapter(mAdapter);
- mAlarmsList.setVerticalScrollBarEnabled(true);
- mAlarmsList.setOnCreateContextMenuListener(this);
-
- if (mUndoShowing) {
- showUndoBar();
- }
return v;
}
@@ -313,7 +127,7 @@
} else if (intent.hasExtra(SCROLL_TO_ALARM_INTENT_EXTRA)) {
long alarmId = intent.getLongExtra(SCROLL_TO_ALARM_INTENT_EXTRA, Alarm.INVALID_ID);
if (alarmId != Alarm.INVALID_ID) {
- mScrollToAlarmId = alarmId;
+ setSmoothScrollStableId(alarmId);
if (mCursorLoader != null && mCursorLoader.isStarted()) {
// We need to force a reload here to make sure we have the latest view
// of the data to scroll to.
@@ -324,55 +138,24 @@
// Remove the SCROLL_TO_ALARM extra now that we've processed it.
intent.removeExtra(SCROLL_TO_ALARM_INTENT_EXTRA);
}
-
- setTimePickerListener();
}
- private void hideUndoBar(boolean animate, MotionEvent event) {
- if (mUndoBar != null) {
- mUndoFrame.setVisibility(View.GONE);
- if (event != null && mUndoBar.isEventInToastBar(event)) {
- // Avoid touches inside the undo bar.
- return;
- }
- mUndoBar.hide(animate);
- }
- mDeletedAlarm = null;
- mUndoShowing = false;
- }
-
- private void showUndoBar() {
- final Alarm deletedAlarm = mDeletedAlarm;
- mUndoFrame.setVisibility(View.VISIBLE);
- mUndoBar.show(new ActionableToastBar.ActionClickedListener() {
- @Override
- public void onActionClicked() {
- mAddedAlarm = deletedAlarm;
- mDeletedAlarm = null;
- mUndoShowing = false;
-
- asyncAddAlarm(deletedAlarm);
- }
- }, 0, getResources().getString(R.string.alarm_deleted), true, R.string.alarm_undo, true);
+ @Override
+ public void smoothScrollTo(int position) {
+ mLayoutManager.scrollToPositionWithOffset(position, 20);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- outState.putLong(KEY_EXPANDED_ID, mAdapter.getExpandedId());
- outState.putLongArray(KEY_REPEAT_CHECKED_IDS, mAdapter.getRepeatArray());
- outState.putLongArray(KEY_SELECTED_ALARMS, mAdapter.getSelectedAlarmsArray());
- outState.putBundle(KEY_RINGTONE_TITLE_CACHE, mRingtoneTitleCache);
- outState.putParcelable(KEY_DELETED_ALARM, mDeletedAlarm);
- outState.putBoolean(KEY_UNDO_SHOWING, mUndoShowing);
- outState.putBundle(KEY_PREVIOUS_DAY_MAP, mAdapter.getPreviousDaysOfWeekMap());
- outState.putParcelable(KEY_SELECTED_ALARM, mSelectedAlarm);
+ mAlarmTimeAdapter.saveInstance(outState);
+ mAlarmTimeClickHandler.saveInstance(outState);
}
@Override
public void onDestroy() {
super.onDestroy();
- ToastMaster.cancelToast();
+ ToastManager.cancelToast();
}
@Override
@@ -382,26 +165,12 @@
// dismiss the toast bar. However, since there is no way to determine if
// home was pressed, just dismiss any existing toast bar when restarting
// the app.
- hideUndoBar(false, null);
- }
-
- private void showLabelDialog(final Alarm alarm) {
- final FragmentTransaction ft = getFragmentManager().beginTransaction();
- final Fragment prev = getFragmentManager().findFragmentByTag("label_dialog");
- if (prev != null) {
- ft.remove(prev);
- }
- ft.addToBackStack(null);
-
- // Create and show the dialog.
- final LabelDialogFragment newFragment =
- LabelDialogFragment.newInstance(alarm, alarm.label, getTag());
- newFragment.show(ft, "label_dialog");
+ mAlarmUpdateHandler.hideUndoBar();
}
public void setLabel(Alarm alarm, String label) {
alarm.label = label;
- asyncUpdateAlarm(alarm, false);
+ mAlarmUpdateHandler.asyncUpdateAlarm(alarm, false, true);
}
@Override
@@ -411,10 +180,11 @@
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, final Cursor data) {
- mAdapter.swapCursor(data);
- if (mScrollToAlarmId != INVALID_ID) {
+ mEmptyViewController.setEmpty(data.getCount() == 0);
+ mAlarmTimeAdapter.swapCursor(data);
+ if (mScrollToAlarmId != Alarm.INVALID_ID) {
scrollToAlarm(mScrollToAlarmId);
- mScrollToAlarmId = INVALID_ID;
+ setSmoothScrollStableId(Alarm.INVALID_ID);
}
}
@@ -424,9 +194,10 @@
* @param alarmId The alarm id to scroll to.
*/
private void scrollToAlarm(long alarmId) {
+ final int alarmCount = mAlarmTimeAdapter.getItemCount();
int alarmPosition = -1;
- for (int i = 0; i < mAdapter.getCount(); i++) {
- long id = mAdapter.getItemId(i);
+ for (int i = 0; i < alarmCount; i++) {
+ long id = mAlarmTimeAdapter.getItemId(i);
if (id == alarmId) {
alarmPosition = i;
break;
@@ -434,1118 +205,88 @@
}
if (alarmPosition >= 0) {
- mAdapter.setNewAlarm(alarmId);
- mAlarmsList.smoothScrollToPositionFromTop(alarmPosition, 0);
+ mAlarmTimeAdapter.expand(alarmPosition);
} else {
// Trying to display a deleted alarm should only happen from a missed notification for
// an alarm that has been marked deleted after use.
- Context context = getActivity().getApplicationContext();
- Toast toast = Toast.makeText(context, R.string.missed_alarm_has_been_deleted,
- Toast.LENGTH_LONG);
- ToastMaster.setToast(toast);
- toast.show();
+ SnackbarManager.show(Snackbar.make(mMainLayout, R.string
+ .missed_alarm_has_been_deleted, Snackbar.LENGTH_LONG));
}
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
- mAdapter.swapCursor(null);
- }
-
- private void launchRingTonePicker(Alarm alarm) {
- mSelectedAlarm = alarm;
- Uri oldRingtone = Alarm.NO_RINGTONE_URI.equals(alarm.alert) ? null : alarm.alert;
- final Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, oldRingtone);
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM);
- intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false);
- startActivityForResult(intent, REQUEST_CODE_RINGTONE);
- }
-
- private void saveRingtoneUri(Intent intent) {
- Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
- if (uri == null) {
- uri = Alarm.NO_RINGTONE_URI;
- }
- mSelectedAlarm.alert = uri;
-
- // Save the last selected ringtone as the default for new alarms
- setDefaultRingtoneUri(uri);
-
- asyncUpdateAlarm(mSelectedAlarm, false);
-
- // If the user chose an external ringtone and has not yet granted the permission to read
- // external storage, ask them for that permission now.
- if (!AlarmUtils.hasPermissionToDisplayRingtoneTitle(getActivity(), uri)) {
- final String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE};
- requestPermissions(perms, REQUEST_CODE_PERMISSIONS);
- }
- }
-
- private Uri getDefaultRingtoneUri() {
- final SharedPreferences sp = Utils.getDefaultSharedPreferences(getActivity());
- final String ringtoneUriString = sp.getString(PREF_KEY_DEFAULT_ALARM_RINGTONE_URI, null);
-
- final Uri ringtoneUri;
- if (ringtoneUriString != null) {
- ringtoneUri = Uri.parse(ringtoneUriString);
- } else {
- ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(getActivity(),
- RingtoneManager.TYPE_ALARM);
- }
-
- return ringtoneUri;
- }
-
- private void setDefaultRingtoneUri(Uri uri) {
- final SharedPreferences sp = Utils.getDefaultSharedPreferences(getActivity());
- if (uri == null) {
- sp.edit().remove(PREF_KEY_DEFAULT_ALARM_RINGTONE_URI).apply();
- } else {
- sp.edit().putString(PREF_KEY_DEFAULT_ALARM_RINGTONE_URI, uri.toString()).apply();
- }
+ mAlarmTimeAdapter.swapCursor(null);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (resultCode == Activity.RESULT_OK) {
- switch (requestCode) {
- case REQUEST_CODE_RINGTONE:
- saveRingtoneUri(data);
- break;
- default:
- LogUtils.w("Unhandled request code in onActivityResult: " + requestCode);
- }
+ if (resultCode != Activity.RESULT_OK) {
+ return;
+ }
+
+ switch (requestCode) {
+ case R.id.request_code_ringtone:
+ // Extract the selected ringtone uri.
+ Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
+ if (uri == null) {
+ uri = Alarm.NO_RINGTONE_URI;
+ }
+
+ // Update the default ringtone for future new alarms.
+ DataModel.getDataModel().setDefaultAlarmRingtoneUri(uri);
+
+ // Set the ringtone uri on the alarm.
+ final Alarm alarm = mAlarmTimeClickHandler.getSelectedAlarm();
+ if (alarm == null) {
+ LogUtils.e("Could not get selected alarm to set ringtone");
+ return;
+ }
+ alarm.alert = uri;
+
+ // Save the change to alarm.
+ mAlarmUpdateHandler.asyncUpdateAlarm(alarm, false /* popToast */,
+ true /* minorUpdate */);
+ break;
+ default:
+ LogUtils.w("Unhandled request code in onActivityResult: " + requestCode);
}
}
@Override
- public void onRequestPermissionsResult(int requestCode, String[] permissions,
- int[] grantResults) {
- // The permission change may alter the cached ringtone titles so clear them.
- // (e.g. READ_EXTERNAL_STORAGE is granted or revoked)
- mRingtoneTitleCache.clear();
- }
-
- private class AlarmItemAdapter extends CursorAdapter {
- private final Context mContext;
- private final LayoutInflater mFactory;
- private final Typeface mRobotoNormal;
- private final ListView mList;
-
- private long mExpandedId;
- private ItemHolder mExpandedItemHolder;
- private final HashSet<Long> mRepeatChecked = new HashSet<>();
- private final HashSet<Long> mSelectedAlarms = new HashSet<>();
- private Bundle mPreviousDaysOfWeekMap = new Bundle();
-
- private final boolean mHasVibrator;
- private final int mCollapseExpandHeight;
-
- // Determines the order that days of the week are shown in the UI
- private int[] mDayOrder;
-
- // A reference used to create mDayOrder
- private final int[] DAY_ORDER = new int[] {
- Calendar.SUNDAY,
- Calendar.MONDAY,
- Calendar.TUESDAY,
- Calendar.WEDNESDAY,
- Calendar.THURSDAY,
- Calendar.FRIDAY,
- Calendar.SATURDAY,
- };
-
- public class ItemHolder {
-
- // views for optimization
- LinearLayout alarmItem;
- TextTime clock;
- TextView tomorrowLabel;
- CompoundButton onoff;
- TextView daysOfWeek;
- TextView label;
- ImageButton delete;
- View expandArea;
- View summary;
- TextView clickableLabel;
- CheckBox repeat;
- LinearLayout repeatDays;
- CompoundButton[] dayButtons = new CompoundButton[7];
- CheckBox vibrate;
- TextView ringtone;
- View hairLine;
- View arrow;
- View collapseExpandArea;
-
- // Other states
- Alarm alarm;
- }
-
- // Used for scrolling an expanded item in the list to make sure it is fully visible.
- private long mScrollAlarmId = AlarmClockFragment.INVALID_ID;
- private final Runnable mScrollRunnable = new Runnable() {
- @Override
- public void run() {
- if (mScrollAlarmId != AlarmClockFragment.INVALID_ID) {
- View v = getViewById(mScrollAlarmId);
- if (v != null) {
- Rect rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
- mList.requestChildRectangleOnScreen(v, rect, false);
- }
- mScrollAlarmId = AlarmClockFragment.INVALID_ID;
- }
- }
- };
-
- public AlarmItemAdapter(Context context, long expandedId, long[] repeatCheckedIds,
- long[] selectedAlarms, Bundle previousDaysOfWeekMap, ListView list) {
- super(context, null, 0);
- mContext = context;
- mFactory = LayoutInflater.from(context);
- mList = list;
-
- Resources res = mContext.getResources();
-
- mRobotoNormal = Typeface.create("sans-serif", Typeface.NORMAL);
-
- mExpandedId = expandedId;
- if (repeatCheckedIds != null) {
- buildHashSetFromArray(repeatCheckedIds, mRepeatChecked);
- }
- if (previousDaysOfWeekMap != null) {
- mPreviousDaysOfWeekMap = previousDaysOfWeekMap;
- }
- if (selectedAlarms != null) {
- buildHashSetFromArray(selectedAlarms, mSelectedAlarms);
- }
-
- mHasVibrator = ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE))
- .hasVibrator();
-
- mCollapseExpandHeight = (int) res.getDimension(R.dimen.collapse_expand_height);
-
- setDayOrder();
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if (!getCursor().moveToPosition(position)) {
- // May happen if the last alarm was deleted and the cursor refreshed while the
- // list is updated.
- LogUtils.v("couldn't move cursor to position " + position);
- return null;
- }
- View v;
- if (convertView == null) {
- v = newView(mContext, getCursor(), parent);
- } else {
- v = convertView;
- }
- bindView(v, mContext, getCursor());
- return v;
- }
-
- @Override
- public View newView(Context context, Cursor cursor, ViewGroup parent) {
- final View view = mFactory.inflate(R.layout.alarm_time, parent, false);
- setNewHolder(view);
- return view;
- }
-
- /**
- * In addition to changing the data set for the alarm list, swapCursor is now also
- * responsible for preparing the transition for any added/removed items.
- */
- @Override
- public synchronized Cursor swapCursor(Cursor cursor) {
- if (USE_TRANSITION_FRAMEWORK && (mAddedAlarm != null || mDeletedAlarm != null)) {
- TransitionManager.beginDelayedTransition(mAlarmsList, mAddRemoveTransition);
- }
-
- final Cursor c = super.swapCursor(cursor);
-
- mAddedAlarm = null;
- mDeletedAlarm = null;
-
- return c;
- }
-
- private void setDayOrder() {
- // Value from preferences corresponds to Calendar.<WEEKDAY> value
- // -1 in order to correspond to DAY_ORDER indexing
- final int startDay = Utils.getZeroIndexedFirstDayOfWeek(mContext);
- mDayOrder = new int[DaysOfWeek.DAYS_IN_A_WEEK];
-
- for (int i = 0; i < DaysOfWeek.DAYS_IN_A_WEEK; ++i) {
- mDayOrder[i] = DAY_ORDER[(startDay + i) % 7];
- }
- }
-
- private ItemHolder setNewHolder(View view) {
- // standard view holder optimization
- final ItemHolder holder = new ItemHolder();
- holder.alarmItem = (LinearLayout) view.findViewById(R.id.alarm_item);
- holder.tomorrowLabel = (TextView) view.findViewById(R.id.tomorrowLabel);
- holder.clock = (TextTime) view.findViewById(R.id.digital_clock);
- holder.onoff = (CompoundButton) view.findViewById(R.id.onoff);
- holder.onoff.setTypeface(mRobotoNormal);
- holder.daysOfWeek = (TextView) view.findViewById(R.id.daysOfWeek);
- holder.label = (TextView) view.findViewById(R.id.label);
- holder.delete = (ImageButton) view.findViewById(R.id.delete);
- holder.summary = view.findViewById(R.id.summary);
- holder.expandArea = view.findViewById(R.id.expand_area);
- holder.hairLine = view.findViewById(R.id.hairline);
- holder.arrow = view.findViewById(R.id.arrow);
- holder.repeat = (CheckBox) view.findViewById(R.id.repeat_onoff);
- holder.clickableLabel = (TextView) view.findViewById(R.id.edit_label);
- holder.repeatDays = (LinearLayout) view.findViewById(R.id.repeat_days);
- holder.collapseExpandArea = view.findViewById(R.id.collapse_expand);
-
- // Build button for each day.
- for (int i = 0; i < 7; i++) {
- final CompoundButton dayButton = (CompoundButton) mFactory.inflate(
- R.layout.day_button, holder.repeatDays, false /* attachToRoot */);
- final int firstDay = Utils.getZeroIndexedFirstDayOfWeek(mContext);
- dayButton.setText(Utils.getShortWeekday(i, firstDay));
- dayButton.setContentDescription(Utils.getLongWeekday(i, firstDay));
- holder.repeatDays.addView(dayButton);
- holder.dayButtons[i] = dayButton;
- }
- holder.vibrate = (CheckBox) view.findViewById(R.id.vibrate_onoff);
- holder.ringtone = (TextView) view.findViewById(R.id.choose_ringtone);
-
- view.setTag(holder);
- return holder;
- }
-
- @Override
- public void bindView(final View view, Context context, final Cursor cursor) {
- final Alarm alarm = new Alarm(cursor);
- Object tag = view.getTag();
- if (tag == null) {
- // The view was converted but somehow lost its tag.
- tag = setNewHolder(view);
- }
- final ItemHolder itemHolder = (ItemHolder) tag;
- itemHolder.alarm = alarm;
-
- // We must unset the listener first because this maybe a recycled view so changing the
- // state would affect the wrong alarm.
- itemHolder.onoff.setOnCheckedChangeListener(null);
-
- // Hack to workaround b/21459481: the SwitchCompat instance must be detached from
- // its parent in order to avoid running the checked animation, which may get stuck
- // when ListView calls View#jumpDrawablesToCurrentState() on a recycled view.
- if (itemHolder.onoff.isChecked() != alarm.enabled) {
- final ViewGroup onoffParent = (ViewGroup) itemHolder.onoff.getParent();
- final int onoffIndex = onoffParent.indexOfChild(itemHolder.onoff);
-
- onoffParent.removeView(itemHolder.onoff);
- itemHolder.onoff.setChecked(alarm.enabled);
- onoffParent.addView(itemHolder.onoff, onoffIndex);
- }
-
- if (mSelectedAlarms.contains(itemHolder.alarm.id)) {
- setAlarmItemBackgroundAndElevation(itemHolder.alarmItem, true /* expanded */);
- setDigitalTimeAlpha(itemHolder, true);
- itemHolder.onoff.setEnabled(false);
- } else {
- itemHolder.onoff.setEnabled(true);
- setAlarmItemBackgroundAndElevation(itemHolder.alarmItem, false /* expanded */);
- setDigitalTimeAlpha(itemHolder, itemHolder.onoff.isChecked());
- }
- itemHolder.clock.setFormat(mContext,
- mContext.getResources().getDimensionPixelSize(R.dimen.alarm_label_size));
- itemHolder.clock.setTime(alarm.hour, alarm.minutes);
- itemHolder.clock.setClickable(true);
- itemHolder.clock.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- mSelectedAlarm = itemHolder.alarm;
- showTimeEditDialog(alarm);
- expandAlarm(itemHolder, true);
- itemHolder.alarmItem.post(mScrollRunnable);
- }
- });
-
- final CompoundButton.OnCheckedChangeListener onOffListener =
- new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
- if (checked != alarm.enabled) {
- if (!isAlarmExpanded(alarm)) {
- // Only toggle this when alarm is collapsed
- setDigitalTimeAlpha(itemHolder, checked);
- }
- alarm.enabled = checked;
- asyncUpdateAlarm(alarm, alarm.enabled);
- }
- }
- };
-
- if (mRepeatChecked.contains(alarm.id) || itemHolder.alarm.daysOfWeek.isRepeating()) {
- itemHolder.tomorrowLabel.setVisibility(View.GONE);
- } else {
- itemHolder.tomorrowLabel.setVisibility(View.VISIBLE);
- final Resources resources = getResources();
- final String labelText = Alarm.isTomorrow(alarm) ?
- resources.getString(R.string.alarm_tomorrow) :
- resources.getString(R.string.alarm_today);
- itemHolder.tomorrowLabel.setText(labelText);
- }
- itemHolder.onoff.setOnCheckedChangeListener(onOffListener);
-
- boolean expanded = isAlarmExpanded(alarm);
- if (expanded) {
- mExpandedItemHolder = itemHolder;
- }
- itemHolder.expandArea.setVisibility(expanded? View.VISIBLE : View.GONE);
- itemHolder.delete.setVisibility(expanded ? View.VISIBLE : View.GONE);
- itemHolder.summary.setVisibility(expanded? View.GONE : View.VISIBLE);
- itemHolder.hairLine.setVisibility(expanded ? View.GONE : View.VISIBLE);
- itemHolder.arrow.setRotation(expanded ? ROTATE_180_DEGREE : 0);
-
- // Add listener on the arrow to enable proper talkback functionality.
- // Avoid setting content description on the entire card.
- itemHolder.arrow.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- if (isAlarmExpanded(alarm)) {
- // Is expanded, make collapse call.
- collapseAlarm(itemHolder, true);
- } else {
- // Is collapsed, make expand call.
- expandAlarm(itemHolder, true);
- }
- }
- });
-
- // Set the repeat text or leave it blank if it does not repeat.
- final String daysOfWeekStr =
- alarm.daysOfWeek.toString(context, Utils.getFirstDayOfWeek(context));
- if (daysOfWeekStr != null && daysOfWeekStr.length() != 0) {
- itemHolder.daysOfWeek.setText(daysOfWeekStr);
- itemHolder.daysOfWeek.setContentDescription(alarm.daysOfWeek.toAccessibilityString(
- context, Utils.getFirstDayOfWeek(context)));
- itemHolder.daysOfWeek.setVisibility(View.VISIBLE);
- itemHolder.daysOfWeek.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- expandAlarm(itemHolder, true);
- itemHolder.alarmItem.post(mScrollRunnable);
- }
- });
-
- } else {
- itemHolder.daysOfWeek.setVisibility(View.GONE);
- }
-
- if (alarm.label != null && alarm.label.length() != 0) {
- itemHolder.label.setText(alarm.label + " ");
- itemHolder.label.setVisibility(View.VISIBLE);
- itemHolder.label.setContentDescription(
- mContext.getResources().getString(R.string.label_description) + " "
- + alarm.label);
- itemHolder.label.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- expandAlarm(itemHolder, true);
- itemHolder.alarmItem.post(mScrollRunnable);
- }
- });
- } else {
- itemHolder.label.setVisibility(View.GONE);
- }
-
- itemHolder.delete.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mDeletedAlarm = alarm;
- mRepeatChecked.remove(alarm.id);
- asyncDeleteAlarm(alarm);
- }
- });
-
- if (expanded) {
- expandAlarm(itemHolder, false);
- }
-
- itemHolder.alarmItem.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- if (isAlarmExpanded(alarm)) {
- collapseAlarm(itemHolder, true);
- } else {
- expandAlarm(itemHolder, true);
- }
- }
- });
- }
-
- private void setAlarmItemBackgroundAndElevation(LinearLayout layout, boolean expanded) {
- if (expanded) {
- layout.setBackgroundColor(getTintedBackgroundColor());
- ViewCompat.setElevation(layout, ALARM_ELEVATION);
- } else {
- layout.setBackgroundResource(R.drawable.alarm_background_normal);
- ViewCompat.setElevation(layout, 0f);
- }
- }
-
- private int getTintedBackgroundColor() {
- final int c = Utils.getCurrentHourColor();
- final int red = Color.red(c) + (int) (TINTED_LEVEL * (255 - Color.red(c)));
- final int green = Color.green(c) + (int) (TINTED_LEVEL * (255 - Color.green(c)));
- final int blue = Color.blue(c) + (int) (TINTED_LEVEL * (255 - Color.blue(c)));
- return Color.rgb(red, green, blue);
- }
-
- private void bindExpandArea(final ItemHolder itemHolder, final Alarm alarm) {
- // Views in here are not bound until the item is expanded.
-
- if (alarm.label != null && alarm.label.length() > 0) {
- itemHolder.clickableLabel.setText(alarm.label);
- } else {
- itemHolder.clickableLabel.setText(R.string.label);
- }
-
- itemHolder.clickableLabel.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- showLabelDialog(alarm);
- }
- });
-
- if (mRepeatChecked.contains(alarm.id) || itemHolder.alarm.daysOfWeek.isRepeating()) {
- itemHolder.repeat.setChecked(true);
- itemHolder.repeatDays.setVisibility(View.VISIBLE);
- } else {
- itemHolder.repeat.setChecked(false);
- itemHolder.repeatDays.setVisibility(View.GONE);
- }
- itemHolder.repeat.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- // Animate the resulting layout changes.
- if (USE_TRANSITION_FRAMEWORK) {
- TransitionManager.beginDelayedTransition(mList, mRepeatTransition);
- }
-
- final Calendar now = Calendar.getInstance();
- final Calendar oldNextAlarmTime = alarm.getNextAlarmTime(now);
-
- final boolean checked = ((CheckBox) view).isChecked();
- if (checked) {
- // Show days
- itemHolder.repeatDays.setVisibility(View.VISIBLE);
- mRepeatChecked.add(alarm.id);
-
- // Set all previously set days
- // or
- // Set all days if no previous.
- final int bitSet = mPreviousDaysOfWeekMap.getInt("" + alarm.id);
- alarm.daysOfWeek.setBitSet(bitSet);
- if (!alarm.daysOfWeek.isRepeating()) {
- alarm.daysOfWeek.setDaysOfWeek(true, mDayOrder);
- }
- updateDaysOfWeekButtons(itemHolder, alarm.daysOfWeek);
- } else {
- // Hide days
- itemHolder.repeatDays.setVisibility(View.GONE);
- mRepeatChecked.remove(alarm.id);
-
- // Remember the set days in case the user wants it back.
- final int bitSet = alarm.daysOfWeek.getBitSet();
- mPreviousDaysOfWeekMap.putInt("" + alarm.id, bitSet);
-
- // Remove all repeat days
- alarm.daysOfWeek.clearAllDays();
- }
-
- // if the change altered the next scheduled alarm time, tell the user
- final Calendar newNextAlarmTime = alarm.getNextAlarmTime(now);
- final boolean popupToast = !oldNextAlarmTime.equals(newNextAlarmTime);
-
- asyncUpdateAlarm(alarm, popupToast);
- }
- });
-
- updateDaysOfWeekButtons(itemHolder, alarm.daysOfWeek);
- for (int i = 0; i < 7; i++) {
- final int buttonIndex = i;
-
- itemHolder.dayButtons[i].setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- final boolean isActivated =
- itemHolder.dayButtons[buttonIndex].isActivated();
-
- final Calendar now = Calendar.getInstance();
- final Calendar oldNextAlarmTime = alarm.getNextAlarmTime(now);
- alarm.daysOfWeek.setDaysOfWeek(!isActivated, mDayOrder[buttonIndex]);
-
- if (!isActivated) {
- turnOnDayOfWeek(itemHolder, buttonIndex);
- } else {
- turnOffDayOfWeek(itemHolder, buttonIndex);
-
- // See if this was the last day, if so, un-check the repeat box.
- if (!alarm.daysOfWeek.isRepeating()) {
- if (USE_TRANSITION_FRAMEWORK) {
- // Animate the resulting layout changes.
- TransitionManager.beginDelayedTransition(mList, mRepeatTransition);
- }
-
- itemHolder.repeat.setChecked(false);
- itemHolder.repeatDays.setVisibility(View.GONE);
- mRepeatChecked.remove(alarm.id);
-
- // Set history to no days, so it will be everyday when repeat is
- // turned back on
- mPreviousDaysOfWeekMap.putInt("" + alarm.id,
- DaysOfWeek.NO_DAYS_SET);
- }
- }
-
- // if the change altered the next scheduled alarm time, tell the user
- final Calendar newNextAlarmTime = alarm.getNextAlarmTime(now);
- final boolean popupToast = !oldNextAlarmTime.equals(newNextAlarmTime);
-
- asyncUpdateAlarm(alarm, popupToast);
- }
- });
- }
-
- if (!mHasVibrator) {
- itemHolder.vibrate.setVisibility(View.INVISIBLE);
- } else {
- itemHolder.vibrate.setVisibility(View.VISIBLE);
- if (!alarm.vibrate) {
- itemHolder.vibrate.setChecked(false);
- } else {
- itemHolder.vibrate.setChecked(true);
- }
- }
-
- itemHolder.vibrate.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- alarm.vibrate = ((CheckBox) v).isChecked();
- asyncUpdateAlarm(alarm, false);
- }
- });
-
- final String ringtone;
- if (Alarm.NO_RINGTONE_URI.equals(alarm.alert)) {
- ringtone = mContext.getResources().getString(R.string.silent_alarm_summary);
- } else {
- ringtone = getRingToneTitle(alarm.alert);
- }
- itemHolder.ringtone.setText(ringtone);
- itemHolder.ringtone.setContentDescription(
- mContext.getResources().getString(R.string.ringtone_description) + " "
- + ringtone);
- itemHolder.ringtone.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- launchRingTonePicker(alarm);
- }
- });
- }
-
- // Sets the alpha of the digital time display. This gives a visual effect
- // for enabled/disabled and expanded/collapsed alarm while leaving the
- // on/off switch more visible
- private void setDigitalTimeAlpha(ItemHolder holder, boolean enabled) {
- float alpha = enabled ? 1f : 0.69f;
- holder.clock.setAlpha(alpha);
- }
-
- private void updateDaysOfWeekButtons(ItemHolder holder, DaysOfWeek daysOfWeek) {
- HashSet<Integer> setDays = daysOfWeek.getSetDays();
- for (int i = 0; i < 7; i++) {
- if (setDays.contains(mDayOrder[i])) {
- turnOnDayOfWeek(holder, i);
- } else {
- turnOffDayOfWeek(holder, i);
- }
- }
- }
-
- private void turnOffDayOfWeek(ItemHolder holder, int dayIndex) {
- final CompoundButton dayButton = holder.dayButtons[dayIndex];
- dayButton.setActivated(false);
- dayButton.setChecked(false);
- dayButton.setTextColor(getResources().getColor(R.color.clock_white));
- }
-
- private void turnOnDayOfWeek(ItemHolder holder, int dayIndex) {
- final CompoundButton dayButton = holder.dayButtons[dayIndex];
- dayButton.setActivated(true);
- dayButton.setChecked(true);
- dayButton.setTextColor(Utils.getCurrentHourColor());
- }
-
-
- /**
- * Does a read-through cache for ringtone titles.
- *
- * @param uri The uri of the ringtone.
- * @return The ringtone title. {@literal null} if no matching ringtone found.
- */
- private String getRingToneTitle(Uri uri) {
- // Try the cache first
- String title = mRingtoneTitleCache.getString(uri.toString());
- if (title == null) {
- // If the user cannot read the ringtone file, insert our own name rather than the
- // ugly one returned by Ringtone.getTitle().
- if (!AlarmUtils.hasPermissionToDisplayRingtoneTitle(mContext, uri)) {
- title = getString(R.string.custom_ringtone);
- } else {
- // This is slow because a media player is created during Ringtone object creation.
- final Ringtone ringTone = RingtoneManager.getRingtone(mContext, uri);
- if (ringTone == null) {
- LogUtils.i("No ringtone for uri %s", uri.toString());
- return null;
- }
- title = ringTone.getTitle(mContext);
- }
-
- if (title != null) {
- mRingtoneTitleCache.putString(uri.toString(), title);
- }
- }
- return title;
- }
-
- public void setNewAlarm(long alarmId) {
- if (mExpandedId != alarmId) {
- if (mExpandedItemHolder != null) {
- collapseAlarm(mExpandedItemHolder, true);
- }
- mExpandedId = alarmId;
- }
- }
-
- /**
- * Expands the alarm for editing.
- *
- * @param itemHolder The item holder instance.
- */
- private void expandAlarm(final ItemHolder itemHolder, boolean animate) {
- // Skip animation later if item is already expanded
- animate &= mExpandedId != itemHolder.alarm.id;
-
- if (mExpandedItemHolder != null
- && mExpandedItemHolder != itemHolder
- && mExpandedId != itemHolder.alarm.id) {
- // Only allow one alarm to expand at a time.
- collapseAlarm(mExpandedItemHolder, animate);
- }
-
- bindExpandArea(itemHolder, itemHolder.alarm);
-
- mExpandedId = itemHolder.alarm.id;
- mExpandedItemHolder = itemHolder;
-
- // Scroll the view to make sure it is fully viewed
- mScrollAlarmId = itemHolder.alarm.id;
-
- // Save the starting height so we can animate from this value.
- final int startingHeight = itemHolder.alarmItem.getHeight();
-
- // Set the expand area to visible so we can measure the height to animate to.
- setAlarmItemBackgroundAndElevation(itemHolder.alarmItem, true /* expanded */);
- itemHolder.expandArea.setVisibility(View.VISIBLE);
- itemHolder.delete.setVisibility(View.VISIBLE);
- // Show digital time in full-opaque when expanded, even when alarm is disabled
- setDigitalTimeAlpha(itemHolder, true /* enabled */);
-
- itemHolder.arrow.setContentDescription(getString(R.string.collapse_alarm));
-
- if (!animate) {
- // Set the "end" layout and don't do the animation.
- itemHolder.arrow.setRotation(ROTATE_180_DEGREE);
- itemHolder.summary.setVisibility(View.GONE);
- itemHolder.hairLine.setVisibility(View.GONE);
- itemHolder.delete.setVisibility(View.VISIBLE);
- return;
- }
-
- // Mark the alarmItem as having transient state to prevent it from being recycled
- // while it is animating.
- itemHolder.alarmItem.setHasTransientState(true);
-
- // Add an onPreDrawListener, which gets called after measurement but before the draw.
- // This way we can check the height we need to animate to before any drawing.
- // Note the series of events:
- // * expandArea is set to VISIBLE, which causes a layout pass
- // * the view is measured, and our onPreDrawListener is called
- // * we set up the animation using the start and end values.
- // * the height is set back to the starting point so it can be animated down.
- // * request another layout pass.
- // * return false so that onDraw() is not called for the single frame before
- // the animations have started.
- final ViewTreeObserver observer = mAlarmsList.getViewTreeObserver();
- observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
- @Override
- public boolean onPreDraw() {
- // We don't want to continue getting called for every listview drawing.
- if (observer.isAlive()) {
- observer.removeOnPreDrawListener(this);
- }
- // Calculate some values to help with the animation.
- final int endingHeight = itemHolder.alarmItem.getHeight();
- final int distance = endingHeight - startingHeight;
- final int collapseHeight = itemHolder.collapseExpandArea.getHeight();
-
- // Set the height back to the start state of the animation.
- itemHolder.alarmItem.getLayoutParams().height = startingHeight;
- // To allow the expandArea to glide in with the expansion animation, set a
- // negative top margin, which will animate down to a margin of 0 as the height
- // is increased.
- // Note that we need to maintain the bottom margin as a fixed value (instead of
- // just using a listview, to allow for a flatter hierarchy) to fit the bottom
- // bar underneath.
- FrameLayout.LayoutParams expandParams = (FrameLayout.LayoutParams)
- itemHolder.expandArea.getLayoutParams();
- expandParams.setMargins(0, -distance, 0, collapseHeight);
- itemHolder.alarmItem.requestLayout();
-
- // Set up the animator to animate the expansion.
- ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f)
- .setDuration(EXPAND_DURATION);
- animator.setInterpolator(mExpandInterpolator);
- animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animator) {
- Float value = (Float) animator.getAnimatedValue();
-
- // For each value from 0 to 1, animate the various parts of the layout.
- itemHolder.alarmItem.getLayoutParams().height =
- (int) (value * distance + startingHeight);
- FrameLayout.LayoutParams expandParams = (FrameLayout.LayoutParams)
- itemHolder.expandArea.getLayoutParams();
- expandParams.setMargins(
- 0, (int) -((1 - value) * distance), 0, collapseHeight);
- itemHolder.arrow.setRotation(ROTATE_180_DEGREE * value);
- itemHolder.summary.setAlpha(1 - value);
- itemHolder.hairLine.setAlpha(1 - value);
-
- itemHolder.alarmItem.requestLayout();
- }
- });
- // Set everything to their final values when the animation's done.
- animator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- // Set it back to wrap content since we'd explicitly set the height.
- itemHolder.alarmItem.getLayoutParams().height =
- LayoutParams.WRAP_CONTENT;
- itemHolder.arrow.setRotation(ROTATE_180_DEGREE);
- itemHolder.summary.setAlpha(1);
- itemHolder.hairLine.setAlpha(1);
- itemHolder.summary.setVisibility(View.GONE);
- itemHolder.hairLine.setVisibility(View.GONE);
- itemHolder.delete.setVisibility(View.VISIBLE);
- itemHolder.alarmItem.setHasTransientState(false);
- }
- });
- animator.start();
-
- // Return false so this draw does not occur to prevent the final frame from
- // being drawn for the single frame before the animations start.
- return false;
- }
- });
- }
-
- private boolean isAlarmExpanded(Alarm alarm) {
- return mExpandedId == alarm.id;
- }
-
- private void collapseAlarm(final ItemHolder itemHolder, boolean animate) {
- mExpandedId = AlarmClockFragment.INVALID_ID;
- mExpandedItemHolder = null;
-
- // Save the starting height so we can animate from this value.
- final int startingHeight = itemHolder.alarmItem.getHeight();
-
- // Set the expand area to gone so we can measure the height to animate to.
- setAlarmItemBackgroundAndElevation(itemHolder.alarmItem, false /* expanded */);
- itemHolder.expandArea.setVisibility(View.GONE);
- setDigitalTimeAlpha(itemHolder, itemHolder.onoff.isChecked());
-
- itemHolder.arrow.setContentDescription(getString(R.string.expand_alarm));
-
- if (!animate) {
- // Set the "end" layout and don't do the animation.
- itemHolder.arrow.setRotation(0);
- itemHolder.hairLine.setTranslationY(0);
- itemHolder.hairLine.setVisibility(View.VISIBLE);
- itemHolder.summary.setAlpha(1);
- itemHolder.summary.setVisibility(View.VISIBLE);
- return;
- }
-
- // Mark the alarmItem as having transient state to prevent it from being recycled
- // while it is animating.
- itemHolder.alarmItem.setHasTransientState(true);
-
- // Add an onPreDrawListener, which gets called after measurement but before the draw.
- // This way we can check the height we need to animate to before any drawing.
- // Note the series of events:
- // * expandArea is set to GONE, which causes a layout pass
- // * the view is measured, and our onPreDrawListener is called
- // * we set up the animation using the start and end values.
- // * expandArea is set to VISIBLE again so it can be shown animating.
- // * request another layout pass.
- // * return false so that onDraw() is not called for the single frame before
- // the animations have started.
- final ViewTreeObserver observer = mAlarmsList.getViewTreeObserver();
- observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
- @Override
- public boolean onPreDraw() {
- if (observer.isAlive()) {
- observer.removeOnPreDrawListener(this);
- }
-
- // Calculate some values to help with the animation.
- final int endingHeight = itemHolder.alarmItem.getHeight();
- final int distance = endingHeight - startingHeight;
-
- // Re-set the visibilities for the start state of the animation.
- itemHolder.expandArea.setVisibility(View.VISIBLE);
- itemHolder.delete.setVisibility(View.GONE);
- itemHolder.summary.setVisibility(View.VISIBLE);
- itemHolder.hairLine.setVisibility(View.VISIBLE);
- itemHolder.summary.setAlpha(1);
-
- // Set up the animator to animate the expansion.
- ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f)
- .setDuration(COLLAPSE_DURATION);
- animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animator) {
- Float value = (Float) animator.getAnimatedValue();
-
- // For each value from 0 to 1, animate the various parts of the layout.
- itemHolder.alarmItem.getLayoutParams().height =
- (int) (value * distance + startingHeight);
- FrameLayout.LayoutParams expandParams = (FrameLayout.LayoutParams)
- itemHolder.expandArea.getLayoutParams();
- expandParams.setMargins(
- 0, (int) (value * distance), 0, mCollapseExpandHeight);
- itemHolder.arrow.setRotation(ROTATE_180_DEGREE * (1 - value));
- itemHolder.delete.setAlpha(value);
- itemHolder.summary.setAlpha(value);
- itemHolder.hairLine.setAlpha(value);
-
- itemHolder.alarmItem.requestLayout();
- }
- });
- animator.setInterpolator(mCollapseInterpolator);
- // Set everything to their final values when the animation's done.
- animator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- // Set it back to wrap content since we'd explicitly set the height.
- itemHolder.alarmItem.getLayoutParams().height =
- LayoutParams.WRAP_CONTENT;
-
- FrameLayout.LayoutParams expandParams = (FrameLayout.LayoutParams)
- itemHolder.expandArea.getLayoutParams();
- expandParams.setMargins(0, 0, 0, mCollapseExpandHeight);
-
- itemHolder.expandArea.setVisibility(View.GONE);
- itemHolder.arrow.setRotation(0);
- itemHolder.alarmItem.setHasTransientState(false);
- }
- });
- animator.start();
-
- return false;
- }
- });
- }
-
- @Override
- public int getViewTypeCount() {
- return 1;
- }
-
- private View getViewById(long id) {
- for (int i = 0; i < mList.getCount(); i++) {
- View v = mList.getChildAt(i);
- if (v != null) {
- ItemHolder h = (ItemHolder)(v.getTag());
- if (h != null && h.alarm.id == id) {
- return v;
- }
- }
- }
- return null;
- }
-
- public long getExpandedId() {
- return mExpandedId;
- }
-
- public long[] getSelectedAlarmsArray() {
- int index = 0;
- long[] ids = new long[mSelectedAlarms.size()];
- for (long id : mSelectedAlarms) {
- ids[index] = id;
- index++;
- }
- return ids;
- }
-
- public long[] getRepeatArray() {
- int index = 0;
- long[] ids = new long[mRepeatChecked.size()];
- for (long id : mRepeatChecked) {
- ids[index] = id;
- index++;
- }
- return ids;
- }
-
- public Bundle getPreviousDaysOfWeekMap() {
- return mPreviousDaysOfWeekMap;
- }
-
- private void buildHashSetFromArray(long[] ids, HashSet<Long> set) {
- for (long id : ids) {
- set.add(id);
- }
- }
- }
-
- private static AlarmInstance setupAlarmInstance(Context context, Alarm alarm) {
- ContentResolver cr = context.getContentResolver();
- AlarmInstance newInstance = alarm.createInstanceAfter(Calendar.getInstance());
- newInstance = AlarmInstance.addInstance(cr, newInstance);
- // Register instance to state manager
- AlarmStateManager.registerInstance(context, newInstance, true);
- return newInstance;
- }
-
- private void asyncDeleteAlarm(final Alarm alarm) {
- final Context context = AlarmClockFragment.this.getActivity().getApplicationContext();
- final AsyncTask<Void, Void, Void> deleteTask = new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... parameters) {
- // Activity may be closed at this point , make sure data is still valid
- if (context != null && alarm != null) {
- Events.sendAlarmEvent(R.string.action_delete, R.string.label_deskclock);
-
- ContentResolver cr = context.getContentResolver();
- AlarmStateManager.deleteAllInstances(context, alarm.id);
- Alarm.deleteAlarm(cr, alarm.id);
- }
- return null;
- }
- };
- mUndoShowing = true;
- deleteTask.execute();
- }
-
- protected void asyncAddAlarm(final Alarm alarm) {
- final Context context = AlarmClockFragment.this.getActivity().getApplicationContext();
- final AsyncTask<Void, Void, AlarmInstance> updateTask =
- new AsyncTask<Void, Void, AlarmInstance>() {
- @Override
- protected AlarmInstance doInBackground(Void... parameters) {
- if (context != null && alarm != null) {
- Events.sendAlarmEvent(R.string.action_create, R.string.label_deskclock);
- ContentResolver cr = context.getContentResolver();
-
- // Add alarm to db
- Alarm newAlarm = Alarm.addAlarm(cr, alarm);
- mScrollToAlarmId = newAlarm.id;
-
- // Create and add instance to db
- if (newAlarm.enabled) {
- return setupAlarmInstance(context, newAlarm);
- }
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(AlarmInstance instance) {
- if (instance != null) {
- AlarmUtils.popAlarmSetToast(context, instance.getAlarmTime().getTimeInMillis());
- }
- }
- };
- updateTask.execute();
- }
-
- protected void asyncUpdateAlarm(final Alarm alarm, final boolean popToast) {
- final Context context = AlarmClockFragment.this.getActivity().getApplicationContext();
- final AsyncTask<Void, Void, AlarmInstance> updateTask =
- new AsyncTask<Void, Void, AlarmInstance>() {
- @Override
- protected AlarmInstance doInBackground(Void ... parameters) {
- Events.sendAlarmEvent(R.string.action_update, R.string.label_deskclock);
- ContentResolver cr = context.getContentResolver();
-
- // Dismiss all old instances
- AlarmStateManager.deleteAllInstances(context, alarm.id);
-
- // Update alarm
- Alarm.updateAlarm(cr, alarm);
- if (alarm.enabled) {
- return setupAlarmInstance(context, alarm);
- }
-
- return null;
- }
-
- @Override
- protected void onPostExecute(AlarmInstance instance) {
- if (popToast && instance != null) {
- AlarmUtils.popAlarmSetToast(context, instance.getAlarmTime().getTimeInMillis());
- }
- }
- };
- updateTask.execute();
+ public void setSmoothScrollStableId(long stableId) {
+ mScrollToAlarmId = stableId;
}
@Override
- public boolean onTouch(View v, MotionEvent event) {
- hideUndoBar(true, event);
- return false;
- }
-
- @Override
- public void onFabClick(View view){
- hideUndoBar(true, null);
+ public void onFabClick(View view) {
+ mAlarmUpdateHandler.hideUndoBar();
startCreatingAlarm();
}
@Override
public void setFabAppearance() {
- final DeskClock activity = (DeskClock) getActivity();
- if (mFab == null || activity.getSelectedTab() != DeskClock.ALARM_TAB_INDEX) {
+ if (mFab == null || getDeskClock().getSelectedTab() != DeskClock.ALARM_TAB_INDEX) {
return;
}
mFab.setVisibility(View.VISIBLE);
- mFab.setImageResource(R.drawable.ic_fab_plus);
+ mFab.setImageResource(R.drawable.ic_add_white_24dp);
mFab.setContentDescription(getString(R.string.button_alarms));
}
@Override
public void setLeftRightButtonAppearance() {
- final DeskClock activity = (DeskClock) getActivity();
if (mLeftButton == null || mRightButton == null ||
- activity.getSelectedTab() != DeskClock.ALARM_TAB_INDEX) {
+ getDeskClock().getSelectedTab() != DeskClock.ALARM_TAB_INDEX) {
return;
}
mLeftButton.setVisibility(View.INVISIBLE);
mRightButton.setVisibility(View.INVISIBLE);
}
+
+ private void startCreatingAlarm() {
+ mAlarmTimeClickHandler.clearSelectedAlarm();
+ TimePickerCompat.showTimeEditDialog(this, null /* alarm */,
+ DateFormat.is24HourFormat(getActivity()));
+ }
}
diff --git a/src/com/android/deskclock/AlarmClockFragmentPostL.java b/src/com/android/deskclock/AlarmClockFragmentPostL.java
deleted file mode 100644
index f9927b1..0000000
--- a/src/com/android/deskclock/AlarmClockFragmentPostL.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.android.deskclock;
-
-import android.app.TimePickerDialog;
-import android.widget.TimePicker;
-
-import com.android.deskclock.provider.Alarm;
-
-/**
- * AlarmClockFragment for L+ devices
- */
-public class AlarmClockFragmentPostL extends AlarmClockFragment implements
- TimePickerDialog.OnTimeSetListener {
-
- // Callback used by TimePickerDialog
- @Override
- public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) {
- processTimeSet(hourOfDay, minute);
- }
-
- @Override
- protected void setTimePickerListener() {
- // Do nothing
- }
-
- @Override
- protected void startCreatingAlarm() {
- // Set the "selected" alarm as null, and we'll create the new one when the timepicker
- // comes back.
- mSelectedAlarm = null;
- AlarmUtils.showTimeEditDialog(this, null);
- }
-
- @Override
- protected void showTimeEditDialog(Alarm alarm) {
- AlarmUtils.showTimeEditDialog(AlarmClockFragmentPostL.this, alarm);
- }
-}
diff --git a/src/com/android/deskclock/AlarmClockFragmentPreL.java b/src/com/android/deskclock/AlarmClockFragmentPreL.java
deleted file mode 100644
index 7a4db13..0000000
--- a/src/com/android/deskclock/AlarmClockFragmentPreL.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.android.deskclock;
-
-import android.text.format.DateFormat;
-
-import com.android.datetimepicker.time.RadialPickerLayout;
-import com.android.datetimepicker.time.TimePickerDialog;
-import com.android.deskclock.provider.Alarm;
-
-/**
- * AlarmClockFragment for pre-L devices
- */
-public class AlarmClockFragmentPreL extends AlarmClockFragment implements
- TimePickerDialog.OnTimeSetListener {
-
- @Override
- public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute) {
- processTimeSet(hourOfDay, minute);
- }
-
- @Override
- protected void setTimePickerListener() {
- // Make sure to use the child FragmentManager. We have to use that one for the
- // case where an intent comes in telling the activity to load the timepicker,
- // which means we have to use that one everywhere so that the fragment can get
- // correctly picked up here if it's open.
- final TimePickerDialog tpd = (TimePickerDialog) getChildFragmentManager()
- .findFragmentByTag(AlarmUtils.FRAG_TAG_TIME_PICKER);
- if (tpd != null) {
- // The dialog is already open so we need to set the listener again.
- tpd.setOnTimeSetListener(this);
- }
- }
-
- @Override
- protected void startCreatingAlarm() {
- // Set the "selected" alarm as null, and we'll create the new one when the timepicker
- // comes back.
- mSelectedAlarm = null;
- AlarmUtils.showTimeEditDialog(getChildFragmentManager(),
- null, AlarmClockFragmentPreL.this, DateFormat.is24HourFormat(getActivity()));
- }
-
- @Override
- public void showTimeEditDialog(Alarm alarm) {
- AlarmUtils.showTimeEditDialog(getChildFragmentManager(),
- alarm, AlarmClockFragmentPreL.this, DateFormat.is24HourFormat(getActivity()));
- }
-}
diff --git a/src/com/android/deskclock/AlarmInitReceiver.java b/src/com/android/deskclock/AlarmInitReceiver.java
index 30c1920..fcfaefb 100644
--- a/src/com/android/deskclock/AlarmInitReceiver.java
+++ b/src/com/android/deskclock/AlarmInitReceiver.java
@@ -16,19 +16,25 @@
package com.android.deskclock;
+import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.os.PowerManager.WakeLock;
import com.android.deskclock.alarms.AlarmStateManager;
-import com.android.deskclock.timer.TimerObj;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.events.Events;
public class AlarmInitReceiver extends BroadcastReceiver {
- // A flag that indicates that switching the volume button default was done
- private static final String PREF_VOLUME_DEF_DONE = "vol_def_done";
+ /**
+ * When running on N devices, we're interested in the boot completed event that is sent while
+ * the user is still locked, so that we can schedule alarms.
+ */
+ @SuppressLint("InlinedApi")
+ private static final String ACTION_BOOT_COMPLETED = Utils.isNOrLater()
+ ? Intent.ACTION_LOCKED_BOOT_COMPLETED : Intent.ACTION_BOOT_COMPLETED;
/**
* This receiver handles a variety of actions:
@@ -36,16 +42,16 @@
* <ul>
* <li>Clean up backup data that was recently restored to this device on
* ACTION_COMPLETE_RESTORE.</li>
- * <li>Clean up backup data that was recently restored to this device and reset timers and
- * clear stopwatch on ACTION_BOOT_COMPLETED</li>
+ * <li>Reset timers and stopwatch on ACTION_BOOT_COMPLETED</li>
* <li>Fix alarm states on ACTION_BOOT_COMPLETED, TIME_SET, TIMEZONE_CHANGED,
* and LOCALE_CHANGED</li>
+ * <li>Rebuild notifications on MY_PACKAGE_REPLACED</li>
* </ul>
*/
@Override
public void onReceive(final Context context, Intent intent) {
final String action = intent.getAction();
- LogUtils.v("AlarmInitReceiver " + action);
+ LogUtils.i("AlarmInitReceiver " + action);
final PendingResult result = goAsync();
final WakeLock wl = AlarmAlertWakeLock.createPartialWakeLock(context);
@@ -54,34 +60,25 @@
// We need to increment the global id out of the async task to prevent race conditions
AlarmStateManager.updateGlobalIntentId(context);
+ // Clear stopwatch data and reset timers because they rely on elapsed real-time values
+ // which are meaningless after a device reboot.
+ if (ACTION_BOOT_COMPLETED.equals(action)) {
+ DataModel.getDataModel().clearLaps();
+ DataModel.getDataModel().resetStopwatch();
+ Events.sendStopwatchEvent(R.string.action_reset, R.string.label_reboot);
+ DataModel.getDataModel().resetTimers(R.string.label_reboot);
+ }
+
+ // Notifications are canceled by the system on application upgrade. This broadcast signals
+ // that the new app is free to rebuild the notifications using the existing data.
+ if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(action)) {
+ DataModel.getDataModel().updateAllNotifications();
+ }
+
AsyncHandler.post(new Runnable() {
- @Override public void run() {
- // When running on N devices, we're interested in the boot
- // completed event that is sent while the user is still locked,
- // so that we can schedule alarms.
- final boolean bootCompleted;
- if (Utils.isNOrLater()) {
- bootCompleted = Intent.ACTION_LOCKED_BOOT_COMPLETED.equals(action);
- } else {
- bootCompleted = Intent.ACTION_BOOT_COMPLETED.equals(action);
- }
-
+ @Override
+ public void run() {
try {
- if (bootCompleted) {
- // Clear stopwatch and timers data
- final SharedPreferences prefs =
- Utils.getDefaultSharedPreferences(context);
- LogUtils.v("AlarmInitReceiver - Reset timers and clear stopwatch data");
- TimerObj.resetTimersInSharedPrefs(prefs);
- Utils.clearSwSharedPref(prefs);
-
- if (!prefs.getBoolean(PREF_VOLUME_DEF_DONE, false)) {
- // Fix the default
- LogUtils.v("AlarmInitReceiver - resetting volume button default");
- switchVolumeButtonDefault(prefs);
- }
- }
-
// Process restored data if any exists
if (!DeskClockBackupAgent.processRestoredData(context)) {
// Update all the alarm instances on time change event
@@ -95,15 +92,4 @@
}
});
}
-
- private void switchVolumeButtonDefault(SharedPreferences prefs) {
- SharedPreferences.Editor editor = prefs.edit();
-
- editor.putString(SettingsActivity.KEY_VOLUME_BEHAVIOR,
- SettingsActivity.DEFAULT_VOLUME_BEHAVIOR);
-
- // Make sure we do it only once
- editor.putBoolean(PREF_VOLUME_DEF_DONE, true);
- editor.apply();
- }
}
diff --git a/src/com/android/deskclock/AlarmListeners.java b/src/com/android/deskclock/AlarmListeners.java
deleted file mode 100644
index 1f01b09..0000000
--- a/src/com/android/deskclock/AlarmListeners.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2012 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.view.View;
-
-/** Change me */
-public class AlarmListeners {
-
- public static class DigitalClockClickListener implements View.OnClickListener {
-
- private int alarmId;
-
- public DigitalClockClickListener(int alarmId) {
- this.alarmId = alarmId;
- }
-
- @Override
- public void onClick(View view) {
-
- }
- }
-
-}
diff --git a/src/com/android/deskclock/AlarmSelectionActivity.java b/src/com/android/deskclock/AlarmSelectionActivity.java
index 85e258d..f046996 100644
--- a/src/com/android/deskclock/AlarmSelectionActivity.java
+++ b/src/com/android/deskclock/AlarmSelectionActivity.java
@@ -22,7 +22,6 @@
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Parcelable;
-import android.util.ArrayMap;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
@@ -33,14 +32,12 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public class AlarmSelectionActivity extends ListActivity {
public static final String EXTRA_ALARMS = "com.android.deskclock.EXTRA_ALARMS";
private final List<AlarmSelection> mSelections = new ArrayList<>();
- private final Map<Long, Alarm> mAlarmsMap = new ArrayMap<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -71,7 +68,6 @@
// so no need to check if alarmsFromIntent is empty
for (Parcelable parcelable : alarmsFromIntent) {
final Alarm alarm = (Alarm) parcelable;
- mAlarmsMap.put(alarm.id, alarm);
// filling mSelections that go into the UI picker list
final String label = String.format("%d %02d", alarm.hour, alarm.minutes);
diff --git a/src/com/android/deskclock/AlarmUtils.java b/src/com/android/deskclock/AlarmUtils.java
index 8dcfcd2..5f91a00 100644
--- a/src/com/android/deskclock/AlarmUtils.java
+++ b/src/com/android/deskclock/AlarmUtils.java
@@ -16,25 +16,17 @@
package com.android.deskclock;
-import android.Manifest;
-import android.annotation.TargetApi;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
-import android.app.TimePickerDialog;
import android.content.Context;
-import android.content.pm.PackageManager;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Build;
-import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
+import android.support.design.widget.Snackbar;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
+import android.view.View;
import android.widget.Toast;
-import com.android.deskclock.provider.Alarm;
import com.android.deskclock.provider.AlarmInstance;
+import com.android.deskclock.widget.toast.SnackbarManager;
+import com.android.deskclock.widget.toast.ToastManager;
import java.util.Calendar;
import java.util.Locale;
@@ -43,113 +35,19 @@
* Static utility methods for Alarms.
*/
public class AlarmUtils {
- public static final String FRAG_TAG_TIME_PICKER = "time_dialog";
public static String getFormattedTime(Context context, Calendar time) {
- String pattern;
- if (Utils.isJBMR2OrLater()) {
- final String skeleton = DateFormat.is24HourFormat(context) ? "EHm" : "Ehma";
- pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
- return (String) DateFormat.format(pattern, time);
- } else {
- pattern = DateFormat.is24HourFormat(context)
- ? context.getString(R.string.weekday_time_format_24_mode)
- : context.getString(R.string.weekday_time_format_12_mode);
- }
+ final String skeleton = DateFormat.is24HourFormat(context) ? "EHm" : "Ehma";
+ final String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
return (String) DateFormat.format(pattern, time);
}
- public static String getAlarmText(Context context, AlarmInstance instance) {
+ public static String getAlarmText(Context context, AlarmInstance instance,
+ boolean includeLabel) {
String alarmTimeStr = getFormattedTime(context, instance.getAlarmTime());
- return !instance.mLabel.isEmpty() ? alarmTimeStr + " - " + instance.mLabel
- : alarmTimeStr;
- }
-
- // show time picker dialog for pre-L devices
- public static void showTimeEditDialog(FragmentManager manager, final Alarm alarm,
- com.android.datetimepicker.time.TimePickerDialog.OnTimeSetListener listener,
- boolean is24HourMode) {
-
- final int hour, minutes;
- if (alarm == null) {
- hour = 0;
- minutes = 0;
- } else {
- hour = alarm.hour;
- minutes = alarm.minutes;
- }
- com.android.datetimepicker.time.TimePickerDialog dialog =
- com.android.datetimepicker.time.TimePickerDialog.newInstance(listener,
- hour, minutes, is24HourMode);
- dialog.setThemeDark(true);
-
- // Make sure the dialog isn't already added.
- manager.executePendingTransactions();
- final FragmentTransaction ft = manager.beginTransaction();
- final Fragment prev = manager.findFragmentByTag(FRAG_TAG_TIME_PICKER);
- if (prev != null) {
- ft.remove(prev);
- }
- ft.commit();
-
- if (!dialog.isAdded()) {
- dialog.show(manager, FRAG_TAG_TIME_PICKER);
- }
- }
-
- /**
- * Show the time picker dialog for post-L devices.
- * This is called from AlarmClockFragment to set alarm.
- * @param fragment The calling fragment (which is also a onTimeSetListener),
- * we use it as the target fragment of the TimePickerFragment, so later the
- * latter can retrieve it and set it as its onTimeSetListener when the fragment
- * is recreated.
- * @param alarm The clicked alarm, it can be null if user was clicking the fab instead.
- */
- @TargetApi(Build.VERSION_CODES.LOLLIPOP)
- public static void showTimeEditDialog(Fragment fragment, final Alarm alarm) {
- final FragmentManager manager = fragment.getFragmentManager();
- final FragmentTransaction ft = manager.beginTransaction();
- final Fragment prev = manager.findFragmentByTag(FRAG_TAG_TIME_PICKER);
- if (prev != null) {
- ft.remove(prev);
- }
- ft.commit();
- final TimePickerFragment timePickerFragment = new TimePickerFragment();
- timePickerFragment.setTargetFragment(fragment, 0);
- timePickerFragment.setOnTimeSetListener((TimePickerDialog.OnTimeSetListener) fragment);
- timePickerFragment.setAlarm(alarm);
- timePickerFragment.show(manager, FRAG_TAG_TIME_PICKER);
- }
-
- /**
- * @return {@code true} iff the user has granted permission to read the ringtone at the given
- * uri or no permission is required to read the ringtone
- */
- public static boolean hasPermissionToDisplayRingtoneTitle(Context context, Uri ringtoneUri) {
- final PackageManager pm = context.getPackageManager();
- final String packageName = context.getPackageName();
-
- // If the default alarm alert ringtone URI is given, resolve it to the actual URI.
- if (Settings.System.DEFAULT_ALARM_ALERT_URI.equals(ringtoneUri)) {
- ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context,
- RingtoneManager.TYPE_ALARM);
- }
-
- // If no ringtone is specified, return true.
- if (ringtoneUri == null || ringtoneUri == Alarm.NO_RINGTONE_URI) {
- return true;
- }
-
- // If the permission is already granted, return true.
- if (pm.checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, packageName)
- == PackageManager.PERMISSION_GRANTED) {
- return true;
- }
-
- // If the ringtone is internal, return true;
- // external ringtones require the permission to see their title
- return ringtoneUri.toString().startsWith("content://media/internal/");
+ return (instance.mLabel.isEmpty() || !includeLabel)
+ ? alarmTimeStr
+ : alarmTimeStr + " - " + instance.mLabel;
}
/**
@@ -192,7 +90,15 @@
final long alarmTimeDelta = alarmTime - System.currentTimeMillis();
final String text = formatElapsedTimeUntilAlarm(context, alarmTimeDelta);
Toast toast = Toast.makeText(context, text, Toast.LENGTH_LONG);
- ToastMaster.setToast(toast);
+ ToastManager.setToast(toast);
toast.show();
}
+
+ public static void popAlarmSetSnackbar(View snackbarAnchor, long alarmTime) {
+ final long alarmTimeDelta = alarmTime - System.currentTimeMillis();
+ final String text = formatElapsedTimeUntilAlarm(
+ snackbarAnchor.getContext(), alarmTimeDelta);
+ SnackbarManager.show(Snackbar.make(snackbarAnchor, text, Snackbar.LENGTH_SHORT));
+ snackbarAnchor.announceForAccessibility(text);
+ }
}
diff --git a/src/com/android/deskclock/AndroidClockTextView.java b/src/com/android/deskclock/AndroidClockTextView.java
deleted file mode 100644
index 9c1735a..0000000
--- a/src/com/android/deskclock/AndroidClockTextView.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2010 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.graphics.Paint;
-import android.graphics.Typeface;
-import android.util.AttributeSet;
-import android.widget.TextView;
-
-/**
- * Displays text using the special AndroidClock font.
- */
-public class AndroidClockTextView extends TextView {
-
- private static final String SYSTEM = "/system/fonts/";
- private static final String SYSTEM_FONT_TIME_BACKGROUND = SYSTEM + "AndroidClock.ttf";
-
- private static final String ATTR_USE_CLOCK_TYPEFACE = "useClockTypeface";
-
- private static Typeface sClockTypeface;
- private static Typeface sStandardTypeface;
-
- private boolean mUseClockTypeface;
-
- public AndroidClockTextView(Context context) {
- super(context);
- }
-
- public AndroidClockTextView(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- mUseClockTypeface = attrs.getAttributeBooleanValue(null, ATTR_USE_CLOCK_TYPEFACE, true)
- && !isInEditMode();
-
- sStandardTypeface = Typeface.DEFAULT;
- if (sClockTypeface == null && mUseClockTypeface) {
- sClockTypeface = Typeface.createFromFile(SYSTEM_FONT_TIME_BACKGROUND);
- }
-
- Paint paint = getPaint();
- paint.setTypeface(mUseClockTypeface ? sClockTypeface : sStandardTypeface);
- }
-}
diff --git a/src/com/android/deskclock/AsyncRingtonePlayer.java b/src/com/android/deskclock/AsyncRingtonePlayer.java
index 4416aab..8a794a6 100644
--- a/src/com/android/deskclock/AsyncRingtonePlayer.java
+++ b/src/com/android/deskclock/AsyncRingtonePlayer.java
@@ -12,7 +12,9 @@
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
+import android.preference.PreferenceManager;
import android.telephony.TelephonyManager;
+import android.text.format.DateUtils;
import java.io.IOException;
import java.lang.reflect.Method;
@@ -39,16 +41,19 @@
* the android.permission.READ_EXTERNAL_STORAGE permission has no effect on playback in M+.</li>
* </ul>
*/
-public class AsyncRingtonePlayer {
+public final class AsyncRingtonePlayer {
private static final String TAG = "AsyncRingtonePlayer";
+ private static final String DEFAULT_CRESCENDO_LENGTH = "0";
+
// Volume suggested by media team for in-call alarms.
private static final float IN_CALL_VOLUME = 0.125f;
// Message codes used with the ringtone thread.
private static final int EVENT_PLAY = 1;
private static final int EVENT_STOP = 2;
+ private static final int EVENT_VOLUME = 3;
private static final String RINGTONE_URI_KEY = "RINGTONE_URI_KEY";
/** Handler running on the ringtone thread. */
@@ -60,28 +65,49 @@
/** The context. */
private final Context mContext;
- public AsyncRingtonePlayer(Context context) {
+ /** The key of the preference that controls the crescendo behavior when playing a ringtone. */
+ private final String mCrescendoPrefKey;
+
+ /**
+ * @param crescendoPrefKey the key to the user preference that defines the crescendo behavior
+ * associated with this ringtone player
+ */
+ public AsyncRingtonePlayer(Context context, String crescendoPrefKey) {
mContext = context;
+ mCrescendoPrefKey = crescendoPrefKey;
}
/** Plays the ringtone. */
public void play(Uri ringtoneUri) {
LogUtils.d(TAG, "Posting play.");
- postMessage(EVENT_PLAY, ringtoneUri);
+ postMessage(EVENT_PLAY, ringtoneUri, 0);
}
/** Stops playing the ringtone. */
public void stop() {
LogUtils.d(TAG, "Posting stop.");
- postMessage(EVENT_STOP, null);
+ postMessage(EVENT_STOP, null, 0);
+ }
+
+ /** Schedules an adjustment of the playback volume 50ms in the future. */
+ private void scheduleVolumeAdjustment() {
+ LogUtils.v(TAG, "Adjusting volume.");
+
+ // Ensure we never have more than one volume adjustment queued.
+ mHandler.removeMessages(EVENT_VOLUME);
+
+ // Queue the next volume adjustment.
+ postMessage(EVENT_VOLUME, null, 50);
}
/**
* Posts a message to the ringtone-thread handler.
*
* @param messageCode The message to post.
+ * @param ringtoneUri The ringtone in question, if any.
+ * @param delayMillis The amount of time to delay sending the message, if any.
*/
- private void postMessage(int messageCode, Uri ringtoneUri) {
+ private void postMessage(int messageCode, Uri ringtoneUri, long delayMillis) {
synchronized (this) {
if (mHandler == null) {
mHandler = getNewHandler();
@@ -93,7 +119,8 @@
bundle.putParcelable(RINGTONE_URI_KEY, ringtoneUri);
message.setData(bundle);
}
- message.sendToTarget();
+
+ mHandler.sendMessageDelayed(message, delayMillis);
}
}
@@ -110,11 +137,18 @@
switch (msg.what) {
case EVENT_PLAY:
final Uri ringtoneUri = msg.getData().getParcelable(RINGTONE_URI_KEY);
- getPlaybackDelegate().play(mContext, ringtoneUri);
+ if (getPlaybackDelegate().play(mContext, ringtoneUri)) {
+ scheduleVolumeAdjustment();
+ }
break;
case EVENT_STOP:
getPlaybackDelegate().stop(mContext);
break;
+ case EVENT_VOLUME:
+ if (getPlaybackDelegate().adjustVolume(mContext)) {
+ scheduleVolumeAdjustment();
+ }
+ break;
}
}
};
@@ -134,7 +168,7 @@
*/
private static Uri getInCallRingtoneUri(Context context) {
final String packageName = context.getPackageName();
- return Uri.parse("android.resource://" + packageName + "/" + R.raw.in_call_alarm);
+ return Uri.parse("android.resource://" + packageName + "/" + R.raw.alarm_expire);
}
/**
@@ -142,13 +176,64 @@
*/
private static Uri getFallbackRingtoneUri(Context context) {
final String packageName = context.getPackageName();
- return Uri.parse("android.resource://" + packageName + "/" + R.raw.fallbackring);
+ return Uri.parse("android.resource://" + packageName + "/" + R.raw.alarm_expire);
+ }
+
+ /**
+ * Check if the executing thread is the one dedicated to controlling the ringtone playback.
+ */
+ private void checkAsyncRingtonePlayerThread() {
+ if (Looper.myLooper() != mHandler.getLooper()) {
+ LogUtils.e(TAG, "Must be on the AsyncRingtonePlayer thread!",
+ new IllegalStateException());
+ }
+ }
+
+ /**
+ * @param currentTime current time of the device
+ * @param stopTime time at which the crescendo finishes
+ * @param duration length of time over which the crescendo occurs
+ * @return the scalar volume value that produces a linear increase in volume (in decibels)
+ */
+ private static float computeVolume(long currentTime, long stopTime, long duration) {
+ // Compute the percentage of the crescendo that has completed.
+ final float elapsedCrescendoTime = stopTime - currentTime;
+ final float fractionComplete = 1 - (elapsedCrescendoTime / duration);
+
+ // Use the fraction to compute a target decibel between -40dB (near silent) and 0dB (max).
+ final float gain = (fractionComplete * 40) - 40;
+
+ // Convert the target gain (in decibels) into the corresponding volume scalar.
+ final float volume = (float) Math.pow(10f, gain/20f);
+
+ LogUtils.v(TAG, "Ringtone crescendo %,.2f%% complete (scalar: %f, volume: %f dB)",
+ fractionComplete * 100, volume, gain);
+
+ return volume;
+ }
+
+ /**
+ * @return {@code true} iff the crescendo duration is more than 0 seconds
+ */
+ private boolean isCrescendoEnabled(Context context) {
+ return getCrescendoDurationMillis(context) > 0;
+ }
+
+ /**
+ * @return the duration of the crescendo in milliseconds
+ */
+ private long getCrescendoDurationMillis(Context context) {
+ final String crescendoSecondsStr = Utils.getDefaultSharedPreferences(context)
+ .getString(mCrescendoPrefKey, DEFAULT_CRESCENDO_LENGTH);
+ return Integer.parseInt(crescendoSecondsStr) * DateUtils.SECOND_IN_MILLIS;
}
/**
* @return the platform-specific playback delegate to use to play the ringtone
*/
private PlaybackDelegate getPlaybackDelegate() {
+ checkAsyncRingtonePlayerThread();
+
if (mPlaybackDelegate == null) {
if (Utils.isMOrLater()) {
// Use the newer Ringtone-based playback delegate because it does not require
@@ -169,14 +254,22 @@
* vs {@link MediaPlayer}.
*/
private interface PlaybackDelegate {
- void play(Context context, Uri ringtoneUri);
+ /**
+ * @return {@code true} iff a {@link #adjustVolume volume adjustment} should be scheduled
+ */
+ boolean play(Context context, Uri ringtoneUri);
void stop(Context context);
+
+ /**
+ * @return {@code true} iff another volume adjustment should be scheduled
+ */
+ boolean adjustVolume(Context context);
}
/**
* Loops playback of a ringtone using {@link MediaPlayer}.
*/
- private static class MediaPlayerPlaybackDelegate implements PlaybackDelegate {
+ private class MediaPlayerPlaybackDelegate implements PlaybackDelegate {
/** The audio focus manager. Only used by the ringtone thread. */
private AudioManager mAudioManager;
@@ -184,14 +277,18 @@
/** Non-{@code null} while playing a ringtone; {@code null} otherwise. */
private MediaPlayer mMediaPlayer;
+ /** The duration over which to increase the volume. */
+ private long mCrescendoDuration = 0;
+
+ /** The time at which the crescendo shall cease; 0 if no crescendo is present. */
+ private long mCrescendoStopTime = 0;
+
/**
* Starts the actual playback of the ringtone. Executes on ringtone-thread.
*/
@Override
- public void play(final Context context, Uri ringtoneUri) {
- if (Looper.getMainLooper() == Looper.myLooper()) {
- LogUtils.e(TAG, "Must not be on the main thread!", new IllegalStateException());
- }
+ public boolean play(final Context context, Uri ringtoneUri) {
+ checkAsyncRingtonePlayerThread();
LogUtils.i(TAG, "Play ringtone via android.media.MediaPlayer.");
@@ -216,6 +313,7 @@
}
});
+ boolean scheduleVolumeAdjustment = false;
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.
@@ -223,6 +321,13 @@
LogUtils.v("Using the in-call alarm");
mMediaPlayer.setVolume(IN_CALL_VOLUME, IN_CALL_VOLUME);
alarmNoise = getInCallRingtoneUri(context);
+ } else if (isCrescendoEnabled(context)) {
+ mMediaPlayer.setVolume(0, 0);
+
+ // Compute the time at which the crescendo will stop.
+ mCrescendoDuration = getCrescendoDurationMillis(context);
+ mCrescendoStopTime = System.currentTimeMillis() + mCrescendoDuration;
+ scheduleVolumeAdjustment = true;
}
// If alarmNoise is a custom ringtone on the sd card the app must be granted
@@ -231,6 +336,7 @@
mMediaPlayer.setDataSource(context, alarmNoise);
startAlarm(mMediaPlayer);
+ scheduleVolumeAdjustment = true;
} catch (Throwable t) {
LogUtils.e("Use the fallback ringtone, original was " + alarmNoise, t);
// The alarmNoise may be on the sd card which could be busy right now.
@@ -245,6 +351,8 @@
LogUtils.e("Failed to play fallback ringtone", t2);
}
}
+
+ return scheduleVolumeAdjustment;
}
/**
@@ -274,26 +382,62 @@
*/
@Override
public void stop(Context context) {
- if (Looper.getMainLooper() == Looper.myLooper()) {
- LogUtils.e(TAG, "Must not be on the main thread!", new IllegalStateException());
- }
+ checkAsyncRingtonePlayerThread();
LogUtils.i(TAG, "Stop ringtone via android.media.MediaPlayer.");
+ mCrescendoDuration = 0;
+ mCrescendoStopTime = 0;
+
// Stop audio playing
if (mMediaPlayer != null) {
mMediaPlayer.stop();
- mAudioManager.abandonAudioFocus(null);
mMediaPlayer.release();
mMediaPlayer = null;
}
+
+ if (mAudioManager != null) {
+ mAudioManager.abandonAudioFocus(null);
+ }
+ }
+
+ /**
+ * Adjusts the volume of the ringtone being played to create a crescendo effect.
+ */
+ @Override
+ public boolean adjustVolume(Context context) {
+ checkAsyncRingtonePlayerThread();
+
+ // If media player is absent or not playing, ignore volume adjustment.
+ if (mMediaPlayer == null || !mMediaPlayer.isPlaying()) {
+ mCrescendoDuration = 0;
+ mCrescendoStopTime = 0;
+ return false;
+ }
+
+ // If the crescendo is complete set the volume to the maximum; we're done.
+ final long currentTime = System.currentTimeMillis();
+ if (currentTime > mCrescendoStopTime) {
+ mCrescendoDuration = 0;
+ mCrescendoStopTime = 0;
+ mMediaPlayer.setVolume(1, 1);
+ return false;
+ }
+
+ // The current volume of the crescendo is the percentage of the crescendo completed.
+ final float volume = computeVolume(currentTime, mCrescendoStopTime, mCrescendoDuration);
+ mMediaPlayer.setVolume(volume, volume);
+ LogUtils.i(TAG, "MediaPlayer volume set to " + volume);
+
+ // Schedule the next volume bump in the crescendo.
+ return true;
}
}
/**
* Loops playback of a ringtone using {@link Ringtone}.
*/
- private static class RingtonePlaybackDelegate implements PlaybackDelegate {
+ private class RingtonePlaybackDelegate implements PlaybackDelegate {
/** The audio focus manager. Only used by the ringtone thread. */
private AudioManager mAudioManager;
@@ -307,6 +451,12 @@
/** The method to adjust playback looping; cannot be null. */
private Method mSetLoopingMethod;
+ /** The duration over which to increase the volume. */
+ private long mCrescendoDuration = 0;
+
+ /** The time at which the crescendo shall cease; 0 if no crescendo is present. */
+ private long mCrescendoStopTime = 0;
+
private RingtonePlaybackDelegate() {
try {
mSetVolumeMethod = Ringtone.class.getDeclaredMethod("setVolume", float.class);
@@ -325,10 +475,8 @@
* Starts the actual playback of the ringtone. Executes on ringtone-thread.
*/
@Override
- public void play(Context context, Uri ringtoneUri) {
- if (Looper.getMainLooper() == Looper.myLooper()) {
- LogUtils.e(TAG, "Must not be on the main thread!", new IllegalStateException());
- }
+ public boolean play(Context context, Uri ringtoneUri) {
+ checkAsyncRingtonePlayerThread();
LogUtils.i(TAG, "Play ringtone via android.media.Ringtone.");
@@ -344,6 +492,12 @@
// attempt to fetch the specified ringtone
mRingtone = RingtoneManager.getRingtone(context, ringtoneUri);
+ if (mRingtone == null) {
+ // fall back to the default ringtone
+ final Uri defaultUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
+ mRingtone = RingtoneManager.getRingtone(context, defaultUri);
+ }
+
// Attempt to enable looping the ringtone.
try {
mSetLoopingMethod.invoke(mRingtone, true);
@@ -355,16 +509,11 @@
mRingtone = null;
}
- if (mRingtone == null) {
- // fall back to the default ringtone
- final Uri defaultUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
- mRingtone = RingtoneManager.getRingtone(context, defaultUri);
- }
-
// if we don't have a ringtone at this point there isn't much recourse
if (mRingtone == null) {
- LogUtils.i(TAG, "Unable to locate alarm ringtone.");
- return;
+ LogUtils.i(TAG, "Unable to locate alarm ringtone, using internal fallback " +
+ "ringtone.");
+ mRingtone = RingtoneManager.getRingtone(context, getFallbackRingtoneUri(context));
}
if (Utils.isLOrLater()) {
@@ -375,18 +524,38 @@
}
// Attempt to adjust the ringtone volume if the user is in a telephone call.
+ boolean scheduleVolumeAdjustment = false;
if (inTelephoneCall) {
LogUtils.v("Using the in-call alarm");
- try {
- mSetVolumeMethod.invoke(mRingtone, IN_CALL_VOLUME);
- } catch (Exception e) {
- LogUtils.e(TAG, "Unable to set in-call volume for android.media.Ringtone", e);
- }
+ setRingtoneVolume(IN_CALL_VOLUME);
+ } else if (isCrescendoEnabled(context)) {
+ setRingtoneVolume(0);
+
+ // Compute the time at which the crescendo will stop.
+ mCrescendoDuration = getCrescendoDurationMillis(context);
+ mCrescendoStopTime = System.currentTimeMillis() + mCrescendoDuration;
+ scheduleVolumeAdjustment = true;
}
mAudioManager.requestAudioFocus(null, AudioManager.STREAM_ALARM,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
mRingtone.play();
+
+ return scheduleVolumeAdjustment;
+ }
+
+ /**
+ * Sets the volume of the ringtone.
+ *
+ * @param volume a raw scalar in range 0.0 to 1.0, where 0.0 mutes this player, and 1.0
+ * corresponds to no attenuation being applied.
+ */
+ private void setRingtoneVolume(float volume) {
+ try {
+ mSetVolumeMethod.invoke(mRingtone, volume);
+ } catch (Exception e) {
+ LogUtils.e(TAG, "Unable to set volume for android.media.Ringtone", e);
+ }
}
/**
@@ -394,21 +563,54 @@
*/
@Override
public void stop(Context context) {
- if (Looper.getMainLooper() == Looper.myLooper()) {
- LogUtils.e(TAG, "Must not be on the main thread!", new IllegalStateException());
- }
+ checkAsyncRingtonePlayerThread();
LogUtils.i(TAG, "Stop ringtone via android.media.Ringtone.");
+ mCrescendoDuration = 0;
+ mCrescendoStopTime = 0;
+
if (mRingtone != null && mRingtone.isPlaying()) {
LogUtils.d(TAG, "Ringtone.stop() invoked.");
mRingtone.stop();
}
+ mRingtone = null;
+
if (mAudioManager != null) {
mAudioManager.abandonAudioFocus(null);
}
}
+
+ /**
+ * Adjusts the volume of the ringtone being played to create a crescendo effect.
+ */
+ @Override
+ public boolean adjustVolume(Context context) {
+ checkAsyncRingtonePlayerThread();
+
+ // If ringtone is absent or not playing, ignore volume adjustment.
+ if (mRingtone == null || !mRingtone.isPlaying()) {
+ mCrescendoDuration = 0;
+ mCrescendoStopTime = 0;
+ return false;
+ }
+
+ // If the crescendo is complete set the volume to the maximum; we're done.
+ final long currentTime = System.currentTimeMillis();
+ if (currentTime > mCrescendoStopTime) {
+ mCrescendoDuration = 0;
+ mCrescendoStopTime = 0;
+ setRingtoneVolume(1);
+ return false;
+ }
+
+ final float volume = computeVolume(currentTime, mCrescendoStopTime, mCrescendoDuration);
+ setRingtoneVolume(volume);
+
+ // Schedule the next volume bump in the crescendo.
+ return true;
+ }
}
}
diff --git a/src/com/android/deskclock/CircleButtonsLayout.java b/src/com/android/deskclock/CircleButtonsLayout.java
index 163cdc9..a00d6cb 100644
--- a/src/com/android/deskclock/CircleButtonsLayout.java
+++ b/src/com/android/deskclock/CircleButtonsLayout.java
@@ -1,7 +1,9 @@
package com.android.deskclock;
import android.content.Context;
+import android.content.res.Resources;
import android.util.AttributeSet;
+import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.TextView;
@@ -13,25 +15,22 @@
* the label text near the top. The maximum text size for the label text view is also calculated.
*/
public class CircleButtonsLayout extends FrameLayout {
- private Context mContext;
+
private int mCircleTimerViewId;
private int mResetAddButtonId;
private int mLabelId;
- private float mStrokeSize;
private float mDiamOffset;
- private CircleTimerView mCtv;
+ private View mCircleView;
private ImageButton mResetAddButton;
private TextView mLabel;
@SuppressWarnings("unused")
public CircleButtonsLayout(Context context) {
this(context, null);
- mContext = context;
}
public CircleButtonsLayout(Context context, AttributeSet attrs) {
super(context, attrs);
- mContext = context;
}
public void setCircleTimerViewIds(int circleTimerViewId, int stopButtonId, int labelId) {
@@ -39,11 +38,11 @@
mResetAddButtonId = stopButtonId;
mLabelId = labelId;
- float dotStrokeSize = mContext.getResources().getDimension(R.dimen.circletimer_dot_size);
- float markerStrokeSize =
- mContext.getResources().getDimension(R.dimen.circletimer_marker_size);
- mStrokeSize = mContext.getResources().getDimension(R.dimen.circletimer_circle_size);
- mDiamOffset = Utils.calculateRadiusOffset(mStrokeSize, dotStrokeSize, markerStrokeSize) * 2;
+ final Resources res = getContext().getResources();
+ final float strokeSize = res.getDimension(R.dimen.circletimer_circle_size);
+ final float dotStrokeSize = res.getDimension(R.dimen.circletimer_dot_size);
+ final float markerStrokeSize = res.getDimension(R.dimen.circletimer_marker_size);
+ mDiamOffset = Utils.calculateRadiusOffset(strokeSize, dotStrokeSize, markerStrokeSize) * 2;
}
@Override
@@ -57,19 +56,19 @@
}
protected void remeasureViews() {
- if (mCtv == null) {
- mCtv = (CircleTimerView) findViewById(mCircleTimerViewId);
- if (mCtv == null) {
+ if (mCircleView == null) {
+ mCircleView = findViewById(mCircleTimerViewId);
+ if (mCircleView == null) {
return;
}
mResetAddButton = (ImageButton) findViewById(mResetAddButtonId);
mLabel = (TextView) findViewById(mLabelId);
}
- int frameWidth = mCtv.getMeasuredWidth();
- int frameHeight = mCtv.getMeasuredHeight();
- int minBound = Math.min(frameWidth, frameHeight);
- int circleDiam = (int) (minBound - mDiamOffset);
+ final int frameWidth = mCircleView.getMeasuredWidth();
+ final int frameHeight = mCircleView.getMeasuredHeight();
+ final int minBound = Math.min(frameWidth, frameHeight);
+ final int circleDiam = (int) (minBound - mDiamOffset);
if (mResetAddButton != null) {
final MarginLayoutParams resetAddParams = (MarginLayoutParams) mResetAddButton
@@ -81,7 +80,6 @@
}
if (mLabel != null) {
- // label will be null if this is a stopwatch, which does not have a label.
MarginLayoutParams labelParams = (MarginLayoutParams) mLabel.getLayoutParams();
labelParams.topMargin = circleDiam/6;
if (minBound == frameWidth) {
diff --git a/src/com/android/deskclock/CircleTimerView.java b/src/com/android/deskclock/CircleTimerView.java
deleted file mode 100644
index 83d0cc7..0000000
--- a/src/com/android/deskclock/CircleTimerView.java
+++ /dev/null
@@ -1,261 +0,0 @@
-package com.android.deskclock;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.RectF;
-import android.util.AttributeSet;
-import android.view.View;
-
-import com.android.deskclock.stopwatch.Stopwatches;
-
-/**
- * Class to draw a circle for timers and stopwatches.
- * These two usages require two different animation modes:
- * Timer counts down. In this mode the animation is counter-clockwise and stops at 0.
- * Stopwatch counts up. In this mode the animation is clockwise and will run until stopped.
- */
-public class CircleTimerView extends View {
-
- private int mAccentColor;
- private int mWhiteColor;
- private long mIntervalTime = 0;
- private long mIntervalStartTime = -1;
- private long mMarkerTime = -1;
- private long mCurrentIntervalTime = 0;
- private long mAccumulatedTime = 0;
- private boolean mPaused = false;
- private boolean mAnimate = false;
- private static float mStrokeSize = 4;
- private static float mDotRadius = 6;
- private static float mMarkerStrokeSize = 2;
- private final Paint mPaint = new Paint();
- private final Paint mFill = new Paint();
- private final RectF mArcRect = new RectF();
- private float mRadiusOffset; // amount to remove from radius to account for markers on circle
- private float mScreenDensity;
-
- // Stopwatch mode is the default.
- private boolean mTimerMode = false;
-
- @SuppressWarnings("unused")
- public CircleTimerView(Context context) {
- this(context, null);
- }
-
- public CircleTimerView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init(context);
- }
-
- public void setIntervalTime(long t) {
- mIntervalTime = t;
- postInvalidate();
- }
-
- public void setMarkerTime(long t) {
- mMarkerTime = t;
- postInvalidate();
- }
-
- public void reset() {
- mIntervalStartTime = -1;
- mMarkerTime = -1;
- postInvalidate();
- }
- public void startIntervalAnimation() {
- mIntervalStartTime = Utils.getTimeNow();
- mAnimate = true;
- invalidate();
- mPaused = false;
- }
- public void stopIntervalAnimation() {
- mAnimate = false;
- mIntervalStartTime = -1;
- mAccumulatedTime = 0;
- }
-
- public boolean isAnimating() {
- return (mIntervalStartTime != -1);
- }
-
- public void pauseIntervalAnimation() {
- mAnimate = false;
- mAccumulatedTime += Utils.getTimeNow() - mIntervalStartTime;
- mPaused = true;
- }
-
- public void abortIntervalAnimation() {
- mAnimate = false;
- }
-
- public void setPassedTime(long time, boolean drawRed) {
- // The onDraw() method checks if mIntervalStartTime has been set before drawing any red.
- // Without drawRed, mIntervalStartTime should not be set here at all, and would remain at -1
- // when the state is reconfigured after exiting and re-entering the application.
- // If the timer is currently running, this drawRed will not be set, and will have no effect
- // because mIntervalStartTime will be set when the thread next runs.
- // When the timer is not running, mIntervalStartTime will not be set upon loading the state,
- // and no red will be drawn, so drawRed is used to force onDraw() to draw the red portion,
- // despite the timer not running.
- mCurrentIntervalTime = mAccumulatedTime = time;
- if (drawRed) {
- mIntervalStartTime = Utils.getTimeNow();
- }
- postInvalidate();
- }
-
-
-
- private void init(Context c) {
-
- Resources resources = c.getResources();
- mStrokeSize = resources.getDimension(R.dimen.circletimer_circle_size);
- float dotDiameter = resources.getDimension(R.dimen.circletimer_dot_size);
- mMarkerStrokeSize = resources.getDimension(R.dimen.circletimer_marker_size);
- mRadiusOffset = Utils.calculateRadiusOffset(
- mStrokeSize, dotDiameter, mMarkerStrokeSize);
- mPaint.setAntiAlias(true);
- mPaint.setStyle(Paint.Style.STROKE);
- mWhiteColor = resources.getColor(R.color.clock_white);
- mAccentColor = Utils.obtainStyledColor(c, R.attr.colorAccent, Color.RED);
- mScreenDensity = resources.getDisplayMetrics().density;
- mFill.setAntiAlias(true);
- mFill.setStyle(Paint.Style.FILL);
- mFill.setColor(mAccentColor);
- mDotRadius = dotDiameter / 2f;
- }
-
- public void setTimerMode(boolean mode) {
- mTimerMode = mode;
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- int xCenter = getWidth() / 2 + 1;
- int yCenter = getHeight() / 2;
-
- mPaint.setStrokeWidth(mStrokeSize);
- float radius = Math.min(xCenter, yCenter) - mRadiusOffset;
-
- if (mIntervalStartTime == -1) {
- // just draw a complete white circle, no red arc needed
- mPaint.setColor(mWhiteColor);
- canvas.drawCircle (xCenter, yCenter, radius, mPaint);
- if (mTimerMode) {
- drawRedDot(canvas, 0f, xCenter, yCenter, radius);
- }
- } else {
- if (mAnimate) {
- mCurrentIntervalTime = Utils.getTimeNow() - mIntervalStartTime + mAccumulatedTime;
- }
- //draw a combination of red and white arcs to create a circle
- mArcRect.top = yCenter - radius;
- mArcRect.bottom = yCenter + radius;
- mArcRect.left = xCenter - radius;
- mArcRect.right = xCenter + radius;
- float redPercent = (float)mCurrentIntervalTime / (float)mIntervalTime;
- // prevent timer from doing more than one full circle
- redPercent = (redPercent > 1 && mTimerMode) ? 1 : redPercent;
-
- float whitePercent = 1 - (redPercent > 1 ? 1 : redPercent);
- // draw red arc here
- mPaint.setColor(mAccentColor);
- if (mTimerMode){
- canvas.drawArc (mArcRect, 270, - redPercent * 360 , false, mPaint);
- } else {
- canvas.drawArc (mArcRect, 270, + redPercent * 360 , false, mPaint);
- }
-
- // draw white arc here
- mPaint.setStrokeWidth(mStrokeSize);
- mPaint.setColor(mWhiteColor);
- if (mTimerMode) {
- canvas.drawArc(mArcRect, 270, + whitePercent * 360, false, mPaint);
- } else {
- canvas.drawArc(mArcRect, 270 + (1 - whitePercent) * 360,
- whitePercent * 360, false, mPaint);
- }
-
- if (mMarkerTime != -1 && radius > 0 && mIntervalTime != 0) {
- mPaint.setStrokeWidth(mMarkerStrokeSize);
- float angle = (float)(mMarkerTime % mIntervalTime) / (float)mIntervalTime * 360;
- // draw 2dips thick marker
- // the formula to draw the marker 1 unit thick is:
- // 180 / (radius * Math.PI)
- // after that we have to scale it by the screen density
- canvas.drawArc (mArcRect, 270 + angle, mScreenDensity *
- (float) (360 / (radius * Math.PI)) , false, mPaint);
- }
- drawRedDot(canvas, redPercent, xCenter, yCenter, radius);
- }
- if (mAnimate) {
- postInvalidateOnAnimation();
- }
- }
-
- protected void drawRedDot(
- Canvas canvas, float degrees, int xCenter, int yCenter, float radius) {
- mPaint.setColor(mAccentColor);
- float dotPercent;
- if (mTimerMode) {
- dotPercent = 270 - degrees * 360;
- } else {
- dotPercent = 270 + degrees * 360;
- }
-
- final double dotRadians = Math.toRadians(dotPercent);
- canvas.drawCircle(xCenter + (float) (radius * Math.cos(dotRadians)),
- yCenter + (float) (radius * Math.sin(dotRadians)), mDotRadius, mFill);
- }
-
- public static final String PREF_CTV_PAUSED = "_ctv_paused";
- public static final String PREF_CTV_INTERVAL = "_ctv_interval";
- public static final String PREF_CTV_INTERVAL_START = "_ctv_interval_start";
- public static final String PREF_CTV_CURRENT_INTERVAL = "_ctv_current_interval";
- public static final String PREF_CTV_ACCUM_TIME = "_ctv_accum_time";
- public static final String PREF_CTV_TIMER_MODE = "_ctv_timer_mode";
- public static final String PREF_CTV_MARKER_TIME = "_ctv_marker_time";
-
- // Since this view is used in multiple places, use the key to save different instances
- public void writeToSharedPref(SharedPreferences prefs, String key) {
- SharedPreferences.Editor editor = prefs.edit();
- editor.putBoolean (key + PREF_CTV_PAUSED, mPaused);
- editor.putLong (key + PREF_CTV_INTERVAL, mIntervalTime);
- editor.putLong (key + PREF_CTV_INTERVAL_START, mIntervalStartTime);
- editor.putLong (key + PREF_CTV_CURRENT_INTERVAL, mCurrentIntervalTime);
- editor.putLong (key + PREF_CTV_ACCUM_TIME, mAccumulatedTime);
- editor.putLong (key + PREF_CTV_MARKER_TIME, mMarkerTime);
- editor.putBoolean (key + PREF_CTV_TIMER_MODE, mTimerMode);
- editor.apply();
- }
-
- public void readFromSharedPref(SharedPreferences prefs, String key) {
- mPaused = prefs.getBoolean(key + PREF_CTV_PAUSED, false);
- mIntervalTime = prefs.getLong(key + PREF_CTV_INTERVAL, 0);
- mIntervalStartTime = prefs.getLong(key + PREF_CTV_INTERVAL_START, -1);
- mCurrentIntervalTime = prefs.getLong(key + PREF_CTV_CURRENT_INTERVAL, 0);
- mAccumulatedTime = prefs.getLong(key + PREF_CTV_ACCUM_TIME, 0);
- mMarkerTime = prefs.getLong(key + PREF_CTV_MARKER_TIME, -1);
- mTimerMode = prefs.getBoolean(key + PREF_CTV_TIMER_MODE, false);
- mAnimate = (mIntervalStartTime != -1 && !mPaused);
- }
-
- public void clearSharedPref(SharedPreferences prefs, String key) {
- SharedPreferences.Editor editor = prefs.edit();
- editor.remove (Stopwatches.PREF_START_TIME);
- editor.remove (Stopwatches.PREF_ACCUM_TIME);
- editor.remove (Stopwatches.PREF_STATE);
- editor.remove (key + PREF_CTV_PAUSED);
- editor.remove (key + PREF_CTV_INTERVAL);
- editor.remove (key + PREF_CTV_INTERVAL_START);
- editor.remove (key + PREF_CTV_CURRENT_INTERVAL);
- editor.remove (key + PREF_CTV_ACCUM_TIME);
- editor.remove (key + PREF_CTV_MARKER_TIME);
- editor.remove (key + PREF_CTV_TIMER_MODE);
- editor.apply();
- }
-}
diff --git a/src/com/android/deskclock/ClockFragment.java b/src/com/android/deskclock/ClockFragment.java
index a14044a..c9b339f 100644
--- a/src/com/android/deskclock/ClockFragment.java
+++ b/src/com/android/deskclock/ClockFragment.java
@@ -22,13 +22,10 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.ContentObserver;
-import android.os.Build;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
-import android.preference.PreferenceManager;
import android.provider.Settings;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -36,293 +33,398 @@
import android.view.View.OnTouchListener;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
+import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextClock;
+import android.widget.TextView;
-import com.android.deskclock.worldclock.CitiesActivity;
-import com.android.deskclock.worldclock.WorldClockAdapter;
+import com.android.deskclock.data.City;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.worldclock.CitySelectionActivity;
+
+import java.util.Calendar;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import static android.view.View.GONE;
+import static android.view.View.INVISIBLE;
+import static android.view.View.VISIBLE;
+import static java.util.Calendar.DAY_OF_WEEK;
/**
- * Fragment that shows the clock (analog or digital), the next alarm info and the world clock.
+ * Fragment that shows the clock (analog or digital), the next alarm info and the world clock.
*/
-public class ClockFragment extends DeskClockFragment implements OnSharedPreferenceChangeListener {
+public final class ClockFragment extends DeskClockFragment {
- private static final String BUTTONS_HIDDEN_KEY = "buttons_hidden";
- private static final boolean PRE_L_DEVICE =
- Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP;
- private final static String TAG = "ClockFragment";
+ // Updates the UI in response to system setting changes that alter time values and time display.
+ private final BroadcastReceiver mBroadcastReceiver = new SystemBroadcastReceiver();
- private boolean mButtonsHidden = false;
- private View mDigitalClock, mAnalogClock, mClockFrame, mHairline;
- private WorldClockAdapter mAdapter;
- private ListView mList;
- private SharedPreferences mPrefs;
+ // Updates dates in the UI on every quarter-hour.
+ private final Runnable mQuarterHourUpdater = new QuarterHourRunnable();
+
+ // Detects changes to the next scheduled alarm pre-L.
+ private ContentObserver mAlarmObserver;
+
+ private Handler mHandler;
+
+ private TextClock mDigitalClock;
+ private View mAnalogClock, mClockFrame;
+ private SelectedCitiesAdapter mCityAdapter;
+ private ListView mCityList;
private String mDateFormat;
private String mDateFormatForAccessibility;
- private String mDefaultClockStyle;
- private String mClockStyle;
- private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- boolean changed = action.equals(Intent.ACTION_TIME_CHANGED)
- || action.equals(Intent.ACTION_TIMEZONE_CHANGED)
- || action.equals(Intent.ACTION_LOCALE_CHANGED);
- if (changed) {
- Utils.updateDate(mDateFormat, mDateFormatForAccessibility, mClockFrame);
- if (mAdapter != null) {
- // *CHANGED may modify the need for showing the Home City
- if (mAdapter.hasHomeCity() != mAdapter.needHomeCity()) {
- mAdapter.reloadData(context);
- } else {
- mAdapter.notifyDataSetChanged();
- }
- // Locale change: update digital clock format and
- // reload the cities list with new localized names
- if (action.equals(Intent.ACTION_LOCALE_CHANGED)) {
- if (mDigitalClock != null) {
- Utils.setTimeFormat(context,
- (TextClock) mDigitalClock.findViewById(R.id.digital_clock),
- context.getResources().getDimensionPixelSize(
- R.dimen.main_ampm_font_size));
- }
- mAdapter.loadCitiesDb(context);
- mAdapter.notifyDataSetChanged();
- }
- }
- Utils.setQuarterHourUpdater(mHandler, mQuarterHourUpdater);
- }
- if (changed || action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) {
- Utils.refreshAlarm(getActivity(), mClockFrame);
- }
- }
- };
+ /** The public no-arg constructor required by all fragments. */
+ public ClockFragment() {}
- private final Handler mHandler = new Handler();
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
- /* Register ContentObserver to see alarm changes for pre-L */
- private final ContentObserver mAlarmObserver = PRE_L_DEVICE
- ? new ContentObserver(mHandler) {
- @Override
- public void onChange(boolean selfChange) {
- Utils.refreshAlarm(ClockFragment.this.getActivity(), mClockFrame);
- }
- }
- : null;
-
- // Thread that runs on every quarter-hour and refreshes the date.
- private final Runnable mQuarterHourUpdater = new Runnable() {
- @Override
- public void run() {
- // Update the main and world clock dates
- Utils.updateDate(mDateFormat, mDateFormatForAccessibility, mClockFrame);
- if (mAdapter != null) {
- mAdapter.notifyDataSetChanged();
- }
- Utils.setQuarterHourUpdater(mHandler, mQuarterHourUpdater);
- }
- };
-
- public ClockFragment() {
+ mHandler = new Handler();
+ mAlarmObserver = Utils.isPreL() ? new AlarmObserverPreL(mHandler) : null;
}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle icicle) {
- // Inflate the layout for this fragment
- View v = inflater.inflate(R.layout.clock_fragment, container, false);
- if (icicle != null) {
- mButtonsHidden = icicle.getBoolean(BUTTONS_HIDDEN_KEY, false);
- }
- mList = (ListView) v.findViewById(R.id.cities);
- mList.setDivider(null);
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle) {
+ super.onCreateView(inflater, container, icicle);
- OnTouchListener longPressNightMode = new OnTouchListener() {
- private float mMaxMovementAllowed = -1;
- private int mLongPressTimeout = -1;
- private float mLastTouchX
- ,
- mLastTouchY;
+ final OnTouchListener startScreenSaverListener = new StartScreenSaverListener();
+ final View footerView = inflater.inflate(R.layout.blank_footer_view, mCityList, false);
+ final View fragmentView = inflater.inflate(R.layout.clock_fragment, container, false);
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if (mMaxMovementAllowed == -1) {
- mMaxMovementAllowed = ViewConfiguration.get(getActivity()).getScaledTouchSlop();
- mLongPressTimeout = ViewConfiguration.getLongPressTimeout();
- }
+ mCityAdapter = new SelectedCitiesAdapter(getActivity());
- switch (event.getAction()) {
- case (MotionEvent.ACTION_DOWN):
- long time = Utils.getTimeNow();
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- startActivity(new Intent(getActivity(), ScreensaverActivity.class));
- }
- }, mLongPressTimeout);
- mLastTouchX = event.getX();
- mLastTouchY = event.getY();
- return true;
- case (MotionEvent.ACTION_MOVE):
- float xDiff = Math.abs(event.getX() - mLastTouchX);
- float yDiff = Math.abs(event.getY() - mLastTouchY);
- if (xDiff >= mMaxMovementAllowed || yDiff >= mMaxMovementAllowed) {
- mHandler.removeCallbacksAndMessages(null);
- }
- break;
- default:
- mHandler.removeCallbacksAndMessages(null);
- }
- return false;
- }
- };
+ mCityList = (ListView) fragmentView.findViewById(R.id.cities);
+ mCityList.setDivider(null);
+ mCityList.setAdapter(mCityAdapter);
+ mCityList.addFooterView(footerView, null, false);
+ mCityList.setOnTouchListener(startScreenSaverListener);
// On tablet landscape, the clock frame will be a distinct view. Otherwise, it'll be added
// on as a header to the main listview.
- mClockFrame = v.findViewById(R.id.main_clock_left_pane);
- mHairline = v.findViewById(R.id.hairline);
+ mClockFrame = fragmentView.findViewById(R.id.main_clock_left_pane);
if (mClockFrame == null) {
- mClockFrame = inflater.inflate(R.layout.main_clock_frame, mList, false);
- mHairline = mClockFrame.findViewById(R.id.hairline);
- mHairline.setVisibility(View.VISIBLE);
- mList.addHeaderView(mClockFrame, null, false);
+ mClockFrame = inflater.inflate(R.layout.main_clock_frame, mCityList, false);
+ mCityList.addHeaderView(mClockFrame, null, false);
+ final View hairline = mClockFrame.findViewById(R.id.hairline);
+ hairline.setVisibility(mCityAdapter.getCount() == 0 ? GONE : VISIBLE);
} else {
- mHairline.setVisibility(View.GONE);
+ final View hairline = mClockFrame.findViewById(R.id.hairline);
+ hairline.setVisibility(GONE);
// The main clock frame needs its own touch listener for night mode now.
- v.setOnTouchListener(longPressNightMode);
- }
- mList.setOnTouchListener(longPressNightMode);
-
- // If the current layout has a fake overflow menu button, let the parent
- // activity set up its click and touch listeners.
- View menuButton = v.findViewById(R.id.menu_button);
- if (menuButton != null) {
- setupFakeOverflowMenuButton(menuButton);
+ fragmentView.setOnTouchListener(startScreenSaverListener);
}
- mDigitalClock = mClockFrame.findViewById(R.id.digital_clock);
+ mDigitalClock = (TextClock) mClockFrame.findViewById(R.id.digital_clock);
mAnalogClock = mClockFrame.findViewById(R.id.analog_clock);
- Utils.setTimeFormat(getActivity(),
- (TextClock) mDigitalClock.findViewById(R.id.digital_clock),
- getResources().getDimensionPixelSize(R.dimen.main_ampm_font_size));
- View footerView = inflater.inflate(R.layout.blank_footer_view, mList, false);
- mList.addFooterView(footerView, null, false);
- mAdapter = new WorldClockAdapter(getActivity());
- if (mAdapter.getCount() == 0) {
- mHairline.setVisibility(View.GONE);
- }
- mList.setAdapter(mAdapter);
+ return fragmentView;
+ }
- mPrefs = Utils.getDefaultSharedPreferences(getActivity());
- mDefaultClockStyle = getActivity().getResources().getString(R.string.default_clock_style);
- return v;
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ Utils.setTimeFormat(getActivity(), mDigitalClock);
}
@Override
public void onResume() {
super.onResume();
- final DeskClock activity = (DeskClock) getActivity();
- if (activity.getSelectedTab() == DeskClock.CLOCK_TAB_INDEX) {
- setFabAppearance();
- setLeftRightButtonAppearance();
- }
+ final Activity activity = getActivity();
+ setFabAppearance();
+ setLeftRightButtonAppearance();
- mPrefs.registerOnSharedPreferenceChangeListener(this);
mDateFormat = getString(R.string.abbrev_wday_month_day_no_year);
mDateFormatForAccessibility = getString(R.string.full_wday_month_day_no_year);
+ // Schedule a runnable to update the date every quarter hour.
Utils.setQuarterHourUpdater(mHandler, mQuarterHourUpdater);
- // Besides monitoring when quarter-hour changes, monitor other actions that
- // effect clock time
- IntentFilter filter = new IntentFilter();
- filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
+
+ // Watch for system events that effect clock time or format.
+ final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
- filter.addAction(Intent.ACTION_LOCALE_CHANGED);
- activity.registerReceiver(mIntentReceiver, filter);
+ filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
+ activity.registerReceiver(mBroadcastReceiver, filter);
- // Resume can invoked after changing the cities list or a change in locale
- if (mAdapter != null) {
- mAdapter.loadCitiesDb(activity);
- mAdapter.reloadData(activity);
+ // Resume can be invoked after changing the clock style.
+ Utils.setClockStyle(mDigitalClock, mAnalogClock);
+
+ final View view = getView();
+ if (view != null && view.findViewById(R.id.main_clock_left_pane) != null) {
+ // Center the main clock frame by hiding the world clocks when none are selected.
+ mCityList.setVisibility(mCityAdapter.getCount() == 0 ? GONE : VISIBLE);
}
- // Resume can invoked after changing the clock style.
- View clockView = Utils.setClockStyle(activity, mDigitalClock, mAnalogClock,
- SettingsActivity.KEY_CLOCK_STYLE);
- mClockStyle = (clockView == mDigitalClock ?
- Utils.CLOCK_TYPE_DIGITAL : Utils.CLOCK_TYPE_ANALOG);
- // Center the main clock frame if cities are empty.
- if (getView().findViewById(R.id.main_clock_left_pane) != null && mAdapter.getCount() == 0) {
- mList.setVisibility(View.GONE);
- } else {
- mList.setVisibility(View.VISIBLE);
- }
- mAdapter.notifyDataSetChanged();
+ refreshDates();
+ refreshAlarm();
- Utils.updateDate(mDateFormat, mDateFormatForAccessibility, mClockFrame);
- Utils.refreshAlarm(activity, mClockFrame);
- if (PRE_L_DEVICE) {
- activity.getContentResolver().registerContentObserver(
- Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED),
- false,
- mAlarmObserver);
+ if (mAlarmObserver != null) {
+ final Uri uri = Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED);
+ activity.getContentResolver().registerContentObserver(uri, false, mAlarmObserver);
}
}
@Override
public void onPause() {
super.onPause();
- mPrefs.unregisterOnSharedPreferenceChangeListener(this);
Utils.cancelQuarterHourUpdater(mHandler, mQuarterHourUpdater);
- Activity activity = getActivity();
- activity.unregisterReceiver(mIntentReceiver);
- if (PRE_L_DEVICE) {
+
+ final Activity activity = getActivity();
+ activity.unregisterReceiver(mBroadcastReceiver);
+ if (mAlarmObserver != null) {
activity.getContentResolver().unregisterContentObserver(mAlarmObserver);
}
}
@Override
- public void onSaveInstanceState(Bundle outState) {
- outState.putBoolean(BUTTONS_HIDDEN_KEY, mButtonsHidden);
- super.onSaveInstanceState(outState);
- }
-
- @Override
- public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
- if (key == SettingsActivity.KEY_CLOCK_STYLE) {
- mClockStyle = prefs.getString(SettingsActivity.KEY_CLOCK_STYLE, mDefaultClockStyle);
- mAdapter.notifyDataSetChanged();
- }
- }
-
- @Override
public void onFabClick(View view) {
- final Activity activity = getActivity();
- startActivity(new Intent(activity, CitiesActivity.class));
+ startActivity(new Intent(getActivity(), CitySelectionActivity.class));
}
@Override
public void setFabAppearance() {
- final DeskClock activity = (DeskClock) getActivity();
- if (mFab == null || activity.getSelectedTab() != DeskClock.CLOCK_TAB_INDEX) {
+ if (mFab == null || getSelectedTab() != DeskClock.CLOCK_TAB_INDEX) {
return;
}
- mFab.setVisibility(View.VISIBLE);
- mFab.setImageResource(R.drawable.ic_globe);
+
+ mFab.setVisibility(VISIBLE);
+ mFab.setImageResource(R.drawable.ic_language_white_24dp);
mFab.setContentDescription(getString(R.string.button_cities));
}
@Override
public void setLeftRightButtonAppearance() {
- final DeskClock activity = (DeskClock) getActivity();
- if (mLeftButton == null || mRightButton == null ||
- activity.getSelectedTab() != DeskClock.CLOCK_TAB_INDEX) {
+ if (getSelectedTab() != DeskClock.CLOCK_TAB_INDEX) {
return;
}
- mLeftButton.setVisibility(View.INVISIBLE);
- mRightButton.setVisibility(View.INVISIBLE);
+
+ if (mLeftButton != null) {
+ mLeftButton.setVisibility(INVISIBLE);
+ }
+
+ if (mRightButton != null) {
+ mRightButton.setVisibility(INVISIBLE);
+ }
+ }
+
+ /**
+ * Refresh the displayed dates in response to a change that may have changed them.
+ */
+ private void refreshDates() {
+ // Refresh the date in the main clock.
+ Utils.updateDate(mDateFormat, mDateFormatForAccessibility, mClockFrame);
+
+ // Refresh the day-of-week in each world clock.
+ mCityAdapter.notifyDataSetChanged();
+ }
+
+ /**
+ * Refresh the next alarm time.
+ */
+ private void refreshAlarm() {
+ Utils.refreshAlarm(getActivity(), mClockFrame);
+ }
+
+ /**
+ * Long pressing over the main clock or any world clock item starts the screen saver.
+ */
+ private final class StartScreenSaverListener implements OnTouchListener, Runnable {
+
+ private float mTouchSlop = -1;
+ private int mLongPressTimeout = -1;
+ private float mLastTouchX, mLastTouchY;
+
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ if (mTouchSlop == -1) {
+ mTouchSlop = ViewConfiguration.get(getActivity()).getScaledTouchSlop();
+ mLongPressTimeout = ViewConfiguration.getLongPressTimeout();
+ }
+
+ switch (event.getAction()) {
+ case (MotionEvent.ACTION_DOWN):
+ // Create and post a runnable to start the screen saver in the future.
+ mHandler.postDelayed(this, mLongPressTimeout);
+ mLastTouchX = event.getX();
+ mLastTouchY = event.getY();
+ return true;
+
+ case (MotionEvent.ACTION_MOVE):
+ final float xDiff = Math.abs(event.getX() - mLastTouchX);
+ final float yDiff = Math.abs(event.getY() - mLastTouchY);
+ if (xDiff >= mTouchSlop || yDiff >= mTouchSlop) {
+ mHandler.removeCallbacks(this);
+ }
+ break;
+ default:
+ mHandler.removeCallbacks(this);
+ }
+ return false;
+ }
+
+ @Override
+ public void run() {
+ startActivity(new Intent(getActivity(), ScreensaverActivity.class));
+ }
+ }
+
+ /**
+ * This runnable executes at every quarter-hour (e.g. 1:00, 1:15, 1:30, 1:45, etc...) and
+ * updates the dates displayed within the UI. Quarter-hour increments were chosen to accommodate
+ * the "weirdest" timezones (e.g. Nepal is UTC/GMT +05:45).
+ */
+ private final class QuarterHourRunnable implements Runnable {
+ @Override
+ public void run() {
+ refreshDates();
+
+ // Schedule the next quarter-hour callback.
+ Utils.setQuarterHourUpdater(mHandler, mQuarterHourUpdater);
+ }
+ }
+
+ /**
+ * Prior to L, a ContentObserver was used to monitor changes to the next scheduled alarm.
+ * In L and beyond this is accomplished via a system broadcast of
+ * {@link AlarmManager#ACTION_NEXT_ALARM_CLOCK_CHANGED}.
+ */
+ private final class AlarmObserverPreL extends ContentObserver {
+ public AlarmObserverPreL(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ Utils.refreshAlarm(getActivity(), mClockFrame);
+ }
+ }
+
+ /**
+ * Handle system broadcasts that influence the display of this fragment. Since this fragment
+ * displays time-related information, ACTION_TIME_CHANGED and ACTION_TIMEZONE_CHANGED both
+ * alter the actual time values displayed. ACTION_NEXT_ALARM_CLOCK_CHANGED indicates the time at
+ * which the next alarm will fire has changed.
+ */
+ private final class SystemBroadcastReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ switch (intent.getAction()) {
+ case Intent.ACTION_TIME_CHANGED:
+ case Intent.ACTION_TIMEZONE_CHANGED:
+ refreshDates();
+
+ case AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED:
+ refreshAlarm();
+ }
+ }
+ }
+
+ /**
+ * This adapter lists all of the selected world clocks. Optionally, it also includes a clock at
+ * the top for the home timezone if "Automatic home clock" is turned on in settings and the
+ * current time at home does not match the current time in the timezone of the current location.
+ */
+ private static final class SelectedCitiesAdapter extends BaseAdapter {
+
+ private final LayoutInflater mInflater;
+ private final Context mContext;
+
+ public SelectedCitiesAdapter(Context context) {
+ mContext = context;
+ mInflater = LayoutInflater.from(context);
+ }
+
+ @Override
+ public int getCount() {
+ final int homeClockCount = getShowHomeClock() ? 1 : 0;
+ final int worldClockCount = getCities().size();
+ return homeClockCount + worldClockCount;
+ }
+
+ @Override
+ public Object getItem(int position) {
+ if (getShowHomeClock()) {
+ return position == 0 ? getHomeCity() : getCities().get(position - 1);
+ }
+
+ return getCities().get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View view, ViewGroup parent) {
+ // Retrieve the city to bind.
+ final City city = (City) getItem(position);
+
+ // Inflate a new view for the city, if necessary.
+ if (view == null) {
+ view = mInflater.inflate(R.layout.world_clock_list_item, parent, false);
+ }
+
+ final View clock = view.findViewById(R.id.city_left);
+
+ // Configure the digital clock or analog clock depending on the user preference.
+ final TextClock digitalClock = (TextClock) clock.findViewById(R.id.digital_clock);
+ final AnalogClock analogClock = (AnalogClock) clock.findViewById(R.id.analog_clock);
+ if (DataModel.getDataModel().getClockStyle() == DataModel.ClockStyle.ANALOG) {
+ digitalClock.setVisibility(GONE);
+ analogClock.setVisibility(VISIBLE);
+ analogClock.setTimeZone(city.getTimeZoneId());
+ analogClock.enableSeconds(false);
+ } else {
+ digitalClock.setVisibility(VISIBLE);
+ analogClock.setVisibility(GONE);
+ digitalClock.setTimeZone(city.getTimeZoneId());
+ Utils.setTimeFormat(mContext, digitalClock);
+ }
+
+ // Bind the city name.
+ final TextView name = (TextView) clock.findViewById(R.id.city_name);
+ name.setText(city.getName());
+
+ // Compute if the city week day matches the weekday of the current timezone.
+ final Calendar localCal = Calendar.getInstance(TimeZone.getDefault());
+ final Calendar cityCal = Calendar.getInstance(city.getTimeZone());
+ final boolean displayDayOfWeek = localCal.get(DAY_OF_WEEK) != cityCal.get(DAY_OF_WEEK);
+
+ // Bind the week day display.
+ final TextView dayOfWeek = (TextView) clock.findViewById(R.id.city_day);
+ dayOfWeek.setVisibility(displayDayOfWeek ? VISIBLE : GONE);
+ if (displayDayOfWeek) {
+ final Locale locale = Locale.getDefault();
+ final String weekday = cityCal.getDisplayName(DAY_OF_WEEK, Calendar.SHORT, locale);
+ dayOfWeek.setText(mContext.getString(R.string.world_day_of_week_label, weekday));
+ }
+
+ return view;
+ }
+
+ /**
+ * @return {@code false} to prevent the cities from responding to touch
+ */
+ @Override
+ public boolean isEnabled(int position) {
+ return false;
+ }
+
+ private City getHomeCity() {
+ return DataModel.getDataModel().getHomeCity();
+ }
+
+ private List<City> getCities() {
+ return DataModel.getDataModel().getSelectedCities();
+ }
+
+ private boolean getShowHomeClock() {
+ return DataModel.getDataModel().getShowHomeClock();
+ }
}
}
diff --git a/src/com/android/deskclock/DeskClock.java b/src/com/android/deskclock/DeskClock.java
index 0a4fafa..e0189a0 100644
--- a/src/com/android/deskclock/DeskClock.java
+++ b/src/com/android/deskclock/DeskClock.java
@@ -18,116 +18,161 @@
import android.app.Fragment;
import android.app.FragmentManager;
-import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.res.Configuration;
import android.media.AudioManager;
import android.os.Bundle;
-import android.preference.PreferenceManager;
import android.support.annotation.VisibleForTesting;
+import android.support.design.widget.TabLayout;
+import android.support.design.widget.TabLayout.Tab;
+import android.support.design.widget.TabLayout.ViewPagerOnTabSelectedListener;
import android.support.v13.app.FragmentPagerAdapter;
-import android.support.v4.app.FragmentTransaction;
-import android.support.v4.view.ViewPager;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.ActionBar.Tab;
+import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v7.app.AppCompatActivity;
-import android.text.TextUtils;
-import android.util.Log;
+import android.support.v7.widget.Toolbar;
+import android.util.ArraySet;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
+import android.view.ViewGroup;
import android.widget.ImageButton;
+import android.widget.ImageView;
+import com.android.deskclock.actionbarmenu.ActionBarMenuManager;
+import com.android.deskclock.actionbarmenu.MenuItemControllerFactory;
+import com.android.deskclock.actionbarmenu.NightModeMenuItemController;
+import com.android.deskclock.actionbarmenu.SettingMenuItemController;
import com.android.deskclock.alarms.AlarmStateManager;
+import com.android.deskclock.data.DataModel;
import com.android.deskclock.events.Events;
import com.android.deskclock.provider.Alarm;
import com.android.deskclock.stopwatch.StopwatchFragment;
-import com.android.deskclock.stopwatch.StopwatchService;
-import com.android.deskclock.stopwatch.Stopwatches;
import com.android.deskclock.timer.TimerFragment;
-import com.android.deskclock.timer.TimerObj;
-import com.android.deskclock.timer.Timers;
+import com.android.deskclock.widget.RtlViewPager;
import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.TimeZone;
+import java.util.List;
+import java.util.Set;
/**
* DeskClock clock view for desk docks.
*/
public class DeskClock extends BaseActivity
- implements LabelDialogFragment.TimerLabelDialogHandler,
- LabelDialogFragment.AlarmLabelDialogHandler {
+ implements LabelDialogFragment.AlarmLabelDialogHandler {
- private static final boolean DEBUG = false;
- private static final String LOG_TAG = "DeskClock";
+ private static final String TAG = "DeskClock";
// Alarm action for midnight (so we can update the date display).
private static final String KEY_SELECTED_TAB = "selected_tab";
public static final String SELECT_TAB_INTENT_EXTRA = "deskclock.select.tab";
- // Request code used when SettingsActivity is launched.
- private static final int REQUEST_CHANGE_SETTINGS = 1;
-
public static final int ALARM_TAB_INDEX = 0;
public static final int CLOCK_TAB_INDEX = 1;
public static final int TIMER_TAB_INDEX = 2;
public static final int STOPWATCH_TAB_INDEX = 3;
- // Tabs indices are switched for right-to-left since there is no
- // native support for RTL in the ViewPager.
- public static final int RTL_ALARM_TAB_INDEX = 3;
- public static final int RTL_CLOCK_TAB_INDEX = 2;
- public static final int RTL_TIMER_TAB_INDEX = 1;
- public static final int RTL_STOPWATCH_TAB_INDEX = 0;
+ private final ActionBarMenuManager mActionBarMenuManager = new ActionBarMenuManager(this);
- private ActionBar mActionBar;
- private Menu mMenu;
- private ViewPager mViewPager;
- private ImageButton mFab;
+ private TabLayout mTabLayout;
+ private RtlViewPager mViewPager;
+ private ImageView mFab;
private ImageButton mLeftButton;
private ImageButton mRightButton;
private TabsAdapter mTabsAdapter;
private int mSelectedTab;
- private boolean mActivityResumed;
+
+ /** {@code true} when a settings change necessitates recreating this activity. */
+ private boolean mRecreateActivity;
@Override
public void onNewIntent(Intent newIntent) {
super.onNewIntent(newIntent);
- if (DEBUG) Log.d(LOG_TAG, "onNewIntent with intent: " + newIntent);
+ LogUtils.d(TAG, "onNewIntent with intent: %s", 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);
- // Timer receiver may ask to go to the timers fragment if a timer expired.
+ // Honor the tab requested by the intent, if any.
int tab = newIntent.getIntExtra(SELECT_TAB_INTENT_EXTRA, -1);
- if (tab != -1) {
- if (mActionBar != null) {
- mActionBar.setSelectedNavigationItem(tab);
- }
+ if (tab != -1 && mTabLayout != null) {
+ mTabLayout.getTabAt(tab).select();
+ mViewPager.setCurrentItem(tab);
}
}
- private void initViews() {
+ @VisibleForTesting
+ DeskClockFragment getSelectedFragment() {
+ return (DeskClockFragment) mTabsAdapter.getItem(mSelectedTab);
+ }
+
+ private void createTabs() {
+ final TabLayout.Tab alarmTab = mTabLayout.newTab();
+ alarmTab.setIcon(R.drawable.ic_tab_alarm).setContentDescription(R.string.menu_alarm);
+ mTabsAdapter.addTab(alarmTab, AlarmClockFragment.class, ALARM_TAB_INDEX);
+
+ final Tab clockTab = mTabLayout.newTab();
+ clockTab.setIcon(R.drawable.ic_tab_clock).setContentDescription(R.string.menu_clock);
+ mTabsAdapter.addTab(clockTab, ClockFragment.class, CLOCK_TAB_INDEX);
+
+ final Tab timerTab = mTabLayout.newTab();
+ timerTab.setIcon(R.drawable.ic_tab_timer).setContentDescription(R.string.menu_timer);
+ mTabsAdapter.addTab(timerTab, TimerFragment.class, TIMER_TAB_INDEX);
+
+ final Tab stopwatchTab = mTabLayout.newTab();
+ stopwatchTab.setIcon(R.drawable.ic_tab_stopwatch)
+ .setContentDescription(R.string.menu_stopwatch);
+ mTabsAdapter.addTab(stopwatchTab, StopwatchFragment.class, STOPWATCH_TAB_INDEX);
+
+ mTabLayout.getTabAt(mSelectedTab).select();
+ mViewPager.setCurrentItem(mSelectedTab);
+ mTabsAdapter.notifySelectedPage(mSelectedTab);
+ }
+
+ @Override
+ protected void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setVolumeControlStream(AudioManager.STREAM_ALARM);
+
+ if (icicle != null) {
+ mSelectedTab = icicle.getInt(KEY_SELECTED_TAB, CLOCK_TAB_INDEX);
+ } else {
+ mSelectedTab = CLOCK_TAB_INDEX;
+
+ // Set the background color to initially match the theme value so that we can
+ // smoothly transition to the dynamic color.
+ setBackgroundColor(getResources().getColor(R.color.default_background),
+ false /* animate */);
+ }
+
+ // Honor the tab requested by the intent, if any.
+ final Intent intent = getIntent();
+ if (intent != null) {
+ int tab = intent.getIntExtra(SELECT_TAB_INTENT_EXTRA, -1);
+ if (tab != -1) {
+ mSelectedTab = tab;
+ }
+ }
+
setContentView(R.layout.desk_clock);
- mFab = (ImageButton) findViewById(R.id.fab);
+ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ mTabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
+ mFab = (ImageView) findViewById(R.id.fab);
mLeftButton = (ImageButton) findViewById(R.id.left_button);
mRightButton = (ImageButton) findViewById(R.id.right_button);
if (mTabsAdapter == null) {
- mViewPager = (ViewPager) findViewById(R.id.desk_clock_pager);
+ mViewPager = (RtlViewPager) findViewById(R.id.desk_clock_pager);
// Keep all four tabs to minimize jank.
mViewPager.setOffscreenPageLimit(3);
// Set Accessibility Delegate to null so ViewPager doesn't intercept movements and
// prevent the fab from being selected.
mViewPager.setAccessibilityDelegate(null);
mTabsAdapter = new TabsAdapter(this, mViewPager);
- createTabs(mSelectedTab);
+ createTabs();
+ mTabLayout.setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(mViewPager));
}
mFab.setOnClickListener(new OnClickListener() {
@@ -149,77 +194,16 @@
}
});
- mActionBar.setSelectedNavigationItem(mSelectedTab);
- }
+ // Configure the menu item controllers.
+ mActionBarMenuManager
+ .addMenuItemController(new SettingMenuItemController(this))
+ .addMenuItemController(new NightModeMenuItemController(this))
+ .addMenuItemController(MenuItemControllerFactory.getInstance()
+ .buildMenuItemControllers(this));
- @VisibleForTesting
- DeskClockFragment getSelectedFragment() {
- return (DeskClockFragment) mTabsAdapter.getItem(getRtlPosition(mSelectedTab));
- }
-
- private void createTabs(int selectedIndex) {
- mActionBar = getSupportActionBar();
-
- if (mActionBar != null) {
- mActionBar.setDisplayOptions(0);
- mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
-
- final Tab alarmTab = mActionBar.newTab();
-
- alarmTab.setIcon(R.drawable.ic_tab_alarm);
- alarmTab.setContentDescription(R.string.menu_alarm);
- mTabsAdapter.addTab(alarmTab,
- Utils.isLOrLater()
- ? AlarmClockFragmentPostL.class
- : AlarmClockFragmentPreL.class,
- ALARM_TAB_INDEX);
-
- final Tab clockTab = mActionBar.newTab();
- clockTab.setIcon(R.drawable.ic_tab_clock);
- clockTab.setContentDescription(R.string.menu_clock);
- mTabsAdapter.addTab(clockTab, ClockFragment.class, CLOCK_TAB_INDEX);
-
- final Tab timerTab = mActionBar.newTab();
- timerTab.setIcon(R.drawable.ic_tab_timer);
- timerTab.setContentDescription(R.string.menu_timer);
- mTabsAdapter.addTab(timerTab, TimerFragment.class, TIMER_TAB_INDEX);
-
- final Tab stopwatchTab = mActionBar.newTab();
- stopwatchTab.setIcon(R.drawable.ic_tab_stopwatch);
- stopwatchTab.setContentDescription(R.string.menu_stopwatch);
- mTabsAdapter.addTab(stopwatchTab, StopwatchFragment.class, STOPWATCH_TAB_INDEX);
-
- mActionBar.setSelectedNavigationItem(selectedIndex);
- mTabsAdapter.notifySelectedPage(selectedIndex);
- }
- }
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- setVolumeControlStream(AudioManager.STREAM_ALARM);
-
- if (icicle != null) {
- mSelectedTab = icicle.getInt(KEY_SELECTED_TAB, CLOCK_TAB_INDEX);
- } else {
- mSelectedTab = CLOCK_TAB_INDEX;
-
- // Set the background color to initially match the theme value so that we can
- // smoothly transition to the dynamic color.
- setBackgroundColor(getResources().getColor(R.color.default_background),
- false /* animate */);
- }
-
- // Timer receiver may ask the app to go to the timer fragment if a timer expired
- Intent i = getIntent();
- if (i != null) {
- int tab = i.getIntExtra(SELECT_TAB_INTENT_EXTRA, -1);
- if (tab != -1) {
- mSelectedTab = tab;
- }
- }
- initViews();
- setHomeTimeZone();
+ // Inflate the menu during creation to avoid a double layout pass. Otherwise, the menu
+ // inflation occurs *after* the initial draw and a second layout pass adds in the menu.
+ onCreateOptionsMenu(toolbar.getMenu());
// We need to update the system next alarm time on app startup because the
// user might have clear our data.
@@ -229,144 +213,69 @@
@Override
protected void onResume() {
super.onResume();
+ DataModel.getDataModel().setApplicationInForeground(true);
+ }
- // We only want to show notifications for stopwatch/timer when the app is closed so
- // that we don't have to worry about keeping the notifications in perfect sync with
- // the app.
- Intent stopwatchIntent = new Intent(getApplicationContext(), StopwatchService.class);
- stopwatchIntent.setAction(Stopwatches.KILL_NOTIF);
- startService(stopwatchIntent);
+ @Override
+ protected void onPostResume() {
+ super.onPostResume();
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(this);
- SharedPreferences.Editor editor = prefs.edit();
- editor.putBoolean(Timers.NOTIF_APP_OPEN, true);
- editor.apply();
- Intent timerIntent = new Intent();
- timerIntent.setAction(Timers.NOTIF_IN_USE_CANCEL);
- sendBroadcast(timerIntent);
- mActivityResumed = true;
+ if (mRecreateActivity) {
+ mRecreateActivity = false;
+
+ // A runnable must be posted here or the new DeskClock activity will be recreated in a
+ // paused state, even though it is the foreground activity.
+ mViewPager.post(new Runnable() {
+ @Override
+ public void run() {
+ recreate();
+ }
+ });
+ }
}
@Override
public void onPause() {
- mActivityResumed = false;
- Intent intent = new Intent(getApplicationContext(), StopwatchService.class);
- intent.setAction(Stopwatches.SHOW_NOTIF);
- startService(intent);
-
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(this);
- SharedPreferences.Editor editor = prefs.edit();
- editor.putBoolean(Timers.NOTIF_APP_OPEN, false);
- editor.apply();
- Utils.showInUseNotifications(this);
-
+ DataModel.getDataModel().setApplicationInForeground(false);
super.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
- outState.putInt(KEY_SELECTED_TAB, mActionBar.getSelectedNavigationIndex());
+ outState.putInt(KEY_SELECTED_TAB, mTabLayout.getSelectedTabPosition());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- // We only want to show it as a menu in landscape, and only for clock/alarm fragment.
- mMenu = menu;
- if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
- if (mActionBar.getSelectedNavigationIndex() == ALARM_TAB_INDEX ||
- mActionBar.getSelectedNavigationIndex() == CLOCK_TAB_INDEX) {
- // Clear the menu so that it doesn't get duplicate items in case onCreateOptionsMenu
- // was called multiple times.
- menu.clear();
- getMenuInflater().inflate(R.menu.desk_clock_menu, menu);
- }
- // Always return true for landscape, regardless of whether we've inflated the menu, so
- // that when we switch tabs this method will get called and we can inflate the menu.
- return true;
- }
- return false;
+ mActionBarMenuManager.createOptionsMenu(menu, getMenuInflater());
+ return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
- updateMenu(menu);
+ super.onPrepareOptionsMenu(menu);
+ mActionBarMenuManager.prepareShowMenu(menu);
return true;
}
- private void updateMenu(Menu menu) {
- // Hide "help" if we don't have a URI for it.
- MenuItem help = menu.findItem(R.id.menu_item_help);
- if (help != null) {
- Utils.prepareHelpMenuItem(this, help);
- }
-
- // Hide "lights out" for timer.
- MenuItem nightMode = menu.findItem(R.id.menu_item_night_mode);
- if (mActionBar.getSelectedNavigationIndex() == ALARM_TAB_INDEX) {
- nightMode.setVisible(false);
- } else if (mActionBar.getSelectedNavigationIndex() == CLOCK_TAB_INDEX) {
- nightMode.setVisible(true);
- }
- }
-
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- if (processMenuClick(item)) {
+ if (mActionBarMenuManager.handleMenuItemClick(item)) {
return true;
}
-
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Recreate the activity if any settings have been changed
- if (requestCode == REQUEST_CHANGE_SETTINGS && resultCode == RESULT_OK) {
- recreate();
+ if (requestCode == SettingMenuItemController.REQUEST_CHANGE_SETTINGS
+ && resultCode == RESULT_OK) {
+ mRecreateActivity = true;
}
}
- private boolean processMenuClick(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_item_settings:
- startActivityForResult(new Intent(DeskClock.this, SettingsActivity.class),
- REQUEST_CHANGE_SETTINGS);
- return true;
- case R.id.menu_item_help:
- Intent i = item.getIntent();
- if (i != null) {
- try {
- startActivity(i);
- } catch (ActivityNotFoundException e) {
- // No activity found to match the intent - ignore
- }
- }
- return true;
- case R.id.menu_item_night_mode:
- startActivity(new Intent(DeskClock.this, ScreensaverActivity.class));
- default:
- break;
- }
- return true;
- }
-
- /**
- * Insert the local time zone as the Home Time Zone if one is not set
- */
- private void setHomeTimeZone() {
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(this);
- String homeTimeZone = prefs.getString(SettingsActivity.KEY_HOME_TZ, "");
- if (!homeTimeZone.isEmpty()) {
- return;
- }
- homeTimeZone = TimeZone.getDefault().getID();
- SharedPreferences.Editor editor = prefs.edit();
- editor.putString(SettingsActivity.KEY_HOME_TZ, homeTimeZone);
- editor.apply();
- Log.v(LOG_TAG, "Setting home time zone to " + homeTimeZone);
- }
-
public void registerPageChangedListener(DeskClockFragment frag) {
if (mTabsAdapter != null) {
mTabsAdapter.registerPageChangedListener(frag);
@@ -382,8 +291,7 @@
/**
* Adapter for wrapping together the ActionBar's tab with the ViewPager
*/
- private class TabsAdapter extends FragmentPagerAdapter
- implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
+ private class TabsAdapter extends FragmentPagerAdapter implements OnPageChangeListener {
private static final String KEY_TAB_POSITION = "tab_position";
@@ -402,20 +310,23 @@
}
}
- private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
- ActionBar mMainActionBar;
- Context mContext;
- ViewPager mPager;
+ private final List<TabInfo> mTabs = new ArrayList<>(4 /* number of fragments */);
+ private final Context mContext;
+ private final RtlViewPager mPager;
// Used for doing callbacks to fragments.
- HashSet<String> mFragmentTags = new HashSet<String>();
+ private final Set<String> mFragmentTags = new ArraySet<>(4 /* number of fragments */);
- public TabsAdapter(AppCompatActivity activity, ViewPager pager) {
+ public TabsAdapter(AppCompatActivity activity, RtlViewPager pager) {
super(activity.getFragmentManager());
mContext = activity;
- mMainActionBar = activity.getSupportActionBar();
mPager = pager;
mPager.setAdapter(this);
- mPager.setOnPageChangeListener(this);
+ mPager.setOnRTLPageChangeListener(this);
+ }
+
+ @Override
+ public Object instantiateItem(ViewGroup container, int position) {
+ return super.instantiateItem(container, mViewPager.getRtlAwareIndex(position));
}
@Override
@@ -425,7 +336,7 @@
final String name = makeFragmentName(R.id.desk_clock_pager, position);
Fragment fragment = getFragmentManager().findFragmentByTag(name);
if (fragment == null) {
- TabInfo info = mTabs.get(getRtlPosition(position));
+ TabInfo info = mTabs.get(position);
fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args);
if (fragment instanceof TimerFragment) {
((TimerFragment) fragment).setFabAppearance();
@@ -449,12 +360,10 @@
return mTabs.size();
}
- public void addTab(ActionBar.Tab tab, Class<?> clss, int position) {
+ public void addTab(TabLayout.Tab tab, Class<?> clss, int position) {
TabInfo info = new TabInfo(clss, position);
- tab.setTag(info);
- tab.setTabListener(this);
mTabs.add(info);
- mMainActionBar.addTab(tab);
+ mTabLayout.addTab(tab);
notifyDataSetChanged();
}
@@ -466,39 +375,14 @@
@Override
public void onPageSelected(int position) {
// Set the page before doing the menu so that onCreateOptionsMenu knows what page it is.
- mMainActionBar.setSelectedNavigationItem(getRtlPosition(position));
+ mTabLayout.getTabAt(position).select();
notifyPageChanged(position);
- // Only show the overflow menu for alarm and world clock.
- if (mMenu != null) {
- // Make sure the menu's been initialized.
- if (position == ALARM_TAB_INDEX || position == CLOCK_TAB_INDEX) {
- mMenu.setGroupVisible(R.id.menu_items, true);
- onCreateOptionsMenu(mMenu);
- } else {
- mMenu.setGroupVisible(R.id.menu_items, false);
- }
- }
- }
-
- @Override
- public void onPageScrollStateChanged(int state) {
- // Do nothing
- }
-
- @Override
- public void onTabReselected(Tab tab, FragmentTransaction arg1) {
- // Do nothing
- }
-
- @Override
- public void onTabSelected(Tab tab, FragmentTransaction ft) {
- final TabInfo info = (TabInfo) tab.getTag();
- final int position = info.getPosition();
- final int rtlSafePosition = getRtlPosition(position);
mSelectedTab = position;
- if (mActivityResumed) {
+ // Avoid sending events for the initial tab selection on launch and the reselecting a
+ // tab after a configuration change.
+ if (DataModel.getDataModel().isApplicationInForeground()) {
switch (mSelectedTab) {
case ALARM_TAB_INDEX:
Events.sendAlarmEvent(R.string.action_show, R.string.label_deskclock);
@@ -515,16 +399,15 @@
}
}
- final DeskClockFragment f = (DeskClockFragment) getItem(rtlSafePosition);
+ final DeskClockFragment f = (DeskClockFragment) getItem(position);
if (f != null) {
f.setFabAppearance();
f.setLeftRightButtonAppearance();
}
- mPager.setCurrentItem(rtlSafePosition);
}
@Override
- public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
+ public void onPageScrollStateChanged(int state) {
// Do nothing
}
@@ -545,34 +428,22 @@
public void registerPageChangedListener(DeskClockFragment frag) {
String tag = frag.getTag();
if (mFragmentTags.contains(tag)) {
- Log.wtf(LOG_TAG, "Trying to add an existing fragment " + tag);
+ LogUtils.wtf(TAG, "Trying to add an existing fragment " + tag);
} else {
mFragmentTags.add(frag.getTag());
}
// Since registering a listener by the fragment is done sometimes after the page
// was already changed, make sure the fragment gets the current page
- frag.onPageChanged(mMainActionBar.getSelectedNavigationIndex());
+ frag.onPageChanged(mTabLayout.getSelectedTabPosition());
}
public void unregisterPageChangedListener(DeskClockFragment frag) {
mFragmentTags.remove(frag.getTag());
}
-
}
/**
- * Called by the LabelDialogFormat class after the dialog is finished. *
- */
- @Override
- public void onDialogLabelSet(TimerObj timer, String label, String tag) {
- Fragment frag = getFragmentManager().findFragmentByTag(tag);
- if (frag instanceof TimerFragment) {
- ((TimerFragment) frag).setLabel(timer, label);
- }
- }
-
- /**
- * Called by the LabelDialogFormat class after the dialog is finished. *
+ * Called by the LabelDialogFormat class after the dialog is finished.
*/
@Override
public void onDialogLabelSet(Alarm alarm, String label, String tag) {
@@ -586,30 +457,7 @@
return mSelectedTab;
}
- private boolean isRtl() {
- return TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) ==
- View.LAYOUT_DIRECTION_RTL;
- }
-
- private int getRtlPosition(int position) {
- if (isRtl()) {
- switch (position) {
- case TIMER_TAB_INDEX:
- return RTL_TIMER_TAB_INDEX;
- case CLOCK_TAB_INDEX:
- return RTL_CLOCK_TAB_INDEX;
- case STOPWATCH_TAB_INDEX:
- return RTL_STOPWATCH_TAB_INDEX;
- case ALARM_TAB_INDEX:
- return RTL_ALARM_TAB_INDEX;
- default:
- break;
- }
- }
- return position;
- }
-
- public ImageButton getFab() {
+ public ImageView getFab() {
return mFab;
}
diff --git a/src/com/android/deskclock/DeskClockApplication.java b/src/com/android/deskclock/DeskClockApplication.java
index b71ce5f..c560f01 100644
--- a/src/com/android/deskclock/DeskClockApplication.java
+++ b/src/com/android/deskclock/DeskClockApplication.java
@@ -18,6 +18,7 @@
import android.app.Application;
+import com.android.deskclock.data.DataModel;
import com.android.deskclock.events.Events;
import com.android.deskclock.events.LogEventTracker;
@@ -27,6 +28,8 @@
public void onCreate() {
super.onCreate();
+ DataModel.getDataModel().setContext(getApplicationContext());
+
Events.addEventTracker(new LogEventTracker(getApplicationContext()));
}
}
diff --git a/src/com/android/deskclock/DeskClockFragment.java b/src/com/android/deskclock/DeskClockFragment.java
index 2f5202f..669f1ef 100644
--- a/src/com/android/deskclock/DeskClockFragment.java
+++ b/src/com/android/deskclock/DeskClockFragment.java
@@ -19,14 +19,13 @@
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
-import android.support.v7.widget.PopupMenu;
-import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
+import android.widget.ImageView;
public class DeskClockFragment extends Fragment {
- protected ImageButton mFab;
+ protected ImageView mFab;
protected ImageButton mLeftButton;
protected ImageButton mRightButton;
@@ -65,33 +64,13 @@
public void onRightButtonClick(View view) {
// Do nothing here , only in derived classes
}
- /**
- * Installs click and touch listeners on a fake overflow menu button.
- *
- * @param menuButton the fragment's fake overflow menu button
- */
- public void setupFakeOverflowMenuButton(View menuButton) {
- final PopupMenu fakeOverflow = new PopupMenu(menuButton.getContext(), menuButton) {
- @Override
- public void show() {
- getActivity().onPrepareOptionsMenu(getMenu());
- super.show();
- }
- };
- fakeOverflow.inflate(R.menu.desk_clock_menu);
- fakeOverflow.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener () {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- return getActivity().onOptionsItemSelected(item);
- }
- });
- menuButton.setOnTouchListener(fakeOverflow.getDragToOpenListener());
- menuButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- fakeOverflow.show();
- }
- });
+ protected final DeskClock getDeskClock() {
+ return (DeskClock) getActivity();
+ }
+
+ protected final int getSelectedTab() {
+ final DeskClock deskClock = getDeskClock();
+ return deskClock == null ? -1 : deskClock.getSelectedTab();
}
}
diff --git a/src/com/android/deskclock/DontPressWithParentLayout.java b/src/com/android/deskclock/DontPressWithParentLayout.java
deleted file mode 100644
index 6c13998..0000000
--- a/src/com/android/deskclock/DontPressWithParentLayout.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * 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/FetchMatchingAlarmsAction.java b/src/com/android/deskclock/FetchMatchingAlarmsAction.java
index 4729461..9b797b4 100644
--- a/src/com/android/deskclock/FetchMatchingAlarmsAction.java
+++ b/src/com/android/deskclock/FetchMatchingAlarmsAction.java
@@ -105,6 +105,20 @@
}
break;
case AlarmClock.ALARM_SEARCH_MODE_NEXT:
+ // Match currently firing alarms before scheduled alarms.
+ for (Alarm alarm : mAlarms) {
+ final AlarmInstance alarmInstance =
+ AlarmInstance.getNextUpcomingInstanceByAlarmId(cr, alarm.id);
+ if (alarmInstance != null
+ && alarmInstance.mAlarmState == AlarmInstance.FIRED_STATE) {
+ mMatchingAlarms.add(alarm);
+ }
+ }
+ if (!mMatchingAlarms.isEmpty()) {
+ // return the matched firing alarms
+ return;
+ }
+
final AlarmInstance nextAlarm = AlarmStateManager.getNextFiringAlarm(mContext);
if (nextAlarm == null) {
final String reason = mContext.getString(R.string.no_scheduled_alarms);
@@ -163,4 +177,4 @@
LogUtils.e(reason);
Voice.notifyFailure(activity, reason);
}
-}
\ No newline at end of file
+}
diff --git a/src/com/android/deskclock/HandleApiCalls.java b/src/com/android/deskclock/HandleApiCalls.java
index e74dd71..06cb65a 100644
--- a/src/com/android/deskclock/HandleApiCalls.java
+++ b/src/com/android/deskclock/HandleApiCalls.java
@@ -20,36 +20,38 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Looper;
import android.os.Parcelable;
-import android.preference.PreferenceManager;
import android.provider.AlarmClock;
import android.text.TextUtils;
import android.text.format.DateFormat;
import com.android.deskclock.alarms.AlarmStateManager;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Timer;
import com.android.deskclock.events.Events;
import com.android.deskclock.provider.Alarm;
import com.android.deskclock.provider.AlarmInstance;
import com.android.deskclock.provider.DaysOfWeek;
-import com.android.deskclock.timer.TimerFullScreenFragment;
-import com.android.deskclock.timer.TimerObj;
-import com.android.deskclock.timer.Timers;
+import com.android.deskclock.timer.TimerFragment;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
-public class HandleApiCalls extends Activity {
+import static android.text.format.DateUtils.SECOND_IN_MILLIS;
- public static final long TIMER_MIN_LENGTH = 1000;
- public static final long TIMER_MAX_LENGTH = 24 * 60 * 60 * 1000;
+/**
+ * This activity is never visible. It processes all public intents defined by {@link AlarmClock}
+ * that apply to alarms and timers. Its definition in AndroidManifest.xml requires callers to hold
+ * the com.android.alarm.permission.SET_ALARM permission to complete the requested action.
+ */
+public class HandleApiCalls extends Activity {
private Context mAppContext;
@@ -300,12 +302,12 @@
alarm.daysOfWeek = daysOfWeek;
alarm.vibrate = vibrate;
- if (alert == null) {
- alarm.alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
- } else if (AlarmClock.VALUE_RINGTONE_SILENT.equals(alert) || alert.isEmpty()) {
- alarm.alert = Alarm.NO_RINGTONE_URI;
- } else {
- alarm.alert = Uri.parse(alert);
+ if (alert != null) {
+ if (AlarmClock.VALUE_RINGTONE_SILENT.equals(alert) || alert.isEmpty()) {
+ alarm.alert = Alarm.NO_RINGTONE_URI;
+ } else {
+ alarm.alert = Uri.parse(alert);
+ }
}
alarm.deleteAfterUse = !daysOfWeek.isRepeating() && skipUi;
@@ -327,66 +329,52 @@
}
private void handleSetTimer(Intent intent) {
- final SharedPreferences prefs = Utils.getDefaultSharedPreferences(this);
- // If no length is supplied, show the timer setup view
+ // If no length is supplied, show the timer setup view.
if (!intent.hasExtra(AlarmClock.EXTRA_LENGTH)) {
- startActivity(new Intent(this, DeskClock.class)
- .putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.TIMER_TAB_INDEX)
- .putExtra(TimerFullScreenFragment.GOTO_SETUP_VIEW, true));
+ startActivity(TimerFragment.createTimerSetupIntent(this));
LogUtils.i("HandleApiCalls showing timer setup");
return;
}
- final long length = 1000l * intent.getIntExtra(AlarmClock.EXTRA_LENGTH, 0);
- if (length < TIMER_MIN_LENGTH || length > TIMER_MAX_LENGTH) {
+ // Verify that the timer length is between one second and one day.
+ final long lengthMillis = SECOND_IN_MILLIS * intent.getIntExtra(AlarmClock.EXTRA_LENGTH, 0);
+ if (lengthMillis < Timer.MIN_LENGTH || lengthMillis > Timer.MAX_LENGTH) {
Voice.notifyFailure(this, getString(R.string.invalid_timer_length));
- LogUtils.i("Invalid timer length requested: " + length);
+ LogUtils.i("Invalid timer length requested: " + lengthMillis);
return;
}
- String label = getMessageFromIntent(intent);
- TimerObj timer = null;
- // Find an existing matching time
- final List<TimerObj> timers = new ArrayList<>();
- TimerObj.getTimersFromSharedPrefs(prefs, timers);
- for (TimerObj t : timers) {
- if (t.mSetupLength == length && (TextUtils.equals(label, t.mLabel))
- && t.mState == TimerObj.STATE_RESTART) {
- timer = t;
- break;
- }
+ final String label = getMessageFromIntent(intent);
+ final boolean skipUi = intent.getBooleanExtra(AlarmClock.EXTRA_SKIP_UI, false);
+
+ // Attempt to reuse an existing timer that is Reset with the same length and label.
+ Timer timer = null;
+ for (Timer t : DataModel.getDataModel().getTimers()) {
+ if (!t.isReset()) { continue; }
+ if (t.getLength() != lengthMillis) { continue; }
+ if (!TextUtils.equals(label, t.getLabel())) { continue; }
+
+ timer = t;
+ break;
}
- boolean skipUi = intent.getBooleanExtra(AlarmClock.EXTRA_SKIP_UI, false);
+ // Create a new timer if one could not be reused.
if (timer == null) {
- // Use a new timer
- timer = new TimerObj(length, label, this /* context */);
- // Timers set without presenting UI to the user will be deleted after use
- timer.mDeleteAfterUse = skipUi;
-
+ timer = DataModel.getDataModel().addTimer(lengthMillis, label, skipUi);
Events.sendTimerEvent(R.string.action_create, R.string.label_intent);
}
- timer.setState(TimerObj.STATE_RUNNING);
- timer.mStartTime = Utils.getTimeNow();
- timer.writeToSharedPref(prefs);
-
+ // Start the selected timer.
+ DataModel.getDataModel().startTimer(timer);
Events.sendTimerEvent(R.string.action_start, R.string.label_intent);
+ Voice.notifySuccess(this, getString(R.string.timer_created));
- // Tell TimerReceiver that the timer was started
- sendBroadcast(new Intent().setAction(Timers.START_TIMER)
- .putExtra(Timers.TIMER_INTENT_EXTRA, timer.mTimerId));
-
- if (skipUi) {
- Utils.showInUseNotifications(this);
- } else {
+ // If not instructed to skip the UI, display the running timer.
+ if (!skipUi) {
startActivity(new Intent(this, DeskClock.class)
.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.TIMER_TAB_INDEX)
- .putExtra(Timers.FIRST_LAUNCH_FROM_API_CALL, true)
- .putExtra(Timers.SCROLL_TO_TIMER_ID, timer.mTimerId));
+ .putExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID, timer.getId()));
}
- Voice.notifySuccess(this, getString(R.string.timer_created));
- LogUtils.i("HandleApiCalls timer created: %s", timer);
}
private void setupInstance(AlarmInstance instance, boolean skipUi) {
@@ -402,12 +390,12 @@
}
}
- private String getMessageFromIntent(Intent intent) {
+ private static String getMessageFromIntent(Intent intent) {
final String message = intent.getStringExtra(AlarmClock.EXTRA_MESSAGE);
return message == null ? "" : message;
}
- private DaysOfWeek getDaysFromIntent(Intent intent) {
+ private static DaysOfWeek getDaysFromIntent(Intent intent) {
final DaysOfWeek daysOfWeek = new DaysOfWeek(0);
final ArrayList<Integer> days = intent.getIntegerArrayListExtra(AlarmClock.EXTRA_DAYS);
if (days != null) {
diff --git a/src/com/android/deskclock/HandleDeskClockApiCalls.java b/src/com/android/deskclock/HandleDeskClockApiCalls.java
index 3e74402..224bf19 100644
--- a/src/com/android/deskclock/HandleDeskClockApiCalls.java
+++ b/src/com/android/deskclock/HandleDeskClockApiCalls.java
@@ -19,26 +19,15 @@
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.AsyncTask;
import android.os.Bundle;
-import android.preference.PreferenceManager;
+import com.android.deskclock.data.City;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Timer;
import com.android.deskclock.events.Events;
-import com.android.deskclock.stopwatch.StopwatchService;
-import com.android.deskclock.stopwatch.Stopwatches;
-import com.android.deskclock.timer.TimerFullScreenFragment;
-import com.android.deskclock.timer.TimerObj;
-import com.android.deskclock.timer.Timers;
-import com.android.deskclock.worldclock.Cities;
-import com.android.deskclock.worldclock.CitiesActivity;
-import com.android.deskclock.worldclock.CityObj;
+import com.android.deskclock.worldclock.CitySelectionActivity;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
-import java.util.Map;
import java.util.Set;
public class HandleDeskClockApiCalls extends Activity {
@@ -48,6 +37,8 @@
// shows the tab with world clocks
public static final String ACTION_SHOW_CLOCK = ACTION_PREFIX + "SHOW_CLOCK";
+ // extra for ACTION_SHOW_CLOCK indicating the clock is being displayed from tapping the widget
+ public static final String EXTRA_FROM_WIDGET = "com.android.deskclock.extra.clock.FROM_WIDGET";
// add a clock of a selected city, if no city is specified opens the city selection screen
public static final String ACTION_ADD_CLOCK = ACTION_PREFIX + "ADD_CLOCK";
// delete a clock of a selected city, if no city is specified shows CitiesActivity for the user
@@ -60,23 +51,30 @@
public static final String ACTION_SHOW_STOPWATCH = ACTION_PREFIX + "SHOW_STOPWATCH";
// starts the current stopwatch
public static final String ACTION_START_STOPWATCH = ACTION_PREFIX + "START_STOPWATCH";
- // stops the current stopwatch
- public static final String ACTION_STOP_STOPWATCH = ACTION_PREFIX + "STOP_STOPWATCH";
+ // pauses the current stopwatch that's currently running
+ public static final String ACTION_PAUSE_STOPWATCH = ACTION_PREFIX + "PAUSE_STOPWATCH";
// laps the stopwatch that's currently running
public static final String ACTION_LAP_STOPWATCH = ACTION_PREFIX + "LAP_STOPWATCH";
// resets the stopwatch if it's stopped
public static final String ACTION_RESET_STOPWATCH = ACTION_PREFIX + "RESET_STOPWATCH";
- // shows the tab with timers
+ // shows the tab with timers; optionally scrolls to a specific timer
public static final String ACTION_SHOW_TIMERS = ACTION_PREFIX + "SHOW_TIMERS";
- // deletes the topmost timer
- public static final String ACTION_DELETE_TIMER = ACTION_PREFIX + "DELETE_TIMER";
- // stops the running timer
- public static final String ACTION_STOP_TIMER = ACTION_PREFIX + "STOP_TIMER";
- // starts the topmost timer
+ // pauses running timers; resets expired timers
+ public static final String ACTION_PAUSE_TIMER = ACTION_PREFIX + "PAUSE_TIMER";
+ // starts the sole timer
public static final String ACTION_START_TIMER = ACTION_PREFIX + "START_TIMER";
- // resets the timer, works for both running and stopped
+ // resets the timer
public static final String ACTION_RESET_TIMER = ACTION_PREFIX + "RESET_TIMER";
+ // adds an extra minute to the timer
+ public static final String ACTION_ADD_MINUTE_TIMER = ACTION_PREFIX + "ADD_MINUTE_TIMER";
+
+ // extra for many actions specific to a given timer
+ public static final String EXTRA_TIMER_ID =
+ "com.android.deskclock.extra.TIMER_ID";
+
+ // Describes the entity responsible for the action being performed.
+ public static final String EXTRA_EVENT_LABEL = "com.android.deskclock.extra.EVENT_LABEL";
@Override
protected void onCreate(Bundle icicle) {
@@ -90,25 +88,26 @@
}
final String action = intent.getAction();
+ LogUtils.i("HandleDeskClockApiCalls " + action);
+
switch (action) {
case ACTION_START_STOPWATCH:
- case ACTION_STOP_STOPWATCH:
+ case ACTION_PAUSE_STOPWATCH:
case ACTION_LAP_STOPWATCH:
case ACTION_SHOW_STOPWATCH:
case ACTION_RESET_STOPWATCH:
- handleStopwatchIntent(action);
+ handleStopwatchIntent(intent);
break;
case ACTION_SHOW_TIMERS:
- case ACTION_DELETE_TIMER:
case ACTION_RESET_TIMER:
- case ACTION_STOP_TIMER:
+ case ACTION_PAUSE_TIMER:
case ACTION_START_TIMER:
- handleTimerIntent(action);
+ handleTimerIntent(intent);
break;
case ACTION_SHOW_CLOCK:
case ACTION_ADD_CLOCK:
case ACTION_DELETE_CLOCK:
- handleClockIntent(action);
+ handleClockIntent(intent);
break;
}
} finally {
@@ -116,400 +115,243 @@
}
}
- private void handleStopwatchIntent(String action) {
- // Opens the UI for stopwatch
- final Intent stopwatchIntent = new Intent(mAppContext, DeskClock.class)
- .setAction(action)
- .putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.STOPWATCH_TAB_INDEX);
- startActivity(stopwatchIntent);
- LogUtils.i("HandleDeskClockApiCalls " + action);
+ private void handleStopwatchIntent(Intent intent) {
+ final String action = intent.getAction();
- if (action.equals(ACTION_SHOW_STOPWATCH)) {
- Events.sendStopwatchEvent(R.string.action_show, R.string.label_intent);
- return;
- }
+ // Determine where this intent originated.
+ final int eventLabel = intent.getIntExtra(EXTRA_EVENT_LABEL, R.string.label_intent);
- // checking if the stopwatch is already running
- final SharedPreferences prefs = Utils.getDefaultSharedPreferences(mAppContext);
- final boolean stopwatchAlreadyRunning =
- prefs.getBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, false);
-
- if (stopwatchAlreadyRunning) {
- // don't fire START_STOPWATCH or RESET_STOPWATCH if a stopwatch is already running
- if (ACTION_START_STOPWATCH.equals(action)) {
- final String reason = getString(R.string.stopwatch_already_running);
- Voice.notifyFailure(this, reason);
- LogUtils.i(reason);
- return;
- } else if (ACTION_RESET_STOPWATCH.equals(action)) { // RESET_STOPWATCH
- final String reason = getString(R.string.stopwatch_cant_be_reset_because_is_running);
- Voice.notifyFailure(this, reason);
- LogUtils.i(reason);
- return;
- }
+ if (ACTION_SHOW_STOPWATCH.equals(action)) {
+ Events.sendStopwatchEvent(R.string.action_show, eventLabel);
} else {
- // if a stopwatch isn't running, don't try to stop or lap it
- if (ACTION_STOP_STOPWATCH.equals(action) ||
- ACTION_LAP_STOPWATCH.equals(action)) {
- final String reason = getString(R.string.stopwatch_isnt_running);
- Voice.notifyFailure(this, reason);
- LogUtils.i(reason);
- return;
- }
- }
-
- final String reason;
- // Events and voice interactor setup
- switch (action) {
- case ACTION_START_STOPWATCH:
- Events.sendStopwatchEvent(R.string.action_start, R.string.label_intent);
- reason = getString(R.string.stopwatch_started);
- break;
- case ACTION_STOP_STOPWATCH:
- Events.sendStopwatchEvent(R.string.action_stop, R.string.label_intent);
- reason = getString(R.string.stopwatch_stopped);
- break;
- case ACTION_LAP_STOPWATCH:
- Events.sendStopwatchEvent(R.string.action_lap, R.string.label_intent);
- reason = getString(R.string.stopwatch_lapped);
- break;
- case ACTION_RESET_STOPWATCH:
- Events.sendStopwatchEvent(R.string.action_reset, R.string.label_intent);
- reason = getString(R.string.stopwatch_reset);
- break;
- default:
- return;
- }
- final Intent intent = new Intent(mAppContext, StopwatchService.class).setAction(action);
- startService(intent);
- Voice.notifySuccess(this, reason);
- LogUtils.i(reason);
- }
-
- private void handleTimerIntent(final String action) {
- // Opens the UI for timers
- final Intent timerIntent = new Intent(mAppContext, DeskClock.class)
- .putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.TIMER_TAB_INDEX)
- .putExtra(TimerFullScreenFragment.GOTO_SETUP_VIEW, false);
- startActivity(timerIntent);
- LogUtils.i("HandleDeskClockApiCalls " + action);
-
- if (ACTION_SHOW_TIMERS.equals(action)) {
- Events.sendTimerEvent(R.string.action_show, R.string.label_intent);
- return;
- }
- new HandleTimersAsync(mAppContext, action, this).execute();
- }
-
- private void handleClockIntent(final String action) {
- // Opens the UI for clocks
- final Intent handleClock = new Intent(mAppContext, DeskClock.class)
- .setAction(action)
- .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
- .putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.CLOCK_TAB_INDEX);
- startActivity(handleClock);
-
- new HandleClockAsync(mAppContext, getIntent(), this).execute();
- }
-
- private static class HandleTimersAsync extends AsyncTask<Void, Void, Void> {
- private final Context mContext;
- private final String mAction;
- private final Activity mActivity;
-
- public HandleTimersAsync(Context context, String action, Activity activity) {
- mContext = context;
- mAction = action;
- mActivity = activity;
- }
- // STOP_TIMER and START_TIMER should only be triggered if there is one timer that is
- // not stopped or not started respectively. This method checks all timers to find only
- // one that corresponds to that.
- // Only change the mode of the timer if no disambiguation is necessary
-
- @Override
- protected Void doInBackground(Void... parameters) {
- final List<TimerObj> timers = new ArrayList<>();
- final SharedPreferences prefs = Utils.getDefaultSharedPreferences(mContext);
- TimerObj.getTimersFromSharedPrefs(prefs, timers);
- if (timers.isEmpty()) {
- final String reason = mContext.getString(R.string.no_timer_set);
- LogUtils.i(reason);
- Voice.notifyFailure(mActivity, reason);
- return null;
- }
- final TimerObj timer;
- final String timerAction;
- switch (mAction) {
- case ACTION_DELETE_TIMER: {
- timerAction = Timers.DELETE_TIMER;
- // Delete a timer only if there's one available
- if (timers.size() > 1) {
- final String reason = mContext.getString(R.string.multiple_timers_available);
- LogUtils.i(reason);
- Voice.notifyFailure(mActivity, reason);
- return null;
- }
-
- timer = timers.get(0);
- timer.deleteFromSharedPref(prefs);
- Events.sendTimerEvent(R.string.action_delete, R.string.label_intent);
- final String reason = mContext.getString(R.string.timer_deleted);
- Voice.notifySuccess(mActivity, reason);
- LogUtils.i(reason);
+ final String reason;
+ boolean fail = false;
+ switch (action) {
+ case ACTION_START_STOPWATCH: {
+ DataModel.getDataModel().startStopwatch();
+ Events.sendStopwatchEvent(R.string.action_start, eventLabel);
+ reason = getString(R.string.stopwatch_started);
break;
}
- case ACTION_START_TIMER: {
- timerAction = Timers.START_TIMER;
- timer = getTimerWithStateToIgnore(timers, TimerObj.STATE_RUNNING);
- // Only start a timer if there's one non-running timer available
- if (timer == null) {
- // notifyFailure was already triggered
- return null;
- }
- timer.setState(TimerObj.STATE_RUNNING);
- timer.mStartTime = Utils.getTimeNow() - (timer.mSetupLength - timer.mTimeLeft);
- timer.writeToSharedPref(prefs);
- final String reason = mContext.getString(R.string.timer_started);
- Voice.notifySuccess(mActivity, reason);
- LogUtils.i(reason);
- Events.sendTimerEvent(R.string.action_start, R.string.label_intent);
+ case ACTION_PAUSE_STOPWATCH: {
+ DataModel.getDataModel().pauseStopwatch();
+ Events.sendStopwatchEvent(R.string.action_pause, eventLabel);
+ reason = getString(R.string.stopwatch_paused);
break;
}
- case ACTION_RESET_TIMER: {
- timerAction = Timers.RESET_TIMER;
- // Since timer can be reset only if it's stopped
- // it's only triggered when there's only one stopped timer
- final Set<Integer> statesToInclude = new HashSet<>();
- statesToInclude.add(TimerObj.STATE_STOPPED);
- timer = getTimerWithStatesToInclude(timers, statesToInclude, mAction);
- if (timer == null) {
- return null;
- }
- final String reason = mContext.getString(R.string.timer_was_reset);
- Voice.notifySuccess(mActivity, reason);
- LogUtils.i(reason);
- timer.setState(TimerObj.STATE_RESTART);
- timer.mTimeLeft = timer.mSetupLength;
- timer.writeToSharedPref(prefs);
- Events.sendTimerEvent(R.string.action_reset, R.string.label_intent);
+ case ACTION_RESET_STOPWATCH: {
+ DataModel.getDataModel().clearLaps();
+ DataModel.getDataModel().resetStopwatch();
+ Events.sendStopwatchEvent(R.string.action_reset, eventLabel);
+ reason = getString(R.string.stopwatch_reset);
break;
}
- case ACTION_STOP_TIMER: {
- timerAction = Timers.STOP_TIMER;
- final Set<Integer> statesToInclude = new HashSet<>();
- statesToInclude.add(TimerObj.STATE_TIMESUP);
- statesToInclude.add(TimerObj.STATE_RUNNING);
- // Timer is stopped if there's only one running timer
- timer = getTimerWithStatesToInclude(timers, statesToInclude, mAction);
- if (timer == null) {
- return null;
- }
- final String reason = mContext.getString(R.string.timer_stopped);
- LogUtils.i(reason);
- Voice.notifySuccess(mActivity, reason);
- if (timer.mState == TimerObj.STATE_RUNNING) {
- timer.setState(TimerObj.STATE_STOPPED);
+ case ACTION_LAP_STOPWATCH: {
+ if (!DataModel.getDataModel().getStopwatch().isRunning()) {
+ fail = true;
+ reason = getString(R.string.stopwatch_isnt_running);
} else {
- // if the time is up on the timer
- // restart it and reset the length
- timer.setState(TimerObj.STATE_RESTART);
- timer.mTimeLeft = timer.mSetupLength;
+ DataModel.getDataModel().addLap();
+ Events.sendStopwatchEvent(R.string.action_lap, eventLabel);
+ reason = getString(R.string.stopwatch_lapped);
}
- timer.writeToSharedPref(prefs);
- Events.sendTimerEvent(R.string.action_stop, R.string.label_intent);
break;
}
default:
- return null;
+ throw new IllegalArgumentException("unknown stopwatch action: " + action);
}
- // updating the time for next firing timer
- final Intent i = new Intent()
- .setAction(timerAction)
- .putExtra(Timers.TIMER_INTENT_EXTRA, timer.mTimerId)
- .putExtra(Timers.UPDATE_NEXT_TIMESUP, true)
- // Make sure the receiver is getting the intent ASAP.
- .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- mContext.sendBroadcast(i);
- return null;
+
+ if (fail) {
+ Voice.notifyFailure(this, reason);
+ } else {
+ Voice.notifySuccess(this, reason);
+ }
+ LogUtils.i(reason);
}
- /**
- * @param timers available to the user
- * @param stateToIgnore the opposite of the state that the timer should be in
- * @return a timer only if there's one timer available that is of a state
- * other than the state that's passed
- * in all other cases returns null
- */
- private TimerObj getTimerWithStateToIgnore(List<TimerObj> timers, int stateToIgnore) {
- TimerObj soleTimer = null;
- for (TimerObj timer : timers) {
- if (timer.mState != stateToIgnore) {
- if (soleTimer == null) {
- soleTimer = timer;
- } else {
- // soleTimer has already been set
- final String reason = mContext.getString(R.string.multiple_timers_available);
- LogUtils.i(reason);
- Voice.notifyFailure(mActivity, reason);
- return null;
- }
- }
- }
- return soleTimer;
- }
-
- /**
- * @param timers available to the user
- * @param statesToInclude acceptable states of the timer
- * @return a timer only if there's one timer available that is of the state
- * that is passed in
- * in all other cases returns null
- */
- private TimerObj getTimerWithStatesToInclude(
- List<TimerObj> timers, Set<Integer> statesToInclude, String action) {
- TimerObj soleTimer = null;
- for (TimerObj timer : timers) {
- if (statesToInclude.contains(timer.mState)) {
- if (soleTimer == null) {
- soleTimer = timer;
- } else {
- // soleTimer has already been set
- final String reason = mContext.getString(
- R.string.multiple_timers_available);
- LogUtils.i(reason);
- Voice.notifyFailure(mActivity, reason);
- return null;
- }
- }
- }
- // if there are no timers of desired property
- // announce it to the user
- if (soleTimer == null) {
- if (action.equals(ACTION_RESET_TIMER)) {
- // all timers are running
- final String reason = mContext.getString(
- R.string.timer_cant_be_reset_because_its_running);
- LogUtils.i(reason);
- Voice.notifyFailure(mActivity, reason);
- } else if (action.equals(ACTION_STOP_TIMER)) {
- // no running timers
- final String reason = mContext.getString(R.string.timer_already_stopped);
- LogUtils.i(reason);
- Voice.notifyFailure(mActivity, reason);
- }
- }
- return soleTimer;
- }
+ // Open the UI to the stopwatch.
+ final Intent stopwatchIntent = new Intent(mAppContext, DeskClock.class)
+ .putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.STOPWATCH_TAB_INDEX);
+ startActivity(stopwatchIntent);
}
- private static class HandleClockAsync extends AsyncTask<Void, Void, Void> {
- private final Context mContext;
- private final Intent mIntent;
- private final Activity mActivity;
+ private void handleTimerIntent(Intent intent) {
+ final String action = intent.getAction();
- public HandleClockAsync(Context context, Intent intent, Activity activity) {
- mContext = context;
- mIntent = intent;
- mActivity = activity;
+ // Determine where this intent originated.
+ final int eventLabel = intent.getIntExtra(EXTRA_EVENT_LABEL, R.string.label_intent);
+ int timerId = intent.getIntExtra(EXTRA_TIMER_ID, -1);
+ Timer timer = null;
+
+ if (ACTION_SHOW_TIMERS.equals(action)) {
+ Events.sendTimerEvent(R.string.action_show, eventLabel);
+ } else {
+ String reason = null;
+ if (timerId == -1) {
+ // No timer id was given explicitly, so check if only one timer exists.
+ final List<Timer> timers = DataModel.getDataModel().getTimers();
+ if (timers.isEmpty()) {
+ // No timers exist to control.
+ reason = getString(R.string.no_timers_exist);
+ } else if (timers.size() > 1) {
+ // Many timers exist so the control command is ambiguous.
+ reason = getString(R.string.too_many_timers_exist);
+ } else {
+ timer = timers.get(0);
+ }
+ } else {
+ // Verify that the given timer does exist.
+ timer = DataModel.getDataModel().getTimer(timerId);
+ if (timer == null) {
+ reason = getString(R.string.timer_does_not_exist);
+ }
+ }
+
+ if (timer == null) {
+ Voice.notifyFailure(this, reason);
+ } else {
+ timerId = timer.getId();
+
+ // Otherwise the control command can be honored.
+ switch (action) {
+ case ACTION_RESET_TIMER: {
+ DataModel.getDataModel().resetOrDeleteTimer(timer, eventLabel);
+ if (timer.isExpired() && timer.getDeleteAfterUse()) {
+ timerId = -1;
+ reason = getString(R.string.timer_deleted);
+ } else {
+ reason = getString(R.string.timer_was_reset);
+ }
+ break;
+ }
+ case ACTION_START_TIMER: {
+ DataModel.getDataModel().startTimer(timer);
+ Events.sendTimerEvent(R.string.action_start, eventLabel);
+ reason = getString(R.string.timer_started);
+ break;
+ }
+ case ACTION_PAUSE_TIMER: {
+ DataModel.getDataModel().pauseTimer(timer);
+ Events.sendTimerEvent(R.string.action_pause, eventLabel);
+ reason = getString(R.string.timer_paused);
+ break;
+ }
+ default:
+ throw new IllegalArgumentException("unknown timer action: " + action);
+ }
+
+ Voice.notifySuccess(this, reason);
+ }
+
+ LogUtils.i(reason);
}
- @Override
- protected Void doInBackground(Void... parameters) {
- final String cityExtra = mIntent.getStringExtra(EXTRA_CITY);
- final SharedPreferences prefs =
- Utils.getDefaultSharedPreferences(mContext);
- switch (mIntent.getAction()) {
+ // Open the UI to the timers.
+ final Intent showTimers = new Intent(mAppContext, DeskClock.class)
+ .putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.TIMER_TAB_INDEX);
+ if (timerId != -1) {
+ showTimers.putExtra(EXTRA_TIMER_ID, timerId);
+ }
+ startActivity(showTimers);
+ }
+
+ private void handleClockIntent(Intent intent) {
+ final String action = intent.getAction();
+
+ if (ACTION_SHOW_CLOCK.equals(action)) {
+ final boolean fromWidget = intent.getBooleanExtra(EXTRA_FROM_WIDGET, false);
+ final int label = fromWidget ? R.string.label_widget : R.string.label_intent;
+ Events.sendClockEvent(R.string.action_show, label);
+ } else {
+ final String cityName = intent.getStringExtra(EXTRA_CITY);
+
+ final String reason;
+ boolean fail = false;
+
+ // If no city was given, start the city chooser.
+ if (cityName == null) {
+ reason = getString(R.string.no_city_selected);
+ LogUtils.i(reason);
+ Voice.notifySuccess(this, reason);
+ startActivity(new Intent(this, CitySelectionActivity.class)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ switch (action) {
+ case ACTION_ADD_CLOCK:
+ Events.sendClockEvent(R.string.action_add, R.string.label_intent);
+ break;
+ case ACTION_DELETE_CLOCK:
+ Events.sendClockEvent(R.string.action_delete, R.string.label_intent);
+ break;
+ }
+ return;
+ }
+
+ // If a city was given, ensure it can be located.
+ final City city = DataModel.getDataModel().getCity(cityName);
+ if (city == null) {
+ reason = getString(R.string.the_city_you_specified_is_not_available);
+ LogUtils.i(reason);
+ Voice.notifyFailure(this, reason);
+ switch (action) {
+ case ACTION_ADD_CLOCK:
+ Events.sendClockEvent(R.string.action_add, R.string.label_intent);
+ break;
+ case ACTION_DELETE_CLOCK:
+ Events.sendClockEvent(R.string.action_delete, R.string.label_intent);
+ break;
+ }
+ return;
+ }
+
+ final Set<City> selectedCities =
+ Utils.newArraySet(DataModel.getDataModel().getSelectedCities());
+
+ switch (action) {
case ACTION_ADD_CLOCK: {
- // if a city isn't specified open CitiesActivity to choose a city
- if (cityExtra == null) {
- final String reason = mContext.getString(R.string.no_city_selected);
- Voice.notifyFailure(mActivity, reason);
- LogUtils.i(reason);
- startCitiesActivity();
- Events.sendClockEvent(R.string.action_create, R.string.label_intent);
+ // Fail if the city is already present.
+ if (!selectedCities.add(city)) {
+ fail = true;
+ reason = getString(R.string.the_city_already_added);
break;
}
- // if a city is passed add that city to the list
- final Map<String, CityObj> cities = Utils.loadCityMapFromXml(mContext);
- final CityObj city = cities.get(cityExtra.toLowerCase());
- // check if this city exists in the list of available cities
- if (city == null) {
- final String reason = mContext.getString(
- R.string.the_city_you_specified_is_not_available);
- Voice.notifyFailure(mActivity, reason);
- LogUtils.i(reason);
- break;
- }
-
- final HashMap<String, CityObj> selectedCities =
- Cities.readCitiesFromSharedPrefs(prefs);
- // if this city is already added don't add it
- if (selectedCities.put(city.mCityId, city) != null) {
- final String reason = mContext.getString(R.string.the_city_already_added);
- Voice.notifyFailure(mActivity, reason);
- LogUtils.i(reason);
- break;
- }
-
- Cities.saveCitiesToSharedPrefs(prefs, selectedCities);
- final String reason = mContext.getString(R.string.city_added, city.mCityName);
- Voice.notifySuccess(mActivity, reason);
- LogUtils.i(reason);
- Events.sendClockEvent(R.string.action_start, R.string.label_intent);
+ // Otherwise report the success.
+ DataModel.getDataModel().setSelectedCities(selectedCities);
+ reason = getString(R.string.city_added, city.getName());
+ Events.sendClockEvent(R.string.action_add, R.string.label_intent);
break;
}
case ACTION_DELETE_CLOCK: {
- if (cityExtra == null) {
- // if a city isn't specified open CitiesActivity to choose a city
- final String reason = mContext.getString(R.string.no_city_selected);
- Voice.notifyFailure(mActivity, reason);
- LogUtils.i(reason);
- startCitiesActivity();
- Events.sendClockEvent(R.string.action_create, R.string.label_intent);
+ // Fail if the city is not present.
+ if (!selectedCities.remove(city)) {
+ fail = true;
+ reason = getString(R.string.the_city_you_specified_is_not_available);
break;
}
- // if a city is specified check if it's selected and if so delete it
- final Map<String, CityObj> cities = Utils.loadCityMapFromXml(mContext);
- // check if this city exists in the list of available cities
- final CityObj city = cities.get(cityExtra.toLowerCase());
- if (city == null) {
- final String reason = mContext.getString(
- R.string.the_city_you_specified_is_not_available);
- Voice.notifyFailure(mActivity, reason);
- LogUtils.i(reason);
- break;
- }
-
- final HashMap<String, CityObj> selectedCities =
- Cities.readCitiesFromSharedPrefs(prefs);
- if (selectedCities.remove(city.mCityId) != null) {
- final String reason = mContext.getString(R.string.city_deleted,
- city.mCityName);
- Voice.notifySuccess(mActivity, reason);
- LogUtils.i(reason);
- Cities.saveCitiesToSharedPrefs(prefs, selectedCities);
- Events.sendClockEvent(R.string.action_delete, R.string.label_intent);
- } else {
- // the specified city hasn't been added to the user's list yet
- Voice.notifyFailure(mActivity, mContext.getString(
- R.string.the_city_you_specified_is_not_available));
- }
+ // Otherwise report the success.
+ DataModel.getDataModel().setSelectedCities(selectedCities);
+ reason = getString(R.string.city_deleted, city.getName());
+ Events.sendClockEvent(R.string.action_delete, R.string.label_intent);
break;
}
- case ACTION_SHOW_CLOCK:
- Events.sendClockEvent(R.string.action_show, R.string.label_intent);
- break;
+ default:
+ throw new IllegalArgumentException("unknown clock action: " + action);
}
- return null;
+
+ if (fail) {
+ Voice.notifyFailure(this, reason);
+ } else {
+ Voice.notifySuccess(this, reason);
+ }
+ LogUtils.i(reason);
}
- private void startCitiesActivity() {
- mContext.startActivity(new Intent(mContext, CitiesActivity.class).addFlags(
- Intent.FLAG_ACTIVITY_NEW_TASK));
- }
+ // Opens the UI for clocks
+ final Intent clockIntent = new Intent(mAppContext, DeskClock.class)
+ .setAction(action)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.CLOCK_TAB_INDEX);
+ startActivity(clockIntent);
}
-}
-
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/LabelDialogFragment.java b/src/com/android/deskclock/LabelDialogFragment.java
index 472e378..36c08d5 100644
--- a/src/com/android/deskclock/LabelDialogFragment.java
+++ b/src/com/android/deskclock/LabelDialogFragment.java
@@ -16,24 +16,30 @@
package com.android.deskclock;
-import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.res.ColorStateList;
import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.AppCompatEditText;
import android.text.Editable;
+import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.KeyEvent;
-import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Timer;
import com.android.deskclock.provider.Alarm;
-import com.android.deskclock.timer.TimerObj;
+
+import static android.graphics.Color.RED;
+import static android.graphics.Color.WHITE;
+import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
/**
* DialogFragment to edit label.
@@ -42,148 +48,156 @@
private static final String KEY_LABEL = "label";
private static final String KEY_ALARM = "alarm";
- private static final String KEY_TIMER = "timer";
+ private static final String KEY_TIMER_ID = "timer_id";
private static final String KEY_TAG = "tag";
private AppCompatEditText mLabelBox;
+ private Alarm mAlarm;
+ private int mTimerId;
+ private String mTag;
public static LabelDialogFragment newInstance(Alarm alarm, String label, String tag) {
- final LabelDialogFragment frag = new LabelDialogFragment();
- Bundle args = new Bundle();
+ final Bundle args = new Bundle();
args.putString(KEY_LABEL, label);
args.putParcelable(KEY_ALARM, alarm);
args.putString(KEY_TAG, tag);
+
+ final LabelDialogFragment frag = new LabelDialogFragment();
frag.setArguments(args);
return frag;
}
- public static LabelDialogFragment newInstance(TimerObj timer, String label, String tag) {
+ public static LabelDialogFragment newInstance(Timer timer) {
+ final Bundle args = new Bundle();
+ args.putString(KEY_LABEL, timer.getLabel());
+ args.putInt(KEY_TIMER_ID, timer.getId());
+
final LabelDialogFragment frag = new LabelDialogFragment();
- Bundle args = new Bundle();
- args.putString(KEY_LABEL, label);
- args.putParcelable(KEY_TIMER, timer);
- args.putString(KEY_TAG, tag);
frag.setArguments(args);
return frag;
}
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ public void onSaveInstanceState(@NonNull Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putString(KEY_LABEL, mLabelBox.getText().toString());
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
- Bundle bundle = getArguments();
- final String label = bundle.getString(KEY_LABEL);
- final Alarm alarm = bundle.getParcelable(KEY_ALARM);
- final TimerObj timer = bundle.getParcelable(KEY_TIMER);
- final String tag = bundle.getString(KEY_TAG);
+ final Bundle bundle = getArguments();
+ mAlarm = bundle.getParcelable(KEY_ALARM);
+ mTimerId = bundle.getInt(KEY_TIMER_ID, -1);
+ mTag = bundle.getString(KEY_TAG);
+
+ final String label = savedInstanceState != null ?
+ savedInstanceState.getString(KEY_LABEL) : bundle.getString(KEY_LABEL);
final Context context = getActivity();
mLabelBox = new AppCompatEditText(context);
+ mLabelBox.setOnEditorActionListener(new ImeDoneListener());
+ mLabelBox.addTextChangedListener(new TextChangeListener(context));
+ mLabelBox.setSingleLine();
+ mLabelBox.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);
mLabelBox.setText(label);
- mLabelBox.setOnEditorActionListener(new TextView.OnEditorActionListener() {
- @Override
- public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- if (actionId == EditorInfo.IME_ACTION_DONE) {
- set(alarm, timer, tag);
- return true;
- }
- return false;
- }
- });
- mLabelBox.addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- setLabelBoxBackground(s == null || TextUtils.isEmpty(s));
- }
-
- @Override
- public void afterTextChanged(Editable editable) {
- }
- });
mLabelBox.selectAll();
- setLabelBoxBackground(TextUtils.isEmpty(label));
+ final int padding = getResources().getDimensionPixelSize(R.dimen.label_edittext_padding);
final AlertDialog alertDialog = new AlertDialog.Builder(context)
- .setView(mLabelBox)
- .setPositiveButton(R.string.time_picker_set, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- set(alarm, timer, tag);
- }
- })
- .setNegativeButton(R.string.time_picker_cancel,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dismiss();
- }
- })
+ .setView(mLabelBox, padding, 0, padding, 0)
+ .setPositiveButton(R.string.time_picker_set, new OkListener())
+ .setNegativeButton(R.string.time_picker_cancel, new CancelListener())
.setMessage(R.string.label)
.create();
- alertDialog.getWindow().setSoftInputMode(
- WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ alertDialog.getWindow().setSoftInputMode(SOFT_INPUT_STATE_VISIBLE);
return alertDialog;
}
- private void set(Alarm alarm, TimerObj timer, String tag) {
+ /**
+ * Sets the new label into the timer or alarm.
+ */
+ private void setLabel() {
String label = mLabelBox.getText().toString();
- if (label.trim().length() == 0) {
+ if (label.trim().isEmpty()) {
// Don't allow user to input label with only whitespace.
label = "";
}
- if (alarm != null) {
- set(alarm, tag, label);
- } else if (timer != null) {
- set(timer, tag, label);
- } else {
- LogUtils.e("No alarm or timer available.");
+ if (mAlarm != null) {
+ ((AlarmLabelDialogHandler) getActivity()).onDialogLabelSet(mAlarm, label, mTag);
+ } else if (mTimerId >= 0) {
+ final Timer timer = DataModel.getDataModel().getTimer(mTimerId);
+ if (timer != null) {
+ DataModel.getDataModel().setTimerLabel(timer, label);
+ }
}
}
- private void set(Alarm alarm, String tag, String label) {
- final Activity activity = getActivity();
- // TODO just pass in a listener in newInstance()
- if (activity instanceof AlarmLabelDialogHandler) {
- ((DeskClock) activity).onDialogLabelSet(alarm, label, tag);
- } else {
- LogUtils.e("Error! Activities that use LabelDialogFragment must implement "
- + "AlarmLabelDialogHandler");
- }
- dismiss();
- }
-
- private void set(TimerObj timer, String tag, String label) {
- final Activity activity = getActivity();
- // TODO just pass in a listener in newInstance()
- if (activity instanceof TimerLabelDialogHandler){
- ((DeskClock) activity).onDialogLabelSet(timer, label, tag);
- } else {
- LogUtils.e("Error! Activities that use LabelDialogFragment must implement "
- + "AlarmLabelDialogHandler or TimerLabelDialogHandler");
- }
- dismiss();
- }
-
- private void setLabelBoxBackground(boolean emptyText) {
- mLabelBox.setBackgroundResource(emptyText ?
- R.drawable.bg_edittext_default : R.drawable.bg_edittext_activated);
- }
-
interface AlarmLabelDialogHandler {
void onDialogLabelSet(Alarm alarm, String label, String tag);
}
- interface TimerLabelDialogHandler {
- void onDialogLabelSet(TimerObj timer, String label, String tag);
+ /**
+ * Alters the UI to indicate when input is valid or invalid.
+ */
+ private class TextChangeListener implements TextWatcher {
+
+ private final int colorAccent;
+ private final int colorControlNormal;
+
+ public TextChangeListener(Context context) {
+ colorAccent = Utils.obtainStyledColor(context, R.attr.colorAccent, RED);
+ colorControlNormal = Utils.obtainStyledColor(context, R.attr.colorControlNormal, WHITE);
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ final int color = TextUtils.isEmpty(s) ? colorControlNormal : colorAccent;
+ mLabelBox.setSupportBackgroundTintList(ColorStateList.valueOf(color));
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+
+ @Override
+ public void afterTextChanged(Editable editable) {}
}
-}
+
+ /**
+ * Handles completing the label edit from the IME keyboard.
+ */
+ private class ImeDoneListener implements TextView.OnEditorActionListener {
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ if (actionId == EditorInfo.IME_ACTION_DONE) {
+ setLabel();
+ dismiss();
+ return true;
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Handles completing the label edit from the Ok button of the dialog.
+ */
+ private class OkListener implements DialogInterface.OnClickListener {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ setLabel();
+ dismiss();
+ }
+ }
+
+ /**
+ * Handles discarding the label edit from the Cancel button of the dialog.
+ */
+ private class CancelListener implements DialogInterface.OnClickListener {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dismiss();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/NumberPickerCompat.java b/src/com/android/deskclock/NumberPickerCompat.java
index 477fb89..89baed6 100644
--- a/src/com/android/deskclock/NumberPickerCompat.java
+++ b/src/com/android/deskclock/NumberPickerCompat.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2015 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.annotation.TargetApi;
@@ -6,19 +22,38 @@
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Build;
+import android.os.Parcel;
+import android.os.Parcelable;
import android.util.AttributeSet;
import android.widget.NumberPicker;
import java.lang.reflect.Field;
/**
- * Subclass of NumberPicker that allows customizing divider color.
+ * Subclass of NumberPicker that allows customizing divider color and saves/restores its value
+ * across device rotations.
*/
-public class NumberPickerCompat extends NumberPicker {
+public class NumberPickerCompat extends NumberPicker implements NumberPicker.OnValueChangeListener {
private static Field sSelectionDivider;
private static boolean sTrySelectionDivider = true;
+ private final Runnable mAnnounceValueRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (mOnAnnounceValueChangedListener != null) {
+ final int value = getValue();
+ final String[] displayedValues = getDisplayedValues();
+ final String displayedValue =
+ displayedValues == null ? null : displayedValues[value];
+ mOnAnnounceValueChangedListener.onAnnounceValueChanged(
+ NumberPickerCompat.this, value, displayedValue);
+ }
+ }
+ };
+ private OnValueChangeListener mOnValueChangedListener;
+ private OnAnnounceValueChangedListener mOnAnnounceValueChangedListener;
+
public NumberPickerCompat(Context context) {
this(context, null /* attrs */);
}
@@ -26,23 +61,21 @@
public NumberPickerCompat(Context context, AttributeSet attrs) {
super(context, attrs);
tintSelectionDivider(context);
+ super.setOnValueChangedListener(this);
}
public NumberPickerCompat(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
tintSelectionDivider(context);
+ super.setOnValueChangedListener(this);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void tintSelectionDivider(Context context) {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP
- || Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
- // Accent color in KK will stay system blue, so leave divider color matching.
- // The divider is correctly tinted to controlColorNormal in M.
- return;
- }
+ // Accent color in KK will stay system blue, so leave divider color matching.
+ // The divider is correctly tinted to controlColorNormal in M.
- if (sTrySelectionDivider) {
+ if (Utils.isLOrLMR1() && sTrySelectionDivider) {
final TypedArray a = context.obtainStyledAttributes(
new int[] { android.R.attr.colorControlNormal });
// White is default color if colorControlNormal is not defined.
@@ -66,4 +99,91 @@
}
}
-}
+ /**
+ * @return the state of this NumberPicker including the currently selected value
+ */
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ return new State(super.onSaveInstanceState(), getValue());
+ }
+
+ /**
+ * @param state the state of this NumberPicker including the value to select
+ */
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ final State instanceState = (State) state;
+ super.onRestoreInstanceState(instanceState.getSuperState());
+ setValue(instanceState.mValue);
+ }
+
+ @Override
+ public void setOnValueChangedListener(OnValueChangeListener onValueChangedListener) {
+ mOnValueChangedListener = onValueChangedListener;
+ }
+
+ @Override
+ public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ if (mOnValueChangedListener != null) {
+ mOnValueChangedListener.onValueChange(picker, oldVal, newVal);
+ }
+
+ // Wait till we reach a value to prevent TalkBack from announcing every intermediate value
+ // when scrolling fast.
+ removeCallbacks(mAnnounceValueRunnable);
+ postDelayed(mAnnounceValueRunnable, 200L);
+ }
+
+ /**
+ * Register a callback to be invoked whenever a value change should be announced.
+ */
+ public void setOnAnnounceValueChangedListener(OnAnnounceValueChangedListener listener) {
+ mOnAnnounceValueChangedListener = listener;
+ }
+
+ /**
+ * The state of this NumberPicker including the selected value. Used to preserve values across
+ * device rotation.
+ */
+ private static final class State extends BaseSavedState {
+
+ private final int mValue;
+
+ public State(Parcel source) {
+ super(source);
+ mValue = source.readInt();
+ }
+
+ public State(Parcelable superState, int value) {
+ super(superState);
+ mValue = value;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeInt(mValue);
+ }
+
+ public static final Parcelable.Creator<State> CREATOR =
+ new Parcelable.Creator<State>() {
+ public State createFromParcel(Parcel in) { return new State(in); }
+ public State[] newArray(int size) { return new State[size]; }
+ };
+ }
+
+ /**
+ * Interface for a callback to be invoked when a value change should be announced for
+ * accessibility.
+ */
+ public interface OnAnnounceValueChangedListener {
+ /**
+ * Called when a value change should be announced.
+ * @param picker The number picker whose value changed.
+ * @param value The new value.
+ * @param displayedValue The text displayed for the value, or null if the value itself
+ * is displayed.
+ */
+ void onAnnounceValueChanged(NumberPicker picker, int value, String displayedValue);
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/Screensaver.java b/src/com/android/deskclock/Screensaver.java
index 0d85cc7..c2e69ca 100644
--- a/src/com/android/deskclock/Screensaver.java
+++ b/src/com/android/deskclock/Screensaver.java
@@ -23,7 +23,6 @@
import android.content.IntentFilter;
import android.content.res.Configuration;
import android.database.ContentObserver;
-import android.os.Build;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.provider.Settings;
@@ -33,6 +32,7 @@
import android.widget.TextClock;
import com.android.deskclock.Utils.ScreensaverMoveSaverRunnable;
+import com.android.deskclock.settings.ScreensaverSettingsActivity;
public class Screensaver extends DreamService {
@@ -40,8 +40,6 @@
private static final boolean DEBUG = false;
private static final String TAG = "DeskClock/Screensaver";
- private static final boolean PRE_L_DEVICE =
- Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP;
private View mContentView, mSaverView;
private View mAnalogClock, mDigitalClock;
@@ -53,7 +51,7 @@
private final ScreensaverMoveSaverRunnable mMoveSaverRunnable;
/* Register ContentObserver to see alarm changes for pre-L */
- private final ContentObserver mSettingsContentObserver = PRE_L_DEVICE
+ private final ContentObserver mSettingsContentObserver = Utils.isPreL()
? new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
@@ -143,7 +141,7 @@
registerReceiver(mIntentReceiver, filter);
Utils.setMidnightUpdater(mHandler, mMidnightUpdater);
- if (PRE_L_DEVICE) {
+ if (Utils.isPreL()) {
getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED),
false,
@@ -160,7 +158,7 @@
mHandler.removeCallbacks(mMoveSaverRunnable);
- if (PRE_L_DEVICE) {
+ if (Utils.isPreL()) {
getContentResolver().unregisterContentObserver(mSettingsContentObserver);
}
@@ -170,8 +168,7 @@
}
private void setClockStyle() {
- Utils.setClockStyle(this, mDigitalClock, mAnalogClock,
- ScreensaverSettingsActivity.KEY_CLOCK_STYLE);
+ Utils.setScreensaverClockStyle(mDigitalClock, mAnalogClock);
mSaverView = findViewById(R.id.main_clock);
boolean dimNightMode = Utils.getDefaultSharedPreferences(this)
.getBoolean(ScreensaverSettingsActivity.KEY_NIGHT_MODE, false);
@@ -184,8 +181,7 @@
mDigitalClock = findViewById(R.id.digital_clock);
mAnalogClock = findViewById(R.id.analog_clock);
setClockStyle();
- Utils.setTimeFormat(this, (TextClock) mDigitalClock,
- getResources().getDimensionPixelSize(R.dimen.main_ampm_font_size));
+ Utils.setTimeFormat(this, (TextClock) mDigitalClock);
mContentView = (View) mSaverView.getParent();
mSaverView.setAlpha(0);
diff --git a/src/com/android/deskclock/ScreensaverActivity.java b/src/com/android/deskclock/ScreensaverActivity.java
index 573ce79..2754114 100644
--- a/src/com/android/deskclock/ScreensaverActivity.java
+++ b/src/com/android/deskclock/ScreensaverActivity.java
@@ -24,10 +24,10 @@
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.os.BatteryManager;
-import android.os.Build;
import android.os.Handler;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
+import android.util.TypedValue;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
@@ -39,13 +39,6 @@
static final boolean DEBUG = false;
static final String TAG = "DeskClock/ScreensaverActivity";
- // This value must match android:defaultValue of
- // android:key="screensaver_clock_style" in dream_settings.xml
- static final String DEFAULT_CLOCK_STYLE = "digital";
-
- private static final boolean PRE_L_DEVICE =
- Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP;
-
private View mContentView, mSaverView;
private View mAnalogClock, mDigitalClock;
@@ -53,7 +46,6 @@
private final ScreensaverMoveSaverRunnable mMoveSaverRunnable;
private String mDateFormat;
private String mDateFormatForAccessibility;
- private String mClockStyle;
private boolean mPluggedIn = true;
private final int mFlags = (WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
@@ -90,7 +82,7 @@
};
/* Register ContentObserver to see alarm changes for pre-L */
- private final ContentObserver mSettingsContentObserver = PRE_L_DEVICE
+ private final ContentObserver mSettingsContentObserver = Utils.isPreL()
? new ContentObserver(mHandler) {
@Override
public void onChange(boolean selfChange) {
@@ -123,7 +115,7 @@
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
registerReceiver(mIntentReceiver, filter);
- if (PRE_L_DEVICE) {
+ if (Utils.isPreL()) {
getContentResolver().registerContentObserver(
Settings.System.getUriFor(Settings.System.NEXT_ALARM_FORMATTED),
false,
@@ -160,7 +152,7 @@
@Override
public void onStop() {
- if (PRE_L_DEVICE) {
+ if (Utils.isPreL()) {
getContentResolver().unregisterContentObserver(mSettingsContentObserver);
}
unregisterReceiver(mIntentReceiver);
@@ -194,11 +186,8 @@
}
private void setClockStyle() {
- Utils.setClockStyle(this, mDigitalClock, mAnalogClock,
- SettingsActivity.KEY_CLOCK_STYLE);
+ Utils.setClockStyle(mDigitalClock, mAnalogClock);
mSaverView = findViewById(R.id.main_clock);
- mClockStyle = (mSaverView == mDigitalClock ?
- Utils.CLOCK_TYPE_DIGITAL : Utils.CLOCK_TYPE_ANALOG);
Utils.dimClockView(true, mSaverView);
}
@@ -207,8 +196,7 @@
mDigitalClock = findViewById(R.id.digital_clock);
mAnalogClock = findViewById(R.id.analog_clock);
setClockStyle();
- Utils.setTimeFormat(this, (TextClock) mDigitalClock,
- getResources().getDimensionPixelSize(R.dimen.main_ampm_font_size));
+ Utils.setTimeFormat(this, (TextClock) mDigitalClock);
mContentView = (View) mSaverView.getParent();
mContentView.forceLayout();
@@ -224,5 +212,4 @@
Utils.updateDate(mDateFormat, mDateFormatForAccessibility,mContentView);
Utils.refreshAlarm(ScreensaverActivity.this, mContentView);
}
-
-}
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/SettingsActivity.java b/src/com/android/deskclock/SettingsActivity.java
deleted file mode 100644
index 248bb6f..0000000
--- a/src/com/android/deskclock/SettingsActivity.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- * 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.content.Context;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.media.AudioManager;
-import android.os.Bundle;
-import android.preference.CheckBoxPreference;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import android.text.format.DateUtils;
-import android.view.Menu;
-import android.view.MenuItem;
-
-import com.android.deskclock.worldclock.Cities;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.TimeZone;
-
-/**
- * Settings for the Alarm Clock.
- */
-public class SettingsActivity extends BaseActivity {
-
- public static final String KEY_ALARM_SNOOZE = "snooze_duration";
- public static final String KEY_ALARM_VOLUME = "volume_setting";
- public static final String KEY_VOLUME_BEHAVIOR = "volume_button_setting";
- public static final String KEY_AUTO_SILENCE = "auto_silence";
- public static final String KEY_CLOCK_STYLE = "clock_style";
- public static final String KEY_HOME_TZ = "home_time_zone";
- public static final String KEY_AUTO_HOME_CLOCK = "automatic_home_clock";
- public static final String KEY_VOLUME_BUTTONS = "volume_button_setting";
- public static final String KEY_WEEK_START = "week_start";
-
- public static final String DEFAULT_VOLUME_BEHAVIOR = "0";
- public static final String VOLUME_BEHAVIOR_SNOOZE = "1";
- public static final String VOLUME_BEHAVIOR_DISMISS = "2";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setVolumeControlStream(AudioManager.STREAM_ALARM);
- setContentView(R.layout.settings);
- }
-
- @Override
- public boolean onOptionsItemSelected (MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- finish();
- return true;
- default:
- break;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public boolean onCreateOptionsMenu (Menu menu) {
- getMenuInflater().inflate(R.menu.settings_menu, menu);
- MenuItem help = menu.findItem(R.id.menu_item_help);
- if (help != null) {
- Utils.prepareHelpMenuItem(this, help);
- }
- return super.onCreateOptionsMenu(menu);
- }
-
-
- public static class PrefsFragment extends PreferenceFragment
- implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener {
-
- private static CharSequence[][] mTimezones;
- private long mTime;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- addPreferencesFromResource(R.xml.settings);
-
- // We don't want to reconstruct the timezone list every single time onResume() is
- // called so we do it once in onCreate
- if (mTimezones == null) {
- mTime = System.currentTimeMillis();
- mTimezones = getAllTimezones();
- }
- final ListPreference homeTimezonePref = (ListPreference) findPreference(KEY_HOME_TZ);
- homeTimezonePref.setEntryValues(mTimezones[0]);
- homeTimezonePref.setEntries(mTimezones[1]);
- homeTimezonePref.setSummary(homeTimezonePref.getEntry());
- homeTimezonePref.setOnPreferenceChangeListener(this);
- }
-
- @Override
- public void onResume() {
- super.onResume();
- // By default, do not recreate the DeskClock activity
- getActivity().setResult(RESULT_CANCELED);
- refresh();
- }
-
- @Override
- public boolean onPreferenceChange(Preference pref, Object newValue) {
- if (KEY_AUTO_SILENCE.equals(pref.getKey())) {
- final ListPreference autoSilencePref = (ListPreference) pref;
- String delay = (String) newValue;
- updateAutoSnoozeSummary(autoSilencePref, delay);
- } else if (KEY_CLOCK_STYLE.equals(pref.getKey())) {
- final ListPreference clockStylePref = (ListPreference) pref;
- final int idx = clockStylePref.findIndexOfValue((String) newValue);
- clockStylePref.setSummary(clockStylePref.getEntries()[idx]);
- } else if (KEY_HOME_TZ.equals(pref.getKey())) {
- final ListPreference homeTimezonePref = (ListPreference) pref;
- final int idx = homeTimezonePref.findIndexOfValue((String) newValue);
- homeTimezonePref.setSummary(homeTimezonePref.getEntries()[idx]);
- notifyHomeTimeZoneChanged();
- } else if (KEY_AUTO_HOME_CLOCK.equals(pref.getKey())) {
- final boolean autoHomeClockEnabled = ((CheckBoxPreference) pref).isChecked();
- final Preference homeTimeZonePref = findPreference(KEY_HOME_TZ);
- homeTimeZonePref.setEnabled(!autoHomeClockEnabled);
- notifyHomeTimeZoneChanged();
- } else if (KEY_VOLUME_BUTTONS.equals(pref.getKey())) {
- final ListPreference volumeButtonsPref = (ListPreference) pref;
- final int index = volumeButtonsPref.findIndexOfValue((String) newValue);
- volumeButtonsPref.setSummary(volumeButtonsPref.getEntries()[index]);
- } else if (KEY_WEEK_START.equals(pref.getKey())) {
- final ListPreference weekStartPref = (ListPreference) findPreference(KEY_WEEK_START);
- final int idx = weekStartPref.findIndexOfValue((String) newValue);
- weekStartPref.setSummary(weekStartPref.getEntries()[idx]);
- }
- // Set result so DeskClock knows to refresh itself
- getActivity().setResult(RESULT_OK);
- return true;
- }
-
- @Override
- public boolean onPreferenceClick(Preference pref) {
- final Activity activity = getActivity();
- if (activity == null) {
- return false;
- }
-
- if (KEY_ALARM_VOLUME.equals(pref.getKey())) {
- final AudioManager audioManager =
- (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);
- audioManager.adjustStreamVolume(AudioManager.STREAM_ALARM,
- AudioManager.ADJUST_SAME, AudioManager.FLAG_SHOW_UI);
- return true;
- }
- return false;
- }
-
- /**
- * Returns an array of ids/time zones. This returns a double indexed array
- * of ids and time zones for Calendar. It is an inefficient method and
- * shouldn't be called often, but can be used for one time generation of
- * this list.
- *
- * @return double array of tz ids and tz names
- */
- public CharSequence[][] getAllTimezones() {
- Resources resources = this.getResources();
- String[] ids = resources.getStringArray(R.array.timezone_values);
- String[] labels = resources.getStringArray(R.array.timezone_labels);
- int minLength = ids.length;
- if (ids.length != labels.length) {
- minLength = Math.min(minLength, labels.length);
- LogUtils.e("Timezone ids and labels have different length!");
- }
- List<TimeZoneRow> timezones = new ArrayList<>();
- for (int i = 0; i < minLength; i++) {
- timezones.add(new TimeZoneRow(ids[i], labels[i]));
- }
- Collections.sort(timezones);
-
- CharSequence[][] timeZones = new CharSequence[2][timezones.size()];
- int i = 0;
- for (TimeZoneRow row : timezones) {
- timeZones[0][i] = row.mId;
- timeZones[1][i++] = row.mDisplayName;
- }
- return timeZones;
- }
-
- private void refresh() {
- final ListPreference autoSilencePref =
- (ListPreference) findPreference(KEY_AUTO_SILENCE);
- String delay = autoSilencePref.getValue();
- updateAutoSnoozeSummary(autoSilencePref, delay);
- autoSilencePref.setOnPreferenceChangeListener(this);
-
- final ListPreference clockStylePref = (ListPreference) findPreference(KEY_CLOCK_STYLE);
- clockStylePref.setSummary(clockStylePref.getEntry());
- clockStylePref.setOnPreferenceChangeListener(this);
-
- final Preference autoHomeClockPref = findPreference(KEY_AUTO_HOME_CLOCK);
- final boolean autoHomeClockEnabled =
- ((CheckBoxPreference) autoHomeClockPref).isChecked();
- autoHomeClockPref.setOnPreferenceChangeListener(this);
-
- final ListPreference homeTimezonePref = (ListPreference) findPreference(KEY_HOME_TZ);
- homeTimezonePref.setEnabled(autoHomeClockEnabled);
- homeTimezonePref.setSummary(homeTimezonePref.getEntry());
- homeTimezonePref.setOnPreferenceChangeListener(this);
-
- final ListPreference volumeButtonsPref =
- (ListPreference) findPreference(KEY_VOLUME_BUTTONS);
- volumeButtonsPref.setSummary(volumeButtonsPref.getEntry());
- volumeButtonsPref.setOnPreferenceChangeListener(this);
-
- final Preference volumePref = findPreference(KEY_ALARM_VOLUME);
- volumePref.setOnPreferenceClickListener(this);
-
- final SnoozeLengthDialog snoozePref =
- (SnoozeLengthDialog) findPreference(KEY_ALARM_SNOOZE);
- snoozePref.setSummary();
-
- final ListPreference weekStartPref = (ListPreference) findPreference(KEY_WEEK_START);
- // Set the default value programmatically
- final String value = weekStartPref.getValue();
- final int idx = weekStartPref.findIndexOfValue(
- value == null ? String.valueOf(Utils.DEFAULT_WEEK_START) : value);
- weekStartPref.setValueIndex(idx);
- weekStartPref.setSummary(weekStartPref.getEntries()[idx]);
- weekStartPref.setOnPreferenceChangeListener(this);
- }
-
- private void updateAutoSnoozeSummary(ListPreference listPref, String delay) {
- int i = Integer.parseInt(delay);
- if (i == -1) {
- listPref.setSummary(R.string.auto_silence_never);
- } else {
- listPref.setSummary(Utils.getNumberFormattedQuantityString(getActivity(),
- R.plurals.auto_silence_summary, i));
- }
- }
-
- private void notifyHomeTimeZoneChanged() {
- Intent i = new Intent(Cities.WORLDCLOCK_UPDATE_INTENT);
- getActivity().sendBroadcast(i);
- }
-
- private class TimeZoneRow implements Comparable<TimeZoneRow> {
- private static final boolean SHOW_DAYLIGHT_SAVINGS_INDICATOR = false;
-
- public final String mId;
- public final String mDisplayName;
- public final int mOffset;
-
- public TimeZoneRow(String id, String name) {
- mId = id;
- TimeZone tz = TimeZone.getTimeZone(id);
- boolean useDaylightTime = tz.useDaylightTime();
- mOffset = tz.getOffset(mTime);
- mDisplayName = buildGmtDisplayName(name, useDaylightTime);
- }
-
- @Override
- public int compareTo(TimeZoneRow another) {
- return mOffset - another.mOffset;
- }
-
- public String buildGmtDisplayName(String displayName, boolean useDaylightTime) {
- int p = Math.abs(mOffset);
- StringBuilder name = new StringBuilder("(GMT");
- name.append(mOffset < 0 ? '-' : '+');
-
- name.append(p / DateUtils.HOUR_IN_MILLIS);
- name.append(':');
-
- int min = p / 60000;
- min %= 60;
-
- if (min < 10) {
- name.append('0');
- }
- name.append(min);
- name.append(") ");
- name.append(displayName);
- if (useDaylightTime && SHOW_DAYLIGHT_SAVINGS_INDICATOR) {
- name.append(" \u2600"); // Sun symbol
- }
- return name.toString();
- }
- }
- }
-}
diff --git a/src/com/android/deskclock/SnoozeLengthDialog.java b/src/com/android/deskclock/SnoozeLengthDialog.java
deleted file mode 100644
index 3ba7590..0000000
--- a/src/com/android/deskclock/SnoozeLengthDialog.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.android.deskclock;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.preference.DialogPreference;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.NumberPicker;
-import android.widget.TextView;
-
-/**
- * A dialog preference that shows a number picker for selecting snooze length
- */
-public class SnoozeLengthDialog extends DialogPreference {
- private NumberPicker mNumberPickerView;
- private TextView mNumberPickerMinutesView;
- private final Context mContext;
- private int mSnoozeMinutes;
-
- private static final String DEFAULT_SNOOZE_TIME = "10";
-
-
- public SnoozeLengthDialog(Context context, AttributeSet attrs) {
- super(context, attrs);
- mContext = context;
- setDialogLayoutResource(R.layout.snooze_length_picker);
- setTitle(R.string.snooze_duration_title);
- }
-
- @Override
- protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
- super.onPrepareDialogBuilder(builder);
- builder.setTitle(getContext().getString(R.string.snooze_duration_title))
- .setCancelable(true);
- }
-
- @Override
- protected void onBindDialogView(View view) {
- super.onBindDialogView(view);
- mNumberPickerMinutesView = (TextView) view.findViewById(R.id.title);
- mNumberPickerView = (NumberPicker) view.findViewById(R.id.minutes_picker);
- mNumberPickerView.setMinValue(1);
- mNumberPickerView.setMaxValue(30);
- mNumberPickerView.setValue(mSnoozeMinutes);
- updateDays();
- mNumberPickerView.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
- @Override
- public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
- updateDays();
- }
- });
- }
-
- @Override
- protected void onSetInitialValue (boolean restorePersistedValue, Object defaultValue) {
- String val;
- if (restorePersistedValue) {
- val = getPersistedString(DEFAULT_SNOOZE_TIME);
- if (val != null) {
- mSnoozeMinutes = Integer.parseInt(val);
- }
- } else {
- val = (String) defaultValue;
- if (val != null) {
- mSnoozeMinutes = Integer.parseInt(val);
- }
- persistString(val);
- }
- }
-
- @Override
- protected Object onGetDefaultValue(TypedArray a, int index) {
- return a.getString(index);
- }
-
- private void updateDays() {
- mNumberPickerMinutesView.setText(String.format(mContext.getResources()
- .getQuantityText(R.plurals.snooze_picker_label, mNumberPickerView.getValue())
- .toString()));
- }
- @Override
- protected void onDialogClosed(boolean positiveResult) {
- if (positiveResult) {
- mNumberPickerView.clearFocus();
- mSnoozeMinutes = mNumberPickerView.getValue();
- persistString(Integer.toString(mSnoozeMinutes));
- setSummary();
- }
- }
-
- public void setSummary() {
- setSummary(Utils.getNumberFormattedQuantityString(mContext, R.plurals.snooze_duration,
- mSnoozeMinutes));
- }
-
- public int getCurrentValue() {
- return mSnoozeMinutes;
- }
-}
-
-
-
diff --git a/src/com/android/deskclock/TimePickerFragment.java b/src/com/android/deskclock/TimePickerFragment.java
deleted file mode 100644
index 04454e9..0000000
--- a/src/com/android/deskclock/TimePickerFragment.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2014 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.Dialog;
-import android.app.DialogFragment;
-import android.app.TimePickerDialog;
-import android.app.TimePickerDialog.OnTimeSetListener;
-import android.os.Bundle;
-import android.text.format.DateFormat;
-
-import com.android.deskclock.provider.Alarm;
-
-import java.util.Calendar;
-
-public class TimePickerFragment extends DialogFragment {
-
- private Alarm mAlarm;
- private OnTimeSetListener mListener;
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final int hour, minute;
- if (mAlarm == null) {
- final Calendar c = Calendar.getInstance();
- hour = c.get(Calendar.HOUR_OF_DAY);
- minute = c.get(Calendar.MINUTE);
- } else {
- hour = mAlarm.hour;
- minute = mAlarm.minutes;
- }
-
- return new TimePickerDialog(getActivity(), R.style.TimePickerTheme, mListener, hour, minute,
- DateFormat.is24HourFormat(getActivity()));
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
- if (getTargetFragment() instanceof OnTimeSetListener) {
- setOnTimeSetListener((OnTimeSetListener) getTargetFragment());
- }
- }
-
- public void setOnTimeSetListener(OnTimeSetListener listener) {
- mListener = listener;
- }
-
- public void setAlarm(Alarm alarm) {
- mAlarm = alarm;
- }
-}
diff --git a/src/com/android/deskclock/TimerRingService.java b/src/com/android/deskclock/TimerRingService.java
deleted file mode 100644
index 567b073..0000000
--- a/src/com/android/deskclock/TimerRingService.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (C) 2012 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.os.IBinder;
-import android.telephony.PhoneStateListener;
-import android.telephony.TelephonyManager;
-
-/**
- * Play the timer's ringtone. Will continue playing the same alarm until service is stopped.
- */
-public class TimerRingService extends Service implements AudioManager.OnAudioFocusChangeListener {
-
- private boolean mPlaying = false;
- private MediaPlayer mMediaPlayer;
- private TelephonyManager mTelephonyManager;
- private int mInitialCallState;
-
-
- private final 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) {
- stopSelf();
- }
- }
- };
-
- @Override
- public void onCreate() {
- // Listen for incoming calls to kill the alarm.
- mTelephonyManager =
- (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
- mTelephonyManager.listen(
- mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
- AlarmAlertWakeLock.acquireScreenCpuWakeLock(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;
- }
-
- play();
- // Record the initial call state here so that the new alarm has the newest state.
- mInitialCallState = mTelephonyManager.getCallState();
-
- return START_STICKY;
- }
-
- // Volume suggested by media team for in-call alarms.
- private static final float IN_CALL_VOLUME = 0.125f;
-
- private void play() {
-
- if (mPlaying) {
- return;
- }
-
- LogUtils.v("TimerRingService.play()");
-
- // TODO: Reuse mMediaPlayer instead of creating a new one and/or use
- // RingtoneManager.
- mMediaPlayer = new MediaPlayer();
- mMediaPlayer.setOnErrorListener(new OnErrorListener() {
- @Override
- public boolean onError(MediaPlayer mp, int what, int extra) {
- LogUtils.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) {
- LogUtils.v("Using the in-call alarm");
- mMediaPlayer.setVolume(IN_CALL_VOLUME, IN_CALL_VOLUME);
- setDataSourceFromResource(getResources(), mMediaPlayer,
- R.raw.in_call_alarm);
- } else {
- AssetFileDescriptor afd = getAssets().openFd("sounds/Timer_Expire.ogg");
- mMediaPlayer.setDataSource(
- afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
- }
- startAlarm(mMediaPlayer);
- } catch (Exception ex) {
- LogUtils.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,
- R.raw.fallbackring);
- startAlarm(mMediaPlayer);
- } catch (Exception ex2) {
- // At this point we just don't play anything.
- LogUtils.e("Failed to play fallback ringtone", ex2);
- }
- }
-
- mPlaying = true;
- }
-
- // 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();
- audioManager.requestAudioFocus(
- this, AudioManager.STREAM_ALARM, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
- 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 timer audio
- */
- public void stop() {
- LogUtils.v("TimerRingService.stop()");
- if (mPlaying) {
- mPlaying = false;
-
- // Stop audio playing
- if (mMediaPlayer != null) {
- mMediaPlayer.stop();
- final AudioManager audioManager =
- (AudioManager)getSystemService(Context.AUDIO_SERVICE);
- audioManager.abandonAudioFocus(this);
- mMediaPlayer.release();
- mMediaPlayer = null;
- }
- }
- }
-
-
- @Override
- public void onAudioFocusChange(int focusChange) {
- // Do nothing
- }
-}
diff --git a/src/com/android/deskclock/TimerSetupView.java b/src/com/android/deskclock/TimerSetupView.java
deleted file mode 100644
index 04b7d65..0000000
--- a/src/com/android/deskclock/TimerSetupView.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * 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.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.content.Context;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.Button;
-import android.widget.ImageButton;
-import android.widget.LinearLayout;
-
-import com.android.deskclock.timer.TimerView;
-
-
-public class TimerSetupView extends LinearLayout implements Button.OnClickListener,
- Button.OnLongClickListener{
-
- protected int mInputSize = 5;
-
- protected final Button mNumbers [] = new Button [10];
- protected int mInput [] = new int [mInputSize];
- protected int mInputPointer = -1;
- protected Button mLeft, mRight;
- protected ImageButton mStart;
- protected ImageButton mDelete;
- protected TimerView mEnteredTime;
- protected View mDivider;
-
- private final int mColorAccent;
- private final int mColorHairline;
-
- private final AnimatorListenerAdapter mHideFabAnimatorListener = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- if (mStart != null) {
- mStart.setScaleX(1.0f);
- mStart.setScaleY(1.0f);
- mStart.setVisibility(View.INVISIBLE);
- }
- }
- };
-
- private final AnimatorListenerAdapter mShowFabAnimatorListener = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- if (mStart != null) {
- mStart.setVisibility(View.VISIBLE);
- }
- }
- };
-
- public TimerSetupView(Context context) {
- this(context, null /* attrs */);
- }
-
- public TimerSetupView(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- mColorAccent = Utils.obtainStyledColor(context, R.attr.colorAccent, Color.RED);
- mColorHairline = context.getResources().getColor(R.color.hairline);
-
- LayoutInflater.from(context).inflate(R.layout.time_setup_view, this);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- View v1 = findViewById(R.id.first);
- View v2 = findViewById(R.id.second);
- View v3 = findViewById(R.id.third);
- View v4 = findViewById(R.id.fourth);
-
- mEnteredTime = (TimerView)findViewById(R.id.timer_time_text);
- mDelete = (ImageButton)findViewById(R.id.delete);
- mDelete.setOnClickListener(this);
- mDelete.setOnLongClickListener(this);
- mDivider = findViewById(R.id.divider);
-
- mNumbers[1] = (Button)v1.findViewById(R.id.key_left);
- mNumbers[2] = (Button)v1.findViewById(R.id.key_middle);
- mNumbers[3] = (Button)v1.findViewById(R.id.key_right);
-
- mNumbers[4] = (Button)v2.findViewById(R.id.key_left);
- mNumbers[5] = (Button)v2.findViewById(R.id.key_middle);
- mNumbers[6] = (Button)v2.findViewById(R.id.key_right);
-
- mNumbers[7] = (Button)v3.findViewById(R.id.key_left);
- mNumbers[8] = (Button)v3.findViewById(R.id.key_middle);
- mNumbers[9] = (Button)v3.findViewById(R.id.key_right);
-
- mLeft = (Button)v4.findViewById(R.id.key_left);
- mNumbers[0] = (Button)v4.findViewById(R.id.key_middle);
- mRight = (Button)v4.findViewById(R.id.key_right);
-
- mLeft.setVisibility(INVISIBLE);
- mRight.setVisibility(INVISIBLE);
-
- for (int i = 0; i < 10; i++) {
- mNumbers[i].setOnClickListener(this);
- mNumbers[i].setText(String.format("%d", i));
- mNumbers[i].setTextColor(Color.WHITE);
- mNumbers[i].setTag(R.id.numbers_key, new Integer(i));
- }
- updateTime();
- }
-
- public void registerStartButton(ImageButton start) {
- mStart = start;
- initializeStartButtonVisibility();
- }
-
- private void initializeStartButtonVisibility() {
- if (mStart != null) {
- mStart.setVisibility(isInputHasValue() ? View.VISIBLE : View.INVISIBLE);
- }
- }
-
- private void updateStartButton() {
- setFabButtonVisibility(isInputHasValue() /* show or hide */);
- }
-
- public void updateDeleteButtonAndDivider() {
- final boolean enabled = isInputHasValue();
- if (mDelete != null) {
- mDelete.setEnabled(enabled);
- mDivider.setBackgroundColor(enabled ? mColorAccent : mColorHairline);
- }
- }
-
- private boolean isInputHasValue() {
- return mInputPointer != -1;
- }
-
- private void setFabButtonVisibility(boolean show) {
- final int finalVisibility = show ? View.VISIBLE : View.INVISIBLE;
- if (mStart == null || mStart.getVisibility() == finalVisibility) {
- // Fab is not initialized yet or already shown/hidden
- return;
- }
-
- final Animator scaleAnimator = AnimatorUtils.getScaleAnimator(
- mStart, show ? 0.0f : 1.0f, show ? 1.0f : 0.0f);
- scaleAnimator.setDuration(AnimatorUtils.ANIM_DURATION_SHORT);
- scaleAnimator.addListener(show ? mShowFabAnimatorListener : mHideFabAnimatorListener);
- scaleAnimator.start();
- }
-
- @Override
- public void onClick(View v) {
- doOnClick(v);
- updateStartButton();
- updateDeleteButtonAndDivider();
- }
-
- protected void doOnClick(View v) {
-
- Integer val = (Integer) v.getTag(R.id.numbers_key);
- // A number was pressed
- if (val != null) {
- // pressing "0" as the first digit does nothing
- if (mInputPointer == -1 && val == 0) {
- return;
- }
- if (mInputPointer < mInputSize - 1) {
- for (int i = mInputPointer; i >= 0; i--) {
- mInput[i+1] = mInput[i];
- }
- mInputPointer++;
- mInput [0] = val;
- // Update so talkback will read the number being deleted
- mDelete.setContentDescription(
- getResources().getString(R.string.timer_descriptive_delete,
- Integer.toString(val)));
- updateTime();
- }
- return;
- }
-
- // other keys
- if (v == mDelete) {
- if (mInputPointer >= 0) {
- for (int i = 0; i < mInputPointer; i++) {
- mInput[i] = mInput[i + 1];
- }
- mInput[mInputPointer] = 0;
- mInputPointer--;
- updateTime();
- }
- // update so talkback will read either the next number or its original description
- // if there are no more numbers.
- mDelete.setContentDescription(getResources().getString(
- R.string.timer_descriptive_delete,
- mInputPointer < 0 ? "" : Integer.toString(mInput[mInputPointer])));
- }
- }
-
- @Override
- public boolean onLongClick(View v) {
- if (v == mDelete) {
- reset();
- updateStartButton();
- updateDeleteButtonAndDivider();
- return true;
- }
- return false;
- }
-
- protected void updateTime() {
- mEnteredTime.setTime(mInput[4], mInput[3], mInput[2],
- mInput[1] * 10 + mInput[0]);
- }
-
- public void reset() {
- for (int i = 0; i < mInputSize; i ++) {
- mInput[i] = 0;
- }
- mInputPointer = -1;
- updateTime();
- }
-
- public int getTime() {
- return mInput[4] * 3600 + mInput[3] * 600 + mInput[2] * 60 + mInput[1] * 10 + mInput[0];
- }
-
- public void saveEntryState(Bundle outState, String key) {
- outState.putIntArray(key, mInput);
- }
-
- public void restoreEntryState(Bundle inState, String key) {
- int[] input = inState.getIntArray(key);
- if (input != null && mInputSize == input.length) {
- for (int i = 0; i < mInputSize; i++) {
- mInput[i] = input[i];
- if (mInput[i] != 0) {
- mInputPointer = i;
- }
- }
- updateTime();
- }
- initializeStartButtonVisibility();
- }
-}
diff --git a/src/com/android/deskclock/Utils.java b/src/com/android/deskclock/Utils.java
index 89542ad..13c7c4c 100644
--- a/src/com/android/deskclock/Utils.java
+++ b/src/com/android/deskclock/Utils.java
@@ -20,12 +20,11 @@
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
+import android.annotation.TargetApi;
import android.app.AlarmManager;
+import android.content.ContentResolver;
import android.content.Context;
-import android.content.Intent;
import android.content.SharedPreferences;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
@@ -33,10 +32,9 @@
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Typeface;
-import android.net.Uri;
import android.os.Build;
import android.os.Handler;
-import android.os.SystemClock;
+import android.os.Looper;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.support.v4.content.ContextCompat;
@@ -47,51 +45,36 @@
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.text.format.Time;
-import android.text.style.AbsoluteSizeSpan;
+import android.text.style.RelativeSizeSpan;
import android.text.style.StyleSpan;
import android.text.style.TypefaceSpan;
-import android.util.Log;
-import android.view.MenuItem;
+import android.util.ArraySet;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.widget.TextClock;
import android.widget.TextView;
+import com.android.deskclock.data.DataModel;
import com.android.deskclock.provider.AlarmInstance;
import com.android.deskclock.provider.DaysOfWeek;
-import com.android.deskclock.stopwatch.Stopwatches;
-import com.android.deskclock.timer.Timers;
-import com.android.deskclock.worldclock.CityObj;
+import com.android.deskclock.settings.SettingsActivity;
import java.io.File;
+import java.text.DateFormatSymbols;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
+import java.util.Collection;
import java.util.Date;
import java.util.GregorianCalendar;
-import java.util.HashMap;
import java.util.Locale;
-import java.util.Map;
import java.util.TimeZone;
-
public class Utils {
- private final static String PARAM_LANGUAGE_CODE = "hl";
-
- /**
- * Help URL query parameter key for the app version.
- */
- private final static String PARAM_VERSION = "version";
-
- /**
- * Cached version code to prevent repeated calls to the package manager.
- */
- private static String sCachedVersionCode = null;
-
// Single-char version of day name, e.g.: 'S', 'M', 'T', 'W', 'T', 'F', 'S'
private static String[] sShortWeekdays = null;
- private static final String DATE_FORMAT_SHORT = isJBMR2OrLater() ? "ccccc" : "ccc";
+ private static final String DATE_FORMAT_SHORT = "ccccc";
// Long-version of day name, e.g.: 'Sunday', 'Monday', 'Tuesday', etc
private static String[] sLongWeekdays = null;
@@ -101,10 +84,6 @@
private static Locale sLocaleUsedForWeekdays;
- /** Types that may be used for clock displays. **/
- public static final String CLOCK_TYPE_DIGITAL = "digital";
- public static final String CLOCK_TYPE_ANALOG = "analog";
-
/**
* Temporary array used by {@link #obtainStyledColor(Context, int, int)}.
*/
@@ -140,18 +119,32 @@
0xFF20222A /* 11 PM */
};
- /**
- * Returns whether the SDK is KitKat or later
- */
- public static boolean isKitKatOrLater() {
- return Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2;
+ public static void enforceMainLooper() {
+ if (Looper.getMainLooper() != Looper.myLooper()) {
+ throw new IllegalAccessError("May only call from main thread.");
+ }
+ }
+
+ public static void enforceNotMainLooper() {
+ if (Looper.getMainLooper() == Looper.myLooper()) {
+ throw new IllegalAccessError("May not call from main thread.");
+ }
}
/**
- * @return {@code true} if the device is {@link Build.VERSION_CODES#JELLY_BEAN_MR2} or later
+ * @return {@code true} if the device is prior to {@link Build.VERSION_CODES#LOLLIPOP}
*/
- public static boolean isJBMR2OrLater() {
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;
+ public static boolean isPreL() {
+ return Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP;
+ }
+
+ /**
+ * @return {@code true} if the device is {@link Build.VERSION_CODES#LOLLIPOP} or
+ * {@link Build.VERSION_CODES#LOLLIPOP_MR1}
+ */
+ public static boolean isLOrLMR1() {
+ final int sdkInt = Build.VERSION.SDK_INT;
+ return sdkInt == Build.VERSION_CODES.LOLLIPOP || sdkInt == Build.VERSION_CODES.LOLLIPOP_MR1;
}
/**
@@ -182,70 +175,8 @@
return BuildCompat.isAtLeastN();
}
- public static void prepareHelpMenuItem(Context context, MenuItem helpMenuItem) {
- String helpUrlString = context.getResources().getString(R.string.desk_clock_help_url);
- if (TextUtils.isEmpty(helpUrlString)) {
- // The help url string is empty or null, so set the help menu item to be invisible.
- helpMenuItem.setVisible(false);
- return;
- }
- // The help url string exists, so first add in some extra query parameters. 87
- final Uri fullUri = uriWithAddedParameters(context, Uri.parse(helpUrlString));
-
- // Then, create an intent that will be fired when the user
- // selects this help menu item.
- Intent intent = new Intent(Intent.ACTION_VIEW, fullUri);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
-
- // Set the intent to the help menu item, show the help menu item in the overflow
- // menu, and make it visible.
- helpMenuItem.setIntent(intent);
- helpMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
- helpMenuItem.setVisible(true);
- }
-
/**
- * Adds two query parameters into the Uri, namely the language code and the version code
- * of the application's package as gotten via the context.
- * @return the uri with added query parameters
- */
- private static Uri uriWithAddedParameters(Context context, Uri baseUri) {
- Uri.Builder builder = baseUri.buildUpon();
-
- // Add in the preferred language
- builder.appendQueryParameter(PARAM_LANGUAGE_CODE, Locale.getDefault().toString());
-
- // Add in the package version code
- if (sCachedVersionCode == null) {
- // There is no cached version code, so try to get it from the package manager.
- try {
- // cache the version code
- PackageInfo info = context.getPackageManager().getPackageInfo(
- context.getPackageName(), 0);
- sCachedVersionCode = Integer.toString(info.versionCode);
-
- // append the version code to the uri
- builder.appendQueryParameter(PARAM_VERSION, sCachedVersionCode);
- } catch (NameNotFoundException e) {
- // Cannot find the package name, so don't add in the version parameter
- // This shouldn't happen.
- LogUtils.wtf("Invalid package name for context " + e);
- }
- } else {
- builder.appendQueryParameter(PARAM_VERSION, sCachedVersionCode);
- }
-
- // Build the full uri and return it
- return builder.build();
- }
-
- public static long getTimeNow() {
- return SystemClock.elapsedRealtime();
- }
-
- /**
- * Calculate the amount by which the radius of a CircleTimerView should be offset by the any
+ * Calculate the amount by which the radius of a CircleTimerView should be offset by any
* of the extra painted objects.
*/
public static float calculateRadiusOffset(
@@ -255,7 +186,7 @@
/**
* Uses {@link Utils#calculateRadiusOffset(float, float, float)} after fetching the values
- * from the resources just as {@link CircleTimerView#init(android.content.Context)} does.
+ * from the resources.
*/
public static float calculateRadiusOffset(Resources resources) {
if (resources != null) {
@@ -268,50 +199,6 @@
}
}
- /**
- * Clears the persistent data of stopwatch (start time, state, laps, etc...).
- */
- public static void clearSwSharedPref(SharedPreferences prefs) {
- SharedPreferences.Editor editor = prefs.edit();
- editor.remove (Stopwatches.PREF_START_TIME);
- editor.remove (Stopwatches.PREF_ACCUM_TIME);
- editor.remove (Stopwatches.PREF_STATE);
- int lapNum = prefs.getInt(Stopwatches.PREF_LAP_NUM, Stopwatches.STOPWATCH_RESET);
- for (int i = 0; i < lapNum; i++) {
- String key = Stopwatches.PREF_LAP_TIME + Integer.toString(i);
- editor.remove(key);
- }
- editor.remove(Stopwatches.PREF_LAP_NUM);
- editor.apply();
- }
-
- /**
- * Broadcast a message to show the in-use timers in the notifications
- */
- public static void showInUseNotifications(Context context) {
- Intent timerIntent = new Intent();
- timerIntent.setAction(Timers.NOTIF_IN_USE_SHOW);
- context.sendBroadcast(timerIntent);
- }
-
- /**
- * Broadcast a message to show the in-use timers in the notifications
- */
- public static void showTimesUpNotifications(Context context) {
- Intent timerIntent = new Intent();
- timerIntent.setAction(Timers.NOTIF_TIMES_UP_SHOW);
- context.sendBroadcast(timerIntent);
- }
-
- /**
- * Broadcast a message to cancel the in-use timers in the notifications
- */
- public static void cancelTimesUpNotifications(Context context) {
- Intent timerIntent = new Intent();
- timerIntent.setAction(Timers.NOTIF_TIMES_UP_CANCEL);
- context.sendBroadcast(timerIntent);
- }
-
/** Runnable for use with screensaver and dream, to move the clock every minute.
* registerViews() must be called prior to posting.
*/
@@ -501,23 +388,40 @@
* For screensavers to set whether the digital or analog clock should be displayed.
* Returns the view to be displayed.
*/
- public static View setClockStyle(Context context, View digitalClock, View analogClock,
- String clockStyleKey) {
- SharedPreferences sharedPref = Utils.getDefaultSharedPreferences(context);
- String defaultClockStyle = context.getResources().getString(R.string.default_clock_style);
- String style = sharedPref.getString(clockStyleKey, defaultClockStyle);
- View returnView;
- if (style.equals(CLOCK_TYPE_ANALOG)) {
- digitalClock.setVisibility(View.GONE);
- analogClock.setVisibility(View.VISIBLE);
- returnView = analogClock;
- } else {
- digitalClock.setVisibility(View.VISIBLE);
- analogClock.setVisibility(View.GONE);
- returnView = digitalClock;
+ public static View setClockStyle(View digitalClock, View analogClock) {
+ final DataModel.ClockStyle clockStyle = DataModel.getDataModel().getClockStyle();
+ switch (clockStyle) {
+ case ANALOG:
+ digitalClock.setVisibility(View.GONE);
+ analogClock.setVisibility(View.VISIBLE);
+ return analogClock;
+ case DIGITAL:
+ digitalClock.setVisibility(View.VISIBLE);
+ analogClock.setVisibility(View.GONE);
+ return digitalClock;
}
- return returnView;
+ throw new IllegalStateException("unexpected clock style: " + clockStyle);
+ }
+
+ /**
+ * For screensavers to set whether the digital or analog clock should be displayed.
+ * Returns the view to be displayed.
+ */
+ public static View setScreensaverClockStyle(View digitalClock, View analogClock) {
+ final DataModel.ClockStyle clockStyle = DataModel.getDataModel().getScreensaverClockStyle();
+ switch (clockStyle) {
+ case ANALOG:
+ digitalClock.setVisibility(View.GONE);
+ analogClock.setVisibility(View.VISIBLE);
+ return analogClock;
+ case DIGITAL:
+ digitalClock.setVisibility(View.VISIBLE);
+ analogClock.setVisibility(View.GONE);
+ return digitalClock;
+ }
+
+ throw new IllegalStateException("unexpected clock style: " + clockStyle);
}
/**
@@ -536,21 +440,27 @@
* @return The next alarm from {@link AlarmManager}
*/
public static String getNextAlarm(Context context) {
- String timeString = null;
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
- timeString = Settings.System.getString(context.getContentResolver(),
- Settings.System.NEXT_ALARM_FORMATTED);
- } else {
- final AlarmManager.AlarmClockInfo info = ((AlarmManager) context.getSystemService(
- Context.ALARM_SERVICE)).getNextAlarmClock();
- if (info != null) {
- final long triggerTime = info.getTriggerTime();
- final Calendar alarmTime = Calendar.getInstance();
- alarmTime.setTimeInMillis(triggerTime);
- timeString = AlarmUtils.getFormattedTime(context, alarmTime);
- }
+ return isPreL() ? getNextAlarmPreL(context) : getNextAlarmLOrLater(context);
+ }
+
+ @TargetApi(Build.VERSION_CODES.KITKAT)
+ private static String getNextAlarmPreL(Context context) {
+ final ContentResolver cr = context.getContentResolver();
+ return Settings.System.getString(cr, Settings.System.NEXT_ALARM_FORMATTED);
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ private static String getNextAlarmLOrLater(Context context) {
+ final AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+ final AlarmManager.AlarmClockInfo info = am.getNextAlarmClock();
+ if (info != null) {
+ final long triggerTime = info.getTriggerTime();
+ final Calendar alarmTime = Calendar.getInstance();
+ alarmTime.setTimeInMillis(triggerTime);
+ return AlarmUtils.getFormattedTime(context, alarmTime);
}
- return timeString;
+
+ return null;
}
public static boolean isAlarmWithin24Hours(AlarmInstance alarmInstance) {
@@ -559,42 +469,39 @@
return nextAlarmTimeMillis - System.currentTimeMillis() <= DateUtils.DAY_IN_MILLIS;
}
- /** Clock views can call this to refresh their alarm to the next upcoming value. **/
+ /** Clock views can call this to refresh their alarm to the next upcoming value. */
public static void refreshAlarm(Context context, View clock) {
- final String nextAlarm = getNextAlarm(context);
- TextView nextAlarmView;
- nextAlarmView = (TextView) clock.findViewById(R.id.nextAlarm);
- if (!TextUtils.isEmpty(nextAlarm) && nextAlarmView != null) {
- nextAlarmView.setText(
- context.getString(R.string.control_set_alarm_with_existing, nextAlarm));
- nextAlarmView.setContentDescription(context.getResources().getString(
- R.string.next_alarm_description, nextAlarm));
+ final TextView nextAlarmView = (TextView) clock.findViewById(R.id.nextAlarm);
+ if (nextAlarmView == null) {
+ return;
+ }
+
+ final String alarm = getNextAlarm(context);
+ if (!TextUtils.isEmpty(alarm)) {
+ final String description = context.getString(R.string.next_alarm_description, alarm);
+ nextAlarmView.setText(alarm);
+ nextAlarmView.setContentDescription(description);
nextAlarmView.setVisibility(View.VISIBLE);
- } else {
+ } else {
nextAlarmView.setVisibility(View.GONE);
}
}
/** Clock views can call this to refresh their date. **/
- public static void updateDate(
- String dateFormat, String dateFormatForAccessibility, View clock) {
-
- Date now = new Date();
- TextView dateDisplay;
- dateDisplay = (TextView) clock.findViewById(R.id.date);
- if (dateDisplay != null) {
- final Locale l = Locale.getDefault();
- dateDisplay.setText(isJBMR2OrLater()
- ? new SimpleDateFormat(
- DateFormat.getBestDateTimePattern(l, dateFormat), l).format(now)
- : SimpleDateFormat.getDateInstance().format(now));
- dateDisplay.setVisibility(View.VISIBLE);
- dateDisplay.setContentDescription(isJBMR2OrLater()
- ? new SimpleDateFormat(
- DateFormat.getBestDateTimePattern(l, dateFormatForAccessibility), l)
- .format(now)
- : SimpleDateFormat.getDateInstance(java.text.DateFormat.FULL).format(now));
+ public static void updateDate(String dateSkeleton, String descriptionSkeleton, View clock) {
+ final TextView dateDisplay = (TextView) clock.findViewById(R.id.date);
+ if (dateDisplay == null) {
+ return;
}
+
+ final Locale l = Locale.getDefault();
+ final String datePattern = DateFormat.getBestDateTimePattern(l, dateSkeleton);
+ final String descriptionPattern = DateFormat.getBestDateTimePattern(l, descriptionSkeleton);
+
+ final Date now = new Date();
+ dateDisplay.setText(new SimpleDateFormat(datePattern, l).format(now));
+ dateDisplay.setVisibility(View.VISIBLE);
+ dateDisplay.setContentDescription(new SimpleDateFormat(descriptionPattern, l).format(now));
}
/***
@@ -602,30 +509,43 @@
* formatting treatment for the am/pm label.
* @param context - Context used to get user's locale and time preferences
* @param clock - TextClock to format
- * @param amPmFontSize - size of the am/pm label since it is usually smaller
*/
- public static void setTimeFormat(Context context, TextClock clock, int amPmFontSize) {
+ public static void setTimeFormat(Context context, TextClock clock) {
if (clock != null) {
// Get the best format for 12 hours mode according to the locale
- clock.setFormat12Hour(get12ModeFormat(context, amPmFontSize));
+ clock.setFormat12Hour(get12ModeFormat(context, true /* showAmPm */));
// Get the best format for 24 hours mode according to the locale
clock.setFormat24Hour(get24ModeFormat());
}
}
- /***
+
+ /**
+ * Returns {@code true} if the am / pm strings for the current locale are long and a reduced
+ * text size should be used for displaying the digital clock.
+ */
+ public static boolean isAmPmStringLong() {
+ final String[] amPmStrings = new DateFormatSymbols().getAmPmStrings();
+ for (String amPmString : amPmStrings) {
+ // Dots are small, so don't count them.
+ final int amPmStringLength = amPmString.replace(".", "").length();
+ if (amPmStringLength > 3) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
* @param context - context used to get time format string resource
- * @param amPmFontSize - size of am/pm label (label removed is size is 0).
+ * @param showAmPm - include the am/pm string if true
* @return format string for 12 hours mode time
*/
- public static CharSequence get12ModeFormat(Context context, int amPmFontSize) {
- String pattern = isJBMR2OrLater()
- ? DateFormat.getBestDateTimePattern(Locale.getDefault(), "hma")
- : context.getString(R.string.time_format_12_mode);
-
- // Remove the am/pm
- if (amPmFontSize <= 0) {
- pattern.replaceAll("a", "").trim();
+ public static CharSequence get12ModeFormat(Context context, boolean showAmPm) {
+ String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), "hma");
+ if (!showAmPm) {
+ pattern = pattern.replaceAll("a", "").trim();
}
+
// Replace spaces with "Hair Space"
pattern = pattern.replaceAll(" ", "\u200A");
// Build a spannable so that the am/pm will be formatted
@@ -633,74 +553,29 @@
if (amPmPos == -1) {
return pattern;
}
- Spannable sp = new SpannableString(pattern);
+
+ final Resources resources = context.getResources();
+ final float amPmProportion = resources.getFraction(R.fraction.ampm_font_size_scale, 1, 1);
+ final Spannable sp = new SpannableString(pattern);
+ sp.setSpan(new RelativeSizeSpan(amPmProportion), amPmPos, amPmPos + 1,
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sp.setSpan(new StyleSpan(Typeface.NORMAL), amPmPos, amPmPos + 1,
- Spannable.SPAN_POINT_MARK);
- sp.setSpan(new AbsoluteSizeSpan(amPmFontSize), amPmPos, amPmPos + 1,
- Spannable.SPAN_POINT_MARK);
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sp.setSpan(new TypefaceSpan("sans-serif"), amPmPos, amPmPos + 1,
- Spannable.SPAN_POINT_MARK);
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+
+ // Make the font smaller for locales with long am/pm strings.
+ if (Utils.isAmPmStringLong()) {
+ final float proportion = resources.getFraction(
+ R.fraction.reduced_clock_font_size_scale, 1, 1);
+ sp.setSpan(new RelativeSizeSpan(proportion), 0, pattern.length(),
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
return sp;
}
public static CharSequence get24ModeFormat() {
- return isJBMR2OrLater()
- ? DateFormat.getBestDateTimePattern(Locale.getDefault(), "Hm")
- : (new SimpleDateFormat("k:mm", Locale.getDefault())).toLocalizedPattern();
- }
-
- public static CityObj[] loadCitiesFromXml(Context c) {
- Resources r = c.getResources();
- // Read strings array of name,timezone, id
- // make sure the list are the same length
- String[] cityNames = r.getStringArray(R.array.cities_names);
- String[] timezones = r.getStringArray(R.array.cities_tz);
- String[] ids = r.getStringArray(R.array.cities_id);
- int minLength = cityNames.length;
- if (cityNames.length != timezones.length || ids.length != cityNames.length) {
- minLength = Math.min(cityNames.length, Math.min(timezones.length, ids.length));
- LogUtils.e("City lists sizes are not the same, truncating");
- }
- CityObj[] cities = new CityObj[minLength];
- for (int i = 0; i < cities.length; i++) {
- // Default to using the first character of the city name as the index unless one is
- // specified. The indicator for a specified index is the addition of character(s)
- // before the "=" separator.
- final String parseString = cityNames[i];
- final int separatorIndex = parseString.indexOf("=");
- final String index;
- final String cityName;
- if (parseString.length() <= 1 && separatorIndex >= 0) {
- LogUtils.w("Cannot parse city name %s; skipping", parseString);
- continue;
- }
- if (separatorIndex == 0) {
- // Default to using second character (the first character after the = separator)
- // as the index.
- index = parseString.substring(1, 2);
- cityName = parseString.substring(1);
- } else if (separatorIndex == -1) {
- // Default to using the first character as the index
- index = parseString.substring(0, 1);
- cityName = parseString;
- LogUtils.e("Missing expected separator character =");
- } else {
- index = parseString.substring(0, separatorIndex);
- cityName = parseString.substring(separatorIndex + 1);
- }
- cities[i] = new CityObj(cityName, timezones[i], ids[i], index);
- }
- return cities;
- }
- // Returns a map of cities where the key is lowercase
- public static Map<String, CityObj> loadCityMapFromXml(Context c) {
- CityObj[] cities = loadCitiesFromXml(c);
-
- final Map<String, CityObj> map = new HashMap<>(cities.length);
- for (CityObj city : cities) {
- map.put(city.mCityName.toLowerCase(), city);
- }
- return map;
+ return DateFormat.getBestDateTimePattern(Locale.getDefault(), "Hm");
}
/**
@@ -721,10 +596,6 @@
}
}
- public static String getCityName(CityObj city, CityObj dbCity) {
- return (city.mCityId == null || dbCity == null) ? city.mCityName : dbCity.mCityName;
- }
-
/**
* Convenience method for retrieving a themed color value.
*
@@ -771,8 +642,7 @@
// Return the first day of the week value corresponding to Calendar.<WEEKDAY> value, which is
// 1-indexed starting with Sunday.
public static int getFirstDayOfWeek(Context context) {
- return Integer.parseInt(Utils
- .getDefaultSharedPreferences(context)
+ return Integer.parseInt(getDefaultSharedPreferences(context)
.getString(SettingsActivity.KEY_WEEK_START, String.valueOf(DEFAULT_WEEK_START)));
}
@@ -817,7 +687,6 @@
}
/**
- * @param context
* @param id Resource id of the plural
* @param quantity integer value
* @return string with properly localized numbers
@@ -827,6 +696,12 @@
return context.getResources().getQuantityString(id, quantity, localizedQuantity);
}
+ public static <E> ArraySet<E> newArraySet(Collection<E> collection) {
+ final ArraySet<E> arraySet = new ArraySet<>(collection.size());
+ arraySet.addAll(collection);
+ return arraySet;
+ }
+
/**
* Return the default shared preferences.
*/
diff --git a/src/com/android/deskclock/Voice.java b/src/com/android/deskclock/Voice.java
index 7881f8c..f33bbe7 100644
--- a/src/com/android/deskclock/Voice.java
+++ b/src/com/android/deskclock/Voice.java
@@ -16,8 +16,10 @@
package com.android.deskclock;
+import android.annotation.TargetApi;
import android.app.Activity;
import android.app.VoiceInteractor;
+import android.os.Build;
/**
* Notifies Voice Interactor about whether the action
@@ -34,6 +36,10 @@
sDelegate = delegate;
}
+ public static Delegate getDelegate() {
+ return sDelegate;
+ }
+
public static void notifySuccess(Activity activity, String message) {
if (Utils.isMOrLater()) {
sDelegate.notifySuccess(activity.getVoiceInteractor(), message);
@@ -52,6 +58,7 @@
void notifyFailure(VoiceInteractor vi, String message);
}
+ @TargetApi(Build.VERSION_CODES.M)
private static class VoiceInteractorDelegate implements Delegate {
@Override
public void notifySuccess(VoiceInteractor vi, String message) {
@@ -69,4 +76,4 @@
}
}
}
-}
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/actionbarmenu/AbstractMenuItemController.java b/src/com/android/deskclock/actionbarmenu/AbstractMenuItemController.java
new file mode 100644
index 0000000..047d816
--- /dev/null
+++ b/src/com/android/deskclock/actionbarmenu/AbstractMenuItemController.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 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.actionbarmenu;
+
+import android.view.Menu;
+
+/**
+ * Base of all {@link MenuItemController}. It contains basic implementation for enabling controller.
+ */
+public abstract class AbstractMenuItemController implements MenuItemController {
+ // Whether or not the controller is enabled. By default it's enabled.
+ private boolean mEnabled = true;
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ mEnabled = enabled;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return mEnabled;
+ }
+
+ @Override
+ public void setInitialState(Menu menu) {
+ // By default, there is nothing to initialize.
+ }
+}
diff --git a/src/com/android/deskclock/actionbarmenu/ActionBarMenuManager.java b/src/com/android/deskclock/actionbarmenu/ActionBarMenuManager.java
new file mode 100644
index 0000000..f470e5b
--- /dev/null
+++ b/src/com/android/deskclock/actionbarmenu/ActionBarMenuManager.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2015 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.actionbarmenu;
+
+import android.app.Activity;
+import android.util.ArrayMap;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+import com.android.deskclock.R;
+
+/**
+ * Activity scoped singleton that manages action bar menus. Each menu item is controlled by a
+ * {@link MenuItemController} instance.
+ * <p/>
+ * This class needs to be instantiated before or during activity's onCreate event.
+ */
+public final class ActionBarMenuManager {
+ // A map of all menu item controllers, keyed by menu item id.
+ private final ArrayMap<Integer, MenuItemController> mControllers;
+
+ public ActionBarMenuManager(Activity activity) {
+ mControllers = new ArrayMap<>();
+ }
+
+ /**
+ * Add one or more {@link MenuItemController} to the actionbar menu.
+ * <p/>
+ * This should be called before activity's onPrepareOptionsMenu event.
+ */
+ public ActionBarMenuManager addMenuItemController(MenuItemController... menuItemControllers) {
+ if (menuItemControllers != null) {
+ for (MenuItemController controller : menuItemControllers) {
+ mControllers.put(controller.getId(), controller);
+ }
+ }
+ return this;
+ }
+
+ /**
+ * Inflates {@link Menu} for the activity.
+ * <p/>
+ * This method should be called during activity's onCreateOptionsMenu method.
+ */
+ public void createOptionsMenu(Menu menu, MenuInflater inflater) {
+ if (menu.size() > 0) {
+ throw new IllegalStateException("Menu has already been inflated.");
+ }
+ inflater.inflate(R.menu.desk_clock_menu, menu);
+
+ final int controllerSize = mControllers.size();
+ for (int i = 0; i < controllerSize; i++) {
+ final MenuItemController controller = mControllers.valueAt(i);
+ if (controller.isEnabled()) {
+ controller.setInitialState(menu);
+ }
+ }
+ }
+
+ /**
+ * Prepares the popup to displays all required menu items.
+ * <p/>
+ * This method should be called during activity's onPrepareOptionsMenu method.
+ */
+ public void prepareShowMenu(Menu menu) {
+ final int menuSize = menu.size();
+ for (int i = 0; i < menuSize; i++) {
+ menu.getItem(i).setVisible(false);
+ }
+ final int controllerSize = mControllers.size();
+ for (int i = 0; i < controllerSize; i++) {
+ final MenuItemController controller = mControllers.valueAt(i);
+ if (controller.isEnabled()) {
+ controller.showMenuItem(menu);
+ }
+ }
+ }
+
+ /**
+ * Handles click action for a menu item.
+ * <p/>
+ * This method should be called during activity's onOptionsItemSelected method.
+ */
+ public boolean handleMenuItemClick(MenuItem item) {
+ final int itemId = item.getItemId();
+ return mControllers.get(itemId).handleMenuItemClick(item);
+ }
+}
diff --git a/src/com/android/deskclock/actionbarmenu/MenuItemController.java b/src/com/android/deskclock/actionbarmenu/MenuItemController.java
new file mode 100644
index 0000000..d7cb06f
--- /dev/null
+++ b/src/com/android/deskclock/actionbarmenu/MenuItemController.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 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.actionbarmenu;
+
+import android.view.Menu;
+import android.view.MenuItem;
+
+/**
+ * Interface for handling a single menu item in action bar.
+ */
+public interface MenuItemController {
+
+ /**
+ * Sets whether or not the controller is enabled.
+ */
+ void setEnabled(boolean enabled);
+
+ /**
+ * Returns true if the controller is currently enabled.
+ */
+ boolean isEnabled();
+
+ /**
+ * Returns the menu item id that the controller is responsible for.
+ */
+ int getId();
+
+ /**
+ * Sets the initial state for the menu item.
+ */
+ void setInitialState(Menu menu);
+
+ /**
+ * Find the menu item this controller cares about, and make it visible.
+ *
+ * @param menu The menu object containing an item that controller can handle.
+ */
+ void showMenuItem(Menu menu);
+
+ /**
+ * Attempts to handle the click action.
+ *
+ * @param item The menu item being clicked.
+ * @return True if the action is handled by this controller, false otherwise.
+ */
+ boolean handleMenuItemClick(MenuItem item);
+}
diff --git a/src/com/android/deskclock/actionbarmenu/MenuItemControllerFactory.java b/src/com/android/deskclock/actionbarmenu/MenuItemControllerFactory.java
new file mode 100644
index 0000000..3598f16
--- /dev/null
+++ b/src/com/android/deskclock/actionbarmenu/MenuItemControllerFactory.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 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.actionbarmenu;
+
+import android.app.Activity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Factory that builds optional {@link MenuItemController} instances.
+ */
+public final class MenuItemControllerFactory {
+
+ private static final MenuItemControllerFactory INSTANCE = new MenuItemControllerFactory();
+
+ public static MenuItemControllerFactory getInstance() {
+ return INSTANCE;
+ }
+
+ private final List<MenuItemProvider> mMenuItemProviders;
+
+ private MenuItemControllerFactory() {
+ mMenuItemProviders = new ArrayList<>();
+ }
+
+ public MenuItemControllerFactory addMenuItemProvider(MenuItemProvider provider) {
+ mMenuItemProviders.add(provider);
+ return this;
+ }
+
+ public MenuItemController[] buildMenuItemControllers(Activity activity) {
+ final int providerSize = mMenuItemProviders.size();
+ final MenuItemController[] controllers = new MenuItemController[providerSize];
+ for (int i = 0; i < providerSize; i++) {
+ controllers[i] = mMenuItemProviders.get(i).provide(activity);
+ }
+ return controllers;
+ }
+}
diff --git a/src/com/android/deskclock/actionbarmenu/MenuItemProvider.java b/src/com/android/deskclock/actionbarmenu/MenuItemProvider.java
new file mode 100644
index 0000000..c3e460d
--- /dev/null
+++ b/src/com/android/deskclock/actionbarmenu/MenuItemProvider.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 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.actionbarmenu;
+
+import android.app.Activity;
+
+/**
+ * Provider for a {@link MenuItemController} instances.
+ */
+public interface MenuItemProvider {
+
+ /**
+ * provides a {@link MenuItemController} that handles menu item.
+ */
+ MenuItemController provide(Activity activity);
+}
diff --git a/src/com/android/deskclock/actionbarmenu/NavUpMenuItemController.java b/src/com/android/deskclock/actionbarmenu/NavUpMenuItemController.java
new file mode 100644
index 0000000..a2aebbf
--- /dev/null
+++ b/src/com/android/deskclock/actionbarmenu/NavUpMenuItemController.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2015 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.actionbarmenu;
+
+import android.app.Activity;
+import android.view.Menu;
+import android.view.MenuItem;
+
+/**
+ * {@link MenuItemController} for handling navigation up button in actionbar. It is a special
+ * menu item because it's not inflated through menu.xml, and has its own predefined id.
+ */
+public final class NavUpMenuItemController extends AbstractMenuItemController {
+
+ private final Activity mActivity;
+
+ public NavUpMenuItemController(Activity activity) {
+ mActivity = activity;
+ }
+
+ @Override
+ public int getId() {
+ return android.R.id.home;
+ }
+
+ @Override
+ public void showMenuItem(Menu menu) {
+ // Intentionally left empty, because back button in actionbar is not shown by inflating
+ // menu layouts. It's directly controlled by actionbar.
+ }
+
+ @Override
+ public boolean handleMenuItemClick(MenuItem item) {
+ mActivity.finish();
+ return true;
+ }
+}
diff --git a/src/com/android/deskclock/actionbarmenu/NightModeMenuItemController.java b/src/com/android/deskclock/actionbarmenu/NightModeMenuItemController.java
new file mode 100644
index 0000000..0a98621
--- /dev/null
+++ b/src/com/android/deskclock/actionbarmenu/NightModeMenuItemController.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 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.actionbarmenu;
+
+import android.content.Context;
+import android.content.Intent;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import com.android.deskclock.R;
+import com.android.deskclock.ScreensaverActivity;
+
+/**
+ * {@link MenuItemController} for controlling night mode display.
+ */
+public final class NightModeMenuItemController extends AbstractMenuItemController {
+
+ private static final int NIGHT_MODE_MENU_RES_ID = R.id.menu_item_night_mode;
+
+ private final Context mContext;
+
+ public NightModeMenuItemController(Context context) {
+ mContext = context;
+ }
+
+ @Override
+ public int getId() {
+ return NIGHT_MODE_MENU_RES_ID;
+ }
+
+ @Override
+ public void showMenuItem(Menu menu) {
+ menu.findItem(NIGHT_MODE_MENU_RES_ID).setVisible(true);
+ }
+
+ @Override
+ public boolean handleMenuItemClick(MenuItem item) {
+ mContext.startActivity(new Intent(mContext, ScreensaverActivity.class));
+ return true;
+ }
+}
diff --git a/src/com/android/deskclock/actionbarmenu/SearchMenuItemController.java b/src/com/android/deskclock/actionbarmenu/SearchMenuItemController.java
new file mode 100644
index 0000000..fbba78d
--- /dev/null
+++ b/src/com/android/deskclock/actionbarmenu/SearchMenuItemController.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2015 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.actionbarmenu;
+
+import android.os.Bundle;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.widget.SearchView;
+import android.support.v7.widget.SearchView.OnQueryTextListener;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+
+import com.android.deskclock.R;
+
+/**
+ * {@link MenuItemController} for search menu.
+ */
+public final class SearchMenuItemController extends AbstractMenuItemController {
+
+ private static final String KEY_SEARCH_QUERY = "search_query";
+ private static final String KEY_SEARCH_MODE = "search_mode";
+ private static final int SEARCH_MENU_RES_ID = R.id.menu_item_search;
+ private final SearchView.OnQueryTextListener mQueryListener;
+ private final SearchModeChangeListener mSearchModeChangeListener;
+ private String mQuery = "";
+ private boolean mSearchMode;
+
+ public SearchMenuItemController(OnQueryTextListener queryListener, Bundle savedState) {
+ mSearchModeChangeListener = new SearchModeChangeListener();
+ mQueryListener = queryListener;
+ if (savedState != null) {
+ mSearchMode = savedState.getBoolean(KEY_SEARCH_MODE, false);
+ mQuery = savedState.getString(KEY_SEARCH_QUERY, "");
+ }
+ }
+
+ public void saveInstance(Bundle outState) {
+ outState.putString(KEY_SEARCH_QUERY, mQuery);
+ outState.putBoolean(KEY_SEARCH_MODE, mSearchMode);
+ }
+
+ @Override
+ public int getId() {
+ return SEARCH_MENU_RES_ID;
+ }
+
+ @Override
+ public void setInitialState(Menu menu) {
+ super.setInitialState(menu);
+ final MenuItem search = menu.findItem(SEARCH_MENU_RES_ID);
+ final SearchView searchView = (SearchView) MenuItemCompat.getActionView(search);
+ searchView.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
+ searchView.setQuery(mQuery, false);
+ searchView.setOnCloseListener(mSearchModeChangeListener);
+ searchView.setOnSearchClickListener(mSearchModeChangeListener);
+ searchView.setOnQueryTextListener(mQueryListener);
+ if (mSearchMode) {
+ searchView.requestFocus();
+ searchView.setIconified(false);
+ }
+ }
+
+ @Override
+ public void showMenuItem(Menu menu) {
+ menu.findItem(SEARCH_MENU_RES_ID).setVisible(true);
+ }
+
+ @Override
+ public boolean handleMenuItemClick(MenuItem item) {
+ // The search view is handled by {@link #mSearchListener}. Skip handling here.
+ return false;
+ }
+
+ public String getQueryText() {
+ return mQuery;
+ }
+
+ public void setQueryText(String query) {
+ mQuery = query;
+ }
+
+ /**
+ * Listener for user actions on search view.
+ */
+ private final class SearchModeChangeListener implements View.OnClickListener,
+ SearchView.OnCloseListener {
+ @Override
+ public void onClick(View v) {
+ mSearchMode = true;
+ }
+
+ @Override
+ public boolean onClose() {
+ mSearchMode = false;
+ return false;
+ }
+ }
+}
diff --git a/src/com/android/deskclock/actionbarmenu/SettingMenuItemController.java b/src/com/android/deskclock/actionbarmenu/SettingMenuItemController.java
new file mode 100644
index 0000000..a984451
--- /dev/null
+++ b/src/com/android/deskclock/actionbarmenu/SettingMenuItemController.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 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.actionbarmenu;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import com.android.deskclock.R;
+import com.android.deskclock.settings.SettingsActivity;
+
+/**
+ * {@link MenuItemController} for setting menu.
+ */
+public final class SettingMenuItemController extends AbstractMenuItemController {
+
+ public static final int REQUEST_CHANGE_SETTINGS = 1;
+
+ private static final int SETTING_MENU_RES_ID = R.id.menu_item_settings;
+ private final Activity mActivity;
+
+ public SettingMenuItemController(Activity activity) {
+ mActivity = activity;
+ }
+
+ @Override
+ public int getId() {
+ return SETTING_MENU_RES_ID;
+ }
+
+ @Override
+ public void showMenuItem(Menu menu) {
+ menu.findItem(SETTING_MENU_RES_ID).setVisible(true);
+ }
+
+ @Override
+ public boolean handleMenuItemClick(MenuItem item) {
+ Intent settingIntent = new Intent(mActivity, SettingsActivity.class);
+ mActivity.startActivityForResult(settingIntent, REQUEST_CHANGE_SETTINGS);
+ return true;
+ }
+}
diff --git a/src/com/android/deskclock/alarms/AlarmActivity.java b/src/com/android/deskclock/alarms/AlarmActivity.java
index 0efb7a5..7335885 100644
--- a/src/com/android/deskclock/alarms/AlarmActivity.java
+++ b/src/com/android/deskclock/alarms/AlarmActivity.java
@@ -22,7 +22,6 @@
import android.animation.PropertyValuesHolder;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
-import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -33,7 +32,6 @@
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
-import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -55,10 +53,10 @@
import com.android.deskclock.AnimatorUtils;
import com.android.deskclock.LogUtils;
import com.android.deskclock.R;
-import com.android.deskclock.SettingsActivity;
import com.android.deskclock.Utils;
import com.android.deskclock.events.Events;
import com.android.deskclock.provider.AlarmInstance;
+import com.android.deskclock.settings.SettingsActivity;
import com.android.deskclock.widget.CircleView;
public class AlarmActivity extends AppCompatActivity
@@ -166,7 +164,7 @@
// Get the volume/camera button behavior setting
mVolumeBehavior = Utils.getDefaultSharedPreferences(this)
- .getString(SettingsActivity.KEY_VOLUME_BEHAVIOR,
+ .getString(SettingsActivity.KEY_VOLUME_BUTTONS,
SettingsActivity.DEFAULT_VOLUME_BEHAVIOR);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
@@ -210,8 +208,7 @@
final CircleView pulseView = (CircleView) mContentView.findViewById(R.id.pulse);
titleView.setText(mAlarmInstance.getLabelOrDefault(this));
- Utils.setTimeFormat(this, digitalClock,
- getResources().getDimensionPixelSize(R.dimen.main_ampm_font_size));
+ Utils.setTimeFormat(this, digitalClock);
mCurrentHourColor = Utils.getCurrentHourColor();
getWindow().setBackgroundDrawable(new ColorDrawable(mCurrentHourColor));
@@ -234,15 +231,6 @@
}
@Override
- protected void onStart() {
- super.onStart();
-
- // Bind to AlarmService
- bindService(new Intent(this, AlarmService.class), mConnection, Context.BIND_AUTO_CREATE);
- mServiceBound = true;
- }
-
- @Override
protected void onResume() {
super.onResume();
@@ -272,6 +260,8 @@
mReceiverRegistered = true;
}
+ bindAlarmService();
+
resetAnimations();
}
@@ -415,13 +405,10 @@
return true;
}
- @TargetApi(Build.VERSION_CODES.KITKAT)
private void hideNavigationBar() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
- | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
- }
+ getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
private void hintSnooze() {
@@ -476,7 +463,7 @@
AlarmStateManager.setSnoozeState(this, mAlarmInstance, false /* showToast */);
- Events.sendAlarmEvent(R.string.action_dismiss, R.string.label_deskclock);
+ Events.sendAlarmEvent(R.string.action_snooze, R.string.label_deskclock);
// Unbind here, otherwise alarm will keep ringing until activity finishes.
unbindAlarmService();
@@ -495,7 +482,7 @@
getString(R.string.alarm_alert_off_text) /* accessibilityText */,
Color.WHITE, mCurrentHourColor).start();
- AlarmStateManager.setDismissState(this, mAlarmInstance);
+ AlarmStateManager.deleteInstanceAndUpdateParent(this, mAlarmInstance);
Events.sendAlarmEvent(R.string.action_dismiss, R.string.label_deskclock);
@@ -504,6 +491,17 @@
}
/**
+ * Bind AlarmService if not yet bound.
+ */
+ private void bindAlarmService() {
+ if (!mServiceBound) {
+ final Intent intent = new Intent(this, AlarmService.class);
+ bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
+ mServiceBound = true;
+ }
+ }
+
+ /**
* Unbind AlarmService if bound.
*/
private void unbindAlarmService() {
diff --git a/src/com/android/deskclock/alarms/AlarmKlaxon.java b/src/com/android/deskclock/alarms/AlarmKlaxon.java
index c286f45..971c5e9 100644
--- a/src/com/android/deskclock/alarms/AlarmKlaxon.java
+++ b/src/com/android/deskclock/alarms/AlarmKlaxon.java
@@ -16,6 +16,7 @@
package com.android.deskclock.alarms;
+import android.annotation.TargetApi;
import android.content.Context;
import android.media.AudioAttributes;
import android.os.Build;
@@ -23,7 +24,9 @@
import com.android.deskclock.AsyncRingtonePlayer;
import com.android.deskclock.LogUtils;
+import com.android.deskclock.Utils;
import com.android.deskclock.provider.AlarmInstance;
+import com.android.deskclock.settings.SettingsActivity;
/**
* Manages playing ringtone and vibrating the device.
@@ -37,9 +40,8 @@
private AlarmKlaxon() {}
public static void stop(Context context) {
- LogUtils.v("AlarmKlaxon.stop()");
-
if (sStarted) {
+ LogUtils.v("AlarmKlaxon.stop()");
sStarted = false;
getAsyncRingtonePlayer(context).stop();
((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE)).cancel();
@@ -47,9 +49,9 @@
}
public static void start(Context context, AlarmInstance instance) {
- LogUtils.v("AlarmKlaxon.start()");
// Make sure we are stopped before starting
stop(context);
+ LogUtils.v("AlarmKlaxon.start()");
if (!AlarmInstance.NO_RINGTONE_URI.equals(instance.mRingtone)) {
getAsyncRingtonePlayer(context).play(instance.mRingtone);
@@ -57,11 +59,8 @@
if (instance.mVibrate) {
final Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- vibrator.vibrate(sVibratePattern, 0, new AudioAttributes.Builder()
- .setUsage(AudioAttributes.USAGE_ALARM)
- .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
- .build());
+ if (Utils.isLOrLater()) {
+ vibrateLOrLater(vibrator);
} else {
vibrator.vibrate(sVibratePattern, 0);
}
@@ -70,9 +69,18 @@
sStarted = true;
}
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ private static void vibrateLOrLater(Vibrator vibrator) {
+ vibrator.vibrate(sVibratePattern, 0, new AudioAttributes.Builder()
+ .setUsage(AudioAttributes.USAGE_ALARM)
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .build());
+ }
+
private static synchronized AsyncRingtonePlayer getAsyncRingtonePlayer(Context context) {
if (sAsyncRingtonePlayer == null) {
- sAsyncRingtonePlayer = new AsyncRingtonePlayer(context.getApplicationContext());
+ sAsyncRingtonePlayer = new AsyncRingtonePlayer(context.getApplicationContext(),
+ SettingsActivity.KEY_ALARM_CRESCENDO);
}
return sAsyncRingtonePlayer;
diff --git a/src/com/android/deskclock/alarms/AlarmNotifications.java b/src/com/android/deskclock/alarms/AlarmNotifications.java
index 995af1d..3fff8e3 100644
--- a/src/com/android/deskclock/alarms/AlarmNotifications.java
+++ b/src/com/android/deskclock/alarms/AlarmNotifications.java
@@ -16,6 +16,7 @@
package com.android.deskclock.alarms;
import android.app.PendingIntent;
+import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -35,12 +36,12 @@
public static void showLowPriorityNotification(Context context, AlarmInstance instance) {
LogUtils.v("Displaying low priority notification for alarm instance: " + instance.mId);
- NotificationManagerCompat nm = NotificationManagerCompat.from(context);
NotificationCompat.Builder notification = new NotificationCompat.Builder(context)
.setContentTitle(context.getString(
R.string.alarm_alert_predismiss_title))
- .setContentText(AlarmUtils.getAlarmText(context, instance))
+ .setContentText(AlarmUtils.getAlarmText(context, instance,
+ true /* includeLabel */))
.setSmallIcon(R.drawable.stat_notify_alarm)
.setAutoCancel(false)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
@@ -52,7 +53,7 @@
Intent hideIntent = AlarmStateManager.createStateChangeIntent(context,
AlarmStateManager.ALARM_DELETE_TAG, instance,
AlarmInstance.HIDE_NOTIFICATION_STATE);
- notification.setDeleteIntent(PendingIntent.getBroadcast(context, instance.hashCode(),
+ notification.setDeleteIntent(PendingIntent.getService(context, instance.hashCode(),
hideIntent, PendingIntent.FLAG_UPDATE_CURRENT));
// Setup up dismiss action
@@ -60,7 +61,7 @@
AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.PREDISMISSED_STATE);
notification.addAction(R.drawable.ic_alarm_off_24dp,
context.getString(R.string.alarm_alert_dismiss_now_text),
- PendingIntent.getBroadcast(context, instance.hashCode(),
+ PendingIntent.getService(context, instance.hashCode(),
dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
// Setup content action if instance is owned by alarm
@@ -68,17 +69,17 @@
notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
- nm.cancel(instance.hashCode());
+ NotificationManagerCompat nm = NotificationManagerCompat.from(context);
nm.notify(instance.hashCode(), notification.build());
}
public static void showHighPriorityNotification(Context context, AlarmInstance instance) {
LogUtils.v("Displaying high priority notification for alarm instance: " + instance.mId);
- NotificationManagerCompat nm = NotificationManagerCompat.from(context);
NotificationCompat.Builder notification = new NotificationCompat.Builder(context)
.setContentTitle(context.getString(R.string.alarm_alert_predismiss_title))
- .setContentText(AlarmUtils.getAlarmText(context, instance))
+ .setContentText(AlarmUtils.getAlarmText(context, instance,
+ true /* includeLabel */))
.setSmallIcon(R.drawable.stat_notify_alarm)
.setAutoCancel(false)
.setOngoing(true)
@@ -94,7 +95,7 @@
AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.PREDISMISSED_STATE);
notification.addAction(R.drawable.ic_alarm_off_24dp,
context.getString(R.string.alarm_alert_dismiss_now_text),
- PendingIntent.getBroadcast(context, instance.hashCode(),
+ PendingIntent.getService(context, instance.hashCode(),
dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
// Setup content action if instance is owned by alarm
@@ -102,13 +103,12 @@
notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
- nm.cancel(instance.hashCode());
+ NotificationManagerCompat nm = NotificationManagerCompat.from(context);
nm.notify(instance.hashCode(), notification.build());
}
public static void showSnoozeNotification(Context context, AlarmInstance instance) {
LogUtils.v("Displaying snoozed notification for alarm instance: " + instance.mId);
- NotificationManagerCompat nm = NotificationManagerCompat.from(context);
NotificationCompat.Builder notification = new NotificationCompat.Builder(context)
.setContentTitle(instance.getLabelOrDefault(context))
@@ -127,20 +127,20 @@
AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.DISMISSED_STATE);
notification.addAction(R.drawable.ic_alarm_off_24dp,
context.getString(R.string.alarm_alert_dismiss_text),
- PendingIntent.getBroadcast(context, instance.hashCode(),
+ PendingIntent.getService(context, instance.hashCode(),
dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
// Setup content action if instance is owned by alarm
Intent viewAlarmIntent = createViewAlarmIntent(context, instance);
notification.setContentIntent(PendingIntent.getActivity(context, instance.hashCode(),
viewAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT));
- nm.cancel(instance.hashCode());
+
+ NotificationManagerCompat nm = NotificationManagerCompat.from(context);
nm.notify(instance.hashCode(), notification.build());
}
public static void showMissedNotification(Context context, AlarmInstance instance) {
LogUtils.v("Displaying missed notification for alarm instance: " + instance.mId);
- NotificationManagerCompat nm = NotificationManagerCompat.from(context);
String label = instance.mLabel;
String alarmTime = AlarmUtils.getFormattedTime(context, instance.getAlarmTime());
@@ -159,7 +159,7 @@
// Setup dismiss intent
Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context,
AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.DISMISSED_STATE);
- notification.setDeleteIntent(PendingIntent.getBroadcast(context, hashCode,
+ notification.setDeleteIntent(PendingIntent.getService(context, hashCode,
dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT));
// Setup content intent
@@ -170,18 +170,17 @@
notification.setContentIntent(PendingIntent.getBroadcast(context, hashCode,
showAndDismiss, PendingIntent.FLAG_UPDATE_CURRENT));
- nm.cancel(hashCode);
+ NotificationManagerCompat nm = NotificationManagerCompat.from(context);
nm.notify(hashCode, notification.build());
}
- public static void showAlarmNotification(Context context, AlarmInstance instance) {
+ public static void showAlarmNotification(Service service, AlarmInstance instance) {
LogUtils.v("Displaying alarm notification for alarm instance: " + instance.mId);
- NotificationManagerCompat nm = NotificationManagerCompat.from(context);
- Resources resources = context.getResources();
- NotificationCompat.Builder notification = new NotificationCompat.Builder(context)
- .setContentTitle(instance.getLabelOrDefault(context))
- .setContentText(AlarmUtils.getFormattedTime(context, instance.getAlarmTime()))
+ Resources resources = service.getResources();
+ NotificationCompat.Builder notification = new NotificationCompat.Builder(service)
+ .setContentTitle(instance.getLabelOrDefault(service))
+ .setContentText(AlarmUtils.getFormattedTime(service, instance.getAlarmTime()))
.setSmallIcon(R.drawable.stat_notify_alarm)
.setOngoing(true)
.setAutoCancel(false)
@@ -192,44 +191,44 @@
.setLocalOnly(true);
// Setup Snooze Action
- Intent snoozeIntent = AlarmStateManager.createStateChangeIntent(context,
+ Intent snoozeIntent = AlarmStateManager.createStateChangeIntent(service,
AlarmStateManager.ALARM_SNOOZE_TAG, instance, AlarmInstance.SNOOZE_STATE);
snoozeIntent.putExtra(AlarmStateManager.FROM_NOTIFICATION_EXTRA, true);
- PendingIntent snoozePendingIntent = PendingIntent.getBroadcast(context, instance.hashCode(),
+ PendingIntent snoozePendingIntent = PendingIntent.getService(service, instance.hashCode(),
snoozeIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
notification.addAction(R.drawable.ic_snooze_24dp,
resources.getString(R.string.alarm_alert_snooze_text), snoozePendingIntent);
// Setup Dismiss Action
- Intent dismissIntent = AlarmStateManager.createStateChangeIntent(context,
+ Intent dismissIntent = AlarmStateManager.createStateChangeIntent(service,
AlarmStateManager.ALARM_DISMISS_TAG, instance, AlarmInstance.DISMISSED_STATE);
dismissIntent.putExtra(AlarmStateManager.FROM_NOTIFICATION_EXTRA, true);
- PendingIntent dismissPendingIntent = PendingIntent.getBroadcast(context,
+ PendingIntent dismissPendingIntent = PendingIntent.getService(service,
instance.hashCode(), dismissIntent, PendingIntent.FLAG_UPDATE_CURRENT);
notification.addAction(R.drawable.ic_alarm_off_24dp,
resources.getString(R.string.alarm_alert_dismiss_text),
dismissPendingIntent);
// Setup Content Action
- Intent contentIntent = AlarmInstance.createIntent(context, AlarmActivity.class,
+ Intent contentIntent = AlarmInstance.createIntent(service, AlarmActivity.class,
instance.mId);
- notification.setContentIntent(PendingIntent.getActivity(context,
+ notification.setContentIntent(PendingIntent.getActivity(service,
instance.hashCode(), contentIntent, PendingIntent.FLAG_UPDATE_CURRENT));
// Setup fullscreen intent
- Intent fullScreenIntent = AlarmInstance.createIntent(context, AlarmActivity.class,
+ Intent fullScreenIntent = AlarmInstance.createIntent(service, AlarmActivity.class,
instance.mId);
// set action, so we can be different then content pending intent
fullScreenIntent.setAction("fullscreen_activity");
fullScreenIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_NO_USER_ACTION);
- notification.setFullScreenIntent(PendingIntent.getActivity(context,
+ notification.setFullScreenIntent(PendingIntent.getActivity(service,
instance.hashCode(), fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT), true);
notification.setPriority(NotificationCompat.PRIORITY_MAX);
- nm.cancel(instance.hashCode());
- nm.notify(instance.hashCode(), notification.build());
+ clearNotification(service, instance);
+ service.startForeground(instance.hashCode(), notification.build());
}
public static void clearNotification(Context context, AlarmInstance instance) {
@@ -238,6 +237,28 @@
nm.cancel(instance.hashCode());
}
+ /**
+ * Updates the notification for an existing alarm. Use if the label has changed.
+ */
+ public static void updateNotification(Context context, AlarmInstance instance) {
+ switch (instance.mAlarmState) {
+ case AlarmInstance.LOW_NOTIFICATION_STATE:
+ showLowPriorityNotification(context, instance);
+ break;
+ case AlarmInstance.HIGH_NOTIFICATION_STATE:
+ showHighPriorityNotification(context, instance);
+ break;
+ case AlarmInstance.SNOOZE_STATE:
+ showSnoozeNotification(context, instance);
+ break;
+ case AlarmInstance.MISSED_STATE:
+ showMissedNotification(context, instance);
+ break;
+ default:
+ LogUtils.d("No notification to update");
+ }
+ }
+
public static Intent createViewAlarmIntent(Context context, AlarmInstance instance) {
long alarmId = instance.mAlarmId == null ? Alarm.INVALID_ID : instance.mAlarmId;
Intent viewAlarmIntent = Alarm.createIntent(context, DeskClock.class, alarmId);
diff --git a/src/com/android/deskclock/alarms/AlarmService.java b/src/com/android/deskclock/alarms/AlarmService.java
index 1e0c887..cd1bec4 100644
--- a/src/com/android/deskclock/alarms/AlarmService.java
+++ b/src/com/android/deskclock/alarms/AlarmService.java
@@ -59,9 +59,6 @@
/** A public action sent by AlarmService when the alarm has stopped for any reason. */
public static final String ALARM_DONE_ACTION = "com.android.deskclock.ALARM_DONE";
- /** Private action used to start an alarm with this service. */
- public static final String START_ALARM_ACTION = "START_ALARM";
-
/** Private action used to stop an alarm with this service. */
public static final String STOP_ALARM_ACTION = "STOP_ALARM";
@@ -87,22 +84,6 @@
}
/**
- * Utility method to help start alarm properly. If alarm is already firing, it
- * will mark it as missed and start the new one.
- *
- * @param context application context
- * @param instance to trigger alarm
- */
- public static void startAlarm(Context context, AlarmInstance instance) {
- final Intent intent = AlarmInstance.createIntent(context, AlarmService.class, instance.mId)
- .setAction(START_ALARM_ACTION);
-
- // Maintain a cpu wake lock until the service can get it
- AlarmAlertWakeLock.acquireCpuWakeLock(context);
- context.startService(intent);
- }
-
- /**
* Utility method to help stop an alarm properly. Nothing will happen, if alarm is not firing
* or using a different instance.
*
@@ -129,7 +110,7 @@
// 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) {
- sendBroadcast(AlarmStateManager.createStateChangeIntent(AlarmService.this,
+ startService(AlarmStateManager.createStateChangeIntent(AlarmService.this,
"AlarmService", mCurrentAlarm, AlarmInstance.MISSED_STATE));
}
}
@@ -144,8 +125,6 @@
AlarmAlertWakeLock.acquireCpuWakeLock(this);
- Events.sendEvent(R.string.category_alarm, R.string.action_fire, 0);
-
mCurrentAlarm = instance;
AlarmNotifications.showAlarmNotification(this, mCurrentAlarm);
mInitialCallState = mTelephonyManager.getCallState();
@@ -160,11 +139,23 @@
return;
}
- LogUtils.v("AlarmService.stop with instance: %s", (Object) mCurrentAlarm.mId);
+ final long instanceId = mCurrentAlarm.mId;
+ LogUtils.v("AlarmService.stop with instance: %s", instanceId);
+
AlarmKlaxon.stop(this);
mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
sendBroadcast(new Intent(ALARM_DONE_ACTION));
+ // Since we use the same id for all notifications, the system has no way to distinguish the
+ // firing notification we were bound to from other subsequent notifications posted for the
+ // same AlarmInstance (e.g. after snoozing). We workaround the issue by forcing removal of
+ // the notification and re-posting it.
+ stopForeground(true /* removeNotification */);
+ mCurrentAlarm = AlarmInstance.getInstance(getContentResolver(), instanceId);
+ if (mCurrentAlarm != null) {
+ AlarmNotifications.updateNotification(this, mCurrentAlarm);
+ }
+
mCurrentAlarm = null;
AlarmAlertWakeLock.releaseCpuLock();
}
@@ -194,7 +185,7 @@
break;
case ALARM_DISMISS_ACTION:
// Set the alarm state to dismissed.
- AlarmStateManager.setDismissState(context, mCurrentAlarm);
+ AlarmStateManager.deleteInstanceAndUpdateParent(context, mCurrentAlarm);
Events.sendAlarmEvent(R.string.action_dismiss, R.string.label_intent);
break;
}
@@ -219,23 +210,29 @@
final long instanceId = AlarmInstance.getId(intent.getData());
switch (intent.getAction()) {
- case START_ALARM_ACTION:
- final ContentResolver cr = this.getContentResolver();
- final AlarmInstance instance = AlarmInstance.getInstance(cr, instanceId);
- if (instance == null) {
- LogUtils.e("No instance found to start alarm: %d", instanceId);
- if (mCurrentAlarm != null) {
- // Only release lock if we are not firing alarm
- AlarmAlertWakeLock.releaseCpuLock();
- }
- break;
- }
+ case AlarmStateManager.CHANGE_STATE_ACTION:
+ AlarmStateManager.handleIntent(this, intent);
- if (mCurrentAlarm != null && mCurrentAlarm.mId == instanceId) {
- LogUtils.e("Alarm already started for instance: %d", instanceId);
- break;
+ // If state is changed to firing, actually fire the alarm!
+ final int alarmState = intent.getIntExtra(AlarmStateManager.ALARM_STATE_EXTRA, -1);
+ if (alarmState == AlarmInstance.FIRED_STATE) {
+ final ContentResolver cr = this.getContentResolver();
+ final AlarmInstance instance = AlarmInstance.getInstance(cr, instanceId);
+ if (instance == null) {
+ LogUtils.e("No instance found to start alarm: %d", instanceId);
+ if (mCurrentAlarm != null) {
+ // Only release lock if we are not firing alarm
+ AlarmAlertWakeLock.releaseCpuLock();
+ }
+ break;
+ }
+
+ if (mCurrentAlarm != null && mCurrentAlarm.mId == instanceId) {
+ LogUtils.e("Alarm already started for instance: %d", instanceId);
+ break;
+ }
+ startAlarm(instance);
}
- startAlarm(instance);
break;
case STOP_ALARM_ACTION:
if (mCurrentAlarm != null && mCurrentAlarm.mId != instanceId) {
diff --git a/src/com/android/deskclock/alarms/AlarmStateManager.java b/src/com/android/deskclock/alarms/AlarmStateManager.java
index 3b87eba..827c2c1 100644
--- a/src/com/android/deskclock/alarms/AlarmStateManager.java
+++ b/src/com/android/deskclock/alarms/AlarmStateManager.java
@@ -29,8 +29,8 @@
import android.os.PowerManager;
import android.preference.PreferenceManager;
import android.provider.Settings;
-import android.text.format.DateFormat;
import android.support.v4.app.NotificationManagerCompat;
+import android.text.format.DateFormat;
import android.widget.Toast;
import com.android.deskclock.AlarmAlertWakeLock;
@@ -40,11 +40,11 @@
import com.android.deskclock.DeskClock;
import com.android.deskclock.LogUtils;
import com.android.deskclock.R;
-import com.android.deskclock.SettingsActivity;
import com.android.deskclock.Utils;
import com.android.deskclock.events.Events;
import com.android.deskclock.provider.Alarm;
import com.android.deskclock.provider.AlarmInstance;
+import com.android.deskclock.settings.SettingsActivity;
import java.util.Calendar;
import java.util.List;
@@ -158,12 +158,12 @@
}
public static int getGlobalIntentId(Context context) {
- final SharedPreferences prefs = Utils.getDefaultSharedPreferences(context);
+ SharedPreferences prefs = Utils.getDefaultSharedPreferences(context);
return prefs.getInt(ALARM_GLOBAL_ID_EXTRA, -1);
}
public static void updateGlobalIntentId(Context context) {
- final SharedPreferences prefs = Utils.getDefaultSharedPreferences(context);
+ SharedPreferences prefs = Utils.getDefaultSharedPreferences(context);
int globalId = prefs.getInt(ALARM_GLOBAL_ID_EXTRA, -1) + 1;
prefs.edit().putInt(ALARM_GLOBAL_ID_EXTRA, globalId).commit();
}
@@ -177,7 +177,7 @@
public static void updateNextAlarm(Context context) {
final AlarmInstance nextAlarm = getNextFiringAlarm(context);
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+ if (Utils.isPreL()) {
updateNextAlarmInSystemSettings(context, nextAlarm);
} else {
updateNextAlarmInAlarmManager(context, nextAlarm);
@@ -303,7 +303,13 @@
*/
public static Intent createStateChangeIntent(Context context, String tag,
AlarmInstance instance, Integer state) {
- Intent intent = AlarmInstance.createIntent(context, AlarmStateManager.class, instance.mId);
+ // This intent is directed to AlarmService, though the actual handling of it occurs here
+ // in AlarmStateManager. The reason is that evidence exists showing the jump between the
+ // broadcast receiver (AlarmStateManager) and service (AlarmService) can be thwarted by the
+ // Out Of Memory killer. If clock is killed during that jump, firing an alarm can fail to
+ // occur. To be safer, the call begins in AlarmService, which has the power to display the
+ // firing alarm if needed, so no jump is needed.
+ Intent intent = AlarmInstance.createIntent(context, AlarmService.class, instance.mId);
intent.setAction(CHANGE_STATE_ACTION);
intent.addCategory(tag);
intent.putExtra(ALARM_GLOBAL_ID_EXTRA, getGlobalIntentId(context));
@@ -346,7 +352,7 @@
* @param instance to set state to
*/
public static void setSilentState(Context context, AlarmInstance instance) {
- LogUtils.v("Setting silent state to instance " + instance.mId);
+ LogUtils.i("Setting silent state to instance " + instance.mId);
// Update alarm in db
ContentResolver contentResolver = context.getContentResolver();
@@ -368,7 +374,7 @@
* @param instance to set state to
*/
public static void setLowNotificationState(Context context, AlarmInstance instance) {
- LogUtils.v("Setting low notification state to instance " + instance.mId);
+ LogUtils.i("Setting low notification state to instance " + instance.mId);
// Update alarm state in db
ContentResolver contentResolver = context.getContentResolver();
@@ -390,7 +396,7 @@
* @param instance to set state to
*/
public static void setHideNotificationState(Context context, AlarmInstance instance) {
- LogUtils.v("Setting hide notification state to instance " + instance.mId);
+ LogUtils.i("Setting hide notification state to instance " + instance.mId);
// Update alarm state in db
ContentResolver contentResolver = context.getContentResolver();
@@ -412,7 +418,7 @@
* @param instance to set state to
*/
public static void setHighNotificationState(Context context, AlarmInstance instance) {
- LogUtils.v("Setting high notification state to instance " + instance.mId);
+ LogUtils.i("Setting high notification state to instance " + instance.mId);
// Update alarm state in db
ContentResolver contentResolver = context.getContentResolver();
@@ -434,7 +440,7 @@
* @param instance to set state to
*/
public static void setFiredState(Context context, AlarmInstance instance) {
- LogUtils.v("Setting fire state to instance " + instance.mId);
+ LogUtils.i("Setting fire state to instance " + instance.mId);
// Update alarm state in db
ContentResolver contentResolver = context.getContentResolver();
@@ -444,11 +450,11 @@
if (instance.mAlarmId != null) {
// if the time changed *backward* and pushed an instance from missed back to fired,
// remove any other scheduled instances that may exist
- AlarmInstance.deleteOtherInstances(contentResolver, instance.mAlarmId, instance.mId);
+ AlarmInstance.deleteOtherInstances(context, contentResolver, instance.mAlarmId,
+ instance.mId);
}
- // Start the alarm and schedule timeout timer for it
- AlarmService.startAlarm(context, instance);
+ Events.sendAlarmEvent(R.string.action_fire, 0);
Calendar timeout = instance.getTimeout(context);
if (timeout != null) {
@@ -481,7 +487,7 @@
newAlarmTime.add(Calendar.MINUTE, snoozeMinutes);
// Update alarm state and new alarm time in db.
- LogUtils.v("Setting snoozed state to instance " + instance.mId + " for "
+ LogUtils.i("Setting snoozed state to instance " + instance.mId + " for "
+ AlarmUtils.getFormattedTime(context, newAlarmTime));
instance.setAlarmTime(newAlarmTime);
instance.mAlarmState = AlarmInstance.SNOOZE_STATE;
@@ -526,7 +532,7 @@
* @param instance to set state to
*/
public static void setMissedState(Context context, AlarmInstance instance) {
- LogUtils.v("Setting missed state to instance " + instance.mId);
+ LogUtils.i("Setting missed state to instance " + instance.mId);
// Stop alarm if this instance is firing it
AlarmService.stopAlarm(context, instance);
@@ -556,7 +562,7 @@
* @param instance
*/
public static void setPreDismissState(Context context, AlarmInstance instance) {
- LogUtils.v("Setting predismissed state to instance " + instance.mId);
+ LogUtils.i("Setting predismissed state to instance " + instance.mId);
// Update alarm in db
final ContentResolver contentResolver = context.getContentResolver();
@@ -576,18 +582,29 @@
updateParentAlarm(context, instance);
}
}
+
+ updateNextAlarm(context);
}
/**
- * This will set the alarm instance to the SILENT_STATE and update
- * the application notifications and schedule any state changes that need
- * to occur in the future.
+ * This just sets the alarm instance to DISMISSED_STATE.
+ */
+ public static void setDismissState(Context context, AlarmInstance instance) {
+ LogUtils.i("Setting dismissed state to instance " + instance.mId);
+ instance.mAlarmState = AlarmInstance.DISMISSED_STATE;
+ final ContentResolver contentResolver = context.getContentResolver();
+ AlarmInstance.updateInstance(contentResolver, instance);
+ }
+
+ /**
+ * This will delete the alarm instance, update the application notifications, and schedule
+ * any state changes that need to occur in the future.
*
* @param context application context
* @param instance to set state to
*/
- public static void setDismissState(Context context, AlarmInstance instance) {
- LogUtils.v("Setting dismissed state to instance " + instance.mId);
+ public static void deleteInstanceAndUpdateParent(Context context, AlarmInstance instance) {
+ LogUtils.i("Deleting instance " + instance.mId + " and updating parent alarm.");
// Remove all other timers and notifications associated to it
unregisterInstance(context, instance);
@@ -605,17 +622,19 @@
}
/**
- * This will not change the state of instance, but remove it's notifications and
+ * This will set the instance state to DISMISSED_STATE and remove its notifications and
* alarm timers.
*
* @param context application context
* @param instance to unregister
*/
public static void unregisterInstance(Context context, AlarmInstance instance) {
+ LogUtils.i("Unregistering instance " + instance.mId);
// Stop alarm if this instance is firing it
AlarmService.stopAlarm(context, instance);
AlarmNotifications.clearNotification(context, instance);
cancelScheduledInstanceStateChange(context, instance);
+ setDismissState(context, instance);
}
/**
@@ -657,7 +676,7 @@
if (instance.mAlarmState == AlarmInstance.DISMISSED_STATE) {
// This should never happen, but add a quick check here
LogUtils.e("Alarm Instance is dismissed, but never deleted");
- setDismissState(context, instance);
+ deleteInstanceAndUpdateParent(context, instance);
return;
} else if (instance.mAlarmState == AlarmInstance.FIRED_STATE) {
// Keep alarm firing, unless it should be timed out
@@ -669,9 +688,10 @@
} else if (instance.mAlarmState == AlarmInstance.MISSED_STATE) {
if (currentTime.before(alarmTime)) {
if (instance.mAlarmId == null) {
+ LogUtils.i("Cannot restore missed instance for one-time alarm");
// This instance parent got deleted (ie. deleteAfterUse), so
// we should not re-activate it.-
- setDismissState(context, instance);
+ deleteInstanceAndUpdateParent(context, instance);
return;
}
@@ -688,7 +708,7 @@
if (currentTime.before(alarmTime)) {
setPreDismissState(context, instance);
} else {
- setDismissState(context, instance);
+ deleteInstanceAndUpdateParent(context, instance);
}
return;
}
@@ -696,7 +716,7 @@
// Fix states that are time sensitive
if (currentTime.after(missedTTL)) {
// Alarm is so old, just dismiss it
- setDismissState(context, instance);
+ deleteInstanceAndUpdateParent(context, instance);
} else if (currentTime.after(alarmTime)) {
// There is a chance that the TIME_SET occurred right when the alarm should go off, so
// we need to add a check to see if we should fire the alarm instead of marking it
@@ -753,6 +773,23 @@
}
/**
+ * Delete and unregister all instances unless they are snoozed. This is used whenever an alarm
+ * is modified superficially (label, vibrate, or ringtone change).
+ */
+ public static void deleteNonSnoozeInstances(Context context, long alarmId) {
+ ContentResolver cr = context.getContentResolver();
+ List<AlarmInstance> instances = AlarmInstance.getInstancesByAlarmId(cr, alarmId);
+ for (AlarmInstance instance : instances) {
+ if (instance.mAlarmState == AlarmInstance.SNOOZE_STATE) {
+ continue;
+ }
+ unregisterInstance(context, instance);
+ AlarmInstance.deleteInstance(context.getContentResolver(), instance.mId);
+ }
+ updateNextAlarm(context);
+ }
+
+ /**
* Fix and update all alarm instance when a time change event occurs.
*
* @param context application context
@@ -763,6 +800,12 @@
final Calendar currentTime = getCurrentTime();
for (AlarmInstance instance : AlarmInstance.getInstances(contentResolver, null)) {
final Alarm alarm = Alarm.getAlarm(contentResolver, instance.mAlarmId);
+ if (alarm == null) {
+ unregisterInstance(context, instance);
+ AlarmInstance.deleteInstance(contentResolver, instance.mId);
+ LogUtils.e("Found instance without matching alarm; deleting instance %s", instance);
+ continue;
+ }
final Calendar priorAlarmTime = alarm.getPreviousAlarmTime(instance.getAlarmTime());
final Calendar missedTTLTime = instance.getMissedTimeToLive();
if (currentTime.before(priorAlarmTime) || currentTime.after(missedTTLTime)) {
@@ -775,12 +818,12 @@
// The time change is so dramatic the AlarmInstance doesn't make any sense;
// remove it and schedule the new appropriate instance.
- AlarmStateManager.setDismissState(context, instance);
+ AlarmStateManager.deleteInstanceAndUpdateParent(context, instance);
} else {
registerInstance(context, instance, false);
}
}
-
+
updateNextAlarm(context);
}
@@ -791,7 +834,7 @@
* @param instance to change state on
* @param state to change to
*/
- public void setAlarmState(Context context, AlarmInstance instance, int state) {
+ private static void setAlarmState(Context context, AlarmInstance instance, int state) {
if (instance == null) {
LogUtils.e("Null alarm instance while setting state to %d", state);
return;
@@ -822,7 +865,7 @@
setPreDismissState(context, instance);
break;
case AlarmInstance.DISMISSED_STATE:
- setDismissState(context, instance);
+ deleteInstanceAndUpdateParent(context, instance);
break;
default:
LogUtils.e("Trying to change to unknown alarm state: " + state);
@@ -848,7 +891,7 @@
});
}
- private void handleIntent(Context context, Intent intent) {
+ public static void handleIntent(Context context, Intent intent) {
final String action = intent.getAction();
LogUtils.v("AlarmStateManager received intent " + intent);
if (CHANGE_STATE_ACTION.equals(action)) {
@@ -856,7 +899,6 @@
AlarmInstance instance = AlarmInstance.getInstance(context.getContentResolver(),
AlarmInstance.getId(uri));
if (instance == null) {
- // Not a big deal, but it shouldn't happen
LogUtils.e("Can not change state for unknown instance: " + uri);
return;
}
@@ -909,7 +951,7 @@
viewAlarmIntent.putExtra(AlarmClockFragment.SCROLL_TO_ALARM_INTENT_EXTRA, alarmId);
viewAlarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(viewAlarmIntent);
- setDismissState(context, instance);
+ deleteInstanceAndUpdateParent(context, instance);
}
}
@@ -956,15 +998,11 @@
createStateChangeIntent(context, ALARM_MANAGER_TAG, instance, newState);
// Treat alarm state change as high priority, use foreground broadcasts
stateChangeIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- PendingIntent pendingIntent = PendingIntent.getBroadcast(context, instance.hashCode(),
+ PendingIntent pendingIntent = PendingIntent.getService(context, instance.hashCode(),
stateChangeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
final AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- if (Utils.isKitKatOrLater()) {
- am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
- } else {
- am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
- }
+ am.setExact(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
}
@Override
@@ -972,7 +1010,7 @@
LogUtils.v("Canceling instance " + instance.mId + " timers");
// Create a PendingIntent that will match any one set for this instance
- PendingIntent pendingIntent = PendingIntent.getBroadcast(context, instance.hashCode(),
+ PendingIntent pendingIntent = PendingIntent.getService(context, instance.hashCode(),
createStateChangeIntent(context, ALARM_MANAGER_TAG, instance, null),
PendingIntent.FLAG_NO_CREATE);
diff --git a/src/com/android/deskclock/alarms/AlarmTimeClickHandler.java b/src/com/android/deskclock/alarms/AlarmTimeClickHandler.java
new file mode 100644
index 0000000..5249003
--- /dev/null
+++ b/src/com/android/deskclock/alarms/AlarmTimeClickHandler.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2015 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.alarms;
+
+import android.app.Fragment;
+import android.app.FragmentTransaction;
+import android.content.Context;
+import android.content.Intent;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Vibrator;
+import android.text.format.DateFormat;
+
+import com.android.deskclock.LabelDialogFragment;
+import com.android.deskclock.LogUtils;
+import com.android.deskclock.R;
+import com.android.deskclock.alarms.utils.DayOrderUtils;
+import com.android.deskclock.provider.Alarm;
+import com.android.deskclock.provider.AlarmInstance;
+
+import java.util.Calendar;
+
+/**
+ * Click handler for an alarm time item.
+ */
+public final class AlarmTimeClickHandler {
+
+ private static final String TAG = "AlarmTimeClickHandler";
+ private static final String KEY_PREVIOUS_DAY_MAP = "previousDayMap";
+
+ private final Fragment mFragment;
+ private final AlarmUpdateHandler mAlarmUpdateHandler;
+ private final ScrollHandler mScrollHandler;
+
+ private Alarm mSelectedAlarm;
+ private Bundle mPreviousDaysOfWeekMap;
+ private int[] mDayOrder;
+
+ public AlarmTimeClickHandler(Fragment fragment, Bundle savedState,
+ AlarmUpdateHandler alarmUpdateHandler, ScrollHandler smoothScrollController) {
+ mFragment = fragment;
+ mAlarmUpdateHandler = alarmUpdateHandler;
+ mScrollHandler = smoothScrollController;
+ if (savedState != null) {
+ mPreviousDaysOfWeekMap = savedState.getBundle(KEY_PREVIOUS_DAY_MAP);
+ }
+ if (mPreviousDaysOfWeekMap == null) {
+ mPreviousDaysOfWeekMap = new Bundle();
+ }
+ mDayOrder = DayOrderUtils.getDayOrder(fragment.getActivity());
+ }
+
+ public Alarm getSelectedAlarm() {
+ return mSelectedAlarm;
+ }
+
+ public void clearSelectedAlarm() {
+ mSelectedAlarm = null;
+ }
+
+ public void saveInstance(Bundle outState) {
+ outState.putBundle(KEY_PREVIOUS_DAY_MAP, mPreviousDaysOfWeekMap);
+ }
+
+ public void setAlarmEnabled(Alarm alarm, boolean newState) {
+ if (newState != alarm.enabled) {
+ alarm.enabled = newState;
+ mAlarmUpdateHandler.asyncUpdateAlarm(alarm, alarm.enabled, false);
+ LogUtils.d(TAG, "Updating alarm enabled state to " + newState);
+ }
+ }
+
+ public void setAlarmVibrationEnabled(Alarm alarm, boolean newState) {
+ if (newState != alarm.vibrate) {
+ alarm.vibrate = newState;
+ mAlarmUpdateHandler.asyncUpdateAlarm(alarm, false, true);
+ LogUtils.d(TAG, "Updating vibrate state to " + newState);
+
+ if (newState) {
+ // Buzz the vibrator to preview the alarm firing behavior.
+ final Context context = mFragment.getActivity();
+ final Vibrator v = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
+ if (v.hasVibrator()) {
+ v.vibrate(300);
+ }
+ }
+ }
+ }
+
+ public void setAlarmRepeatEnabled(Alarm alarm, boolean isEnabled) {
+ final Calendar now = Calendar.getInstance();
+ final Calendar oldNextAlarmTime = alarm.getNextAlarmTime(now);
+ final String alarmId = String.valueOf(alarm.id);
+ if (isEnabled) {
+ // Set all previously set days
+ // or
+ // Set all days if no previous.
+ final int bitSet = mPreviousDaysOfWeekMap.getInt(alarmId);
+ alarm.daysOfWeek.setBitSet(bitSet);
+ if (!alarm.daysOfWeek.isRepeating()) {
+ alarm.daysOfWeek.setDaysOfWeek(true, mDayOrder);
+ }
+ } else {
+ // Remember the set days in case the user wants it back.
+ final int bitSet = alarm.daysOfWeek.getBitSet();
+ mPreviousDaysOfWeekMap.putInt(alarmId, bitSet);
+
+ // Remove all repeat days
+ alarm.daysOfWeek.clearAllDays();
+ }
+
+ // if the change altered the next scheduled alarm time, tell the user
+ final Calendar newNextAlarmTime = alarm.getNextAlarmTime(now);
+ final boolean popupToast = !oldNextAlarmTime.equals(newNextAlarmTime);
+
+ mAlarmUpdateHandler.asyncUpdateAlarm(alarm, popupToast, false);
+ }
+
+ public void setDayOfWeekEnabled(Alarm alarm, boolean checked, int index) {
+ final Calendar now = Calendar.getInstance();
+ final Calendar oldNextAlarmTime = alarm.getNextAlarmTime(now);
+ alarm.daysOfWeek.setDaysOfWeek(checked, mDayOrder[index]);
+ // if the change altered the next scheduled alarm time, tell the user
+ final Calendar newNextAlarmTime = alarm.getNextAlarmTime(now);
+ final boolean popupToast = !oldNextAlarmTime.equals(newNextAlarmTime);
+ mAlarmUpdateHandler.asyncUpdateAlarm(alarm, popupToast, false);
+ }
+
+ public void onDeleteClicked(Alarm alarm) {
+ mAlarmUpdateHandler.asyncDeleteAlarm(alarm);
+ LogUtils.d(TAG, "Deleting alarm.");
+ }
+
+ public void onClockClicked(Alarm alarm) {
+ mSelectedAlarm = alarm;
+ TimePickerCompat.showTimeEditDialog(mFragment, alarm,
+ DateFormat.is24HourFormat(mFragment.getActivity()));
+ }
+
+ public void dismissAlarmInstance(AlarmInstance alarmInstance) {
+ final Context context = mFragment.getActivity().getApplicationContext();
+ final Intent dismissIntent = AlarmStateManager.createStateChangeIntent(
+ context, AlarmStateManager.ALARM_DISMISS_TAG, alarmInstance,
+ AlarmInstance.PREDISMISSED_STATE);
+ context.startService(dismissIntent);
+ mAlarmUpdateHandler.showPredismissToast(alarmInstance);
+ }
+
+ public void onRingtoneClicked(Alarm alarm) {
+ mSelectedAlarm = alarm;
+ final Uri oldRingtone = Alarm.NO_RINGTONE_URI.equals(alarm.alert) ? null : alarm.alert;
+ final Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
+ intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, oldRingtone);
+ intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM);
+ intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false);
+ LogUtils.d(TAG, "Showing ringtone picker.");
+ mFragment.startActivityForResult(intent, R.id.request_code_ringtone);
+ }
+
+ public void onEditLabelClicked(Alarm alarm) {
+ final FragmentTransaction ft = mFragment.getFragmentManager().beginTransaction();
+ final Fragment prev = mFragment.getFragmentManager().findFragmentByTag("label_dialog");
+ if (prev != null) {
+ ft.remove(prev);
+ }
+ ft.addToBackStack(null);
+
+ // Create and show the dialog.
+ final LabelDialogFragment newFragment =
+ LabelDialogFragment.newInstance(alarm, alarm.label, mFragment.getTag());
+ newFragment.show(ft, "label_dialog");
+ }
+
+ public void processTimeSet(int hourOfDay, int minute) {
+ if (mSelectedAlarm == null) {
+ // If mSelectedAlarm is null then we're creating a new alarm.
+ final Alarm a = new Alarm();
+ a.hour = hourOfDay;
+ a.minutes = minute;
+ a.enabled = true;
+ mAlarmUpdateHandler.asyncAddAlarm(a);
+ } else {
+ mSelectedAlarm.hour = hourOfDay;
+ mSelectedAlarm.minutes = minute;
+ mSelectedAlarm.enabled = true;
+ mScrollHandler.setSmoothScrollStableId(mSelectedAlarm.id);
+ mAlarmUpdateHandler.asyncUpdateAlarm(mSelectedAlarm, true, false);
+ mSelectedAlarm = null;
+ }
+ }
+}
diff --git a/src/com/android/deskclock/alarms/AlarmUpdateHandler.java b/src/com/android/deskclock/alarms/AlarmUpdateHandler.java
new file mode 100644
index 0000000..12c7ed2
--- /dev/null
+++ b/src/com/android/deskclock/alarms/AlarmUpdateHandler.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2015 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.alarms;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.os.AsyncTask;
+import android.support.design.widget.Snackbar;
+import android.text.format.DateFormat;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.deskclock.AlarmUtils;
+import com.android.deskclock.R;
+import com.android.deskclock.events.Events;
+import com.android.deskclock.provider.Alarm;
+import com.android.deskclock.provider.AlarmInstance;
+import com.android.deskclock.widget.toast.SnackbarManager;
+
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * API for asynchronously mutating a single alarm.
+ */
+public final class AlarmUpdateHandler {
+
+ private final Context mAppContext;
+ private final ScrollHandler mScrollHandler;
+ private final View mSnackbarAnchor;
+
+ // For undo
+ private Alarm mDeletedAlarm;
+
+ public AlarmUpdateHandler(Context context, ScrollHandler scrollHandler,
+ ViewGroup snackbarAnchor) {
+ mAppContext = context.getApplicationContext();
+ mScrollHandler = scrollHandler;
+ mSnackbarAnchor = snackbarAnchor;
+ }
+
+ /**
+ * Adds a new alarm on the background.
+ *
+ * @param alarm The alarm to be added.
+ */
+ public void asyncAddAlarm(final Alarm alarm) {
+ final AsyncTask<Void, Void, AlarmInstance> updateTask =
+ new AsyncTask<Void, Void, AlarmInstance>() {
+ @Override
+ protected AlarmInstance doInBackground(Void... parameters) {
+ if (alarm != null) {
+ Events.sendAlarmEvent(R.string.action_create, R.string.label_deskclock);
+ ContentResolver cr = mAppContext.getContentResolver();
+
+ // Add alarm to db
+ Alarm newAlarm = Alarm.addAlarm(cr, alarm);
+
+ // Be ready to scroll to this alarm on UI later.
+ mScrollHandler.setSmoothScrollStableId(newAlarm.id);
+
+ // Create and add instance to db
+ if (newAlarm.enabled) {
+ return setupAlarmInstance(newAlarm);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(AlarmInstance instance) {
+ if (instance != null) {
+ AlarmUtils.popAlarmSetSnackbar(
+ mSnackbarAnchor, instance.getAlarmTime().getTimeInMillis());
+ }
+ }
+ };
+ updateTask.execute();
+ }
+
+ /**
+ * Modifies an alarm on the background, and optionally show a toast when done.
+ *
+ * @param alarm The alarm to be modified.
+ * @param popToast whether or not a toast should be displayed when done.
+ * @param minorUpdate if true, don't affect any currently snoozed instances.
+ */
+ public void asyncUpdateAlarm(final Alarm alarm, final boolean popToast,
+ final boolean minorUpdate) {
+ final AsyncTask<Void, Void, AlarmInstance> updateTask =
+ new AsyncTask<Void, Void, AlarmInstance>() {
+ @Override
+ protected AlarmInstance doInBackground(Void... parameters) {
+ Events.sendAlarmEvent(R.string.action_update, R.string.label_deskclock);
+ ContentResolver cr = mAppContext.getContentResolver();
+
+ // Update alarm
+ Alarm.updateAlarm(cr, alarm);
+
+ if (minorUpdate) {
+ // just update the instance in the database and update notifications.
+ final List<AlarmInstance> instanceList =
+ AlarmInstance.getInstancesByAlarmId(cr, alarm.id);
+ for (AlarmInstance instance : instanceList) {
+ // Make a copy of the existing instance
+ final AlarmInstance newInstance = new AlarmInstance(instance);
+ // Copy over minor change data to the instance; we don't know
+ // exactly which minor field changed, so just copy them all.
+ newInstance.mVibrate = alarm.vibrate;
+ newInstance.mRingtone = alarm.alert;
+ newInstance.mLabel = alarm.label;
+ // Since we copied the mId of the old instance and the mId is used
+ // as the primary key in the AlarmInstance table, this will replace
+ // the existing instance.
+ AlarmInstance.updateInstance(cr, newInstance);
+ // Update the notification for this instance.
+ AlarmNotifications.updateNotification(mAppContext, newInstance);
+ }
+ return null;
+ }
+ // Otherwise, this is a major update and we're going to re-create the alarm
+ AlarmStateManager.deleteAllInstances(mAppContext, alarm.id);
+
+ return alarm.enabled ? setupAlarmInstance(alarm) : null;
+ }
+
+ @Override
+ protected void onPostExecute(AlarmInstance instance) {
+ if (popToast && instance != null) {
+ AlarmUtils.popAlarmSetSnackbar(
+ mSnackbarAnchor, instance.getAlarmTime().getTimeInMillis());
+ }
+ }
+ };
+ updateTask.execute();
+ }
+
+ /**
+ * Deletes an alarm on the background.
+ *
+ * @param alarm The alarm to be deleted.
+ */
+ public void asyncDeleteAlarm(final Alarm alarm) {
+ final AsyncTask<Void, Void, Boolean> deleteTask = new AsyncTask<Void, Void, Boolean>() {
+ @Override
+ protected Boolean doInBackground(Void... parameters) {
+ // Activity may be closed at this point , make sure data is still valid
+ if (alarm == null) {
+ // Nothing to do here, just return.
+ return false;
+ }
+ Events.sendAlarmEvent(R.string.action_delete, R.string.label_deskclock);
+ AlarmStateManager.deleteAllInstances(mAppContext, alarm.id);
+ return Alarm.deleteAlarm(mAppContext.getContentResolver(), alarm.id);
+ }
+
+ @Override
+ protected void onPostExecute(Boolean deleted) {
+ if (deleted) {
+ mDeletedAlarm = alarm;
+ showUndoBar();
+ }
+ }
+ };
+ deleteTask.execute();
+ }
+
+ /**
+ * Show a toast when an alarm is predismissed.
+ *
+ * @param instance Instance being predismissed.
+ */
+ public void showPredismissToast(AlarmInstance instance) {
+ final String time = DateFormat.getTimeFormat(mAppContext).format(
+ instance.getAlarmTime().getTime());
+ final String text = mAppContext.getString(R.string.alarm_is_dismissed, time);
+ SnackbarManager.show(Snackbar.make(mSnackbarAnchor, text, Snackbar.LENGTH_SHORT));
+ }
+
+ /**
+ * Hides any undo toast.
+ */
+ public void hideUndoBar() {
+ mDeletedAlarm = null;
+ SnackbarManager.dismiss();
+ }
+
+ private void showUndoBar() {
+ final Alarm deletedAlarm = mDeletedAlarm;
+ final Snackbar snackbar = Snackbar.make(mSnackbarAnchor,
+ mAppContext.getString(R.string.alarm_deleted), Snackbar.LENGTH_LONG)
+ .setAction(R.string.alarm_undo, new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mDeletedAlarm = null;
+ asyncAddAlarm(deletedAlarm);
+ }
+ });
+ SnackbarManager.show(snackbar);
+ }
+
+ private AlarmInstance setupAlarmInstance(Alarm alarm) {
+ final ContentResolver cr = mAppContext.getContentResolver();
+ AlarmInstance newInstance = alarm.createInstanceAfter(Calendar.getInstance());
+ newInstance = AlarmInstance.addInstance(cr, newInstance);
+ // Register instance to state manager
+ AlarmStateManager.registerInstance(mAppContext, newInstance, true);
+ return newInstance;
+ }
+}
diff --git a/src/com/android/deskclock/alarms/ScrollHandler.java b/src/com/android/deskclock/alarms/ScrollHandler.java
new file mode 100644
index 0000000..9ac00a5
--- /dev/null
+++ b/src/com/android/deskclock/alarms/ScrollHandler.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2015 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.alarms;
+
+/**
+ * API that handles scrolling when an alarm item is expanded/collapsed.
+ */
+public interface ScrollHandler {
+
+ /**
+ * Sets the stable id that view should be scrolled to. The view does not actually scroll yet.
+ */
+ void setSmoothScrollStableId(long stableId);
+
+ /**
+ * Perform smooth scroll to position.
+ */
+ void smoothScrollTo(int position);
+}
diff --git a/src/com/android/deskclock/alarms/TimePickerCompat.java b/src/com/android/deskclock/alarms/TimePickerCompat.java
new file mode 100644
index 0000000..38ff651
--- /dev/null
+++ b/src/com/android/deskclock/alarms/TimePickerCompat.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2015 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.alarms;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.app.DialogFragment;
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.os.Bundle;
+import android.text.format.DateFormat;
+import android.widget.TimePicker;
+
+import com.android.datetimepicker.time.RadialPickerLayout;
+import com.android.datetimepicker.time.TimePickerDialog;
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+import com.android.deskclock.provider.Alarm;
+
+import java.util.Calendar;
+
+/**
+ * Displays and handles callback for time picker UI.
+ */
+public final class TimePickerCompat {
+
+ /**
+ * Callback when a valid time is selected from UI.
+ */
+ public interface OnTimeSetListener {
+ void processTimeSet(int hourOfDay, int minute);
+ }
+
+ // Tag for timer picker fragment in FragmentManager.
+ private static final String FRAG_TAG_TIME_PICKER = "time_dialog";
+
+ // Do not instantiate.
+ private TimePickerCompat() {}
+
+ /**
+ * Pre-L implementation of timer picker UI.
+ */
+ public static class TimerPickerPreL extends TimePickerDialog {
+
+ public static TimerPickerPreL newInstance(final Fragment targetFragment, final int hour,
+ final int minutes, final boolean use24hourFormat) {
+ final TimerPickerPreL dialog = new TimerPickerPreL();
+ dialog.initialize(new OnTimeSetListener() {
+ @Override
+ public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute) {
+ ((TimePickerCompat.OnTimeSetListener) targetFragment)
+ .processTimeSet(hourOfDay, minute);
+ }
+ }, hour, minutes, use24hourFormat);
+ dialog.setTargetFragment(targetFragment, 0);
+ dialog.setThemeDark(true);
+ return dialog;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ if (getTargetFragment() instanceof TimePickerCompat.OnTimeSetListener) {
+ setOnTimeSetListener(new OnTimeSetListener() {
+ @Override
+ public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute) {
+ ((TimePickerCompat.OnTimeSetListener) getTargetFragment())
+ .processTimeSet(hourOfDay, minute);
+ }
+ });
+ }
+ }
+ }
+
+ /**
+ * Post-L implmenetation of timer picker UI.
+ */
+ public static class TimePickerPostL extends DialogFragment {
+
+ private Alarm mAlarm;
+ private android.app.TimePickerDialog.OnTimeSetListener mListener;
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ final int hour, minute;
+ if (mAlarm == null) {
+ final Calendar c = Calendar.getInstance();
+ hour = c.get(Calendar.HOUR_OF_DAY);
+ minute = c.get(Calendar.MINUTE);
+ } else {
+ hour = mAlarm.hour;
+ minute = mAlarm.minutes;
+ }
+
+ return new android.app.TimePickerDialog(getActivity(), R.style.TimePickerTheme,
+ mListener, hour, minute, DateFormat.is24HourFormat(getActivity()));
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ if (getTargetFragment() instanceof OnTimeSetListener) {
+ setOnTimeSetListener((OnTimeSetListener) getTargetFragment());
+ }
+ }
+
+ public void setOnTimeSetListener(final OnTimeSetListener listener) {
+ mListener = new android.app.TimePickerDialog.OnTimeSetListener() {
+ @Override
+ public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
+ listener.processTimeSet(hourOfDay, minute);
+ }
+ };
+ }
+
+ public void setAlarm(Alarm alarm) {
+ mAlarm = alarm;
+ }
+ }
+
+ /**
+ * Show the time picker dialog for post-L devices.
+ * This is called from AlarmClockFragment to set alarm.
+ *
+ * @param targetFragment The calling fragment (which is also a {@link OnTimeSetListener}),
+ * we use it as the target fragment of the time picker fragment, so later
+ * the latter can retrieve it and set it as its onTimeSetListener when
+ * the fragment is recreated.
+ * @param alarm The clicked alarm, it can be null if user was clicking the fab.
+ * @param use24hourFormat Whether or not the time picker should use 24-hour format if supported.
+ */
+ public static void showTimeEditDialog(Fragment targetFragment, Alarm alarm,
+ boolean use24hourFormat) {
+ // Make sure the dialog isn't already added.
+ final FragmentManager manager = targetFragment.getFragmentManager();
+ final FragmentTransaction ft = manager.beginTransaction();
+ final Fragment prev = manager.findFragmentByTag(FRAG_TAG_TIME_PICKER);
+ if (prev != null) {
+ ft.remove(prev);
+ }
+ ft.commit();
+
+ if (Utils.isLOrLater()) {
+ final TimePickerPostL picker = new TimePickerPostL();
+ picker.setTargetFragment(targetFragment, 0);
+ picker.setOnTimeSetListener((OnTimeSetListener) targetFragment);
+ picker.setAlarm(alarm);
+ picker.show(manager, FRAG_TAG_TIME_PICKER);
+ } else {
+ final int hour, minutes;
+ if (alarm == null) {
+ hour = 0;
+ minutes = 0;
+ } else {
+ hour = alarm.hour;
+ minutes = alarm.minutes;
+ }
+ TimerPickerPreL picker = TimerPickerPreL.newInstance(targetFragment, hour,
+ minutes, use24hourFormat);
+ if (!picker.isAdded()) {
+ picker.show(manager, FRAG_TAG_TIME_PICKER);
+ }
+ }
+ }
+}
diff --git a/src/com/android/deskclock/alarms/dataadapter/AlarmTimeAdapter.java b/src/com/android/deskclock/alarms/dataadapter/AlarmTimeAdapter.java
new file mode 100644
index 0000000..15d1f4e
--- /dev/null
+++ b/src/com/android/deskclock/alarms/dataadapter/AlarmTimeAdapter.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2015 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.alarms.dataadapter;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.os.Vibrator;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.deskclock.LogUtils;
+import com.android.deskclock.R;
+import com.android.deskclock.alarms.AlarmTimeClickHandler;
+import com.android.deskclock.alarms.ScrollHandler;
+import com.android.deskclock.provider.Alarm;
+import com.android.deskclock.provider.AlarmInstance;
+
+/**
+ * Data adapter for alarm time items.
+ */
+public final class AlarmTimeAdapter extends RecyclerView.Adapter<AlarmTimeViewHolder> {
+ private static final String TAG = "CwAlarm";
+ private static final String KEY_EXPANDED_ID = "expandedId";
+ private static final int VIEW_TYPE_ALARM_TIME_COLLAPSED = R.layout.alarm_time_collapsed;
+ private static final int VIEW_TYPE_ALARM_TIME_EXPANDED = R.layout.alarm_time_expanded;
+
+ private final Context mContext;
+ private final LayoutInflater mInflater;
+
+ private final AlarmTimeClickHandler mAlarmTimeClickHandler;
+ private final ScrollHandler mScrollHandler;
+
+ private final boolean mHasVibrator;
+ private int mExpandedPosition = -1;
+ private long mExpandedId = Alarm.INVALID_ID;
+ private Cursor mCursor;
+
+ public AlarmTimeAdapter(Context context, Bundle savedState,
+ AlarmTimeClickHandler alarmTimeClickHandler, ScrollHandler smoothScrollController) {
+ mContext = context;
+ mInflater = LayoutInflater.from(context);
+ mScrollHandler = smoothScrollController;
+ mAlarmTimeClickHandler = alarmTimeClickHandler;
+ mHasVibrator = ((Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE))
+ .hasVibrator();
+ if (savedState != null) {
+ mExpandedId = savedState.getLong(KEY_EXPANDED_ID, Alarm.INVALID_ID);
+ }
+
+ setHasStableIds(true);
+ }
+
+ @Override
+ public AlarmTimeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ final View v = mInflater.inflate(viewType, parent, false /* attachToRoot */);
+ if (viewType == VIEW_TYPE_ALARM_TIME_COLLAPSED) {
+ return new CollapsedAlarmViewHolder(v, mAlarmTimeClickHandler, this);
+ } else {
+ return new ExpandedAlarmViewHolder(v, mHasVibrator, mAlarmTimeClickHandler, this);
+ }
+ }
+
+ @Override
+ public void onViewRecycled(AlarmTimeViewHolder viewHolder) {
+ super.onViewRecycled(viewHolder);
+ viewHolder.clearData();
+ }
+
+ @Override
+ public void onBindViewHolder(AlarmTimeViewHolder viewHolder, int position) {
+ if (!mCursor.moveToPosition(position)) {
+ LogUtils.e(TAG, "Failed to bind alarm " + position);
+ return;
+ }
+ final Alarm alarm = new Alarm(mCursor);
+ final AlarmInstance alarmInstance = alarm.canPreemptivelyDismiss()
+ ? new AlarmInstance(mCursor, true /* joinedTable */) : null;
+ viewHolder.bindAlarm(mContext, alarm, alarmInstance);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mCursor == null ? 0 : mCursor.getCount();
+ }
+
+ @Override
+ public long getItemId(int position) {
+ if (mCursor == null || !mCursor.moveToPosition(position)) {
+ return RecyclerView.NO_ID;
+ }
+ // TODO: Directly read id instead of instantiating Alarm object.
+ return new Alarm(mCursor).id;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ final long stableId = getItemId(position);
+ return stableId != RecyclerView.NO_ID && stableId == mExpandedId
+ ? VIEW_TYPE_ALARM_TIME_EXPANDED : VIEW_TYPE_ALARM_TIME_COLLAPSED;
+ }
+
+ public void saveInstance(Bundle outState) {
+ outState.putLong(KEY_EXPANDED_ID, mExpandedId);
+ }
+
+ /**
+ * Request the UI to expand the alarm at selected position and scroll it into view.
+ */
+ public void expand(int position) {
+ final long stableId = getItemId(position);
+ if (mExpandedId == stableId) {
+ return;
+ }
+ mExpandedId = stableId;
+ mScrollHandler.smoothScrollTo(position);
+ if (mExpandedPosition >= 0) {
+ notifyItemChanged(mExpandedPosition);
+ }
+ mExpandedPosition = position;
+ notifyItemChanged(position);
+ }
+
+ public void collapse(int position) {
+ mExpandedId = Alarm.INVALID_ID;
+ mExpandedPosition = -1;
+ notifyItemChanged(position);
+ }
+
+ /**
+ * Swaps the adapter to a new data source.
+ *
+ * @param cursor A cursor generated by Cursor loader from {@link Alarm#getAlarmsCursorLoader}.
+ */
+ public void swapCursor(Cursor cursor) {
+ if (mCursor == cursor) {
+ return;
+ }
+ if (mCursor != null) {
+ mCursor.close();
+ }
+ mCursor = cursor;
+ notifyDataSetChanged();
+ }
+}
diff --git a/src/com/android/deskclock/alarms/dataadapter/AlarmTimeViewHolder.java b/src/com/android/deskclock/alarms/dataadapter/AlarmTimeViewHolder.java
new file mode 100644
index 0000000..b23eebb
--- /dev/null
+++ b/src/com/android/deskclock/alarms/dataadapter/AlarmTimeViewHolder.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2015 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.alarms.dataadapter;
+
+import android.content.Context;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.SwitchCompat;
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.TextView;
+
+import com.android.deskclock.AlarmUtils;
+import com.android.deskclock.R;
+import com.android.deskclock.alarms.AlarmTimeClickHandler;
+import com.android.deskclock.provider.Alarm;
+import com.android.deskclock.provider.AlarmInstance;
+import com.android.deskclock.widget.TextTime;
+
+/**
+ * Abstract ViewHolder for alarm time items.
+ */
+public abstract class AlarmTimeViewHolder extends RecyclerView.ViewHolder {
+
+ private static final float CLOCK_ENABLED_ALPHA = 1f;
+ private static final float CLOCK_DISABLED_ALPHA = 0.69f;
+
+ public final TextTime clock;
+ public final CompoundButton onoff;
+ public final View arrow;
+ public final View preemptiveDismissContainer;
+ public final TextView preemptiveDismissButton;
+
+ protected Alarm mAlarm;
+ protected AlarmInstance mAlarmInstance;
+
+ private final AlarmTimeClickHandler mAlarmTimeClickHandler;
+
+ public AlarmTimeViewHolder(View itemView, AlarmTimeClickHandler alarmTimeClickHandler) {
+ super(itemView);
+ mAlarmTimeClickHandler = alarmTimeClickHandler;
+ clock = (TextTime) itemView.findViewById(R.id.digital_clock);
+ onoff = (CompoundButton) itemView.findViewById(R.id.onoff);
+ arrow = itemView.findViewById(R.id.arrow);
+ preemptiveDismissContainer = itemView.findViewById(R.id.preemptive_dismiss_container);
+ preemptiveDismissButton =
+ (TextView) itemView.findViewById(R.id.preemptive_dismiss_button);
+ preemptiveDismissButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mAlarmTimeClickHandler.dismissAlarmInstance(mAlarmInstance);
+ }
+ });
+ onoff.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
+ mAlarmTimeClickHandler.setAlarmEnabled(mAlarm, checked);
+ }
+ });
+ }
+
+ public void setData(Alarm alarm, AlarmInstance alarmInstance) {
+ mAlarmInstance = alarmInstance;
+ mAlarm = alarm;
+ }
+
+ public void clearData() {
+ mAlarmInstance = null;
+ mAlarm = null;
+ }
+
+ /**
+ * Binds the view with {@link Alarm} data.
+ */
+ public abstract void bindAlarm(Context context, Alarm alarm, AlarmInstance alarmInstance);
+
+ protected void bindOnOffSwitch(Context context, Alarm alarm) {
+ onoff.setChecked(alarm.enabled);
+ ((SwitchCompat) onoff).setTextOn(context.getString(R.string.on_switch));
+ ((SwitchCompat) onoff).setTextOff(context.getString(R.string.off_switch));
+ }
+
+ protected void bindClock(Context context, Alarm alarm) {
+ clock.setAlpha(alarm.enabled ? CLOCK_ENABLED_ALPHA : CLOCK_DISABLED_ALPHA);
+ clock.setFormat(context);
+ clock.setTime(alarm.hour, alarm.minutes);
+ }
+
+ protected boolean bindPreemptiveDismissButton(Context context, Alarm alarm,
+ AlarmInstance alarmInstance) {
+ boolean canBind = alarm.canPreemptivelyDismiss() && alarmInstance != null;
+ if (canBind) {
+ preemptiveDismissContainer.setVisibility(View.VISIBLE);
+ final String dismissText = alarm.instanceState == AlarmInstance.SNOOZE_STATE
+ ? context.getString(R.string.alarm_alert_snooze_until,
+ AlarmUtils.getAlarmText(context, alarmInstance, false))
+ : context.getString(R.string.alarm_alert_dismiss_now_text);
+ preemptiveDismissButton.setText(dismissText);
+ } else {
+ preemptiveDismissContainer.setVisibility(View.GONE);
+ }
+ return canBind;
+ }
+}
diff --git a/src/com/android/deskclock/alarms/dataadapter/CollapsedAlarmViewHolder.java b/src/com/android/deskclock/alarms/dataadapter/CollapsedAlarmViewHolder.java
new file mode 100644
index 0000000..6db8878
--- /dev/null
+++ b/src/com/android/deskclock/alarms/dataadapter/CollapsedAlarmViewHolder.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2015 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.alarms.dataadapter;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+import com.android.deskclock.alarms.AlarmTimeClickHandler;
+import com.android.deskclock.provider.Alarm;
+import com.android.deskclock.provider.AlarmInstance;
+
+import java.util.Calendar;
+
+/**
+ * A ViewHolder containing views for an alarm item in collapsed stated.
+ */
+public final class CollapsedAlarmViewHolder extends AlarmTimeViewHolder {
+
+ public final TextView alarmLabel;
+ public final TextView daysOfWeek;
+ public final TextView upcomingInstanceLabel;
+ public final View hairLine;
+
+ public CollapsedAlarmViewHolder(View itemView,
+ final AlarmTimeClickHandler alarmTimeClickHandler,
+ final AlarmTimeAdapter alarmTimeAdapter) {
+ super(itemView, alarmTimeClickHandler);
+ alarmLabel = (TextView) itemView.findViewById(R.id.label);
+ daysOfWeek = (TextView) itemView.findViewById(R.id.days_of_week);
+ upcomingInstanceLabel = (TextView) itemView.findViewById(R.id.upcoming_instance_label);
+ hairLine = itemView.findViewById(R.id.hairline);
+
+ // Expand handler
+ itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ alarmTimeAdapter.expand(getAdapterPosition());
+ }
+ });
+ alarmLabel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ alarmTimeAdapter.expand(getAdapterPosition());
+ }
+ });
+ arrow.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ alarmTimeAdapter.expand(getAdapterPosition());
+ }
+ });
+ // Edit time handler
+ clock.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ alarmTimeClickHandler.onClockClicked(mAlarm);
+ alarmTimeAdapter.expand(getAdapterPosition());
+ }
+ });
+ }
+
+ @Override
+ public void bindAlarm(Context context, Alarm alarm, AlarmInstance alarmInstance) {
+ setData(alarm, alarmInstance);
+ bindOnOffSwitch(context, alarm);
+ bindClock(context, alarm);
+ bindRepeatText(context, alarm);
+ bindReadOnlyLabel(context, alarm);
+ bindUpcomingInstance(context, alarm);
+ boolean boundPreemptiveDismiss =
+ bindPreemptiveDismissButton(context, alarm, alarmInstance);
+ hairLine.setVisibility(boundPreemptiveDismiss ? View.GONE : View.VISIBLE);
+ itemView.setContentDescription(clock.getContentDescription() + " " +
+ alarm.getLabelOrDefault(context));
+ }
+
+ private void bindReadOnlyLabel(Context context, Alarm alarm) {
+ if (alarm.label != null && alarm.label.length() != 0) {
+ alarmLabel.setText(alarm.label);
+ alarmLabel.setVisibility(View.VISIBLE);
+ alarmLabel.setContentDescription(context.getString(R.string.label_description)
+ + " " + alarm.label);
+ } else {
+ alarmLabel.setVisibility(View.GONE);
+ }
+ }
+
+ private void bindRepeatText(Context context, Alarm alarm) {
+ final String daysOfWeekText =
+ alarm.daysOfWeek.toString(context, Utils.getFirstDayOfWeek(context));
+ if (!TextUtils.isEmpty(daysOfWeekText)) {
+ daysOfWeek.setText(daysOfWeekText);
+ daysOfWeek.setContentDescription(alarm.daysOfWeek.toAccessibilityString(
+ context, Utils.getFirstDayOfWeek(context)));
+ daysOfWeek.setVisibility(View.VISIBLE);
+ } else {
+ daysOfWeek.setVisibility(View.GONE);
+ }
+ }
+
+ private void bindUpcomingInstance(Context context, Alarm alarm) {
+ if (alarm.daysOfWeek.isRepeating()) {
+ upcomingInstanceLabel.setVisibility(View.GONE);
+ } else {
+ upcomingInstanceLabel.setVisibility(View.VISIBLE);
+ final String labelText = Alarm.isTomorrow(alarm, Calendar.getInstance()) ?
+ context.getString(R.string.alarm_tomorrow) :
+ context.getString(R.string.alarm_today);
+ upcomingInstanceLabel.setText(labelText);
+ }
+ }
+}
diff --git a/src/com/android/deskclock/alarms/dataadapter/ExpandedAlarmViewHolder.java b/src/com/android/deskclock/alarms/dataadapter/ExpandedAlarmViewHolder.java
new file mode 100644
index 0000000..c4c9bb0
--- /dev/null
+++ b/src/com/android/deskclock/alarms/dataadapter/ExpandedAlarmViewHolder.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2015 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.alarms.dataadapter;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+import com.android.deskclock.alarms.AlarmTimeClickHandler;
+import com.android.deskclock.alarms.utils.DayOrderUtils;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.provider.Alarm;
+import com.android.deskclock.provider.AlarmInstance;
+import com.android.deskclock.provider.DaysOfWeek;
+
+import java.util.HashSet;
+
+/**
+ * A ViewHolder containing views for an alarm item in expanded stated.
+ */
+public final class ExpandedAlarmViewHolder extends AlarmTimeViewHolder {
+
+ public final CheckBox repeat;
+ public final TextView editLabel;
+ public final LinearLayout repeatDays;
+ public final CompoundButton[] dayButtons = new CompoundButton[7];
+ public final CheckBox vibrate;
+ public final TextView ringtone;
+ public final Button delete;
+ public final View preemptiveDismissContainer;
+ public final TextView preemptiveDismissButton;
+
+ private final boolean mHasVibrator;
+ private final int[] mDayOrder;
+
+ public ExpandedAlarmViewHolder(View itemView,
+ final boolean hasVibrator,
+ final AlarmTimeClickHandler alarmTimeClickHandler,
+ final AlarmTimeAdapter alarmTimeAdapter) {
+ super(itemView, alarmTimeClickHandler);
+ final Context context = itemView.getContext();
+ mHasVibrator = hasVibrator;
+ mDayOrder = DayOrderUtils.getDayOrder(context);
+ final Resources.Theme theme = context.getTheme();
+ int[] attrs = new int[] { android.R.attr.selectableItemBackground };
+
+ final TypedArray typedArray = theme.obtainStyledAttributes(attrs);
+ final LayerDrawable background = new LayerDrawable(new Drawable[] {
+ context.getResources().getDrawable(R.drawable.alarm_background_expanded),
+ typedArray.getDrawable(0) });
+ itemView.setBackground(background);
+ typedArray.recycle();
+
+ final int firstDay = Utils.getZeroIndexedFirstDayOfWeek(context);
+
+ delete = (Button) itemView.findViewById(R.id.delete);
+
+ repeat = (CheckBox) itemView.findViewById(R.id.repeat_onoff);
+ vibrate = (CheckBox) itemView.findViewById(R.id.vibrate_onoff);
+ ringtone = (TextView) itemView.findViewById(R.id.choose_ringtone);
+ editLabel = (TextView) itemView.findViewById(R.id.edit_label);
+ repeatDays = (LinearLayout) itemView.findViewById(R.id.repeat_days);
+
+ // Build button for each day.
+ LayoutInflater mInflater = LayoutInflater.from(context);
+ for (int i = 0; i < DaysOfWeek.DAYS_IN_A_WEEK; i++) {
+ final CompoundButton dayButton = (CompoundButton) mInflater.inflate(
+ R.layout.day_button, repeatDays, false /* attachToRoot */);
+ dayButton.setText(Utils.getShortWeekday(i, firstDay));
+ dayButton.setContentDescription(Utils.getLongWeekday(i, firstDay));
+ repeatDays.addView(dayButton);
+ dayButtons[i] = dayButton;
+ }
+
+ preemptiveDismissContainer = itemView.findViewById(R.id.preemptive_dismiss_container);
+ preemptiveDismissButton =
+ (TextView) itemView.findViewById(R.id.preemptive_dismiss_button);
+
+ // Collapse handler
+ itemView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ alarmTimeAdapter.collapse(getAdapterPosition());
+ }
+ });
+ arrow.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ alarmTimeAdapter.collapse(getAdapterPosition());
+ }
+ });
+ // Edit time handler
+ clock.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ alarmTimeClickHandler.onClockClicked(mAlarm);
+ }
+ });
+ // Edit label handler
+ editLabel.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ alarmTimeClickHandler.onEditLabelClicked(mAlarm);
+ }
+ });
+ // Vibrator checkbox handler
+ vibrate.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ alarmTimeClickHandler.setAlarmVibrationEnabled(mAlarm, ((CheckBox) v).isChecked());
+ }
+ });
+ // Ringtone editor handler
+ ringtone.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ alarmTimeClickHandler.onRingtoneClicked(mAlarm);
+ }
+ });
+ // Delete alarm handler
+ delete.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ alarmTimeClickHandler.onDeleteClicked(mAlarm);
+ v.announceForAccessibility(context.getString(R.string.alarm_deleted));
+ }
+ });
+ // Repeat checkbox handler
+ repeat.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ final boolean checked = ((CheckBox) view).isChecked();
+ alarmTimeClickHandler.setAlarmRepeatEnabled(mAlarm, checked);
+ }
+ });
+ // Day buttons handler
+ for (int i = 0; i < DaysOfWeek.DAYS_IN_A_WEEK; i++) {
+ final int buttonIndex = i;
+ dayButtons[i].setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ final boolean isChecked = ((CompoundButton) view).isChecked();
+ alarmTimeClickHandler.setDayOfWeekEnabled(mAlarm, isChecked, buttonIndex);
+ }
+ });
+ }
+ }
+
+ @Override
+ public void bindAlarm(Context context, Alarm alarm, AlarmInstance alarmInstance) {
+ setData(alarm, alarmInstance);
+ bindOnOffSwitch(context, alarm);
+ bindClock(context, alarm);
+ bindEditLabel(alarm);
+ bindDaysOfWeekButtons(alarm);
+ bindVibrator(alarm);
+ bindRingtoneTitle(context, alarm);
+ bindPreemptiveDismissButton(context, alarm, alarmInstance);
+ }
+
+ private void bindRingtoneTitle(Context context, Alarm alarm) {
+ final String title = DataModel.getDataModel().getAlarmRingtoneTitle(alarm.alert);
+ final String description = context.getString(R.string.ringtone_description);
+
+ ringtone.setText(title);
+ ringtone.setContentDescription(description + " " + title);
+ }
+
+ private void bindDaysOfWeekButtons(Alarm alarm) {
+ HashSet<Integer> setDays = alarm.daysOfWeek.getSetDays();
+ for (int i = 0; i < DaysOfWeek.DAYS_IN_A_WEEK; i++) {
+ final CompoundButton dayButton = dayButtons[i];
+ if (setDays.contains(mDayOrder[i])) {
+ dayButton.setChecked(true);
+ dayButton.setTextColor(Utils.getCurrentHourColor());
+ } else {
+ dayButton.setChecked(false);
+ dayButton.setTextColor(itemView.getContext().getResources().getColor(R.color
+ .white));
+ }
+ }
+ if (alarm.daysOfWeek.isRepeating()) {
+ repeat.setChecked(true);
+ repeatDays.setVisibility(View.VISIBLE);
+ } else {
+ repeat.setChecked(false);
+ repeatDays.setVisibility(View.GONE);
+ }
+ }
+
+ private void bindEditLabel(Alarm alarm) {
+ if (alarm.label != null && alarm.label.length() > 0) {
+ editLabel.setText(alarm.label);
+ } else {
+ editLabel.setText(R.string.label);
+ }
+ }
+
+ private void bindVibrator(Alarm alarm) {
+ if (!mHasVibrator) {
+ vibrate.setVisibility(View.INVISIBLE);
+ } else {
+ vibrate.setVisibility(View.VISIBLE);
+ vibrate.setChecked(alarm.vibrate);
+ }
+ }
+}
diff --git a/src/com/android/deskclock/alarms/utils/DayOrderUtils.java b/src/com/android/deskclock/alarms/utils/DayOrderUtils.java
new file mode 100644
index 0000000..6832ad0
--- /dev/null
+++ b/src/com/android/deskclock/alarms/utils/DayOrderUtils.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 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.alarms.utils;
+
+import android.content.Context;
+
+import com.android.deskclock.Utils;
+import com.android.deskclock.provider.DaysOfWeek;
+
+import java.util.Calendar;
+
+/**
+ * Contains information about the order that days of the week are shown in the UI.
+ */
+public final class DayOrderUtils {
+
+ // A reference used to create mDayOrder
+ private static final int[] DAY_ORDER = {
+ Calendar.SUNDAY,
+ Calendar.MONDAY,
+ Calendar.TUESDAY,
+ Calendar.WEDNESDAY,
+ Calendar.THURSDAY,
+ Calendar.FRIDAY,
+ Calendar.SATURDAY,
+ };
+
+ public static int[] getDayOrder(Context context) {
+ // Value from preferences corresponds to Calendar.<WEEKDAY> value
+ // -1 in order to correspond to DAY_ORDER indexing
+ final int startDay = Utils.getZeroIndexedFirstDayOfWeek(context);
+ final int[] dayOrder = new int[DaysOfWeek.DAYS_IN_A_WEEK];
+
+ for (int i = 0; i < DaysOfWeek.DAYS_IN_A_WEEK; ++i) {
+ dayOrder[i] = DAY_ORDER[(startDay + i) % DaysOfWeek.DAYS_IN_A_WEEK];
+ }
+ return dayOrder;
+ }
+
+}
diff --git a/src/com/android/deskclock/data/AlarmModel.java b/src/com/android/deskclock/data/AlarmModel.java
new file mode 100644
index 0000000..750b72b
--- /dev/null
+++ b/src/com/android/deskclock/data/AlarmModel.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.content.ContentResolver;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Handler;
+import android.provider.Settings;
+import android.util.ArrayMap;
+
+import com.android.deskclock.LogUtils;
+import com.android.deskclock.R;
+import com.android.deskclock.provider.Alarm;
+
+import java.util.Map;
+
+/**
+ * All alarm data will eventually be accessed via this model.
+ */
+final class AlarmModel {
+
+ private final Context mContext;
+
+ /** The model from which settings are fetched. */
+ private final SettingsModel mSettingsModel;
+
+ /** The uri of the default ringtone to play for new alarms; mirrors last selection. */
+ private Uri mDefaultAlarmRingtoneUri;
+
+ /** Maps ringtone uri to ringtone title; looking up a title from scratch is expensive. */
+ private final Map<Uri, String> mRingtoneTitles = new ArrayMap<>(8);
+
+ AlarmModel(Context context, SettingsModel settingsModel) {
+ mContext = context;
+ mSettingsModel = settingsModel;
+
+ // Clear caches affected by system settings when system settings change.
+ final ContentResolver cr = mContext.getContentResolver();
+ final ContentObserver observer = new SystemAlarmAlertChangeObserver();
+ cr.registerContentObserver(Settings.System.DEFAULT_ALARM_ALERT_URI, false, observer);
+ }
+
+ Uri getDefaultAlarmRingtoneUri() {
+ if (mDefaultAlarmRingtoneUri == null) {
+ mDefaultAlarmRingtoneUri = mSettingsModel.getDefaultAlarmRingtoneUri();
+ }
+
+ return mDefaultAlarmRingtoneUri;
+ }
+
+ void setDefaultAlarmRingtoneUri(Uri uri) {
+ mSettingsModel.setDefaultAlarmRingtoneUri(uri);
+ mDefaultAlarmRingtoneUri = uri;
+ }
+
+ String getAlarmRingtoneTitle(Uri uri) {
+ // Special case: no ringtone has a title of "Silent".
+ if (Alarm.NO_RINGTONE_URI.equals(uri)) {
+ return mContext.getString(R.string.silent_ringtone_title);
+ }
+
+ // Check the cache.
+ String title = mRingtoneTitles.get(uri);
+
+ if (title == null) {
+ // This is slow because a media player is created during Ringtone object creation.
+ final Ringtone ringtone = RingtoneManager.getRingtone(mContext, uri);
+ if (ringtone == null) {
+ LogUtils.e("No ringtone for uri: %s", uri);
+ return mContext.getString(R.string.unknown_ringtone_title);
+ }
+
+ // Cache the title for later use.
+ title = ringtone.getTitle(mContext);
+ mRingtoneTitles.put(uri, title);
+ }
+ return title;
+ }
+
+ /**
+ * This receiver is notified when system settings change. Cached information built on
+ * those system settings must be cleared.
+ */
+ private final class SystemAlarmAlertChangeObserver extends ContentObserver {
+
+ private SystemAlarmAlertChangeObserver() {
+ super(new Handler());
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+
+ LogUtils.i("Detected change to system default alarm ringtone; clearing caches");
+
+ mDefaultAlarmRingtoneUri = null;
+
+ // Titles such as "Default ringtone (Oxygen)" are wrong after default ringtone changes.
+ mRingtoneTitles.clear();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/City.java b/src/com/android/deskclock/data/City.java
new file mode 100644
index 0000000..a5fd850
--- /dev/null
+++ b/src/com/android/deskclock/data/City.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import java.text.Collator;
+import java.util.Comparator;
+import java.util.TimeZone;
+
+/**
+ * A read-only domain object representing a city of the world and associated time information. It
+ * also contains static comparators that can be instantiated to order cities in common sort orders.
+ */
+public final class City {
+
+ /** A unique identifier for the city. */
+ private final String mId;
+
+ /** An optional numeric index used to order cities for display; -1 if no such index exists. */
+ private final int mIndex;
+
+ /** An index string used to order cities for display. */
+ private final String mIndexString;
+
+ /** The display name of the city. */
+ private final String mName;
+
+ /** The phonetic name of the city used to order cities for display. */
+ private final String mPhoneticName;
+
+ /** The {@link TimeZone#getID() id} of the timezone in which the city is located. */
+ private final String mTimeZoneId;
+
+ /** The TimeZone corresponding to the {@link #mTimeZoneId}. */
+ private final TimeZone mTimeZone;
+
+ /** A cached upper case form of the {@link #mName} used in case-insensitive name comparisons. */
+ private String mNameUpperCase;
+
+ City(String id, int index, String indexString, String name, String phoneticName,
+ String timeZoneId) {
+ mId = id;
+ mIndex = index;
+ mIndexString = indexString;
+ mName = name;
+ mPhoneticName = phoneticName;
+ mTimeZoneId = timeZoneId;
+ mTimeZone = TimeZone.getTimeZone(mTimeZoneId);
+ }
+
+ public String getId() { return mId; }
+ public int getIndex() { return mIndex; }
+ public String getName() { return mName; }
+ public TimeZone getTimeZone() { return mTimeZone; }
+ public String getTimeZoneId() { return mTimeZoneId; }
+ public String getIndexString() { return mIndexString; }
+ public String getPhoneticName() { return mPhoneticName; }
+
+ public String getNameUpperCase() {
+ if (mNameUpperCase == null) {
+ mNameUpperCase = mName.toUpperCase();
+ }
+ return mNameUpperCase;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("City {id=%s, index=%d, indexString=%s, name=%s, phonetic=%s, tz=%s}",
+ mId, mIndex, mIndexString, mName, mPhoneticName, mTimeZoneId);
+ }
+
+ /**
+ * Orders by:
+ *
+ * <ol>
+ * <li>UTC offset of {@link #getTimeZone() timezone}</li>
+ * <li>{@link #getIndex() numeric index}</li>
+ * <li>{@link #getIndexString()} alphabetic index}</li>
+ * <li>{@link #getPhoneticName() phonetic name}</li>
+ * </ol>
+ */
+ public static final class UtcOffsetComparator implements Comparator<City> {
+
+ private final Comparator<City> mDelegate1 = new UtcOffsetIndexComparator();;
+
+ private final Comparator<City> mDelegate2 = new NameComparator();
+
+ public int compare(City c1, City c2) {
+ int result = mDelegate1.compare(c1, c2);
+
+ if (result == 0) {
+ result = mDelegate2.compare(c1, c2);
+ }
+
+ return result;
+ }
+ }
+
+ /**
+ * Orders by:
+ *
+ * <ol>
+ * <li>UTC offset of {@link #getTimeZone() timezone}</li>
+ * </ol>
+ */
+ public static final class UtcOffsetIndexComparator implements Comparator<City> {
+
+ // Snapshot the current time when the Comparator is created to obtain consistent offsets.
+ private final long now = System.currentTimeMillis();
+
+ public int compare(City c1, City c2) {
+ final int utcOffset1 = c1.getTimeZone().getOffset(now);
+ final int utcOffset2 = c2.getTimeZone().getOffset(now);
+ return Integer.compare(utcOffset1, utcOffset2);
+ }
+ }
+
+ /**
+ * This comparator sorts using the city fields that influence natural name sort order:
+ *
+ * <ol>
+ * <li>{@link #getIndex() numeric index}</li>
+ * <li>{@link #getIndexString()} alphabetic index}</li>
+ * <li>{@link #getPhoneticName() phonetic name}</li>
+ * </ol>
+ */
+ public static final class NameComparator implements Comparator<City> {
+
+ private final Comparator<City> mDelegate = new NameIndexComparator();
+
+ // Locale-sensitive comparator for phonetic names.
+ private final Collator mNameCollator = Collator.getInstance();
+
+ @Override
+ public int compare(City c1, City c2) {
+ int result = mDelegate.compare(c1, c2);
+
+ if (result == 0) {
+ result = mNameCollator.compare(c1.getPhoneticName(), c2.getPhoneticName());
+ }
+
+ return result;
+ }
+ }
+
+ /**
+ * Orders by:
+ *
+ * <ol>
+ * <li>{@link #getIndex() numeric index}</li>
+ * <li>{@link #getIndexString()} alphabetic index}</li>
+ * </ol>
+ */
+ public static final class NameIndexComparator implements Comparator<City> {
+
+ // Locale-sensitive comparator for index strings.
+ private final Collator mNameCollator = Collator.getInstance();
+
+ @Override
+ public int compare(City c1, City c2) {
+ int result = Integer.compare(c1.getIndex(), c2.getIndex());
+
+ if (result == 0) {
+ result = mNameCollator.compare(c1.getIndexString(), c2.getIndexString());
+ }
+
+ return result;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/CityDAO.java b/src/com/android/deskclock/data/CityDAO.java
new file mode 100644
index 0000000..544bc29
--- /dev/null
+++ b/src/com/android/deskclock/data/CityDAO.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.preference.PreferenceManager;
+import android.support.annotation.VisibleForTesting;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * This class encapsulates the transfer of data between {@link City} domain objects and their
+ * permanent storage in {@link Resources} and {@link SharedPreferences}.
+ */
+final class CityDAO {
+
+ // Regex to match natural index values when parsing city names.
+ private static final Pattern INDEX_REGEX = Pattern.compile("\\d+");
+
+ // Key to a preference that stores the number of selected cities.
+ private static final String NUMBER_OF_CITIES = "number_of_cities";
+
+ // Prefix for a key to a preference that stores the id of a selected city.
+ private static final String CITY_ID = "city_id_";
+
+ // Lazily instantiated and cached for the life of the application.
+ private static SharedPreferences sPrefs;
+
+ private CityDAO() {}
+
+ /**
+ * @param cityMap maps city ids to city instances
+ * @return the list of city ids selected for display by the user
+ */
+ public static List<City> getSelectedCities(Context context, Map<String, City> cityMap) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final int size = prefs.getInt(NUMBER_OF_CITIES, 0);
+ final List<City> selectedCities = new ArrayList<>(size);
+
+ for (int i = 0; i < size; i++) {
+ final String id = prefs.getString(CITY_ID + i, null);
+ final City city = cityMap.get(id);
+ if (city != null) {
+ selectedCities.add(city);
+ }
+ }
+
+ return selectedCities;
+ }
+
+ /**
+ * @param cities the collection of cities selected for display by the user
+ */
+ public static void setSelectedCities(Context context, Collection<City> cities) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final SharedPreferences.Editor editor = prefs.edit();
+ editor.putInt(NUMBER_OF_CITIES, cities.size());
+
+ int count = 0;
+ for (City city : cities) {
+ editor.putString(CITY_ID + count, city.getId());
+ count++;
+ }
+
+ editor.apply();
+ }
+
+ /**
+ * @return the domain of cities from which the user may choose a world clock
+ */
+ public static Map<String, City> getCities(Context context) {
+ final Resources resources = context.getResources();
+ final String[] ids = resources.getStringArray(R.array.cities_id);
+ final String[] names = resources.getStringArray(R.array.cities_names);
+ final String[] timezones = resources.getStringArray(R.array.cities_tz);
+
+ if (ids.length != names.length) {
+ final String locale = Locale.getDefault().toString();
+ final String format = "id count (%d) != name count (%d) for locale %s";
+ final String message = String.format(format, ids.length, names.length, locale);
+ throw new IllegalStateException(message);
+ }
+
+ if (ids.length != timezones.length) {
+ final String locale = Locale.getDefault().toString();
+ final String format = "id count (%d) != timezone count (%d) for locale %s";
+ final String message = String.format(format, ids.length, timezones.length, locale);
+ throw new IllegalStateException(message);
+ }
+
+ final Map<String, City> cities = new ArrayMap<>(ids.length);
+ for (int i = 0; i < ids.length; i++) {
+ final String id = ids[i];
+ if ("C0".equals(id)) {
+ continue;
+ }
+ cities.put(id, createCity(id, names[i], timezones[i]));
+ }
+ return Collections.unmodifiableMap(cities);
+ }
+
+ /**
+ * @param id unique identifier for city
+ * @param formattedName "[index string]=[name]" or "[index string]=[name]:[phonetic name]",
+ * If [index string] is empty, we use the first character of name as index,
+ * If phonetic name is empty, we use the name itself as phonetic.
+ * @param timeZoneId identifies the timezone in which the city is located
+ */
+ @VisibleForTesting
+ static City createCity(String id, String formattedName, String timeZoneId) {
+ final String[] parts = formattedName.split("[=:]");
+ final String name = parts[1];
+ // Extract index string from input, use the first character of city name as index string
+ // if it's not explicitly provided.
+ final String indexString = TextUtils.isEmpty(parts[0])
+ ? String.valueOf(name.charAt(0)) : parts[0];
+ final String phoneticName = parts.length == 3 ? parts[2] : name;
+
+ final Matcher matcher = INDEX_REGEX.matcher(indexString);
+ final int index = matcher.find() ? Integer.parseInt(matcher.group()) : -1;
+
+ return new City(id, index, indexString, name, phoneticName, timeZoneId);
+ }
+
+ private static SharedPreferences getSharedPreferences(Context context) {
+ if (sPrefs == null) {
+ sPrefs = Utils.getDefaultSharedPreferences(context.getApplicationContext());
+ }
+
+ return sPrefs;
+ }
+}
diff --git a/src/com/android/deskclock/data/CityModel.java b/src/com/android/deskclock/data/CityModel.java
new file mode 100644
index 0000000..5358672
--- /dev/null
+++ b/src/com/android/deskclock/data/CityModel.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.preference.PreferenceManager;
+
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+import com.android.deskclock.data.DataModel.CitySort;
+import com.android.deskclock.settings.SettingsActivity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TimeZone;
+
+/**
+ * All {@link City} data is accessed via this model.
+ */
+final class CityModel {
+
+ private final Context mContext;
+
+ /** The model from which settings are fetched. */
+ private final SettingsModel mSettingsModel;
+
+ /**
+ * Retain a hard reference to the shared preference observer to prevent it from being garbage
+ * collected. See {@link SharedPreferences#registerOnSharedPreferenceChangeListener} for detail.
+ */
+ private final OnSharedPreferenceChangeListener mPreferenceListener = new PreferenceListener();
+
+ /** Clears data structures containing data that is locale-sensitive. */
+ private final BroadcastReceiver mLocaleChangedReceiver = new LocaleChangedReceiver();
+
+ /** Maps city ID to city instance. */
+ private Map<String, City> mCityMap;
+
+ /** List of city instances in display order. */
+ private List<City> mAllCities;
+
+ /** List of selected city instances in display order. */
+ private List<City> mSelectedCities;
+
+ /** List of unselected city instances in display order. */
+ private List<City> mUnselectedCities;
+
+ /** A city instance representing the home timezone of the user. */
+ private City mHomeCity;
+
+ CityModel(Context context, SettingsModel settingsModel) {
+ mContext = context;
+ mSettingsModel = settingsModel;
+
+ // Clear caches affected by locale when locale changes.
+ final IntentFilter localeBroadcastFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
+ mContext.registerReceiver(mLocaleChangedReceiver, localeBroadcastFilter);
+
+ // Clear caches affected by preferences when preferences change.
+ final SharedPreferences prefs = Utils.getDefaultSharedPreferences(mContext);
+ prefs.registerOnSharedPreferenceChangeListener(mPreferenceListener);
+ }
+
+ /**
+ * @return a list of all cities in their display order
+ */
+ List<City> getAllCities() {
+ if (mAllCities == null) {
+ // Create a set of selections to identify the unselected cities.
+ final List<City> selected = new ArrayList<>(getSelectedCities());
+
+ // Sort the selected cities alphabetically by name.
+ Collections.sort(selected, new City.NameComparator());
+
+ // Combine selected and unselected cities into a single list.
+ final List<City> allCities = new ArrayList<>(getCityMap().size());
+ allCities.addAll(selected);
+ allCities.addAll(getUnselectedCities());
+ mAllCities = Collections.unmodifiableList(allCities);
+ }
+
+ return mAllCities;
+ }
+
+ /**
+ * @param cityName the case-insensitive city name to search for
+ * @return the city with the given {@code cityName}; {@code null} if no such city exists
+ */
+ City getCity(String cityName) {
+ cityName = cityName.toUpperCase();
+
+ for (City city : getAllCities()) {
+ if (cityName.equals(city.getNameUpperCase())) {
+ return city;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * @return a city representing the user's home timezone
+ */
+ City getHomeCity() {
+ if (mHomeCity == null) {
+ final String name = mContext.getString(R.string.home_label);
+ final TimeZone timeZone = mSettingsModel.getHomeTimeZone();
+ mHomeCity = new City(null, -1, null, name, name, timeZone.getID());
+ }
+
+ return mHomeCity;
+ }
+
+ /**
+ * @return a list of cities not selected for display
+ */
+ List<City> getUnselectedCities() {
+ if (mUnselectedCities == null) {
+ // Create a set of selections to identify the unselected cities.
+ final List<City> selected = new ArrayList<>(getSelectedCities());
+ final Set<City> selectedSet = Utils.newArraySet(selected);
+
+ final Collection<City> all = getCityMap().values();
+ final List<City> unselected = new ArrayList<>(all.size() - selectedSet.size());
+ for (City city : all) {
+ if (!selectedSet.contains(city)) {
+ unselected.add(city);
+ }
+ }
+
+ // Sort the unselected cities according by the user's preferred sort.
+ Collections.sort(unselected, getCitySortComparator());
+ mUnselectedCities = Collections.unmodifiableList(unselected);
+ }
+
+ return mUnselectedCities;
+ }
+
+ /**
+ * @return a list of cities selected for display
+ */
+ List<City> getSelectedCities() {
+ if (mSelectedCities == null) {
+ final List<City> selectedCities = CityDAO.getSelectedCities(mContext, getCityMap());
+ Collections.sort(selectedCities, new City.UtcOffsetComparator());
+ mSelectedCities = Collections.unmodifiableList(selectedCities);
+ }
+
+ return mSelectedCities;
+ }
+
+ /**
+ * @param cities the new collection of cities selected for display by the user
+ */
+ void setSelectedCities(Collection<City> cities) {
+ CityDAO.setSelectedCities(mContext, cities);
+
+ // Clear caches affected by this update.
+ mAllCities = null;
+ mSelectedCities = null;
+ mUnselectedCities = null;
+
+ // Broadcast the change to the selected cities for the benefit of widgets.
+ sendCitiesChangedBroadcast();
+ }
+
+ /**
+ * @return a comparator used to locate index positions
+ */
+ Comparator<City> getCityIndexComparator() {
+ final CitySort citySort = mSettingsModel.getCitySort();
+ switch (citySort) {
+ case NAME: return new City.NameIndexComparator();
+ case UTC_OFFSET: return new City.UtcOffsetIndexComparator();
+ }
+ throw new IllegalStateException("unexpected city sort: " + citySort);
+ }
+
+ /**
+ * @return the order in which cities are sorted
+ */
+ CitySort getCitySort() {
+ return mSettingsModel.getCitySort();
+ }
+
+ /**
+ * Adjust the order in which cities are sorted.
+ */
+ void toggleCitySort() {
+ mSettingsModel.toggleCitySort();
+
+ // Clear caches affected by this update.
+ mAllCities = null;
+ mUnselectedCities = null;
+ }
+
+ private Map<String, City> getCityMap() {
+ if (mCityMap == null) {
+ mCityMap = CityDAO.getCities(mContext);
+ }
+
+ return mCityMap;
+ }
+
+ private Comparator<City> getCitySortComparator() {
+ final CitySort citySort = mSettingsModel.getCitySort();
+ switch (citySort) {
+ case NAME: return new City.NameComparator();
+ case UTC_OFFSET: return new City.UtcOffsetComparator();
+ }
+ throw new IllegalStateException("unexpected city sort: " + citySort);
+ }
+
+ private void sendCitiesChangedBroadcast() {
+ mContext.sendBroadcast(new Intent(DataModel.ACTION_DIGITAL_WIDGET_CHANGED));
+ }
+
+ /**
+ * Cached information that is locale-sensitive must be cleared in response to locale changes.
+ */
+ private final class LocaleChangedReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ mCityMap = null;
+ mHomeCity = null;
+ mAllCities = null;
+ mSelectedCities = null;
+ mUnselectedCities = null;
+ }
+ }
+
+ /**
+ * This receiver is notified when shared preferences change. Cached information built on
+ * preferences must be cleared.
+ */
+ private final class PreferenceListener implements OnSharedPreferenceChangeListener {
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+ switch (key) {
+ case SettingsActivity.KEY_HOME_TZ:
+ mHomeCity = null;
+ case SettingsActivity.KEY_AUTO_HOME_CLOCK:
+ sendCitiesChangedBroadcast();
+ break;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/DataModel.java b/src/com/android/deskclock/data/DataModel.java
new file mode 100644
index 0000000..382beb3
--- /dev/null
+++ b/src/com/android/deskclock/data/DataModel.java
@@ -0,0 +1,608 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.app.Service;
+import android.content.Context;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.support.annotation.StringRes;
+
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+
+import static com.android.deskclock.Utils.enforceMainLooper;
+
+/**
+ * All application-wide data is accessible through this singleton.
+ */
+public final class DataModel {
+
+ /** Indicates the display style of clocks. */
+ public enum ClockStyle {ANALOG, DIGITAL}
+
+ /** Indicates the preferred sort order of cities. */
+ public enum CitySort {NAME, UTC_OFFSET}
+
+ public static final String ACTION_DIGITAL_WIDGET_CHANGED =
+ "com.android.deskclock.DIGITAL_WIDGET_CHANGED";
+
+ /** The single instance of this data model that exists for the life of the application. */
+ private static final DataModel sDataModel = new DataModel();
+
+ private Handler mHandler;
+
+ private Context mContext;
+
+ /** The model from which settings are fetched. */
+ private SettingsModel mSettingsModel;
+
+ /** The model from which city data are fetched. */
+ private CityModel mCityModel;
+
+ /** The model from which timer data are fetched. */
+ private TimerModel mTimerModel;
+
+ /** The model from which alarm data are fetched. */
+ private AlarmModel mAlarmModel;
+
+ /** The model from which stopwatch data are fetched. */
+ private StopwatchModel mStopwatchModel;
+
+ /** The model from which notification data are fetched. */
+ private NotificationModel mNotificationModel;
+
+ public static DataModel getDataModel() {
+ return sDataModel;
+ }
+
+ private DataModel() {}
+
+ /**
+ * The context may be set precisely once during the application life.
+ */
+ public void setContext(Context context) {
+ if (mContext != null) {
+ throw new IllegalStateException("context has already been set");
+ }
+ mContext = context.getApplicationContext();
+
+ mSettingsModel = new SettingsModel(mContext);
+ mNotificationModel = new NotificationModel();
+ mCityModel = new CityModel(mContext, mSettingsModel);
+ mAlarmModel = new AlarmModel(mContext, mSettingsModel);
+ mStopwatchModel = new StopwatchModel(mContext, mNotificationModel);
+ mTimerModel = new TimerModel(mContext, mSettingsModel, mNotificationModel);
+ }
+
+ /**
+ * Posts a runnable to the main thread and blocks until the runnable executes. Used to access
+ * the data model from the main thread.
+ */
+ public void run(Runnable runnable) {
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ runnable.run();
+ return;
+ }
+
+ final ExecutedRunnable er = new ExecutedRunnable(runnable);
+ getHandler().post(er);
+
+ // Wait for the data to arrive, if it has not.
+ synchronized (er) {
+ if (!er.isExecuted()) {
+ try {
+ er.wait();
+ } catch (InterruptedException ignored) {
+ // ignore
+ }
+ }
+ }
+ }
+
+ /**
+ * @return a handler associated with the main thread
+ */
+ private synchronized Handler getHandler() {
+ if (mHandler == null) {
+ mHandler = new Handler(Looper.getMainLooper());
+ }
+ return mHandler;
+ }
+
+ //
+ // Application
+ //
+
+ /**
+ * @param inForeground {@code true} to indicate the application is open in the foreground
+ */
+ public void setApplicationInForeground(boolean inForeground) {
+ enforceMainLooper();
+
+ if (mNotificationModel.isApplicationInForeground() != inForeground) {
+ mNotificationModel.setApplicationInForeground(inForeground);
+
+ // Refresh all notifications in response to a change in app open state.
+ mTimerModel.updateNotification();
+ mStopwatchModel.updateNotification();
+ }
+ }
+
+ /**
+ * @return {@code true} when the application is open in the foreground; {@code false} otherwise
+ */
+ public boolean isApplicationInForeground() {
+ return mNotificationModel.isApplicationInForeground();
+ }
+
+ /**
+ * Called when the notifications may be stale or absent from the notification manager and must
+ * be rebuilt. e.g. after upgrading the application
+ */
+ public void updateAllNotifications() {
+ mTimerModel.updateNotification();
+ mStopwatchModel.updateNotification();
+ }
+
+ //
+ // Cities
+ //
+
+ /**
+ * @return a list of all cities in their display order
+ */
+ public List<City> getAllCities() {
+ enforceMainLooper();
+ return mCityModel.getAllCities();
+ }
+
+ /**
+ * @param cityName the case-insensitive city name to search for
+ * @return the city with the given {@code cityName}; {@code null} if no such city exists
+ */
+ public City getCity(String cityName) {
+ enforceMainLooper();
+ return mCityModel.getCity(cityName);
+ }
+
+ /**
+ * @return a city representing the user's home timezone
+ */
+ public City getHomeCity() {
+ enforceMainLooper();
+ return mCityModel.getHomeCity();
+ }
+
+ /**
+ * @return a list of cities not selected for display
+ */
+ public List<City> getUnselectedCities() {
+ enforceMainLooper();
+ return mCityModel.getUnselectedCities();
+ }
+
+ /**
+ * @return a list of cities selected for display
+ */
+ public List<City> getSelectedCities() {
+ enforceMainLooper();
+ return mCityModel.getSelectedCities();
+ }
+
+ /**
+ * @param cities the new collection of cities selected for display by the user
+ */
+ public void setSelectedCities(Collection<City> cities) {
+ enforceMainLooper();
+ mCityModel.setSelectedCities(cities);
+ }
+
+ /**
+ * @return a comparator used to locate index positions
+ */
+ public Comparator<City> getCityIndexComparator() {
+ enforceMainLooper();
+ return mCityModel.getCityIndexComparator();
+ }
+
+ /**
+ * @return the order in which cities are sorted
+ */
+ public CitySort getCitySort() {
+ enforceMainLooper();
+ return mCityModel.getCitySort();
+ }
+
+ /**
+ * Adjust the order in which cities are sorted.
+ */
+ public void toggleCitySort() {
+ enforceMainLooper();
+ mCityModel.toggleCitySort();
+ }
+
+ //
+ // Timers
+ //
+
+ /**
+ * @param timerListener to be notified when timers are added, updated and removed
+ */
+ public void addTimerListener(TimerListener timerListener) {
+ enforceMainLooper();
+ mTimerModel.addTimerListener(timerListener);
+ }
+
+ /**
+ * @param timerListener to no longer be notified when timers are added, updated and removed
+ */
+ public void removeTimerListener(TimerListener timerListener) {
+ enforceMainLooper();
+ mTimerModel.removeTimerListener(timerListener);
+ }
+
+ /**
+ * @return a list of timers for display
+ */
+ public List<Timer> getTimers() {
+ enforceMainLooper();
+ return mTimerModel.getTimers();
+ }
+
+ /**
+ * @return a list of expired timers for display
+ */
+ public List<Timer> getExpiredTimers() {
+ enforceMainLooper();
+ return mTimerModel.getExpiredTimers();
+ }
+
+ /**
+ * @param timerId identifies the timer to return
+ * @return the timer with the given {@code timerId}
+ */
+ public Timer getTimer(int timerId) {
+ enforceMainLooper();
+ return mTimerModel.getTimer(timerId);
+ }
+
+ /**
+ * @return the timer that last expired and is still expired now; {@code null} if no timers are
+ * expired
+ */
+ public Timer getMostRecentExpiredTimer() {
+ enforceMainLooper();
+ return mTimerModel.getMostRecentExpiredTimer();
+ }
+
+ /**
+ * @param length the length of the timer in milliseconds
+ * @param label describes the purpose of the timer
+ * @param deleteAfterUse {@code true} indicates the timer should be deleted when it is reset
+ * @return the newly added timer
+ */
+ public Timer addTimer(long length, String label, boolean deleteAfterUse) {
+ enforceMainLooper();
+ return mTimerModel.addTimer(length, label, deleteAfterUse);
+ }
+
+ /**
+ * @param timer the timer to be removed
+ */
+ public void removeTimer(Timer timer) {
+ enforceMainLooper();
+ mTimerModel.removeTimer(timer);
+ }
+
+ /**
+ * @param timer the timer to be started
+ */
+ public void startTimer(Timer timer) {
+ enforceMainLooper();
+ mTimerModel.updateTimer(timer.start());
+ }
+
+ /**
+ * @param timer the timer to be paused
+ */
+ public void pauseTimer(Timer timer) {
+ enforceMainLooper();
+ mTimerModel.updateTimer(timer.pause());
+ }
+
+ /**
+ * @param service used to start foreground notifications for expired timers
+ * @param timer the timer to be expired
+ */
+ public void expireTimer(Service service, Timer timer) {
+ enforceMainLooper();
+ mTimerModel.expireTimer(service, timer);
+ }
+
+ /**
+ * If the given {@code timer} is expired and marked for deletion after use then this method
+ * removes the the timer. The timer is otherwise transitioned to the reset state and continues
+ * to exist.
+ *
+ * @param timer the timer to be reset
+ * @param eventLabelId the label of the timer event to send; 0 if no event should be sent
+ */
+ public void resetOrDeleteTimer(Timer timer, @StringRes int eventLabelId) {
+ enforceMainLooper();
+ mTimerModel.resetOrDeleteTimer(timer, eventLabelId);
+ }
+
+ /**
+ * Resets all timers.
+ *
+ * @param eventLabelId the label of the timer event to send; 0 if no event should be sent
+ */
+ public void resetTimers(@StringRes int eventLabelId) {
+ enforceMainLooper();
+ mTimerModel.resetTimers(eventLabelId);
+ }
+
+ /**
+ * Resets all expired timers.
+ *
+ * @param eventLabelId the label of the timer event to send; 0 if no event should be sent
+ */
+ public void resetExpiredTimers(@StringRes int eventLabelId) {
+ enforceMainLooper();
+ mTimerModel.resetExpiredTimers(eventLabelId);
+ }
+
+ /**
+ * Resets all unexpired timers.
+ *
+ * @param eventLabelId the label of the timer event to send; 0 if no event should be sent
+ */
+ public void resetUnexpiredTimers(@StringRes int eventLabelId) {
+ enforceMainLooper();
+ mTimerModel.resetUnexpiredTimers(eventLabelId);
+ }
+
+ /**
+ * @param timer the timer to which a minute should be added to the remaining time
+ */
+ public void addTimerMinute(Timer timer) {
+ enforceMainLooper();
+ mTimerModel.updateTimer(timer.addMinute());
+ }
+
+ /**
+ * @param timer the timer to which the new {@code label} belongs
+ * @param label the new label to store for the {@code timer}
+ */
+ public void setTimerLabel(Timer timer, String label) {
+ enforceMainLooper();
+ mTimerModel.updateTimer(timer.setLabel(label));
+ }
+
+ /**
+ * Updates the timer notifications to be current.
+ */
+ public void updateTimerNotification() {
+ enforceMainLooper();
+ mTimerModel.updateNotification();
+ }
+
+ /**
+ * @return the uri of the default ringtone to play for all timers when no user selection exists
+ */
+ public Uri getDefaultTimerRingtoneUri() {
+ enforceMainLooper();
+ return mTimerModel.getDefaultTimerRingtoneUri();
+ }
+
+ /**
+ * @return {@code true} iff the ringtone to play for all timers is the silent ringtone
+ */
+ public boolean isTimerRingtoneSilent() {
+ enforceMainLooper();
+ return mTimerModel.isTimerRingtoneSilent();
+ }
+
+ /**
+ * @return the uri of the ringtone to play for all timers
+ */
+ public Uri getTimerRingtoneUri() {
+ enforceMainLooper();
+ return mTimerModel.getTimerRingtoneUri();
+ }
+
+ /**
+ * @return the title of the ringtone that is played for all timers
+ */
+ public String getTimerRingtoneTitle() {
+ enforceMainLooper();
+ return mTimerModel.getTimerRingtoneTitle();
+ }
+
+ //
+ // Alarms
+ //
+
+ /**
+ * @return the uri of the ringtone to which all new alarms default
+ */
+ public Uri getDefaultAlarmRingtoneUri() {
+ enforceMainLooper();
+ return mAlarmModel.getDefaultAlarmRingtoneUri();
+ }
+
+ /**
+ * @param uri the uri of the ringtone to which future new alarms will default
+ */
+ public void setDefaultAlarmRingtoneUri(Uri uri) {
+ enforceMainLooper();
+ mAlarmModel.setDefaultAlarmRingtoneUri(uri);
+ }
+
+ /**
+ * @param uri the uri of a ringtone
+ * @return the title of the ringtone with the {@code uri}; {@code null} if it cannot be fetched
+ */
+ public String getAlarmRingtoneTitle(Uri uri) {
+ enforceMainLooper();
+ return mAlarmModel.getAlarmRingtoneTitle(uri);
+ }
+
+ //
+ // Stopwatch
+ //
+
+ /**
+ * @return the current state of the stopwatch
+ */
+ public Stopwatch getStopwatch() {
+ enforceMainLooper();
+ return mStopwatchModel.getStopwatch();
+ }
+
+ /**
+ * @return the stopwatch after being started
+ */
+ public Stopwatch startStopwatch() {
+ enforceMainLooper();
+ return mStopwatchModel.setStopwatch(getStopwatch().start());
+ }
+
+ /**
+ * @return the stopwatch after being paused
+ */
+ public Stopwatch pauseStopwatch() {
+ enforceMainLooper();
+ return mStopwatchModel.setStopwatch(getStopwatch().pause());
+ }
+
+ /**
+ * @return the stopwatch after being reset
+ */
+ public Stopwatch resetStopwatch() {
+ enforceMainLooper();
+ return mStopwatchModel.setStopwatch(getStopwatch().reset());
+ }
+
+ /**
+ * @return the laps recorded for this stopwatch
+ */
+ public List<Lap> getLaps() {
+ enforceMainLooper();
+ return mStopwatchModel.getLaps();
+ }
+
+ /**
+ * @return a newly recorded lap completed now; {@code null} if no more laps can be added
+ */
+ public Lap addLap() {
+ enforceMainLooper();
+ return mStopwatchModel.addLap();
+ }
+
+ /**
+ * Clears the laps recorded for this stopwatch.
+ */
+ public void clearLaps() {
+ enforceMainLooper();
+ mStopwatchModel.clearLaps();
+ }
+
+ /**
+ * @return {@code true} iff more laps can be recorded
+ */
+ public boolean canAddMoreLaps() {
+ enforceMainLooper();
+ return mStopwatchModel.canAddMoreLaps();
+ }
+
+ /**
+ * @return the longest lap time of all recorded laps and the current lap
+ */
+ public long getLongestLapTime() {
+ enforceMainLooper();
+ return mStopwatchModel.getLongestLapTime();
+ }
+
+ /**
+ * @param time a point in time after the end of the last lap
+ * @return the elapsed time between the given {@code time} and the end of the previous lap
+ */
+ public long getCurrentLapTime(long time) {
+ enforceMainLooper();
+ return mStopwatchModel.getCurrentLapTime(time);
+ }
+
+ //
+ // Settings
+ //
+
+ /**
+ * @return the style of clock to display in the clock application
+ */
+ public ClockStyle getClockStyle() {
+ enforceMainLooper();
+ return mSettingsModel.getClockStyle();
+ }
+
+ /**
+ * @return the style of clock to display in the clock screensaver
+ */
+ public ClockStyle getScreensaverClockStyle() {
+ enforceMainLooper();
+ return mSettingsModel.getScreensaverClockStyle();
+ }
+
+ /**
+ * @return {@code true} if the users wants to automatically show a clock for their home timezone
+ * when they have travelled outside of that timezone
+ */
+ public boolean getShowHomeClock() {
+ enforceMainLooper();
+ return mSettingsModel.getShowHomeClock();
+ }
+
+ /**
+ * Used to execute a delegate runnable and track its completion.
+ */
+ private static class ExecutedRunnable implements Runnable {
+
+ private final Runnable mDelegate;
+ private boolean mExecuted;
+
+ private ExecutedRunnable(Runnable delegate) {
+ this.mDelegate = delegate;
+ }
+
+ @Override
+ public void run() {
+ mDelegate.run();
+
+ synchronized (this) {
+ mExecuted = true;
+ notifyAll();
+ }
+ }
+
+ private boolean isExecuted() {
+ return mExecuted;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/Lap.java b/src/com/android/deskclock/data/Lap.java
new file mode 100644
index 0000000..1c42fd8
--- /dev/null
+++ b/src/com/android/deskclock/data/Lap.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+/**
+ * A read-only domain object representing a stopwatch lap.
+ */
+public final class Lap {
+
+ /** The 1-based position of the lap. */
+ private final int mLapNumber;
+
+ /** Elapsed time in ms since the lap was last started. */
+ private final long mLapTime;
+
+ /** Elapsed time in ms accumulated for all laps up to and including this one. */
+ private final long mAccumulatedTime;
+
+ Lap(int lapNumber, long lapTime, long accumulatedTime) {
+ mLapNumber = lapNumber;
+ mLapTime = lapTime;
+ mAccumulatedTime = accumulatedTime;
+ }
+
+ public int getLapNumber() { return mLapNumber; }
+ public long getLapTime() { return mLapTime; }
+ public long getAccumulatedTime() { return mAccumulatedTime; }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/NotificationModel.java b/src/com/android/deskclock/data/NotificationModel.java
new file mode 100644
index 0000000..30393e0
--- /dev/null
+++ b/src/com/android/deskclock/data/NotificationModel.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+/**
+ * Data that must be coordinated across all notifications is accessed via this model.
+ */
+final class NotificationModel {
+
+ private boolean mApplicationInForeground;
+
+ /**
+ * @param inForeground {@code true} to indicate the application is open in the foreground
+ */
+ void setApplicationInForeground(boolean inForeground) {
+ mApplicationInForeground = inForeground;
+ }
+
+ /**
+ * @return {@code true} while the application is open in the foreground
+ */
+ boolean isApplicationInForeground() {
+ return mApplicationInForeground;
+ }
+
+ /**
+ * @return a value that identifies the stopwatch notification
+ */
+ int getStopwatchNotificationId() {
+ return Integer.MAX_VALUE - 1;
+ }
+
+ /**
+ * @return a value that identifies the notification for running/paused timers
+ */
+ int getUnexpiredTimerNotificationId() {
+ return Integer.MAX_VALUE - 2;
+ }
+
+ /**
+ * @return a value that identifies the notification for expired timers
+ */
+ int getExpiredTimerNotificationId() {
+ return Integer.MAX_VALUE - 3;
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/SettingsDAO.java b/src/com/android/deskclock/data/SettingsDAO.java
new file mode 100644
index 0000000..cb18c5a
--- /dev/null
+++ b/src/com/android/deskclock/data/SettingsDAO.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.preference.PreferenceManager;
+
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+import com.android.deskclock.data.DataModel.CitySort;
+import com.android.deskclock.data.DataModel.ClockStyle;
+import com.android.deskclock.settings.ScreensaverSettingsActivity;
+import com.android.deskclock.settings.SettingsActivity;
+
+import java.util.Locale;
+import java.util.TimeZone;
+
+/**
+ * This class encapsulates the storage of application preferences in {@link SharedPreferences}.
+ */
+final class SettingsDAO {
+
+ private static final String KEY_SORT_PREFERENCE = "sort_preference";
+ private static final String KEY_DEFAULT_ALARM_RINGTONE_URI = "default_alarm_ringtone_uri";
+
+ // Lazily instantiated and cached for the life of the application.
+ private static SharedPreferences sPrefs;
+
+ private SettingsDAO() {}
+
+ /**
+ * @return an enumerated value indicating the order in which cities are ordered
+ */
+ static CitySort getCitySort(Context context) {
+ final int defaultSortOrdinal = CitySort.NAME.ordinal();
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final int citySortOrdinal = prefs.getInt(KEY_SORT_PREFERENCE, defaultSortOrdinal);
+ return CitySort.values()[citySortOrdinal];
+ }
+
+ /**
+ * Adjust the sort order of cities.
+ */
+ static void toggleCitySort(Context context) {
+ final CitySort oldSort = getCitySort(context);
+ final CitySort newSort = oldSort == CitySort.NAME ? CitySort.UTC_OFFSET : CitySort.NAME;
+ final SharedPreferences prefs = getSharedPreferences(context);
+ prefs.edit().putInt(KEY_SORT_PREFERENCE, newSort.ordinal()).apply();
+ }
+
+ /**
+ * @return {@code true} if a clock for the user's home timezone should be automatically
+ * displayed when it doesn't match the current timezone
+ */
+ static boolean getAutoShowHomeClock(Context context) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ return prefs.getBoolean(SettingsActivity.KEY_AUTO_HOME_CLOCK, false);
+ }
+
+ /**
+ * @return the user's home timezone
+ */
+ static TimeZone getHomeTimeZone(Context context) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final String defaultTimeZoneId = TimeZone.getDefault().getID();
+ final String timeZoneId = prefs.getString(SettingsActivity.KEY_HOME_TZ, defaultTimeZoneId);
+ return TimeZone.getTimeZone(timeZoneId);
+ }
+
+ /**
+ * Sets the user's home timezone to the current system timezone if no home timezone is yet set.
+ *
+ * @param homeTimeZone the timezone to set as the user's home timezone if necessary
+ */
+ static void setDefaultHomeTimeZone(Context context, TimeZone homeTimeZone) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final String homeTimeZoneId = prefs.getString(SettingsActivity.KEY_HOME_TZ, null);
+ if (homeTimeZoneId == null) {
+ prefs.edit().putString(SettingsActivity.KEY_HOME_TZ, homeTimeZone.getID()).apply();
+ }
+ }
+
+ /**
+ * @return a value indicating whether analog or digital clocks are displayed in the app
+ */
+ static ClockStyle getClockStyle(Context context) {
+ return getClockStyle(context, SettingsActivity.KEY_CLOCK_STYLE);
+ }
+
+ /**
+ * @return a value indicating whether analog or digital clocks are displayed on the screensaver
+ */
+ static ClockStyle getScreensaverClockStyle(Context context) {
+ return getClockStyle(context, ScreensaverSettingsActivity.KEY_CLOCK_STYLE);
+ }
+
+ /**
+ * @return the uri of the selected ringtone or the {@code defaultUri} if no explicit selection
+ * has yet been made
+ */
+ static Uri getTimerRingtoneUri(Context context, Uri defaultUri) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final String uriString = prefs.getString(SettingsActivity.KEY_TIMER_RINGTONE, null);
+ return uriString == null ? defaultUri : Uri.parse(uriString);
+ }
+
+ /**
+ * @return the uri of the selected ringtone or the {@code defaultUri} if no explicit selection
+ * has yet been made
+ */
+ static Uri getDefaultAlarmRingtoneUri(Context context, Uri defaultUri) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final String uriString = prefs.getString(KEY_DEFAULT_ALARM_RINGTONE_URI, null);
+ return uriString == null ? defaultUri : Uri.parse(uriString);
+ }
+
+ /**
+ * @param uri identifies the default ringtone to play for new alarms
+ */
+ static void setDefaultAlarmRingtoneUri(Context context, Uri uri) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ prefs.edit().putString(KEY_DEFAULT_ALARM_RINGTONE_URI, uri.toString()).apply();
+ }
+
+ private static ClockStyle getClockStyle(Context context, String prefKey) {
+ final String defaultStyle = context.getString(R.string.default_clock_style);
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final String clockStyle = prefs.getString(prefKey, defaultStyle);
+ // Use hardcoded locale to perform toUpperCase, because in some languages toUpperCase adds
+ // accent to character, which breaks the enum conversion.
+ return ClockStyle.valueOf(clockStyle.toUpperCase(Locale.US));
+ }
+
+ private static SharedPreferences getSharedPreferences(Context context) {
+ if (sPrefs == null) {
+ sPrefs = Utils.getDefaultSharedPreferences(context.getApplicationContext());
+ }
+
+ return sPrefs;
+ }
+}
diff --git a/src/com/android/deskclock/data/SettingsModel.java b/src/com/android/deskclock/data/SettingsModel.java
new file mode 100644
index 0000000..224f190
--- /dev/null
+++ b/src/com/android/deskclock/data/SettingsModel.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.content.Context;
+import android.net.Uri;
+import android.provider.Settings;
+
+import com.android.deskclock.R;
+import com.android.deskclock.data.DataModel.CitySort;
+import com.android.deskclock.data.DataModel.ClockStyle;
+
+import java.util.TimeZone;
+
+/**
+ * All settings data is accessed via this model.
+ */
+final class SettingsModel {
+
+ private final Context mContext;
+
+ /** The uri of the default ringtone to use for timers until the user explicitly chooses one. */
+ private Uri mDefaultTimerRingtoneUri;
+
+ SettingsModel(Context context) {
+ mContext = context;
+
+ // Set the user's default home timezone if one has not yet been chosen.
+ SettingsDAO.setDefaultHomeTimeZone(mContext, TimeZone.getDefault());
+ }
+
+ CitySort getCitySort() {
+ return SettingsDAO.getCitySort(mContext);
+ }
+
+ void toggleCitySort() {
+ SettingsDAO.toggleCitySort(mContext);
+ }
+
+ TimeZone getHomeTimeZone() {
+ return SettingsDAO.getHomeTimeZone(mContext);
+ }
+
+ ClockStyle getClockStyle() {
+ return SettingsDAO.getClockStyle(mContext);
+ }
+
+ ClockStyle getScreensaverClockStyle() {
+ return SettingsDAO.getScreensaverClockStyle(mContext);
+ }
+
+ boolean getShowHomeClock() {
+ if (!SettingsDAO.getAutoShowHomeClock(mContext)) {
+ return false;
+ }
+
+ // Show the home clock if the current time and home time differ.
+ // (By using UTC offset for this comparison the various DST rules are considered)
+ final TimeZone homeTimeZone = SettingsDAO.getHomeTimeZone(mContext);
+ final long now = System.currentTimeMillis();
+ return homeTimeZone.getOffset(now) != TimeZone.getDefault().getOffset(now);
+ }
+
+ Uri getDefaultTimerRingtoneUri() {
+ if (mDefaultTimerRingtoneUri == null) {
+ final String packageName = mContext.getPackageName();
+ final int resId = R.raw.timer_expire;
+ final String uriString = String.format("android.resource://%s/%d", packageName, resId);
+ mDefaultTimerRingtoneUri = Uri.parse(uriString);
+ }
+
+ return mDefaultTimerRingtoneUri;
+ }
+
+ Uri getTimerRingtoneUri() {
+ return SettingsDAO.getTimerRingtoneUri(mContext, getDefaultTimerRingtoneUri());
+ }
+
+ Uri getDefaultAlarmRingtoneUri() {
+ return SettingsDAO.getDefaultAlarmRingtoneUri(mContext,
+ Settings.System.DEFAULT_ALARM_ALERT_URI);
+ }
+
+ void setDefaultAlarmRingtoneUri(Uri uri) {
+ SettingsDAO.setDefaultAlarmRingtoneUri(mContext, uri);
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/Stopwatch.java b/src/com/android/deskclock/data/Stopwatch.java
new file mode 100644
index 0000000..a08cc1f
--- /dev/null
+++ b/src/com/android/deskclock/data/Stopwatch.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.os.SystemClock;
+
+import static com.android.deskclock.data.Stopwatch.State.PAUSED;
+import static com.android.deskclock.data.Stopwatch.State.RESET;
+import static com.android.deskclock.data.Stopwatch.State.RUNNING;
+
+/**
+ * A read-only domain object representing a stopwatch.
+ */
+public final class Stopwatch {
+
+ public enum State { RESET, RUNNING, PAUSED }
+
+ /** The single, immutable instance of a reset stopwatch. */
+ private static final Stopwatch RESET_STOPWATCH = new Stopwatch(RESET, Long.MIN_VALUE, 0);
+
+ /** Current state of this stopwatch. */
+ private final State mState;
+
+ /** Elapsed time in ms the stopwatch was last started; {@link Long#MIN_VALUE} if not running. */
+ private final long mLastStartTime;
+
+ /** Elapsed time in ms this stopwatch has accumulated while running. */
+ private final long mAccumulatedTime;
+
+ Stopwatch(State state, long lastStartTime, long accumulatedTime) {
+ mState = state;
+ mLastStartTime = lastStartTime;
+ mAccumulatedTime = accumulatedTime;
+ }
+
+ public State getState() { return mState; }
+ public long getLastStartTime() { return mLastStartTime; }
+ public boolean isReset() { return mState == RESET; }
+ public boolean isPaused() { return mState == PAUSED; }
+ public boolean isRunning() { return mState == RUNNING; }
+
+ /**
+ * @return the total amount of time accumulated up to this moment
+ */
+ public long getTotalTime() {
+ if (mState != RUNNING) {
+ return mAccumulatedTime;
+ }
+
+ // In practice, "now" can be any value due to device reboots. When the real-time clock
+ // is reset, there is no more guarantee that "now" falls after the last start time. To
+ // ensure the stopwatch is monotonically increasing, normalize negative time segments to 0,
+ final long timeSinceStart = now() - mLastStartTime;
+ return mAccumulatedTime + Math.max(0, timeSinceStart);
+ }
+
+ /**
+ * @return the amount of time accumulated up to the last time the stopwatch was started
+ */
+ long getAccumulatedTime() {
+ return mAccumulatedTime;
+ }
+
+ /**
+ * @return a copy of this stopwatch that is running
+ */
+ Stopwatch start() {
+ if (mState == RUNNING) {
+ return this;
+ }
+
+ return new Stopwatch(RUNNING, now(), getTotalTime());
+ }
+
+ /**
+ * @return a copy of this stopwatch that is paused
+ */
+ Stopwatch pause() {
+ if (mState != RUNNING) {
+ return this;
+ }
+
+ return new Stopwatch(PAUSED, Long.MIN_VALUE, getTotalTime());
+ }
+
+ /**
+ * @return a copy of this stopwatch that is reset
+ */
+ Stopwatch reset() {
+ return RESET_STOPWATCH;
+ }
+
+ private static long now() {
+ return SystemClock.elapsedRealtime();
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/StopwatchDAO.java b/src/com/android/deskclock/data/StopwatchDAO.java
new file mode 100644
index 0000000..bd40712
--- /dev/null
+++ b/src/com/android/deskclock/data/StopwatchDAO.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+
+import com.android.deskclock.Utils;
+import com.android.deskclock.data.Stopwatch.State;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static com.android.deskclock.data.Stopwatch.State.RESET;
+
+/**
+ * This class encapsulates the transfer of data between {@link Stopwatch} and {@link Lap} domain
+ * objects and their permanent storage in {@link SharedPreferences}.
+ */
+final class StopwatchDAO {
+
+ // Key to a preference that stores the state of the stopwatch.
+ private static final String STATE = "sw_state";
+
+ // Key to a preference that stores the last start time of the stopwatch.
+ private static final String LAST_START_TIME = "sw_start_time";
+
+ // Key to a preference that stores the accumulated elapsed time of the stopwatch.
+ private static final String ACCUMULATED_TIME = "sw_accum_time";
+
+ // Key to a preference that stores the number of recorded laps.
+ private static final String LAP_COUNT = "sw_lap_num";
+
+ // Prefix for a key to a preference that stores accumulated time at the end of a particular lap.
+ private static final String LAP_ACCUMULATED_TIME = "sw_lap_time_";
+
+ // Lazily instantiated and cached for the life of the application.
+ private static SharedPreferences sPrefs;
+
+ private StopwatchDAO() {}
+
+ /**
+ * @return the stopwatch from permanent storage or a reset stopwatch if none exists
+ */
+ public static Stopwatch getStopwatch(Context context) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final int stateIndex = prefs.getInt(STATE, RESET.ordinal());
+ final State state = State.values()[stateIndex];
+ final long lastStartTime = prefs.getLong(LAST_START_TIME, Long.MIN_VALUE);
+ final long accumulatedTime = prefs.getLong(ACCUMULATED_TIME, 0);
+ return new Stopwatch(state, lastStartTime, accumulatedTime);
+ }
+
+ /**
+ * @param stopwatch the last state of the stopwatch
+ */
+ public static void setStopwatch(Context context, Stopwatch stopwatch) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final SharedPreferences.Editor editor = prefs.edit();
+
+ if (stopwatch.isReset()) {
+ editor.remove(STATE)
+ .remove(LAST_START_TIME)
+ .remove(ACCUMULATED_TIME);
+ } else {
+ editor.putInt(STATE, stopwatch.getState().ordinal())
+ .putLong(LAST_START_TIME, stopwatch.getLastStartTime())
+ .putLong(ACCUMULATED_TIME, stopwatch.getAccumulatedTime());
+ }
+
+ editor.apply();
+ }
+
+ /**
+ * @return a list of recorded laps for the stopwatch
+ */
+ public static List<Lap> getLaps(Context context) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+
+ // Prepare the container to be filled with laps.
+ final int lapCount = prefs.getInt(LAP_COUNT, 0);
+ final List<Lap> laps = new ArrayList<>(lapCount);
+
+ long prevAccumulatedTime = 0;
+
+ // Lap numbers are 1-based and so the are corresponding shared preference keys.
+ for (int lapNumber = 1; lapNumber <= lapCount; lapNumber++) {
+ // Look up the accumulated time for the lap.
+ final String lapAccumulatedTimeKey = LAP_ACCUMULATED_TIME + lapNumber;
+ final long accumulatedTime = prefs.getLong(lapAccumulatedTimeKey, 0);
+
+ // Lap time is the delta between accumulated time of this lap and prior lap.
+ final long lapTime = accumulatedTime - prevAccumulatedTime;
+
+ // Create the lap instance from the data.
+ laps.add(new Lap(lapNumber, lapTime, accumulatedTime));
+
+ // Update the accumulated time of the previous lap.
+ prevAccumulatedTime = accumulatedTime;
+ }
+
+ // Laps are stored in the order they were recorded; display order is the reverse.
+ Collections.reverse(laps);
+
+ return laps;
+ }
+
+ /**
+ * @param newLapCount the number of laps including the new lap
+ * @param accumulatedTime the amount of time accumulate by the stopwatch at the end of the lap
+ */
+ public static void addLap(Context context, int newLapCount, long accumulatedTime) {
+ getSharedPreferences(context).edit()
+ .putInt(LAP_COUNT, newLapCount)
+ .putLong(LAP_ACCUMULATED_TIME + newLapCount, accumulatedTime)
+ .apply();
+ }
+
+ /**
+ * Remove the recorded laps for the stopwatch
+ */
+ public static void clearLaps(Context context) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final SharedPreferences.Editor editor = prefs.edit();
+
+ final int lapCount = prefs.getInt(LAP_COUNT, 0);
+ for (int lapNumber = 1; lapNumber <= lapCount; lapNumber++) {
+ editor.remove(LAP_ACCUMULATED_TIME + lapNumber);
+ }
+ editor.remove(LAP_COUNT);
+
+ editor.apply();
+ }
+
+ private static SharedPreferences getSharedPreferences(Context context) {
+ if (sPrefs == null) {
+ sPrefs = Utils.getDefaultSharedPreferences(context.getApplicationContext());
+ }
+
+ return sPrefs;
+ }
+}
diff --git a/src/com/android/deskclock/data/StopwatchModel.java b/src/com/android/deskclock/data/StopwatchModel.java
new file mode 100644
index 0000000..a536c1f
--- /dev/null
+++ b/src/com/android/deskclock/data/StopwatchModel.java
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.Resources;
+import android.os.SystemClock;
+import android.support.annotation.IdRes;
+import android.support.annotation.StringRes;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.app.NotificationManagerCompat;
+import android.widget.RemoteViews;
+
+import com.android.deskclock.HandleDeskClockApiCalls;
+import com.android.deskclock.R;
+import com.android.deskclock.stopwatch.StopwatchService;
+
+import java.util.Collections;
+import java.util.List;
+
+import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;
+import static android.view.View.GONE;
+import static android.view.View.INVISIBLE;
+import static android.view.View.VISIBLE;
+
+/**
+ * All {@link Stopwatch} data is accessed via this model.
+ */
+final class StopwatchModel {
+
+ private final Context mContext;
+
+ /** The model from which notification data are fetched. */
+ private final NotificationModel mNotificationModel;
+
+ /** Used to create and destroy system notifications related to the stopwatch. */
+ private final NotificationManagerCompat mNotificationManager;
+
+ /** Update stopwatch notification when locale changes. */
+ private final BroadcastReceiver mLocaleChangedReceiver = new LocaleChangedReceiver();
+
+ /** The current state of the stopwatch. */
+ private Stopwatch mStopwatch;
+
+ /** A mutable copy of the recorded stopwatch laps. */
+ private List<Lap> mLaps;
+
+ StopwatchModel(Context context, NotificationModel notificationModel) {
+ mContext = context;
+ mNotificationModel = notificationModel;
+ mNotificationManager = NotificationManagerCompat.from(context);
+
+ // Update stopwatch notification when locale changes.
+ final IntentFilter localeBroadcastFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
+ mContext.registerReceiver(mLocaleChangedReceiver, localeBroadcastFilter);
+ }
+
+ /**
+ * @return the current state of the stopwatch
+ */
+ Stopwatch getStopwatch() {
+ if (mStopwatch == null) {
+ mStopwatch = StopwatchDAO.getStopwatch(mContext);
+ }
+
+ return mStopwatch;
+ }
+
+ /**
+ * @param stopwatch the new state of the stopwatch
+ */
+ Stopwatch setStopwatch(Stopwatch stopwatch) {
+ if (mStopwatch != stopwatch) {
+ StopwatchDAO.setStopwatch(mContext, stopwatch);
+ mStopwatch = stopwatch;
+
+ // Refresh the stopwatch notification to reflect the latest stopwatch state.
+ if (!mNotificationModel.isApplicationInForeground()) {
+ updateNotification();
+ }
+ }
+
+ return stopwatch;
+ }
+
+ /**
+ * @return the laps recorded for this stopwatch
+ */
+ List<Lap> getLaps() {
+ return Collections.unmodifiableList(getMutableLaps());
+ }
+
+ /**
+ * @return a newly recorded lap completed now; {@code null} if no more laps can be added
+ */
+ Lap addLap() {
+ if (!canAddMoreLaps()) {
+ return null;
+ }
+
+ final long totalTime = getStopwatch().getTotalTime();
+ final List<Lap> laps = getMutableLaps();
+
+ final int lapNumber = laps.size() + 1;
+ StopwatchDAO.addLap(mContext, lapNumber, totalTime);
+
+ final long prevAccumulatedTime = laps.isEmpty() ? 0 : laps.get(0).getAccumulatedTime();
+ final long lapTime = totalTime - prevAccumulatedTime;
+
+ final Lap lap = new Lap(lapNumber, lapTime, totalTime);
+ laps.add(0, lap);
+
+ // Refresh the stopwatch notification to reflect the latest stopwatch state.
+ if (!mNotificationModel.isApplicationInForeground()) {
+ updateNotification();
+ }
+
+ return lap;
+ }
+
+ /**
+ * Clears the laps recorded for this stopwatch.
+ */
+ void clearLaps() {
+ StopwatchDAO.clearLaps(mContext);
+ getMutableLaps().clear();
+ }
+
+ /**
+ * @return {@code true} iff more laps can be recorded
+ */
+ boolean canAddMoreLaps() {
+ return getLaps().size() < 98;
+ }
+
+ /**
+ * @return the longest lap time of all recorded laps and the current lap
+ */
+ long getLongestLapTime() {
+ long maxLapTime = 0;
+
+ final List<Lap> laps = getLaps();
+ if (!laps.isEmpty()) {
+ // Compute the maximum lap time across all recorded laps.
+ for (Lap lap : getLaps()) {
+ maxLapTime = Math.max(maxLapTime, lap.getLapTime());
+ }
+
+ // Compare with the maximum lap time for the current lap.
+ final Stopwatch stopwatch = getStopwatch();
+ final long currentLapTime = stopwatch.getTotalTime() - laps.get(0).getAccumulatedTime();
+ maxLapTime = Math.max(maxLapTime, currentLapTime);
+ }
+
+ return maxLapTime;
+ }
+
+ /**
+ * In practice, {@code time} can be any value due to device reboots. When the real-time clock is
+ * reset, there is no more guarantee that this time falls after the last recorded lap.
+ *
+ * @param time a point in time expected, but not required, to be after the end of the prior lap
+ * @return the elapsed time between the given {@code time} and the end of the prior lap;
+ * negative elapsed times are normalized to {@code 0}
+ */
+ long getCurrentLapTime(long time) {
+ final Lap previousLap = getLaps().get(0);
+ final long currentLapTime = time - previousLap.getAccumulatedTime();
+ return Math.max(0, currentLapTime);
+ }
+
+ /**
+ * Updates the notification to reflect the latest state of the stopwatch and recorded laps.
+ */
+ void updateNotification() {
+ final Stopwatch stopwatch = getStopwatch();
+
+ // Notification should be hidden if the stopwatch has no time or the app is open.
+ if (stopwatch.isReset() || mNotificationModel.isApplicationInForeground()) {
+ mNotificationManager.cancel(mNotificationModel.getStopwatchNotificationId());
+ return;
+ }
+
+ @StringRes final int eventLabel = R.string.label_notification;
+
+ // Intent to load the app when the notification is tapped.
+ final Intent showApp = new Intent(mContext, HandleDeskClockApiCalls.class)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .setAction(HandleDeskClockApiCalls.ACTION_SHOW_STOPWATCH)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_EVENT_LABEL, eventLabel);
+
+ final PendingIntent pendingShowApp = PendingIntent.getActivity(mContext, 0, showApp,
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+
+ // Compute some values required below.
+ final boolean running = stopwatch.isRunning();
+ final String pname = mContext.getPackageName();
+ final Resources res = mContext.getResources();
+ final long base = SystemClock.elapsedRealtime() - stopwatch.getTotalTime();
+
+ final RemoteViews collapsed = new RemoteViews(pname, R.layout.stopwatch_notif_collapsed);
+ collapsed.setChronometer(R.id.swn_collapsed_chronometer, base, null, running);
+ collapsed.setOnClickPendingIntent(R.id.swn_collapsed_hitspace, pendingShowApp);
+ collapsed.setImageViewResource(R.id.notification_icon, R.drawable.stat_notify_stopwatch);
+
+ final RemoteViews expanded = new RemoteViews(pname, R.layout.stopwatch_notif_expanded);
+ expanded.setChronometer(R.id.swn_expanded_chronometer, base, null, running);
+ expanded.setOnClickPendingIntent(R.id.swn_expanded_hitspace, pendingShowApp);
+ expanded.setImageViewResource(R.id.notification_icon, R.drawable.stat_notify_stopwatch);
+
+ @IdRes final int leftButtonId = R.id.swn_left_button;
+ @IdRes final int rightButtonId = R.id.swn_right_button;
+ if (running) {
+ // Left button: Pause
+ expanded.setTextViewText(leftButtonId, res.getText(R.string.sw_pause_button));
+ setTextViewDrawable(expanded, leftButtonId, R.drawable.ic_pause_24dp);
+ final Intent pause = new Intent(mContext, StopwatchService.class)
+ .setAction(HandleDeskClockApiCalls.ACTION_PAUSE_STOPWATCH)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_EVENT_LABEL, eventLabel);
+ expanded.setOnClickPendingIntent(leftButtonId, pendingServiceIntent(pause));
+
+ // Right button: Add Lap
+ if (canAddMoreLaps()) {
+ expanded.setTextViewText(rightButtonId, res.getText(R.string.sw_lap_button));
+ setTextViewDrawable(expanded, rightButtonId, R.drawable.ic_sw_lap_24dp);
+
+ final Intent lap = new Intent(mContext, StopwatchService.class)
+ .setAction(HandleDeskClockApiCalls.ACTION_LAP_STOPWATCH)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_EVENT_LABEL, eventLabel);
+ expanded.setOnClickPendingIntent(rightButtonId, pendingServiceIntent(lap));
+ expanded.setViewVisibility(rightButtonId, VISIBLE);
+ } else {
+ expanded.setViewVisibility(rightButtonId, INVISIBLE);
+ }
+
+ // Show the current lap number if any laps have been recorded.
+ final int lapCount = getLaps().size();
+ if (lapCount > 0) {
+ final int lapNumber = lapCount + 1;
+ final String lap = res.getString(R.string.sw_notification_lap_number, lapNumber);
+ collapsed.setTextViewText(R.id.swn_collapsed_laps, lap);
+ collapsed.setViewVisibility(R.id.swn_collapsed_laps, VISIBLE);
+ expanded.setTextViewText(R.id.swn_expanded_laps, lap);
+ expanded.setViewVisibility(R.id.swn_expanded_laps, VISIBLE);
+ } else {
+ collapsed.setViewVisibility(R.id.swn_collapsed_laps, GONE);
+ expanded.setViewVisibility(R.id.swn_expanded_laps, GONE);
+ }
+ } else {
+ // Left button: Start
+ expanded.setTextViewText(leftButtonId, res.getText(R.string.sw_start_button));
+ setTextViewDrawable(expanded, leftButtonId, R.drawable.ic_start_24dp);
+ final Intent start = new Intent(mContext, StopwatchService.class)
+ .setAction(HandleDeskClockApiCalls.ACTION_START_STOPWATCH)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_EVENT_LABEL, eventLabel);
+ expanded.setOnClickPendingIntent(leftButtonId, pendingServiceIntent(start));
+
+ // Right button: Reset (HandleDeskClockApiCalls will also bring forward the app)
+ expanded.setViewVisibility(rightButtonId, VISIBLE);
+ expanded.setTextViewText(rightButtonId, res.getText(R.string.sw_reset_button));
+ setTextViewDrawable(expanded, rightButtonId, R.drawable.ic_reset_24dp);
+ final Intent reset = new Intent(mContext, HandleDeskClockApiCalls.class)
+ .setAction(HandleDeskClockApiCalls.ACTION_RESET_STOPWATCH)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_EVENT_LABEL, eventLabel);
+ expanded.setOnClickPendingIntent(rightButtonId, pendingActivityIntent(reset));
+
+ // Indicate the stopwatch is paused.
+ collapsed.setTextViewText(R.id.swn_collapsed_laps, res.getString(R.string.swn_paused));
+ collapsed.setViewVisibility(R.id.swn_collapsed_laps, VISIBLE);
+ expanded.setTextViewText(R.id.swn_expanded_laps, res.getString(R.string.swn_paused));
+ expanded.setViewVisibility(R.id.swn_expanded_laps, VISIBLE);
+ }
+
+ // Swipe away will reset the stopwatch without bringing forward the app.
+ final Intent reset = new Intent(mContext, StopwatchService.class)
+ .setAction(HandleDeskClockApiCalls.ACTION_RESET_STOPWATCH)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_EVENT_LABEL, eventLabel);
+
+ final Notification notification = new NotificationCompat.Builder(mContext)
+ .setLocalOnly(true)
+ .setOngoing(running)
+ .setContent(collapsed)
+ .setAutoCancel(stopwatch.isPaused())
+ .setPriority(Notification.PRIORITY_MAX)
+ .setDeleteIntent(pendingServiceIntent(reset))
+ .setSmallIcon(R.drawable.ic_tab_stopwatch_activated)
+ .build();
+ notification.bigContentView = expanded;
+ mNotificationManager.notify(mNotificationModel.getStopwatchNotificationId(), notification);
+ }
+
+ private PendingIntent pendingServiceIntent(Intent intent) {
+ return PendingIntent.getService(mContext, 0, intent, FLAG_UPDATE_CURRENT);
+ }
+
+ private PendingIntent pendingActivityIntent(Intent intent) {
+ return PendingIntent.getActivity(mContext, 0, intent, FLAG_UPDATE_CURRENT);
+ }
+
+ private static void setTextViewDrawable(RemoteViews rv, int viewId, int drawableId) {
+ rv.setTextViewCompoundDrawablesRelative(viewId, drawableId, 0, 0, 0);
+ }
+
+ private List<Lap> getMutableLaps() {
+ if (mLaps == null) {
+ mLaps = StopwatchDAO.getLaps(mContext);
+ }
+
+ return mLaps;
+ }
+
+ /**
+ * Update the stopwatch notification in response to a locale change.
+ */
+ private final class LocaleChangedReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ updateNotification();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/Timer.java b/src/com/android/deskclock/data/Timer.java
new file mode 100644
index 0000000..862e8e0
--- /dev/null
+++ b/src/com/android/deskclock/data/Timer.java
@@ -0,0 +1,313 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.os.SystemClock;
+import android.text.TextUtils;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
+import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
+import static android.text.format.DateUtils.SECOND_IN_MILLIS;
+import static com.android.deskclock.data.Timer.State.EXPIRED;
+import static com.android.deskclock.data.Timer.State.PAUSED;
+import static com.android.deskclock.data.Timer.State.RESET;
+import static com.android.deskclock.data.Timer.State.RUNNING;
+
+/**
+ * A read-only domain object representing a countdown timer.
+ */
+public final class Timer {
+
+ public enum State {
+ RUNNING(1), PAUSED(2), EXPIRED(3), RESET(4);
+
+ /** The value assigned to this State in prior releases. */
+ private final int mValue;
+
+ State(int value) {
+ mValue = value;
+ }
+
+ /**
+ * @return the numeric value assigned to this state
+ */
+ public int getValue() {
+ return mValue;
+ }
+
+ /**
+ * @return the state corresponding to the given {@code value}
+ */
+ public static State fromValue(int value) {
+ for (State state : values()) {
+ if (state.getValue() == value) {
+ return state;
+ }
+ }
+
+ return null;
+ }
+ }
+
+ /** The minimum duration of a timer. */
+ public static final long MIN_LENGTH = SECOND_IN_MILLIS;
+
+ /** The maximum duration of a timer. */
+ public static final long MAX_LENGTH =
+ 99 * HOUR_IN_MILLIS + 99 * MINUTE_IN_MILLIS + 99 * SECOND_IN_MILLIS;
+
+ /** A unique identifier for the city. */
+ private final int mId;
+
+ /** The current state of the timer. */
+ private final State mState;
+
+ /** The original length of the timer in milliseconds when it was created. */
+ private final long mLength;
+
+ /** The length of the timer in milliseconds including additional time added by the user. */
+ private final long mTotalLength;
+
+ /** The time at which the timer was last started; {@link Long#MIN_VALUE} when not running. */
+ private final long mLastStartTime;
+
+ /** The time at which the timer is scheduled to expire; negative if it is already expired. */
+ private final long mRemainingTime;
+
+ /** A message describing the meaning of the timer. */
+ private final String mLabel;
+
+ /** A flag indicating the timer should be deleted when it is reset. */
+ private final boolean mDeleteAfterUse;
+
+ Timer(int id, State state, long length, long totalLength, long lastStartTime,
+ long remainingTime, String label, boolean deleteAfterUse) {
+ mId = id;
+ mState = state;
+ mLength = length;
+ mTotalLength = totalLength;
+ mLastStartTime = lastStartTime;
+ mRemainingTime = remainingTime;
+ mLabel = label;
+ mDeleteAfterUse = deleteAfterUse;
+ }
+
+ public int getId() { return mId; }
+ public State getState() { return mState; }
+ public String getLabel() { return mLabel; }
+ public long getLength() { return mLength; }
+ public long getTotalLength() { return mTotalLength; }
+ public boolean getDeleteAfterUse() { return mDeleteAfterUse; }
+ public boolean isReset() { return mState == RESET; }
+ public boolean isRunning() { return mState == RUNNING; }
+ public boolean isPaused() { return mState == PAUSED; }
+ public boolean isExpired() { return mState == EXPIRED; }
+
+ /**
+ * @return the total amount of time remaining up to this moment; expired timers will return a
+ * negative amount
+ */
+ public long getRemainingTime() {
+ if (mState == RUNNING || mState == EXPIRED) {
+ return mRemainingTime - (now() - mLastStartTime);
+ }
+
+ return mRemainingTime;
+ }
+
+ /**
+ * @return the time at which this timer will or did expire
+ */
+ public long getExpirationTime() {
+ if (mState != RUNNING && mState != EXPIRED) {
+ throw new IllegalStateException("cannot compute expiration time in state " + mState);
+ }
+
+ return mLastStartTime + mRemainingTime;
+ }
+
+ /**
+ *
+ * @return the total amount of time elapsed up to this moment; expired timers will report more
+ * than the {@link #getTotalLength() total length}
+ */
+ public long getElapsedTime() {
+ return getTotalLength() - getRemainingTime();
+ }
+
+ long getLastStartTime() { return mLastStartTime; }
+
+ /**
+ * @return a copy of this timer that is running or expired
+ */
+ Timer start() {
+ if (mState == RUNNING || mState == EXPIRED) {
+ return this;
+ }
+
+ return new Timer(mId, RUNNING, mLength, mTotalLength, now(), mRemainingTime, mLabel,
+ mDeleteAfterUse);
+ }
+
+ /**
+ * @return a copy of this timer that is paused or reset
+ */
+ Timer pause() {
+ if (mState == PAUSED || mState == RESET) {
+ return this;
+ } else if (mState == EXPIRED) {
+ return reset();
+ }
+
+ final long remainingTime = getRemainingTime();
+ return new Timer(mId, PAUSED, mLength, mTotalLength, Long.MIN_VALUE, remainingTime, mLabel,
+ mDeleteAfterUse);
+ }
+
+ /**
+ * @return a copy of this timer that is expired or reset
+ */
+ Timer expire() {
+ if (mState == EXPIRED || mState == RESET) {
+ return this;
+ }
+
+ return new Timer(mId, EXPIRED, mLength, mTotalLength, mLastStartTime, mRemainingTime,
+ mLabel, mDeleteAfterUse);
+ }
+
+ /**
+ * @return a copy of this timer that is reset
+ */
+ Timer reset() {
+ if (mState == RESET) {
+ return this;
+ }
+
+ return new Timer(mId, RESET, mLength, mLength, Long.MIN_VALUE, mLength, mLabel,
+ mDeleteAfterUse);
+ }
+
+ /**
+ * @return a copy of this timer with the given {@code label}
+ */
+ Timer setLabel(String label) {
+ if (TextUtils.equals(mLabel, label)) {
+ return this;
+ }
+
+ return new Timer(mId, mState, mLength, mTotalLength, mLastStartTime, mRemainingTime, label,
+ mDeleteAfterUse);
+ }
+
+ /**
+ * @return a copy of this timer with an additional minute added to the remaining time and total
+ * length, or this Timer if adding a minute would exceed the maximum timer duration
+ */
+ Timer addMinute() {
+ final long lastStartTime;
+ final long remainingTime;
+ final long totalLength;
+ final State state;
+ if (mState == EXPIRED) {
+ state = RUNNING;
+ lastStartTime = now();
+ totalLength = MINUTE_IN_MILLIS;
+ remainingTime = MINUTE_IN_MILLIS;
+ } else {
+ state = mState;
+ lastStartTime = mLastStartTime;
+ totalLength = mRemainingTime + MINUTE_IN_MILLIS;
+ remainingTime = mRemainingTime + MINUTE_IN_MILLIS;
+ }
+
+ // Do not allow the remaining time to exceed the maximum.
+ if (remainingTime > MAX_LENGTH) {
+ return this;
+ }
+
+ return new Timer(mId, state, mLength, totalLength, lastStartTime, remainingTime, mLabel,
+ mDeleteAfterUse);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ final Timer timer = (Timer) o;
+
+ return mId == timer.mId;
+
+ }
+
+ @Override
+ public int hashCode() {
+ return mId;
+ }
+
+ private static long now() {
+ return SystemClock.elapsedRealtime();
+ }
+
+ /**
+ * Orders timers by their IDs. Oldest timers are at the bottom. Newest timers are at the top.
+ */
+ public static Comparator<Timer> ID_COMPARATOR = new Comparator<Timer>() {
+ @Override
+ public int compare(Timer timer1, Timer timer2) {
+ return Integer.compare(timer2.getId(), timer1.getId());
+ }
+ };
+
+ /**
+ * Orders timers by their expected/actual expiration time. The general order is:
+ *
+ * <ol>
+ * <li>{@link State#EXPIRED EXPIRED} timers; ties broken by {@link #getRemainingTime()}</li>
+ * <li>{@link State#RUNNING RUNNING} timers; ties broken by {@link #getRemainingTime()}</li>
+ * <li>{@link State#PAUSED PAUSED} timers; ties broken by {@link #getRemainingTime()}</li>
+ * <li>{@link State#RESET RESET} timers; ties broken by {@link #getLength()}</li>
+ * </ol>
+ */
+ public static Comparator<Timer> EXPIRY_COMPARATOR = new Comparator<Timer>() {
+
+ private final List<State> stateExpiryOrder = Arrays.asList(EXPIRED, RUNNING, PAUSED, RESET);
+
+ @Override
+ public int compare(Timer timer1, Timer timer2) {
+ final int stateIndex1 = stateExpiryOrder.indexOf(timer1.getState());
+ final int stateIndex2 = stateExpiryOrder.indexOf(timer2.getState());
+
+ int order = Integer.compare(stateIndex1, stateIndex2);
+ if (order == 0) {
+ final State state = timer1.getState();
+ if (state == RESET) {
+ order = Long.compare(timer1.getLength(), timer2.getLength());
+ } else {
+ order = Long.compare(timer1.getRemainingTime(), timer2.getRemainingTime());
+ }
+ }
+
+ return order;
+ }
+ };
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/TimerDAO.java b/src/com/android/deskclock/data/TimerDAO.java
new file mode 100644
index 0000000..3d90ac9
--- /dev/null
+++ b/src/com/android/deskclock/data/TimerDAO.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+
+import com.android.deskclock.Utils;
+import com.android.deskclock.data.Timer.State;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static com.android.deskclock.data.Timer.State.RESET;
+
+/**
+ * This class encapsulates the transfer of data between {@link Timer} domain objects and their
+ * permanent storage in {@link SharedPreferences}.
+ */
+final class TimerDAO {
+
+ // Key to a preference that stores the set of timer ids.
+ private static final String TIMER_IDS = "timers_list";
+
+ // Key to a preference that stores the id to assign to the next timer.
+ private static final String NEXT_TIMER_ID = "next_timer_id";
+
+ // Prefix for a key to a preference that stores the state of the timer.
+ private static final String STATE = "timer_state_";
+
+ // Prefix for a key to a preference that stores the length of the timer when it was created.
+ private static final String LENGTH = "timer_setup_timet_";
+
+ // Prefix for a key to a preference that stores the total length of the timer with additions.
+ private static final String TOTAL_LENGTH = "timer_original_timet_";
+
+ // Prefix for a key to a preference that stores the last start time of the timer.
+ private static final String LAST_START_TIME = "timer_start_time_";
+
+ // Prefix for a key to a preference that stores the remaining time before expiry.
+ private static final String REMAINING_TIME = "timer_time_left_";
+
+ // Prefix for a key to a preference that stores the label of the timer.
+ private static final String LABEL = "timer_label_";
+
+ // Prefix for a key to a preference that signals the timer should be deleted on first reset.
+ private static final String DELETE_AFTER_USE = "delete_after_use_";
+
+ // Lazily instantiated and cached for the life of the application.
+ private static SharedPreferences sPrefs;
+
+ private TimerDAO() {}
+
+ /**
+ * @return the timers from permanent storage
+ */
+ public static List<Timer> getTimers(Context context) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+
+ // Read the set of timer ids.
+ final Set<String> timerIds = prefs.getStringSet(TIMER_IDS, Collections.<String>emptySet());
+ final List<Timer> timers = new ArrayList<>(timerIds.size());
+
+ // Build a timer using the data associated with each timer id.
+ for (String timerId : timerIds) {
+ final int id = Integer.parseInt(timerId);
+ final int stateValue = prefs.getInt(STATE + id, RESET.getValue());
+ final State state = State.fromValue(stateValue);
+
+ // Timer state may be null when migrating timers from prior releases which defined a
+ // "deleted" state. Such a state is no longer required.
+ if (state != null) {
+ final long length = prefs.getLong(LENGTH + id, Long.MIN_VALUE);
+ final long totalLength = prefs.getLong(TOTAL_LENGTH + id, Long.MIN_VALUE);
+ final long lastStartTime = prefs.getLong(LAST_START_TIME + id, Long.MIN_VALUE);
+ final long remainingTime = prefs.getLong(REMAINING_TIME + id, totalLength);
+ final String label = prefs.getString(LABEL + id, null);
+ final boolean deleteAfterUse = prefs.getBoolean(DELETE_AFTER_USE + id, false);
+ timers.add(new Timer(id, state, length, totalLength, lastStartTime, remainingTime,
+ label, deleteAfterUse));
+ }
+ }
+
+ return timers;
+ }
+
+ /**
+ * @param timer the timer to be added
+ */
+ public static Timer addTimer(Context context, Timer timer) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final SharedPreferences.Editor editor = prefs.edit();
+
+ // Fetch the next timer id.
+ final int id = prefs.getInt(NEXT_TIMER_ID, 0);
+ editor.putInt(NEXT_TIMER_ID, id + 1);
+
+ // Add the new timer id to the set of all timer ids.
+ final Set<String> timerIds = new HashSet<>(getTimerIds(context));
+ timerIds.add(String.valueOf(id));
+ editor.putStringSet(TIMER_IDS, timerIds);
+
+ // Record the fields of the timer.
+ editor.putInt(STATE + id, timer.getState().getValue());
+ editor.putLong(LENGTH + id, timer.getLength());
+ editor.putLong(TOTAL_LENGTH + id, timer.getTotalLength());
+ editor.putLong(LAST_START_TIME + id, timer.getLastStartTime());
+ editor.putLong(REMAINING_TIME + id, timer.getRemainingTime());
+ editor.putString(LABEL + id, timer.getLabel());
+ editor.putBoolean(DELETE_AFTER_USE + id, timer.getDeleteAfterUse());
+
+ editor.apply();
+
+ // Return a new timer with the generated timer id present.
+ return new Timer(id, timer.getState(), timer.getLength(), timer.getTotalLength(),
+ timer.getLastStartTime(), timer.getRemainingTime(), timer.getLabel(),
+ timer.getDeleteAfterUse());
+ }
+
+ /**
+ * @param timer the timer to be updated
+ */
+ public static void updateTimer(Context context, Timer timer) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final SharedPreferences.Editor editor = prefs.edit();
+
+ // Record the fields of the timer.
+ final int id = timer.getId();
+ editor.putInt(STATE + id, timer.getState().getValue());
+ editor.putLong(LENGTH + id, timer.getLength());
+ editor.putLong(TOTAL_LENGTH + id, timer.getTotalLength());
+ editor.putLong(LAST_START_TIME + id, timer.getLastStartTime());
+ editor.putLong(REMAINING_TIME + id, timer.getRemainingTime());
+ editor.putString(LABEL + id, timer.getLabel());
+ editor.putBoolean(DELETE_AFTER_USE + id, timer.getDeleteAfterUse());
+
+ editor.apply();
+ }
+
+ /**
+ * @param timer the timer to be removed
+ */
+ public static void removeTimer(Context context, Timer timer) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ final SharedPreferences.Editor editor = prefs.edit();
+
+ final int id = timer.getId();
+
+ // Remove the timer id from the set of all timer ids.
+ final Set<String> timerIds = new HashSet<>(getTimerIds(context));
+ timerIds.remove(String.valueOf(id));
+ if (timerIds.isEmpty()) {
+ editor.remove(TIMER_IDS);
+ editor.remove(NEXT_TIMER_ID);
+ } else {
+ editor.putStringSet(TIMER_IDS, timerIds);
+ }
+
+ // Record the fields of the timer.
+ editor.remove(STATE + id);
+ editor.remove(LENGTH + id);
+ editor.remove(TOTAL_LENGTH + id);
+ editor.remove(LAST_START_TIME + id);
+ editor.remove(REMAINING_TIME + id);
+ editor.remove(LABEL + id);
+ editor.remove(DELETE_AFTER_USE + id);
+
+ editor.apply();
+ }
+
+ private static Set<String> getTimerIds(Context context) {
+ final SharedPreferences prefs = getSharedPreferences(context);
+ return prefs.getStringSet(TIMER_IDS, Collections.<String>emptySet());
+ }
+
+ private static SharedPreferences getSharedPreferences(Context context) {
+ if (sPrefs == null) {
+ sPrefs = Utils.getDefaultSharedPreferences(context.getApplicationContext());
+ }
+
+ return sPrefs;
+ }
+}
diff --git a/src/com/android/deskclock/data/TimerListener.java b/src/com/android/deskclock/data/TimerListener.java
new file mode 100644
index 0000000..a2f1d80
--- /dev/null
+++ b/src/com/android/deskclock/data/TimerListener.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+/**
+ * The interface through which interested parties are notified of changes to one of the timers.
+ */
+public interface TimerListener {
+
+ /**
+ * @param timer the timer that was added
+ */
+ void timerAdded(Timer timer);
+
+ /**
+ * @param before the timer state before the update
+ * @param after the timer state after the update
+ */
+ void timerUpdated(Timer before, Timer after);
+
+ /**
+ * @param timer the timer that was removed
+ */
+ void timerRemoved(Timer timer);
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/data/TimerModel.java b/src/com/android/deskclock/data/TimerModel.java
new file mode 100644
index 0000000..9b2b0a6
--- /dev/null
+++ b/src/com/android/deskclock/data/TimerModel.java
@@ -0,0 +1,896 @@
+/*
+ * Copyright (C) 2015 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.data;
+
+import android.app.AlarmManager;
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.SystemClock;
+import android.preference.PreferenceManager;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.StringRes;
+import android.support.annotation.VisibleForTesting;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.app.NotificationManagerCompat;
+import android.text.TextUtils;
+import android.util.ArraySet;
+
+import com.android.deskclock.AlarmAlertWakeLock;
+import com.android.deskclock.HandleDeskClockApiCalls;
+import com.android.deskclock.LogUtils;
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+import com.android.deskclock.events.Events;
+import com.android.deskclock.settings.SettingsActivity;
+import com.android.deskclock.timer.ExpiredTimersActivity;
+import com.android.deskclock.timer.TimerKlaxon;
+import com.android.deskclock.timer.TimerService;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP;
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
+import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
+import static com.android.deskclock.data.Timer.State.EXPIRED;
+import static com.android.deskclock.data.Timer.State.RESET;
+
+/**
+ * All {@link Timer} data is accessed via this model.
+ */
+final class TimerModel {
+
+ private final Context mContext;
+
+ /** The alarm manager system service that calls back when timers expire. */
+ private final AlarmManager mAlarmManager;
+
+ /** The model from which settings are fetched. */
+ private final SettingsModel mSettingsModel;
+
+ /** The model from which notification data are fetched. */
+ private final NotificationModel mNotificationModel;
+
+ /** Used to create and destroy system notifications related to timers. */
+ private final NotificationManagerCompat mNotificationManager;
+
+ /** Update timer notification when locale changes. */
+ private final BroadcastReceiver mLocaleChangedReceiver = new LocaleChangedReceiver();
+
+ /**
+ * Retain a hard reference to the shared preference observer to prevent it from being garbage
+ * collected. See {@link SharedPreferences#registerOnSharedPreferenceChangeListener} for detail.
+ */
+ private final OnSharedPreferenceChangeListener mPreferenceListener = new PreferenceListener();
+
+ /** The listeners to notify when a timer is added, updated or removed. */
+ private final List<TimerListener> mTimerListeners = new ArrayList<>();
+
+ /**
+ * The ids of expired timers for which the ringer is ringing. Not all expired timers have their
+ * ids in this collection. If a timer was already expired when the app was started its id will
+ * be absent from this collection.
+ */
+ private final Set<Integer> mRingingIds = new ArraySet<>();
+
+ /** The uri of the ringtone to play for timers. */
+ private Uri mTimerRingtoneUri;
+
+ /** The title of the ringtone to play for timers. */
+ private String mTimerRingtoneTitle;
+
+ /** A mutable copy of the timers. */
+ private List<Timer> mTimers;
+
+ /** A mutable copy of the expired timers. */
+ private List<Timer> mExpiredTimers;
+
+ /**
+ * The service that keeps this application in the foreground while a heads-up timer
+ * notification is displayed. Marking the service as foreground prevents the operating system
+ * from killing this application while expired timers are actively firing.
+ */
+ private Service mService;
+
+ TimerModel(Context context, SettingsModel settingsModel, NotificationModel notificationModel) {
+ mContext = context;
+ mSettingsModel = settingsModel;
+ mNotificationModel = notificationModel;
+ mNotificationManager = NotificationManagerCompat.from(context);
+
+ mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+
+ // Clear caches affected by preferences when preferences change.
+ final SharedPreferences prefs = Utils.getDefaultSharedPreferences(mContext);
+ prefs.registerOnSharedPreferenceChangeListener(mPreferenceListener);
+
+ // Update stopwatch notification when locale changes.
+ final IntentFilter localeBroadcastFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
+ mContext.registerReceiver(mLocaleChangedReceiver, localeBroadcastFilter);
+ }
+
+ /**
+ * @param timerListener to be notified when timers are added, updated and removed
+ */
+ void addTimerListener(TimerListener timerListener) {
+ mTimerListeners.add(timerListener);
+ }
+
+ /**
+ * @param timerListener to no longer be notified when timers are added, updated and removed
+ */
+ void removeTimerListener(TimerListener timerListener) {
+ mTimerListeners.remove(timerListener);
+ }
+
+ /**
+ * @return all defined timers in their creation order
+ */
+ List<Timer> getTimers() {
+ return Collections.unmodifiableList(getMutableTimers());
+ }
+
+ /**
+ * @return all expired timers in their expiration order
+ */
+ List<Timer> getExpiredTimers() {
+ return Collections.unmodifiableList(getMutableExpiredTimers());
+ }
+
+ /**
+ * @param timerId identifies the timer to return
+ * @return the timer with the given {@code timerId}
+ */
+ Timer getTimer(int timerId) {
+ for (Timer timer : getMutableTimers()) {
+ if (timer.getId() == timerId) {
+ return timer;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * @return the timer that last expired and is still expired now; {@code null} if no timers are
+ * expired
+ */
+ Timer getMostRecentExpiredTimer() {
+ final List<Timer> timers = getMutableExpiredTimers();
+ return timers.isEmpty() ? null : timers.get(timers.size() - 1);
+ }
+
+ /**
+ * @param length the length of the timer in milliseconds
+ * @param label describes the purpose of the timer
+ * @param deleteAfterUse {@code true} indicates the timer should be deleted when it is reset
+ * @return the newly added timer
+ */
+ Timer addTimer(long length, String label, boolean deleteAfterUse) {
+ // Create the timer instance.
+ Timer timer = new Timer(-1, RESET, length, length, Long.MIN_VALUE, length, label,
+ deleteAfterUse);
+
+ // Add the timer to permanent storage.
+ timer = TimerDAO.addTimer(mContext, timer);
+
+ // Add the timer to the cache.
+ getMutableTimers().add(0, timer);
+
+ // Update the timer notification.
+ updateNotification();
+ // Heads-Up notification is unaffected by this change
+
+ // Notify listeners of the change.
+ for (TimerListener timerListener : mTimerListeners) {
+ timerListener.timerAdded(timer);
+ }
+
+ return timer;
+ }
+
+ /**
+ * @param service used to start foreground notifications related to expired timers
+ * @param timer the timer to be expired
+ */
+ void expireTimer(Service service, Timer timer) {
+ if (mService == null) {
+ // If this is the first expired timer, retain the service that will be used to start
+ // the heads-up notification in the foreground.
+ mService = service;
+ } else if (mService != service) {
+ // If this is not the first expired timer, the service should match the one given when
+ // the first timer expired.
+ LogUtils.wtf("Expected TimerServices to be identical");
+ }
+
+ updateTimer(timer.expire());
+ }
+
+ /**
+ * @param timer an updated timer to store
+ */
+ void updateTimer(Timer timer) {
+ final Timer before = doUpdateTimer(timer);
+
+ // Update the notification after updating the timer data.
+ updateNotification();
+
+ // If the timer started or stopped being expired, update the heads-up notification.
+ if (before.getState() != timer.getState()) {
+ if (before.isExpired() || timer.isExpired()) {
+ updateHeadsUpNotification();
+ }
+ }
+ }
+
+ /**
+ * @param timer an existing timer to be removed
+ */
+ void removeTimer(Timer timer) {
+ doRemoveTimer(timer);
+
+ // Update the timer notifications after removing the timer data.
+ updateNotification();
+ if (timer.isExpired()) {
+ updateHeadsUpNotification();
+ }
+ }
+
+ /**
+ * If the given {@code timer} is expired and marked for deletion after use then this method
+ * removes the the timer. The timer is otherwise transitioned to the reset state and continues
+ * to exist.
+ *
+ * @param timer the timer to be reset
+ * @param eventLabelId the label of the timer event to send; 0 if no event should be sent
+ */
+ void resetOrDeleteTimer(Timer timer, @StringRes int eventLabelId) {
+ doResetOrDeleteTimer(timer, eventLabelId);
+
+ // Update the notification after updating the timer data.
+ updateNotification();
+
+ // If the timer stopped being expired, update the heads-up notification.
+ if (timer.isExpired()) {
+ updateHeadsUpNotification();
+ }
+ }
+
+ /**
+ * Reset all timers.
+ *
+ * @param eventLabelId the label of the timer event to send; 0 if no event should be sent
+ */
+ void resetTimers(@StringRes int eventLabelId) {
+ final List<Timer> timers = new ArrayList<>(getTimers());
+ for (Timer timer : timers) {
+ doResetOrDeleteTimer(timer, eventLabelId);
+ }
+
+ // Update the notifications once after all timers are reset.
+ updateNotification();
+ updateHeadsUpNotification();
+ }
+
+ /**
+ * Reset all expired timers.
+ *
+ * @param eventLabelId the label of the timer event to send; 0 if no event should be sent
+ */
+ void resetExpiredTimers(@StringRes int eventLabelId) {
+ final List<Timer> timers = new ArrayList<>(getTimers());
+ for (Timer timer : timers) {
+ if (timer.isExpired()) {
+ doResetOrDeleteTimer(timer, eventLabelId);
+ }
+ }
+
+ // Update the notifications once after all timers are updated.
+ updateNotification();
+ updateHeadsUpNotification();
+ }
+
+ /**
+ * Reset all unexpired timers.
+ *
+ * @param eventLabelId the label of the timer event to send; 0 if no event should be sent
+ */
+ void resetUnexpiredTimers(@StringRes int eventLabelId) {
+ final List<Timer> timers = new ArrayList<>(getTimers());
+ for (Timer timer : timers) {
+ if (timer.isRunning() || timer.isPaused()) {
+ doResetOrDeleteTimer(timer, eventLabelId);
+ }
+ }
+
+ // Update the notification once after all timers are updated.
+ updateNotification();
+ // Heads-Up notification is unaffected by this change
+ }
+
+ /**
+ * @return the uri of the default ringtone to play for all timers when no user selection exists
+ */
+ Uri getDefaultTimerRingtoneUri() {
+ return mSettingsModel.getDefaultTimerRingtoneUri();
+ }
+
+ /**
+ * @return {@code true} iff the ringtone to play for all timers is the silent ringtone
+ */
+ boolean isTimerRingtoneSilent() {
+ return Uri.EMPTY.equals(getTimerRingtoneUri());
+ }
+
+ /**
+ * @return the uri of the ringtone to play for all timers
+ */
+ Uri getTimerRingtoneUri() {
+ if (mTimerRingtoneUri == null) {
+ mTimerRingtoneUri = mSettingsModel.getTimerRingtoneUri();
+ }
+
+ return mTimerRingtoneUri;
+ }
+
+ /**
+ * @return the title of the ringtone that is played for all timers
+ */
+ String getTimerRingtoneTitle() {
+ if (mTimerRingtoneTitle == null) {
+ if (isTimerRingtoneSilent()) {
+ // Special case: no ringtone has a title of "Silent".
+ mTimerRingtoneTitle = mContext.getString(R.string.silent_timer_ringtone_title);
+ } else {
+ final Uri defaultUri = getDefaultTimerRingtoneUri();
+ final Uri uri = getTimerRingtoneUri();
+
+ if (defaultUri.equals(uri)) {
+ // Special case: default ringtone has a title of "Timer Expired".
+ mTimerRingtoneTitle = mContext.getString(R.string.default_timer_ringtone_title);
+ } else {
+ final Ringtone ringtone = RingtoneManager.getRingtone(mContext, uri);
+ mTimerRingtoneTitle = ringtone.getTitle(mContext);
+ }
+ }
+ }
+
+ return mTimerRingtoneTitle;
+ }
+
+ private List<Timer> getMutableTimers() {
+ if (mTimers == null) {
+ mTimers = TimerDAO.getTimers(mContext);
+ Collections.sort(mTimers, Timer.ID_COMPARATOR);
+ }
+
+ return mTimers;
+ }
+
+ private List<Timer> getMutableExpiredTimers() {
+ if (mExpiredTimers == null) {
+ mExpiredTimers = new ArrayList<>();
+
+ for (Timer timer : getMutableTimers()) {
+ if (timer.isExpired()) {
+ mExpiredTimers.add(timer);
+ }
+ }
+ Collections.sort(mExpiredTimers, Timer.EXPIRY_COMPARATOR);
+ }
+
+ return mExpiredTimers;
+ }
+
+ /**
+ * This method updates timer data without updating notifications. This is useful in bulk-update
+ * scenarios so the notifications are only rebuilt once.
+ *
+ * @param timer an updated timer to store
+ * @return the state of the timer prior to the update
+ */
+ private Timer doUpdateTimer(Timer timer) {
+ // Retrieve the cached form of the timer.
+ final List<Timer> timers = getMutableTimers();
+ final int index = timers.indexOf(timer);
+ final Timer before = timers.get(index);
+
+ // If no change occurred, ignore this update.
+ if (timer == before) {
+ return timer;
+ }
+
+ // Update the timer in permanent storage.
+ TimerDAO.updateTimer(mContext, timer);
+
+ // Update the timer in the cache.
+ final Timer oldTimer = timers.set(index, timer);
+
+ // Clear the cache of expired timers if the timer changed to/from expired.
+ if (before.isExpired() || timer.isExpired()) {
+ mExpiredTimers = null;
+ }
+
+ // Update the timer expiration callback.
+ updateAlarmManager();
+
+ // Update the timer ringer.
+ updateRinger(before, timer);
+
+ // Notify listeners of the change.
+ for (TimerListener timerListener : mTimerListeners) {
+ timerListener.timerUpdated(before, timer);
+ }
+
+ return oldTimer;
+ }
+
+ /**
+ * This method removes timer data without updating notifications. This is useful in bulk-remove
+ * scenarios so the notifications are only rebuilt once.
+ *
+ * @param timer an existing timer to be removed
+ */
+ void doRemoveTimer(Timer timer) {
+ // Remove the timer from permanent storage.
+ TimerDAO.removeTimer(mContext, timer);
+
+ // Remove the timer from the cache.
+ final List<Timer> timers = getMutableTimers();
+ final int index = timers.indexOf(timer);
+
+ // If the timer cannot be located there is nothing to remove.
+ if (index == -1) {
+ return;
+ }
+
+ timer = timers.remove(index);
+
+ // Clear the cache of expired timers if a new expired timer was added.
+ if (timer.isExpired()) {
+ mExpiredTimers = null;
+ }
+
+ // Update the timer expiration callback.
+ updateAlarmManager();
+
+ // Update the timer ringer.
+ updateRinger(timer, null);
+
+ // Notify listeners of the change.
+ for (TimerListener timerListener : mTimerListeners) {
+ timerListener.timerRemoved(timer);
+ }
+ }
+
+ /**
+ * This method updates/removes timer data without updating notifications. This is useful in
+ * bulk-update scenarios so the notifications are only rebuilt once.
+ *
+ * If the given {@code timer} is expired and marked for deletion after use then this method
+ * removes the the timer. The timer is otherwise transitioned to the reset state and continues
+ * to exist.
+ *
+ * @param timer the timer to be reset
+ * @param eventLabelId the label of the timer event to send; 0 if no event should be sent
+ */
+ private void doResetOrDeleteTimer(Timer timer, @StringRes int eventLabelId) {
+ if (timer.isExpired() && timer.getDeleteAfterUse()) {
+ doRemoveTimer(timer);
+ if (eventLabelId != 0) {
+ Events.sendTimerEvent(R.string.action_delete, eventLabelId);
+ }
+ } else if (!timer.isReset()) {
+ doUpdateTimer(timer.reset());
+ if (eventLabelId != 0) {
+ Events.sendTimerEvent(R.string.action_reset, eventLabelId);
+ }
+ }
+ }
+
+ /**
+ * Updates the callback given to this application from the {@link AlarmManager} that signals the
+ * expiration of the next timer. If no timers are currently set to expire (i.e. no running
+ * timers exist) then this method clears the expiration callback from AlarmManager.
+ */
+ private void updateAlarmManager() {
+ // Locate the next firing timer if one exists.
+ Timer nextExpiringTimer = null;
+ for (Timer timer : getMutableTimers()) {
+ if (timer.isRunning()) {
+ if (nextExpiringTimer == null) {
+ nextExpiringTimer = timer;
+ } else if (timer.getExpirationTime() < nextExpiringTimer.getExpirationTime()) {
+ nextExpiringTimer = timer;
+ }
+ }
+ }
+
+ // Build the intent that signals the timer expiration.
+ final Intent intent = TimerService.createTimerExpiredIntent(mContext, nextExpiringTimer);
+
+ if (nextExpiringTimer == null) {
+ // Cancel the existing timer expiration callback.
+ final PendingIntent pi = PendingIntent.getService(mContext,
+ 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_NO_CREATE);
+ if (pi != null) {
+ mAlarmManager.cancel(pi);
+ pi.cancel();
+ }
+ } else {
+ // Update the existing timer expiration callback.
+ final PendingIntent pi = PendingIntent.getService(mContext,
+ 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+ schedulePendingIntent(nextExpiringTimer.getExpirationTime(), pi);
+ }
+ }
+
+ /**
+ * Starts and stops the ringer for timers if the change to the timer demands it.
+ *
+ * @param before the state of the timer before the change; {@code null} indicates added
+ * @param after the state of the timer after the change; {@code null} indicates delete
+ */
+ private void updateRinger(Timer before, Timer after) {
+ // Retrieve the states before and after the change.
+ final Timer.State beforeState = before == null ? null : before.getState();
+ final Timer.State afterState = after == null ? null : after.getState();
+
+ // If the timer state did not change, the ringer state is unchanged.
+ if (beforeState == afterState) {
+ return;
+ }
+
+ // If the timer is the first to expire, start ringing.
+ if (afterState == EXPIRED && mRingingIds.add(after.getId()) && mRingingIds.size() == 1) {
+ AlarmAlertWakeLock.acquireScreenCpuWakeLock(mContext);
+ TimerKlaxon.start(mContext);
+ }
+
+ // If the expired timer was the last to reset, stop ringing.
+ if (beforeState == EXPIRED && mRingingIds.remove(before.getId()) && mRingingIds.isEmpty()) {
+ TimerKlaxon.stop(mContext);
+ AlarmAlertWakeLock.releaseCpuLock();
+ }
+ }
+
+ /**
+ * Updates the notification controlling unexpired timers. This notification is only displayed
+ * when the application is not open.
+ */
+ void updateNotification() {
+ // Notifications should be hidden if the app is open.
+ if (mNotificationModel.isApplicationInForeground()) {
+ mNotificationManager.cancel(mNotificationModel.getUnexpiredTimerNotificationId());
+ return;
+ }
+
+ // Filter the timers to just include unexpired ones.
+ final List<Timer> unexpired = new ArrayList<>();
+ for (Timer timer : getMutableTimers()) {
+ if (timer.isRunning() || timer.isPaused()) {
+ unexpired.add(timer);
+ }
+ }
+
+ // If no unexpired timers exist, cancel the notification.
+ if (unexpired.isEmpty()) {
+ mNotificationManager.cancel(mNotificationModel.getUnexpiredTimerNotificationId());
+ return;
+ }
+
+ // Sort the unexpired timers to locate the next one scheduled to expire.
+ Collections.sort(unexpired, Timer.EXPIRY_COMPARATOR);
+ final Timer timer = unexpired.get(0);
+ final long remainingTime = timer.getRemainingTime();
+
+ // Generate some descriptive text, a title, and some actions based on timer states.
+ final String contentText;
+ final String contentTitle;
+ @DrawableRes int firstActionIconId, secondActionIconId = 0;
+ @StringRes int firstActionTitleId, secondActionTitleId = 0;
+ Intent firstActionIntent, secondActionIntent = null;
+
+ if (unexpired.size() == 1) {
+ contentText = formatElapsedTimeUntilExpiry(remainingTime);
+
+ if (timer.isRunning()) {
+ // Single timer is running.
+ if (TextUtils.isEmpty(timer.getLabel())) {
+ contentTitle = mContext.getString(R.string.timer_notification_label);
+ } else {
+ contentTitle = timer.getLabel();
+ }
+
+ firstActionIconId = R.drawable.ic_pause_24dp;
+ firstActionTitleId = R.string.timer_pause;
+ firstActionIntent = new Intent(mContext, TimerService.class)
+ .setAction(HandleDeskClockApiCalls.ACTION_PAUSE_TIMER)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID, timer.getId());
+
+ secondActionIconId = R.drawable.ic_add_24dp;
+ secondActionTitleId = R.string.timer_plus_1_min;
+ secondActionIntent = new Intent(mContext, TimerService.class)
+ .setAction(HandleDeskClockApiCalls.ACTION_ADD_MINUTE_TIMER)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID, timer.getId());
+ } else {
+ // Single timer is paused.
+ contentTitle = mContext.getString(R.string.timer_paused);
+
+ firstActionIconId = R.drawable.ic_start_24dp;
+ firstActionTitleId = R.string.sw_resume_button;
+ firstActionIntent = new Intent(mContext, TimerService.class)
+ .setAction(HandleDeskClockApiCalls.ACTION_START_TIMER)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID, timer.getId());
+
+ secondActionIconId = R.drawable.ic_reset_24dp;
+ secondActionTitleId = R.string.sw_reset_button;
+ secondActionIntent = new Intent(mContext, TimerService.class)
+ .setAction(HandleDeskClockApiCalls.ACTION_RESET_TIMER)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID, timer.getId());
+ }
+ } else {
+ if (timer.isRunning()) {
+ // At least one timer is running.
+ final String timeRemaining = formatElapsedTimeUntilExpiry(remainingTime);
+ contentText = mContext.getString(R.string.next_timer_notif, timeRemaining);
+ contentTitle = mContext.getString(R.string.timers_in_use, unexpired.size());
+ } else {
+ // All timers are paused.
+ contentText = mContext.getString(R.string.all_timers_stopped_notif);
+ contentTitle = mContext.getString(R.string.timers_stopped, unexpired.size());
+ }
+
+ firstActionIconId = R.drawable.ic_reset_24dp;
+ firstActionTitleId = R.string.timer_reset_all;
+ firstActionIntent = TimerService.createResetUnexpiredTimersIntent(mContext);
+ }
+
+ // Intent to load the app and show the timer when the notification is tapped.
+ final Intent showApp = new Intent(mContext, HandleDeskClockApiCalls.class)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .setAction(HandleDeskClockApiCalls.ACTION_SHOW_TIMERS)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID, timer.getId())
+ .putExtra(HandleDeskClockApiCalls.EXTRA_EVENT_LABEL, R.string.label_notification);
+
+ final PendingIntent pendingShowApp = PendingIntent.getActivity(mContext, 0, showApp,
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+
+ final NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
+ .setOngoing(true)
+ .setLocalOnly(true)
+ .setShowWhen(false)
+ .setAutoCancel(false)
+ .setContentText(contentText)
+ .setContentTitle(contentTitle)
+ .setContentIntent(pendingShowApp)
+ .setSmallIcon(R.drawable.stat_notify_timer)
+ .setPriority(NotificationCompat.PRIORITY_HIGH)
+ .setCategory(NotificationCompat.CATEGORY_ALARM)
+ .setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
+
+ final PendingIntent firstAction = PendingIntent.getService(mContext, 0,
+ firstActionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ final String firstActionTitle = mContext.getString(firstActionTitleId);
+ builder.addAction(firstActionIconId, firstActionTitle, firstAction);
+
+ if (secondActionIntent != null) {
+ final PendingIntent secondAction = PendingIntent.getService(mContext, 0,
+ secondActionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ final String secondActionTitle = mContext.getString(secondActionTitleId);
+ builder.addAction(secondActionIconId, secondActionTitle, secondAction);
+ }
+
+ // Update the notification.
+ final Notification notification = builder.build();
+ final int notificationId = mNotificationModel.getUnexpiredTimerNotificationId();
+ mNotificationManager.notify(notificationId, notification);
+
+ final Intent updateNotification = TimerService.createUpdateNotificationIntent(mContext);
+ if (timer.isRunning() && remainingTime > MINUTE_IN_MILLIS) {
+ // Schedule a callback to update the time-sensitive information of the running timer.
+ final PendingIntent pi = PendingIntent.getService(mContext, 0, updateNotification,
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
+
+ final long nextMinuteChange = remainingTime % MINUTE_IN_MILLIS;
+ final long triggerTime = SystemClock.elapsedRealtime() + nextMinuteChange;
+
+ schedulePendingIntent(triggerTime, pi);
+ } else {
+ // Cancel the update notification callback.
+ final PendingIntent pi = PendingIntent.getService(mContext, 0, updateNotification,
+ PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_NO_CREATE);
+ if (pi != null) {
+ mAlarmManager.cancel(pi);
+ pi.cancel();
+ }
+ }
+ }
+
+ /**
+ * Updates the heads-up notification controlling expired timers. This heads-up notification is
+ * displayed whether the application is open or not.
+ */
+ private void updateHeadsUpNotification() {
+ // Nothing can be done with the heads-up notification without a valid service reference.
+ if (mService == null) {
+ return;
+ }
+
+ final List<Timer> expired = getExpiredTimers();
+
+ // If no expired timers exist, stop the service (which cancels the foreground notification).
+ if (expired.isEmpty()) {
+ mService.stopSelf();
+ mService = null;
+ return;
+ }
+
+ // Generate some descriptive text, a title, and an action name based on the timer count.
+ final int timerId;
+ final String contentText;
+ final String contentTitle;
+ final String resetActionTitle;
+ if (expired.size() > 1) {
+ timerId = -1;
+ contentText = mContext.getString(R.string.timer_multi_times_up, expired.size());
+ contentTitle = mContext.getString(R.string.timer_notification_label);
+ resetActionTitle = mContext.getString(R.string.timer_stop_all);
+ } else {
+ final Timer timer = expired.get(0);
+ timerId = timer.getId();
+ resetActionTitle = mContext.getString(R.string.timer_stop);
+ contentText = mContext.getString(R.string.timer_times_up);
+
+ final String label = timer.getLabel();
+ if (TextUtils.isEmpty(label)) {
+ contentTitle = mContext.getString(R.string.timer_notification_label);
+ } else {
+ contentTitle = label;
+ }
+ }
+
+ // Content intent shows the timer full screen when clicked.
+ final Intent content = new Intent(mContext, ExpiredTimersActivity.class);
+ final PendingIntent pendingContent = PendingIntent.getActivity(mContext, 0, content,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+
+ // Full screen intent has flags so it is different than the content intent.
+ final Intent fullScreen = new Intent(mContext, ExpiredTimersActivity.class)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
+ final PendingIntent pendingFullScreen = PendingIntent.getActivity(mContext, 0, fullScreen,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+
+ // First action intent is either reset single timer or reset all timers.
+ final Intent reset = TimerService.createResetExpiredTimersIntent(mContext);
+ final PendingIntent pendingReset = PendingIntent.getService(mContext, 0, reset,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+
+ final NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext)
+ .setWhen(0)
+ .setOngoing(true)
+ .setLocalOnly(true)
+ .setAutoCancel(false)
+ .setContentText(contentText)
+ .setContentTitle(contentTitle)
+ .setContentIntent(pendingContent)
+ .setSmallIcon(R.drawable.stat_notify_timer)
+ .setFullScreenIntent(pendingFullScreen, true)
+ .setPriority(NotificationCompat.PRIORITY_MAX)
+ .setDefaults(NotificationCompat.DEFAULT_LIGHTS)
+ .addAction(R.drawable.ic_stop_24dp, resetActionTitle, pendingReset);
+
+ // Add a second action if only a single timer is expired.
+ if (expired.size() == 1) {
+ // Second action intent adds a minute to a single timer.
+ final Intent addMinute = TimerService.createAddMinuteTimerIntent(mContext, timerId);
+ final PendingIntent pendingAddMinute = PendingIntent.getService(mContext, 0, addMinute,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+ final String addMinuteTitle = mContext.getString(R.string.timer_plus_1_min);
+ builder.addAction(R.drawable.ic_add_24dp, addMinuteTitle, pendingAddMinute);
+ }
+
+ // Update the notification.
+ final Notification notification = builder.build();
+ final int notificationId = mNotificationModel.getExpiredTimerNotificationId();
+ mService.startForeground(notificationId, notification);
+ }
+
+ /**
+ * Format "7 hours 52 minutes remaining"
+ */
+ @VisibleForTesting
+ String formatElapsedTimeUntilExpiry(long remainingTime) {
+ final int hours = (int) remainingTime / (int) HOUR_IN_MILLIS;
+ final int minutes = (int) remainingTime / ((int) MINUTE_IN_MILLIS) % 60;
+
+ String minSeq = Utils.getNumberFormattedQuantityString(mContext, R.plurals.minutes, minutes);
+ String hourSeq = Utils.getNumberFormattedQuantityString(mContext, R.plurals.hours, hours);
+
+ // The verb "remaining" may have to change tense for singular subjects in some languages.
+ final String verb = mContext.getString((minutes > 1 || hours > 1)
+ ? R.string.timer_remaining_multiple
+ : R.string.timer_remaining_single);
+
+ final boolean showHours = hours > 0;
+ final boolean showMinutes = minutes > 0;
+
+ int formatStringId;
+ if (showHours) {
+ if (showMinutes) {
+ formatStringId = R.string.timer_notifications_hours_minutes;
+ } else {
+ formatStringId = R.string.timer_notifications_hours;
+ }
+ } else if (showMinutes) {
+ formatStringId = R.string.timer_notifications_minutes;
+ } else {
+ formatStringId = R.string.timer_notifications_less_min;
+ }
+ return String.format(mContext.getString(formatStringId), hourSeq, minSeq, verb);
+ }
+
+ private void schedulePendingIntent(long triggerTime, PendingIntent pi) {
+ if (Utils.isMOrLater()) {
+ // Make sure the timer fires when the device is in doze mode. The timer is not
+ // guaranteed to fire at the requested time. It may be delayed up to 15 minutes.
+ mAlarmManager.setExactAndAllowWhileIdle(ELAPSED_REALTIME_WAKEUP, triggerTime, pi);
+ } else {
+ mAlarmManager.setExact(ELAPSED_REALTIME_WAKEUP, triggerTime, pi);
+ }
+ }
+
+ /**
+ * Update the stopwatch notification in response to a locale change.
+ */
+ private final class LocaleChangedReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ updateNotification();
+ updateHeadsUpNotification();
+ }
+ }
+
+ /**
+ * This receiver is notified when shared preferences change. Cached information built on
+ * preferences must be cleared.
+ */
+ private final class PreferenceListener implements OnSharedPreferenceChangeListener {
+ @Override
+ public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+ switch (key) {
+ case SettingsActivity.KEY_TIMER_RINGTONE:
+ mTimerRingtoneUri = null;
+ mTimerRingtoneTitle = null;
+ break;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/provider/Alarm.java b/src/com/android/deskclock/provider/Alarm.java
index 54389e1..7fac18b 100644
--- a/src/com/android/deskclock/provider/Alarm.java
+++ b/src/com/android/deskclock/provider/Alarm.java
@@ -29,6 +29,7 @@
import android.os.Parcelable;
import com.android.deskclock.R;
+import com.android.deskclock.data.DataModel;
import java.util.Calendar;
import java.util.LinkedList;
@@ -44,9 +45,9 @@
* The default sort order for this table
*/
private static final String DEFAULT_SORT_ORDER =
- HOUR + ", " +
- MINUTES + " ASC" + ", " +
- _ID + " DESC";
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + HOUR + ", " +
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + MINUTES + " ASC" + ", " +
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + ClockContract.AlarmsColumns._ID + " DESC";
private static final String[] QUERY_COLUMNS = {
_ID,
@@ -60,6 +61,28 @@
DELETE_AFTER_USE
};
+ private static final String[] QUERY_ALARMS_WITH_INSTANCES_COLUMNS = {
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + _ID,
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + HOUR,
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + MINUTES,
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + DAYS_OF_WEEK,
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + ENABLED,
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + VIBRATE,
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + LABEL,
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + RINGTONE,
+ ClockDatabaseHelper.ALARMS_TABLE_NAME + "." + DELETE_AFTER_USE,
+ ClockDatabaseHelper.INSTANCES_TABLE_NAME + "."
+ + ClockContract.InstancesColumns.ALARM_STATE,
+ ClockDatabaseHelper.INSTANCES_TABLE_NAME + "." + ClockContract.InstancesColumns._ID,
+ ClockDatabaseHelper.INSTANCES_TABLE_NAME + "." + ClockContract.InstancesColumns.YEAR,
+ ClockDatabaseHelper.INSTANCES_TABLE_NAME + "." + ClockContract.InstancesColumns.MONTH,
+ ClockDatabaseHelper.INSTANCES_TABLE_NAME + "." + ClockContract.InstancesColumns.DAY,
+ ClockDatabaseHelper.INSTANCES_TABLE_NAME + "." + ClockContract.InstancesColumns.HOUR,
+ ClockDatabaseHelper.INSTANCES_TABLE_NAME + "." + ClockContract.InstancesColumns.MINUTES,
+ ClockDatabaseHelper.INSTANCES_TABLE_NAME + "." + ClockContract.InstancesColumns.LABEL,
+ ClockDatabaseHelper.INSTANCES_TABLE_NAME + "." + ClockContract.InstancesColumns.VIBRATE
+ };
+
/**
* These save calls to cursor.getColumnIndexOrThrow()
* THEY MUST BE KEPT IN SYNC WITH ABOVE QUERY COLUMNS
@@ -73,8 +96,18 @@
private static final int LABEL_INDEX = 6;
private static final int RINGTONE_INDEX = 7;
private static final int DELETE_AFTER_USE_INDEX = 8;
+ private static final int INSTANCE_STATE_INDEX = 9;
+ public static final int INSTANCE_ID_INDEX = 10;
+ public static final int INSTANCE_YEAR_INDEX = 11;
+ public static final int INSTANCE_MONTH_INDEX = 12;
+ public static final int INSTANCE_DAY_INDEX = 13;
+ public static final int INSTANCE_HOUR_INDEX = 14;
+ public static final int INSTANCE_MINUTE_INDEX = 15;
+ public static final int INSTANCE_LABEL_INDEX = 16;
+ public static final int INSTANCE_VIBRATE_INDEX = 17;
private static final int COLUMN_COUNT = DELETE_AFTER_USE_INDEX + 1;
+ private static final int ALARM_JOIN_INSTANCE_COLUMN_COUNT = INSTANCE_VIBRATE_INDEX + 1;
public static ContentValues createContentValues(Alarm alarm) {
ContentValues values = new ContentValues(COLUMN_COUNT);
@@ -99,10 +132,6 @@
return values;
}
- public static Intent createIntent(String action, long alarmId) {
- return new Intent(action).setData(getUri(alarmId));
- }
-
public static Intent createIntent(Context context, Class<?> cls, long alarmId) {
return new Intent(context, cls).setData(getUri(alarmId));
}
@@ -122,39 +151,31 @@
* @return cursor loader with all the alarms.
*/
public static CursorLoader getAlarmsCursorLoader(Context context) {
- return new CursorLoader(context, ClockContract.AlarmsColumns.CONTENT_URI,
- QUERY_COLUMNS, null, null, DEFAULT_SORT_ORDER);
+ return new CursorLoader(context, ALARMS_WITH_INSTANCES_URI,
+ QUERY_ALARMS_WITH_INSTANCES_COLUMNS, null, null, DEFAULT_SORT_ORDER);
}
/**
* Get alarm by id.
*
- * @param contentResolver to perform the query on.
+ * @param cr to perform the query on.
* @param alarmId for the desired alarm.
* @return alarm if found, null otherwise
*/
- public static Alarm getAlarm(ContentResolver contentResolver, long alarmId) {
- Cursor cursor = contentResolver.query(getUri(alarmId), QUERY_COLUMNS, null, null, null);
- Alarm result = null;
- if (cursor == null) {
- return result;
- }
-
- try {
+ public static Alarm getAlarm(ContentResolver cr, long alarmId) {
+ try (Cursor cursor = cr.query(getUri(alarmId), QUERY_COLUMNS, null, null, null)) {
if (cursor.moveToFirst()) {
- result = new Alarm(cursor);
+ return new Alarm(cursor);
}
- } finally {
- cursor.close();
}
- return result;
+ return null;
}
/**
* Get all alarms given conditions.
*
- * @param contentResolver to perform the query on.
+ * @param cr to perform the query on.
* @param selection A filter declaring which rows to return, formatted as an
* SQL WHERE clause (excluding the WHERE itself). Passing null will
* return all rows for the given URI.
@@ -163,34 +184,31 @@
* appear in the selection. The values will be bound as Strings.
* @return list of alarms matching where clause or empty list if none found.
*/
- public static List<Alarm> getAlarms(ContentResolver contentResolver,
- String selection, String ... selectionArgs) {
- Cursor cursor = contentResolver.query(CONTENT_URI, QUERY_COLUMNS,
- selection, selectionArgs, null);
- List<Alarm> result = new LinkedList<Alarm>();
- if (cursor == null) {
- return result;
- }
-
- try {
- if (cursor.moveToFirst()) {
+ public static List<Alarm> getAlarms(ContentResolver cr, String selection,
+ String... selectionArgs) {
+ final List<Alarm> result = new LinkedList<>();
+ try (Cursor cursor = cr.query(CONTENT_URI, QUERY_COLUMNS, selection, selectionArgs, null)) {
+ if (cursor != null && cursor.moveToFirst()) {
do {
result.add(new Alarm(cursor));
} while (cursor.moveToNext());
}
- } finally {
- cursor.close();
}
return result;
}
- public static boolean isTomorrow(Alarm alarm) {
- final Calendar now = Calendar.getInstance();
+ public static boolean isTomorrow(Alarm alarm, Calendar now) {
final int alarmHour = alarm.hour;
final int currHour = now.get(Calendar.HOUR_OF_DAY);
- return alarmHour < currHour ||
- (alarmHour == currHour && alarm.minutes <= now.get(Calendar.MINUTE));
+ // If the alarm is not snoozed and the time is less than the current time, it must be
+ // firing tomorrow.
+ // If the alarm is snoozed, return "false" to indicate that this alarm is firing today.
+ // (The alarm must have already rung today in order to be snoozed, and this function is only
+ // called on non-repeating alarms.)
+ return alarm.instanceState != AlarmInstance.SNOOZE_STATE
+ && (alarmHour < currHour
+ || (alarmHour == currHour && alarm.minutes <= now.get(Calendar.MINUTE)));
}
public static Alarm addAlarm(ContentResolver contentResolver, Alarm alarm) {
@@ -234,6 +252,8 @@
public String label;
public Uri alert;
public boolean deleteAfterUse;
+ public int instanceState;
+ public int instanceId;
// Creates a default alarm at the current time.
public Alarm() {
@@ -247,7 +267,7 @@
this.vibrate = true;
this.daysOfWeek = new DaysOfWeek(0);
this.label = "";
- this.alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
+ this.alert = DataModel.getDataModel().getDefaultAlarmRingtoneUri();
this.deleteAfterUse = false;
}
@@ -261,6 +281,11 @@
label = c.getString(LABEL_INDEX);
deleteAfterUse = c.getInt(DELETE_AFTER_USE_INDEX) == 1;
+ if (c.getColumnCount() == ALARM_JOIN_INSTANCE_COLUMN_COUNT) {
+ instanceState = c.getInt(INSTANCE_STATE_INDEX);
+ instanceId = c.getInt(INSTANCE_ID_INDEX);
+ }
+
if (c.isNull(RINGTONE_INDEX)) {
// Should we be saving this with the current ringtone or leave it null
// so it changes when user changes default ringtone?
@@ -278,15 +303,23 @@
daysOfWeek = new DaysOfWeek(p.readInt());
vibrate = p.readInt() == 1;
label = p.readString();
- alert = (Uri) p.readParcelable(null);
+ alert = p.readParcelable(null);
deleteAfterUse = p.readInt() == 1;
}
public String getLabelOrDefault(Context context) {
- if (label == null || label.length() == 0) {
- return context.getString(R.string.default_label);
- }
- return label;
+ return label.isEmpty() ? context.getString(R.string.default_label) : label;
+ }
+
+ /**
+ * Whether the alarm is in a state to show preemptive dismiss. Valid states are SNOOZE_STATE
+ * HIGH_NOTIFICATION, LOW_NOTIFICATION, and HIDE_NOTIFICATION.
+ */
+ public boolean canPreemptivelyDismiss() {
+ return instanceState == AlarmInstance.SNOOZE_STATE
+ || instanceState == AlarmInstance.HIGH_NOTIFICATION_STATE
+ || instanceState == AlarmInstance.LOW_NOTIFICATION_STATE
+ || instanceState == AlarmInstance.HIDE_NOTIFICATION_STATE;
}
public void writeToParcel(Parcel p, int flags) {
@@ -358,6 +391,12 @@
if (addDays > 0) {
nextInstanceTime.add(Calendar.DAY_OF_WEEK, addDays);
}
+
+ // Daylight Savings Time can alter the hours and minutes when adjusting the day above.
+ // Reset the desired hour and minute now that the correct day has been chosen.
+ nextInstanceTime.set(Calendar.HOUR_OF_DAY, hour);
+ nextInstanceTime.set(Calendar.MINUTE, minutes);
+
return nextInstanceTime;
}
diff --git a/src/com/android/deskclock/provider/AlarmInstance.java b/src/com/android/deskclock/provider/AlarmInstance.java
index ed04450..5be3c03 100644
--- a/src/com/android/deskclock/provider/AlarmInstance.java
+++ b/src/com/android/deskclock/provider/AlarmInstance.java
@@ -24,11 +24,13 @@
import android.database.Cursor;
import android.media.RingtoneManager;
import android.net.Uri;
+import android.preference.PreferenceManager;
import com.android.deskclock.LogUtils;
import com.android.deskclock.R;
-import com.android.deskclock.SettingsActivity;
import com.android.deskclock.Utils;
+import com.android.deskclock.alarms.AlarmStateManager;
+import com.android.deskclock.settings.SettingsActivity;
import java.util.Calendar;
import java.util.LinkedList;
@@ -136,26 +138,18 @@
/**
* Get alarm instance from instanceId.
*
- * @param contentResolver to perform the query on.
+ * @param cr to perform the query on.
* @param instanceId for the desired instance.
* @return instance if found, null otherwise
*/
- public static AlarmInstance getInstance(ContentResolver contentResolver, long instanceId) {
- Cursor cursor = contentResolver.query(getUri(instanceId), QUERY_COLUMNS, null, null, null);
- AlarmInstance result = null;
- if (cursor == null) {
- return result;
- }
-
- try {
- if (cursor.moveToFirst()) {
- result = new AlarmInstance(cursor);
+ public static AlarmInstance getInstance(ContentResolver cr, long instanceId) {
+ try (Cursor cursor = cr.query(getUri(instanceId), QUERY_COLUMNS, null, null, null)) {
+ if (cursor != null && cursor.moveToFirst()) {
+ return new AlarmInstance(cursor, false /* joinedTable */);
}
- } finally {
- cursor.close();
}
- return result;
+ return null;
}
/**
@@ -211,7 +205,7 @@
/**
* Get a list of instances given selection.
*
- * @param contentResolver to perform the query on.
+ * @param cr to perform the query on.
* @param selection A filter declaring which rows to return, formatted as an
* SQL WHERE clause (excluding the WHERE itself). Passing null will
* return all rows for the given URI.
@@ -220,23 +214,15 @@
* appear in the selection. The values will be bound as Strings.
* @return list of alarms matching where clause or empty list if none found.
*/
- public static List<AlarmInstance> getInstances(ContentResolver contentResolver,
- String selection, String ... selectionArgs) {
- Cursor cursor = contentResolver.query(CONTENT_URI, QUERY_COLUMNS,
- selection, selectionArgs, null);
- List<AlarmInstance> result = new LinkedList<>();
- if (cursor == null) {
- return result;
- }
-
- try {
+ public static List<AlarmInstance> getInstances(ContentResolver cr, String selection,
+ String... selectionArgs) {
+ final List<AlarmInstance> result = new LinkedList<>();
+ try (Cursor cursor = cr.query(CONTENT_URI, QUERY_COLUMNS, selection, selectionArgs, null)) {
if (cursor.moveToFirst()) {
do {
- result.add(new AlarmInstance(cursor));
+ result.add(new AlarmInstance(cursor, false /* joinedTable */));
} while (cursor.moveToNext());
}
- } finally {
- cursor.close();
}
return result;
@@ -279,15 +265,17 @@
}
/**
+ * @param context
* @param contentResolver to access the content provider
* @param alarmId identifies the alarm in question
* @param instanceId identifies the instance to keep; all other instances will be removed
*/
- public static void deleteOtherInstances(ContentResolver contentResolver, long alarmId,
- long instanceId) {
+ public static void deleteOtherInstances(Context context, ContentResolver contentResolver,
+ long alarmId, long instanceId) {
final List<AlarmInstance> instances = getInstancesByAlarmId(contentResolver, alarmId);
for (AlarmInstance instance : instances) {
if (instance.mId != instanceId) {
+ AlarmStateManager.unregisterInstance(context, instance);
deleteInstance(contentResolver, instance.mId);
}
}
@@ -320,15 +308,40 @@
mAlarmState = SILENT_STATE;
}
- public AlarmInstance(Cursor c) {
- mId = c.getLong(ID_INDEX);
- mYear = c.getInt(YEAR_INDEX);
- mMonth = c.getInt(MONTH_INDEX);
- mDay = c.getInt(DAY_INDEX);
- mHour = c.getInt(HOUR_INDEX);
- mMinute = c.getInt(MINUTES_INDEX);
- mLabel = c.getString(LABEL_INDEX);
- mVibrate = c.getInt(VIBRATE_INDEX) == 1;
+ public AlarmInstance(AlarmInstance instance) {
+ this.mId = instance.mId;
+ this.mYear = instance.mYear;
+ this.mMonth = instance.mMonth;
+ this.mDay = instance.mDay;
+ this.mHour = instance.mHour;
+ this.mMinute = instance.mMinute;
+ this.mLabel = instance.mLabel;
+ this.mVibrate = instance.mVibrate;
+ this.mRingtone = instance.mRingtone;
+ this.mAlarmId = instance.mAlarmId;
+ this.mAlarmState = instance.mAlarmState;
+ }
+
+ public AlarmInstance(Cursor c, boolean joinedTable) {
+ if (joinedTable) {
+ mId = c.getLong(Alarm.INSTANCE_ID_INDEX);
+ mYear = c.getInt(Alarm.INSTANCE_YEAR_INDEX);
+ mMonth = c.getInt(Alarm.INSTANCE_MONTH_INDEX);
+ mDay = c.getInt(Alarm.INSTANCE_DAY_INDEX);
+ mHour = c.getInt(Alarm.INSTANCE_HOUR_INDEX);
+ mMinute = c.getInt(Alarm.INSTANCE_MINUTE_INDEX);
+ mLabel = c.getString(Alarm.INSTANCE_LABEL_INDEX);
+ mVibrate = c.getInt(Alarm.INSTANCE_VIBRATE_INDEX) == 1;
+ } else {
+ mId = c.getLong(ID_INDEX);
+ mYear = c.getInt(YEAR_INDEX);
+ mMonth = c.getInt(MONTH_INDEX);
+ mDay = c.getInt(DAY_INDEX);
+ mHour = c.getInt(HOUR_INDEX);
+ mMinute = c.getInt(MINUTES_INDEX);
+ mLabel = c.getString(LABEL_INDEX);
+ mVibrate = c.getInt(VIBRATE_INDEX) == 1;
+ }
if (c.isNull(RINGTONE_INDEX)) {
// Should we be saving this with the current ringtone or leave it null
// so it changes when user changes default ringtone?
diff --git a/src/com/android/deskclock/provider/City.java b/src/com/android/deskclock/provider/City.java
deleted file mode 100644
index 761dc39..0000000
--- a/src/com/android/deskclock/provider/City.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2013 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.provider;
-
-import android.content.ContentResolver;
-import android.content.ContentUris;
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.net.Uri;
-
-import java.util.Calendar;
-import java.util.LinkedList;
-import java.util.List;
-
-public final class City implements ClockContract.CitiesColumns {
- private static final String[] QUERY_COLUMNS = {
- CITY_ID,
- CITY_NAME,
- TIMEZONE_NAME,
- TIMEZONE_OFFSET
- };
-
- /**
- * These save calls to cursor.getColumnIndexOrThrow()
- * THEY MUST BE KEPT IN SYNC WITH ABOVE QUERY COLUMNS
- */
- private static final int CITY_ID_INDEX = 0;
- private static final int CITY_NAME_INDEX = 1;
- private static final int TIMEZONE_NAME_INDEX = 2;
- private static final int TIMEZONE_OFFSET_INDEX = 3;
-
- private static final int COLUMN_COUNT = TIMEZONE_OFFSET_INDEX + 1;
-
- public static ContentValues createContentValues(City city) {
- ContentValues values = new ContentValues(COLUMN_COUNT);
- values.put(CITY_ID, city.mCityId);
- values.put(CITY_NAME, city.mCityName);
- values.put(TIMEZONE_NAME, city.mTimezoneName);
- values.put(TIMEZONE_OFFSET, city.mTimezoneOffset);
- return values;
- }
-
- public static String getCityId(Uri contentUri) {
- return contentUri.getLastPathSegment();
- }
-
- /**
- * Return content uri for specific city id.
- *
- * @param cityId to append to content uri
- *
- * @return a new city content uri with the given ID appended to the end of the path
- */
- public static Uri getContentUriForId(String cityId) {
- return CONTENT_URI.buildUpon().appendEncodedPath(cityId).build();
- }
-
-
- /**
- * Get city from cityId.
- *
- * @param contentResolver to perform the query on.
- * @param cityId for the desired city.
- * @return city if found, null otherwise
- */
- public static City getCity(ContentResolver contentResolver, String cityId) {
- Cursor cursor = contentResolver.query(getContentUriForId(cityId),
- QUERY_COLUMNS, null, null, null);
- City result = null;
- if (cursor == null) {
- return result;
- }
-
- try {
- if (cursor.moveToFirst()) {
- result = new City(cursor);
- }
- } finally {
- cursor.close();
- }
-
- return result;
- }
-
- /**
- * Get a list of cities given selection.
- *
- * @param contentResolver to perform the query on.
- * @param selection A filter declaring which rows to return, formatted as an
- * SQL WHERE clause (excluding the WHERE itself). Passing null will
- * return all rows for the given URI.
- * @param selectionArgs You may include ?s in selection, which will be
- * replaced by the values from selectionArgs, in the order that they
- * appear in the selection. The values will be bound as Strings.
- * @return list of alarms matching where clause or empty list if none found.
- */
- public static List<City> getCities(ContentResolver contentResolver,
- String selection, String... selectionArgs) {
- Cursor cursor = contentResolver.query(CONTENT_URI, QUERY_COLUMNS,
- selection, selectionArgs, null);
- List<City> result = new LinkedList<City>();
- if (cursor == null) {
- return result;
- }
-
- try {
- if (cursor.moveToFirst()) {
- do {
- result.add(new City(cursor));
- } while (cursor.moveToNext());
- }
- } finally {
- cursor.close();
- }
-
- return result;
- }
-
- public static City addCity(ContentResolver contentResolver, City city) {
- ContentValues values = createContentValues(city);
- Uri uri = contentResolver.insert(CONTENT_URI, values);
- city.mCityId = getCityId(uri);
- return city;
- }
-
- public static boolean updateCity(ContentResolver contentResolver, City city) {
- ContentValues values = createContentValues(city);
- Uri updateUri = getContentUriForId(city.mCityId);
- long rowsUpdated = contentResolver.update(updateUri, values, null, null);
- return rowsUpdated == 1;
- }
-
- public static boolean deleteCity(ContentResolver contentResolver, String cityId) {
- Uri uri = getContentUriForId(cityId);
- int deletedRows = contentResolver.delete(uri, "", null);
- return deletedRows == 1;
- }
-
- // Public fields
- public String mCityId;
- public String mCityName;
- public String mTimezoneName;
- public int mTimezoneOffset;
-
- public City(String cityId, String cityName, String timezoneName, int timezoneOffset) {
- mCityId = cityId;
- mCityName = cityName;
- mTimezoneName = timezoneName;
- mTimezoneOffset = timezoneOffset;
- }
-
- public City(Cursor c) {
- mCityId = c.getString(CITY_ID_INDEX);
- mCityName = c.getString(CITY_NAME_INDEX);
- mTimezoneName = c.getString(TIMEZONE_NAME_INDEX);
- mTimezoneOffset = c.getInt(TIMEZONE_OFFSET_INDEX);
- }
-
- @Override
- public boolean equals(Object o) {
- if (!(o instanceof City)) return false;
- final City other = (City) o;
- return mCityId.equals(other.mCityId);
- }
-
- @Override
- public int hashCode() {
- return mCityId.hashCode();
- }
-
- @Override
- public String toString() {
- return "Instance{" +
- "mCityId=" + mCityId +
- ", mCityName=" + mCityName +
- ", mTimezoneName=" + mTimezoneName +
- ", mTimezoneOffset=" + mTimezoneOffset +
- '}';
- }
-}
diff --git a/src/com/android/deskclock/provider/ClockContract.java b/src/com/android/deskclock/provider/ClockContract.java
index 20aed2a..bb22af3 100644
--- a/src/com/android/deskclock/provider/ClockContract.java
+++ b/src/com/android/deskclock/provider/ClockContract.java
@@ -18,6 +18,8 @@
import android.net.Uri;
import android.provider.BaseColumns;
+import com.android.deskclock.BuildConfig;
+
/**
* <p>
* The contract between the clock provider and desk clock. Contains
@@ -33,7 +35,6 @@
* <li>The {@link InstancesColumns} table holds the current state of each
* alarm in the AlarmsColumn table.
* </li>
- * <li>The {@link CitiesColumns} table holds all user selectable cities</li>
* </ul>
*/
public final class ClockContract {
@@ -41,7 +42,7 @@
* This authority is used for writing to or querying from the clock
* provider.
*/
- public static final String AUTHORITY = "com.android.deskclock";
+ public static final String AUTHORITY = BuildConfig.APPLICATION_ID;
/**
* This utility class cannot be instantiated
@@ -55,25 +56,25 @@
/**
* This string is used to indicate no ringtone.
*/
- public static final Uri NO_RINGTONE_URI = Uri.EMPTY;
+ Uri NO_RINGTONE_URI = Uri.EMPTY;
/**
* This string is used to indicate no ringtone.
*/
- public static final String NO_RINGTONE = NO_RINGTONE_URI.toString();
+ String NO_RINGTONE = NO_RINGTONE_URI.toString();
/**
* True if alarm should vibrate
* <p>Type: BOOLEAN</p>
*/
- public static final String VIBRATE = "vibrate";
+ String VIBRATE = "vibrate";
/**
* Alarm label.
*
* <p>Type: STRING</p>
*/
- public static final String LABEL = "label";
+ String LABEL = "label";
/**
* Audio alert to play when alarm triggers. Null entry
@@ -82,7 +83,7 @@
*
* <p>Type: STRING</p>
*/
- public static final String RINGTONE = "ringtone";
+ String RINGTONE = "ringtone";
}
/**
@@ -92,19 +93,26 @@
/**
* The content:// style URL for this table.
*/
- public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/alarms");
+ Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/alarms");
+
+ /**
+ * The content:// style URL for the alarms with instance tables, which is used to get the
+ * next firing instance and the current state of an alarm.
+ */
+ Uri ALARMS_WITH_INSTANCES_URI = Uri.parse("content://" + AUTHORITY
+ + "/alarms_with_instances");
/**
* Hour in 24-hour localtime 0 - 23.
* <p>Type: INTEGER</p>
*/
- public static final String HOUR = "hour";
+ String HOUR = "hour";
/**
* Minutes in localtime 0 - 59.
* <p>Type: INTEGER</p>
*/
- public static final String MINUTES = "minutes";
+ String MINUTES = "minutes";
/**
* Days of the week encoded as a bit set.
@@ -112,19 +120,19 @@
*
* {@link DaysOfWeek}
*/
- public static final String DAYS_OF_WEEK = "daysofweek";
+ String DAYS_OF_WEEK = "daysofweek";
/**
* True if alarm is active.
* <p>Type: BOOLEAN</p>
*/
- public static final String ENABLED = "enabled";
+ String ENABLED = "enabled";
/**
* Determine if alarm is deleted after it has been used.
* <p>Type: INTEGER</p>
*/
- public static final String DELETE_AFTER_USE = "delete_after_use";
+ String DELETE_AFTER_USE = "delete_after_use";
}
/**
@@ -134,7 +142,7 @@
/**
* The content:// style URL for this table.
*/
- public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/instances");
+ Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/instances");
/**
* Alarm state when to show no notification.
@@ -142,7 +150,7 @@
* Can transitions to:
* LOW_NOTIFICATION_STATE
*/
- public static final int SILENT_STATE = 0;
+ int SILENT_STATE = 0;
/**
* Alarm state to show low priority alarm notification.
@@ -152,7 +160,7 @@
* HIGH_NOTIFICATION_STATE
* DISMISSED_STATE
*/
- public static final int LOW_NOTIFICATION_STATE = 1;
+ int LOW_NOTIFICATION_STATE = 1;
/**
* Alarm state to hide low priority alarm notification.
@@ -160,7 +168,7 @@
* Can transitions to:
* HIGH_NOTIFICATION_STATE
*/
- public static final int HIDE_NOTIFICATION_STATE = 2;
+ int HIDE_NOTIFICATION_STATE = 2;
/**
* Alarm state to show high priority alarm notification.
@@ -169,7 +177,7 @@
* DISMISSED_STATE
* FIRED_STATE
*/
- public static final int HIGH_NOTIFICATION_STATE = 3;
+ int HIGH_NOTIFICATION_STATE = 3;
/**
* Alarm state when alarm is in snooze.
@@ -178,7 +186,7 @@
* DISMISSED_STATE
* FIRED_STATE
*/
- public static final int SNOOZE_STATE = 4;
+ int SNOOZE_STATE = 4;
/**
* Alarm state when alarm is being fired.
@@ -188,7 +196,7 @@
* SNOOZED_STATE
* MISSED_STATE
*/
- public static final int FIRED_STATE = 5;
+ int FIRED_STATE = 5;
/**
* Alarm state when alarm has been missed.
@@ -196,95 +204,61 @@
* Can transitions to:
* DISMISSED_STATE
*/
- public static final int MISSED_STATE = 6;
+ int MISSED_STATE = 6;
/**
* Alarm state when alarm is done.
*/
- public static final int DISMISSED_STATE = 7;
+ int DISMISSED_STATE = 7;
/**
* Alarm state when alarm has been dismissed before its intended firing time.
*/
- public static final int PREDISMISSED_STATE = 8;
+ int PREDISMISSED_STATE = 8;
/**
* Alarm year.
*
* <p>Type: INTEGER</p>
*/
- public static final String YEAR = "year";
+ String YEAR = "year";
/**
* Alarm month in year.
*
* <p>Type: INTEGER</p>
*/
- public static final String MONTH = "month";
+ String MONTH = "month";
/**
* Alarm day in month.
*
* <p>Type: INTEGER</p>
*/
- public static final String DAY = "day";
+ String DAY = "day";
/**
* Alarm hour in 24-hour localtime 0 - 23.
* <p>Type: INTEGER</p>
*/
- public static final String HOUR = "hour";
+ String HOUR = "hour";
/**
* Alarm minutes in localtime 0 - 59
* <p>Type: INTEGER</p>
*/
- public static final String MINUTES = "minutes";
+ String MINUTES = "minutes";
/**
* Foreign key to Alarms table
* <p>Type: INTEGER (long)</p>
*/
- public static final String ALARM_ID = "alarm_id";
+ String ALARM_ID = "alarm_id";
/**
* Alarm state
* <p>Type: INTEGER</p>
*/
- public static final String ALARM_STATE = "alarm_state";
- }
-
- /**
- * Constants for the Cities table, which contains all selectable cities.
- */
- protected interface CitiesColumns {
- /**
- * The content:// style URL for this table.
- */
- public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/cities");
-
- /**
- * Primary id for city.
- * <p>Type: STRING</p>
- */
- public static final String CITY_ID = "city_id";
-
- /**
- * City name.
- * <p>Type: STRING</p>
- */
- public static final String CITY_NAME = "city_name";
-
- /**
- * Timezone name of city.
- * <p>Type: STRING</p>
- */
- public static final String TIMEZONE_NAME = "timezone_name";
-
- /**
- * Timezone offset.
- * <p>Type: INTEGER</p>
- */
- public static final String TIMEZONE_OFFSET = "timezone_offset";
+ String ALARM_STATE = "alarm_state";
}
}
diff --git a/src/com/android/deskclock/provider/ClockDatabaseHelper.java b/src/com/android/deskclock/provider/ClockDatabaseHelper.java
index 9004471..b75670d 100644
--- a/src/com/android/deskclock/provider/ClockDatabaseHelper.java
+++ b/src/com/android/deskclock/provider/ClockDatabaseHelper.java
@@ -40,7 +40,6 @@
private static final int VERSION_5 = 5;
/**
- * Introduce:
* Added alarm_instances table
* Added selected_cities table
* Added DELETE_AFTER_USE column to alarms table
@@ -52,18 +51,23 @@
*/
private static final int VERSION_7 = 7;
+ /**
+ * Removed selected_cities table.
+ */
+ private static final int VERSION_8 = 8;
+
// This creates a default alarm at 8:30 for every Mon,Tue,Wed,Thu,Fri
- private static final String DEFAULT_ALARM_1 = "(8, 30, 31, 0, 0, '', NULL, 0);";
+ private static final String DEFAULT_ALARM_1 = "(8, 30, 31, 0, 1, '', NULL, 0);";
// This creates a default alarm at 9:30 for every Sat,Sun
- private static final String DEFAULT_ALARM_2 = "(9, 00, 96, 0, 0, '', NULL, 0);";
+ private static final String DEFAULT_ALARM_2 = "(9, 00, 96, 0, 1, '', NULL, 0);";
// Database and table names
static final String DATABASE_NAME = "alarms.db";
static final String OLD_ALARMS_TABLE_NAME = "alarms";
static final String ALARMS_TABLE_NAME = "alarm_templates";
static final String INSTANCES_TABLE_NAME = "alarm_instances";
- static final String CITIES_TABLE_NAME = "selected_cities";
+ private static final String SELECTED_CITIES_TABLE_NAME = "selected_cities";
private static void createAlarmsTable(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + ALARMS_TABLE_NAME + " (" +
@@ -98,27 +102,14 @@
LogUtils.i("Instance table created");
}
- private static void createCitiesTable(SQLiteDatabase db) {
- db.execSQL("CREATE TABLE " + CITIES_TABLE_NAME + " (" +
- ClockContract.CitiesColumns.CITY_ID + " TEXT PRIMARY KEY," +
- ClockContract.CitiesColumns.CITY_NAME + " TEXT NOT NULL, " +
- ClockContract.CitiesColumns.TIMEZONE_NAME + " TEXT NOT NULL, " +
- ClockContract.CitiesColumns.TIMEZONE_OFFSET + " INTEGER NOT NULL);");
- LogUtils.i("Cities table created");
- }
-
- private Context mContext;
-
public ClockDatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null, VERSION_7);
- mContext = context;
+ super(context, DATABASE_NAME, null, VERSION_8);
}
@Override
public void onCreate(SQLiteDatabase db) {
createAlarmsTable(db);
createInstanceTable(db);
- createCitiesTable(db);
// insert default alarms
LogUtils.i("Inserting default alarms");
@@ -138,21 +129,23 @@
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) {
- LogUtils.v("Upgrading alarms database from version "
- + oldVersion + " to " + currentVersion);
+ LogUtils.v("Upgrading alarms database from version %d to %d", oldVersion, currentVersion);
+
+ if (oldVersion <= VERSION_7) {
+ // This was not used in VERSION_7 or prior, so we can just drop it.
+ db.execSQL("DROP TABLE IF EXISTS " + SELECTED_CITIES_TABLE_NAME + ";");
+ }
if (oldVersion <= VERSION_6) {
- // These were not used in DB_VERSION_6, so we can just drop them.
+ // This was not used in VERSION_6 or prior, so we can just drop it.
db.execSQL("DROP TABLE IF EXISTS " + INSTANCES_TABLE_NAME + ";");
- db.execSQL("DROP TABLE IF EXISTS " + CITIES_TABLE_NAME + ";");
// Create new alarms table and copy over the data
createAlarmsTable(db);
createInstanceTable(db);
- createCitiesTable(db);
LogUtils.i("Copying old alarms to new table");
- String[] OLD_TABLE_COLUMNS = {
+ final String[] OLD_TABLE_COLUMNS = {
"_id",
"hour",
"minutes",
@@ -162,35 +155,36 @@
"message",
"alert",
};
- Cursor cursor = db.query(OLD_ALARMS_TABLE_NAME, OLD_TABLE_COLUMNS,
- null, null, null, null, null);
- Calendar currentTime = Calendar.getInstance();
- while (cursor.moveToNext()) {
- Alarm alarm = new Alarm();
- alarm.id = cursor.getLong(0);
- alarm.hour = cursor.getInt(1);
- alarm.minutes = cursor.getInt(2);
- alarm.daysOfWeek = new DaysOfWeek(cursor.getInt(3));
- alarm.enabled = cursor.getInt(4) == 1;
- alarm.vibrate = cursor.getInt(5) == 1;
- alarm.label = cursor.getString(6);
+ try (Cursor cursor = db.query(OLD_ALARMS_TABLE_NAME, OLD_TABLE_COLUMNS,
+ null, null, null, null, null)) {
+ final Calendar currentTime = Calendar.getInstance();
+ while (cursor != null && cursor.moveToNext()) {
+ final Alarm alarm = new Alarm();
+ alarm.id = cursor.getLong(0);
+ alarm.hour = cursor.getInt(1);
+ alarm.minutes = cursor.getInt(2);
+ alarm.daysOfWeek = new DaysOfWeek(cursor.getInt(3));
+ alarm.enabled = cursor.getInt(4) == 1;
+ alarm.vibrate = cursor.getInt(5) == 1;
+ alarm.label = cursor.getString(6);
- String alertString = cursor.getString(7);
- if ("silent".equals(alertString)) {
- alarm.alert = Alarm.NO_RINGTONE_URI;
- } else {
- alarm.alert = TextUtils.isEmpty(alertString) ? null : Uri.parse(alertString);
- }
+ final String alertString = cursor.getString(7);
+ if ("silent".equals(alertString)) {
+ alarm.alert = Alarm.NO_RINGTONE_URI;
+ } else {
+ alarm.alert =
+ TextUtils.isEmpty(alertString) ? null : Uri.parse(alertString);
+ }
- // Save new version of alarm and create alarminstance for it
- db.insert(ALARMS_TABLE_NAME, null, Alarm.createContentValues(alarm));
- if (alarm.enabled) {
- AlarmInstance newInstance = alarm.createInstanceAfter(currentTime);
- db.insert(INSTANCES_TABLE_NAME, null,
- AlarmInstance.createContentValues(newInstance));
+ // Save new version of alarm and create alarm instance for it
+ db.insert(ALARMS_TABLE_NAME, null, Alarm.createContentValues(alarm));
+ if (alarm.enabled) {
+ AlarmInstance newInstance = alarm.createInstanceAfter(currentTime);
+ db.insert(INSTANCES_TABLE_NAME, null,
+ AlarmInstance.createContentValues(newInstance));
+ }
}
}
- cursor.close();
LogUtils.i("Dropping old alarm table");
db.execSQL("DROP TABLE IF EXISTS " + OLD_ALARMS_TABLE_NAME + ";");
@@ -200,22 +194,24 @@
long fixAlarmInsert(ContentValues values) {
// Why are we doing this? Is this not a programming bug if we try to
// insert an already used id?
- SQLiteDatabase db = getWritableDatabase();
+ final SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
long rowId = -1;
try {
// Check if we are trying to re-use an existing id.
- Object value = values.get(ClockContract.AlarmsColumns._ID);
+ final Object value = values.get(ClockContract.AlarmsColumns._ID);
if (value != null) {
long id = (Long) value;
if (id > -1) {
- final Cursor cursor = db.query(ALARMS_TABLE_NAME,
- new String[]{ClockContract.AlarmsColumns._ID},
- ClockContract.AlarmsColumns._ID + " = ?",
- new String[]{id + ""}, null, null, null);
- if (cursor.moveToFirst()) {
- // Record exists. Remove the id so sqlite can generate a new one.
- values.putNull(ClockContract.AlarmsColumns._ID);
+ final String[] columns = {ClockContract.AlarmsColumns._ID};
+ final String selection = ClockContract.AlarmsColumns._ID + " = ?";
+ final String[] selectionArgs = {String.valueOf(id)};
+ try (Cursor cursor = db.query(ALARMS_TABLE_NAME, columns, selection,
+ selectionArgs, null, null, null)) {
+ if (cursor.moveToFirst()) {
+ // Record exists. Remove the id so sqlite can generate a new one.
+ values.putNull(ClockContract.AlarmsColumns._ID);
+ }
}
}
}
diff --git a/src/com/android/deskclock/provider/ClockProvider.java b/src/com/android/deskclock/provider/ClockProvider.java
index 727f051..c4ee7cc 100644
--- a/src/com/android/deskclock/provider/ClockProvider.java
+++ b/src/com/android/deskclock/provider/ClockProvider.java
@@ -17,6 +17,7 @@
package com.android.deskclock.provider;
import android.content.ContentProvider;
+import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
@@ -27,28 +28,89 @@
import android.net.Uri;
import android.preference.PreferenceManager;
import android.text.TextUtils;
+import android.util.ArrayMap;
import com.android.deskclock.LogUtils;
import com.android.deskclock.Utils;
+import java.util.Map;
+
+import static com.android.deskclock.provider.ClockContract.AlarmsColumns;
+import static com.android.deskclock.provider.ClockContract.InstancesColumns;
+import static com.android.deskclock.provider.ClockDatabaseHelper.ALARMS_TABLE_NAME;
+import static com.android.deskclock.provider.ClockDatabaseHelper.INSTANCES_TABLE_NAME;
+
public class ClockProvider extends ContentProvider {
+
private ClockDatabaseHelper mOpenHelper;
private static final int ALARMS = 1;
private static final int ALARMS_ID = 2;
private static final int INSTANCES = 3;
private static final int INSTANCES_ID = 4;
- private static final int CITIES = 5;
- private static final int CITIES_ID = 6;
+ private static final int ALARMS_WITH_INSTANCES = 5;
- private static final UriMatcher sURLMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+ /**
+ * Projection map used by query for snoozed alarms.
+ */
+ private static final Map<String, String> sAlarmsWithInstancesProjection = new ArrayMap<>();
static {
- sURLMatcher.addURI(ClockContract.AUTHORITY, "alarms", ALARMS);
- sURLMatcher.addURI(ClockContract.AUTHORITY, "alarms/#", ALARMS_ID);
- sURLMatcher.addURI(ClockContract.AUTHORITY, "instances", INSTANCES);
- sURLMatcher.addURI(ClockContract.AUTHORITY, "instances/#", INSTANCES_ID);
- sURLMatcher.addURI(ClockContract.AUTHORITY, "cities", CITIES);
- sURLMatcher.addURI(ClockContract.AUTHORITY, "cities/*", CITIES_ID);
+ sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns._ID,
+ ALARMS_TABLE_NAME + "." + AlarmsColumns._ID);
+ sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns.HOUR,
+ ALARMS_TABLE_NAME + "." + AlarmsColumns.HOUR);
+ sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns.MINUTES,
+ ALARMS_TABLE_NAME + "." + AlarmsColumns.MINUTES);
+ sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns.DAYS_OF_WEEK,
+ ALARMS_TABLE_NAME + "." + AlarmsColumns.DAYS_OF_WEEK);
+ sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns.ENABLED,
+ ALARMS_TABLE_NAME + "." + AlarmsColumns.ENABLED);
+ sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns.VIBRATE,
+ ALARMS_TABLE_NAME + "." + AlarmsColumns.VIBRATE);
+ sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns.LABEL,
+ ALARMS_TABLE_NAME + "." + AlarmsColumns.LABEL);
+ sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns.RINGTONE,
+ ALARMS_TABLE_NAME + "." + AlarmsColumns.RINGTONE);
+ sAlarmsWithInstancesProjection.put(ALARMS_TABLE_NAME + "." + AlarmsColumns.DELETE_AFTER_USE,
+ ALARMS_TABLE_NAME + "." + AlarmsColumns.DELETE_AFTER_USE);
+ sAlarmsWithInstancesProjection.put(INSTANCES_TABLE_NAME + "."
+ + InstancesColumns.ALARM_STATE,
+ INSTANCES_TABLE_NAME + "." + InstancesColumns.ALARM_STATE);
+ sAlarmsWithInstancesProjection.put(INSTANCES_TABLE_NAME + "." + InstancesColumns._ID,
+ INSTANCES_TABLE_NAME + "." + InstancesColumns._ID);
+ sAlarmsWithInstancesProjection.put(INSTANCES_TABLE_NAME + "." + InstancesColumns.YEAR,
+ INSTANCES_TABLE_NAME + "." + InstancesColumns.YEAR);
+ sAlarmsWithInstancesProjection.put(INSTANCES_TABLE_NAME + "." + InstancesColumns.MONTH,
+ INSTANCES_TABLE_NAME + "." + InstancesColumns.MONTH);
+ sAlarmsWithInstancesProjection.put(INSTANCES_TABLE_NAME + "." + InstancesColumns.DAY,
+ INSTANCES_TABLE_NAME + "." + InstancesColumns.DAY);
+ sAlarmsWithInstancesProjection.put(INSTANCES_TABLE_NAME + "." + InstancesColumns.HOUR,
+ INSTANCES_TABLE_NAME + "." + InstancesColumns.HOUR);
+ sAlarmsWithInstancesProjection.put(INSTANCES_TABLE_NAME + "." + InstancesColumns.MINUTES,
+ INSTANCES_TABLE_NAME + "." + InstancesColumns.MINUTES);
+ sAlarmsWithInstancesProjection.put(INSTANCES_TABLE_NAME + "." + InstancesColumns.LABEL,
+ INSTANCES_TABLE_NAME + "." + InstancesColumns.LABEL);
+ sAlarmsWithInstancesProjection.put(INSTANCES_TABLE_NAME + "." + InstancesColumns.VIBRATE,
+ INSTANCES_TABLE_NAME + "." + InstancesColumns.VIBRATE);
+ }
+
+ private static final String ALARM_JOIN_INSTANCE_TABLE_STATEMENT =
+ ALARMS_TABLE_NAME + " LEFT JOIN " + INSTANCES_TABLE_NAME + " ON (" +
+ ALARMS_TABLE_NAME + "." + AlarmsColumns._ID + " = " + InstancesColumns.ALARM_ID + ")";
+
+ private static final String ALARM_JOIN_INSTANCE_WHERE_STATEMENT =
+ InstancesColumns.ALARM_STATE + " IS NULL OR " +
+ InstancesColumns.ALARM_STATE + " = (SELECT MIN(" + InstancesColumns.ALARM_STATE +
+ ") FROM " + INSTANCES_TABLE_NAME + " WHERE " + InstancesColumns.ALARM_ID +
+ " = " + ALARMS_TABLE_NAME + "." + AlarmsColumns._ID + ")";
+
+ private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+ static {
+ sURIMatcher.addURI(ClockContract.AUTHORITY, "alarms", ALARMS);
+ sURIMatcher.addURI(ClockContract.AUTHORITY, "alarms/#", ALARMS_ID);
+ sURIMatcher.addURI(ClockContract.AUTHORITY, "instances", INSTANCES);
+ sURIMatcher.addURI(ClockContract.AUTHORITY, "instances/#", INSTANCES_ID);
+ sURIMatcher.addURI(ClockContract.AUTHORITY, "alarms_with_instances", ALARMS_WITH_INSTANCES);
}
public ClockProvider() {
@@ -79,41 +141,37 @@
public Cursor query(Uri uri, String[] projectionIn, String selection, String[] selectionArgs,
String sort) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
+ SQLiteDatabase db = mOpenHelper.getReadableDatabase();
// Generate the body of the query
- int match = sURLMatcher.match(uri);
+ int match = sURIMatcher.match(uri);
switch (match) {
case ALARMS:
- qb.setTables(ClockDatabaseHelper.ALARMS_TABLE_NAME);
+ qb.setTables(ALARMS_TABLE_NAME);
break;
case ALARMS_ID:
- qb.setTables(ClockDatabaseHelper.ALARMS_TABLE_NAME);
- qb.appendWhere(ClockContract.AlarmsColumns._ID + "=");
+ qb.setTables(ALARMS_TABLE_NAME);
+ qb.appendWhere(AlarmsColumns._ID + "=");
qb.appendWhere(uri.getLastPathSegment());
break;
case INSTANCES:
- qb.setTables(ClockDatabaseHelper.INSTANCES_TABLE_NAME);
+ qb.setTables(INSTANCES_TABLE_NAME);
break;
case INSTANCES_ID:
- qb.setTables(ClockDatabaseHelper.INSTANCES_TABLE_NAME);
- qb.appendWhere(ClockContract.InstancesColumns._ID + "=");
+ qb.setTables(INSTANCES_TABLE_NAME);
+ qb.appendWhere(InstancesColumns._ID + "=");
qb.appendWhere(uri.getLastPathSegment());
break;
- case CITIES:
- qb.setTables(ClockDatabaseHelper.CITIES_TABLE_NAME);
- break;
- case CITIES_ID:
- qb.setTables(ClockDatabaseHelper.CITIES_TABLE_NAME);
- qb.appendWhere(ClockContract.CitiesColumns.CITY_ID + "=");
- qb.appendWhere(uri.getLastPathSegment());
+ case ALARMS_WITH_INSTANCES:
+ qb.setTables(ALARM_JOIN_INSTANCE_TABLE_STATEMENT);
+ qb.appendWhere(ALARM_JOIN_INSTANCE_WHERE_STATEMENT);
+ qb.setProjectionMap(sAlarmsWithInstancesProjection);
break;
default:
- throw new IllegalArgumentException("Unknown URL " + uri);
+ throw new IllegalArgumentException("Unknown URI " + uri);
}
- SQLiteDatabase db = mOpenHelper.getReadableDatabase();
- Cursor ret = qb.query(db, projectionIn, selection, selectionArgs,
- null, null, sort);
+ Cursor ret = qb.query(db, projectionIn, selection, selectionArgs, null, null, sort);
if (ret == null) {
LogUtils.e("Alarms.query: failed");
@@ -126,7 +184,7 @@
@Override
public String getType(Uri uri) {
- int match = sURLMatcher.match(uri);
+ int match = sURIMatcher.match(uri);
switch (match) {
case ALARMS:
return "vnd.android.cursor.dir/alarms";
@@ -136,12 +194,8 @@
return "vnd.android.cursor.dir/instances";
case INSTANCES_ID:
return "vnd.android.cursor.item/instances";
- case CITIES:
- return "vnd.android.cursor.dir/cities";
- case CITIES_ID:
- return "vnd.android.cursor.item/cities";
default:
- throw new IllegalArgumentException("Unknown URL");
+ throw new IllegalArgumentException("Unknown URI");
}
}
@@ -150,32 +204,25 @@
int count;
String alarmId;
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
- switch (sURLMatcher.match(uri)) {
+ switch (sURIMatcher.match(uri)) {
case ALARMS_ID:
alarmId = uri.getLastPathSegment();
- count = db.update(ClockDatabaseHelper.ALARMS_TABLE_NAME, values,
- ClockContract.AlarmsColumns._ID + "=" + alarmId,
+ count = db.update(ALARMS_TABLE_NAME, values,
+ AlarmsColumns._ID + "=" + alarmId,
null);
break;
case INSTANCES_ID:
alarmId = uri.getLastPathSegment();
- count = db.update(ClockDatabaseHelper.INSTANCES_TABLE_NAME, values,
- ClockContract.InstancesColumns._ID + "=" + alarmId,
- null);
- break;
- case CITIES_ID:
- alarmId = uri.getLastPathSegment();
- count = db.update(ClockDatabaseHelper.CITIES_TABLE_NAME, values,
- ClockContract.CitiesColumns.CITY_ID + "=" + alarmId,
+ count = db.update(INSTANCES_TABLE_NAME, values,
+ InstancesColumns._ID + "=" + alarmId,
null);
break;
default: {
- throw new UnsupportedOperationException(
- "Cannot update URL: " + uri);
+ throw new UnsupportedOperationException("Cannot update URI: " + uri);
}
}
LogUtils.v("*** notifyChange() id: " + alarmId + " url " + uri);
- getContext().getContentResolver().notifyChange(uri, null);
+ notifyChange(getContext().getContentResolver(), uri);
return count;
}
@@ -183,22 +230,19 @@
public Uri insert(Uri uri, ContentValues initialValues) {
long rowId;
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
- switch (sURLMatcher.match(uri)) {
+ switch (sURIMatcher.match(uri)) {
case ALARMS:
rowId = mOpenHelper.fixAlarmInsert(initialValues);
break;
case INSTANCES:
- rowId = db.insert(ClockDatabaseHelper.INSTANCES_TABLE_NAME, null, initialValues);
- break;
- case CITIES:
- rowId = db.insert(ClockDatabaseHelper.CITIES_TABLE_NAME, null, initialValues);
+ rowId = db.insert(INSTANCES_TABLE_NAME, null, initialValues);
break;
default:
- throw new IllegalArgumentException("Cannot insert from URL: " + uri);
+ throw new IllegalArgumentException("Cannot insert from URI: " + uri);
}
- Uri uriResult = ContentUris.withAppendedId(ClockContract.AlarmsColumns.CONTENT_URI, rowId);
- getContext().getContentResolver().notifyChange(uriResult, null);
+ Uri uriResult = ContentUris.withAppendedId(AlarmsColumns.CONTENT_URI, rowId);
+ notifyChange(getContext().getContentResolver(), uriResult);
return uriResult;
}
@@ -207,51 +251,49 @@
int count;
String primaryKey;
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
- switch (sURLMatcher.match(uri)) {
+ switch (sURIMatcher.match(uri)) {
case ALARMS:
- count = db.delete(ClockDatabaseHelper.ALARMS_TABLE_NAME, where, whereArgs);
+ count = db.delete(ALARMS_TABLE_NAME, where, whereArgs);
break;
case ALARMS_ID:
primaryKey = uri.getLastPathSegment();
if (TextUtils.isEmpty(where)) {
- where = ClockContract.AlarmsColumns._ID + "=" + primaryKey;
+ where = AlarmsColumns._ID + "=" + primaryKey;
} else {
- where = ClockContract.AlarmsColumns._ID + "=" + primaryKey +
- " AND (" + where + ")";
+ where = AlarmsColumns._ID + "=" + primaryKey + " AND (" + where + ")";
}
- count = db.delete(ClockDatabaseHelper.ALARMS_TABLE_NAME, where, whereArgs);
+ count = db.delete(ALARMS_TABLE_NAME, where, whereArgs);
break;
case INSTANCES:
- count = db.delete(ClockDatabaseHelper.INSTANCES_TABLE_NAME, where, whereArgs);
+ count = db.delete(INSTANCES_TABLE_NAME, where, whereArgs);
break;
case INSTANCES_ID:
primaryKey = uri.getLastPathSegment();
if (TextUtils.isEmpty(where)) {
- where = ClockContract.InstancesColumns._ID + "=" + primaryKey;
+ where = InstancesColumns._ID + "=" + primaryKey;
} else {
- where = ClockContract.InstancesColumns._ID + "=" + primaryKey +
- " AND (" + where + ")";
+ where = InstancesColumns._ID + "=" + primaryKey + " AND (" + where + ")";
}
- count = db.delete(ClockDatabaseHelper.INSTANCES_TABLE_NAME, where, whereArgs);
- break;
- case CITIES:
- count = db.delete(ClockDatabaseHelper.CITIES_TABLE_NAME, where, whereArgs);
- break;
- case CITIES_ID:
- primaryKey = uri.getLastPathSegment();
- if (TextUtils.isEmpty(where)) {
- where = ClockContract.CitiesColumns.CITY_ID + "=" + primaryKey;
- } else {
- where = ClockContract.CitiesColumns.CITY_ID +"=" + primaryKey +
- " AND (" + where + ")";
- }
- count = db.delete(ClockDatabaseHelper.CITIES_TABLE_NAME, where, whereArgs);
+ count = db.delete(INSTANCES_TABLE_NAME, where, whereArgs);
break;
default:
- throw new IllegalArgumentException("Cannot delete from URL: " + uri);
+ throw new IllegalArgumentException("Cannot delete from URI: " + uri);
}
- getContext().getContentResolver().notifyChange(uri, null);
+ notifyChange(getContext().getContentResolver(), uri);
return count;
}
+
+ /**
+ * Notify affected URIs of changes.
+ */
+ private void notifyChange(ContentResolver resolver, Uri uri) {
+ resolver.notifyChange(uri, null);
+
+ final int match = sURIMatcher.match(uri);
+ // Also notify the joined table of changes to instances or alarms.
+ if (match == ALARMS || match == INSTANCES || match == ALARMS_ID || match == INSTANCES_ID) {
+ resolver.notifyChange(AlarmsColumns.ALARMS_WITH_INSTANCES_URI, null);
+ }
+ }
}
diff --git a/src/com/android/deskclock/settings/CrescendoLengthDialog.java b/src/com/android/deskclock/settings/CrescendoLengthDialog.java
new file mode 100644
index 0000000..8b8b6f3
--- /dev/null
+++ b/src/com/android/deskclock/settings/CrescendoLengthDialog.java
@@ -0,0 +1,140 @@
+package com.android.deskclock.settings;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.os.Parcelable;
+import android.preference.DialogPreference;
+import android.support.annotation.NonNull;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.NumberPicker;
+import android.widget.TextView;
+
+import com.android.deskclock.NumberPickerCompat;
+import com.android.deskclock.R;
+
+/**
+ * A dialog preference that shows a number picker for selecting crescendo length
+ */
+public final class CrescendoLengthDialog extends DialogPreference {
+
+ private static final String DEFAULT_CRESCENDO_TIME = "0";
+ private static final int CRESCENDO_TIME_STEP = 5;
+
+ private NumberPickerCompat mNumberPickerView;
+ private TextView mNumberPickerSecondsView;
+ private int mCrescendoSeconds;
+
+ public CrescendoLengthDialog(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ setDialogLayoutResource(R.layout.crescendo_length_picker);
+ setTitle(R.string.crescendo_duration_title);
+ }
+
+ @Override
+ protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+ super.onPrepareDialogBuilder(builder);
+ builder.setTitle(getContext().getString(R.string.crescendo_duration_title))
+ .setCancelable(true);
+ }
+
+ @Override
+ protected void onBindDialogView(@NonNull View view) {
+ super.onBindDialogView(view);
+
+ final String[] displayedValues = new String[13];
+ displayedValues[0] = getContext().getString(R.string.no_crescendo_duration);
+ for (int i = 1; i < displayedValues.length; i++) {
+ displayedValues[i] = String.valueOf(i * CRESCENDO_TIME_STEP);
+ }
+
+ mNumberPickerSecondsView = (TextView) view.findViewById(R.id.title);
+ mNumberPickerSecondsView.setText(getContext().getString(R.string.crescendo_picker_label));
+ mNumberPickerView = (NumberPickerCompat) view.findViewById(R.id.seconds_picker);
+ mNumberPickerView.setDisplayedValues(displayedValues);
+ mNumberPickerView.setMinValue(0);
+ mNumberPickerView.setMaxValue(displayedValues.length - 1);
+ mNumberPickerView.setValue(mCrescendoSeconds / CRESCENDO_TIME_STEP);
+ updateUnits();
+
+ mNumberPickerView.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
+ @Override
+ public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ updateUnits();
+ }
+ });
+ mNumberPickerView.setOnAnnounceValueChangedListener(
+ new NumberPickerCompat.OnAnnounceValueChangedListener() {
+ @Override
+ public void onAnnounceValueChanged(NumberPicker picker, int value,
+ String displayedValue) {
+ final String announceString;
+ if (value == 0) {
+ announceString = getContext().getString(R.string.no_crescendo_duration);
+ } else {
+ announceString = getContext().getString(
+ R.string.crescendo_duration, displayedValue);
+ }
+ picker.announceForAccessibility(announceString);
+ }
+ });
+ }
+
+ @Override
+ protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
+ String val;
+ if (restorePersistedValue) {
+ val = getPersistedString(DEFAULT_CRESCENDO_TIME);
+ if (val != null) {
+ mCrescendoSeconds = Integer.parseInt(val);
+ }
+ } else {
+ val = (String) defaultValue;
+ if (val != null) {
+ mCrescendoSeconds = Integer.parseInt(val);
+ }
+ persistString(val);
+ }
+ }
+
+ @Override
+ protected Object onGetDefaultValue(TypedArray a, int index) {
+ return a.getString(index);
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ // Restore the value to the NumberPicker.
+ super.onRestoreInstanceState(state);
+
+ // Update the unit display in response to the new value.
+ updateUnits();
+ }
+
+ private void updateUnits() {
+ if (mNumberPickerView != null) {
+ final int value = mNumberPickerView.getValue();
+ final int visibility = value == 0 ? View.INVISIBLE : View.VISIBLE;
+ mNumberPickerSecondsView.setVisibility(visibility);
+ }
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult) {
+ if (positiveResult) {
+ mNumberPickerView.clearFocus();
+ mCrescendoSeconds = mNumberPickerView.getValue() * CRESCENDO_TIME_STEP;
+ persistString(Integer.toString(mCrescendoSeconds));
+ setSummary();
+ }
+ }
+
+ public void setSummary() {
+ if (mCrescendoSeconds == 0) {
+ setSummary(getContext().getString(R.string.no_crescendo_duration));
+ } else {
+ setSummary(getContext().getString(R.string.crescendo_duration, mCrescendoSeconds));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/ScreensaverSettingsActivity.java b/src/com/android/deskclock/settings/ScreensaverSettingsActivity.java
similarity index 89%
rename from src/com/android/deskclock/ScreensaverSettingsActivity.java
rename to src/com/android/deskclock/settings/ScreensaverSettingsActivity.java
index 0e61bf0..3f64379 100644
--- a/src/com/android/deskclock/ScreensaverSettingsActivity.java
+++ b/src/com/android/deskclock/settings/ScreensaverSettingsActivity.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.deskclock;
+package com.android.deskclock.settings;
import android.os.Bundle;
import android.preference.ListPreference;
@@ -23,13 +23,15 @@
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
+import com.android.deskclock.R;
+
/**
* Settings for Clock Daydream
*/
-public class ScreensaverSettingsActivity extends AppCompatActivity {
+public final class ScreensaverSettingsActivity extends AppCompatActivity {
- static final String KEY_CLOCK_STYLE = "screensaver_clock_style";
- static final String KEY_NIGHT_MODE = "screensaver_night_mode";
+ public static final String KEY_CLOCK_STYLE = "screensaver_clock_style";
+ public static final String KEY_NIGHT_MODE = "screensaver_night_mode";
@Override
protected void onCreate(Bundle savedInstanceState) {
diff --git a/src/com/android/deskclock/settings/SettingsActivity.java b/src/com/android/deskclock/settings/SettingsActivity.java
new file mode 100644
index 0000000..c5d2284
--- /dev/null
+++ b/src/com/android/deskclock/settings/SettingsActivity.java
@@ -0,0 +1,362 @@
+/*
+ * 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.settings;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceFragment;
+import android.preference.RingtonePreference;
+import android.preference.SwitchPreference;
+import android.provider.Settings;
+import android.text.format.DateUtils;
+import android.view.Menu;
+import android.view.MenuItem;
+
+import com.android.deskclock.BaseActivity;
+import com.android.deskclock.LogUtils;
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+import com.android.deskclock.actionbarmenu.ActionBarMenuManager;
+import com.android.deskclock.actionbarmenu.MenuItemControllerFactory;
+import com.android.deskclock.actionbarmenu.NavUpMenuItemController;
+import com.android.deskclock.data.DataModel;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+
+/**
+ * Settings for the Alarm Clock.
+ */
+public final class SettingsActivity extends BaseActivity {
+
+ public static final String KEY_ALARM_SNOOZE = "snooze_duration";
+ public static final String KEY_ALARM_VOLUME = "volume_setting";
+ public static final String KEY_ALARM_CRESCENDO = "alarm_crescendo_duration";
+ public static final String KEY_TIMER_CRESCENDO = "timer_crescendo_duration";
+ public static final String KEY_TIMER_RINGTONE = "timer_ringtone";
+ public static final String KEY_AUTO_SILENCE = "auto_silence";
+ public static final String KEY_CLOCK_STYLE = "clock_style";
+ public static final String KEY_HOME_TZ = "home_time_zone";
+ public static final String KEY_AUTO_HOME_CLOCK = "automatic_home_clock";
+ public static final String KEY_DATE_TIME = "date_time";
+ public static final String KEY_VOLUME_BUTTONS = "volume_button_setting";
+ public static final String KEY_WEEK_START = "week_start";
+
+ public static final String TIMEZONE_LOCALE = "tz_locale";
+
+ public static final String DEFAULT_VOLUME_BEHAVIOR = "0";
+ public static final String VOLUME_BEHAVIOR_SNOOZE = "1";
+ public static final String VOLUME_BEHAVIOR_DISMISS = "2";
+
+ private final ActionBarMenuManager mActionBarMenuManager = new ActionBarMenuManager(this);
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setVolumeControlStream(AudioManager.STREAM_ALARM);
+ setContentView(R.layout.settings);
+ mActionBarMenuManager.addMenuItemController(new NavUpMenuItemController(this))
+ .addMenuItemController(MenuItemControllerFactory.getInstance()
+ .buildMenuItemControllers(this));
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ mActionBarMenuManager.createOptionsMenu(menu, getMenuInflater());
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ mActionBarMenuManager.prepareShowMenu(menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (mActionBarMenuManager.handleMenuItemClick(item)) {
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ public static class PrefsFragment extends PreferenceFragment
+ implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ addPreferencesFromResource(R.xml.settings);
+ loadTimeZoneList();
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+
+ // By default, do not recreate the DeskClock activity
+ getActivity().setResult(RESULT_CANCELED);
+
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ refresh();
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference pref, Object newValue) {
+ final int idx;
+ switch (pref.getKey()) {
+ case KEY_AUTO_SILENCE:
+ final ListPreference autoSilencePref = (ListPreference) pref;
+ String delay = (String) newValue;
+ updateAutoSnoozeSummary(autoSilencePref, delay);
+ break;
+ case KEY_CLOCK_STYLE:
+ final ListPreference clockStylePref = (ListPreference) pref;
+ idx = clockStylePref.findIndexOfValue((String) newValue);
+ clockStylePref.setSummary(clockStylePref.getEntries()[idx]);
+ break;
+ case KEY_HOME_TZ:
+ final ListPreference homeTimezonePref = (ListPreference) pref;
+ idx = homeTimezonePref.findIndexOfValue((String) newValue);
+ homeTimezonePref.setSummary(homeTimezonePref.getEntries()[idx]);
+ break;
+ case KEY_AUTO_HOME_CLOCK:
+ final boolean autoHomeClockEnabled = ((SwitchPreference) pref).isChecked();
+ final Preference homeTimeZonePref = findPreference(KEY_HOME_TZ);
+ homeTimeZonePref.setEnabled(!autoHomeClockEnabled);
+ break;
+ case KEY_VOLUME_BUTTONS:
+ final ListPreference volumeButtonsPref = (ListPreference) pref;
+ final int index = volumeButtonsPref.findIndexOfValue((String) newValue);
+ volumeButtonsPref.setSummary(volumeButtonsPref.getEntries()[index]);
+ break;
+ case KEY_WEEK_START:
+ final ListPreference weekStartPref = (ListPreference)
+ findPreference(KEY_WEEK_START);
+ idx = weekStartPref.findIndexOfValue((String) newValue);
+ weekStartPref.setSummary(weekStartPref.getEntries()[idx]);
+ break;
+ case KEY_TIMER_RINGTONE:
+ final RingtonePreference timerRingtonePref = (RingtonePreference)
+ findPreference(KEY_TIMER_RINGTONE);
+ timerRingtonePref.setSummary(DataModel.getDataModel().getTimerRingtoneTitle());
+ break;
+ }
+ // Set result so DeskClock knows to refresh itself
+ getActivity().setResult(RESULT_OK);
+ return true;
+ }
+
+ @Override
+ public boolean onPreferenceClick(Preference pref) {
+ final Activity activity = getActivity();
+ if (activity == null) {
+ return false;
+ }
+
+ switch (pref.getKey()) {
+ case KEY_DATE_TIME:
+ final Intent dialogIntent = new Intent(Settings.ACTION_DATE_SETTINGS);
+ dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(dialogIntent);
+ return true;
+ case KEY_ALARM_VOLUME:
+ final AudioManager audioManager =
+ (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);
+ audioManager.adjustStreamVolume(AudioManager.STREAM_ALARM,
+ AudioManager.ADJUST_SAME, AudioManager.FLAG_SHOW_UI);
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Reconstruct the timezone list.
+ */
+ private void loadTimeZoneList() {
+ final CharSequence[][] timezones = getAllTimezones();
+ final ListPreference homeTimezonePref = (ListPreference) findPreference(KEY_HOME_TZ);
+ homeTimezonePref.setEntryValues(timezones[0]);
+ homeTimezonePref.setEntries(timezones[1]);
+ homeTimezonePref.setSummary(homeTimezonePref.getEntry());
+ homeTimezonePref.setOnPreferenceChangeListener(this);
+ }
+
+ /**
+ * Returns an array of ids/time zones. This returns a double indexed array
+ * of ids and time zones for Calendar. It is an inefficient method and
+ * shouldn't be called often, but can be used for one time generation of
+ * this list.
+ *
+ * @return double array of tz ids and tz names
+ */
+ public CharSequence[][] getAllTimezones() {
+ final Resources res = getResources();
+ final String[] ids = res.getStringArray(R.array.timezone_values);
+ final String[] labels = res.getStringArray(R.array.timezone_labels);
+
+ int minLength = ids.length;
+ if (ids.length != labels.length) {
+ minLength = Math.min(minLength, labels.length);
+ LogUtils.e("Timezone ids and labels have different length!");
+ }
+
+ final long currentTimeMillis = System.currentTimeMillis();
+ final List<TimeZoneRow> timezones = new ArrayList<>(minLength);
+ for (int i = 0; i < minLength; i++) {
+ timezones.add(new TimeZoneRow(ids[i], labels[i], currentTimeMillis));
+ }
+ Collections.sort(timezones);
+
+ final CharSequence[][] timeZones = new CharSequence[2][timezones.size()];
+ int i = 0;
+ for (TimeZoneRow row : timezones) {
+ timeZones[0][i] = row.mId;
+ timeZones[1][i++] = row.mDisplayName;
+ }
+ return timeZones;
+ }
+
+ private void refresh() {
+ final ListPreference autoSilencePref =
+ (ListPreference) findPreference(KEY_AUTO_SILENCE);
+ String delay = autoSilencePref.getValue();
+ updateAutoSnoozeSummary(autoSilencePref, delay);
+ autoSilencePref.setOnPreferenceChangeListener(this);
+
+ final ListPreference clockStylePref = (ListPreference) findPreference(KEY_CLOCK_STYLE);
+ clockStylePref.setSummary(clockStylePref.getEntry());
+ clockStylePref.setOnPreferenceChangeListener(this);
+
+ final Preference autoHomeClockPref = findPreference(KEY_AUTO_HOME_CLOCK);
+ final boolean autoHomeClockEnabled = ((SwitchPreference) autoHomeClockPref).isChecked();
+ autoHomeClockPref.setOnPreferenceChangeListener(this);
+
+ final ListPreference homeTimezonePref = (ListPreference) findPreference(KEY_HOME_TZ);
+ homeTimezonePref.setEnabled(autoHomeClockEnabled);
+ homeTimezonePref.setSummary(homeTimezonePref.getEntry());
+ homeTimezonePref.setOnPreferenceChangeListener(this);
+
+ final ListPreference volumeButtonsPref =
+ (ListPreference) findPreference(KEY_VOLUME_BUTTONS);
+ volumeButtonsPref.setSummary(volumeButtonsPref.getEntry());
+ volumeButtonsPref.setOnPreferenceChangeListener(this);
+
+ final Preference volumePref = findPreference(KEY_ALARM_VOLUME);
+ volumePref.setOnPreferenceClickListener(this);
+
+ final SnoozeLengthDialog snoozePref =
+ (SnoozeLengthDialog) findPreference(KEY_ALARM_SNOOZE);
+ snoozePref.setSummary();
+
+ final CrescendoLengthDialog alarmCrescendoPref =
+ (CrescendoLengthDialog) findPreference(KEY_ALARM_CRESCENDO);
+ alarmCrescendoPref.setSummary();
+
+ final CrescendoLengthDialog timerCrescendoPref =
+ (CrescendoLengthDialog) findPreference(KEY_TIMER_CRESCENDO);
+ timerCrescendoPref.setSummary();
+
+ final Preference dateAndTimeSetting = findPreference(KEY_DATE_TIME);
+ dateAndTimeSetting.setOnPreferenceClickListener(this);
+
+ final ListPreference weekStartPref = (ListPreference) findPreference(KEY_WEEK_START);
+ // Set the default value programmatically
+ final String value = weekStartPref.getValue();
+ final int idx = weekStartPref.findIndexOfValue(
+ value == null ? String.valueOf(Utils.DEFAULT_WEEK_START) : value);
+ weekStartPref.setValueIndex(idx);
+ weekStartPref.setSummary(weekStartPref.getEntries()[idx]);
+ weekStartPref.setOnPreferenceChangeListener(this);
+
+ final RingtonePreference timerRingtonePref =
+ (RingtonePreference) findPreference(KEY_TIMER_RINGTONE);
+ timerRingtonePref.setSummary(DataModel.getDataModel().getTimerRingtoneTitle());
+ timerRingtonePref.setOnPreferenceChangeListener(this);
+ }
+
+ private void updateAutoSnoozeSummary(ListPreference listPref, String delay) {
+ int i = Integer.parseInt(delay);
+ if (i == -1) {
+ listPref.setSummary(R.string.auto_silence_never);
+ } else {
+ listPref.setSummary(Utils.getNumberFormattedQuantityString(getActivity(),
+ R.plurals.auto_silence_summary, i));
+ }
+ }
+
+ private static class TimeZoneRow implements Comparable<TimeZoneRow> {
+
+ private static final boolean SHOW_DAYLIGHT_SAVINGS_INDICATOR = false;
+
+ public final String mId;
+ public final String mDisplayName;
+ public final int mOffset;
+
+ public TimeZoneRow(String id, String name, long currentTimeMillis) {
+ final TimeZone tz = TimeZone.getTimeZone(id);
+ final boolean useDaylightTime = tz.useDaylightTime();
+ mId = id;
+ mOffset = tz.getOffset(currentTimeMillis);
+ mDisplayName = buildGmtDisplayName(name, useDaylightTime);
+ }
+
+ @Override
+ public int compareTo(TimeZoneRow another) {
+ return mOffset - another.mOffset;
+ }
+
+ public String buildGmtDisplayName(String displayName, boolean useDaylightTime) {
+ final int p = Math.abs(mOffset);
+ final StringBuilder name = new StringBuilder("(GMT");
+ name.append(mOffset < 0 ? '-' : '+');
+
+ name.append(p / DateUtils.HOUR_IN_MILLIS);
+ name.append(':');
+
+ int min = p / 60000;
+ min %= 60;
+
+ if (min < 10) {
+ name.append('0');
+ }
+ name.append(min);
+ name.append(") ");
+ name.append(displayName);
+ if (useDaylightTime && SHOW_DAYLIGHT_SAVINGS_INDICATOR) {
+ name.append(" \u2600"); // Sun symbol
+ }
+ return name.toString();
+ }
+ }
+ }
+}
diff --git a/src/com/android/deskclock/settings/SnoozeLengthDialog.java b/src/com/android/deskclock/settings/SnoozeLengthDialog.java
new file mode 100644
index 0000000..a9a3aae
--- /dev/null
+++ b/src/com/android/deskclock/settings/SnoozeLengthDialog.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2015 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.settings;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.os.Parcelable;
+import android.preference.DialogPreference;
+import android.support.annotation.NonNull;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.NumberPicker;
+import android.widget.TextView;
+
+import com.android.deskclock.NumberPickerCompat;
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+
+/**
+ * A dialog preference that shows a number picker for selecting snooze length
+ */
+public final class SnoozeLengthDialog extends DialogPreference {
+
+ private static final String DEFAULT_SNOOZE_TIME = "10";
+
+ private NumberPickerCompat mNumberPickerView;
+ private TextView mNumberPickerMinutesView;
+ private final Context mContext;
+ private int mSnoozeMinutes;
+
+ public SnoozeLengthDialog(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mContext = context;
+ setDialogLayoutResource(R.layout.snooze_length_picker);
+ setTitle(R.string.snooze_duration_title);
+ }
+
+ @Override
+ protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
+ super.onPrepareDialogBuilder(builder);
+ builder.setTitle(getContext().getString(R.string.snooze_duration_title))
+ .setCancelable(true);
+ }
+
+ @Override
+ protected void onBindDialogView(@NonNull View view) {
+ super.onBindDialogView(view);
+ mNumberPickerMinutesView = (TextView) view.findViewById(R.id.title);
+ mNumberPickerView = (NumberPickerCompat) view.findViewById(R.id.minutes_picker);
+ mNumberPickerView.setMinValue(1);
+ mNumberPickerView.setMaxValue(30);
+ mNumberPickerView.setValue(mSnoozeMinutes);
+ updateUnits();
+
+ mNumberPickerView.setOnAnnounceValueChangedListener(
+ new NumberPickerCompat.OnAnnounceValueChangedListener() {
+ @Override
+ public void onAnnounceValueChanged(NumberPicker picker, int value,
+ String displayedValue) {
+ final String announceString = Utils.getNumberFormattedQuantityString(
+ mContext, R.plurals.snooze_duration, value);
+ picker.announceForAccessibility(announceString);
+ }
+ });
+ }
+
+ @Override
+ protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
+ String val;
+ if (restorePersistedValue) {
+ val = getPersistedString(DEFAULT_SNOOZE_TIME);
+ if (val != null) {
+ mSnoozeMinutes = Integer.parseInt(val);
+ }
+ } else {
+ val = (String) defaultValue;
+ if (val != null) {
+ mSnoozeMinutes = Integer.parseInt(val);
+ }
+ persistString(val);
+ }
+ }
+
+ @Override
+ protected Object onGetDefaultValue(TypedArray a, int index) {
+ return a.getString(index);
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ // Restore the value to the NumberPicker.
+ super.onRestoreInstanceState(state);
+
+ // Update the unit display in response to the new value.
+ updateUnits();
+ }
+
+ private void updateUnits() {
+ if (mNumberPickerView != null) {
+ final Resources res = mContext.getResources();
+ final int value = mNumberPickerView.getValue();
+ final CharSequence units = res.getQuantityText(R.plurals.snooze_picker_label, value);
+ mNumberPickerMinutesView.setText(units);
+ }
+ }
+
+ @Override
+ protected void onDialogClosed(boolean positiveResult) {
+ if (positiveResult) {
+ mNumberPickerView.clearFocus();
+ mSnoozeMinutes = mNumberPickerView.getValue();
+ persistString(Integer.toString(mSnoozeMinutes));
+ setSummary();
+ }
+ }
+
+ public void setSummary() {
+ setSummary(Utils.getNumberFormattedQuantityString(mContext, R.plurals.snooze_duration,
+ mSnoozeMinutes));
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/settings/TimerRingtonePreference.java b/src/com/android/deskclock/settings/TimerRingtonePreference.java
new file mode 100644
index 0000000..7a30d92
--- /dev/null
+++ b/src/com/android/deskclock/settings/TimerRingtonePreference.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2015 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.settings;
+
+import android.content.Context;
+import android.content.Intent;
+import android.media.RingtoneManager;
+import android.preference.RingtonePreference;
+import android.support.annotation.NonNull;
+import android.util.AttributeSet;
+
+import com.android.deskclock.data.DataModel;
+
+/**
+ * A custom RingtonePreference that presents the application's default timer ringtone as the value
+ * behind the default selection.
+ */
+public final class TimerRingtonePreference extends RingtonePreference {
+
+ public TimerRingtonePreference(Context context) {
+ super(context);
+ }
+
+ public TimerRingtonePreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public TimerRingtonePreference(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public TimerRingtonePreference(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected void onPrepareRingtonePickerIntent(@NonNull Intent ringtonePickerIntent) {
+ super.onPrepareRingtonePickerIntent(ringtonePickerIntent);
+
+ // Replace the default ringtone uri with the beeping ringtone for timers.
+ ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI,
+ DataModel.getDataModel().getDefaultTimerRingtoneUri());
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/stopwatch/LapsAdapter.java b/src/com/android/deskclock/stopwatch/LapsAdapter.java
new file mode 100644
index 0000000..7592935
--- /dev/null
+++ b/src/com/android/deskclock/stopwatch/LapsAdapter.java
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2015 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.stopwatch;
+
+import android.content.Context;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.widget.RecyclerView;
+import android.text.format.DateUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.android.deskclock.R;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Lap;
+import com.android.deskclock.data.Stopwatch;
+
+import java.text.DecimalFormatSymbols;
+import java.util.List;
+
+/**
+ * Displays a list of lap times in reverse order. That is, the newest lap is at the top, the oldest
+ * lap is at the bottom.
+ */
+class LapsAdapter extends RecyclerView.Adapter<LapsAdapter.LapItemHolder> {
+
+ private final LayoutInflater mInflater;
+ private final Context mContext;
+
+ /** Used to determine when the time format for the lap time column has changed length. */
+ private int mLastFormattedLapTimeLength;
+
+ /** Used to determine when the time format for the total time column has changed length. */
+ private int mLastFormattedAccumulatedTimeLength;
+
+ public LapsAdapter(Context context) {
+ mContext = context;
+ mInflater = LayoutInflater.from(context);
+ setHasStableIds(true);
+ }
+
+ /**
+ * After recording the first lap, there is always a "current lap" in progress.
+ *
+ * @return 0 if no laps are yet recorded; lap count + 1 if any laps exist
+ */
+ @Override
+ public int getItemCount() {
+ final int lapCount = getLaps().size();
+ final int currentLapCount = lapCount == 0 ? 0 : 1;
+ return currentLapCount + lapCount;
+ }
+
+ @Override
+ public LapItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ final View v = mInflater.inflate(R.layout.lap_view, parent, false /* attachToRoot */);
+ return new LapItemHolder(v);
+ }
+
+ @Override
+ public void onBindViewHolder(LapItemHolder viewHolder, int position) {
+ final long lapTime;
+ final int lapNumber;
+ final long totalTime;
+
+ // Lap will be null for the current lap.
+ final Lap lap = position == 0 ? null : getLaps().get(position - 1);
+ if (lap != null) {
+ // For a recorded lap, merely extract the values to format.
+ lapTime = lap.getLapTime();
+ lapNumber = lap.getLapNumber();
+ totalTime = lap.getAccumulatedTime();
+ } else {
+ // For the current lap, compute times relative to the stopwatch.
+ totalTime = getStopwatch().getTotalTime();
+ lapTime = DataModel.getDataModel().getCurrentLapTime(totalTime);
+ lapNumber = getLaps().size() + 1;
+ }
+
+ // Bind data into the child views.
+ viewHolder.lapTime.setText(formatLapTime(lapTime, true));
+ viewHolder.accumulatedTime.setText(formatAccumulatedTime(totalTime, true));
+ viewHolder.lapNumber.setText(formatLapNumber(getLaps().size() + 1, lapNumber));
+ }
+
+ @Override
+ public long getItemId(int position) {
+ final List<Lap> laps = getLaps();
+ if (position == 0) {
+ return laps.size() + 1;
+ }
+
+ return laps.get(position - 1).getLapNumber();
+ }
+
+ /**
+ * @param rv the RecyclerView that contains the {@code childView}
+ * @param totalTime time accumulated for the current lap and all prior laps
+ */
+ void updateCurrentLap(RecyclerView rv, long totalTime) {
+ // If no laps exist there is nothing to do.
+ if (getItemCount() == 0) {
+ return;
+ }
+
+ final View currentLapView = rv.getChildAt(0);
+ if (currentLapView != null) {
+ // Compute the lap time using the total time.
+ final long lapTime = DataModel.getDataModel().getCurrentLapTime(totalTime);
+
+ final LapItemHolder holder = (LapItemHolder) rv.getChildViewHolder(currentLapView);
+ holder.lapTime.setText(formatLapTime(lapTime, false));
+ holder.accumulatedTime.setText(formatAccumulatedTime(totalTime, false));
+ }
+ }
+
+ /**
+ * Record a new lap and update this adapter to include it.
+ *
+ * @return a newly cleared lap
+ */
+ Lap addLap() {
+ final Lap lap = DataModel.getDataModel().addLap();
+
+ if (getItemCount() == 10) {
+ // 10 total laps indicates all items switch from 1 to 2 digit lap numbers.
+ notifyDataSetChanged();
+ } else {
+ // New current lap now exists.
+ notifyItemInserted(0);
+
+ // Prior current lap must be refreshed once with the true values in place.
+ notifyItemChanged(1);
+ }
+
+ return lap;
+ }
+
+ /**
+ * Remove all recorded laps and update this adapter.
+ */
+ void clearLaps() {
+ DataModel.getDataModel().clearLaps();
+
+ // Clear the computed time lengths related to the old recorded laps.
+ mLastFormattedLapTimeLength = 0;
+ mLastFormattedAccumulatedTimeLength = 0;
+
+ notifyDataSetChanged();
+ }
+
+ /**
+ * @return a formatted textual description of lap times and total time
+ */
+ String getShareText() {
+ final Stopwatch stopwatch = getStopwatch();
+ final long totalTime = stopwatch.getTotalTime();
+ final String stopwatchTime = formatTime(totalTime, totalTime, ":");
+
+ // Choose a size for the builder that is unlikely to be resized.
+ final StringBuilder builder = new StringBuilder(1000);
+
+ // Add the total elapsed time of the stopwatch.
+ builder.append(mContext.getString(R.string.sw_share_main, stopwatchTime));
+ builder.append("\n");
+
+ final List<Lap> laps = getLaps();
+ if (!laps.isEmpty()) {
+ // Add a header for lap times.
+ builder.append(mContext.getString(R.string.sw_share_laps));
+ builder.append("\n");
+
+ // Loop through the laps in the order they were recorded; reverse of display order.
+ for (int i = laps.size() - 1; i >= 0; i--) {
+ final Lap lap = laps.get(i);
+ builder.append(lap.getLapNumber());
+ builder.append(DecimalFormatSymbols.getInstance().getDecimalSeparator());
+ builder.append(' ');
+ builder.append(formatTime(lap.getLapTime(), lap.getLapTime(), " "));
+ builder.append("\n");
+ }
+ }
+
+ return builder.toString();
+ }
+
+ /**
+ * @param lapCount the total number of recorded laps
+ * @param lapNumber the number of the lap being formatted
+ * @return e.g. "# 7" if {@code lapCount} less than 10; "# 07" if {@code lapCount} is 10 or more
+ */
+ @VisibleForTesting
+ String formatLapNumber(int lapCount, int lapNumber) {
+ if (lapCount < 10) {
+ return String.format("# %d", lapNumber);
+ }
+
+ return String.format("# %02d", lapNumber);
+ }
+
+ /**
+ * @param maxTime the maximum amount of time; used to choose a time format
+ * @param time the time to format guaranteed not to exceed {@code maxTime}
+ * @param separator displayed between hours and minutes as well as minutes and seconds
+ * @return a formatted version of the time
+ */
+ @VisibleForTesting
+ String formatTime(long maxTime, long time, String separator) {
+ long hundredths, seconds, minutes, hours;
+ seconds = time / 1000;
+ hundredths = (time - seconds * 1000) / 10;
+ minutes = seconds / 60;
+ seconds = seconds - minutes * 60;
+ hours = minutes / 60;
+ minutes = minutes - hours * 60;
+
+ final char decimalSeparator = DecimalFormatSymbols.getInstance().getDecimalSeparator();
+
+ if (maxTime < 10 * DateUtils.MINUTE_IN_MILLIS) {
+ return String.format("%d%s%02d%s%02d",
+ minutes, separator, seconds, decimalSeparator, hundredths);
+ } else if (maxTime < 60 * DateUtils.MINUTE_IN_MILLIS) {
+ return String.format("%02d%s%02d%s%02d",
+ minutes, separator, seconds, decimalSeparator, hundredths);
+ } else if (maxTime < 10 * DateUtils.HOUR_IN_MILLIS) {
+ return String.format("%d%s%02d%s%02d%s%02d",
+ hours, separator, minutes, separator, seconds, decimalSeparator, hundredths);
+ } else if (maxTime < 100 * DateUtils.HOUR_IN_MILLIS) {
+ return String.format("%02d%s%02d%s%02d%s%02d",
+ hours, separator, minutes, separator, seconds, decimalSeparator, hundredths);
+ }
+
+ return String.format("%03d%s%02d%s%02d%s%02d",
+ hours, separator, minutes, separator, seconds, decimalSeparator, hundredths);
+ }
+
+ /**
+ * @param lapTime the lap time to be formatted
+ * @param isBinding if the lap time is requested so it can be bound avoid notifying of data
+ * set changes; they are not allowed to occur during bind
+ * @return a formatted version of the lap time
+ */
+ private String formatLapTime(long lapTime, boolean isBinding) {
+ // The longest lap dictates the way the given lapTime must be formatted.
+ final long longestLapTime = Math.max(DataModel.getDataModel().getLongestLapTime(), lapTime);
+ final String formattedTime = formatTime(longestLapTime, lapTime, " ");
+
+ // If the newly formatted lap time has altered the format, refresh all laps.
+ final int newLength = formattedTime.length();
+ if (!isBinding && mLastFormattedLapTimeLength != newLength) {
+ mLastFormattedLapTimeLength = newLength;
+ notifyDataSetChanged();
+ }
+
+ return formattedTime;
+ }
+
+ /**
+ * @param accumulatedTime the accumulated time to be formatted
+ * @param isBinding if the lap time is requested so it can be bound avoid notifying of data
+ * set changes; they are not allowed to occur during bind
+ * @return a formatted version of the accumulated time
+ */
+ private String formatAccumulatedTime(long accumulatedTime, boolean isBinding) {
+ final long totalTime = getStopwatch().getTotalTime();
+ final long longestAccumulatedTime = Math.max(totalTime, accumulatedTime);
+ final String formattedTime = formatTime(longestAccumulatedTime, accumulatedTime, " ");
+
+ // If the newly formatted accumulated time has altered the format, refresh all laps.
+ final int newLength = formattedTime.length();
+ if (!isBinding && mLastFormattedAccumulatedTimeLength != newLength) {
+ mLastFormattedAccumulatedTimeLength = newLength;
+ notifyDataSetChanged();
+ }
+
+ return formattedTime;
+ }
+
+ private Stopwatch getStopwatch() {
+ return DataModel.getDataModel().getStopwatch();
+ }
+
+ private List<Lap> getLaps() {
+ return DataModel.getDataModel().getLaps();
+ }
+
+ /**
+ * Cache the child views of each lap item view.
+ */
+ static final class LapItemHolder extends RecyclerView.ViewHolder {
+
+ private final TextView lapNumber;
+ private final TextView lapTime;
+ private final TextView accumulatedTime;
+
+ public LapItemHolder(View itemView) {
+ super(itemView);
+
+ lapTime = (TextView) itemView.findViewById(R.id.lap_time);
+ lapNumber = (TextView) itemView.findViewById(R.id.lap_number);
+ accumulatedTime = (TextView) itemView.findViewById(R.id.lap_total);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/stopwatch/StopwatchCircleView.java b/src/com/android/deskclock/stopwatch/StopwatchCircleView.java
new file mode 100644
index 0000000..bd2e207
--- /dev/null
+++ b/src/com/android/deskclock/stopwatch/StopwatchCircleView.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2015 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.stopwatch;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.view.View;
+
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Lap;
+import com.android.deskclock.data.Stopwatch;
+
+import java.util.List;
+
+/**
+ * Custom view that draws a reference lap as a circle when one exists.
+ */
+public final class StopwatchCircleView extends View {
+
+ /** The size of the dot indicating the user's position within the reference lap. */
+ private final float mDotRadius;
+
+ /** An amount to subtract from the true radius to account for drawing thicknesses. */
+ private final float mRadiusOffset;
+
+ /** Used to scale the width of the marker to make it similarly visible on all screens. */
+ private final float mScreenDensity;
+
+ /** The color indicating the remaining portion of the current lap. */
+ private final int mRemainderColor;
+
+ /** The color indicating the completed portion of the lap. */
+ private final int mCompletedColor;
+
+ /** The size of the stroke that paints the lap circle. */
+ private final float mStrokeSize;
+
+ /** The size of the stroke that paints the marker for the end of the prior lap. */
+ private final float mMarkerStrokeSize;
+
+ private final Paint mPaint = new Paint();
+ private final Paint mFill = new Paint();
+ private final RectF mArcRect = new RectF();
+
+ @SuppressWarnings("unused")
+ public StopwatchCircleView(Context context) {
+ this(context, null);
+ }
+
+ public StopwatchCircleView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ final Resources resources = context.getResources();
+ final float dotDiameter = resources.getDimension(R.dimen.circletimer_dot_size);
+
+ mDotRadius = dotDiameter / 2f;
+ mScreenDensity = resources.getDisplayMetrics().density;
+ mStrokeSize = resources.getDimension(R.dimen.circletimer_circle_size);
+ mMarkerStrokeSize = resources.getDimension(R.dimen.circletimer_marker_size);
+ mRadiusOffset = Utils.calculateRadiusOffset(mStrokeSize, dotDiameter, mMarkerStrokeSize);
+
+ mRemainderColor = resources.getColor(R.color.clock_white);
+ mCompletedColor = Utils.obtainStyledColor(context, R.attr.colorAccent, Color.RED);
+
+ mPaint.setAntiAlias(true);
+ mPaint.setStyle(Paint.Style.STROKE);
+
+ mFill.setAntiAlias(true);
+ mFill.setColor(mCompletedColor);
+ mFill.setStyle(Paint.Style.FILL);
+ }
+
+ /**
+ * Start the animation if it is not currently running.
+ */
+ void update() {
+ postInvalidateOnAnimation();
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ // Compute the size and location of the circle to be drawn.
+ final int xCenter = getWidth() / 2;
+ final int yCenter = getHeight() / 2;
+ final float radius = Math.min(xCenter, yCenter) - mRadiusOffset;
+
+ // Reset old painting state.
+ mPaint.setColor(mRemainderColor);
+ mPaint.setStrokeWidth(mStrokeSize);
+
+ final List<Lap> laps = getLaps();
+
+ // If a reference lap does not exist or should not be drawn, draw a simple white circle.
+ if (laps.isEmpty() || !DataModel.getDataModel().canAddMoreLaps()) {
+ // Draw a complete white circle; no red arc required.
+ canvas.drawCircle(xCenter, yCenter, radius, mPaint);
+
+ // No need to continue animating the plain white circle.
+ return;
+ }
+
+ // The first lap is the reference lap to which all future laps are compared.
+ final Stopwatch stopwatch = getStopwatch();
+ final int lapCount = laps.size();
+ final Lap firstLap = laps.get(lapCount - 1);
+ final Lap priorLap = laps.get(0);
+ final long firstLapTime = firstLap.getLapTime();
+ final long currentLapTime = stopwatch.getTotalTime() - priorLap.getAccumulatedTime();
+
+ // Draw a combination of red and white arcs to create a circle.
+ mArcRect.top = yCenter - radius;
+ mArcRect.bottom = yCenter + radius;
+ mArcRect.left = xCenter - radius;
+ mArcRect.right = xCenter + radius;
+ final float redPercent = (float) currentLapTime / (float) firstLapTime;
+ final float whitePercent = 1 - (redPercent > 1 ? 1 : redPercent);
+
+ // Draw a white arc to indicate the amount of reference lap that remains.
+ canvas.drawArc(mArcRect, 270 + (1 - whitePercent) * 360, whitePercent * 360, false, mPaint);
+
+ // Draw a red arc to indicate the amount of reference lap completed.
+ mPaint.setColor(mCompletedColor);
+ canvas.drawArc(mArcRect, 270, redPercent * 360 , false, mPaint);
+
+ // Starting on lap 2, a marker can be drawn indicating where the prior lap ended.
+ if (lapCount > 1) {
+ mPaint.setColor(mRemainderColor);
+ mPaint.setStrokeWidth(mMarkerStrokeSize);
+ final float markerAngle = (float) priorLap.getLapTime() / (float) firstLapTime * 360;
+ final float startAngle = 270 + markerAngle;
+ final float sweepAngle = mScreenDensity * (float) (360 / (radius * Math.PI));
+ canvas.drawArc(mArcRect, startAngle, sweepAngle, false, mPaint);
+ }
+
+ // Draw a red dot to indicate current position relative to reference lap.
+ final float dotAngleDegrees = 270 + redPercent * 360;
+ final double dotAngleRadians = Math.toRadians(dotAngleDegrees);
+ final float dotX = xCenter + (float) (radius * Math.cos(dotAngleRadians));
+ final float dotY = yCenter + (float) (radius * Math.sin(dotAngleRadians));
+ canvas.drawCircle(dotX, dotY, mDotRadius, mFill);
+
+ // If the stopwatch is not running it does not require continuous updates.
+ if (stopwatch.isRunning()) {
+ postInvalidateOnAnimation();
+ }
+ }
+
+ private Stopwatch getStopwatch() {
+ return DataModel.getDataModel().getStopwatch();
+ }
+
+ private List<Lap> getLaps() {
+ return DataModel.getDataModel().getLaps();
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/stopwatch/StopwatchFragment.java b/src/com/android/deskclock/stopwatch/StopwatchFragment.java
index 08388e0..0474b0d 100644
--- a/src/com/android/deskclock/stopwatch/StopwatchFragment.java
+++ b/src/com/android/deskclock/stopwatch/StopwatchFragment.java
@@ -13,814 +13,422 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.deskclock.stopwatch;
-import android.animation.LayoutTransition;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.content.res.Configuration;
import android.os.Bundle;
import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
-import android.preference.PreferenceManager;
-import android.text.format.DateUtils;
+import android.os.SystemClock;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.SimpleItemAnimator;
+import android.transition.AutoTransition;
+import android.transition.Transition;
+import android.transition.TransitionManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
-import android.view.animation.Animation;
-import android.view.animation.TranslateAnimation;
-import android.widget.BaseAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
-import com.android.deskclock.CircleButtonsLayout;
-import com.android.deskclock.CircleTimerView;
import com.android.deskclock.DeskClock;
import com.android.deskclock.DeskClockFragment;
-import com.android.deskclock.HandleDeskClockApiCalls;
import com.android.deskclock.LogUtils;
import com.android.deskclock.R;
-import com.android.deskclock.Utils;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Lap;
+import com.android.deskclock.data.Stopwatch;
import com.android.deskclock.events.Events;
import com.android.deskclock.timer.CountingTimerView;
-import java.util.ArrayList;
+import static android.content.Context.ACCESSIBILITY_SERVICE;
+import static android.content.Context.POWER_SERVICE;
+import static android.os.PowerManager.ON_AFTER_RELEASE;
+import static android.os.PowerManager.SCREEN_BRIGHT_WAKE_LOCK;
+import static android.view.View.GONE;
+import static android.view.View.INVISIBLE;
+import static android.view.View.VISIBLE;
-public class StopwatchFragment extends DeskClockFragment
- implements OnSharedPreferenceChangeListener {
- private static final boolean DEBUG = false;
+/**
+ * Fragment that shows the stopwatch and recorded laps.
+ */
+public final class StopwatchFragment extends DeskClockFragment {
private static final String TAG = "StopwatchFragment";
- private static final int STOPWATCH_REFRESH_INTERVAL_MILLIS = 25;
- // Lower the refresh rate in accessibility mode to give talkback time to catch up
- private static final int STOPWATCH_ACCESSIBILTY_REFRESH_INTERVAL_MILLIS = 500;
- int mState = Stopwatches.STOPWATCH_RESET;
+ /** Scheduled to update the stopwatch time and current lap time while stopwatch is running. */
+ private final Runnable mTimeUpdateRunnable = new TimeUpdateRunnable();
- // Stopwatch views that are accessed by the activity
- private CircleTimerView mTime;
- private CountingTimerView mTimeText;
- private ListView mLapsList;
- private WakeLock mWakeLock;
- private CircleButtonsLayout mCircleLayout;
-
- // Animation constants and objects
- private LayoutTransition mLayoutTransition;
- private LayoutTransition mCircleLayoutTransition;
- private View mStartSpace;
- private View mEndSpace;
- private View mBottomSpace;
- private boolean mSpacersUsed;
-
+ /** Used to determine when talk back is on in order to lower the time update rate. */
private AccessibilityManager mAccessibilityManager;
- // Used for calculating the time from the start taking into account the pause times
- long mStartTime = 0;
- long mAccumulatedTime = 0;
+ /** {@code true} while the {@link #mLapsList} is transitioning between shown and hidden. */
+ private boolean mLapsListIsTransitioning;
- // Lap information
- class Lap {
+ /** The data source for {@link #mLapsList}. */
+ private LapsAdapter mLapsAdapter;
- Lap (long time, long total) {
- mLapTime = time;
- mTotalTime = total;
- }
- public long mLapTime;
- public long mTotalTime;
+ /** The layout manager for the {@link #mLapsAdapter}. */
+ private LinearLayoutManager mLapsLayoutManager;
- public void updateView() {
- View lapInfo = mLapsList.findViewWithTag(this);
- if (lapInfo != null) {
- mLapsAdapter.setTimeText(lapInfo, this);
- }
- }
- }
+ /** Draws the reference lap while the stopwatch is running. */
+ private StopwatchCircleView mTime;
- // Adapter for the ListView that shows the lap times.
- class LapsListAdapter extends BaseAdapter {
+ /** Displays the recorded lap times. */
+ private RecyclerView mLapsList;
- private static final int VIEW_TYPE_LAP = 0;
- private static final int VIEW_TYPE_SPACE = 1;
- private static final int VIEW_TYPE_COUNT = 2;
+ /** Displays the current stopwatch time. */
+ private CountingTimerView mTimeText;
- ArrayList<Lap> mLaps = new ArrayList<>();
- private final LayoutInflater mInflater;
- private final String[] mFormats;
- private final String[] mLapFormatSet;
- // Size of this array must match the size of formats
- private final long[] mThresholds = {
- 10 * DateUtils.MINUTE_IN_MILLIS, // < 10 minutes
- DateUtils.HOUR_IN_MILLIS, // < 1 hour
- 10 * DateUtils.HOUR_IN_MILLIS, // < 10 hours
- 100 * DateUtils.HOUR_IN_MILLIS, // < 100 hours
- 1000 * DateUtils.HOUR_IN_MILLIS // < 1000 hours
- };
- private int mLapIndex = 0;
- private int mTotalIndex = 0;
- private String mLapFormat;
+ /** Held while the stopwatch is running and this fragment is forward to keep the screen on. */
+ private PowerManager.WakeLock mWakeLock;
- public LapsListAdapter(Context context) {
- mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- mFormats = context.getResources().getStringArray(R.array.stopwatch_format_set);
- mLapFormatSet = context.getResources().getStringArray(R.array.sw_lap_number_set);
- updateLapFormat();
- }
-
- @Override
- public boolean isEnabled(int position) {
- return false;
- }
-
- @Override
- public long getItemId(int position) {
- return position;
- }
-
- @Override
- public int getItemViewType(int position) {
- return position < mLaps.size() ? VIEW_TYPE_LAP : VIEW_TYPE_SPACE;
- }
-
- @Override
- public int getViewTypeCount() {
- return VIEW_TYPE_COUNT;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- if (getCount() == 0) {
- return null;
- }
-
- // Handle request for the Spacer at the end
- if (getItemViewType(position) == VIEW_TYPE_SPACE) {
- return convertView != null ? convertView
- : mInflater.inflate(R.layout.stopwatch_spacer, parent, false);
- }
-
- final View lapInfo = convertView != null ? convertView
- : mInflater.inflate(R.layout.lap_view, parent, false);
- Lap lap = getItem(position);
- lapInfo.setTag(lap);
-
- TextView count = (TextView) lapInfo.findViewById(R.id.lap_number);
- count.setText(String.format(mLapFormat, mLaps.size() - position).toUpperCase());
- setTimeText(lapInfo, lap);
-
- return lapInfo;
- }
-
- protected void setTimeText(View lapInfo, Lap lap) {
- TextView lapTime = (TextView)lapInfo.findViewById(R.id.lap_time);
- TextView totalTime = (TextView)lapInfo.findViewById(R.id.lap_total);
- lapTime.setText(Stopwatches.formatTimeText(lap.mLapTime, mFormats[mLapIndex]));
- totalTime.setText(Stopwatches.formatTimeText(lap.mTotalTime, mFormats[mTotalIndex]));
- }
-
- @Override
- public int getCount() {
- // Add 1 for the spacer if list is not empty
- return mLaps.isEmpty() ? 0 : mLaps.size() + 1;
- }
-
- @Override
- public Lap getItem(int position) {
- if (position >= mLaps.size()) {
- return null;
- }
- return mLaps.get(position);
- }
-
- private void updateLapFormat() {
- // Note Stopwatches.MAX_LAPS < 100
- mLapFormat = mLapFormatSet[mLaps.size() < 10 ? 0 : 1];
- }
-
- private void resetTimeFormats() {
- mLapIndex = mTotalIndex = 0;
- }
-
- /**
- * A lap is printed into two columns: the total time and the lap time. To make this print
- * as pretty as possible, multiple formats were created which minimize the width of the
- * print. As the total or lap time exceed the limit of that format, this code updates
- * the format used for the total and/or lap times.
- *
- * @param lap to measure
- * @return true if this lap exceeded either threshold and a format was updated.
- */
- public boolean updateTimeFormats(Lap lap) {
- boolean formatChanged = false;
- while (mLapIndex + 1 < mThresholds.length && lap.mLapTime >= mThresholds[mLapIndex]) {
- mLapIndex++;
- formatChanged = true;
- }
- while (mTotalIndex + 1 < mThresholds.length &&
- lap.mTotalTime >= mThresholds[mTotalIndex]) {
- mTotalIndex++;
- formatChanged = true;
- }
- return formatChanged;
- }
-
- public void addLap(Lap l) {
- mLaps.add(0, l);
- // for efficiency caller also calls notifyDataSetChanged()
- }
-
- public void clearLaps() {
- mLaps.clear();
- updateLapFormat();
- resetTimeFormats();
- notifyDataSetChanged();
- }
-
- // Helper function used to get the lap data to be stored in the activity's bundle
- public long [] getLapTimes() {
- int size = mLaps.size();
- if (size == 0) {
- return null;
- }
- long [] laps = new long[size];
- for (int i = 0; i < size; i ++) {
- laps[i] = mLaps.get(i).mTotalTime;
- }
- return laps;
- }
-
- // Helper function to restore adapter's data from the activity's bundle
- public void setLapTimes(long [] laps) {
- if (laps == null || laps.length == 0) {
- return;
- }
-
- int size = laps.length;
- mLaps.clear();
- for (long lap : laps) {
- mLaps.add(new Lap(lap, 0));
- }
- long totalTime = 0;
- for (int i = size -1; i >= 0; i --) {
- totalTime += laps[i];
- mLaps.get(i).mTotalTime = totalTime;
- updateTimeFormats(mLaps.get(i));
- }
- updateLapFormat();
- showLaps();
- notifyDataSetChanged();
- }
- }
-
- LapsListAdapter mLapsAdapter;
-
- public StopwatchFragment() {
- }
-
- private void toggleStopwatchState() {
- long time = Utils.getTimeNow();
- Context context = getActivity().getApplicationContext();
- Intent intent = new Intent(context, StopwatchService.class);
- intent.putExtra(Stopwatches.MESSAGE_TIME, time);
- intent.putExtra(Stopwatches.SHOW_NOTIF, false);
- switch (mState) {
- case Stopwatches.STOPWATCH_RUNNING:
- // do stop
- long curTime = Utils.getTimeNow();
- mAccumulatedTime += (curTime - mStartTime);
- doStop();
- Events.sendStopwatchEvent(R.string.action_stop, R.string.label_deskclock);
-
- intent.setAction(HandleDeskClockApiCalls.ACTION_STOP_STOPWATCH);
- context.startService(intent);
- releaseWakeLock();
- break;
- case Stopwatches.STOPWATCH_RESET:
- case Stopwatches.STOPWATCH_STOPPED:
- // do start
- doStart(time);
- Events.sendStopwatchEvent(R.string.action_start, R.string.label_deskclock);
-
- intent.setAction(HandleDeskClockApiCalls.ACTION_START_STOPWATCH);
- context.startService(intent);
- acquireWakeLock();
- break;
- default:
- LogUtils.wtf("Illegal state " + mState
- + " while pressing the right stopwatch button");
- break;
- }
- }
+ /** The public no-arg constructor required by all fragments. */
+ public StopwatchFragment() {}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- ViewGroup v = (ViewGroup)inflater.inflate(R.layout.stopwatch_fragment, container, false);
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
+ mLapsAdapter = new LapsAdapter(getActivity());
+ mLapsLayoutManager = new LinearLayoutManager(getActivity());
- mTime = (CircleTimerView)v.findViewById(R.id.stopwatch_time);
- mTimeText = (CountingTimerView)v.findViewById(R.id.stopwatch_time_text);
- mLapsList = (ListView)v.findViewById(R.id.laps_list);
- mLapsList.setDividerHeight(0);
- mLapsAdapter = new LapsListAdapter(getActivity());
+ final View v = inflater.inflate(R.layout.stopwatch_fragment, container, false);
+ mTime = (StopwatchCircleView) v.findViewById(R.id.stopwatch_time);
+ mLapsList = (RecyclerView) v.findViewById(R.id.laps_list);
+ ((SimpleItemAnimator) mLapsList.getItemAnimator()).setSupportsChangeAnimations(false);
+ mLapsList.setLayoutManager(mLapsLayoutManager);
mLapsList.setAdapter(mLapsAdapter);
// Timer text serves as a virtual start/stop button.
- mTimeText.registerVirtualButtonAction(new Runnable() {
- @Override
- public void run() {
- toggleStopwatchState();
- }
- });
+ mTimeText = (CountingTimerView) v.findViewById(R.id.stopwatch_time_text);
mTimeText.setVirtualButtonEnabled(true);
-
- mCircleLayout = (CircleButtonsLayout)v.findViewById(R.id.stopwatch_circle);
- mCircleLayout.setCircleTimerViewIds(R.id.stopwatch_time, 0 /* stopwatchId */ ,
- 0 /* labelId */);
-
- // Animation setup
- mLayoutTransition = new LayoutTransition();
- mCircleLayoutTransition = new LayoutTransition();
-
- // The CircleButtonsLayout only needs to undertake location changes
- mCircleLayoutTransition.enableTransitionType(LayoutTransition.CHANGING);
- mCircleLayoutTransition.disableTransitionType(LayoutTransition.APPEARING);
- mCircleLayoutTransition.disableTransitionType(LayoutTransition.DISAPPEARING);
- mCircleLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_APPEARING);
- mCircleLayoutTransition.disableTransitionType(LayoutTransition.CHANGE_DISAPPEARING);
- mCircleLayoutTransition.setAnimateParentHierarchy(false);
-
- // These spacers assist in keeping the size of CircleButtonsLayout constant
- mStartSpace = v.findViewById(R.id.start_space);
- mEndSpace = v.findViewById(R.id.end_space);
- mSpacersUsed = mStartSpace != null || mEndSpace != null;
-
- // Only applicable on portrait, only visible when there is no lap
- mBottomSpace = v.findViewById(R.id.bottom_space);
-
- // Listener to invoke extra animation within the laps-list
- mLayoutTransition.addTransitionListener(new LayoutTransition.TransitionListener() {
- @Override
- public void startTransition(LayoutTransition transition, ViewGroup container,
- View view, int transitionType) {
- if (view == mLapsList) {
- if (transitionType == LayoutTransition.DISAPPEARING) {
- if (DEBUG) LogUtils.v("StopwatchFragment.start laps-list disappearing");
- boolean shiftX = view.getResources().getConfiguration().orientation
- == Configuration.ORIENTATION_LANDSCAPE;
- int first = mLapsList.getFirstVisiblePosition();
- int last = mLapsList.getLastVisiblePosition();
- // Ensure index range will not cause a divide by zero
- if (last < first) {
- last = first;
- }
- long duration = transition.getDuration(LayoutTransition.DISAPPEARING);
- long offset = duration / (last - first + 1) / 5;
- for (int visibleIndex = first; visibleIndex <= last; visibleIndex++) {
- View lapView = mLapsList.getChildAt(visibleIndex - first);
- if (lapView != null) {
- float toXValue = shiftX ? 1.0f * (visibleIndex - first + 1) : 0;
- float toYValue = shiftX ? 0 : 4.0f * (visibleIndex - first + 1);
- TranslateAnimation animation = new TranslateAnimation(
- Animation.RELATIVE_TO_SELF, 0,
- Animation.RELATIVE_TO_SELF, toXValue,
- Animation.RELATIVE_TO_SELF, 0,
- Animation.RELATIVE_TO_SELF, toYValue);
- animation.setStartOffset((last - visibleIndex) * offset);
- animation.setDuration(duration);
- lapView.startAnimation(animation);
- }
- }
- }
- }
- }
-
- @Override
- public void endTransition(LayoutTransition transition, ViewGroup container,
- View view, int transitionType) {
- if (transitionType == LayoutTransition.DISAPPEARING) {
- if (DEBUG) LogUtils.v("StopwatchFragment.end laps-list disappearing");
- int last = mLapsList.getLastVisiblePosition();
- for (int visibleIndex = mLapsList.getFirstVisiblePosition();
- visibleIndex <= last; visibleIndex++) {
- View lapView = mLapsList.getChildAt(visibleIndex);
- if (lapView != null) {
- Animation animation = lapView.getAnimation();
- if (animation != null) {
- animation.cancel();
- }
- }
- }
- }
- }
- });
+ mTimeText.registerVirtualButtonAction(new ToggleStopwatchRunnable());
return v;
}
- /**
- * Make the final display setup.
- *
- * If the fragment is starting with an existing list of laps, shows the laps list and if the
- * spacers around the clock exist, hide them. If there are not laps at the start, hide the laps
- * list and show the clock spacers if they exist.
- */
@Override
- public void onStart() {
- super.onStart();
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
- boolean lapsVisible = mLapsAdapter.getCount() > 0;
-
- mLapsList.setVisibility(lapsVisible ? View.VISIBLE : View.GONE);
- if (mSpacersUsed) {
- showSpacerVisibility(lapsVisible);
- }
- showBottomSpacerVisibility(lapsVisible);
-
- ((ViewGroup)getView()).setLayoutTransition(mLayoutTransition);
- mCircleLayout.setLayoutTransition(mCircleLayoutTransition);
-
- mAccessibilityManager = (AccessibilityManager) getActivity().getSystemService(
- Context.ACCESSIBILITY_SERVICE);
+ mAccessibilityManager =
+ (AccessibilityManager) getActivity().getSystemService(ACCESSIBILITY_SERVICE);
}
@Override
public void onResume() {
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(getActivity());
- prefs.registerOnSharedPreferenceChangeListener(this);
- readFromSharedPref(prefs);
- mTime.readFromSharedPref(prefs, "sw");
- mTime.postInvalidate();
+ super.onResume();
+ // Conservatively assume the data in the adapter has changed while the fragment was paused.
+ mLapsAdapter.notifyDataSetChanged();
+
+ // Update the state of the buttons.
setFabAppearance();
setLeftRightButtonAppearance();
- mTimeText.setTime(mAccumulatedTime, true, true);
- if (mState == Stopwatches.STOPWATCH_RUNNING) {
- acquireWakeLock();
- startUpdateThread();
- } else if (mState == Stopwatches.STOPWATCH_STOPPED && mAccumulatedTime != 0) {
- mTimeText.blinkTimeStr(true);
+
+ // Draw the current stopwatch and lap times.
+ updateTime();
+
+ // Start updates if the stopwatch is running; blink text if it is paused.
+ switch (getStopwatch().getState()) {
+ case RUNNING:
+ acquireWakeLock();
+ mTime.update();
+ startUpdatingTime();
+ break;
+ case PAUSED:
+ mTimeText.blinkTimeStr(true);
+ break;
}
- showLaps();
- ((DeskClock)getActivity()).registerPageChangedListener(this);
- // View was hidden in onPause, make sure it is visible now.
- View v = getView();
- if (v != null) {
- v.setVisibility(View.VISIBLE);
+
+ // Adjust the visibility of the list of laps.
+ showOrHideLaps(false);
+
+ // Start watching for page changes away from this fragment.
+ getDeskClock().registerPageChangedListener(this);
+
+ // View is hidden in onPause, make sure it is visible now.
+ final View view = getView();
+ if (view != null) {
+ view.setVisibility(VISIBLE);
}
- super.onResume();
}
@Override
public void onPause() {
- if (mState == Stopwatches.STOPWATCH_RUNNING) {
- stopUpdateThread();
-
- // This is called because the lock screen was activated, the window stay
- // active under it and when we unlock the screen, we see the old time for
- // a fraction of a second.
- View v = getView();
- if (v != null) {
- v.setVisibility(View.INVISIBLE);
- }
- }
- // The stopwatch must keep running even if the user closes the app so save stopwatch state
- // in shared prefs
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(getActivity());
- prefs.unregisterOnSharedPreferenceChangeListener(this);
- writeToSharedPref(prefs);
- mTime.writeToSharedPref(prefs, "sw");
- mTimeText.blinkTimeStr(false);
- ((DeskClock)getActivity()).unregisterPageChangedListener(this);
- releaseWakeLock();
super.onPause();
+
+ final View view = getView();
+ if (view != null) {
+ // Make the view invisible because when the lock screen is activated, the window stays
+ // active under it. Later, when unlocking the screen, we see the old stopwatch time for
+ // a fraction of a second.
+ getView().setVisibility(INVISIBLE);
+ }
+
+ // Stop all updates while the fragment is not visible.
+ stopUpdatingTime();
+ mTimeText.blinkTimeStr(false);
+
+ // Stop watching for page changes away from this fragment.
+ getDeskClock().unregisterPageChangedListener(this);
+
+ // Release the wake lock if it is currently held.
+ releaseWakeLock();
}
@Override
public void onPageChanged(int page) {
- if (page == DeskClock.STOPWATCH_TAB_INDEX && mState == Stopwatches.STOPWATCH_RUNNING) {
+ if (page == DeskClock.STOPWATCH_TAB_INDEX && getStopwatch().isRunning()) {
acquireWakeLock();
} else {
releaseWakeLock();
}
}
- private void doStop() {
- if (DEBUG) LogUtils.v("StopwatchFragment.doStop");
- stopUpdateThread();
- mTime.pauseIntervalAnimation();
- mTimeText.setTime(mAccumulatedTime, true, true);
- mTimeText.blinkTimeStr(true);
- updateCurrentLap(mAccumulatedTime);
- mState = Stopwatches.STOPWATCH_STOPPED;
- setFabAppearance();
- setLeftRightButtonAppearance();
+ @Override
+ public void onFabClick(View view) {
+ toggleStopwatchState();
}
- private void doStart(long time) {
- if (DEBUG) LogUtils.v("StopwatchFragment.doStart");
- mStartTime = time;
- startUpdateThread();
- mTimeText.blinkTimeStr(false);
- if (mTime.isAnimating()) {
- mTime.startIntervalAnimation();
- }
- mState = Stopwatches.STOPWATCH_RUNNING;
- setFabAppearance();
- setLeftRightButtonAppearance();
- }
-
- private void doLap() {
- if (DEBUG) LogUtils.v("StopwatchFragment.doLap");
- showLaps();
- setFabAppearance();
- setLeftRightButtonAppearance();
- }
-
- private void doReset() {
- if (DEBUG) LogUtils.v("StopwatchFragment.doReset");
- SharedPreferences prefs =
- Utils.getDefaultSharedPreferences(getActivity());
- Utils.clearSwSharedPref(prefs);
- mTime.clearSharedPref(prefs, "sw");
- mAccumulatedTime = 0;
- mLapsAdapter.clearLaps();
- showLaps();
- mTime.stopIntervalAnimation();
- mTime.reset();
- mTimeText.setTime(mAccumulatedTime, true, true);
- mTimeText.blinkTimeStr(false);
- mState = Stopwatches.STOPWATCH_RESET;
- setFabAppearance();
- setLeftRightButtonAppearance();
- }
-
- private void shareResults() {
- final Context context = getActivity();
- final Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
- shareIntent.setType("text/plain");
- shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
- shareIntent.putExtra(Intent.EXTRA_SUBJECT,
- Stopwatches.getShareTitle(context.getApplicationContext()));
- shareIntent.putExtra(Intent.EXTRA_TEXT, Stopwatches.buildShareResults(
- getActivity().getApplicationContext(), mTimeText.getTimeString(),
- getLapShareTimes(mLapsAdapter.getLapTimes())));
-
- final Intent launchIntent = Intent.createChooser(shareIntent,
- context.getString(R.string.sw_share_button));
- try {
- context.startActivity(launchIntent);
- } catch (ActivityNotFoundException e) {
- LogUtils.e("No compatible receiver is found");
- }
- }
-
- /** Turn laps as they would be saved in prefs into format for sharing. **/
- private long[] getLapShareTimes(long[] input) {
- if (input == null) {
- return null;
- }
-
- int numLaps = input.length;
- long[] output = new long[numLaps];
- long prevLapElapsedTime = 0;
- for (int lap_i = numLaps - 1; lap_i >= 0; lap_i--) {
- long lap = input[lap_i];
- LogUtils.v("lap " + lap_i + ": " + lap);
- output[lap_i] = lap - prevLapElapsedTime;
- prevLapElapsedTime = lap;
- }
- return output;
- }
-
- private boolean reachedMaxLaps() {
- return mLapsAdapter.getCount() >= Stopwatches.MAX_LAPS;
- }
-
- /***
- * Handle action when user presses the lap button
- * @param time - in hundredth of a second
- */
- private void addLapTime(long time) {
- // The total elapsed time
- final long curTime = time - mStartTime + mAccumulatedTime;
- int size = mLapsAdapter.getCount();
- if (size == 0) {
- // Create and add the first lap
- Lap firstLap = new Lap(curTime, curTime);
- mLapsAdapter.addLap(firstLap);
- // Create the first active lap
- mLapsAdapter.addLap(new Lap(0, curTime));
- // Update the interval on the clock and check the lap and total time formatting
- mTime.setIntervalTime(curTime);
- mLapsAdapter.updateTimeFormats(firstLap);
- } else {
- // Finish active lap
- final long lapTime = curTime - mLapsAdapter.getItem(1).mTotalTime;
- mLapsAdapter.getItem(0).mLapTime = lapTime;
- mLapsAdapter.getItem(0).mTotalTime = curTime;
- // Create a new active lap
- mLapsAdapter.addLap(new Lap(0, curTime));
- // Update marker on clock and check that formatting for the lap number
- mTime.setMarkerTime(lapTime);
- mLapsAdapter.updateLapFormat();
- }
- // Repaint the laps list
- mLapsAdapter.notifyDataSetChanged();
-
- // Start lap animation starting from the second lap
- mTime.stopIntervalAnimation();
- if (!reachedMaxLaps()) {
- mTime.startIntervalAnimation();
- }
- }
-
- private void updateCurrentLap(long totalTime) {
- // There are either 0, 2 or more Laps in the list See {@link #addLapTime}
- if (mLapsAdapter.getCount() > 0) {
- Lap curLap = mLapsAdapter.getItem(0);
- curLap.mLapTime = totalTime - mLapsAdapter.getItem(1).mTotalTime;
- curLap.mTotalTime = totalTime;
- // If this lap has caused a change in the format for total and/or lap time, all of
- // the rows need a fresh print. The simplest way to refresh all of the rows is
- // calling notifyDataSetChanged.
- if (mLapsAdapter.updateTimeFormats(curLap)) {
- mLapsAdapter.notifyDataSetChanged();
- } else {
- curLap.updateView();
- }
- }
- }
-
- /**
- * Show or hide the laps-list
- */
- private void showLaps() {
- if (DEBUG) LogUtils.v(String.format("StopwatchFragment.showLaps: count=%d",
- mLapsAdapter.getCount()));
-
- boolean lapsVisible = mLapsAdapter.getCount() > 0;
-
- // Layout change animations will start upon the first add/hide view. Temporarily disable
- // the layout transition animation for the spacers, make the changes, then re-enable
- // the animation for the add/hide laps-list
- if (mSpacersUsed) {
- ViewGroup rootView = (ViewGroup) getView();
- if (rootView != null) {
- rootView.setLayoutTransition(null);
-
- showSpacerVisibility(lapsVisible);
-
- rootView.setLayoutTransition(mLayoutTransition);
- }
- }
-
- showBottomSpacerVisibility(lapsVisible);
-
- if (lapsVisible) {
- // There are laps - show the laps-list
- // No delay for the CircleButtonsLayout changes - start immediately so that the
- // circle has shifted before the laps-list starts appearing.
- mCircleLayoutTransition.setStartDelay(LayoutTransition.CHANGING, 0);
-
- mLapsList.setVisibility(View.VISIBLE);
- } else {
- // There are no laps - hide the laps list
-
- // Delay the CircleButtonsLayout animation until after the laps-list disappears
- long startDelay = mLayoutTransition.getStartDelay(LayoutTransition.DISAPPEARING) +
- mLayoutTransition.getDuration(LayoutTransition.DISAPPEARING);
- mCircleLayoutTransition.setStartDelay(LayoutTransition.CHANGING, startDelay);
- mLapsList.setVisibility(View.GONE);
- }
- }
-
- private void showSpacerVisibility(boolean lapsVisible) {
- final int spacersVisibility = lapsVisible ? View.GONE : View.VISIBLE;
- if (mStartSpace != null) {
- mStartSpace.setVisibility(spacersVisibility);
- }
- if (mEndSpace != null) {
- mEndSpace.setVisibility(spacersVisibility);
- }
- }
-
- private void showBottomSpacerVisibility(boolean lapsVisible) {
- if (mBottomSpace != null) {
- mBottomSpace.setVisibility(lapsVisible ? View.GONE : View.VISIBLE);
- }
- }
-
- private void startUpdateThread() {
- mTime.post(mTimeUpdateThread);
- }
-
- private void stopUpdateThread() {
- mTime.removeCallbacks(mTimeUpdateThread);
- }
-
- Runnable mTimeUpdateThread = new Runnable() {
- @Override
- public void run() {
- long curTime = Utils.getTimeNow();
- long totalTime = mAccumulatedTime + (curTime - mStartTime);
- if (mTime != null) {
- mTimeText.setTime(totalTime, true, true);
- }
- updateCurrentLap(totalTime);
- mTime.postDelayed(mTimeUpdateThread, mAccessibilityManager != null &&
- mAccessibilityManager.isTouchExplorationEnabled()
- ? STOPWATCH_ACCESSIBILTY_REFRESH_INTERVAL_MILLIS
- : STOPWATCH_REFRESH_INTERVAL_MILLIS);
- }
- };
-
- private void writeToSharedPref(SharedPreferences prefs) {
- SharedPreferences.Editor editor = prefs.edit();
- editor.putLong (Stopwatches.PREF_START_TIME, mStartTime);
- editor.putLong (Stopwatches.PREF_ACCUM_TIME, mAccumulatedTime);
- editor.putInt (Stopwatches.PREF_STATE, mState);
- if (mLapsAdapter != null) {
- long [] laps = mLapsAdapter.getLapTimes();
- if (laps != null) {
- editor.putInt (Stopwatches.PREF_LAP_NUM, laps.length);
- for (int i = 0; i < laps.length; i++) {
- String key = Stopwatches.PREF_LAP_TIME + Integer.toString(laps.length - i);
- editor.putLong (key, laps[i]);
- }
- }
- }
- if (mState == Stopwatches.STOPWATCH_RUNNING) {
- editor.putLong(Stopwatches.NOTIF_CLOCK_BASE, mStartTime-mAccumulatedTime);
- editor.putLong(Stopwatches.NOTIF_CLOCK_ELAPSED, -1);
- editor.putBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, true);
- } else if (mState == Stopwatches.STOPWATCH_STOPPED) {
- editor.putLong(Stopwatches.NOTIF_CLOCK_ELAPSED, mAccumulatedTime);
- editor.putLong(Stopwatches.NOTIF_CLOCK_BASE, -1);
- editor.putBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, false);
- } else if (mState == Stopwatches.STOPWATCH_RESET) {
- editor.remove(Stopwatches.NOTIF_CLOCK_BASE);
- editor.remove(Stopwatches.NOTIF_CLOCK_RUNNING);
- editor.remove(Stopwatches.NOTIF_CLOCK_ELAPSED);
- }
- editor.putBoolean(Stopwatches.PREF_UPDATE_CIRCLE, false);
- editor.apply();
- }
-
- private void readFromSharedPref(SharedPreferences prefs) {
- mStartTime = prefs.getLong(Stopwatches.PREF_START_TIME, 0);
- mAccumulatedTime = prefs.getLong(Stopwatches.PREF_ACCUM_TIME, 0);
- mState = prefs.getInt(Stopwatches.PREF_STATE, Stopwatches.STOPWATCH_RESET);
- int numLaps = prefs.getInt(Stopwatches.PREF_LAP_NUM, Stopwatches.STOPWATCH_RESET);
- if (mLapsAdapter != null) {
- long[] oldLaps = mLapsAdapter.getLapTimes();
- if (oldLaps == null || oldLaps.length < numLaps) {
- long[] laps = new long[numLaps];
- long prevLapElapsedTime = 0;
- for (int lap_i = 0; lap_i < numLaps; lap_i++) {
- String key = Stopwatches.PREF_LAP_TIME + Integer.toString(lap_i + 1);
- long lap = prefs.getLong(key, 0);
- laps[numLaps - lap_i - 1] = lap - prevLapElapsedTime;
- prevLapElapsedTime = lap;
- }
- mLapsAdapter.setLapTimes(laps);
- }
- }
- if (prefs.getBoolean(Stopwatches.PREF_UPDATE_CIRCLE, true)) {
- if (mState == Stopwatches.STOPWATCH_STOPPED) {
- doStop();
- } else if (mState == Stopwatches.STOPWATCH_RUNNING) {
- doStart(mStartTime);
- } else if (mState == Stopwatches.STOPWATCH_RESET) {
+ @Override
+ public void onLeftButtonClick(View view) {
+ switch (getStopwatch().getState()) {
+ case RUNNING:
+ doAddLap();
+ break;
+ case PAUSED:
doReset();
- }
+ break;
}
}
@Override
- public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
- if (prefs.equals(Utils.getDefaultSharedPreferences(getActivity()))) {
- if (! (key.equals(Stopwatches.PREF_LAP_NUM) ||
- key.startsWith(Stopwatches.PREF_LAP_TIME))) {
- readFromSharedPref(prefs);
- if (prefs.getBoolean(Stopwatches.PREF_UPDATE_CIRCLE, true)) {
- mTime.readFromSharedPref(prefs, "sw");
- }
- }
+ public void onRightButtonClick(View view) {
+ doShare();
+ }
+
+ @Override
+ public void setFabAppearance() {
+ if (mFab == null || getSelectedTab() != DeskClock.STOPWATCH_TAB_INDEX) {
+ return;
+ }
+
+ if (getStopwatch().isRunning()) {
+ mFab.setImageResource(R.drawable.ic_pause_white_24dp);
+ mFab.setContentDescription(getString(R.string.sw_pause_button));
+ } else {
+ mFab.setImageResource(R.drawable.ic_start_white_24dp);
+ mFab.setContentDescription(getString(R.string.sw_start_button));
+ }
+ mFab.setVisibility(VISIBLE);
+ }
+
+ @Override
+ public void setLeftRightButtonAppearance() {
+ if (mLeftButton == null || mRightButton == null ||
+ getSelectedTab() != DeskClock.STOPWATCH_TAB_INDEX) {
+ return;
+ }
+
+ mRightButton.setImageResource(R.drawable.ic_share);
+ mRightButton.setContentDescription(getString(R.string.sw_share_button));
+
+ switch (getStopwatch().getState()) {
+ case RESET:
+ mLeftButton.setEnabled(false);
+ mLeftButton.setVisibility(INVISIBLE);
+ mRightButton.setVisibility(INVISIBLE);
+ break;
+ case RUNNING:
+ mLeftButton.setImageResource(R.drawable.ic_lap);
+ mLeftButton.setContentDescription(getString(R.string.sw_lap_button));
+ mLeftButton.setEnabled(canRecordMoreLaps());
+ mLeftButton.setVisibility(canRecordMoreLaps() ? VISIBLE : INVISIBLE);
+ mRightButton.setVisibility(INVISIBLE);
+ break;
+ case PAUSED:
+ mLeftButton.setEnabled(true);
+ mLeftButton.setImageResource(R.drawable.ic_reset);
+ mLeftButton.setContentDescription(getString(R.string.sw_reset_button));
+ mLeftButton.setVisibility(VISIBLE);
+ mRightButton.setVisibility(VISIBLE);
+ break;
}
}
- // Used to keeps screen on when stopwatch is running.
+ /**
+ * Start the stopwatch.
+ */
+ private void doStart() {
+ Events.sendStopwatchEvent(R.string.action_start, R.string.label_deskclock);
+
+ // Update the stopwatch state.
+ DataModel.getDataModel().startStopwatch();
+
+ // Start UI updates.
+ startUpdatingTime();
+ mTime.update();
+ mTimeText.blinkTimeStr(false);
+
+ // Update button states.
+ setFabAppearance();
+ setLeftRightButtonAppearance();
+
+ // Acquire the wake lock.
+ acquireWakeLock();
+ }
+
+ /**
+ * Pause the stopwatch.
+ */
+ private void doPause() {
+ Events.sendStopwatchEvent(R.string.action_pause, R.string.label_deskclock);
+
+ // Update the stopwatch state
+ DataModel.getDataModel().pauseStopwatch();
+
+ // Redraw the paused stopwatch time.
+ updateTime();
+
+ // Stop UI updates.
+ stopUpdatingTime();
+ mTimeText.blinkTimeStr(true);
+
+ // Update button states.
+ setFabAppearance();
+ setLeftRightButtonAppearance();
+
+ // Release the wake lock.
+ releaseWakeLock();
+ }
+
+ /**
+ * Reset the stopwatch.
+ */
+ private void doReset() {
+ Events.sendStopwatchEvent(R.string.action_reset, R.string.label_deskclock);
+
+ // Update the stopwatch state.
+ DataModel.getDataModel().resetStopwatch();
+
+ // Clear the laps.
+ showOrHideLaps(true);
+
+ // Clear the times.
+ mTime.postInvalidateOnAnimation();
+ mTimeText.setTime(0, true, true);
+ mTimeText.blinkTimeStr(false);
+
+ // Update button states.
+ setFabAppearance();
+ setLeftRightButtonAppearance();
+
+ // Release the wake lock.
+ releaseWakeLock();
+ }
+
+ /**
+ * Send stopwatch time and lap times to an external sharing application.
+ */
+ private void doShare() {
+ final String[] subjects = getResources().getStringArray(R.array.sw_share_strings);
+ final String subject = subjects[(int)(Math.random() * subjects.length)];
+ final String text = mLapsAdapter.getShareText();
+
+ final Intent shareIntent = new Intent(Intent.ACTION_SEND)
+ .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
+ .putExtra(Intent.EXTRA_SUBJECT, subject)
+ .putExtra(Intent.EXTRA_TEXT, text)
+ .setType("text/plain");
+
+ final Context context = getActivity();
+ final String title = context.getString(R.string.sw_share_button);
+ final Intent shareChooserIntent = Intent.createChooser(shareIntent, title);
+ try {
+ context.startActivity(shareChooserIntent);
+ } catch (ActivityNotFoundException anfe) {
+ LogUtils.e("No compatible receiver is found");
+ }
+ }
+
+ /**
+ * Record and add a new lap ending now.
+ */
+ private void doAddLap() {
+ Events.sendStopwatchEvent(R.string.action_lap, R.string.label_deskclock);
+
+ // Record a new lap.
+ final Lap lap = mLapsAdapter.addLap();
+ if (lap == null) {
+ return;
+ }
+
+ // Update button states.
+ setLeftRightButtonAppearance();
+
+ if (lap.getLapNumber() == 1) {
+ // Child views from prior lap sets hang around and blit to the screen when adding the
+ // first lap of the subsequent lap set. Remove those superfluous children here manually
+ // to ensure they aren't seen as the first lap is drawn.
+ mLapsList.removeAllViewsInLayout();
+
+ // Start animating the reference lap.
+ mTime.update();
+
+ // Recording the first lap transitions the UI to display the laps list.
+ showOrHideLaps(false);
+ }
+
+ // Ensure the newly added lap is visible on screen.
+ mLapsList.scrollToPosition(0);
+ }
+
+ /**
+ * Show or hide the list of laps.
+ */
+ private void showOrHideLaps(boolean clearLaps) {
+ final Transition transition = new AutoTransition()
+ .addListener(new Transition.TransitionListener() {
+ @Override
+ public void onTransitionStart(Transition transition) {
+ mLapsListIsTransitioning = true;
+ }
+
+ @Override
+ public void onTransitionEnd(Transition transition) {
+ mLapsListIsTransitioning = false;
+ }
+
+ @Override
+ public void onTransitionCancel(Transition transition) {
+ }
+
+ @Override
+ public void onTransitionPause(Transition transition) {
+ }
+
+ @Override
+ public void onTransitionResume(Transition transition) {
+ }
+ });
+
+ final ViewGroup sceneRoot = (ViewGroup) getView();
+ TransitionManager.beginDelayedTransition(sceneRoot, transition);
+
+ if (clearLaps) {
+ mLapsAdapter.clearLaps();
+ }
+
+ final boolean lapsVisible = mLapsAdapter.getItemCount() > 0;
+ mLapsList.setVisibility(lapsVisible ? VISIBLE : GONE);
+ }
private void acquireWakeLock() {
if (mWakeLock == null) {
- final PowerManager pm =
- (PowerManager) getActivity().getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(
- PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG);
+ final PowerManager pm = (PowerManager) getActivity().getSystemService(POWER_SERVICE);
+ mWakeLock = pm.newWakeLock(SCREEN_BRIGHT_WAKE_LOCK | ON_AFTER_RELEASE, TAG);
mWakeLock.setReferenceCounted(false);
}
mWakeLock.acquire();
@@ -832,97 +440,94 @@
}
}
- @Override
- public void onFabClick(View view){
- toggleStopwatchState();
- }
-
- @Override
- public void onLeftButtonClick(View view) {
- final long time = Utils.getTimeNow();
- final Context context = getActivity().getApplicationContext();
- final Intent intent = new Intent(context, StopwatchService.class);
- intent.putExtra(Stopwatches.MESSAGE_TIME, time);
- intent.putExtra(Stopwatches.SHOW_NOTIF, false);
- switch (mState) {
- case Stopwatches.STOPWATCH_RUNNING:
- // Save lap time
- addLapTime(time);
- doLap();
- Events.sendStopwatchEvent(R.string.action_lap, R.string.label_deskclock);
-
- intent.setAction(HandleDeskClockApiCalls.ACTION_LAP_STOPWATCH);
- context.startService(intent);
- break;
- case Stopwatches.STOPWATCH_STOPPED:
- // do reset
- doReset();
- Events.sendStopwatchEvent(R.string.action_reset, R.string.label_deskclock);
-
- intent.setAction(HandleDeskClockApiCalls.ACTION_RESET_STOPWATCH);
- context.startService(intent);
- releaseWakeLock();
- break;
- default:
- // Happens in monkey tests
- LogUtils.i("Illegal state " + mState + " while pressing the left stopwatch button");
- break;
- }
- }
-
- @Override
- public void onRightButtonClick(View view) {
- shareResults();
- }
-
- @Override
- public void setFabAppearance() {
- final DeskClock activity = (DeskClock) getActivity();
- if (mFab == null || activity.getSelectedTab() != DeskClock.STOPWATCH_TAB_INDEX) {
- return;
- }
- if (mState == Stopwatches.STOPWATCH_RUNNING) {
- mFab.setImageResource(R.drawable.ic_fab_pause);
- mFab.setContentDescription(getString(R.string.sw_stop_button));
+ /**
+ * Either pause or start the stopwatch based on its current state.
+ */
+ private void toggleStopwatchState() {
+ if (getStopwatch().isRunning()) {
+ doPause();
} else {
- mFab.setImageResource(R.drawable.ic_fab_play);
- mFab.setContentDescription(getString(R.string.sw_start_button));
+ doStart();
}
- mFab.setVisibility(View.VISIBLE);
}
- @Override
- public void setLeftRightButtonAppearance() {
- final DeskClock activity = (DeskClock) getActivity();
- if (mLeftButton == null || mRightButton == null ||
- activity.getSelectedTab() != DeskClock.STOPWATCH_TAB_INDEX) {
- return;
- }
- mRightButton.setImageResource(R.drawable.ic_share);
- mRightButton.setContentDescription(getString(R.string.sw_share_button));
+ private Stopwatch getStopwatch() {
+ return DataModel.getDataModel().getStopwatch();
+ }
- switch (mState) {
- case Stopwatches.STOPWATCH_RESET:
- mLeftButton.setImageResource(R.drawable.ic_lap);
- mLeftButton.setContentDescription(getString(R.string.sw_lap_button));
- mLeftButton.setEnabled(false);
- mLeftButton.setVisibility(View.INVISIBLE);
- mRightButton.setVisibility(View.INVISIBLE);
- break;
- case Stopwatches.STOPWATCH_RUNNING:
- mLeftButton.setImageResource(R.drawable.ic_lap);
- mLeftButton.setContentDescription(getString(R.string.sw_lap_button));
- mLeftButton.setEnabled(!reachedMaxLaps());
- mLeftButton.setVisibility(View.VISIBLE);
- mRightButton.setVisibility(View.INVISIBLE);
- break;
- case Stopwatches.STOPWATCH_STOPPED:
- mLeftButton.setImageResource(R.drawable.ic_reset);
- mLeftButton.setContentDescription(getString(R.string.sw_reset_button));
- mLeftButton.setEnabled(true);
- mLeftButton.setVisibility(View.VISIBLE);
- mRightButton.setVisibility(View.VISIBLE);
- break;
+ private boolean canRecordMoreLaps() {
+ return DataModel.getDataModel().canAddMoreLaps();
+ }
+
+ /**
+ * Post the first runnable to update times within the UI. It will reschedule itself as needed.
+ */
+ private void startUpdatingTime() {
+ // Ensure only one copy of the runnable is ever scheduled by first stopping updates.
+ stopUpdatingTime();
+ mTime.post(mTimeUpdateRunnable);
+ }
+
+ /**
+ * Remove the runnable that updates times within the UI.
+ */
+ private void stopUpdatingTime() {
+ mTime.removeCallbacks(mTimeUpdateRunnable);
+ }
+
+ /**
+ * Update all time displays based on a single snapshot of the stopwatch progress. This includes
+ * the stopwatch time drawn in the circle, the current lap time and the total elapsed time in
+ * the list of laps.
+ */
+ private void updateTime() {
+ // Compute the total time of the stopwatch.
+ final long totalTime = getStopwatch().getTotalTime();
+
+ // Update the total time display.
+ mTimeText.setTime(totalTime, true, true);
+
+ // Update the current lap.
+ final boolean currentLapIsVisible = mLapsLayoutManager.findFirstVisibleItemPosition() == 0;
+ if (!mLapsListIsTransitioning && currentLapIsVisible) {
+ mLapsAdapter.updateCurrentLap(mLapsList, totalTime);
+ }
+ }
+
+ /**
+ * This runnable periodically updates times throughout the UI. It stops these updates when the
+ * stopwatch is no longer running.
+ */
+ private final class TimeUpdateRunnable implements Runnable {
+ @Override
+ public void run() {
+ final long startTime = SystemClock.elapsedRealtime();
+
+ updateTime();
+
+ if (getStopwatch().isRunning()) {
+ // The stopwatch is still running so execute this runnable again after a delay.
+ final boolean talkBackOn = mAccessibilityManager.isTouchExplorationEnabled();
+
+ // Grant longer time between redraws when talk-back is on to let it catch up.
+ final int period = talkBackOn ? 500 : 25;
+
+ // Try to maintain a consistent period of time between redraws.
+ final long endTime = SystemClock.elapsedRealtime();
+ final long delay = Math.max(0, startTime + period - endTime);
+
+ mTime.postDelayed(this, delay);
+ }
+ }
+ }
+
+ /**
+ * Tapping the stopwatch text also toggles the stopwatch state, just like the fab.
+ */
+ private final class ToggleStopwatchRunnable implements Runnable {
+ @Override
+ public void run() {
+ toggleStopwatchState();
}
}
}
diff --git a/src/com/android/deskclock/stopwatch/StopwatchService.java b/src/com/android/deskclock/stopwatch/StopwatchService.java
index 9172e81..07714e8 100644
--- a/src/com/android/deskclock/stopwatch/StopwatchService.java
+++ b/src/com/android/deskclock/stopwatch/StopwatchService.java
@@ -1,39 +1,38 @@
+/*
+ * Copyright (C) 2015 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.stopwatch;
-import android.app.Notification;
-import android.app.PendingIntent;
import android.app.Service;
-import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.os.IBinder;
-import android.preference.PreferenceManager;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationManagerCompat;
-import android.view.View;
-import android.widget.RemoteViews;
-import com.android.deskclock.CircleTimerView;
-import com.android.deskclock.DeskClock;
import com.android.deskclock.HandleDeskClockApiCalls;
import com.android.deskclock.R;
-import com.android.deskclock.Utils;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.events.Events;
/**
- * TODO: Insert description here. (generated by sblitz)
+ * This service exists solely to allow the stopwatch notification to alter the state of the
+ * stopwatch without disturbing the notification shade. If an activity were used instead (even one
+ * that is not displayed) the notification manager implicitly closes the notification shade which
+ * clashes with the use case of starting/pausing/lapping/resetting the stopwatch without
+ * disturbing the notification shade.
*/
-public class StopwatchService extends Service {
- // Member fields
- private int mNumLaps;
- private long mElapsedTime;
- private long mStartTime;
- private boolean mLoadApp;
- private NotificationManagerCompat mNotificationManager;
-
- // Constants for intent information
- // Make this a large number to avoid the alarm ID's which seem to be 1, 2, ...
- // Must also be different than TimerReceiver.IN_USE_NOTIFICATION_ID
- private static final int NOTIFICATION_ID = Integer.MAX_VALUE - 1;
+public final class StopwatchService extends Service {
@Override
public IBinder onBind(Intent intent) {
@@ -41,423 +40,31 @@
}
@Override
- public void onCreate() {
- mNumLaps = 0;
- mElapsedTime = 0;
- mStartTime = 0;
- mLoadApp = false;
- mNotificationManager = NotificationManagerCompat.from(this);
- }
-
- @Override
public int onStartCommand(Intent intent, int flags, int startId) {
- if (intent == null) {
- return Service.START_NOT_STICKY;
- }
-
- if (mStartTime == 0 || mElapsedTime == 0 || mNumLaps == 0) {
- // May not have the most recent values.
- readFromSharedPrefs();
- }
-
- String actionType = intent.getAction();
- long actionTime = intent.getLongExtra(Stopwatches.MESSAGE_TIME, Utils.getTimeNow());
- boolean showNotif = intent.getBooleanExtra(Stopwatches.SHOW_NOTIF, true);
- // Update the stopwatch circle when the app is open or is being opened.
- boolean updateCircle = !showNotif
- || intent.getAction().equals(Stopwatches.RESET_AND_LAUNCH_STOPWATCH);
- switch(actionType) {
- case HandleDeskClockApiCalls.ACTION_START_STOPWATCH:
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(this) ;
- prefs.edit().putBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, true).apply();
-
- mStartTime = actionTime;
- writeSharedPrefsStarted(mStartTime, updateCircle);
- if (showNotif) {
- setNotification(mStartTime - mElapsedTime, true, mNumLaps);
- } else {
- saveNotification(mStartTime - mElapsedTime, true, mNumLaps);
- }
+ switch (intent.getAction()) {
+ case HandleDeskClockApiCalls.ACTION_START_STOPWATCH: {
+ DataModel.getDataModel().startStopwatch();
+ Events.sendStopwatchEvent(R.string.action_start, R.string.label_notification);
break;
- case HandleDeskClockApiCalls.ACTION_LAP_STOPWATCH:
- mNumLaps++;
- long lapTimeElapsed = actionTime - mStartTime + mElapsedTime;
- writeSharedPrefsLap(lapTimeElapsed, updateCircle);
- if (showNotif) {
- setNotification(mStartTime - mElapsedTime, true, mNumLaps);
- } else {
- saveNotification(mStartTime - mElapsedTime, true, mNumLaps);
- }
- break;
- case HandleDeskClockApiCalls.ACTION_STOP_STOPWATCH:
- prefs = Utils.getDefaultSharedPreferences(this);
- prefs.edit().putBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, false).apply();
-
- mElapsedTime = mElapsedTime + (actionTime - mStartTime);
- writeSharedPrefsStopped(mElapsedTime, updateCircle);
- if (showNotif) {
- setNotification(actionTime - mElapsedTime, false, mNumLaps);
- } else {
- saveNotification(mElapsedTime, false, mNumLaps);
- }
- break;
- case HandleDeskClockApiCalls.ACTION_RESET_STOPWATCH:
- mLoadApp = false;
- writeSharedPrefsReset(updateCircle);
- clearSavedNotification();
- stopSelf();
- break;
- case Stopwatches.RESET_AND_LAUNCH_STOPWATCH:
- mLoadApp = true;
- writeSharedPrefsReset(updateCircle);
- clearSavedNotification();
- closeNotificationShade();
- stopSelf();
- break;
- case Stopwatches.SHARE_STOPWATCH:
- if (mElapsedTime > 0) {
- closeNotificationShade();
- Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
- shareIntent.setType("text/plain");
- shareIntent.putExtra(Intent.EXTRA_SUBJECT, Stopwatches.getShareTitle(
- getApplicationContext()));
- shareIntent.putExtra(Intent.EXTRA_TEXT, Stopwatches.buildShareResults(
- getApplicationContext(), mElapsedTime, readLapsFromPrefs()));
- Intent chooserIntent = Intent.createChooser(shareIntent, null);
- chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- getApplication().startActivity(chooserIntent);
- }
- break;
- case Stopwatches.SHOW_NOTIF:
- // SHOW_NOTIF sent from the DeskClock.onPause
- // If a notification is not displayed, this service's work is over
- if (!showSavedNotification()) {
- stopSelf();
- }
- break;
- case Stopwatches.KILL_NOTIF:
- mNotificationManager.cancel(NOTIFICATION_ID);
- break;
-
- }
-
- // We want this service to continue running until it is explicitly
- // stopped, so return sticky.
- return START_STICKY;
- }
-
- @Override
- public void onDestroy() {
- mNotificationManager.cancel(NOTIFICATION_ID);
- clearSavedNotification();
- mNumLaps = 0;
- mElapsedTime = 0;
- mStartTime = 0;
- if (mLoadApp) {
- Intent activityIntent = new Intent(getApplicationContext(), DeskClock.class);
- activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- activityIntent.putExtra(
- DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.STOPWATCH_TAB_INDEX);
- startActivity(activityIntent);
- mLoadApp = false;
- }
- }
-
- private void setNotification(long clockBaseTime, boolean clockRunning, int numLaps) {
- Context context = getApplicationContext();
- // Intent to load the app for a non-button click.
- Intent intent = new Intent(context, DeskClock.class);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.STOPWATCH_TAB_INDEX);
- // add category to distinguish between stopwatch intents and timer intents
- intent.addCategory("stopwatch");
- PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent,
- PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
-
- // Set up remoteviews for the notification.
- RemoteViews remoteViewsCollapsed = new RemoteViews(getPackageName(),
- R.layout.stopwatch_notif_collapsed);
- remoteViewsCollapsed.setOnClickPendingIntent(R.id.swn_collapsed_hitspace, pendingIntent);
- remoteViewsCollapsed.setChronometer(
- R.id.swn_collapsed_chronometer, clockBaseTime, null, clockRunning);
- remoteViewsCollapsed.
- setImageViewResource(R.id.notification_icon, R.drawable.stat_notify_stopwatch);
- RemoteViews remoteViewsExpanded = new RemoteViews(getPackageName(),
- R.layout.stopwatch_notif_expanded);
- remoteViewsExpanded.setOnClickPendingIntent(R.id.swn_expanded_hitspace, pendingIntent);
- remoteViewsExpanded.setChronometer(
- R.id.swn_expanded_chronometer, clockBaseTime, null, clockRunning);
- remoteViewsExpanded.
- setImageViewResource(R.id.notification_icon, R.drawable.stat_notify_stopwatch);
-
- if (clockRunning) {
- // Left button: lap
- remoteViewsExpanded.setTextViewText(
- R.id.swn_left_button, getResources().getText(R.string.sw_lap_button));
- Intent leftButtonIntent = new Intent(context, StopwatchService.class);
- leftButtonIntent.setAction(HandleDeskClockApiCalls.ACTION_LAP_STOPWATCH);
- remoteViewsExpanded.setOnClickPendingIntent(R.id.swn_left_button,
- PendingIntent.getService(context, 0, leftButtonIntent, 0));
- remoteViewsExpanded.
- setTextViewCompoundDrawablesRelative(R.id.swn_left_button,
- R.drawable.ic_lap_24dp, 0, 0, 0);
-
- // Right button: stop clock
- remoteViewsExpanded.setTextViewText(
- R.id.swn_right_button, getResources().getText(R.string.sw_stop_button));
- Intent rightButtonIntent = new Intent(context, StopwatchService.class);
- rightButtonIntent.setAction(HandleDeskClockApiCalls.ACTION_STOP_STOPWATCH);
- remoteViewsExpanded.setOnClickPendingIntent(R.id.swn_right_button,
- PendingIntent.getService(context, 0, rightButtonIntent, 0));
- remoteViewsExpanded.
- setTextViewCompoundDrawablesRelative(R.id.swn_right_button,
- R.drawable.ic_stop_24dp, 0, 0, 0);
-
- // Show the laps if applicable.
- if (numLaps > 0) {
- String lapText = String.format(
- context.getString(R.string.sw_notification_lap_number), numLaps);
- remoteViewsCollapsed.setTextViewText(R.id.swn_collapsed_laps, lapText);
- remoteViewsCollapsed.setViewVisibility(R.id.swn_collapsed_laps, View.VISIBLE);
- remoteViewsExpanded.setTextViewText(R.id.swn_expanded_laps, lapText);
- remoteViewsExpanded.setViewVisibility(R.id.swn_expanded_laps, View.VISIBLE);
- } else {
- remoteViewsCollapsed.setViewVisibility(R.id.swn_collapsed_laps, View.GONE);
- remoteViewsExpanded.setViewVisibility(R.id.swn_expanded_laps, View.GONE);
}
- } else {
- // Left button: reset clock
- remoteViewsExpanded.setTextViewText(
- R.id.swn_left_button, getResources().getText(R.string.sw_reset_button));
- Intent leftButtonIntent = new Intent(context, StopwatchService.class);
- leftButtonIntent.setAction(Stopwatches.RESET_AND_LAUNCH_STOPWATCH);
- remoteViewsExpanded.setOnClickPendingIntent(R.id.swn_left_button,
- PendingIntent.getService(context, 0, leftButtonIntent, 0));
- remoteViewsExpanded.
- setTextViewCompoundDrawablesRelative(R.id.swn_left_button,
- R.drawable.ic_reset_24dp, 0, 0, 0);
-
- // Right button: start clock
- remoteViewsExpanded.setTextViewText(
- R.id.swn_right_button, getResources().getText(R.string.sw_start_button));
- Intent rightButtonIntent = new Intent(context, StopwatchService.class);
- rightButtonIntent.setAction(HandleDeskClockApiCalls.ACTION_START_STOPWATCH);
- remoteViewsExpanded.setOnClickPendingIntent(R.id.swn_right_button,
- PendingIntent.getService(context, 0, rightButtonIntent, 0));
- remoteViewsExpanded.
- setTextViewCompoundDrawablesRelative(R.id.swn_right_button,
- R.drawable.ic_start_24dp, 0, 0, 0);
-
- // Show stopped string.
- remoteViewsCollapsed.
- setTextViewText(R.id.swn_collapsed_laps, getString(R.string.swn_stopped));
- remoteViewsCollapsed.setViewVisibility(R.id.swn_collapsed_laps, View.VISIBLE);
- remoteViewsExpanded.
- setTextViewText(R.id.swn_expanded_laps, getString(R.string.swn_stopped));
- remoteViewsExpanded.setViewVisibility(R.id.swn_expanded_laps, View.VISIBLE);
- }
-
- Intent dismissIntent = new Intent(context, StopwatchService.class);
- dismissIntent.setAction(HandleDeskClockApiCalls.ACTION_RESET_STOPWATCH);
-
- Notification notification = new NotificationCompat.Builder(context)
- .setAutoCancel(!clockRunning)
- .setContent(remoteViewsCollapsed)
- .setOngoing(clockRunning)
- .setDeleteIntent(PendingIntent.getService(context, 0, dismissIntent, 0))
- .setSmallIcon(R.drawable.ic_tab_stopwatch_activated)
- .setPriority(Notification.PRIORITY_MAX)
- .setLocalOnly(true)
- .build();
- notification.bigContentView = remoteViewsExpanded;
- mNotificationManager.notify(NOTIFICATION_ID, notification);
- }
-
- /** Save the notification to be shown when the app is closed. **/
- private void saveNotification(long clockTime, boolean clockRunning, int numLaps) {
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(
- getApplicationContext());
- SharedPreferences.Editor editor = prefs.edit();
- if (clockRunning) {
- editor.putLong(Stopwatches.NOTIF_CLOCK_BASE, clockTime);
- editor.putLong(Stopwatches.NOTIF_CLOCK_ELAPSED, -1);
- editor.putBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, true);
- } else {
- editor.putLong(Stopwatches.NOTIF_CLOCK_ELAPSED, clockTime);
- editor.putLong(Stopwatches.NOTIF_CLOCK_BASE, -1);
- editor.putBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, false);
- }
- editor.putBoolean(Stopwatches.PREF_UPDATE_CIRCLE, false);
- editor.apply();
- }
-
- /** Show the most recently saved notification. **/
- private boolean showSavedNotification() {
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(
- getApplicationContext());
- long clockBaseTime = prefs.getLong(Stopwatches.NOTIF_CLOCK_BASE, -1);
- long clockElapsedTime = prefs.getLong(Stopwatches.NOTIF_CLOCK_ELAPSED, -1);
- boolean clockRunning = prefs.getBoolean(Stopwatches.NOTIF_CLOCK_RUNNING, false);
- int numLaps = prefs.getInt(Stopwatches.PREF_LAP_NUM, -1);
- if (clockBaseTime == -1) {
- if (clockElapsedTime == -1) {
- return false;
- } else {
- // We don't have a clock base time, so the clock is stopped.
- // Use the elapsed time to figure out what time to show.
- mElapsedTime = clockElapsedTime;
- clockBaseTime = Utils.getTimeNow() - clockElapsedTime;
+ case HandleDeskClockApiCalls.ACTION_PAUSE_STOPWATCH: {
+ DataModel.getDataModel().pauseStopwatch();
+ Events.sendStopwatchEvent(R.string.action_pause, R.string.label_notification);
+ break;
+ }
+ case HandleDeskClockApiCalls.ACTION_LAP_STOPWATCH: {
+ DataModel.getDataModel().addLap();
+ Events.sendStopwatchEvent(R.string.action_lap, R.string.label_notification);
+ break;
+ }
+ case HandleDeskClockApiCalls.ACTION_RESET_STOPWATCH: {
+ DataModel.getDataModel().clearLaps();
+ DataModel.getDataModel().resetStopwatch();
+ Events.sendStopwatchEvent(R.string.action_reset, R.string.label_notification);
+ break;
}
}
- setNotification(clockBaseTime, clockRunning, numLaps);
- return true;
- }
- private void clearSavedNotification() {
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(
- getApplicationContext());
- SharedPreferences.Editor editor = prefs.edit();
- editor.remove(Stopwatches.NOTIF_CLOCK_BASE);
- editor.remove(Stopwatches.NOTIF_CLOCK_RUNNING);
- editor.remove(Stopwatches.NOTIF_CLOCK_ELAPSED);
- editor.apply();
+ return Service.START_NOT_STICKY;
}
-
- private void closeNotificationShade() {
- Intent intent = new Intent();
- intent.setAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
- sendBroadcast(intent);
- }
-
- private void readFromSharedPrefs() {
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(
- getApplicationContext());
- mStartTime = prefs.getLong(Stopwatches.PREF_START_TIME, 0);
- mElapsedTime = prefs.getLong(Stopwatches.PREF_ACCUM_TIME, 0);
- mNumLaps = prefs.getInt(Stopwatches.PREF_LAP_NUM, Stopwatches.STOPWATCH_RESET);
- }
-
- private long[] readLapsFromPrefs() {
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(
- getApplicationContext());
- int numLaps = prefs.getInt(Stopwatches.PREF_LAP_NUM, Stopwatches.STOPWATCH_RESET);
- long[] laps = new long[numLaps];
- long prevLapElapsedTime = 0;
- for (int lap_i = 0; lap_i < numLaps; lap_i++) {
- String key = Stopwatches.PREF_LAP_TIME + Integer.toString(lap_i + 1);
- long lap = prefs.getLong(key, 0);
- if (lap == prevLapElapsedTime && lap_i == numLaps - 1) {
- lap = mElapsedTime;
- }
- laps[numLaps - lap_i - 1] = lap - prevLapElapsedTime;
- prevLapElapsedTime = lap;
- }
- return laps;
- }
-
- private void writeToSharedPrefs(Long startTime, Long lapTimeElapsed, Long elapsedTime,
- Integer state, boolean updateCircle) {
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(
- getApplicationContext());
- SharedPreferences.Editor editor = prefs.edit();
- if (startTime != null) {
- editor.putLong(Stopwatches.PREF_START_TIME, startTime);
- mStartTime = startTime;
- }
- if (lapTimeElapsed != null) {
- int numLaps = prefs.getInt(Stopwatches.PREF_LAP_NUM, 0);
- if (numLaps == 0) {
- mNumLaps++;
- numLaps++;
- }
- editor.putLong(Stopwatches.PREF_LAP_TIME + Integer.toString(numLaps), lapTimeElapsed);
- numLaps++;
- editor.putLong(Stopwatches.PREF_LAP_TIME + Integer.toString(numLaps), lapTimeElapsed);
- editor.putInt(Stopwatches.PREF_LAP_NUM, numLaps);
- }
- if (elapsedTime != null) {
- editor.putLong(Stopwatches.PREF_ACCUM_TIME, elapsedTime);
- mElapsedTime = elapsedTime;
- }
- if (state != null) {
- if (state == Stopwatches.STOPWATCH_RESET) {
- editor.putInt(Stopwatches.PREF_STATE, Stopwatches.STOPWATCH_RESET);
- } else if (state == Stopwatches.STOPWATCH_RUNNING) {
- editor.putInt(Stopwatches.PREF_STATE, Stopwatches.STOPWATCH_RUNNING);
- } else if (state == Stopwatches.STOPWATCH_STOPPED) {
- editor.putInt(Stopwatches.PREF_STATE, Stopwatches.STOPWATCH_STOPPED);
- }
- }
- editor.putBoolean(Stopwatches.PREF_UPDATE_CIRCLE, updateCircle);
- editor.apply();
- }
-
- private void writeSharedPrefsStarted(long startTime, boolean updateCircle) {
- writeToSharedPrefs(startTime, null, null, Stopwatches.STOPWATCH_RUNNING, updateCircle);
- if (updateCircle) {
- long time = Utils.getTimeNow();
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(
- getApplicationContext());
- long intervalStartTime = prefs.getLong(
- Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL_START, -1);
- if (intervalStartTime != -1) {
- intervalStartTime = time;
- SharedPreferences.Editor editor = prefs.edit();
- editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL_START,
- intervalStartTime);
- editor.putBoolean(Stopwatches.KEY + CircleTimerView.PREF_CTV_PAUSED, false);
- editor.apply();
- }
- }
- }
-
- private void writeSharedPrefsLap(long lapTimeElapsed, boolean updateCircle) {
- writeToSharedPrefs(null, lapTimeElapsed, null, null, updateCircle);
- if (updateCircle) {
- long time = Utils.getTimeNow();
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(
- getApplicationContext());
- SharedPreferences.Editor editor = prefs.edit();
- long laps[] = readLapsFromPrefs();
- int numLaps = laps.length;
- long lapTime = laps[1];
- if (numLaps == 2) { // Have only hit lap once.
- editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL, lapTime);
- } else {
- editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_MARKER_TIME, lapTime);
- }
- editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_ACCUM_TIME, 0);
- if (numLaps < Stopwatches.MAX_LAPS) {
- editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL_START, time);
- editor.putBoolean(Stopwatches.KEY + CircleTimerView.PREF_CTV_PAUSED, false);
- } else {
- editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL_START, -1);
- }
- editor.apply();
- }
- }
-
- private void writeSharedPrefsStopped(long elapsedTime, boolean updateCircle) {
- writeToSharedPrefs(null, null, elapsedTime, Stopwatches.STOPWATCH_STOPPED, updateCircle);
- if (updateCircle) {
- long time = Utils.getTimeNow();
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(
- getApplicationContext());
- long accumulatedTime = prefs.getLong(
- Stopwatches.KEY + CircleTimerView.PREF_CTV_ACCUM_TIME, 0);
- long intervalStartTime = prefs.getLong(
- Stopwatches.KEY + CircleTimerView.PREF_CTV_INTERVAL_START, -1);
- accumulatedTime += time - intervalStartTime;
- SharedPreferences.Editor editor = prefs.edit();
- editor.putLong(Stopwatches.KEY + CircleTimerView.PREF_CTV_ACCUM_TIME, accumulatedTime);
- editor.putBoolean(Stopwatches.KEY + CircleTimerView.PREF_CTV_PAUSED, true);
- editor.putLong(
- Stopwatches.KEY + CircleTimerView.PREF_CTV_CURRENT_INTERVAL, accumulatedTime);
- editor.apply();
- }
- }
-
- private void writeSharedPrefsReset(boolean updateCircle) {
- writeToSharedPrefs(null, null, null, Stopwatches.STOPWATCH_RESET, updateCircle);
- }
-}
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/stopwatch/Stopwatches.java b/src/com/android/deskclock/stopwatch/Stopwatches.java
deleted file mode 100644
index 68b2c69..0000000
--- a/src/com/android/deskclock/stopwatch/Stopwatches.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2012 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.stopwatch;
-
-import android.content.Context;
-
-import com.android.deskclock.R;
-
-import java.text.DecimalFormatSymbols;
-
-/**
- * Stopwatch utility class providing access to stopwatch resources and data formatting strings of
- * stopwatch data.
- */
-public class Stopwatches {
- // Actions processed by stopwatch receiver
- public static final String SHARE_STOPWATCH = "share_stopwatch";
- public static final String RESET_AND_LAUNCH_STOPWATCH = "reset_and_launch_stopwatch";
- public static final String MESSAGE_TIME = "message_time";
- public static final String SHOW_NOTIF = "show_notification";
- public static final String KILL_NOTIF = "kill_notification";
- public static final String PREF_START_TIME = "sw_start_time";
- public static final String PREF_ACCUM_TIME = "sw_accum_time";
- public static final String PREF_STATE = "sw_state";
- public static final String PREF_LAP_NUM = "sw_lap_num";
- public static final String PREF_LAP_TIME = "sw_lap_time_";
- public static final String PREF_UPDATE_CIRCLE = "sw_update_circle";
- public static final String NOTIF_CLOCK_BASE = "notif_clock_base";
- public static final String NOTIF_CLOCK_ELAPSED = "notif_clock_elapsed";
- public static final String NOTIF_CLOCK_RUNNING = "notif_clock_running";
- public static final String KEY = "sw";
-
- public static final int STOPWATCH_RESET = 0;
- public static final int STOPWATCH_RUNNING = 1;
- public static final int STOPWATCH_STOPPED = 2;
-
- public static final int MAX_LAPS = 99;
- public static final int NO_LAP_NUMBER = -1;
-
- /**
- * Pull a random jocular title
- * @param context context with resources
- * @return the random title
- */
- public static String getShareTitle(Context context) {
- String [] mLabels = context.getResources().getStringArray(R.array.sw_share_strings);
- return mLabels[(int)(Math.random() * mLabels.length)];
- }
-
- /**
- * Create a multi-line text with the stopwatch lap data
- * @param context context with resources
- * @param time total elapsed time
- * @param laps array of times
- * @return formatted text
- */
- public static String buildShareResults(Context context, String time, long[] laps) {
- StringBuilder b = new StringBuilder (context.getString(R.string.sw_share_main, time));
- b.append("\n");
-
- int lapsNum = laps == null? 0 : laps.length;
- if (lapsNum == 0) {
- return b.toString();
- }
-
- b.append(context.getString(R.string.sw_share_laps));
- b.append("\n");
- for (int i = 1; i <= lapsNum; i ++) {
- b.append(getTimeText(context, laps[lapsNum-i], i));
- b.append("\n");
- }
- return b.toString();
- }
-
- /**
- * Create a multi-line text with the stopwatch lap data
- * @param context context with resources
- * @param time total elapsed time
- * @param laps array of times
- * @return formatted text
- */
- public static String buildShareResults(Context context, long time, long[] laps) {
- return buildShareResults(context, getTimeText(context, time, NO_LAP_NUMBER), laps);
- }
-
- /***
- * Format the string of the time running on the stopwatch up to hundred of a second accuracy
- * @param context context with resources
- * @param time - in hundreds of a second since the stopwatch started
- * @param lap lap number
- * @return formatted text
- */
- public static String getTimeText(Context context, long time, int lap) {
- if (time < 0) {
- time = 0;
- }
- String[] formats;
- if (lap != NO_LAP_NUMBER) {
- formats = context.getResources().getStringArray(R.array.shared_laps_format_set);
- } else {
- formats = context.getResources().getStringArray(R.array.stopwatch_format_set);
- }
- char decimalSeparator = DecimalFormatSymbols.getInstance().getDecimalSeparator();
- int formatIndex;
-
- long hundreds, seconds, minutes, hours;
- seconds = time / 1000;
- hundreds = (time - seconds * 1000) / 10;
- minutes = seconds / 60;
- seconds = seconds - minutes * 60;
- hours = minutes / 60;
- minutes = minutes - hours * 60;
- if (hours >= 100) {
- formatIndex = 4;
- } else if (hours >= 10) {
- formatIndex = 3;
- } else if (hours > 0) {
- formatIndex = 2;
- } else if (minutes >= 10) {
- formatIndex = 1;
- } else {
- formatIndex = 0;
- }
- return String.format(formats[formatIndex], hours, minutes,
- seconds, hundreds, decimalSeparator, lap);
- }
-
- /***
- * Sets the string of the time running on the stopwatch up to hundred of a second accuracy
- * @param time - in hundreds of a second since the stopwatch started
- */
- public static String formatTimeText(long time, final String format) {
- if (time < 0) {
- time = 0;
- }
- long hundreds, seconds, minutes, hours;
- seconds = time / 1000;
- hundreds = (time - seconds * 1000) / 10;
- minutes = seconds / 60;
- seconds = seconds - minutes * 60;
- hours = minutes / 60;
- minutes = minutes - hours * 60;
- char decimalSeparator = DecimalFormatSymbols.getInstance().getDecimalSeparator();
- return String.format(format, hours, minutes, seconds, hundreds, decimalSeparator);
- }
-}
diff --git a/src/com/android/deskclock/timer/CountingTimerView.java b/src/com/android/deskclock/timer/CountingTimerView.java
index 278ffd8..bb5778c 100644
--- a/src/com/android/deskclock/timer/CountingTimerView.java
+++ b/src/com/android/deskclock/timer/CountingTimerView.java
@@ -32,7 +32,6 @@
import com.android.deskclock.R;
import com.android.deskclock.Utils;
-
/**
* Class to measure and draw the time in the {@link com.android.deskclock.CircleTimerView}.
* This class manages and sums the work of the four members mBigHours, mBigMinutes,
@@ -88,7 +87,6 @@
CountingTimerView.this.showTime(mVisible);
postDelayed(mBlinkThread, 500);
}
-
};
/**
@@ -488,20 +486,6 @@
}
}
- public String getTimeString() {
- // Though only called from Stopwatch Share, so hundredth are never null,
- // protect the future and check for null mHundredths
- if (mHundredths == null) {
- if (mHours == null) {
- return String.format("%s:%s", mMinutes, mSeconds);
- }
- return String.format("%s:%s:%s", mHours, mMinutes, mSeconds);
- } else if (mHours == null) {
- return String.format("%s:%s.%s", mMinutes, mSeconds, mHundredths);
- }
- return String.format("%s:%s:%s.%s", mHours, mMinutes, mSeconds, mHundredths);
- }
-
private static String getTimeStringForAccessibility(int hours, int minutes, int seconds,
boolean showNeg, Resources r) {
StringBuilder s = new StringBuilder();
diff --git a/src/com/android/deskclock/timer/ExpiredTimersActivity.java b/src/com/android/deskclock/timer/ExpiredTimersActivity.java
new file mode 100644
index 0000000..08b6304
--- /dev/null
+++ b/src/com/android/deskclock/timer/ExpiredTimersActivity.java
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2015 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.timer;
+
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.support.annotation.NonNull;
+import android.transition.AutoTransition;
+import android.transition.TransitionManager;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import com.android.deskclock.BaseActivity;
+import com.android.deskclock.R;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Timer;
+import com.android.deskclock.data.TimerListener;
+
+import java.util.List;
+
+/**
+ * This activity is designed to be shown over the lock screen. As such, it displays the expired
+ * timers and a single button to reset them all. Each expired timer can also be reset to one minute
+ * with a button in the user interface. All other timer operations are disabled in this activity.
+ */
+public class ExpiredTimersActivity extends BaseActivity {
+
+ /** Scheduled to update the timers while at least one is expired. */
+ private final Runnable mTimeUpdateRunnable = new TimeUpdateRunnable();
+
+ /** Updates the timers displayed in this activity as the backing data changes. */
+ private final TimerListener mTimerChangeWatcher = new TimerChangeWatcher();
+
+ /** The scene root for transitions when expired timers are added/removed from this container. */
+ private ViewGroup mExpiredTimersScrollView;
+
+ /** Displays the expired timers. */
+ private ViewGroup mExpiredTimersView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.expired_timers_activity);
+
+ mExpiredTimersView = (ViewGroup) findViewById(R.id.expired_timers_list);
+ mExpiredTimersScrollView = (ViewGroup) findViewById(R.id.expired_timers_scroll);
+
+ findViewById(R.id.fab).setOnClickListener(new FabClickListener());
+
+ final View view = findViewById(R.id.expired_timers_activity);
+ view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
+
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
+ | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
+
+ // Create views for each of the expired timers.
+ for (Timer timer : getExpiredTimers()) {
+ addTimer(timer);
+ }
+
+ // Update views in response to timer data changes.
+ DataModel.getDataModel().addTimerListener(mTimerChangeWatcher);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ startUpdatingTime();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ stopUpdatingTime();
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ DataModel.getDataModel().removeTimerListener(mTimerChangeWatcher);
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
+ if (event.getAction() == KeyEvent.ACTION_UP) {
+ switch (event.getKeyCode()) {
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ case KeyEvent.KEYCODE_VOLUME_MUTE:
+ case KeyEvent.KEYCODE_CAMERA:
+ case KeyEvent.KEYCODE_FOCUS:
+ DataModel.getDataModel().resetExpiredTimers(R.string.label_hardware_button);
+ return true;
+ }
+ }
+ return super.dispatchKeyEvent(event);
+ }
+
+ /**
+ * Post the first runnable to update times within the UI. It will reschedule itself as needed.
+ */
+ private void startUpdatingTime() {
+ // Ensure only one copy of the runnable is ever scheduled by first stopping updates.
+ stopUpdatingTime();
+ mExpiredTimersView.post(mTimeUpdateRunnable);
+ }
+
+ /**
+ * Remove the runnable that updates times within the UI.
+ */
+ private void stopUpdatingTime() {
+ mExpiredTimersView.removeCallbacks(mTimeUpdateRunnable);
+ }
+
+ /**
+ * Create and add a new view that corresponds with the given {@code timer}.
+ */
+ private void addTimer(Timer timer) {
+ TransitionManager.beginDelayedTransition(mExpiredTimersScrollView, new AutoTransition());
+
+ final TimerItem timerItem = (TimerItem)
+ getLayoutInflater().inflate(R.layout.timer_item, mExpiredTimersView, false);
+ // Store the timer id as a tag on the view so it can be located on delete.
+ timerItem.setTag(timer.getId());
+ mExpiredTimersView.addView(timerItem);
+
+ // Hide the label hint for expired timers.
+ final TextView labelView = (TextView) timerItem.findViewById(R.id.timer_label);
+ labelView.setHint(null);
+
+ // Add logic to the "Add 1 Minute" button.
+ final View addMinuteButton = timerItem.findViewById(R.id.reset_add);
+ addMinuteButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ final int index = mExpiredTimersView.indexOfChild(timerItem);
+ final Timer timer = getExpiredTimers().get(index);
+ DataModel.getDataModel().addTimerMinute(timer);
+ }
+ });
+
+ // If the first timer was just added, center it.
+ final List<Timer> expiredTimers = getExpiredTimers();
+ if (expiredTimers.size() == 1) {
+ centerFirstTimer();
+ } else if (expiredTimers.size() == 2) {
+ uncenterFirstTimer();
+ }
+ }
+
+ /**
+ * Remove an existing view that corresponds with the given {@code timer}.
+ */
+ private void removeTimer(Timer timer) {
+ TransitionManager.beginDelayedTransition(mExpiredTimersScrollView, new AutoTransition());
+
+ final View timerView = mExpiredTimersView.findViewWithTag(timer.getId());
+ mExpiredTimersView.removeView(timerView);
+
+ // If the second last timer was just removed, center the last timer.
+ final List<Timer> expiredTimers = getExpiredTimers();
+ if (expiredTimers.isEmpty()) {
+ finish();
+ } else if (expiredTimers.size() == 1) {
+ centerFirstTimer();
+ }
+ }
+
+ /**
+ * Center the single timer.
+ */
+ private void centerFirstTimer() {
+ final FrameLayout.LayoutParams lp =
+ (FrameLayout.LayoutParams) mExpiredTimersView.getLayoutParams();
+ lp.gravity = Gravity.CENTER;
+ mExpiredTimersView.requestLayout();
+ }
+
+ /**
+ * Display the multiple timers as a scrollable list.
+ */
+ private void uncenterFirstTimer() {
+ final FrameLayout.LayoutParams lp =
+ (FrameLayout.LayoutParams) mExpiredTimersView.getLayoutParams();
+ lp.gravity = Gravity.NO_GRAVITY;
+ mExpiredTimersView.requestLayout();
+ }
+
+ private List<Timer> getExpiredTimers() {
+ return DataModel.getDataModel().getExpiredTimers();
+ }
+
+ /**
+ * Periodically refreshes the state of each timer.
+ */
+ private class TimeUpdateRunnable implements Runnable {
+ @Override
+ public void run() {
+ final long startTime = SystemClock.elapsedRealtime();
+
+ for (int i = 0; i < mExpiredTimersView.getChildCount(); i++) {
+ final TimerItem timerItem = (TimerItem) mExpiredTimersView.getChildAt(i);
+ final Timer timer = getExpiredTimers().get(i);
+ timerItem.update(timer);
+ }
+
+ final long endTime = SystemClock.elapsedRealtime();
+
+ // Try to maintain a consistent period of time between redraws.
+ final long delay = Math.max(0, startTime + 20 - endTime);
+ mExpiredTimersView.postDelayed(this, delay);
+ }
+ }
+
+ /**
+ * Clicking the fab resets all expired timers.
+ */
+ private class FabClickListener implements View.OnClickListener {
+ @Override
+ public void onClick(View v) {
+ stopUpdatingTime();
+ DataModel.getDataModel().removeTimerListener(mTimerChangeWatcher);
+ DataModel.getDataModel().resetExpiredTimers(R.string.label_deskclock);
+ finish();
+ }
+ }
+
+ /**
+ * Adds and removes expired timers from this activity based on their state changes.
+ */
+ private class TimerChangeWatcher implements TimerListener {
+ @Override
+ public void timerAdded(Timer timer) {
+ if (timer.isExpired()) {
+ addTimer(timer);
+ }
+ }
+
+ @Override
+ public void timerUpdated(Timer before, Timer after) {
+ if (!before.isExpired() && after.isExpired()) {
+ addTimer(after);
+ } else if (before.isExpired() && !after.isExpired()) {
+ removeTimer(before);
+ }
+ }
+
+ @Override
+ public void timerRemoved(Timer timer) {
+ if (timer.isExpired()) {
+ removeTimer(timer);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/timer/FragmentStatePagerAdapter2.java b/src/com/android/deskclock/timer/FragmentStatePagerAdapter2.java
deleted file mode 100644
index 0d6a8ff..0000000
--- a/src/com/android/deskclock/timer/FragmentStatePagerAdapter2.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2014 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.timer;
-
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
-import android.support.v13.app.FragmentCompat;
-import android.support.v13.app.FragmentStatePagerAdapter;
-import android.support.v4.util.SparseArrayCompat;
-import android.support.v4.view.PagerAdapter;
-import android.view.View;
-import android.view.ViewGroup;
-
-/**
- * Forked from support lib's {@link FragmentStatePagerAdapter}, with some minor
- * changes that couldn't be accomplished through subclassing: we need to override the
- * onDataSetChanged method using the private member mFragments which cannot be accessed outside.
- *
- * This class is used for TimerFragment's vertical view pager only. It removed the save/restore
- * functionality, because all the fragments needs to be destroyed whenever TimerFragment's
- * onPause, in order to bind the newly created timer view with the new pager fragment.
- */
-public abstract class FragmentStatePagerAdapter2 extends PagerAdapter {
-
- private final FragmentManager mFragmentManager;
- private FragmentTransaction mCurTransaction = null;
-
- private SparseArrayCompat<Fragment> mFragments = new SparseArrayCompat<Fragment>();
- private Fragment mCurrentPrimaryItem = null;
-
-
- public FragmentStatePagerAdapter2(FragmentManager fm) {
- mFragmentManager = fm;
- }
-
- /**
- * Return the Fragment associated with a specified position.
- */
- public abstract Fragment getItem(int position);
-
- @Override
- public void startUpdate(ViewGroup container) {
- }
-
- @Override
- public Object instantiateItem(ViewGroup container, int position) {
- // If we already have this item instantiated, there is nothing
- // to do. This can happen when we are restoring the entire pager
- // from its saved state, where the fragment manager has already
- // taken care of restoring the fragments we previously had instantiated.
- final Fragment existing = mFragments.get(position);
- if (existing != null) {
- return existing;
- }
-
- if (mCurTransaction == null) {
- mCurTransaction = mFragmentManager.beginTransaction();
- }
-
- Fragment fragment = getItem(position);
- if (fragment != mCurrentPrimaryItem) {
- setItemVisible(fragment, false);
- }
- mFragments.put(position, fragment);
- mCurTransaction.add(container.getId(), fragment);
-
- return fragment;
- }
-
- @Override
- public void destroyItem(ViewGroup container, int position, Object object) {
- Fragment fragment = (Fragment) object;
-
- if (mCurTransaction == null) {
- mCurTransaction = mFragmentManager.beginTransaction();
- }
- mFragments.delete(position);
-
- mCurTransaction.remove(fragment);
- }
-
- @Override
- public void setPrimaryItem(ViewGroup container, int position, Object object) {
- Fragment fragment = (Fragment) object;
- if (fragment != mCurrentPrimaryItem) {
- if (mCurrentPrimaryItem != null) {
- setItemVisible(mCurrentPrimaryItem, false);
- }
- if (fragment != null) {
- setItemVisible(fragment, true);
- }
- mCurrentPrimaryItem = fragment;
- }
- }
-
- @Override
- public void finishUpdate(ViewGroup container) {
- if (mCurTransaction != null) {
- mCurTransaction.commitAllowingStateLoss();
- mCurTransaction = null;
- mFragmentManager.executePendingTransactions();
- }
- }
-
- @Override
- public boolean isViewFromObject(View view, Object object) {
- return ((Fragment) object).getView() == view;
- }
-
- public void setItemVisible(Fragment item, boolean visible) {
- FragmentCompat.setMenuVisibility(item, visible);
- FragmentCompat.setUserVisibleHint(item, visible);
- }
-
- @Override
- public void notifyDataSetChanged() {
- // update positions in mFragments
- SparseArrayCompat<Fragment> newFragments =
- new SparseArrayCompat<Fragment>(mFragments.size());
- for (int i = 0; i < mFragments.size(); i++) {
- final int oldPos = mFragments.keyAt(i);
- final Fragment f = mFragments.valueAt(i);
- final int newPos = getItemPosition(f);
-
- if (newPos != POSITION_NONE) {
- final int pos = (newPos >= 0) ? newPos : oldPos;
- newFragments.put(pos, f);
- }
- }
- mFragments = newFragments;
-
- super.notifyDataSetChanged();
- }
-
- public Fragment getFragmentAt(int position) {
- return mFragments.valueAt(position);
- }
-
-}
diff --git a/src/com/android/deskclock/timer/TimerAlertFullScreen.java b/src/com/android/deskclock/timer/TimerAlertFullScreen.java
deleted file mode 100644
index db6edfc..0000000
--- a/src/com/android/deskclock/timer/TimerAlertFullScreen.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2012 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.timer;
-
-import android.content.Intent;
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-
-import com.android.deskclock.BaseActivity;
-import com.android.deskclock.R;
-import com.android.deskclock.Utils;
-import com.android.deskclock.timer.TimerFullScreenFragment.OnEmptyListListener;
-
-/**
- * Timer alarm alert: pops visible indicator. This activity is the version which
- * shows over the lock screen.
- * This activity re-uses TimerFullScreenFragment GUI
- */
-public class TimerAlertFullScreen extends BaseActivity implements OnEmptyListListener {
-
- private static final String TAG = "TimerAlertFullScreen";
- private static final String FRAGMENT = "timer";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- setContentView(R.layout.timer_alert_full_screen);
- final View view = findViewById(R.id.fragment_container);
- view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
-
- final Window win = getWindow();
- win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
- | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
- // Turn on the screen unless we are being launched from the AlarmAlert
- // subclass as a result of the screen turning off.
- win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
-
- // Don't create overlapping fragments.
- if (getFragment() == null) {
- TimerFullScreenFragment timerFragment = new TimerFullScreenFragment();
-
- // Create fragment and give it an argument to only show
- // timers in STATE_TIMESUP state
- Bundle args = new Bundle();
- args.putBoolean(Timers.TIMESUP_MODE, true);
-
- timerFragment.setArguments(args);
-
- // Add the fragment to the 'fragment_container' FrameLayout
- getFragmentManager().beginTransaction()
- .add(R.id.fragment_container, timerFragment, FRAGMENT).commit();
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- // Only show notifications for times-up when this activity closed.
- Utils.cancelTimesUpNotifications(this);
- }
-
- @Override
- public void onPause() {
- Utils.showTimesUpNotifications(this);
-
- super.onPause();
- }
-
- @Override
- public boolean dispatchKeyEvent(KeyEvent event) {
- // Handle key down and key up on a few of the system keys.
- boolean up = event.getAction() == KeyEvent.ACTION_UP;
- switch (event.getKeyCode()) {
- // Volume keys and camera keys stop all the timers
- case KeyEvent.KEYCODE_VOLUME_UP:
- case KeyEvent.KEYCODE_VOLUME_DOWN:
- case KeyEvent.KEYCODE_VOLUME_MUTE:
- case KeyEvent.KEYCODE_CAMERA:
- case KeyEvent.KEYCODE_FOCUS:
- if (up) {
- stopAllTimesUpTimers();
- }
- return true;
-
- default:
- break;
- }
- return super.dispatchKeyEvent(event);
- }
-
- /**
- * this is called when a second timer is triggered while a previous alert
- * window is still active.
- */
- @Override
- protected void onNewIntent(Intent intent) {
- TimerFullScreenFragment timerFragment = getFragment();
- if (timerFragment != null) {
- timerFragment.restartAdapter();
- }
- super.onNewIntent(intent);
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- ViewGroup viewContainer = (ViewGroup)findViewById(R.id.fragment_container);
- viewContainer.requestLayout();
- super.onConfigurationChanged(newConfig);
- }
-
- protected void stopAllTimesUpTimers() {
- TimerFullScreenFragment timerFragment = getFragment();
- if (timerFragment != null) {
- timerFragment.updateAllTimesUpTimers();
- }
- }
-
- @Override
- public void onEmptyList() {
- if (Timers.LOGGING) {
- Log.v(TAG, "onEmptyList");
- }
- onListChanged();
- finish();
- }
-
- @Override
- public void onListChanged() {
- Utils.showInUseNotifications(this);
- }
-
- private TimerFullScreenFragment getFragment() {
- return (TimerFullScreenFragment) getFragmentManager().findFragmentByTag(FRAGMENT);
- }
-}
diff --git a/src/com/android/deskclock/timer/TimerCircleView.java b/src/com/android/deskclock/timer/TimerCircleView.java
new file mode 100644
index 0000000..dd2c79f
--- /dev/null
+++ b/src/com/android/deskclock/timer/TimerCircleView.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2015 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.timer;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import android.view.View;
+
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+import com.android.deskclock.data.Timer;
+
+/**
+ * Custom view that draws timer progress as a circle.
+ */
+public final class TimerCircleView extends View {
+
+ /** The size of the dot indicating the progress through the timer. */
+ private final float mDotRadius;
+
+ /** An amount to subtract from the true radius to account for drawing thicknesses. */
+ private final float mRadiusOffset;
+
+ /** The color indicating the remaining portion of the timer. */
+ private final int mRemainderColor;
+
+ /** The color indicating the completed portion of the timer. */
+ private final int mCompletedColor;
+
+ /** The size of the stroke that paints the timer circle. */
+ private final float mStrokeSize;
+
+ private final Paint mPaint = new Paint();
+ private final Paint mFill = new Paint();
+ private final RectF mArcRect = new RectF();
+
+ private Timer mTimer;
+
+ @SuppressWarnings("unused")
+ public TimerCircleView(Context context) {
+ this(context, null);
+ }
+
+ public TimerCircleView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ final Resources resources = context.getResources();
+ final float dotDiameter = resources.getDimension(R.dimen.circletimer_dot_size);
+
+ mDotRadius = dotDiameter / 2f;
+ mStrokeSize = resources.getDimension(R.dimen.circletimer_circle_size);
+ mRadiusOffset = Utils.calculateRadiusOffset(mStrokeSize, dotDiameter, 0);
+
+ mRemainderColor = resources.getColor(R.color.clock_white);
+ mCompletedColor = Utils.obtainStyledColor(context, R.attr.colorAccent, Color.RED);
+
+ mPaint.setAntiAlias(true);
+ mPaint.setStyle(Paint.Style.STROKE);
+
+ mFill.setAntiAlias(true);
+ mFill.setColor(mCompletedColor);
+ mFill.setStyle(Paint.Style.FILL);
+ }
+
+ void update(Timer timer) {
+ if (mTimer != timer) {
+ mTimer = timer;
+ postInvalidateOnAnimation();
+ }
+ }
+
+ @Override
+ public void onDraw(Canvas canvas) {
+ if (mTimer == null) {
+ return;
+ }
+
+ // Compute the size and location of the circle to be drawn.
+ final int xCenter = getWidth() / 2;
+ final int yCenter = getHeight() / 2;
+ final float radius = Math.min(xCenter, yCenter) - mRadiusOffset;
+
+ // Reset old painting state.
+ mPaint.setColor(mRemainderColor);
+ mPaint.setStrokeWidth(mStrokeSize);
+
+ // If the timer is reset, draw a simple white circle.
+ final float redPercent;
+ if (mTimer.isReset()) {
+ // Draw a complete white circle; no red arc required.
+ canvas.drawCircle(xCenter, yCenter, radius, mPaint);
+
+ // Red percent is 0 since no timer progress has been made.
+ redPercent = 0;
+ } else if (mTimer.isExpired()) {
+ mPaint.setColor(mCompletedColor);
+
+ // Draw a complete white circle; no red arc required.
+ canvas.drawCircle(xCenter, yCenter, radius, mPaint);
+
+ // Red percent is 1 since the timer has expired.
+ redPercent = 1;
+ } else {
+ // Draw a combination of red and white arcs to create a circle.
+ mArcRect.top = yCenter - radius;
+ mArcRect.bottom = yCenter + radius;
+ mArcRect.left = xCenter - radius;
+ mArcRect.right = xCenter + radius;
+ redPercent = Math.min(1, (float) mTimer.getElapsedTime() / (float) mTimer.getTotalLength());
+ final float whitePercent = 1 - redPercent;
+
+ // Draw a white arc to indicate the amount of timer that remains.
+ canvas.drawArc(mArcRect, 270, whitePercent * 360, false, mPaint);
+
+ // Draw a red arc to indicate the amount of timer completed.
+ mPaint.setColor(mCompletedColor);
+ canvas.drawArc(mArcRect, 270, -redPercent * 360 , false, mPaint);
+ }
+
+ // Draw a red dot to indicate current progress through the timer.
+ final float dotAngleDegrees = 270 - redPercent * 360;
+ final double dotAngleRadians = Math.toRadians(dotAngleDegrees);
+ final float dotX = xCenter + (float) (radius * Math.cos(dotAngleRadians));
+ final float dotY = yCenter + (float) (radius * Math.sin(dotAngleRadians));
+ canvas.drawCircle(dotX, dotY, mDotRadius, mFill);
+
+ if (mTimer.isRunning()) {
+ postInvalidateOnAnimation();
+ }
+ }
+}
diff --git a/src/com/android/deskclock/timer/TimerFragment.java b/src/com/android/deskclock/timer/TimerFragment.java
index be14910..28a2d2e 100644
--- a/src/com/android/deskclock/timer/TimerFragment.java
+++ b/src/com/android/deskclock/timer/TimerFragment.java
@@ -20,755 +20,686 @@
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
-import android.animation.TimeInterpolator;
-import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.res.Resources;
-import android.os.Build;
import android.os.Bundle;
-import android.preference.PreferenceManager;
+import android.os.SystemClock;
+import android.support.annotation.VisibleForTesting;
import android.support.v4.view.ViewPager;
-import android.text.format.DateUtils;
-import android.transition.AutoTransition;
-import android.transition.Transition;
-import android.transition.TransitionManager;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
-import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageButton;
import android.widget.ImageView;
-import com.android.deskclock.AnimatorUtils;
import com.android.deskclock.DeskClock;
import com.android.deskclock.DeskClockFragment;
+import com.android.deskclock.HandleDeskClockApiCalls;
import com.android.deskclock.R;
-import com.android.deskclock.TimerSetupView;
-import com.android.deskclock.Utils;
-import com.android.deskclock.VerticalViewPager;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Timer;
+import com.android.deskclock.data.TimerListener;
import com.android.deskclock.events.Events;
-public class TimerFragment extends DeskClockFragment implements OnSharedPreferenceChangeListener {
- public static final long ANIMATION_TIME_MILLIS = DateUtils.SECOND_IN_MILLIS / 3;
+import java.io.Serializable;
+import java.util.Arrays;
- private static final String KEY_SETUP_SELECTED = "_setup_selected";
- private static final String KEY_ENTRY_STATE = "entry_state";
- private static final int PAGINATION_DOTS_COUNT = 4;
- private static final String CURR_PAGE = "_currPage";
- private static final TimeInterpolator ACCELERATE_INTERPOLATOR = new AccelerateInterpolator();
- private static final TimeInterpolator DECELERATE_INTERPOLATOR = new DecelerateInterpolator();
- private static final long ROTATE_ANIM_DURATION_MILIS = 150;
+import static android.view.View.ALPHA;
+import static android.view.View.GONE;
+import static android.view.View.INVISIBLE;
+import static android.view.View.OnClickListener;
+import static android.view.View.SCALE_X;
+import static android.view.View.VISIBLE;
+import static com.android.deskclock.AnimatorUtils.getScaleAnimator;
- // Transitions are available only in API 19+
- private static final boolean USE_TRANSITION_FRAMEWORK =
- Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
+/**
+ * Displays a vertical list of timers in all states.
+ */
+public class TimerFragment extends DeskClockFragment {
- private boolean mTicking = false;
- private TimerSetupView mSetupView;
- private VerticalViewPager mViewPager;
- private TimerFragmentAdapter mAdapter;
- private ImageButton mCancel;
- private ViewGroup mContentView;
- private View mTimerView;
- private View mLastView;
- private ImageView[] mPageIndicators = new ImageView[PAGINATION_DOTS_COUNT];
- private Transition mDeleteTransition;
- private SharedPreferences mPrefs;
- private Bundle mViewState = null;
- private NotificationManager mNotificationManager;
+ private static final String EXTRA_TIMER_SETUP = "com.android.deskclock.action.TIMER_SETUP";
- private final ViewPager.OnPageChangeListener mOnPageChangeListener =
- new ViewPager.SimpleOnPageChangeListener() {
- @Override
- public void onPageSelected(int position) {
- highlightPageIndicator(position);
- TimerFragment.this.setTimerViewFabIcon(getCurrentTimer());
- }
- };
+ private static final String KEY_TIMER_SETUP_STATE = "timer_setup_input";
- private final Runnable mClockTick = new Runnable() {
- boolean mVisible = true;
- final static int TIME_PERIOD_MS = 1000;
- final static int TIME_DELAY_MS = 20;
- final static int SPLIT = TIME_PERIOD_MS / 2;
+ /** Notified when the user swipes vertically to change the visible timer. */
+ private final TimerPageChangeListener mTimerPageChangeListener = new TimerPageChangeListener();
- @Override
- public void run() {
- // Setup for blinking
- final boolean visible = Utils.getTimeNow() % TIME_PERIOD_MS < SPLIT;
- final boolean toggle = mVisible != visible;
- mVisible = visible;
- for (int i = 0; i < mAdapter.getCount(); i++) {
- final TimerObj t = mAdapter.getTimerAt(i);
- if (t.mState == TimerObj.STATE_RUNNING || t.mState == TimerObj.STATE_TIMESUP) {
- final long timeLeft = t.updateTimeLeft(false);
- if (t.mView != null) {
- t.mView.setTime(timeLeft, false);
- // Update button every 1/2 second
- if (toggle) {
- final ImageButton addMinuteButton = (ImageButton)
- t.mView.findViewById(R.id.reset_add);
- final boolean canAddMinute = TimerObj.MAX_TIMER_LENGTH - t.mTimeLeft
- > TimerObj.MINUTE_IN_MILLIS;
- addMinuteButton.setEnabled(canAddMinute);
- }
- }
- }
- if (t.mTimeLeft <= 0 && t.mState != TimerObj.STATE_RESTART) {
- t.setState(TimerObj.STATE_TIMESUP);
- if (t.mView != null) {
- t.mView.timesUp();
- }
- }
- // The blinking
- if (toggle && t.mView != null) {
- if (t.mState == TimerObj.STATE_TIMESUP) {
- t.mView.setCircleBlink(mVisible);
- }
- if (t.mState == TimerObj.STATE_STOPPED) {
- t.mView.setTextBlink(mVisible);
- }
- }
- }
- mTimerView.postDelayed(mClockTick, TIME_DELAY_MS);
- }
- };
+ /** Scheduled to update the timers while at least one is running. */
+ private final Runnable mTimeUpdateRunnable = new TimeUpdateRunnable();
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mViewState = savedInstanceState;
+ /** Updates the {@link #mPageIndicators} in response to timers being added or removed. */
+ private final TimerListener mTimerWatcher = new TimerWatcher();
+
+ private TimerSetupView mCreateTimerView;
+ private ViewPager mViewPager;
+ private TimerPagerAdapter mAdapter;
+ private ImageButton mCancelCreateButton;
+ private View mTimersView;
+ private View mCurrentView;
+ private ImageView[] mPageIndicators;
+
+ private int mShortAnimationDuration;
+ private int mMediumAnimationDuration;
+
+ private Serializable mTimerSetupState;
+
+ /**
+ * @return an Intent that selects the timers tab with the setup screen for a new timer in place.
+ */
+ public static Intent createTimerSetupIntent(Context context) {
+ return new Intent(context, DeskClock.class)
+ .putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.TIMER_TAB_INDEX)
+ .putExtra(EXTRA_TIMER_SETUP, true);
}
+ /** The public no-arg constructor required by all fragments. */
+ public TimerFragment() {}
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.timer_fragment, container, false);
- mContentView = (ViewGroup) view;
- mTimerView = view.findViewById(R.id.timer_view);
- mSetupView = (TimerSetupView) view.findViewById(R.id.timer_setup);
- mViewPager = (VerticalViewPager) view.findViewById(R.id.vertical_view_pager);
- mPageIndicators[0] = (ImageView) view.findViewById(R.id.page_indicator0);
- mPageIndicators[1] = (ImageView) view.findViewById(R.id.page_indicator1);
- mPageIndicators[2] = (ImageView) view.findViewById(R.id.page_indicator2);
- mPageIndicators[3] = (ImageView) view.findViewById(R.id.page_indicator3);
- mCancel = (ImageButton) view.findViewById(R.id.timer_cancel);
- mCancel.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mAdapter.getCount() != 0) {
- final AnimatorListenerAdapter adapter = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mSetupView.reset(); // Make sure the setup is cleared for next time
- mSetupView.setScaleX(1.0f); // Reset the scale for setup view
- goToPagerView();
- }
- };
- createRotateAnimator(adapter, false).start();
- }
- }
- });
- if (USE_TRANSITION_FRAMEWORK) {
- mDeleteTransition = new AutoTransition();
- mDeleteTransition.setDuration(ANIMATION_TIME_MILLIS / 2);
- mDeleteTransition.setInterpolator(new AccelerateDecelerateInterpolator());
+
+ mAdapter = new TimerPagerAdapter(getChildFragmentManager());
+ mViewPager = (ViewPager) view.findViewById(R.id.vertical_view_pager);
+ mViewPager.setAdapter(mAdapter);
+ mViewPager.addOnPageChangeListener(mTimerPageChangeListener);
+
+ mTimersView = view.findViewById(R.id.timer_view);
+ mCreateTimerView = (TimerSetupView) view.findViewById(R.id.timer_setup);
+ mPageIndicators = new ImageView[] {
+ (ImageView) view.findViewById(R.id.page_indicator0),
+ (ImageView) view.findViewById(R.id.page_indicator1),
+ (ImageView) view.findViewById(R.id.page_indicator2),
+ (ImageView) view.findViewById(R.id.page_indicator3)
+ };
+ mCancelCreateButton = (ImageButton) view.findViewById(R.id.timer_cancel);
+ mCancelCreateButton.setOnClickListener(new CancelCreateListener());
+
+ view.findViewById(R.id.timer_create).setOnClickListener(new CreateListener());
+
+ final Resources resources = getResources();
+ mShortAnimationDuration = resources.getInteger(android.R.integer.config_shortAnimTime);
+ mMediumAnimationDuration = resources.getInteger(android.R.integer.config_mediumAnimTime);
+
+ DataModel.getDataModel().addTimerListener(mAdapter);
+ DataModel.getDataModel().addTimerListener(mTimerWatcher);
+
+ // If timer setup state is present, retrieve it to be later honored.
+ if (savedInstanceState != null) {
+ mTimerSetupState = savedInstanceState.getSerializable(KEY_TIMER_SETUP_STATE);
}
return view;
}
@Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- final Context context = getActivity();
- mPrefs = Utils.getDefaultSharedPreferences(context);
- mNotificationManager = (NotificationManager) context.getSystemService(Context
- .NOTIFICATION_SERVICE);
- }
-
- @Override
public void onResume() {
super.onResume();
- if (getActivity() instanceof DeskClock) {
- DeskClock activity = (DeskClock) getActivity();
- activity.registerPageChangedListener(this);
+
+ // Start watching for page changes away from this fragment.
+ getDeskClock().registerPageChangedListener(this);
+
+ // Initialize the page indicators.
+ updatePageIndicators();
+
+ boolean createTimer = false;
+ int showTimerId = -1;
+
+ // Examine the intent of the parent activity to determine which view to display.
+ final Intent intent = getActivity().getIntent();
+ if (intent != null) {
+ // These extras are single-use; remove them after honoring them.
+ createTimer = intent.getBooleanExtra(EXTRA_TIMER_SETUP, false);
+ intent.removeExtra(EXTRA_TIMER_SETUP);
+
+ showTimerId = intent.getIntExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID, -1);
+ intent.removeExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID);
}
- if (mAdapter == null) {
- mAdapter = new TimerFragmentAdapter(getChildFragmentManager(), mPrefs);
- }
- mAdapter.populateTimersFromPref();
- mViewPager.setAdapter(mAdapter);
- mViewPager.setOnPageChangeListener(mOnPageChangeListener);
- mPrefs.registerOnSharedPreferenceChangeListener(this);
+ // Choose the view to display in this fragment.
+ if (showTimerId != -1) {
+ // A specific timer must be shown; show the list of timers.
+ showTimersView();
+ } else if (!hasTimers() || createTimer || mTimerSetupState != null) {
+ // No timers exist, a timer is being created, or the last view was timer setup;
+ // show the timer setup view.
+ showCreateTimerView();
- if (mPrefs.getBoolean(Timers.REFRESH_UI_WITH_LATEST_DATA, false)) {
- // Clear the flag indicating the adapter is out of sync with the database.
- mPrefs.edit().putBoolean(Timers.REFRESH_UI_WITH_LATEST_DATA, false).apply();
- }
-
- mCancel.setVisibility(mAdapter.getCount() == 0 ? View.INVISIBLE : View.VISIBLE);
-
- boolean goToSetUpView;
- // Process extras that were sent to the app and were intended for the timer fragment
- final Intent newIntent = getActivity().getIntent();
- if (newIntent != null
- && newIntent.getBooleanExtra(TimerFullScreenFragment.GOTO_SETUP_VIEW, false)) {
- goToSetUpView = true;
- } else if (newIntent != null
- && newIntent.getBooleanExtra(Timers.FIRST_LAUNCH_FROM_API_CALL, false)) {
- // We use this extra to identify if a. this activity is launched from api call,
- // and b. this fragment is resumed for the first time. If both are true,
- // we should show the timer view instead of setup view.
- goToSetUpView = false;
- highlightPageIndicator(0);
- // Find the id of the timer to scroll to. Timers are loaded from SharedPrefs using a
- // HashSet as an intermediary, so we need to find the position in this specific
- // Adapter instance instead of just passing the position through the intent.
- final int timerPosition = ((TimerFragmentAdapter) mViewPager.getAdapter())
- .getTimerPosition(newIntent.getIntExtra(Timers.SCROLL_TO_TIMER_ID, 0));
- mViewPager.setCurrentItem(timerPosition);
-
- // Reset the extra to false to ensure when next time the fragment resume,
- // we no longer care if it's from api call or not.
- newIntent.putExtra(Timers.FIRST_LAUNCH_FROM_API_CALL, false);
- } else {
- if (mViewState != null) {
- final int currPage = mViewState.getInt(CURR_PAGE);
- mViewPager.setCurrentItem(currPage);
- highlightPageIndicator(currPage);
- final boolean hasPreviousInput = mViewState.getBoolean(KEY_SETUP_SELECTED, false);
- goToSetUpView = hasPreviousInput || mAdapter.getCount() == 0;
- mSetupView.restoreEntryState(mViewState, KEY_ENTRY_STATE);
- } else {
- highlightPageIndicator(0);
- // If user was not previously using the setup, determine which view to go by count
- goToSetUpView = mAdapter.getCount() == 0;
+ if (mTimerSetupState != null) {
+ mCreateTimerView.setState(mTimerSetupState);
+ mTimerSetupState = null;
}
- }
- if (goToSetUpView) {
- goToSetUpView();
} else {
- goToPagerView();
+ // Otherwise, default to showing the list of timers.
+ showTimersView();
+ }
+
+ // If the intent did not specify a timer to show, show the last timer that expired.
+ if (showTimerId == -1) {
+ final Timer timer = DataModel.getDataModel().getMostRecentExpiredTimer();
+ showTimerId = timer == null ? -1 : timer.getId();
+ }
+
+ // If a specific timer should be displayed, display the corresponding timer tab.
+ if (showTimerId != -1) {
+ final Timer timer = DataModel.getDataModel().getTimer(showTimerId);
+ if (timer != null) {
+ final int index = DataModel.getDataModel().getTimers().indexOf(timer);
+ mViewPager.setCurrentItem(index);
+ }
}
}
@Override
public void onPause() {
super.onPause();
- if (getActivity() instanceof DeskClock) {
- ((DeskClock) getActivity()).unregisterPageChangedListener(this);
- }
- mPrefs.unregisterOnSharedPreferenceChangeListener(this);
- if (mAdapter != null) {
- mAdapter.saveTimersToSharedPrefs();
- }
- stopClockTicks();
+
+ // Stop watching for page changes away from this fragment.
+ getDeskClock().unregisterPageChangedListener(this);
}
@Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- if (mSetupView != null) {
- outState.putBoolean(KEY_SETUP_SELECTED, mSetupView.getVisibility() == View.VISIBLE);
- mSetupView.saveEntryState(outState, KEY_ENTRY_STATE);
- }
- outState.putInt(CURR_PAGE, mViewPager.getCurrentItem());
- mViewState = outState;
+ public void onStop() {
+ super.onStop();
+
+ // Stop updating the timers when this fragment is no longer visible.
+ stopUpdatingTime();
}
@Override
public void onDestroyView() {
super.onDestroyView();
- mViewState = null;
+
+ DataModel.getDataModel().removeTimerListener(mAdapter);
+ DataModel.getDataModel().removeTimerListener(mTimerWatcher);
}
@Override
- public void onPageChanged(int page) {
- if (page == DeskClock.TIMER_TAB_INDEX && mAdapter != null) {
- mAdapter.notifyDataSetChanged();
- }
- }
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
- // Starts the ticks that animate the timers.
- private void startClockTicks() {
- mTimerView.postDelayed(mClockTick, 20);
- mTicking = true;
- }
-
- // Stops the ticks that animate the timers.
- private void stopClockTicks() {
- if (mTicking) {
- mViewPager.removeCallbacks(mClockTick);
- mTicking = false;
- }
- }
-
- private void goToPagerView() {
- mTimerView.setVisibility(View.VISIBLE);
- mSetupView.setVisibility(View.GONE);
- mLastView = mTimerView;
- setLeftRightButtonAppearance();
- setFabAppearance();
- startClockTicks();
- }
-
- private void goToSetUpView() {
- if (mAdapter.getCount() == 0) {
- mCancel.setVisibility(View.INVISIBLE);
- } else {
- mCancel.setVisibility(View.VISIBLE);
- }
- mTimerView.setVisibility(View.GONE);
- mSetupView.setVisibility(View.VISIBLE);
- mSetupView.updateDeleteButtonAndDivider();
- mSetupView.registerStartButton(mFab);
- mLastView = mSetupView;
- setLeftRightButtonAppearance();
- setFabAppearance();
- stopClockTicks();
- }
-
- private void updateTimerState(TimerObj t, String action) {
- updateTimerState(t, action, true);
- }
-
- /**
- * @param update indicates whether to call updateNextTimesup in TimerReceiver. This is false
- * only for label changes.
- */
- private void updateTimerState(TimerObj t, String action, boolean update) {
- if (Timers.DELETE_TIMER.equals(action)) {
- mAdapter.deleteTimer(t.mTimerId);
- if (mAdapter.getCount() == 0) {
- mSetupView.reset();
- goToSetUpView();
- }
- } else {
- t.writeToSharedPref(mPrefs);
- }
- final Intent i = new Intent();
- i.setAction(action);
- i.putExtra(Timers.TIMER_INTENT_EXTRA, t.mTimerId);
- i.putExtra(Timers.UPDATE_NEXT_TIMESUP, update);
- // Make sure the receiver is getting the intent ASAP.
- i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- getActivity().sendBroadcast(i);
- }
-
- private void setTimerViewFabIcon(TimerObj timer) {
- final DeskClock deskClock = (DeskClock) getActivity();
- if (deskClock == null || timer == null || mFab == null) {
- return;
- }
-
- if (deskClock.getSelectedTab() != DeskClock.TIMER_TAB_INDEX) {
- return;
- }
-
- final Resources r = deskClock.getResources();
- switch (timer.mState) {
- case TimerObj.STATE_RUNNING:
- mFab.setVisibility(View.VISIBLE);
- mFab.setContentDescription(r.getString(R.string.timer_stop));
- mFab.setImageResource(R.drawable.ic_fab_pause);
- break;
- case TimerObj.STATE_STOPPED:
- case TimerObj.STATE_RESTART:
- // It is possible for a Timer from an older version of Clock to be in STATE_DELETED and
- // still exist in the list
- case TimerObj.STATE_DELETED:
- mFab.setVisibility(View.VISIBLE);
- mFab.setContentDescription(r.getString(R.string.timer_start));
- mFab.setImageResource(R.drawable.ic_fab_play);
- break;
- case TimerObj.STATE_TIMESUP: // time-up but didn't stopped, continue negative ticking
- mFab.setVisibility(View.VISIBLE);
- mFab.setContentDescription(r.getString(R.string.timer_stop));
- mFab.setImageResource(R.drawable.ic_fab_stop);
- break;
- default:
- }
- }
-
- private Animator getRotateFromAnimator(View view) {
- final Animator animator = ObjectAnimator.ofFloat(view, View.SCALE_X, 1.0f, 0.0f);
- animator.setDuration(ROTATE_ANIM_DURATION_MILIS);
- animator.setInterpolator(DECELERATE_INTERPOLATOR);
- return animator;
- }
-
- private Animator getRotateToAnimator(View view) {
- final Animator animator = ObjectAnimator.ofFloat(view, View.SCALE_X, 0.0f, 1.0f);
- animator.setDuration(ROTATE_ANIM_DURATION_MILIS);
- animator.setInterpolator(ACCELERATE_INTERPOLATOR);
- return animator;
- }
-
- private Animator getScaleFooterButtonsAnimator(final boolean show) {
- final AnimatorSet animatorSet = new AnimatorSet();
- final Animator leftButtonAnimator = AnimatorUtils.getScaleAnimator(
- mLeftButton, show ? 0.0f : 1.0f, show ? 1.0f : 0.0f);
- final Animator rightButtonAnimator = AnimatorUtils.getScaleAnimator(
- mRightButton, show ? 0.0f : 1.0f, show ? 1.0f : 0.0f);
- final float fabStartScale = (show && mFab.getVisibility() == View.INVISIBLE) ? 0.0f : 1.0f;
- final Animator fabAnimator = AnimatorUtils.getScaleAnimator(
- mFab, fabStartScale, show ? 1.0f : 0.0f);
- animatorSet.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mLeftButton.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
- mRightButton.setVisibility(show ? View.VISIBLE : View.INVISIBLE);
- restoreScale(mLeftButton);
- restoreScale(mRightButton);
- restoreScale(mFab);
- }
- });
- // If not show, means transiting from timer view to setup view,
- // when the setup view starts to rotate, the footer buttons are already invisible,
- // so the scaling has to finish before the setup view starts rotating
- animatorSet.setDuration(show ? ROTATE_ANIM_DURATION_MILIS * 2 : ROTATE_ANIM_DURATION_MILIS);
- animatorSet.play(leftButtonAnimator).with(rightButtonAnimator).with(fabAnimator);
- return animatorSet;
- }
-
- private void restoreScale(View view) {
- view.setScaleX(1.0f);
- view.setScaleY(1.0f);
- }
-
- private Animator createRotateAnimator(AnimatorListenerAdapter adapter, boolean toSetup) {
- final AnimatorSet animatorSet = new AnimatorSet();
- final Animator rotateFrom = getRotateFromAnimator(toSetup ? mTimerView : mSetupView);
- rotateFrom.addListener(adapter);
- final Animator rotateTo = getRotateToAnimator(toSetup ? mSetupView : mTimerView);
- final Animator expandFooterButton = getScaleFooterButtonsAnimator(!toSetup);
- animatorSet.play(rotateFrom).before(rotateTo).with(expandFooterButton);
- return animatorSet;
- }
-
- @Override
- public void onFabClick(View view) {
- if (mLastView != mTimerView) {
- // Timer is at Setup View, so fab is "play", rotate from setup view to timer view
- final AnimatorListenerAdapter adapter = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- final int timerLength = mSetupView.getTime();
- final TimerObj timerObj = new TimerObj(timerLength * DateUtils.SECOND_IN_MILLIS,
- getActivity());
- timerObj.setState(TimerObj.STATE_RUNNING);
- Events.sendTimerEvent(R.string.action_create, R.string.label_deskclock);
-
- updateTimerState(timerObj, Timers.START_TIMER);
- Events.sendTimerEvent(R.string.action_start, R.string.label_deskclock);
-
- // Go to the newly created timer view
- mAdapter.addTimer(timerObj);
- mViewPager.setCurrentItem(0);
- highlightPageIndicator(0);
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- mSetupView.reset(); // Make sure the setup is cleared for next time
- mSetupView.setScaleX(1.0f); // Reset the scale for setup view
- goToPagerView();
- }
- };
- createRotateAnimator(adapter, false).start();
- } else {
- // Timer is at view pager, so fab is "play" or "pause" or "square that means reset"
- final TimerObj t = getCurrentTimer();
- switch (t.mState) {
- case TimerObj.STATE_RUNNING:
- // Stop timer and save the remaining time of the timer
- t.setState(TimerObj.STATE_STOPPED);
- t.mView.pause();
- t.updateTimeLeft(true);
- updateTimerState(t, Timers.STOP_TIMER);
- Events.sendTimerEvent(R.string.action_stop, R.string.label_deskclock);
- break;
- case TimerObj.STATE_STOPPED:
- case TimerObj.STATE_RESTART:
- // It is possible for a Timer from an older version of Clock to be in STATE_DELETED and
- // still exist in the list
- case TimerObj.STATE_DELETED:
- // Reset the remaining time and continue timer
- t.setState(TimerObj.STATE_RUNNING);
- t.mStartTime = Utils.getTimeNow() - (t.mOriginalLength - t.mTimeLeft);
- t.mView.start();
- updateTimerState(t, Timers.START_TIMER);
- Events.sendTimerEvent(R.string.action_start, R.string.label_deskclock);
- break;
- case TimerObj.STATE_TIMESUP:
- if (t.mDeleteAfterUse) {
- cancelTimerNotification(t.mTimerId);
- // Tell receiver the timer was deleted.
- // It will stop all activity related to the
- // timer
- t.setState(TimerObj.STATE_DELETED);
- updateTimerState(t, Timers.DELETE_TIMER);
- Events.sendTimerEvent(R.string.action_delete, R.string.label_deskclock);
- } else {
- t.setState(TimerObj.STATE_RESTART);
- t.mOriginalLength = t.mSetupLength;
- t.mTimeLeft = t.mSetupLength;
- t.mView.stop();
- t.mView.setTime(t.mTimeLeft, false);
- t.mView.set(t.mOriginalLength, t.mTimeLeft, false);
- updateTimerState(t, Timers.RESET_TIMER);
- cancelTimerNotification(t.mTimerId);
- Events.sendTimerEvent(R.string.action_reset, R.string.label_deskclock);
- }
- break;
- }
- setTimerViewFabIcon(t);
- }
- }
-
-
- private TimerObj getCurrentTimer() {
- if (mViewPager == null) {
- return null;
- }
- final int currPage = mViewPager.getCurrentItem();
- if (currPage < mAdapter.getCount()) {
- TimerObj o = mAdapter.getTimerAt(currPage);
- return o;
- } else {
- return null;
+ // If the timer creation view is visible, store the input for later restoration.
+ if (mCurrentView == mCreateTimerView) {
+ mTimerSetupState = mCreateTimerView.getState();
+ outState.putSerializable(KEY_TIMER_SETUP_STATE, mTimerSetupState);
}
}
@Override
public void setFabAppearance() {
- final DeskClock activity = (DeskClock) getActivity();
- if (mFab == null) {
+ if (mFab == null || getSelectedTab() != DeskClock.TIMER_TAB_INDEX) {
return;
}
- if (activity.getSelectedTab() != DeskClock.TIMER_TAB_INDEX) {
- mFab.setVisibility(View.VISIBLE);
+ if (mCurrentView == mTimersView) {
+ final Timer timer = getTimer();
+ if (timer == null) {
+ mFab.setVisibility(INVISIBLE);
+ return;
+ }
+
+ mFab.setVisibility(VISIBLE);
+ switch (timer.getState()) {
+ case RUNNING:
+ mFab.setImageResource(R.drawable.ic_pause_white_24dp);
+ mFab.setContentDescription(getString(R.string.timer_stop));
+ break;
+ case RESET:
+ case PAUSED:
+ mFab.setImageResource(R.drawable.ic_start_white_24dp);
+ mFab.setContentDescription(getString(R.string.timer_start));
+ break;
+ case EXPIRED:
+ mFab.setImageResource(R.drawable.ic_stop_white_24dp);
+ mFab.setContentDescription(getString(R.string.timer_stop));
+ break;
+ }
+
+ } else if (mCurrentView == mCreateTimerView) {
+ mFab.setVisibility(INVISIBLE);
+ }
+ }
+
+ @Override
+ public void onFabClick(View view) {
+ final Timer timer = getTimer();
+
+ // If no timer is currently showing a fab action is meaningless.
+ if (timer == null) {
return;
}
- if (mLastView == mTimerView) {
- setTimerViewFabIcon(getCurrentTimer());
- } else if (mSetupView != null) {
- mSetupView.registerStartButton(mFab);
- mFab.setImageResource(R.drawable.ic_fab_play);
- mFab.setContentDescription(getString(R.string.timer_start));
+ switch (timer.getState()) {
+ case RUNNING:
+ DataModel.getDataModel().pauseTimer(timer);
+ Events.sendTimerEvent(R.string.action_stop, R.string.label_deskclock);
+ break;
+ case PAUSED:
+ case RESET:
+ DataModel.getDataModel().startTimer(timer);
+ Events.sendTimerEvent(R.string.action_start, R.string.label_deskclock);
+ break;
+ case EXPIRED:
+ DataModel.getDataModel().resetOrDeleteTimer(timer, R.string.label_deskclock);
+ break;
}
}
@Override
public void setLeftRightButtonAppearance() {
- final DeskClock activity = (DeskClock) getActivity();
if (mLeftButton == null || mRightButton == null ||
- activity.getSelectedTab() != DeskClock.TIMER_TAB_INDEX) {
+ getSelectedTab() != DeskClock.TIMER_TAB_INDEX) {
return;
}
mLeftButton.setEnabled(true);
- mRightButton.setEnabled(true);
- mLeftButton.setVisibility(mLastView != mTimerView ? View.GONE : View.VISIBLE);
- mRightButton.setVisibility(mLastView != mTimerView ? View.GONE : View.VISIBLE);
mLeftButton.setImageResource(R.drawable.ic_delete);
mLeftButton.setContentDescription(getString(R.string.timer_delete));
+ mLeftButton.setVisibility(mCurrentView != mTimersView ? GONE : VISIBLE);
+
+ mRightButton.setEnabled(true);
mRightButton.setImageResource(R.drawable.ic_add_timer);
mRightButton.setContentDescription(getString(R.string.timer_add_timer));
- }
-
- @Override
- public void onRightButtonClick(View view) {
- // Respond to add another timer
- final AnimatorListenerAdapter adapter = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mSetupView.reset();
- mTimerView.setScaleX(1.0f); // Reset the scale for timer view
- goToSetUpView();
- }
- };
- createRotateAnimator(adapter, true).start();
+ mRightButton.setVisibility(mCurrentView != mTimersView ? GONE : VISIBLE);
}
@Override
public void onLeftButtonClick(View view) {
- // Respond to delete timer
- final TimerObj timer = getCurrentTimer();
+ final Timer timer = getTimer();
if (timer == null) {
- return; // Prevent NPE if user click delete faster than the fade animation
+ return;
}
- if (timer.mState == TimerObj.STATE_TIMESUP) {
- mNotificationManager.cancel(timer.mTimerId);
- }
- if (mAdapter.getCount() == 1) {
- final AnimatorListenerAdapter adapter = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mTimerView.setScaleX(1.0f); // Reset the scale for timer view
- deleteTimer(timer);
- }
- };
- createRotateAnimator(adapter, true).start();
+
+ if (mAdapter.getCount() > 1) {
+ animateTimerRemove(timer);
} else {
- if (USE_TRANSITION_FRAMEWORK) {
- TransitionManager.beginDelayedTransition(mContentView, mDeleteTransition);
- }
- deleteTimer(timer);
+ animateToView(mCreateTimerView, timer);
}
- }
- private void deleteTimer(TimerObj timer) {
- // Tell receiver the timer was deleted, it will stop all activity related to the
- // timer
- timer.setState(TimerObj.STATE_DELETED);
- updateTimerState(timer, Timers.DELETE_TIMER);
- Events.sendTimerEvent(R.string.action_delete, R.string.label_deskclock);
- highlightPageIndicator(mViewPager.getCurrentItem());
- // When deleting a negative timer (hidden fab), since deleting will not trigger
- // onResume(), in order to ensure the fab showing correctly, we need to manually
- // set fab appearance here.
- setFabAppearance();
- }
-
- private void highlightPageIndicator(int position) {
- final int count = mAdapter.getCount();
- if (count <= PAGINATION_DOTS_COUNT) {
- for (int i = 0; i < PAGINATION_DOTS_COUNT; i++) {
- if (count < 2 || i >= count) {
- mPageIndicators[i].setVisibility(View.GONE);
- } else {
- paintIndicator(i, position == i ? R.drawable.ic_swipe_circle_light :
- R.drawable.ic_swipe_circle_dark);
- }
- }
- } else {
- /**
- * If there are more than 4 timers, the top and/or bottom dot might need to show a
- * half fade, to indicate there are more timers in that direction.
- */
- final int aboveCount = position; // How many timers are above the current timer
- final int belowCount = count - position - 1; // How many timers are below
- if (aboveCount < PAGINATION_DOTS_COUNT - 1) {
- // There's enough room for the above timers, so top dot need not to fade
- for (int i = 0; i < aboveCount; i++) {
- paintIndicator(i, R.drawable.ic_swipe_circle_dark);
- }
- paintIndicator(position, R.drawable.ic_swipe_circle_light);
- for (int i = position + 1; i < PAGINATION_DOTS_COUNT - 1 ; i++) {
- paintIndicator(i, R.drawable.ic_swipe_circle_dark);
- }
- paintIndicator(PAGINATION_DOTS_COUNT - 1, R.drawable.ic_swipe_circle_bottom);
- } else {
- // There's not enough room for the above timers, top dot needs to fade
- paintIndicator(0, R.drawable.ic_swipe_circle_top);
- for (int i = 1; i < PAGINATION_DOTS_COUNT - 2; i++) {
- paintIndicator(i, R.drawable.ic_swipe_circle_dark);
- }
- // Determine which resource to use for the "second indicator" from the bottom.
- paintIndicator(PAGINATION_DOTS_COUNT - 2, belowCount == 0 ?
- R.drawable.ic_swipe_circle_dark : R.drawable.ic_swipe_circle_light);
- final int lastDotRes;
- if (belowCount == 0) {
- // The current timer is the last one
- lastDotRes = R.drawable.ic_swipe_circle_light;
- } else if (belowCount == 1) {
- // There's only one timer below the current
- lastDotRes = R.drawable.ic_swipe_circle_dark;
- } else {
- // There are more than one timer below, bottom dot needs to fade
- lastDotRes = R.drawable.ic_swipe_circle_bottom;
- }
- paintIndicator(PAGINATION_DOTS_COUNT - 1, lastDotRes);
- }
- }
- }
-
- private void paintIndicator(int position, int res) {
- mPageIndicators[position].setVisibility(View.VISIBLE);
- mPageIndicators[position].setImageResource(res);
+ view.announceForAccessibility(getActivity().getString(R.string.timer_deleted));
}
@Override
- public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
- if (prefs.equals(mPrefs)) {
- if (key.equals(Timers.REFRESH_UI_WITH_LATEST_DATA) && prefs.getBoolean(key, false)) {
- // Clear the flag forcing a refresh of the adapter to reflect external changes.
- mPrefs.edit().putBoolean(key, false).apply();
- mAdapter.populateTimersFromPref();
- mViewPager.setAdapter(mAdapter);
- if (mViewState != null) {
- final int currPage = mViewState.getInt(CURR_PAGE);
- mViewPager.setCurrentItem(currPage);
- highlightPageIndicator(currPage);
- } else {
- highlightPageIndicator(0);
- }
- setFabAppearance();
+ public void onRightButtonClick(View view) {
+ animateToView(mCreateTimerView, null);
+ }
+
+ /**
+ * Updates the state of the page indicators so they reflect the selected page in the context of
+ * all pages.
+ */
+ private void updatePageIndicators() {
+ final int page = mViewPager.getCurrentItem();
+ final int pageIndicatorCount = mPageIndicators.length;
+ final int pageCount = mAdapter.getCount();
+
+ final int[] states = computePageIndicatorStates(page, pageIndicatorCount, pageCount);
+ for (int i = 0; i < states.length; i++) {
+ final int state = states[i];
+ final ImageView pageIndicator = mPageIndicators[i];
+ if (state == 0) {
+ pageIndicator.setVisibility(GONE);
+ } else {
+ pageIndicator.setVisibility(VISIBLE);
+ pageIndicator.setImageResource(state);
}
}
}
- public void setLabel(TimerObj timer, String label) {
- timer.mLabel = label;
- updateTimerState(timer, Timers.TIMER_UPDATE, false);
- // Make sure the new label is visible.
- mAdapter.populateTimersFromPref();
+ /**
+ * @param page the selected page; value between 0 and {@code pageCount}
+ * @param pageIndicatorCount the number of indicators displaying the {@code page} location
+ * @param pageCount the number of pages that exist
+ * @return an array of length {@code pageIndicatorCount} specifying which image to display for
+ * each page indicator or 0 if the page indicator should be hidden
+ */
+ @VisibleForTesting
+ static int[] computePageIndicatorStates(int page, int pageIndicatorCount, int pageCount) {
+ // Compute the number of page indicators that will be visible.
+ final int rangeSize = Math.min(pageIndicatorCount, pageCount);
+
+ // Compute the inclusive range of pages to indicate centered around the selected page.
+ int rangeStart = page - (rangeSize / 2);
+ int rangeEnd = rangeStart + rangeSize - 1;
+
+ // Clamp the range of pages if they extend beyond the last page.
+ if (rangeEnd >= pageCount) {
+ rangeEnd = pageCount - 1;
+ rangeStart = rangeEnd - rangeSize + 1;
+ }
+
+ // Clamp the range of pages if they extend beyond the first page.
+ if (rangeStart < 0) {
+ rangeStart = 0;
+ rangeEnd = rangeSize - 1;
+ }
+
+ // Build the result with all page indicators initially hidden.
+ final int[] states = new int[pageIndicatorCount];
+ Arrays.fill(states, 0);
+
+ // If 0 or 1 total pages exist, all page indicators must remain hidden.
+ if (rangeSize < 2) {
+ return states;
+ }
+
+ // Initialize the visible page indicators to be dark.
+ Arrays.fill(states, 0, rangeSize, R.drawable.ic_swipe_circle_dark);
+
+ // If more pages exist before the first page indicator, make it a fade-in gradient.
+ if (rangeStart > 0) {
+ states[0] = R.drawable.ic_swipe_circle_top;
+ }
+
+ // If more pages exist after the last page indicator, make it a fade-out gradient.
+ if (rangeEnd < pageCount - 1) {
+ states[rangeSize - 1] = R.drawable.ic_swipe_circle_bottom;
+ }
+
+ // Set the indicator of the selected page to be light.
+ states[page - rangeStart] = R.drawable.ic_swipe_circle_light;
+
+ return states;
}
- public void onPlusOneButtonPressed(TimerObj t) {
- switch (t.mState) {
- case TimerObj.STATE_RUNNING:
- t.addTime(TimerObj.MINUTE_IN_MILLIS);
- long timeLeft = t.updateTimeLeft(false);
- t.mView.setTime(timeLeft, false);
- t.mView.setLength(timeLeft);
- mAdapter.notifyDataSetChanged();
- updateTimerState(t, Timers.TIMER_UPDATE);
+ /**
+ * Display the view that creates a new timer.
+ */
+ private void showCreateTimerView() {
+ // Stop animating the timers.
+ stopUpdatingTime();
- Events.sendTimerEvent(R.string.action_add_minute, R.string.label_deskclock);
- break;
- case TimerObj.STATE_STOPPED:
- t.setState(TimerObj.STATE_RESTART);
- t.mTimeLeft = t.mSetupLength;
- t.mOriginalLength = t.mSetupLength;
- t.mView.stop();
- t.mView.setTime(t.mTimeLeft, false);
- t.mView.set(t.mOriginalLength, t.mTimeLeft, false);
- updateTimerState(t, Timers.RESET_TIMER);
+ // If no timers yet exist, the user is forced to create the first one.
+ mCancelCreateButton.setVisibility(hasTimers() ? VISIBLE : INVISIBLE);
+ mCancelCreateButton.setEnabled(true);
- Events.sendTimerEvent(R.string.action_reset, R.string.label_deskclock);
- break;
- case TimerObj.STATE_TIMESUP:
- // +1 min when the time is up will restart the timer with 1 minute left.
- t.setState(TimerObj.STATE_RUNNING);
- t.mStartTime = Utils.getTimeNow();
- t.mTimeLeft = t.mOriginalLength = TimerObj.MINUTE_IN_MILLIS;
- t.mView.setTime(t.mTimeLeft, false);
- t.mView.set(t.mOriginalLength, t.mTimeLeft, true);
- t.mView.start();
- updateTimerState(t, Timers.RESET_TIMER);
- Events.sendTimerEvent(R.string.action_add_minute, R.string.label_deskclock);
+ // Show the creation view; hide the timer view.
+ mTimersView.setVisibility(GONE);
+ mCreateTimerView.setVisibility(VISIBLE);
- updateTimerState(t, Timers.START_TIMER);
- cancelTimerNotification(t.mTimerId);
- break;
- }
- // This will change status of the timer, so update fab
+ // Record the fact that the create view is visible.
+ mCurrentView = mCreateTimerView;
+
+ // Update the fab and buttons.
+ setLeftRightButtonAppearance();
setFabAppearance();
}
- private void cancelTimerNotification(int timerId) {
- mNotificationManager.cancel(timerId);
+ /**
+ * Display the view that lists all existing timers.
+ */
+ private void showTimersView() {
+ // Show the timer view; hide the creation view.
+ mTimersView.setVisibility(VISIBLE);
+ mCreateTimerView.setVisibility(GONE);
+
+ // Record the fact that the create view is visible.
+ mCurrentView = mTimersView;
+
+ // Update the fab and buttons.
+ setLeftRightButtonAppearance();
+ setFabAppearance();
+
+ // Start animating the timers.
+ startUpdatingTime();
}
-}
+
+ /**
+ * @param timerToRemove the timer to be removed during the animation
+ */
+ private void animateTimerRemove(final Timer timerToRemove) {
+ final Animator fadeOut = ObjectAnimator.ofFloat(mViewPager, ALPHA, 1, 0);
+ fadeOut.setDuration(mShortAnimationDuration);
+ fadeOut.setInterpolator(new DecelerateInterpolator());
+ fadeOut.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ DataModel.getDataModel().removeTimer(timerToRemove);
+ Events.sendTimerEvent(R.string.action_delete, R.string.label_deskclock);
+ }
+ });
+
+ final Animator fadeIn = ObjectAnimator.ofFloat(mViewPager, ALPHA, 0, 1);
+ fadeIn.setDuration(mShortAnimationDuration);
+ fadeIn.setInterpolator(new AccelerateInterpolator());
+
+ final AnimatorSet animatorSet = new AnimatorSet();
+ animatorSet.play(fadeOut).before(fadeIn);
+ animatorSet.start();
+ }
+
+ /**
+ * @param toView one of {@link #mTimersView} or {@link #mCreateTimerView}
+ * @param timerToRemove the timer to be removed during the animation; {@code null} if no timer
+ * should be removed
+ */
+ private void animateToView(View toView, final Timer timerToRemove) {
+ if (mCurrentView == toView) {
+ throw new IllegalStateException("toView is already the current view");
+ }
+
+ final boolean toTimers = toView == mTimersView;
+
+ // Avoid double-taps by enabling/disabling the set of buttons active on the new view.
+ mLeftButton.setEnabled(toTimers);
+ mRightButton.setEnabled(toTimers);
+ mCancelCreateButton.setEnabled(!toTimers);
+
+ final Animator rotateFrom = ObjectAnimator.ofFloat(mCurrentView, SCALE_X, 1, 0);
+ rotateFrom.setDuration(mShortAnimationDuration);
+ rotateFrom.setInterpolator(new DecelerateInterpolator());
+ rotateFrom.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (timerToRemove != null) {
+ DataModel.getDataModel().removeTimer(timerToRemove);
+ Events.sendTimerEvent(R.string.action_delete, R.string.label_deskclock);
+ }
+
+ mCurrentView.setScaleX(1);
+ if (toTimers) {
+ showTimersView();
+ } else {
+ showCreateTimerView();
+ }
+ }
+ });
+
+ final Animator rotateTo = ObjectAnimator.ofFloat(toView, SCALE_X, 0, 1);
+ rotateTo.setDuration(mShortAnimationDuration);
+ rotateTo.setInterpolator(new AccelerateInterpolator());
+
+ final float preScale = toTimers ? 0 : 1;
+ final float postScale = toTimers ? 1 : 0;
+ final Animator fabAnimator = getScaleAnimator(mFab, preScale, postScale);
+ final Animator leftButtonAnimator = getScaleAnimator(mLeftButton, preScale, postScale);
+ final Animator rightButtonAnimator = getScaleAnimator(mRightButton, preScale, postScale);
+
+ final AnimatorSet buttons = new AnimatorSet();
+ buttons.setDuration(toTimers ? mMediumAnimationDuration : mShortAnimationDuration);
+ buttons.play(leftButtonAnimator).with(rightButtonAnimator).with(fabAnimator);
+ buttons.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mLeftButton.setVisibility(toTimers ? VISIBLE : INVISIBLE);
+ mRightButton.setVisibility(toTimers ? VISIBLE : INVISIBLE);
+
+ mFab.setScaleX(1);
+ mFab.setScaleY(1);
+ mLeftButton.setScaleX(1);
+ mLeftButton.setScaleY(1);
+ mRightButton.setScaleX(1);
+ mRightButton.setScaleY(1);
+ }
+ });
+
+ final AnimatorSet animatorSet = new AnimatorSet();
+ animatorSet.play(rotateFrom).before(rotateTo).with(buttons);
+ animatorSet.start();
+ }
+
+ private boolean hasTimers() {
+ return mAdapter.getCount() > 0;
+ }
+
+ private Timer getTimer() {
+ if (mViewPager == null) {
+ return null;
+ }
+
+ return mAdapter.getCount() == 0 ? null : mAdapter.getTimer(mViewPager.getCurrentItem());
+ }
+
+ private void startUpdatingTime() {
+ // Ensure only one copy of the runnable is ever scheduled by first stopping updates.
+ stopUpdatingTime();
+ mViewPager.post(mTimeUpdateRunnable);
+ }
+
+ private void stopUpdatingTime() {
+ mViewPager.removeCallbacks(mTimeUpdateRunnable);
+ }
+
+ /**
+ * Periodically refreshes the state of each timer.
+ */
+ private class TimeUpdateRunnable implements Runnable {
+ @Override
+ public void run() {
+ final long startTime = SystemClock.elapsedRealtime();
+ // If no timers require continuous updates, avoid scheduling the next update.
+ if (!mAdapter.updateTime()) {
+ return;
+ }
+ final long endTime = SystemClock.elapsedRealtime();
+
+ // Try to maintain a consistent period of time between redraws.
+ final long delay = Math.max(0, startTime + 20 - endTime);
+ mTimersView.postDelayed(this, delay);
+ }
+ }
+
+ /**
+ * Update the page indicators and fab in response to a new timer becoming visible.
+ */
+ private class TimerPageChangeListener extends ViewPager.SimpleOnPageChangeListener {
+ @Override
+ public void onPageSelected(int position) {
+ updatePageIndicators();
+ setFabAppearance();
+
+ // Showing a new timer page may introduce a timer requiring continuous updates.
+ startUpdatingTime();
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ // Teasing a neighboring timer may introduce a timer requiring continuous updates.
+ if (state == ViewPager.SCROLL_STATE_DRAGGING) {
+ startUpdatingTime();
+ }
+ }
+ }
+
+ /**
+ * Update the page indicators in response to timers being added or removed.
+ * Update the fab in response to the visible timer changing.
+ */
+ private class TimerWatcher implements TimerListener {
+ @Override
+ public void timerAdded(Timer timer) {
+ // The user interface should not be updated unless the fragment is resumed. It will be
+ // refreshed during onResume later if it is not currently resumed.
+ if (!isResumed()) {
+ return;
+ }
+
+ updatePageIndicators();
+ }
+
+ @Override
+ public void timerUpdated(Timer before, Timer after) {
+ // The user interface should not be updated unless the fragment is resumed. It will be
+ // refreshed during onResume later if it is not currently resumed.
+ if (!isResumed()) {
+ return;
+ }
+
+ // If the timer started, animate the timers.
+ if (before.isReset() && !after.isReset()) {
+ startUpdatingTime();
+ }
+
+ // Fetch the index of the change.
+ final int index = DataModel.getDataModel().getTimers().indexOf(after);
+
+ // If the timer just expired but is not displayed, display it now.
+ if (!before.isExpired() && after.isExpired() && index != mViewPager.getCurrentItem()) {
+ mViewPager.setCurrentItem(index, true);
+
+ } else if (index == mViewPager.getCurrentItem()) {
+ // If the visible timer changed, update the fab to match its new state.
+ setFabAppearance();
+ }
+ }
+
+ @Override
+ public void timerRemoved(Timer timer) {
+ // The user interface should not be updated unless the fragment is resumed. It will be
+ // refreshed during onResume later if it is not currently resumed.
+ if (!isResumed()) {
+ return;
+ }
+
+ updatePageIndicators();
+ }
+ }
+
+ /**
+ * Clicking the play icon on the timer creation page creates a new timer and returns to the
+ * timers list.
+ */
+ private class CreateListener implements OnClickListener {
+ @Override
+ public void onClick(View v) {
+ // Create the new timer.
+ final long length = mCreateTimerView.getTimeInMillis();
+ final Timer timer = DataModel.getDataModel().addTimer(length, "", false);
+ Events.sendTimerEvent(R.string.action_create, R.string.label_deskclock);
+
+ // Start the new timer.
+ DataModel.getDataModel().startTimer(timer);
+ Events.sendTimerEvent(R.string.action_start, R.string.label_deskclock);
+
+ // Reset the state of the create view.
+ mCreateTimerView.reset();
+
+ // Display the freshly created timer view.
+ mViewPager.setCurrentItem(0);
+
+ // Return to the list of timers.
+ animateToView(mTimersView, null);
+ }
+ }
+
+ /**
+ * Clicking the X icon on the timer creation page returns to the timers list.
+ */
+ private class CancelCreateListener implements OnClickListener {
+ @Override
+ public void onClick(View view) {
+ // Reset the state of the create view.
+ mCreateTimerView.reset();
+
+ if (hasTimers()) {
+ animateToView(mTimersView, null);
+ }
+
+ view.announceForAccessibility(getActivity().getString(R.string.timer_canceled));
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/timer/TimerFragmentAdapter.java b/src/com/android/deskclock/timer/TimerFragmentAdapter.java
deleted file mode 100644
index c5244bd..0000000
--- a/src/com/android/deskclock/timer/TimerFragmentAdapter.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2014 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.timer;
-
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.content.SharedPreferences;
-import android.support.v4.view.PagerAdapter;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-
-public class TimerFragmentAdapter extends FragmentStatePagerAdapter2 {
-
- private final ArrayList<TimerObj> mTimerList = new ArrayList<TimerObj>();
- private final SharedPreferences mSharedPrefs;
-
- public TimerFragmentAdapter(FragmentManager fm, SharedPreferences sharedPreferences) {
- super(fm);
- mSharedPrefs = sharedPreferences;
- }
-
- @Override
- public int getItemPosition(Object object) {
- // Force return NONE so that the adapter always assumes the item position has changed
- return PagerAdapter.POSITION_NONE;
- }
-
- @Override
- public int getCount() {
- return mTimerList.size();
- }
-
- @Override
- public Fragment getItem(int position) {
- return TimerItemFragment.newInstance(mTimerList.get(position));
- }
-
- public void addTimer(TimerObj timer) {
- // Newly created timer should always show on the top of the list
- mTimerList.add(0, timer);
- notifyDataSetChanged();
- }
-
- public TimerObj getTimerAt(int position) {
- return mTimerList.get(position);
- }
-
- public void saveTimersToSharedPrefs() {
- TimerObj.putTimersInSharedPrefs(mSharedPrefs, mTimerList);
- }
-
- public void populateTimersFromPref() {
- mTimerList.clear();
- TimerObj.getTimersFromSharedPrefs(mSharedPrefs, mTimerList);
- Collections.sort(mTimerList, new Comparator<TimerObj>() {
- @Override
- public int compare(TimerObj o1, TimerObj o2) {
- return (o2.mTimerId < o1.mTimerId) ? -1 : 1;
- }
- });
-
- notifyDataSetChanged();
- }
-
- public void deleteTimer(int id) {
- for (int i = 0; i < mTimerList.size(); i++) {
- TimerObj timer = mTimerList.get(i);
- if (timer.mTimerId == id) {
- if (timer.mView != null) {
- timer.mView.stop();
- }
- timer.deleteFromSharedPref(mSharedPrefs);
- mTimerList.remove(i);
- break;
- }
- }
-
- notifyDataSetChanged();
- return;
- }
-
- // Return position of the timer with the given timerId. If the timer is not in the list,
- // return 0 so we get the position of the newest timer.
- public int getTimerPosition(int id) {
- for (int i = 0; i < mTimerList.size(); i++) {
- TimerObj timer = mTimerList.get(i);
- if (timer.mTimerId == id) {
- return i;
- }
- }
- return 0;
- }
-}
diff --git a/src/com/android/deskclock/timer/TimerFullScreenFragment.java b/src/com/android/deskclock/timer/TimerFullScreenFragment.java
deleted file mode 100644
index 24b5854..0000000
--- a/src/com/android/deskclock/timer/TimerFullScreenFragment.java
+++ /dev/null
@@ -1,923 +0,0 @@
-/*
- * Copyright (C) 2012 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.timer;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
-import android.app.Fragment;
-import android.app.FragmentTransaction;
-import android.app.NotificationManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.content.res.Resources;
-import android.graphics.Color;
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.support.v4.view.animation.PathInterpolatorCompat;
-import android.text.TextUtils;
-import android.text.format.DateUtils;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.ImageButton;
-import android.widget.TextView;
-
-import com.android.deskclock.CircleButtonsLayout;
-import com.android.deskclock.DeskClock;
-import com.android.deskclock.DeskClockFragment;
-import com.android.deskclock.LabelDialogFragment;
-import com.android.deskclock.LogUtils;
-import com.android.deskclock.R;
-import com.android.deskclock.TimerSetupView;
-import com.android.deskclock.Utils;
-import com.android.deskclock.events.Events;
-import com.android.deskclock.widget.CircleView;
-import com.android.deskclock.widget.sgv.GridAdapter;
-import com.android.deskclock.widget.sgv.StaggeredGridView;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
-
-// TODO: This class is renamed from TimerFragment to TimerFullScreenFragment with no change. It
-// is responsible for the timer list in full screen timer alert and should be deprecated shortly.
-public class TimerFullScreenFragment extends DeskClockFragment
- implements OnClickListener, OnSharedPreferenceChangeListener {
-
- private static final String TAG = "TimerFragment1";
- private static final String KEY_ENTRY_STATE = "entry_state";
- public static final String GOTO_SETUP_VIEW = "deskclock.timers.gotosetup";
-
- private Bundle mViewState;
- private StaggeredGridView mTimersList;
- private View mTimersListPage;
- private int mColumnCount;
- private ImageButton mFab;
- private TimerSetupView mTimerSetup;
- private TimersListAdapter mAdapter;
- private boolean mTicking = false;
- private SharedPreferences mPrefs;
- private NotificationManager mNotificationManager;
- private OnEmptyListListener mOnEmptyListListener;
- private View mLastVisibleView = null; // used to decide if to set the view or animate to it.
-
- class ClickAction {
- public static final int ACTION_STOP = 1;
- public static final int ACTION_PLUS_ONE = 2;
- public static final int ACTION_DELETE = 3;
-
- public int mAction;
- public TimerObj mTimer;
-
- public ClickAction(int action, TimerObj t) {
- mAction = action;
- mTimer = t;
- }
- }
-
- // Container Activity that requests TIMESUP_MODE must implement this interface
- public interface OnEmptyListListener {
- void onEmptyList();
- void onListChanged();
- }
-
- TimersListAdapter createAdapter(Context context) {
- if (mOnEmptyListListener == null) {
- return new TimersListAdapter(context);
- } else {
- return new TimesUpListAdapter(context);
- }
- }
-
- private class TimersListAdapter extends GridAdapter {
-
- protected final ArrayList<TimerObj> mTimers = new ArrayList<>();
- private final LayoutInflater mLayoutInflater;
-
- public TimersListAdapter(Context context) {
- mLayoutInflater = LayoutInflater.from(context);
- }
-
- @Override
- public int getCount() {
- return mTimers.size();
- }
-
- @Override
- public boolean hasStableIds() {
- return true;
- }
-
- @Override
- public TimerObj getItem(int p) {
- return mTimers.get(p);
- }
-
- @Override
- public long getItemId(int p) {
- if (p >= 0 && p < mTimers.size()) {
- return mTimers.get(p).mTimerId;
- }
- return 0;
- }
-
- protected int findTimerPositionById(int id) {
- for (int i = 0; i < mTimers.size(); i++) {
- TimerObj t = mTimers.get(i);
- if (t.mTimerId == id) {
- return i;
- }
- }
- return -1;
- }
-
- public void removeTimer(TimerObj timerObj) {
- int position = findTimerPositionById(timerObj.mTimerId);
- if (position >= 0) {
- mTimers.remove(position);
- notifyDataSetChanged();
- }
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- final TimerListItem v = (TimerListItem) mLayoutInflater.inflate(
- R.layout.timer_list_item, parent, false /* attachToRoot */);
- final TimerObj o = getItem(position);
- o.mView = v;
- long timeLeft = o.updateTimeLeft(false);
- boolean drawRed = o.mState != TimerObj.STATE_RESTART;
- v.set(o.mOriginalLength, timeLeft, drawRed);
- v.setTime(timeLeft, true);
- switch (o.mState) {
- case TimerObj.STATE_RUNNING:
- v.start();
- break;
- case TimerObj.STATE_TIMESUP:
- v.timesUp();
- break;
- default:
- break;
- }
-
- CircleButtonsLayout circleLayout =
- (CircleButtonsLayout) v.findViewById(R.id.timer_circle);
- circleLayout.setCircleTimerViewIds(R.id.timer_time, R.id.reset_add, R.id.timer_label);
-
- ImageButton resetAddButton = (ImageButton) v.findViewById(R.id.reset_add);
- resetAddButton.setTag(new ClickAction(ClickAction.ACTION_PLUS_ONE, o));
- v.setResetAddButton(true, TimerFullScreenFragment.this);
-
- TextView label = (TextView) v.findViewById(R.id.timer_label);
- label.setText(o.mLabel);
- if (getActivity() instanceof DeskClock) {
- label.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onLabelPressed(o);
- }
- });
- } else if (TextUtils.isEmpty(o.mLabel)) {
- label.setVisibility(View.INVISIBLE);
- }
-
- return v;
- }
-
- @Override
- public int getItemColumnSpan(Object item, int position) {
- // This returns the width for a specified position. If we only have one item, have it
- // span all columns so that it's centered. Otherwise, all timers should just span one.
- if (getCount() == 1) {
- return mColumnCount;
- } else {
- return 1;
- }
- }
-
- public void addTimer(TimerObj t) {
- mTimers.add(0, t);
- sort();
- }
-
- public void onSaveInstanceState(Bundle outState) {
- TimerObj.putTimersInSharedPrefs(mPrefs, mTimers);
- }
-
- public void onRestoreInstanceState(Bundle outState) {
- TimerObj.getTimersFromSharedPrefs(mPrefs, mTimers);
- sort();
- }
-
- public void saveGlobalState() {
- TimerObj.putTimersInSharedPrefs(mPrefs, mTimers);
- }
-
- public void sort() {
- if (getCount() > 0) {
- Collections.sort(mTimers, mTimersCompare);
- notifyDataSetChanged();
- }
- }
-
- private final Comparator<TimerObj> mTimersCompare = new Comparator<TimerObj>() {
- static final int BUZZING = 0;
- static final int IN_USE = 1;
- static final int NOT_USED = 2;
-
- protected int getSection(TimerObj timerObj) {
- switch (timerObj.mState) {
- case TimerObj.STATE_TIMESUP:
- return BUZZING;
- case TimerObj.STATE_RUNNING:
- case TimerObj.STATE_STOPPED:
- return IN_USE;
- default:
- return NOT_USED;
- }
- }
-
- @Override
- public int compare(TimerObj o1, TimerObj o2) {
- int section1 = getSection(o1);
- int section2 = getSection(o2);
- if (section1 != section2) {
- return (section1 < section2) ? -1 : 1;
- } else if (section1 == BUZZING || section1 == IN_USE) {
- return (o1.mTimeLeft < o2.mTimeLeft) ? -1 : 1;
- } else {
- return (o1.mSetupLength < o2.mSetupLength) ? -1 : 1;
- }
- }
- };
- }
-
- private class TimesUpListAdapter extends TimersListAdapter {
-
- public TimesUpListAdapter(Context context) {
- super(context);
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- // This adapter has a data subset and never updates entire database
- // Individual timers are updated in button handlers.
- }
-
- @Override
- public void saveGlobalState() {
- // This adapter has a data subset and never updates entire database
- // Individual timers are updated in button handlers.
- }
-
- @Override
- public void onRestoreInstanceState(Bundle outState) {
- // This adapter loads a subset
- TimerObj.getTimersFromSharedPrefs(mPrefs, mTimers, TimerObj.STATE_TIMESUP);
-
- if (getCount() == 0) {
- mOnEmptyListListener.onEmptyList();
- } else {
- Collections.sort(mTimers, new Comparator<TimerObj>() {
- @Override
- public int compare(TimerObj o1, TimerObj o2) {
- return (o1.mTimeLeft < o2.mTimeLeft) ? -1 : 1;
- }
- });
- }
- }
- }
-
- private final Runnable mClockTick = new Runnable() {
- boolean mVisible = true;
- final static int TIME_PERIOD_MS = 1000;
- final static int SPLIT = TIME_PERIOD_MS / 2;
-
- @Override
- public void run() {
- // Setup for blinking
- boolean visible = Utils.getTimeNow() % TIME_PERIOD_MS < SPLIT;
- boolean toggle = mVisible != visible;
- mVisible = visible;
- for (int i = 0; i < mAdapter.getCount(); i++) {
- TimerObj t = mAdapter.getItem(i);
- if (t.mState == TimerObj.STATE_RUNNING || t.mState == TimerObj.STATE_TIMESUP) {
- long timeLeft = t.updateTimeLeft(false);
- if (t.mView != null) {
- t.mView.setTime(timeLeft, false);
- }
- }
- if (t.mTimeLeft <= 0 && t.mState != TimerObj.STATE_RESTART) {
- t.setState(TimerObj.STATE_TIMESUP);
- if (t.mView != null) {
- t.mView.timesUp();
- }
- }
-
- // The blinking
- if (toggle && t.mView != null) {
- if (t.mState == TimerObj.STATE_TIMESUP) {
- t.mView.setCircleBlink(mVisible);
- }
- if (t.mState == TimerObj.STATE_STOPPED) {
- t.mView.setTextBlink(mVisible);
- }
- }
- }
- mTimersList.postDelayed(mClockTick, 20);
- }
- };
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- // Cache instance data and consume in first call to setupPage()
- if (savedInstanceState != null) {
- mViewState = savedInstanceState;
- }
-
- super.onCreate(savedInstanceState);
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // Inflate the layout for this fragment
- View v = inflater.inflate(R.layout.timer_full_screen_fragment, container, false);
-
- // Handle arguments from parent
- Bundle bundle = getArguments();
- if (bundle != null && bundle.containsKey(Timers.TIMESUP_MODE)) {
- if (bundle.getBoolean(Timers.TIMESUP_MODE, false)) {
- try {
- mOnEmptyListListener = (OnEmptyListListener) getActivity();
- } catch (ClassCastException e) {
- Log.wtf(TAG, getActivity().toString() + " must implement OnEmptyListListener");
- }
- }
- }
-
- mFab = (ImageButton) v.findViewById(R.id.fab);
- mTimersList = (StaggeredGridView) v.findViewById(R.id.timers_list);
- // For tablets in landscape, the count will be 2. All else will be 1.
- mColumnCount = getResources().getInteger(R.integer.timer_column_count);
- mTimersList.setColumnCount(mColumnCount);
- // Set this to true; otherwise adding new views to the end of the list won't cause
- // everything above it to be filled in correctly.
- mTimersList.setGuardAgainstJaggedEdges(true);
-
- mTimersListPage = v.findViewById(R.id.timers_list_page);
- mTimerSetup = (TimerSetupView) v.findViewById(R.id.timer_setup);
-
- mPrefs = Utils.getDefaultSharedPreferences(getActivity());
- mNotificationManager = (NotificationManager)
- getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
-
- return v;
- }
-
- @Override
- public void onDestroyView() {
- mViewState = new Bundle();
- saveViewState(mViewState);
- super.onDestroyView();
- }
-
- @Override
- public void onResume() {
- Intent newIntent = null;
-
- if (getActivity() instanceof DeskClock) {
- DeskClock activity = (DeskClock) getActivity();
- activity.registerPageChangedListener(this);
- newIntent = activity.getIntent();
- }
- super.onResume();
- mPrefs.registerOnSharedPreferenceChangeListener(this);
-
- mAdapter = createAdapter(getActivity());
- mAdapter.onRestoreInstanceState(null);
-
- LayoutParams params;
- float dividerHeight = getResources().getDimension(R.dimen.timer_divider_height);
- if (getActivity() instanceof DeskClock) {
- // If this is a DeskClock fragment (i.e. not a FullScreenTimerAlert), add a footer to
- // the bottom of the list so that it can scroll underneath the bottom button bar.
- // StaggeredGridView doesn't support a footer view, but GridAdapter does, so this
- // can't happen until the Adapter itself is instantiated.
- View footerView = getActivity().getLayoutInflater().inflate(
- R.layout.blank_footer_view, mTimersList, false);
- params = footerView.getLayoutParams();
- params.height -= dividerHeight;
- footerView.setLayoutParams(params);
- mAdapter.setFooterView(footerView);
- }
-
- if (mPrefs.getBoolean(Timers.REFRESH_UI_WITH_LATEST_DATA, false)) {
- // Clear the flag indicating the adapter is out of sync with the database.
- mPrefs.edit().putBoolean(Timers.REFRESH_UI_WITH_LATEST_DATA, false).apply();
- }
-
- mTimersList.setAdapter(mAdapter);
- setTimerListPosition(mAdapter.getCount());
-
- mLastVisibleView = null; // Force a non animation setting of the view
- setPage();
- // View was hidden in onPause, make sure it is visible now.
- View v = getView();
- if (v != null) {
- getView().setVisibility(View.VISIBLE);
- }
-
- if (newIntent != null) {
- processIntent(newIntent);
- }
-
- mFab.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- final Animator revealAnimator = getRevealAnimator(mFab, Color.WHITE);
- revealAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- updateAllTimesUpTimers();
- }
- });
- revealAnimator.start();
- }
- });
- }
-
- private void setTimerListPosition(int numTimers) {
- final LayoutParams timerListParams = mTimersList.getLayoutParams();
- if (numTimers <= 1) {
- // Set a fixed height so we can center it
- final Resources resources = getResources();
- timerListParams.height = (int) resources.getDimension(R.dimen.circle_size)
- + (int) resources.getDimension(R.dimen.timer_list_padding_bottom);
-
- // Disable scrolling
- mTimersList.setOnTouchListener(new View.OnTouchListener() {
- public boolean onTouch(View v, MotionEvent event) {
- return (event.getAction() == MotionEvent.ACTION_MOVE);
- }
- });
- } else {
- timerListParams.height = LayoutParams.MATCH_PARENT;
- mTimersList.setOnTouchListener(null);
- }
- }
-
- private Animator getRevealAnimator(View source, int revealColor) {
- final ViewGroup containerView = (ViewGroup) source.getRootView()
- .findViewById(android.R.id.content);
-
- final Rect sourceBounds = new Rect(0, 0, source.getHeight(), source.getWidth());
- containerView.offsetDescendantRectToMyCoords(source, sourceBounds);
-
- final int centerX = sourceBounds.centerX();
- final int centerY = sourceBounds.centerY();
-
- final int xMax = Math.max(centerX, containerView.getWidth() - centerX);
- final int yMax = Math.max(centerY, containerView.getHeight() - centerY);
-
- final float startRadius = Math.max(sourceBounds.width(), sourceBounds.height()) / 2.0f;
- final float endRadius = (float) Math.sqrt(xMax * xMax + yMax * yMax);
-
- final CircleView revealView = new CircleView(source.getContext())
- .setCenterX(centerX)
- .setCenterY(centerY)
- .setFillColor(revealColor);
- containerView.addView(revealView);
-
- final Animator revealAnimator = ObjectAnimator.ofFloat(
- revealView, CircleView.RADIUS, startRadius, endRadius);
- revealAnimator.setInterpolator(PathInterpolatorCompat.create(0.0f, 0.0f, 0.2f, 1.0f));
-
- final ValueAnimator fadeAnimator = ObjectAnimator.ofFloat(revealView, View.ALPHA, 0.0f);
- fadeAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- containerView.removeView(revealView);
- }
- });
-
- final AnimatorSet animatorSet = new AnimatorSet();
- animatorSet.setDuration(TimerFragment.ANIMATION_TIME_MILLIS);
- animatorSet.playSequentially(revealAnimator, fadeAnimator);
-
- return revealAnimator;
- }
-
- @Override
- public void onPause() {
- if (getActivity() instanceof DeskClock) {
- ((DeskClock) getActivity()).unregisterPageChangedListener(this);
- }
- super.onPause();
- stopClockTicks();
- if (mAdapter != null) {
- mAdapter.saveGlobalState();
- }
- mPrefs.unregisterOnSharedPreferenceChangeListener(this);
- // This is called because the lock screen was activated, the window stay
- // active under it and when we unlock the screen, we see the old time for
- // a fraction of a second.
- View v = getView();
- if (v != null) {
- v.setVisibility(View.INVISIBLE);
- }
- }
-
- @Override
- public void onPageChanged(int page) {
- if (page == DeskClock.TIMER_TAB_INDEX && mAdapter != null) {
- mAdapter.sort();
- }
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- if (mAdapter != null) {
- mAdapter.onSaveInstanceState(outState);
- }
- if (mTimerSetup != null) {
- saveViewState(outState);
- } else if (mViewState != null) {
- outState.putAll(mViewState);
- }
- }
-
- private void saveViewState(Bundle outState) {
- mTimerSetup.saveEntryState(outState, KEY_ENTRY_STATE);
- }
-
- public void setPage() {
- boolean switchToSetupView;
- if (mViewState != null) {
- switchToSetupView = false;
- mTimerSetup.restoreEntryState(mViewState, KEY_ENTRY_STATE);
- mViewState = null;
- } else {
- switchToSetupView = mAdapter.getCount() == 0;
- }
- if (switchToSetupView) {
- gotoSetupView();
- } else {
- gotoTimersView();
- }
- }
-
- private void resetTimer(TimerObj t) {
- t.setState(TimerObj.STATE_RESTART);
- t.mTimeLeft = t.mOriginalLength = t.mSetupLength;
- // when multiple timers are firing, some timers will be off-screen and they will not
- // have Fragment instances unless user scrolls down further. t.mView is null in this case.
- if (t.mView != null) {
- t.mView.stop();
- t.mView.setTime(t.mTimeLeft, false);
- t.mView.set(t.mOriginalLength, t.mTimeLeft, false);
- }
- updateTimersState(t, Timers.RESET_TIMER);
- Events.sendTimerEvent(R.string.action_reset, R.string.label_deskclock);
- }
-
- public void updateAllTimesUpTimers() {
- boolean notifyChange = false;
- // To avoid race conditions where a timer was dismissed and it is still in the timers list
- // and can be picked again, create a temporary list of timers to be removed first and
- // then removed them one by one
- LinkedList<TimerObj> timesupTimers = new LinkedList<>();
- for (int i = 0; i < mAdapter.getCount(); i++) {
- TimerObj timerObj = mAdapter.getItem(i);
- if (timerObj.mState == TimerObj.STATE_TIMESUP) {
- timesupTimers.addFirst(timerObj);
- notifyChange = true;
- }
- }
-
- while (timesupTimers.size() > 0) {
- final TimerObj t = timesupTimers.remove();
- onStopButtonPressed(t);
- }
-
- if (notifyChange) {
- mPrefs.edit().putBoolean(Timers.REFRESH_UI_WITH_LATEST_DATA, true).apply();
- }
- }
-
- private void gotoSetupView() {
- if (mLastVisibleView == null || mLastVisibleView.getId() == R.id.timer_setup) {
- mTimerSetup.setVisibility(View.VISIBLE);
- mTimerSetup.setScaleX(1f);
- mTimersListPage.setVisibility(View.GONE);
- } else {
- // Animate
- ObjectAnimator a = ObjectAnimator.ofFloat(mTimersListPage, View.SCALE_X, 1f, 0f);
- a.setInterpolator(new AccelerateInterpolator());
- a.setDuration(125);
- a.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mTimersListPage.setVisibility(View.GONE);
- mTimerSetup.setScaleX(0);
- mTimerSetup.setVisibility(View.VISIBLE);
- ObjectAnimator b = ObjectAnimator.ofFloat(mTimerSetup, View.SCALE_X, 0f, 1f);
- b.setInterpolator(new DecelerateInterpolator());
- b.setDuration(225);
- b.start();
- }
- });
- a.start();
-
- }
- stopClockTicks();
- mTimerSetup.updateDeleteButtonAndDivider();
- mLastVisibleView = mTimerSetup;
- }
-
- private void gotoTimersView() {
- if (mLastVisibleView == null || mLastVisibleView.getId() == R.id.timers_list_page) {
- mTimerSetup.setVisibility(View.GONE);
- mTimersListPage.setVisibility(View.VISIBLE);
- mTimersListPage.setScaleX(1f);
- } else {
- // Animate
- ObjectAnimator a = ObjectAnimator.ofFloat(mTimerSetup, View.SCALE_X, 1f, 0f);
- a.setInterpolator(new AccelerateInterpolator());
- a.setDuration(125);
- a.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mTimerSetup.setVisibility(View.GONE);
- mTimersListPage.setScaleX(0);
- mTimersListPage.setVisibility(View.VISIBLE);
- ObjectAnimator b =
- ObjectAnimator.ofFloat(mTimersListPage, View.SCALE_X, 0f, 1f);
- b.setInterpolator(new DecelerateInterpolator());
- b.setDuration(225);
- b.start();
- }
- });
- a.start();
- }
- startClockTicks();
- mLastVisibleView = mTimersListPage;
- }
-
- @Override
- public void onClick(View v) {
- ClickAction tag = (ClickAction) v.getTag();
- onClickHelper(tag);
- }
-
- private void onClickHelper(ClickAction clickAction) {
- switch (clickAction.mAction) {
- case ClickAction.ACTION_DELETE:
- final TimerObj t = clickAction.mTimer;
- if (t.mState == TimerObj.STATE_TIMESUP) {
- cancelTimerNotification(t.mTimerId);
- }
- // Tell receiver the timer was deleted.
- // It will stop all activity related to the
- // timer
- t.setState(TimerObj.STATE_DELETED);
- updateTimersState(t, Timers.DELETE_TIMER);
-
- Events.sendTimerEvent(R.string.action_delete, R.string.label_deskclock);
- break;
- case ClickAction.ACTION_PLUS_ONE:
- onPlusOneButtonPressed(clickAction.mTimer);
- break;
- case ClickAction.ACTION_STOP:
- onStopButtonPressed(clickAction.mTimer);
- break;
- default:
- break;
- }
- }
-
- private void onPlusOneButtonPressed(TimerObj t) {
- switch (t.mState) {
- case TimerObj.STATE_RUNNING:
- t.addTime(TimerObj.MINUTE_IN_MILLIS);
- long timeLeft = t.updateTimeLeft(false);
- t.mView.setTime(timeLeft, false);
- t.mView.setLength(timeLeft);
- mAdapter.notifyDataSetChanged();
- updateTimersState(t, Timers.TIMER_UPDATE);
-
- Events.sendTimerEvent(R.string.action_add_minute, R.string.label_deskclock);
- break;
- case TimerObj.STATE_TIMESUP:
- // +1 min when the time is up will restart the timer with 1 minute left.
- t.setState(TimerObj.STATE_RUNNING);
- t.mStartTime = Utils.getTimeNow();
- t.mTimeLeft = t.mOriginalLength = TimerObj.MINUTE_IN_MILLIS;
- updateTimersState(t, Timers.RESET_TIMER);
- Events.sendTimerEvent(R.string.action_add_minute, R.string.label_deskclock);
-
- updateTimersState(t, Timers.START_TIMER);
- Events.sendTimerEvent(R.string.action_start, R.string.label_deskclock);
-
- updateTimesUpMode(t);
- cancelTimerNotification(t.mTimerId);
- break;
- case TimerObj.STATE_STOPPED:
- t.setState(TimerObj.STATE_RESTART);
- t.mTimeLeft = t.mOriginalLength = t.mSetupLength;
- t.mView.stop();
- t.mView.setTime(t.mTimeLeft, false);
- t.mView.set(t.mOriginalLength, t.mTimeLeft, false);
- updateTimersState(t, Timers.RESET_TIMER);
-
- Events.sendTimerEvent(R.string.action_reset, R.string.label_deskclock);
- break;
- default:
- break;
- }
- }
-
- private void onStopButtonPressed(TimerObj t) {
- switch (t.mState) {
- case TimerObj.STATE_RUNNING:
- // Stop timer and save the remaining time of the timer
- t.setState(TimerObj.STATE_STOPPED);
- t.mView.pause();
- t.updateTimeLeft(true);
- updateTimersState(t, Timers.STOP_TIMER);
-
- Events.sendTimerEvent(R.string.action_stop, R.string.label_deskclock);
- break;
- case TimerObj.STATE_STOPPED:
- // Reset the remaining time and continue timer
- t.setState(TimerObj.STATE_RUNNING);
- t.mStartTime = Utils.getTimeNow() - (t.mOriginalLength - t.mTimeLeft);
- t.mView.start();
- updateTimersState(t, Timers.START_TIMER);
-
- Events.sendTimerEvent(R.string.action_start, R.string.label_deskclock);
- break;
- case TimerObj.STATE_TIMESUP:
- if (t.mDeleteAfterUse) {
- cancelTimerNotification(t.mTimerId);
- // Tell receiver the timer was deleted.
- // It will stop all activity related to the
- // timer
- t.setState(TimerObj.STATE_DELETED);
- updateTimersState(t, Timers.DELETE_TIMER);
- Events.sendTimerEvent(R.string.action_delete, R.string.label_deskclock);
- } else {
- resetTimer(t);
- }
- break;
- case TimerObj.STATE_RESTART:
- t.setState(TimerObj.STATE_RUNNING);
- t.mStartTime = Utils.getTimeNow() - (t.mOriginalLength - t.mTimeLeft);
- t.mView.start();
- updateTimersState(t, Timers.START_TIMER);
- Events.sendTimerEvent(R.string.action_start, R.string.label_deskclock);
- break;
- default:
- break;
- }
- }
-
- private void onLabelPressed(TimerObj t) {
- final FragmentTransaction ft = getFragmentManager().beginTransaction();
- final Fragment prev = getFragmentManager().findFragmentByTag("label_dialog");
- if (prev != null) {
- ft.remove(prev);
- }
- ft.addToBackStack(null);
-
- // Create and show the dialog.
- final LabelDialogFragment newFragment =
- LabelDialogFragment.newInstance(t, t.mLabel, getTag());
- newFragment.show(ft, "label_dialog");
- }
-
- // Starts the ticks that animate the timers.
- private void startClockTicks() {
- mTimersList.postDelayed(mClockTick, 20);
- mTicking = true;
- }
-
- // Stops the ticks that animate the timers.
- private void stopClockTicks() {
- if (mTicking) {
- mTimersList.removeCallbacks(mClockTick);
- mTicking = false;
- }
- }
-
- private void updateTimersState(TimerObj t, String action) {
- if (Timers.DELETE_TIMER.equals(action)) {
- LogUtils.e("~~ update timer state");
- t.deleteFromSharedPref(mPrefs);
- } else {
- t.writeToSharedPref(mPrefs);
- }
- Intent i = new Intent();
- i.setAction(action);
- i.putExtra(Timers.TIMER_INTENT_EXTRA, t.mTimerId);
- // Make sure the receiver is getting the intent ASAP.
- i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- getActivity().sendBroadcast(i);
- }
-
- private void cancelTimerNotification(int timerId) {
- mNotificationManager.cancel(timerId);
- }
-
- private void updateTimesUpMode(TimerObj timerObj) {
- if (mOnEmptyListListener != null && timerObj.mState != TimerObj.STATE_TIMESUP) {
- mAdapter.removeTimer(timerObj);
- if (mAdapter.getCount() == 0) {
- mOnEmptyListListener.onEmptyList();
- } else {
- mOnEmptyListListener.onListChanged();
- }
- }
- }
-
- public void restartAdapter() {
- mAdapter = createAdapter(getActivity());
- mAdapter.onRestoreInstanceState(null);
- }
-
- // Process extras that were sent to the app and were intended for the timer
- // fragment
- public void processIntent(Intent intent) {
- // switch to timer setup view
- if (intent.getBooleanExtra(GOTO_SETUP_VIEW, false)) {
- gotoSetupView();
- }
- }
-
- @Override
- public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
- if (prefs.equals(mPrefs)) {
- if (key.equals(Timers.REFRESH_UI_WITH_LATEST_DATA) && prefs.getBoolean(key, false)) {
- // Clear the flag forcing a fresh of the adapter to reflect changes in the database.
- mPrefs.edit().putBoolean(key, false).apply();
- mAdapter = createAdapter(getActivity());
- mAdapter.onRestoreInstanceState(null);
- mTimersList.setAdapter(mAdapter);
- }
- }
- }
-
- @Override
- public void onFabClick(View view) {
- if (mLastVisibleView != mTimersListPage) {
- // New timer create if timer length is not zero
- // Create a new timer object to track the timer and
- // switch to the timers view.
- int timerLength = mTimerSetup.getTime();
- if (timerLength == 0) {
- return;
- }
- TimerObj t = new TimerObj(timerLength * DateUtils.SECOND_IN_MILLIS, getActivity());
- t.setState(TimerObj.STATE_RUNNING);
- mAdapter.addTimer(t);
- updateTimersState(t, Timers.START_TIMER);
- Events.sendTimerEvent(R.string.action_start, R.string.label_deskclock);
- gotoTimersView();
- mTimerSetup.reset(); // Make sure the setup is cleared for next time
-
- mTimersList.setFirstPositionAndOffsets(
- mAdapter.findTimerPositionById(t.mTimerId), 0);
- } else {
- mTimerSetup.reset();
- gotoSetupView();
- }
- }
-}
diff --git a/src/com/android/deskclock/timer/TimerItem.java b/src/com/android/deskclock/timer/TimerItem.java
new file mode 100644
index 0000000..e5a7be1
--- /dev/null
+++ b/src/com/android/deskclock/timer/TimerItem.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2015 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.timer;
+
+import android.content.Context;
+import android.os.SystemClock;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.android.deskclock.CircleButtonsLayout;
+import com.android.deskclock.R;
+import com.android.deskclock.data.Timer;
+
+/**
+ * This view is a visual representation of a {@link Timer}.
+ */
+class TimerItem extends LinearLayout {
+
+ /** Displays the remaining time or time since expiration. */
+ private CountingTimerView mTimerText;
+
+ /** Displays timer progress as a color circle that changes from white to red. */
+ private TimerCircleView mCircleView;
+
+ /** A button that either resets the timer or adds time to it, depending on its state. */
+ private ImageView mResetAddButton;
+
+ /** Displays the label associated with the timer. Tapping it presents an edit dialog. */
+ private TextView mLabelView;
+
+ /** The last state of the timer that was rendered; used to avoid expensive operations. */
+ private Timer.State mLastState;
+
+ public TimerItem(Context context) {
+ this(context, null);
+ }
+
+ public TimerItem(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mLabelView = (TextView) findViewById(R.id.timer_label);
+ mResetAddButton = (ImageView) findViewById(R.id.reset_add);
+ mCircleView = (TimerCircleView) findViewById(R.id.timer_time);
+ mTimerText = (CountingTimerView) findViewById(R.id.timer_time_text);
+
+ // This layout positions dynamically positions the label and reset buttons.
+ final CircleButtonsLayout cbl = (CircleButtonsLayout) findViewById(R.id.timer_circle);
+ cbl.setCircleTimerViewIds(R.id.timer_time, R.id.reset_add, R.id.timer_label);
+ }
+
+ /**
+ * Updates this view to display the latest state of the {@code timer}.
+ */
+ void update(Timer timer) {
+ // Update the time.
+ mTimerText.setTime(timer.getRemainingTime(), false, true);
+
+ // Update the progress of the circle.
+ mCircleView.update(timer);
+
+ // Update the label if it changed.
+ final String label = timer.getLabel();
+ if (!TextUtils.equals(label, mLabelView.getText())) {
+ mLabelView.setText(label);
+ }
+
+ // Update visibility of things that may blink.
+ final boolean blinkOff = SystemClock.elapsedRealtime() % 1000 < 500;
+ mCircleView.setVisibility(timer.isExpired() && blinkOff ? INVISIBLE : VISIBLE);
+ mTimerText.showTime(!timer.isPaused() || !blinkOff);
+
+ // Update some potentially expensive areas of the user interface only on state changes.
+ if (timer.getState() != mLastState) {
+ mLastState = timer.getState();
+ switch (mLastState) {
+ case RESET: {
+ final String resetDesc = getResources().getString(R.string.timer_reset);
+ mResetAddButton.setImageResource(R.drawable.ic_reset);
+ mResetAddButton.setContentDescription(resetDesc);
+ mTimerText.setTimeStrTextColor(false, true);
+ break;
+ }
+ case RUNNING: {
+ final String addTimeDesc = getResources().getString(R.string.timer_plus_one);
+ mResetAddButton.setImageResource(R.drawable.ic_plusone);
+ mResetAddButton.setContentDescription(addTimeDesc);
+ mTimerText.setTimeStrTextColor(false, true);
+ break;
+ }
+ case PAUSED: {
+ final String resetDesc = getResources().getString(R.string.timer_reset);
+ mResetAddButton.setImageResource(R.drawable.ic_reset);
+ mResetAddButton.setContentDescription(resetDesc);
+ mTimerText.setTimeStrTextColor(false, true);
+ break;
+ }
+ case EXPIRED: {
+ final String addTimeDesc = getResources().getString(R.string.timer_plus_one);
+ mResetAddButton.setImageResource(R.drawable.ic_plusone);
+ mResetAddButton.setContentDescription(addTimeDesc);
+ mTimerText.setTimeStrTextColor(true, true);
+ break;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/timer/TimerItemFragment.java b/src/com/android/deskclock/timer/TimerItemFragment.java
index 3c5d47a..5faec96 100644
--- a/src/com/android/deskclock/timer/TimerItemFragment.java
+++ b/src/com/android/deskclock/timer/TimerItemFragment.java
@@ -16,34 +16,31 @@
package com.android.deskclock.timer;
-import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
-import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.TextView;
-import com.android.deskclock.CircleButtonsLayout;
-import com.android.deskclock.DeskClock;
import com.android.deskclock.LabelDialogFragment;
import com.android.deskclock.R;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Timer;
+import com.android.deskclock.events.Events;
public class TimerItemFragment extends Fragment {
- private static final String TAG = "TimerItemFragment_tag";
- private TimerObj mTimerObj;
- public TimerItemFragment() {
- }
+ private static final String KEY_TIMER_ID = "KEY_TIMER_ID";
+ private int mTimerId;
- public static TimerItemFragment newInstance(TimerObj timerObj) {
+ /** The public no-arg constructor required by all fragments. */
+ public TimerItemFragment() {}
+
+ public static TimerItemFragment newInstance(Timer timer) {
final TimerItemFragment fragment = new TimerItemFragment();
final Bundle args = new Bundle();
- args.putParcelable(TAG, timerObj);
+ args.putInt(KEY_TIMER_ID, timer.getId());
fragment.setArguments(args);
return fragment;
}
@@ -51,82 +48,69 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- final Bundle bundle = getArguments();
- if (bundle != null) {
- mTimerObj = (TimerObj) bundle.getParcelable(TAG);
- }
+
+ mTimerId = getArguments().getInt(KEY_TIMER_ID);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- final TimerListItem v = (TimerListItem) inflater.inflate(R.layout.timer_list_item,
- null);
- mTimerObj.mView = v;
- final long timeLeft = mTimerObj.updateTimeLeft(false);
- final boolean drawWithColor = mTimerObj.mState != TimerObj.STATE_RESTART;
- v.set(mTimerObj.mOriginalLength, timeLeft, drawWithColor);
- v.setTime(timeLeft, true);
- v.setResetAddButton(mTimerObj.mState == TimerObj.STATE_RUNNING ||
- mTimerObj.mState == TimerObj.STATE_TIMESUP, new OnClickListener() {
- @Override
- public void onClick(View view) {
- final Fragment parent = getParentFragment();
- if (parent instanceof TimerFragment) {
- ((TimerFragment) parent).onPlusOneButtonPressed(mTimerObj);
- }
+ final TimerItem view = (TimerItem) inflater.inflate(R.layout.timer_item, container, false);
+ view.findViewById(R.id.reset_add).setOnClickListener(new ResetAddListener());
+ view.findViewById(R.id.timer_label).setOnClickListener(new EditLabelListener());
+ view.update(getTimer());
+
+ return view;
+ }
+
+ /**
+ * @return {@code true} iff the timer is in a state that requires continuous updates
+ */
+ boolean updateTime() {
+ final TimerItem view = (TimerItem) getView();
+ if (view != null) {
+ final Timer timer = getTimer();
+ view.update(timer);
+ return !timer.isReset();
+ }
+
+ return false;
+ }
+
+ int getTimerId() {
+ return mTimerId;
+ }
+
+ Timer getTimer() {
+ return DataModel.getDataModel().getTimer(getTimerId());
+ }
+
+ private class ResetAddListener implements View.OnClickListener {
+ @Override
+ public void onClick(View v) {
+ final Timer timer = getTimer();
+ if (timer.isPaused()) {
+ DataModel.getDataModel().resetOrDeleteTimer(timer, R.string.label_deskclock);
+ } else if (timer.isRunning() || timer.isExpired()) {
+ DataModel.getDataModel().addTimerMinute(timer);
+ Events.sendTimerEvent(R.string.action_add_minute, R.string.label_deskclock);
}
- });
- switch (mTimerObj.mState) {
- case TimerObj.STATE_RUNNING:
- v.start();
- break;
- case TimerObj.STATE_TIMESUP:
- v.timesUp();
- break;
- default:
- break;
- }
-
- final CircleButtonsLayout circleLayout =
- (CircleButtonsLayout) v.findViewById(R.id.timer_circle);
- circleLayout.setCircleTimerViewIds(R.id.timer_time, R.id.reset_add, R.id.timer_label);
-
- return v;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- final View v = mTimerObj.mView;
- if (v == null) {
- return;
- }
-
- TextView label = (TextView) v.findViewById(R.id.timer_label);
- label.setText(mTimerObj.mLabel);
- if (getActivity() instanceof DeskClock) {
- label.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onLabelPressed(mTimerObj);
- }
- });
- } else if (TextUtils.isEmpty(mTimerObj.mLabel)) {
- label.setVisibility(View.INVISIBLE);
}
}
- private void onLabelPressed(TimerObj t) {
- final String dialogTag = "label_dialog";
- final FragmentTransaction ft = getFragmentManager().beginTransaction();
- final Fragment prev = getFragmentManager().findFragmentByTag(dialogTag);
- if (prev != null) {
- ft.remove(prev);
+ private class EditLabelListener implements View.OnClickListener {
+
+ private static final String TAG = "label_dialog";
+
+ @Override
+ public void onClick(View v) {
+ final FragmentTransaction ft = getFragmentManager().beginTransaction();
+ final Fragment existingFragment = getFragmentManager().findFragmentByTag(TAG);
+ if (existingFragment != null) {
+ ft.remove(existingFragment);
+ }
+ ft.addToBackStack(null);
+ LabelDialogFragment.newInstance(getTimer()).show(ft, TAG);
}
- ft.addToBackStack(null);
- final LabelDialogFragment newFragment =
- LabelDialogFragment.newInstance(t, t.mLabel, getParentFragment().getTag());
- newFragment.show(ft, dialogTag);
}
-}
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/timer/TimerKlaxon.java b/src/com/android/deskclock/timer/TimerKlaxon.java
new file mode 100644
index 0000000..979d937
--- /dev/null
+++ b/src/com/android/deskclock/timer/TimerKlaxon.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 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.timer;
+
+import android.content.Context;
+import android.net.Uri;
+
+import com.android.deskclock.AsyncRingtonePlayer;
+import com.android.deskclock.LogUtils;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.settings.SettingsActivity;
+
+public abstract class TimerKlaxon {
+
+ private static boolean sStarted = false;
+ private static AsyncRingtonePlayer sAsyncRingtonePlayer;
+
+ private TimerKlaxon() {
+ }
+
+ public static void stop(Context context) {
+ if (sStarted) {
+ LogUtils.i("TimerKlaxon.stop()");
+ sStarted = false;
+ getAsyncRingtonePlayer(context).stop();
+ }
+ }
+
+ public static void start(Context context) {
+ // Make sure we are stopped before starting
+ stop(context);
+ LogUtils.i("TimerKlaxon.start()");
+
+ // Look up user-selected timer ringtone.
+ if (DataModel.getDataModel().isTimerRingtoneSilent()) {
+ // Special case: Silent ringtone
+ LogUtils.i("Playing silent ringtone for timer");
+ } else {
+ final Uri uri = DataModel.getDataModel().getTimerRingtoneUri();
+ getAsyncRingtonePlayer(context).play(uri);
+ }
+ sStarted = true;
+ }
+
+ private static synchronized AsyncRingtonePlayer getAsyncRingtonePlayer(Context context) {
+ if (sAsyncRingtonePlayer == null) {
+ sAsyncRingtonePlayer = new AsyncRingtonePlayer(context.getApplicationContext(),
+ SettingsActivity.KEY_TIMER_CRESCENDO);
+ }
+
+ return sAsyncRingtonePlayer;
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/timer/TimerListItem.java b/src/com/android/deskclock/timer/TimerListItem.java
deleted file mode 100644
index 07587a8..0000000
--- a/src/com/android/deskclock/timer/TimerListItem.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2012 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.timer;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-
-import com.android.deskclock.CircleTimerView;
-import com.android.deskclock.R;
-
-
-public class TimerListItem extends LinearLayout {
-
- CountingTimerView mTimerText;
- CircleTimerView mCircleView;
- ImageView mResetAddButton;
-
- long mTimerLength;
-
- public TimerListItem(Context context) {
- this(context, null);
- }
-
- public TimerListItem(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mTimerText = (CountingTimerView) findViewById(R.id.timer_time_text);
- mCircleView = (CircleTimerView) findViewById(R.id.timer_time);
- mResetAddButton = (ImageView) findViewById(R.id.reset_add);
- mCircleView.setTimerMode(true);
- }
-
- public void set(long timerLength, long timeLeft, boolean drawRed) {
- if (mCircleView == null) {
- mCircleView = (CircleTimerView) findViewById(R.id.timer_time);
- mCircleView.setTimerMode(true);
- }
- mTimerLength = timerLength;
- mCircleView.setIntervalTime(mTimerLength);
- mCircleView.setPassedTime(timerLength - timeLeft, drawRed);
- invalidate();
- }
-
- public void start() {
- mResetAddButton.setImageResource(R.drawable.ic_plusone);
- mResetAddButton.setContentDescription(getResources().getString(R.string.timer_plus_one));
- mCircleView.startIntervalAnimation();
- mTimerText.setTimeStrTextColor(false, true);
- mTimerText.showTime(true);
- mCircleView.setVisibility(VISIBLE);
- }
-
- public void pause() {
- mResetAddButton.setImageResource(R.drawable.ic_reset);
- mResetAddButton.setContentDescription(getResources().getString(R.string.timer_reset));
- mCircleView.pauseIntervalAnimation();
- mTimerText.setTimeStrTextColor(false, true);
- mTimerText.showTime(true);
- mCircleView.setVisibility(VISIBLE);
- }
-
- public void stop() {
- mCircleView.stopIntervalAnimation();
- mTimerText.setTimeStrTextColor(false, true);
- mTimerText.showTime(true);
- mCircleView.setVisibility(VISIBLE);
- }
-
- public void timesUp() {
- mCircleView.abortIntervalAnimation();
- mTimerText.setTimeStrTextColor(true, true);
- }
-
- public void done() {
- mCircleView.stopIntervalAnimation();
- mCircleView.setVisibility(VISIBLE);
- mCircleView.invalidate();
- mTimerText.setTimeStrTextColor(true, false);
- }
-
- public void setLength(long timerLength) {
- mTimerLength = timerLength;
- mCircleView.setIntervalTime(mTimerLength);
- mCircleView.invalidate();
- }
-
- public void setTextBlink(boolean blink) {
- mTimerText.showTime(!blink);
- }
-
- public void setCircleBlink(boolean blink) {
- mCircleView.setVisibility(blink ? INVISIBLE : VISIBLE);
- }
-
- public void setResetAddButton(boolean isRunning, OnClickListener listener) {
- if (mResetAddButton == null) {
- mResetAddButton = (ImageView) findViewById(R.id.reset_add);
- }
- mResetAddButton.setImageResource(isRunning ? R.drawable.ic_plusone :
- R.drawable.ic_reset);
- mResetAddButton.setContentDescription(getResources().getString(
- isRunning ? R.string.timer_plus_one : R.string.timer_reset));
- mResetAddButton.setOnClickListener(listener);
- }
-
- public void setTime(long time, boolean forceUpdate) {
- if (mTimerText == null) {
- mTimerText = (CountingTimerView) findViewById(R.id.timer_time_text);
- }
- mTimerText.setTime(time, false, forceUpdate);
- }
-}
diff --git a/src/com/android/deskclock/timer/TimerObj.java b/src/com/android/deskclock/timer/TimerObj.java
deleted file mode 100644
index 390f658..0000000
--- a/src/com/android/deskclock/timer/TimerObj.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright (C) 2012 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.timer;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.preference.PreferenceManager;
-
-import com.android.deskclock.R;
-import com.android.deskclock.Utils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class TimerObj implements Parcelable {
-
- public static final String KEY_NEXT_TIMER_ID = "next_timer_id";
-
- private static final String TAG = "TimerObj";
- // Max timer length is 9 hours + 99 minutes + 99 seconds
- public static final long MAX_TIMER_LENGTH = (9 * 3600 + 99 * 60 + 99) * 1000;
- public static final long MINUTE_IN_MILLIS = 60 * 1000;
-
- public int mTimerId; // Unique id
- public long mStartTime; // With mTimeLeft , used to calculate the correct time
- public long mTimeLeft; // in the timer.
- public long mOriginalLength; // length set at start of timer and by +1 min after times up
- public long mSetupLength; // length set at start of timer
- public TimerListItem mView;
- public int mState;
- public int mPriorState;
- public String mLabel;
- public boolean mDeleteAfterUse;
-
- public static final int STATE_RUNNING = 1;
- public static final int STATE_STOPPED = 2;
- public static final int STATE_TIMESUP = 3;
- public static final int STATE_RESTART = 4;
- public static final int STATE_DELETED = 5;
-
- private static final String PREF_TIMER_ID = "timer_id_";
- private static final String PREF_START_TIME = "timer_start_time_";
- private static final String PREF_TIME_LEFT = "timer_time_left_";
- private static final String PREF_ORIGINAL_TIME = "timer_original_timet_";
- private static final String PREF_SETUP_TIME = "timer_setup_timet_";
- private static final String PREF_STATE = "timer_state_";
- private static final String PREF_PRIOR_STATE = "timer_prior_state_";
- private static final String PREF_LABEL = "timer_label_";
- private static final String PREF_DELETE_AFTER_USE = "delete_after_use_";
-
- private static final String PREF_TIMERS_LIST = "timers_list";
-
- public static final Parcelable.Creator<TimerObj> CREATOR = new Parcelable.Creator<TimerObj>() {
- @Override
- public TimerObj createFromParcel(Parcel p) {
- return new TimerObj(p);
- }
-
- @Override
- public TimerObj[] newArray(int size) {
- return new TimerObj[size];
- }
- };
-
- public void writeToSharedPref(SharedPreferences prefs) {
- final String id = Integer.toString(mTimerId);
-
- final Set<String> timerIds = getTimerIds(prefs);
- timerIds.add(id);
-
- final SharedPreferences.Editor editor = prefs.edit()
- .putInt(PREF_TIMER_ID + id, mTimerId)
- .putLong(PREF_START_TIME + id, mStartTime)
- .putLong(PREF_TIME_LEFT + id, mTimeLeft)
- .putLong(PREF_ORIGINAL_TIME + id, mOriginalLength)
- .putLong(PREF_SETUP_TIME + id, mSetupLength)
- .putInt(PREF_STATE + id, mState)
- .putInt(PREF_PRIOR_STATE + id, mPriorState)
- .putStringSet(PREF_TIMERS_LIST, timerIds)
- .putString(PREF_LABEL + id, mLabel)
- .putBoolean(PREF_DELETE_AFTER_USE + id, mDeleteAfterUse);
-
- editor.apply();
- }
-
- public void readFromSharedPref(SharedPreferences prefs) {
- final String id = Integer.toString(mTimerId);
-
- mStartTime = prefs.getLong(PREF_START_TIME + id, 0);
- mTimeLeft = prefs.getLong(PREF_TIME_LEFT + id, 0);
- mOriginalLength = prefs.getLong(PREF_ORIGINAL_TIME + id, 0);
- mSetupLength = prefs.getLong(PREF_SETUP_TIME + id, 0);
- mState = prefs.getInt(PREF_STATE + id, 0);
- mPriorState = prefs.getInt(PREF_PRIOR_STATE + id, 0);
- mLabel = prefs.getString(PREF_LABEL + id, "");
- mDeleteAfterUse = prefs.getBoolean(PREF_DELETE_AFTER_USE + id, false);
- }
-
- public boolean deleteFromSharedPref(SharedPreferences prefs) {
- final String id = Integer.toString(mTimerId);
-
- final Set<String> timerIds = getTimerIds(prefs);
- timerIds.remove(id);
-
- final SharedPreferences.Editor editor = prefs.edit()
- .remove(PREF_TIMER_ID + id)
- .remove(PREF_START_TIME + id)
- .remove(PREF_TIME_LEFT + id)
- .remove(PREF_ORIGINAL_TIME + id)
- .remove(PREF_SETUP_TIME + id)
- .remove(PREF_STATE + id)
- .remove(PREF_PRIOR_STATE + id)
- .putStringSet(PREF_TIMERS_LIST, timerIds)
- .remove(PREF_LABEL + id)
- .remove(PREF_DELETE_AFTER_USE + id);
-
- if (timerIds.isEmpty()) {
- editor.remove(KEY_NEXT_TIMER_ID);
- }
-
- return editor.commit();
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(mTimerId);
- dest.writeLong(mStartTime);
- dest.writeLong(mTimeLeft);
- dest.writeLong(mOriginalLength);
- dest.writeLong(mSetupLength);
- dest.writeInt(mState);
- dest.writeInt(mPriorState);
- dest.writeString(mLabel);
- }
-
- public TimerObj(Parcel p) {
- mTimerId = p.readInt();
- mStartTime = p.readLong();
- mTimeLeft = p.readLong();
- mOriginalLength = p.readLong();
- mSetupLength = p.readLong();
- mState = p.readInt();
- mPriorState = p.readInt();
- mLabel = p.readString();
- }
-
- private TimerObj() {
- this(0 /* timerLength */, 0 /* timerId */);
- }
-
- public TimerObj(long timerLength, int timerId) {
- init(timerLength, timerId);
- }
-
- public TimerObj(long timerLength, Context context) {
- init(timerLength, getNextTimerId(context));
- }
-
- public TimerObj(long length, String label, Context context) {
- this(length, context);
- mLabel = label != null ? label : "";
- }
-
- private void init (long length, int timerId) {
- /* TODO: mTimerId must avoid StopwatchService.NOTIFICATION_ID,
- * TimerReceiver.IN_USE_NOTIFICATION_ID, and alarm ID's (which seem to be 1, 2, ..)
- */
- mTimerId = timerId;
- mStartTime = Utils.getTimeNow();
- mTimeLeft = mOriginalLength = mSetupLength = length;
- mLabel = "";
- }
-
- private int getNextTimerId(Context context) {
- final SharedPreferences prefs = Utils.getDefaultSharedPreferences(context);
- final int nextTimerId;
- synchronized (TimerObj.class) {
- nextTimerId = prefs.getInt(KEY_NEXT_TIMER_ID, 0);
- prefs.edit().putInt(KEY_NEXT_TIMER_ID, nextTimerId + 1).apply();
- }
- return nextTimerId;
- }
-
- public static boolean isTimerStateSharedPrefKey(String prefKey) {
- return prefKey.startsWith(PREF_STATE);
- }
-
- public static int getTimerIdFromTimerStateKey(String timerStatePrefKey) {
- final String timerId = timerStatePrefKey.substring(PREF_STATE.length());
- return Integer.parseInt(timerId);
- }
-
- public long updateTimeLeft(boolean forceUpdate) {
- if (isTicking() || forceUpdate) {
- long millis = Utils.getTimeNow();
- mTimeLeft = mOriginalLength - (millis - mStartTime);
- }
- return mTimeLeft;
- }
-
- public void setState(int state) {
- mPriorState = mState;
- mState = state;
- }
-
- public String getLabelOrDefault(Context context) {
- return (mLabel == null || mLabel.length() == 0) ? context.getString(
- R.string.timer_notification_label)
- : mLabel;
- }
-
- public boolean isTicking() {
- return mState == STATE_RUNNING || mState == STATE_TIMESUP;
- }
-
- public boolean isInUse() {
- return mState == STATE_RUNNING || mState == STATE_STOPPED;
- }
-
- public void addTime(long time) {
- mTimeLeft = mOriginalLength - (Utils.getTimeNow() - mStartTime);
- if (mTimeLeft < MAX_TIMER_LENGTH - time) {
- mOriginalLength += time;
- }
- }
-
- public boolean getDeleteAfterUse() {
- return mDeleteAfterUse;
- }
-
- public long getTimesupTime() {
- return mStartTime + mOriginalLength;
- }
-
- public static TimerObj getTimerFromSharedPrefs(SharedPreferences prefs, int timerId) {
- final TimerObj timer = new TimerObj();
- timer.mTimerId = timerId;
- timer.readFromSharedPref(prefs);
- return timer;
- }
-
- public static void getTimersFromSharedPrefs(SharedPreferences prefs, List<TimerObj> timers) {
- for (String timerIdString : getTimerIds(prefs)) {
- final int timerId = Integer.parseInt(timerIdString);
- timers.add(getTimerFromSharedPrefs(prefs, timerId));
- }
-
- Collections.sort(timers, new Comparator<TimerObj>() {
- @Override
- public int compare(TimerObj timer1, TimerObj timer2) {
- return timer1.mTimerId - timer2.mTimerId;
- }
- });
- }
-
- public static void getTimersFromSharedPrefs(SharedPreferences prefs, List<TimerObj> timers,
- int state) {
- for (String timerIdString : getTimerIds(prefs)) {
- final int timerId = Integer.parseInt(timerIdString);
- final TimerObj timer = getTimerFromSharedPrefs(prefs, timerId);
- if (timer.mState == state) {
- timers.add(timer);
- }
- }
- }
-
- public static void putTimersInSharedPrefs(SharedPreferences prefs, List<TimerObj> timers) {
- for (TimerObj timer : timers) {
- timer.writeToSharedPref(prefs);
- }
- }
-
- public static void resetTimersInSharedPrefs(SharedPreferences prefs) {
- final List<TimerObj> timers = new ArrayList<>();
- getTimersFromSharedPrefs(prefs, timers);
- for (TimerObj timer : timers) {
- timer.setState(TimerObj.STATE_RESTART);
- timer.mTimeLeft = timer.mOriginalLength = timer.mSetupLength;
- timer.writeToSharedPref(prefs);
- }
- }
-
- private static Set<String> getTimerIds(SharedPreferences prefs) {
- // return a defensive copy that is safe to mutate; see doc for getStringSet() for details
- return new HashSet<>(prefs.getStringSet(PREF_TIMERS_LIST, Collections.<String>emptySet()));
- }
-}
diff --git a/src/com/android/deskclock/timer/TimerPagerAdapter.java b/src/com/android/deskclock/timer/TimerPagerAdapter.java
new file mode 100644
index 0000000..536024c
--- /dev/null
+++ b/src/com/android/deskclock/timer/TimerPagerAdapter.java
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) 2015 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.timer;
+
+import android.app.Fragment;
+import android.app.FragmentManager;
+import android.app.FragmentTransaction;
+import android.support.v13.app.FragmentCompat;
+import android.support.v4.view.PagerAdapter;
+import android.util.ArrayMap;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Timer;
+import com.android.deskclock.data.TimerListener;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This adapter produces a {@link TimerItemFragment} for each timer.
+ */
+class TimerPagerAdapter extends PagerAdapter implements TimerListener {
+
+ private final FragmentManager mFragmentManager;
+
+ /** Maps each timer id to the corresponding {@link TimerItemFragment} that draws it. */
+ private final Map<Integer, TimerItemFragment> mFragments = new ArrayMap<>();
+
+ /** The current fragment transaction in play or {@code null}. */
+ private FragmentTransaction mCurrentTransaction;
+
+ /** The {@link TimerItemFragment} that is current visible on screen. */
+ private Fragment mCurrentPrimaryItem;
+
+ public TimerPagerAdapter(FragmentManager fragmentManager) {
+ mFragmentManager = fragmentManager;
+ }
+
+ @Override
+ public int getCount() {
+ return getTimers().size();
+ }
+
+ @Override
+ public boolean isViewFromObject(View view, Object object) {
+ return ((Fragment) object).getView() == view;
+ }
+
+ @Override
+ public int getItemPosition(Object object) {
+ final TimerItemFragment fragment = (TimerItemFragment) object;
+ final Timer timer = fragment.getTimer();
+
+ final int position = getTimers().indexOf(timer);
+ return position == -1 ? POSITION_NONE : position;
+ }
+
+ @Override
+ public Fragment instantiateItem(ViewGroup container, int position) {
+ if (mCurrentTransaction == null) {
+ mCurrentTransaction = mFragmentManager.beginTransaction();
+ }
+
+ final Timer timer = getTimers().get(position);
+
+ // Search for the existing fragment by tag.
+ final String tag = getClass().getSimpleName() + timer.getId();
+ TimerItemFragment fragment = (TimerItemFragment) mFragmentManager.findFragmentByTag(tag);
+
+ if (fragment != null) {
+ // Reattach the existing fragment.
+ mCurrentTransaction.attach(fragment);
+ } else {
+ // Create and add a new fragment.
+ fragment = TimerItemFragment.newInstance(timer);
+ mCurrentTransaction.add(container.getId(), fragment, tag);
+ }
+
+ if (fragment != mCurrentPrimaryItem) {
+ setItemVisible(fragment, false);
+ }
+
+ mFragments.put(timer.getId(), fragment);
+
+ return fragment;
+ }
+
+ @Override
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ final TimerItemFragment fragment = (TimerItemFragment) object;
+
+ if (mCurrentTransaction == null) {
+ mCurrentTransaction = mFragmentManager.beginTransaction();
+ }
+
+ mFragments.remove(fragment.getTimerId());
+ mCurrentTransaction.remove(fragment);
+ }
+
+ @Override
+ public void setPrimaryItem(ViewGroup container, int position, Object object) {
+ final Fragment fragment = (Fragment) object;
+ if (fragment != mCurrentPrimaryItem) {
+ if (mCurrentPrimaryItem != null) {
+ setItemVisible(mCurrentPrimaryItem, false);
+ }
+
+ mCurrentPrimaryItem = fragment;
+
+ if (mCurrentPrimaryItem != null) {
+ setItemVisible(mCurrentPrimaryItem, true);
+ }
+ }
+ }
+
+ @Override
+ public void finishUpdate(ViewGroup container) {
+ if (mCurrentTransaction != null) {
+ mCurrentTransaction.commitAllowingStateLoss();
+ mCurrentTransaction = null;
+ mFragmentManager.executePendingTransactions();
+ }
+ }
+
+ @Override
+ public void timerAdded(Timer timer) {
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public void timerRemoved(Timer timer) {
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public void timerUpdated(Timer before, Timer after) {
+ final TimerItemFragment timerItemFragment = mFragments.get(after.getId());
+ if (timerItemFragment != null) {
+ timerItemFragment.updateTime();
+ }
+ }
+
+ /**
+ * @return {@code true} if at least one timer is in a state requiring continuous updates
+ */
+ boolean updateTime() {
+ boolean continuousUpdates = false;
+ for (TimerItemFragment fragment : mFragments.values()) {
+ continuousUpdates |= fragment.updateTime();
+ }
+ return continuousUpdates;
+ }
+
+ Timer getTimer(int index) {
+ return getTimers().get(index);
+ }
+
+ private List<Timer> getTimers() {
+ return DataModel.getDataModel().getTimers();
+ }
+
+ private static void setItemVisible(Fragment item, boolean visible) {
+ FragmentCompat.setMenuVisibility(item, visible);
+ FragmentCompat.setUserVisibleHint(item, visible);
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/timer/TimerReceiver.java b/src/com/android/deskclock/timer/TimerReceiver.java
index a013d75..7a41789 100644
--- a/src/com/android/deskclock/timer/TimerReceiver.java
+++ b/src/com/android/deskclock/timer/TimerReceiver.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 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.
@@ -16,479 +16,28 @@
package com.android.deskclock.timer;
-import android.app.AlarmManager;
-import android.app.Notification;
-import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationManagerCompat;
-import android.util.Log;
-import com.android.deskclock.DeskClock;
-import com.android.deskclock.R;
-import com.android.deskclock.TimerRingService;
-import com.android.deskclock.Utils;
-import com.android.deskclock.events.Events;
+import com.android.deskclock.LogUtils;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Timer;
-import java.util.ArrayList;
-import java.util.Iterator;
-
+/**
+ * This broadcast receiver exists to handle timer expiry scheduled in 4.2.1 and prior. It must exist
+ * for at least one release cycle before removal to honor these old scheduled timers after upgrading
+ * beyond 4.2.1. After 4.2.1, all timer expiration is directed to TimerService.
+ */
public class TimerReceiver extends BroadcastReceiver {
- private static final String TAG = "TimerReceiver";
-
- // Make this a large number to avoid the alarm ID's which seem to be 1, 2, ...
- // Must also be different than StopwatchService.NOTIFICATION_ID
- private static final int IN_USE_NOTIFICATION_ID = Integer.MAX_VALUE - 2;
-
- ArrayList<TimerObj> mTimers;
-
@Override
- public void onReceive(final Context context, final Intent intent) {
- if (Timers.LOGGING) {
- Log.v(TAG, "Received intent " + intent.toString());
- }
- String actionType = intent.getAction();
- // This action does not need the timers data
- if (Timers.NOTIF_IN_USE_CANCEL.equals(actionType)) {
- cancelInUseNotification(context);
- return;
- }
+ public void onReceive(Context context, Intent intent) {
+ LogUtils.e("TimerReceiver", "Received legacy timer broadcast: %s", intent.getAction());
- // Get the updated timers data.
- if (mTimers == null) {
- mTimers = new ArrayList<>();
- }
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(context);
- TimerObj.getTimersFromSharedPrefs(prefs, mTimers);
-
- // These actions do not provide a timer ID, but do use the timers data
- if (Timers.NOTIF_IN_USE_SHOW.equals(actionType)) {
- showInUseNotification(context);
- return;
- } else if (Timers.NOTIF_TIMES_UP_SHOW.equals(actionType)) {
- showTimesUpNotification(context);
- return;
- } else if (Timers.NOTIF_TIMES_UP_CANCEL.equals(actionType)) {
- cancelTimesUpNotification(context);
- return;
- }
-
- // Remaining actions provide a timer Id
- if (!intent.hasExtra(Timers.TIMER_INTENT_EXTRA)) {
- // No data to work with, do nothing
- Log.e(TAG, "got intent without Timer data");
- return;
- }
-
- // Get the timer out of the Intent
- int timerId = intent.getIntExtra(Timers.TIMER_INTENT_EXTRA, -1);
- if (timerId == -1) {
- Log.d(TAG, "OnReceive:intent without Timer data for " + actionType);
- }
-
- TimerObj t = Timers.findTimer(mTimers, timerId);
-
- if (Timers.TIMES_UP.equals(actionType)) {
- // Find the timer (if it doesn't exists, it was probably deleted).
- if (t == null) {
- Log.d(TAG, " timer not found in list - do nothing");
- return;
- }
-
- t.setState(TimerObj.STATE_TIMESUP);
- t.writeToSharedPref(prefs);
- Events.sendEvent(R.string.category_timer, R.string.action_fire, 0);
-
- // Play ringtone by using TimerRingService service with a default alarm.
- Log.d(TAG, "playing ringtone");
- Intent si = new Intent();
- si.setClass(context, TimerRingService.class);
- context.startService(si);
-
- // Update the in-use notification
- if (getNextRunningTimer(mTimers, false, Utils.getTimeNow()) == null) {
- // Found no running timers.
- cancelInUseNotification(context);
- } else {
- showInUseNotification(context);
- }
-
- // Start the TimerAlertFullScreen activity.
- Intent timersAlert = new Intent(context, TimerAlertFullScreen.class);
- timersAlert.setFlags(
- Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_USER_ACTION);
- context.startActivity(timersAlert);
- } else if (Timers.RESET_TIMER.equals(actionType)
- || Timers.DELETE_TIMER.equals(actionType)
- || Timers.TIMER_DONE.equals(actionType)) {
- // Stop Ringtone if all timers are not in times-up status
- stopRingtoneIfNoTimesup(context);
-
- if (t != null) {
- cancelTimesUpNotification(context, t);
- }
- } else if (Timers.NOTIF_TIMES_UP_STOP.equals(actionType)) {
- // Find the timer (if it doesn't exists, it was probably deleted).
- if (t == null) {
- Log.d(TAG, "timer to stop not found in list - do nothing");
- return;
- } else if (t.mState != TimerObj.STATE_TIMESUP) {
- Log.d(TAG, "action to stop but timer not in times-up state - do nothing");
- return;
- }
-
- // Update timer state
- t.setState(t.getDeleteAfterUse() ? TimerObj.STATE_DELETED : TimerObj.STATE_RESTART);
- t.mTimeLeft = t.mOriginalLength = t.mSetupLength;
- t.writeToSharedPref(prefs);
-
- // Flag to tell DeskClock to re-sync with the database
- prefs.edit().putBoolean(Timers.REFRESH_UI_WITH_LATEST_DATA, true).apply();
-
- cancelTimesUpNotification(context, t);
-
- // Done with timer - delete from data base
- if (t.getDeleteAfterUse()) {
- t.deleteFromSharedPref(prefs);
- }
-
- // Stop Ringtone if no timers are in times-up status
- stopRingtoneIfNoTimesup(context);
- } else if (Timers.NOTIF_TIMES_UP_PLUS_ONE.equals(actionType)) {
- // Find the timer (if it doesn't exists, it was probably deleted).
- if (t == null) {
- Log.d(TAG, "timer to +1m not found in list - do nothing");
- return;
- } else if (t.mState != TimerObj.STATE_TIMESUP) {
- Log.d(TAG, "action to +1m but timer not in times up state - do nothing");
- return;
- }
-
- // Restarting the timer with 1 minute left.
- t.setState(TimerObj.STATE_RUNNING);
- t.mStartTime = Utils.getTimeNow();
- t.mTimeLeft = t. mOriginalLength = TimerObj.MINUTE_IN_MILLIS;
- t.writeToSharedPref(prefs);
-
- // Flag to tell DeskClock to re-sync with the database
- prefs.edit().putBoolean(Timers.REFRESH_UI_WITH_LATEST_DATA, true).apply();
-
- cancelTimesUpNotification(context, t);
-
- // If the app is not open, refresh the in-use notification
- if (!prefs.getBoolean(Timers.NOTIF_APP_OPEN, false)) {
- showInUseNotification(context);
- }
-
- // Stop Ringtone if no timers are in times-up status
- stopRingtoneIfNoTimesup(context);
- } else if (Timers.TIMER_UPDATE.equals(actionType)) {
- // Find the timer (if it doesn't exists, it was probably deleted).
- if (t == null) {
- Log.d(TAG, " timer to update not found in list - do nothing");
- return;
- }
-
- // Refresh buzzing notification
- if (t.mState == TimerObj.STATE_TIMESUP) {
- // Must cancel the previous notification to get all updates displayed correctly
- cancelTimesUpNotification(context, t);
- showTimesUpNotification(context, t);
- }
- }
- if (intent.getBooleanExtra(Timers.UPDATE_NEXT_TIMESUP, true)) {
- // Update the next "Times up" alarm unless explicitly told not to.
- updateNextTimesup(context);
+ if ("times_up".equals(intent.getAction())) {
+ final int timerId = intent.getIntExtra("timer.intent.extra", -1);
+ final Timer timer = DataModel.getDataModel().getTimer(timerId);
+ context.startService(TimerService.createTimerExpiredIntent(context, timer));
}
}
-
- private void stopRingtoneIfNoTimesup(final Context context) {
- if (Timers.findExpiredTimer(mTimers) == null) {
- // Stop ringtone
- Log.d(TAG, "stopping ringtone");
- Intent si = new Intent();
- si.setClass(context, TimerRingService.class);
- context.stopService(si);
- }
- }
-
- // Scan all timers and find the one that will expire next.
- // Tell AlarmManager to send a "Time's up" message to this receiver when this timer expires.
- // If no timer exists, clear "time's up" message.
- private void updateNextTimesup(Context context) {
- TimerObj t = getNextRunningTimer(mTimers, false, Utils.getTimeNow());
- long nextTimesup = (t == null) ? -1 : t.getTimesupTime();
- int timerId = (t == null) ? -1 : t.mTimerId;
-
- Intent intent = new Intent();
- intent.setAction(Timers.TIMES_UP);
- intent.setClass(context, TimerReceiver.class);
- // Time-critical, should be foreground
- intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
- if (!mTimers.isEmpty()) {
- intent.putExtra(Timers.TIMER_INTENT_EXTRA, timerId);
- }
- AlarmManager mngr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
- PendingIntent p = PendingIntent.getBroadcast(context,
- 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
- if (t != null) {
- if (Utils.isKitKatOrLater()) {
- mngr.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextTimesup, p);
- } else {
- mngr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextTimesup, p);
- }
- if (Timers.LOGGING) {
- Log.d(TAG, "Setting times up to " + nextTimesup);
- }
- } else {
- // if no timer is found Pending Intents should be canceled
- // to keep the internal state consistent with the UI
- mngr.cancel(p);
- p.cancel();
- if (Timers.LOGGING) {
- Log.v(TAG, "no next times up");
- }
- }
- }
-
- private void showInUseNotification(final Context context) {
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(context);
- boolean appOpen = prefs.getBoolean(Timers.NOTIF_APP_OPEN, false);
- ArrayList<TimerObj> timersInUse = Timers.timersInUse(mTimers);
- int numTimersInUse = timersInUse.size();
-
- if (appOpen || numTimersInUse == 0) {
- return;
- }
-
- String title, contentText;
- Long nextBroadcastTime = null;
- long now = Utils.getTimeNow();
- if (timersInUse.size() == 1) {
- TimerObj timer = timersInUse.get(0);
- boolean timerIsTicking = timer.isTicking();
- String label = timer.getLabelOrDefault(context);
- title = timerIsTicking ? label : context.getString(R.string.timer_stopped);
- long timeLeft = timerIsTicking ? timer.getTimesupTime() - now : timer.mTimeLeft;
- contentText = buildTimeRemaining(context, timeLeft);
- if (timerIsTicking && timeLeft > TimerObj.MINUTE_IN_MILLIS) {
- nextBroadcastTime = getBroadcastTime(now, timeLeft);
- }
- } else {
- TimerObj timer = getNextRunningTimer(timersInUse, false, now);
- if (timer == null) {
- // No running timers.
- title = String.format(
- context.getString(R.string.timers_stopped), numTimersInUse);
- contentText = context.getString(R.string.all_timers_stopped_notif);
- } else {
- // We have at least one timer running and other timers stopped.
- title = String.format(
- context.getString(R.string.timers_in_use), numTimersInUse);
- long completionTime = timer.getTimesupTime();
- long timeLeft = completionTime - now;
- contentText = String.format(context.getString(R.string.next_timer_notif),
- buildTimeRemaining(context, timeLeft));
- if (timeLeft <= TimerObj.MINUTE_IN_MILLIS) {
- TimerObj timerWithUpdate = getNextRunningTimer(timersInUse, true, now);
- if (timerWithUpdate != null) {
- completionTime = timerWithUpdate.getTimesupTime();
- timeLeft = completionTime - now;
- nextBroadcastTime = getBroadcastTime(now, timeLeft);
- }
- } else {
- nextBroadcastTime = getBroadcastTime(now, timeLeft);
- }
- }
- }
- showCollapsedNotificationWithNext(context, title, contentText, nextBroadcastTime);
- }
-
- private long getBroadcastTime(long now, long timeUntilBroadcast) {
- long seconds = timeUntilBroadcast / 1000;
- seconds = seconds - ( (seconds / 60) * 60 );
- return now + (seconds * 1000);
- }
-
- private void showCollapsedNotificationWithNext(
- final Context context, String title, String text, Long nextBroadcastTime) {
- Intent activityIntent = new Intent(context, DeskClock.class);
- activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- activityIntent.putExtra(DeskClock.SELECT_TAB_INTENT_EXTRA, DeskClock.TIMER_TAB_INDEX);
- PendingIntent pendingActivityIntent = PendingIntent.getActivity(context, 0, activityIntent,
- PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
- showCollapsedNotification(context, title, text, NotificationCompat.PRIORITY_HIGH,
- pendingActivityIntent, IN_USE_NOTIFICATION_ID, false);
-
- if (nextBroadcastTime == null) {
- return;
- }
- Intent nextBroadcast = new Intent();
- nextBroadcast.setAction(Timers.NOTIF_IN_USE_SHOW);
- PendingIntent pendingNextBroadcast =
- PendingIntent.getBroadcast(context, 0, nextBroadcast, 0);
- AlarmManager alarmManager =
- (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- if (Utils.isKitKatOrLater()) {
- alarmManager.setExact(AlarmManager.ELAPSED_REALTIME, nextBroadcastTime, pendingNextBroadcast);
- } else {
- alarmManager.set(AlarmManager.ELAPSED_REALTIME, nextBroadcastTime, pendingNextBroadcast);
- }
- }
-
- private static void showCollapsedNotification(final Context context, String title, String text,
- int priority, PendingIntent pendingIntent, int notificationId, boolean showTicker) {
- NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
- .setAutoCancel(false)
- .setContentTitle(title)
- .setContentText(text)
- .setDeleteIntent(pendingIntent)
- .setOngoing(true)
- .setPriority(priority)
- .setShowWhen(false)
- .setSmallIcon(R.drawable.stat_notify_timer)
- .setCategory(NotificationCompat.CATEGORY_ALARM)
- .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
- .setLocalOnly(true);
- if (showTicker) {
- builder.setTicker(text);
- }
-
- final Notification notification = builder.build();
- notification.contentIntent = pendingIntent;
- NotificationManagerCompat.from(context).notify(notificationId, notification);
- }
-
- private String buildTimeRemaining(Context context, long timeLeft) {
- if (timeLeft < 0) {
- // We should never be here...
- Log.v(TAG, "Will not show notification for timer already expired.");
- return null;
- }
-
- long seconds, minutes, hours;
- seconds = timeLeft / 1000;
- minutes = seconds / 60;
- hours = minutes / 60;
- minutes = minutes - hours * 60;
- if (hours > 99) {
- hours = 0;
- }
-
- String minSeq = Utils.getNumberFormattedQuantityString(context, R.plurals.minutes,
- (int) minutes);
-
- String hourSeq = Utils.getNumberFormattedQuantityString(context, R.plurals.hours,
- (int) hours);
-
- boolean dispHour = hours > 0;
- boolean dispMinute = minutes > 0;
- int index = (dispHour ? 1 : 0) | (dispMinute ? 2 : 0);
- String[] formats = context.getResources().getStringArray(R.array.timer_notifications);
- return String.format(formats[index], hourSeq, minSeq);
- }
-
- private TimerObj getNextRunningTimer(
- ArrayList<TimerObj> timers, boolean requireNextUpdate, long now) {
- long nextTimesup = Long.MAX_VALUE;
- boolean nextTimerFound = false;
- Iterator<TimerObj> i = timers.iterator();
- TimerObj t = null;
- while(i.hasNext()) {
- TimerObj tmp = i.next();
- if (tmp.mState == TimerObj.STATE_RUNNING) {
- long timesupTime = tmp.getTimesupTime();
- long timeLeft = timesupTime - now;
- if (timesupTime < nextTimesup && (!requireNextUpdate || timeLeft > 60) ) {
- nextTimesup = timesupTime;
- nextTimerFound = true;
- t = tmp;
- }
- }
- }
- if (nextTimerFound) {
- return t;
- } else {
- return null;
- }
- }
-
- public static void cancelInUseNotification(final Context context) {
- NotificationManagerCompat.from(context).cancel(IN_USE_NOTIFICATION_ID);
- }
-
- private void showTimesUpNotification(final Context context) {
- for (TimerObj timerObj : Timers.timersInTimesUp(mTimers) ) {
- showTimesUpNotification(context, timerObj);
- }
- }
-
- private void showTimesUpNotification(final Context context, TimerObj timerObj) {
- // Content Intent. When clicked will show the timer full screen
- PendingIntent contentIntent = PendingIntent.getActivity(context, timerObj.mTimerId,
- new Intent(context, TimerAlertFullScreen.class).putExtra(
- Timers.TIMER_INTENT_EXTRA, timerObj.mTimerId),
- PendingIntent.FLAG_UPDATE_CURRENT);
-
- // Add one minute action button
- PendingIntent addOneMinuteAction = PendingIntent.getBroadcast(context, timerObj.mTimerId,
- new Intent(Timers.NOTIF_TIMES_UP_PLUS_ONE)
- .putExtra(Timers.TIMER_INTENT_EXTRA, timerObj.mTimerId),
- PendingIntent.FLAG_UPDATE_CURRENT);
-
- // Add stop/done action button
- PendingIntent stopIntent = PendingIntent.getBroadcast(context, timerObj.mTimerId,
- new Intent(Timers.NOTIF_TIMES_UP_STOP)
- .putExtra(Timers.TIMER_INTENT_EXTRA, timerObj.mTimerId),
- PendingIntent.FLAG_UPDATE_CURRENT);
-
- // Notification creation
- final NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
- .setContentIntent(contentIntent)
- .addAction(R.drawable.ic_add_24dp,
- context.getResources().getString(R.string.timer_plus_1_min),
- addOneMinuteAction)
- .addAction(
- timerObj.getDeleteAfterUse()
- ? android.R.drawable.ic_menu_close_clear_cancel
- : R.drawable.ic_stop_24dp,
- timerObj.getDeleteAfterUse()
- ? context.getResources().getString(R.string.timer_done)
- : context.getResources().getString(R.string.timer_stop),
- stopIntent)
- .setContentTitle(timerObj.getLabelOrDefault(context))
- .setContentText(context.getResources().getString(R.string.timer_times_up))
- .setSmallIcon(R.drawable.stat_notify_timer)
- .setOngoing(true)
- .setAutoCancel(false)
- .setPriority(NotificationCompat.PRIORITY_MAX)
- .setDefaults(NotificationCompat.DEFAULT_LIGHTS)
- .setWhen(0);
-
- // Send the notification using the timer's id to identify the
- // correct notification
- NotificationManagerCompat.from(context).notify(timerObj.mTimerId, builder.build());
- if (Timers.LOGGING) {
- Log.v(TAG, "Setting times-up notification for "
- + timerObj.getLabelOrDefault(context) + " #" + timerObj.mTimerId);
- }
- }
-
- private void cancelTimesUpNotification(final Context context) {
- for (TimerObj timerObj : Timers.timersInTimesUp(mTimers) ) {
- cancelTimesUpNotification(context, timerObj);
- }
- }
-
- private void cancelTimesUpNotification(final Context context, TimerObj timerObj) {
- NotificationManagerCompat.from(context).cancel(timerObj.mTimerId);
- if (Timers.LOGGING) {
- Log.v(TAG, "Canceling times-up notification for "
- + timerObj.getLabelOrDefault(context) + " #" + timerObj.mTimerId);
- }
- }
-}
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/timer/TimerService.java b/src/com/android/deskclock/timer/TimerService.java
new file mode 100644
index 0000000..de82b50
--- /dev/null
+++ b/src/com/android/deskclock/timer/TimerService.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2015 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.timer;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.os.IBinder;
+
+import com.android.deskclock.HandleDeskClockApiCalls;
+import com.android.deskclock.R;
+import com.android.deskclock.data.DataModel;
+import com.android.deskclock.data.Timer;
+import com.android.deskclock.events.Events;
+
+/**
+ * <p>This service exists solely to allow {@link android.app.AlarmManager} and timer notifications
+ * to alter the state of timers without disturbing the notification shade. If an activity were used
+ * instead (even one that is not displayed) the notification manager implicitly closes the
+ * notification shade which clashes with the use case of starting/pausing/resetting timers without
+ * disturbing the notification shade.</p>
+ *
+ * <p>The service has a second benefit. It is used to start heads-up notifications for expired
+ * timers in the foreground. This keeps the entire application in the foreground and thus prevents
+ * the operating system from killing it while expired timers are firing.</p>
+ */
+public final class TimerService extends Service {
+
+ private static final String ACTION_PREFIX = "com.android.deskclock.action.";
+
+ private static final String ACTION_TIMER_EXPIRED = ACTION_PREFIX + "TIMER_EXPIRED";
+ private static final String ACTION_UPDATE_NOTIFICATION = ACTION_PREFIX + "UPDATE_NOTIFICATION";
+ private static final String ACTION_RESET_EXPIRED_TIMERS = ACTION_PREFIX +
+ "RESET_EXPIRED_TIMERS";
+ private static final String ACTION_RESET_UNEXPIRED_TIMERS = ACTION_PREFIX +
+ "RESET_UNEXPIRED_TIMERS";
+
+ public static Intent createTimerExpiredIntent(Context context, Timer timer) {
+ final int timerId = timer == null ? -1 : timer.getId();
+ return new Intent(context, TimerService.class)
+ .setAction(ACTION_TIMER_EXPIRED)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID, timerId);
+ }
+
+ public static Intent createResetExpiredTimersIntent(Context context) {
+ return new Intent(context, TimerService.class)
+ .setAction(ACTION_RESET_EXPIRED_TIMERS);
+ }
+
+ public static Intent createResetUnexpiredTimersIntent(Context context) {
+ return new Intent(context, TimerService.class)
+ .setAction(ACTION_RESET_UNEXPIRED_TIMERS);
+ }
+
+ public static Intent createAddMinuteTimerIntent(Context context, int timerId) {
+ return new Intent(context, TimerService.class)
+ .setAction(HandleDeskClockApiCalls.ACTION_ADD_MINUTE_TIMER)
+ .putExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID, timerId);
+ }
+
+ public static Intent createUpdateNotificationIntent(Context context) {
+ return new Intent(context, TimerService.class)
+ .setAction(ACTION_UPDATE_NOTIFICATION);
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ try {
+ switch (intent.getAction()) {
+ case ACTION_UPDATE_NOTIFICATION: {
+ DataModel.getDataModel().updateTimerNotification();
+ return START_NOT_STICKY;
+ }
+ case ACTION_RESET_EXPIRED_TIMERS: {
+ DataModel.getDataModel().resetExpiredTimers(R.string.label_notification);
+ return START_NOT_STICKY;
+ }
+ case ACTION_RESET_UNEXPIRED_TIMERS: {
+ DataModel.getDataModel().resetUnexpiredTimers(R.string.label_notification);
+ return START_NOT_STICKY;
+ }
+ }
+
+ // Look up the timer in question.
+ final int timerId = intent.getIntExtra(HandleDeskClockApiCalls.EXTRA_TIMER_ID, -1);
+ final Timer timer = DataModel.getDataModel().getTimer(timerId);
+
+ // If the timer cannot be located, ignore the action.
+ if (timer == null) {
+ return START_NOT_STICKY;
+ }
+
+ // Perform the action on the timer.
+ switch (intent.getAction()) {
+ case HandleDeskClockApiCalls.ACTION_START_TIMER:
+ DataModel.getDataModel().startTimer(timer);
+ Events.sendTimerEvent(R.string.action_start, R.string.label_notification);
+ break;
+ case HandleDeskClockApiCalls.ACTION_PAUSE_TIMER:
+ DataModel.getDataModel().pauseTimer(timer);
+ Events.sendTimerEvent(R.string.action_pause, R.string.label_notification);
+ break;
+ case HandleDeskClockApiCalls.ACTION_ADD_MINUTE_TIMER:
+ DataModel.getDataModel().addTimerMinute(timer);
+ Events.sendTimerEvent(R.string.action_add_minute, R.string.label_notification);
+ break;
+ case HandleDeskClockApiCalls.ACTION_RESET_TIMER:
+ DataModel.getDataModel().resetOrDeleteTimer(timer, R.string.label_notification);
+ break;
+ case ACTION_TIMER_EXPIRED:
+ DataModel.getDataModel().expireTimer(this, timer);
+ Events.sendTimerEvent(R.string.action_fire, R.string.label_intent);
+ break;
+ }
+ } finally {
+ // This service is foreground when expired timers exist and stopped when none exist.
+ if (DataModel.getDataModel().getExpiredTimers().isEmpty()) {
+ stopSelf();
+ }
+ }
+
+ return START_NOT_STICKY;
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/timer/TimerSetupView.java b/src/com/android/deskclock/timer/TimerSetupView.java
new file mode 100644
index 0000000..d854379
--- /dev/null
+++ b/src/com/android/deskclock/timer/TimerSetupView.java
@@ -0,0 +1,258 @@
+/*
+ * 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.timer;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Color;
+import android.text.format.DateUtils;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import com.android.deskclock.AnimatorUtils;
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+
+import java.io.Serializable;
+import java.util.Arrays;
+
+public class TimerSetupView extends LinearLayout implements Button.OnClickListener,
+ Button.OnLongClickListener {
+
+ private final Button[] mNumbers = new Button[10];
+ private final int[] mInput = new int[6];
+ private int mInputPointer = -1;
+ private ImageView mCreate;
+ private ImageButton mDelete;
+ private TimerView mEnteredTime;
+ private View mDivider;
+
+ private final int mColorAccent;
+ private final int mColorHairline;
+
+ private final AnimatorListenerAdapter mHideCreateListener = new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mCreate.setScaleX(1);
+ mCreate.setScaleY(1);
+ mCreate.setVisibility(INVISIBLE);
+ }
+ };
+
+ private final AnimatorListenerAdapter mShowCreateListener = new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mCreate.setVisibility(VISIBLE);
+ }
+ };
+
+ public TimerSetupView(Context context) {
+ this(context, null /* attrs */);
+ }
+
+ public TimerSetupView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ mColorAccent = Utils.obtainStyledColor(context, R.attr.colorAccent, Color.RED);
+ mColorHairline = context.getResources().getColor(R.color.hairline);
+
+ LayoutInflater.from(context).inflate(R.layout.time_setup_view, this);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ final View v1 = findViewById(R.id.first);
+ final View v2 = findViewById(R.id.second);
+ final View v3 = findViewById(R.id.third);
+ final View v4 = findViewById(R.id.fourth);
+
+ mDivider = findViewById(R.id.divider);
+ mCreate = (ImageView) findViewById(R.id.timer_create);
+ mDelete = (ImageButton) findViewById(R.id.delete);
+ mDelete.setOnClickListener(this);
+ mDelete.setOnLongClickListener(this);
+ mEnteredTime = (TimerView) findViewById(R.id.timer_time_text);
+
+ mNumbers[1] = (Button) v1.findViewById(R.id.key_left);
+ mNumbers[2] = (Button) v1.findViewById(R.id.key_middle);
+ mNumbers[3] = (Button) v1.findViewById(R.id.key_right);
+
+ mNumbers[4] = (Button) v2.findViewById(R.id.key_left);
+ mNumbers[5] = (Button) v2.findViewById(R.id.key_middle);
+ mNumbers[6] = (Button) v2.findViewById(R.id.key_right);
+
+ mNumbers[7] = (Button) v3.findViewById(R.id.key_left);
+ mNumbers[8] = (Button) v3.findViewById(R.id.key_middle);
+ mNumbers[9] = (Button) v3.findViewById(R.id.key_right);
+
+ mNumbers[0] = (Button) v4.findViewById(R.id.key_middle);
+ v4.findViewById(R.id.key_left).setVisibility(INVISIBLE);
+ v4.findViewById(R.id.key_right).setVisibility(INVISIBLE);
+
+ for (int i = 0; i < mNumbers.length; i++) {
+ mNumbers[i].setOnClickListener(this);
+ mNumbers[i].setText(String.valueOf(i));
+ mNumbers[i].setTextColor(Color.WHITE);
+ mNumbers[i].setTag(R.id.numbers_key, i);
+ }
+
+ reset();
+ }
+
+ @Override
+ public void onClick(View v) {
+ final Integer n = (Integer) v.getTag(R.id.numbers_key);
+ // A number was pressed
+ if (n != null) {
+ // pressing "0" as the first digit does nothing
+ if (mInputPointer == -1 && n == 0) {
+ return;
+ }
+
+ // No space for more digits, so ignore input.
+ if (mInputPointer == mInput.length - 1) {
+ return;
+ }
+
+ // Append the new digit.
+ System.arraycopy(mInput, 0, mInput, 1, mInputPointer + 1);
+ mInput[0] = n;
+ mInputPointer++;
+ updateTime();
+
+ // Update talkback to read the number being deleted
+ final Resources resources = getResources();
+ final String cd = resources.getString(R.string.timer_descriptive_delete, n.toString());
+ mDelete.setContentDescription(cd);
+ }
+
+ // other keys
+ if (v == mDelete) {
+ if (mInputPointer < 0) {
+ // Nothing exists to delete so return.
+ return;
+ }
+
+ System.arraycopy(mInput, 1, mInput, 0, mInputPointer);
+ mInput[mInputPointer] = 0;
+ mInputPointer--;
+ updateTime();
+
+ // Update talkback to read the number being deleted or its original description.
+ final String number = mInputPointer < 0 ? "" : Integer.toString(mInput[mInputPointer]);
+ final String cd = getResources().getString(R.string.timer_descriptive_delete, number);
+ mDelete.setContentDescription(cd);
+ }
+
+ updateStartButton();
+ updateDeleteButtonAndDivider();
+ }
+
+ @Override
+ public boolean onLongClick(View v) {
+ if (v == mDelete) {
+ reset();
+ updateStartButton();
+ return true;
+ }
+ return false;
+ }
+
+ public void reset() {
+ for (int i = 0; i < mInput.length; i ++) {
+ mInput[i] = 0;
+ }
+ mInputPointer = -1;
+ updateTime();
+ updateDeleteButtonAndDivider();
+ mCreate.setVisibility(INVISIBLE);
+ }
+
+ public long getTimeInMillis() {
+ final int hoursInSeconds = mInput[5] * 36000 + mInput[4] * 3600;
+ final int minutesInSeconds = mInput[3] * 600 + mInput[2] * 60;
+ final int seconds = mInput[1] * 10 + mInput[0];
+ final int totalSeconds = hoursInSeconds + minutesInSeconds + seconds;
+
+ return totalSeconds * DateUtils.SECOND_IN_MILLIS;
+ }
+
+ /**
+ * @return an opaque representation of the state of timer setup
+ */
+ public Serializable getState() {
+ return Arrays.copyOf(mInput, mInput.length);
+ }
+
+ /**
+ * @param state an opaque state of this view previously produced by {@link #getState()}
+ */
+ public void setState(Serializable state) {
+ final int[] input = (int[]) state;
+ if (input != null && mInput.length == input.length) {
+ for (int i = 0; i < mInput.length; i++) {
+ mInput[i] = input[i];
+ if (mInput[i] != 0) {
+ mInputPointer = i;
+ }
+ }
+ updateTime();
+ updateDeleteButtonAndDivider();
+ mCreate.setVisibility(getInputExists() ? VISIBLE : INVISIBLE);
+ }
+ }
+
+ private void updateTime() {
+ final int seconds = mInput[1] * 10 + mInput[0];
+ mEnteredTime.setTime(mInput[5], mInput[4], mInput[3], mInput[2], seconds);
+ }
+
+ private void updateStartButton() {
+ final boolean show = getInputExists();
+ final int finalVisibility = show ? VISIBLE : INVISIBLE;
+ if (mCreate.getVisibility() == finalVisibility) {
+ // Fab is not initialized yet or already shown/hidden
+ return;
+ }
+
+ final int from = show ? 0 : 1;
+ final int to = show ? 1 : 0;
+ final Animator scaleAnimator = AnimatorUtils.getScaleAnimator(mCreate, from, to);
+ scaleAnimator.setDuration(AnimatorUtils.ANIM_DURATION_SHORT);
+ scaleAnimator.addListener(show ? mShowCreateListener : mHideCreateListener);
+ scaleAnimator.start();
+ }
+
+ private void updateDeleteButtonAndDivider() {
+ final boolean enabled = getInputExists();
+ mDelete.setEnabled(enabled);
+ mDivider.setBackgroundColor(enabled ? mColorAccent : mColorHairline);
+ }
+
+ private boolean getInputExists() {
+ return mInputPointer != -1;
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/deskclock/timer/TimerView.java b/src/com/android/deskclock/timer/TimerView.java
index 2dc4015..3fde57b 100644
--- a/src/com/android/deskclock/timer/TimerView.java
+++ b/src/com/android/deskclock/timer/TimerView.java
@@ -29,8 +29,8 @@
public class TimerView extends LinearLayout {
- private TextView mHoursOnes, mMinutesOnes;
- private TextView mMinutesTens;
+ private TextView mHoursTens, mHoursOnes;
+ private TextView mMinutesTens, mMinutesOnes;
private TextView mSeconds;
private final Typeface mAndroidClockMonoThin;
private Typeface mOriginalHoursTypeface;
@@ -48,7 +48,7 @@
mAndroidClockMonoThin =
Typeface.createFromAsset(context.getAssets(), "fonts/AndroidClockMono-Thin.ttf");
- Resources resources = context.getResources();
+ final Resources resources = context.getResources();
mWhiteColor = resources.getColor(R.color.clock_white);
mGrayColor = resources.getColor(R.color.clock_gray);
}
@@ -57,22 +57,19 @@
protected void onFinishInflate() {
super.onFinishInflate();
+ mHoursTens = (TextView) findViewById(R.id.hours_tens);
+
mHoursOnes = (TextView) findViewById(R.id.hours_ones);
- if (mHoursOnes != null) {
- mOriginalHoursTypeface = mHoursOnes.getTypeface();
- }
+ mOriginalHoursTypeface = mHoursOnes.getTypeface();
+
mMinutesTens = (TextView) findViewById(R.id.minutes_tens);
- if (mHoursOnes != null && mMinutesTens != null) {
- addStartPadding(mMinutesTens);
- }
+ addStartPadding(mMinutesTens);
+
mMinutesOnes = (TextView) findViewById(R.id.minutes_ones);
- if (mMinutesOnes != null) {
- mOriginalMinutesTypeface = mMinutesOnes.getTypeface();
- }
+ mOriginalMinutesTypeface = mMinutesOnes.getTypeface();
+
mSeconds = (TextView) findViewById(R.id.seconds);
- if (mSeconds != null) {
- addStartPadding(mSeconds);
- }
+ addStartPadding(mSeconds);
}
/**
@@ -99,46 +96,48 @@
textView.setPadding((int) (gapPadding * widths[largest]), 0, 0, 0);
}
-
- public void setTime(int hoursOnesDigit, int minutesTensDigit,
+ public void setTime(int hoursTensDigit, int hoursOnesDigit, int minutesTensDigit,
int minutesOnesDigit, int seconds) {
- if (mHoursOnes != null) {
- if (hoursOnesDigit == -1) {
- mHoursOnes.setText("-");
- mHoursOnes.setTypeface(mAndroidClockMonoThin);
- mHoursOnes.setTextColor(mGrayColor);
- } else {
- mHoursOnes.setText(String.format("%d", hoursOnesDigit));
- mHoursOnes.setTypeface(mOriginalHoursTypeface);
- mHoursOnes.setTextColor(mWhiteColor);
- }
+ if (hoursTensDigit == -1) {
+ mHoursTens.setText("-");
+ mHoursTens.setTypeface(mAndroidClockMonoThin);
+ mHoursTens.setTextColor(mGrayColor);
+ } else {
+ mHoursTens.setText(String.valueOf(hoursTensDigit));
+ mHoursTens.setTypeface(mOriginalHoursTypeface);
+ mHoursTens.setTextColor(mWhiteColor);
}
- if (mMinutesTens != null) {
- if (minutesTensDigit == -1) {
- mMinutesTens.setText("-");
- mMinutesTens.setTypeface(mAndroidClockMonoThin);
- mMinutesTens.setTextColor(mGrayColor);
- } else {
- mMinutesTens.setText(String.format("%d", minutesTensDigit));
- mMinutesTens.setTypeface(mOriginalMinutesTypeface);
- mMinutesTens.setTextColor(mWhiteColor);
- }
- }
- if (mMinutesOnes != null) {
- if (minutesOnesDigit == -1) {
- mMinutesOnes.setText("-");
- mMinutesOnes.setTypeface(mAndroidClockMonoThin);
- mMinutesOnes.setTextColor(mGrayColor);
- } else {
- mMinutesOnes.setText(String.format("%d", minutesOnesDigit));
- mMinutesOnes.setTypeface(mOriginalMinutesTypeface);
- mMinutesOnes.setTextColor(mWhiteColor);
- }
+ if (hoursOnesDigit == -1) {
+ mHoursOnes.setText("-");
+ mHoursOnes.setTypeface(mAndroidClockMonoThin);
+ mHoursOnes.setTextColor(mGrayColor);
+ } else {
+ mHoursOnes.setText(String.valueOf(hoursOnesDigit));
+ mHoursOnes.setTypeface(mOriginalHoursTypeface);
+ mHoursOnes.setTextColor(mWhiteColor);
}
- if (mSeconds != null) {
- mSeconds.setText(String.format("%02d", seconds));
+ if (minutesTensDigit == -1) {
+ mMinutesTens.setText("-");
+ mMinutesTens.setTypeface(mAndroidClockMonoThin);
+ mMinutesTens.setTextColor(mGrayColor);
+ } else {
+ mMinutesTens.setText(String.valueOf(minutesTensDigit));
+ mMinutesTens.setTypeface(mOriginalMinutesTypeface);
+ mMinutesTens.setTextColor(mWhiteColor);
}
+
+ if (minutesOnesDigit == -1) {
+ mMinutesOnes.setText("-");
+ mMinutesOnes.setTypeface(mAndroidClockMonoThin);
+ mMinutesOnes.setTextColor(mGrayColor);
+ } else {
+ mMinutesOnes.setText(String.valueOf(minutesOnesDigit));
+ mMinutesOnes.setTypeface(mOriginalMinutesTypeface);
+ mMinutesOnes.setTextColor(mWhiteColor);
+ }
+
+ mSeconds.setText(String.format("%02d", seconds));
}
}
diff --git a/src/com/android/deskclock/timer/Timers.java b/src/com/android/deskclock/timer/Timers.java
deleted file mode 100644
index 0b0c99f..0000000
--- a/src/com/android/deskclock/timer/Timers.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2012 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.timer;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-public class Timers {
- // Logging shared by TimerReceiver and TimerAlertFullScreen
- public static final boolean LOGGING = true;
-
- // Private actions processed by the receiver
- public static final String START_TIMER = "start_timer";
- public static final String STOP_TIMER = "stop_timer";
- public static final String DELETE_TIMER = "delete_timer";
- public static final String RESET_TIMER = "reset_timer";
- public static final String TIMES_UP = "times_up";
- public static final String TIMER_DONE = "timer_done";
- public static final String TIMER_UPDATE = "timer_update";
-
- public static final String TIMER_INTENT_EXTRA = "timer.intent.extra";
-
- public static final String UPDATE_NEXT_TIMESUP = "timer_update_next_timesup";
-
- public static final String NOTIF_IN_USE_SHOW = "notif_in_use_show";
- public static final String NOTIF_IN_USE_CANCEL = "notif_in_use_cancel";
- public static final String NOTIF_APP_OPEN = "notif_app_open";
- public static final String NOTIF_TIMES_UP_STOP = "notif_times_up_stop";
- public static final String NOTIF_TIMES_UP_PLUS_ONE = "notif_times_up_plus_one";
- public static final String NOTIF_TIMES_UP_SHOW = "notif_times_up_show";
- public static final String NOTIF_TIMES_UP_CANCEL = "notif_times_up_cancel";
- public static final String FIRST_LAUNCH_FROM_API_CALL = "first_launch_from_api_call";
- public static final String SCROLL_TO_TIMER_ID = "scroll_to_timer_id";
-
- public static final String TIMESUP_MODE = "times_up";
-
- /**
- * Key to a shared preference that forces Timer user interfaces to refresh in order to reflect
- * changes in the database.
- */
- public static final String REFRESH_UI_WITH_LATEST_DATA = "refresh_ui_with_latest_data";
-
- public static TimerObj findTimer(ArrayList<TimerObj> timers, int timerId) {
- for (TimerObj t : timers) {
- if (t.mTimerId == timerId) {
- return t;
- }
- }
- return null;
- }
-
- public static TimerObj findExpiredTimer(ArrayList<TimerObj> timers) {
- for (TimerObj t : timers) {
- if (t.mState == TimerObj.STATE_TIMESUP) {
- return t;
- }
- }
- return null;
- }
-
- public static ArrayList<TimerObj> timersInUse(ArrayList<TimerObj> timers) {
- final ArrayList<TimerObj> result = new ArrayList<>(timers);
- for (Iterator<TimerObj> it = result.iterator(); it.hasNext();) {
- if (!it.next().isInUse()) {
- it.remove();
- }
- }
- return result;
- }
-
- public static ArrayList<TimerObj> timersInTimesUp(ArrayList<TimerObj> timers) {
- final ArrayList<TimerObj> result = new ArrayList<>(timers);
- for (Iterator<TimerObj> it = result.iterator(); it.hasNext();) {
- if (it.next().mState != TimerObj.STATE_TIMESUP) {
- it.remove();
- }
- }
- return result;
- }
-}
diff --git a/src/com/android/deskclock/widget/ActionableToastBar.java b/src/com/android/deskclock/widget/ActionableToastBar.java
deleted file mode 100644
index 5f0139e..0000000
--- a/src/com/android/deskclock/widget/ActionableToastBar.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (C) 2012 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.widget;
-
-import android.animation.Animator;
-import android.animation.AnimatorInflater;
-import android.animation.AnimatorListenerAdapter;
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.FrameLayout;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.deskclock.R;
-
-/**
- * A custom {@link View} that exposes an action to the user.
- * <p>
- * This is a copy of packages/apps/UnifiedEmail/src/com/android/mail/ui/ActionableToastBar.java
- * with minor modifications.
- */
-public class ActionableToastBar extends LinearLayout {
- private boolean mHidden = false;
- private Animator mShowAnimation;
- private Animator mHideAnimation;
- private final int mBottomMarginSizeInConversation;
-
- /** The clickable view */
- private View mActionButton;
- /** The view that contains the description. */
- private TextView mActionDescriptionView;
- /** The view that contains the text for the action button. */
- private TextView mActionText;
- //private ToastBarOperation mOperation;
-
- public ActionableToastBar(Context context) {
- this(context, null);
- }
-
- public ActionableToastBar(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public ActionableToastBar(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- mBottomMarginSizeInConversation = context.getResources().getDimensionPixelSize(
- R.dimen.toast_bar_bottom_margin_in_conversation);
- LayoutInflater.from(context).inflate(R.layout.actionable_toast_row, this, true);
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
-
- mActionDescriptionView = (TextView) findViewById(R.id.description_text);
- mActionButton = findViewById(R.id.action_button);
- mActionText = (TextView) findViewById(R.id.action_text);
- }
-
- /**
- * Tells the view that it will be appearing in the conversation pane
- * and should adjust its layout parameters accordingly.
- * @param isInConversationMode true if the view will be shown in the conversation view
- */
- public void setConversationMode(boolean isInConversationMode) {
- final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) getLayoutParams();
- params.bottomMargin = isInConversationMode ? mBottomMarginSizeInConversation : 0;
- setLayoutParams(params);
- }
-
- /**
- * Displays the toast bar and makes it visible. Allows the setting of
- * parameters to customize the display.
- * @param listener performs some action when the action button is clicked
- * @param descriptionIconResourceId resource ID for the description icon or
- * 0 if no icon should be shown
- * @param descriptionText a description text to show in the toast bar
- * @param showActionIcon if true, the action button icon should be shown
- * @param actionTextResource resource ID for the text to show in the action button
- * @param replaceVisibleToast if true, this toast should replace any currently visible toast.
- * Otherwise, skip showing this toast.
- */
- public void show(final ActionClickedListener listener, int descriptionIconResourceId,
- CharSequence descriptionText, boolean showActionIcon, int actionTextResource,
- boolean replaceVisibleToast) {
-
- if (!mHidden && !replaceVisibleToast) {
- return;
- }
-
- mActionButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View widget) {
- if (listener != null) {
- listener.onActionClicked();
- }
- hide(true);
- }
- });
-
- mActionDescriptionView.setText(descriptionText);
- mActionText.setText(actionTextResource);
-
- mHidden = false;
- getShowAnimation().start();
- }
-
- /**
- * Hides the view and resets the state.
- */
- public void hide(boolean animate) {
- // Prevent multiple call to hide.
- // Also prevent hiding if show animation is going on.
- if (!mHidden && !getShowAnimation().isRunning()) {
- mHidden = true;
- if (getVisibility() == View.VISIBLE) {
- mActionDescriptionView.setText("");
- mActionButton.setOnClickListener(null);
- // Hide view once it's clicked.
- if (animate) {
- getHideAnimation().start();
- } else {
- setAlpha(0);
- setVisibility(View.GONE);
- }
- }
- }
- }
-
- private Animator getShowAnimation() {
- if (mShowAnimation == null) {
- mShowAnimation = AnimatorInflater.loadAnimator(getContext(), R.animator.fade_in);
- mShowAnimation.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- setVisibility(View.VISIBLE);
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- // There is a tiny change that and hide animation could have finished right
- // before the show animation finished. In that case, the hide will mark the
- // view as GONE. We need to make sure the last one wins.
- setVisibility(View.VISIBLE);
- }
- });
- mShowAnimation.setTarget(this);
- }
- return mShowAnimation;
- }
-
- private Animator getHideAnimation() {
- if (mHideAnimation == null) {
- mHideAnimation = AnimatorInflater.loadAnimator(getContext(), R.animator.fade_out);
- mHideAnimation.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- setVisibility(View.GONE);
- }
- });
- mHideAnimation.setTarget(this);
- }
- return mHideAnimation;
- }
-
- public boolean isEventInToastBar(MotionEvent event) {
- if (!isShown()) {
- return false;
- }
- int[] xy = new int[2];
- float x = event.getX();
- float y = event.getY();
- getLocationOnScreen(xy);
- return (x > xy[0] && x < (xy[0] + getWidth()) && y > xy[1] && y < xy[1] + getHeight());
- }
-
- /**
- * Classes that wish to perform some action when the action button is clicked
- * should implement this interface.
- */
- public interface ActionClickedListener {
- public void onActionClicked();
- }
-}
diff --git a/src/com/android/deskclock/widget/EmptyViewController.java b/src/com/android/deskclock/widget/EmptyViewController.java
new file mode 100644
index 0000000..4a21999
--- /dev/null
+++ b/src/com/android/deskclock/widget/EmptyViewController.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2015 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.widget;
+
+import android.transition.Fade;
+import android.transition.Transition;
+import android.transition.TransitionManager;
+import android.transition.TransitionSet;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.deskclock.Utils;
+
+/**
+ * Controller that displays empty view and handles animation appropriately.
+ */
+public final class EmptyViewController {
+
+ private static final int ANIMATION_DURATION = 300;
+ private static final boolean USE_TRANSITION_FRAMEWORK = Utils.isLOrLater();
+
+ private final Transition mEmptyViewTransition;
+ private final ViewGroup mMainLayout;
+ private final View mContentView;
+ private final View mEmptyView;
+ private boolean mIsEmpty;
+
+ /**
+ * Constructor of the controller.
+ *
+ * @param contentView The view that should be displayed when empty view is hidden.
+ * @param emptyView The view that should be displayed when main view is empty.
+ */
+ public EmptyViewController(ViewGroup mainLayout, View contentView, View emptyView) {
+ mMainLayout = mainLayout;
+ mContentView = contentView;
+ mEmptyView = emptyView;
+ if (USE_TRANSITION_FRAMEWORK) {
+ mEmptyViewTransition = new TransitionSet()
+ .setOrdering(TransitionSet.ORDERING_SEQUENTIAL)
+ .addTarget(contentView)
+ .addTarget(emptyView)
+ .addTransition(new Fade(Fade.OUT))
+ .addTransition(new Fade(Fade.IN))
+ .setDuration(ANIMATION_DURATION);
+ } else {
+ mEmptyViewTransition = null;
+ }
+ }
+
+ /**
+ * Sets the state for the controller. If it's empty, it will display the empty view.
+ *
+ * @param isEmpty Whether or not the controller should transition into empty state.
+ */
+ public void setEmpty(boolean isEmpty) {
+ if (mIsEmpty == isEmpty) {
+ return;
+ }
+ mIsEmpty = isEmpty;
+ // State changed, perform transition.
+ if (USE_TRANSITION_FRAMEWORK) {
+ TransitionManager.beginDelayedTransition(mMainLayout, mEmptyViewTransition);
+ }
+ mEmptyView.setVisibility(mIsEmpty ? View.VISIBLE : View.GONE);
+ mContentView.setVisibility(mIsEmpty ? View.GONE : View.VISIBLE);
+ }
+}
diff --git a/src/com/android/deskclock/widget/RtlViewPager.java b/src/com/android/deskclock/widget/RtlViewPager.java
new file mode 100644
index 0000000..fc2f43e
--- /dev/null
+++ b/src/com/android/deskclock/widget/RtlViewPager.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2015 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.widget;
+
+import android.content.Context;
+import android.support.v4.view.ViewPager;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.view.View;
+
+import java.util.Locale;
+
+/**
+ * A {@link ViewPager} that's aware of RTL changes when used with FragmentPagerAdapter.
+ */
+public final class RtlViewPager extends ViewPager {
+
+ /**
+ * Callback interface for responding to changing state of the selected page.
+ * Positions supplied will always be the logical position in the adapter -
+ * that is, the 0 index corresponds to the left-most page in LTR and the
+ * right-most page in RTL.
+ */
+ private OnPageChangeListener mListener;
+
+ public RtlViewPager(Context context) {
+ this(context, null /* attrs */);
+ }
+
+ public RtlViewPager(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
+ @Override
+ public void onPageScrolled(int position, float offset, int offsetPixels) {
+ // Do nothing
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ if (mListener != null) {
+ mListener.onPageSelected(getRtlAwareIndex(position));
+ }
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ // Do nothing
+ }
+ });
+ }
+
+ @Override
+ public int getCurrentItem() {
+ return getRtlAwareIndex(super.getCurrentItem());
+ }
+
+ @Override
+ public void setCurrentItem(int item) {
+ super.setCurrentItem(getRtlAwareIndex(item));
+ }
+
+ @Override
+ public void setOnPageChangeListener(OnPageChangeListener unused) {
+ throw new UnsupportedOperationException("Use setOnRTLPageChangeListener instead");
+ }
+
+ /**
+ * Get a "RTL friendly" index. If the locale is LTR, the index is returned as is.
+ * Otherwise it's transformed so view pager can render views using the new index for RTL. For
+ * example, the second view will be rendered to the left of first view.
+ *
+ * @param index The logical index.
+ */
+ public int getRtlAwareIndex(int index) {
+ if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) ==
+ View.LAYOUT_DIRECTION_RTL) {
+ return getAdapter().getCount() - index - 1;
+ }
+ return index;
+ }
+
+ /**
+ * Sets a {@link OnPageChangeListener}. The listener will be called when a page is selected.
+ */
+ public void setOnRTLPageChangeListener(OnPageChangeListener listener) {
+ mListener = listener;
+ }
+}
diff --git a/src/com/android/deskclock/widget/TextTime.java b/src/com/android/deskclock/widget/TextTime.java
index ecc945a..ff90a55 100644
--- a/src/com/android/deskclock/widget/TextTime.java
+++ b/src/com/android/deskclock/widget/TextTime.java
@@ -140,8 +140,8 @@
resolver.unregisterContentObserver(mFormatChangeObserver);
}
- public void setFormat(Context context, int amPmFontSize) {
- setFormat12Hour(Utils.get12ModeFormat(context, amPmFontSize));
+ public void setFormat(Context context) {
+ setFormat12Hour(Utils.get12ModeFormat(context, true /* showAmPm */));
setFormat24Hour(Utils.get24ModeFormat());
}
diff --git a/src/com/android/deskclock/widget/selector/AlarmSelectionAdapter.java b/src/com/android/deskclock/widget/selector/AlarmSelectionAdapter.java
index fa8ce56..fa792c7 100644
--- a/src/com/android/deskclock/widget/selector/AlarmSelectionAdapter.java
+++ b/src/com/android/deskclock/widget/selector/AlarmSelectionAdapter.java
@@ -26,6 +26,7 @@
import com.android.deskclock.provider.Alarm;
import com.android.deskclock.widget.TextTime;
+import java.util.Calendar;
import java.util.List;
public class AlarmSelectionAdapter extends ArrayAdapter<AlarmSelection> {
@@ -47,8 +48,7 @@
final Alarm alarm = selection.getAlarm();
final TextTime alarmTime = (TextTime) row.findViewById(R.id.digital_clock);
- alarmTime.setFormat(context,
- context.getResources().getDimensionPixelSize(R.dimen.alarm_label_size));
+ alarmTime.setFormat(context);
alarmTime.setTime(alarm.hour, alarm.minutes);
final TextView alarmLabel = (TextView) row.findViewById(R.id.label);
@@ -57,7 +57,7 @@
// find days when alarm is firing
final String daysOfWeek;
if (!alarm.daysOfWeek.isRepeating()) {
- daysOfWeek = Alarm.isTomorrow(alarm) ?
+ daysOfWeek = Alarm.isTomorrow(alarm, Calendar.getInstance()) ?
context.getResources().getString(R.string.alarm_tomorrow) :
context.getResources().getString(R.string.alarm_today);
} else {
diff --git a/src/com/android/deskclock/widget/sgv/GridAdapter.java b/src/com/android/deskclock/widget/sgv/GridAdapter.java
deleted file mode 100644
index 9251574..0000000
--- a/src/com/android/deskclock/widget/sgv/GridAdapter.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All Rights Reserved.
- */
-
-package com.android.deskclock.widget.sgv;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-
-import com.android.deskclock.widget.sgv.ReorderUtils;
-
-/**
- * Adapter for use with {@link StaggeredGridView}. Copied from Keep.
- * TODO: Keep up to date with fixes to their code; if they move into a shared library, use that.
- */
-public abstract class GridAdapter extends BaseAdapter {
- /**
- * A tag key which stores the id of the associated object. If set, this
- * allows for faster creation of views.
- */
- private static final int GRID_ID_TAG = "gridIdTag".hashCode();
- private View mHeaderView;
- private View mFooterView;
-
- public GridAdapter() {
- super();
- }
-
- /**
- * Checks to see if the child at the specified position is draggable
- * @param position The position of the child to check against
- * @return boolean If true, the child at the specified position is draggable.
- */
- public boolean isDraggable(int position) {
- return false;
- }
-
- /**
- * For a view at the specified position, return the region around the view that is a possible
- * reordering area.
- * @param position The adapter position
- * @param isLastColumnInGrid Flag to indicate whether the view at the specified position is
- * laid out at the last column in the grid. Being in the last column has some UI implications
- * when it comes to reordering. As an example, if a view has reordering area set to Left, and
- * is laid out in the last column, the grid may also choose to enable the right reordering area
- * for this view as well so that the user has the convenience have dropping views on the right
- * edge of the grid to re-order.
- * @return int The re-ordering area for the view at this adapter position.
- * Possible return values are a combination of
- * {@link ReorderUtils#REORDER_AREA_NONE}, {@link ReorderUtils#REORDER_AREA_VALID}
- */
- public int getReorderingArea(int position, boolean isLastColumnInGrid) {
- return ReorderUtils.REORDER_AREA_NONE;
- }
-
- /**
- * The direction for drag to reorder that is allowed. By default, the allowed direction
- * is free across both horizontal and vertical axes.
- * @return int The allowed direction for drag to reorder. Possible return values are a
- * combination of {@link ReorderUtils#REORDER_DIRECTION_VERTICAL} and/or
- * {@link ReorderUtils#REORDER_DIRECTION_HORIZONTAL}
- */
- public int getReorderingDirection() {
- return ReorderUtils.REORDER_DIRECTION_VERTICAL | ReorderUtils.REORDER_DIRECTION_HORIZONTAL;
- }
-
- public View getHeaderView() {
- return mHeaderView;
- }
-
- public void setHeaderView(View view) {
- mHeaderView = view;
- }
-
- public View getFooterView() {
- return mFooterView;
- }
-
- public void setFooterView(View view) {
- mFooterView = view;
- }
-
- public boolean hasHeader() {
- return mHeaderView != null;
- }
-
- public boolean hasFooter() {
- return mFooterView != null;
- }
-
- /**
- * Views created via the GridAdapter or any subclasses should call this to
- * store the id of the item associated with them.
- */
- public void setItemId(View view, long id) {
- view.setTag(GRID_ID_TAG, id);
- }
-
- /**
- * Get the id of the item associated with this view.
- */
- public long getItemIdFromView(View view, int position) {
- final Object id = view.getTag(GRID_ID_TAG);
- if (id != null) {
- return (Long) id;
- }
-
- return getItemId(position);
- }
-
- /**
- * Get the id of the item associated with this view. The specified Object is associated with
- * the view at this position, and can be used to optimize retrieval of the id by the adapter.
- * @param item Object associated with this view at this position.
- * @param position Position of the item.
- * @return id Id for the item at this position.
- */
- public long getItemId(Object item, int position) {
- // TODO: Rather than using Object, use BaseNode so that we're not confused between this
- // method, and the method above.
- return getItemId(position);
- }
-
- /**
- * Get the type of the view given the item it will display based on its
- * position in the cursor managed by the adapter. Previously, the adapter
- * would create an item based on the position and use that item to get the
- * view type. However, if the item already exists due to another call that
- * required it, it is much better to reuse the item than recreate it.
- *
- * @param item Object associated with the view at this position
- * @param position Position of the item we are verifying
- * @return int representing the type of the item at the supplied position
- */
- public int getItemViewType(Object item, int position) {
- return getItemViewType(position);
- }
-
- /**
- * Get the view given its associated item.
- *
- * @param item Object associated with the view at this position
- * @param position Position of the item we are verifying
- * @param scrap The old view to reuse, if possible. Note: You should check
- * that this view is non-null and of an appropriate type before
- * using. If it is not possible to convert this view to display
- * the correct data, this method can create a new view.
- * Heterogeneous lists can specify their number of view types, so
- * that this View is always of the right type (see
- * getViewTypeCount() and getItemViewType(int)).
- * @param parent The parent view this view will eventually be attached to
- * @param measuredWidth
- * @return View
- */
- public View getView(Object item, int position, View scrap, ViewGroup parent,
- int measuredWidth) {
- return getView(position, scrap, parent);
- }
-
- /**
- * Get how many columns a specific view will span in the grid.
- */
- abstract public int getItemColumnSpan(Object item, int position);
-
- /**
- * The first change position of all items. It will be used by
- * StaggeredGridView to optimize rendering, such as skip unchanged items. By
- * default it returns 0, so StaggeredGridView will not try to optimize.
- */
- public int getFirstChangedPosition() {
- return 0;
- }
-
- /**
- * StaggeredGridView only works with stable id. Any adapter which wants to
- * use staggered grid view is enforced to use stable ids.
- */
- @Override
- public boolean hasStableIds() {
- return true;
- }
-}
diff --git a/src/com/android/deskclock/widget/sgv/OverScrollerSGV.java b/src/com/android/deskclock/widget/sgv/OverScrollerSGV.java
deleted file mode 100644
index 636a90e..0000000
--- a/src/com/android/deskclock/widget/sgv/OverScrollerSGV.java
+++ /dev/null
@@ -1,955 +0,0 @@
-/*
- * Copyright (C) 2013 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.widget.sgv;
-
-import android.content.Context;
-import android.hardware.SensorManager;
-import android.util.Log;
-import android.view.ViewConfiguration;
-import android.view.animation.AnimationUtils;
-import android.view.animation.Interpolator;
-
-/**
- * Temporarily copied from the framework so that StaggeredGridView can properly show the bounce at
- * the end of flings. See TODO and b/8252293 for more info.
- */
-/**
- * This class encapsulates scrolling with the ability to overshoot the bounds
- * of a scrolling operation. This class is a drop-in replacement for
- * {@link android.widget.Scroller} in most cases.
- */
-public class OverScrollerSGV {
- private int mMode;
-
- private final SplineOverScroller mScrollerX;
- private final SplineOverScroller mScrollerY;
-
- private Interpolator mInterpolator;
-
- private final boolean mFlywheel;
-
- private static final int DEFAULT_DURATION = 250;
- private static final int SCROLL_MODE = 0;
- private static final int FLING_MODE = 1;
-
- /**
- * Creates an OverScroller with a viscous fluid scroll interpolator and flywheel.
- * @param context
- */
- public OverScrollerSGV(Context context) {
- this(context, null);
- }
-
- /**
- * Creates an OverScroller with flywheel enabled.
- * @param context The context of this application.
- * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will
- * be used.
- */
- public OverScrollerSGV(Context context, Interpolator interpolator) {
- this(context, interpolator, true);
- }
-
- /**
- * Creates an OverScroller.
- * @param context The context of this application.
- * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will
- * be used.
- * @param flywheel If true, successive fling motions will keep on increasing scroll speed.
- * @hide
- */
- public OverScrollerSGV(Context context, Interpolator interpolator, boolean flywheel) {
- mInterpolator = interpolator;
- mFlywheel = flywheel;
- mScrollerX = new SplineOverScroller(context);
- mScrollerY = new SplineOverScroller(context);
- }
-
- /**
- * Creates an OverScroller with flywheel enabled.
- * @param context The context of this application.
- * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will
- * be used.
- * @param bounceCoefficientX A value between 0 and 1 that will determine the proportion of the
- * velocity which is preserved in the bounce when the horizontal edge is reached. A null value
- * means no bounce. This behavior is no longer supported and this coefficient has no effect.
- * @param bounceCoefficientY Same as bounceCoefficientX but for the vertical direction. This
- * behavior is no longer supported and this coefficient has no effect.
- * !deprecated Use {!link #OverScroller(Context, Interpolator, boolean)} instead.
- */
- public OverScrollerSGV(Context context, Interpolator interpolator,
- float bounceCoefficientX, float bounceCoefficientY) {
- this(context, interpolator, true);
- }
-
- /**
- * Creates an OverScroller.
- * @param context The context of this application.
- * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will
- * be used.
- * @param bounceCoefficientX A value between 0 and 1 that will determine the proportion of the
- * velocity which is preserved in the bounce when the horizontal edge is reached. A null value
- * means no bounce. This behavior is no longer supported and this coefficient has no effect.
- * @param bounceCoefficientY Same as bounceCoefficientX but for the vertical direction. This
- * behavior is no longer supported and this coefficient has no effect.
- * @param flywheel If true, successive fling motions will keep on increasing scroll speed.
- * !deprecated Use {!link OverScroller(Context, Interpolator, boolean)} instead.
- */
- public OverScrollerSGV(Context context, Interpolator interpolator,
- float bounceCoefficientX, float bounceCoefficientY, boolean flywheel) {
- this(context, interpolator, flywheel);
- }
-
- void setInterpolator(Interpolator interpolator) {
- mInterpolator = interpolator;
- }
-
- /**
- * The amount of friction applied to flings. The default value
- * is {@link ViewConfiguration#getScrollFriction}.
- *
- * @param friction A scalar dimension-less value representing the coefficient of
- * friction.
- */
- public final void setFriction(float friction) {
- mScrollerX.setFriction(friction);
- mScrollerY.setFriction(friction);
- }
-
- /**
- *
- * Returns whether the scroller has finished scrolling.
- *
- * @return True if the scroller has finished scrolling, false otherwise.
- */
- public final boolean isFinished() {
- return mScrollerX.mFinished && mScrollerY.mFinished;
- }
-
- /**
- * Force the finished field to a particular value. Contrary to
- * {@link #abortAnimation()}, forcing the animation to finished
- * does NOT cause the scroller to move to the final x and y
- * position.
- *
- * @param finished The new finished value.
- */
- public final void forceFinished(boolean finished) {
- mScrollerX.mFinished = mScrollerY.mFinished = finished;
- }
-
- /**
- * Returns the current X offset in the scroll.
- *
- * @return The new X offset as an absolute distance from the origin.
- */
- public final int getCurrX() {
- return mScrollerX.mCurrentPosition;
- }
-
- /**
- * Returns the current Y offset in the scroll.
- *
- * @return The new Y offset as an absolute distance from the origin.
- */
- public final int getCurrY() {
- return mScrollerY.mCurrentPosition;
- }
-
- /**
- * Returns the absolute value of the current velocity.
- *
- * @return The original velocity less the deceleration, norm of the X and Y velocity vector.
- */
- public float getCurrVelocity() {
- return (float) Math.hypot(mScrollerX.mCurrVelocity, mScrollerY.mCurrVelocity);
- }
-
- /**
- * Returns the start X offset in the scroll.
- *
- * @return The start X offset as an absolute distance from the origin.
- */
- public final int getStartX() {
- return mScrollerX.mStart;
- }
-
- /**
- * Returns the start Y offset in the scroll.
- *
- * @return The start Y offset as an absolute distance from the origin.
- */
- public final int getStartY() {
- return mScrollerY.mStart;
- }
-
- /**
- * Returns where the scroll will end. Valid only for "fling" scrolls.
- *
- * @return The final X offset as an absolute distance from the origin.
- */
- public final int getFinalX() {
- return mScrollerX.mFinal;
- }
-
- /**
- * Returns where the scroll will end. Valid only for "fling" scrolls.
- *
- * @return The final Y offset as an absolute distance from the origin.
- */
- public final int getFinalY() {
- return mScrollerY.mFinal;
- }
-
- /**
- * Returns how long the scroll event will take, in milliseconds.
- *
- * @return The duration of the scroll in milliseconds.
- *
- * @hide Pending removal once nothing depends on it
- * @deprecated OverScrollers don't necessarily have a fixed duration.
- * This function will lie to the best of its ability.
- */
- @Deprecated
- public final int getDuration() {
- return Math.max(mScrollerX.mDuration, mScrollerY.mDuration);
- }
-
- /**
- * Extend the scroll animation. This allows a running animation to scroll
- * further and longer, when used with {@link #setFinalX(int)} or {@link #setFinalY(int)}.
- *
- * @param extend Additional time to scroll in milliseconds.
- * @see #setFinalX(int)
- * @see #setFinalY(int)
- *
- * @hide Pending removal once nothing depends on it
- * @deprecated OverScrollers don't necessarily have a fixed duration.
- * Instead of setting a new final position and extending
- * the duration of an existing scroll, use startScroll
- * to begin a new animation.
- */
- @Deprecated
- public void extendDuration(int extend) {
- mScrollerX.extendDuration(extend);
- mScrollerY.extendDuration(extend);
- }
-
- /**
- * Sets the final position (X) for this scroller.
- *
- * @param newX The new X offset as an absolute distance from the origin.
- * @see #extendDuration(int)
- * @see #setFinalY(int)
- *
- * @hide Pending removal once nothing depends on it
- * @deprecated OverScroller's final position may change during an animation.
- * Instead of setting a new final position and extending
- * the duration of an existing scroll, use startScroll
- * to begin a new animation.
- */
- @Deprecated
- public void setFinalX(int newX) {
- mScrollerX.setFinalPosition(newX);
- }
-
- /**
- * Sets the final position (Y) for this scroller.
- *
- * @param newY The new Y offset as an absolute distance from the origin.
- * @see #extendDuration(int)
- * @see #setFinalX(int)
- *
- * @hide Pending removal once nothing depends on it
- * @deprecated OverScroller's final position may change during an animation.
- * Instead of setting a new final position and extending
- * the duration of an existing scroll, use startScroll
- * to begin a new animation.
- */
- @Deprecated
- public void setFinalY(int newY) {
- mScrollerY.setFinalPosition(newY);
- }
-
- /**
- * Call this when you want to know the new location. If it returns true, the
- * animation is not yet finished.
- */
- public boolean computeScrollOffset() {
- if (isFinished()) {
- return false;
- }
-
- switch (mMode) {
- case SCROLL_MODE:
- long time = AnimationUtils.currentAnimationTimeMillis();
- // Any scroller can be used for time, since they were started
- // together in scroll mode. We use X here.
- final long elapsedTime = time - mScrollerX.mStartTime;
-
- final int duration = mScrollerX.mDuration;
- if (elapsedTime < duration) {
- float q = (float) (elapsedTime) / duration;
-
- if (mInterpolator == null) {
- q = mInterpolator.getInterpolation(q);
- } else {
- q = mInterpolator.getInterpolation(q);
- }
-
- mScrollerX.updateScroll(q);
- mScrollerY.updateScroll(q);
- } else {
- abortAnimation();
- }
- break;
-
- case FLING_MODE:
- if (!mScrollerX.mFinished) {
- if (!mScrollerX.update()) {
- if (!mScrollerX.continueWhenFinished()) {
- mScrollerX.finish();
- }
- }
- }
-
- if (!mScrollerY.mFinished) {
- if (!mScrollerY.update()) {
- if (!mScrollerY.continueWhenFinished()) {
- mScrollerY.finish();
- }
- }
- }
-
- break;
- }
-
- return true;
- }
-
- /**
- * Start scrolling by providing a starting point and the distance to travel.
- * The scroll will use the default value of 250 milliseconds for the
- * duration.
- *
- * @param startX Starting horizontal scroll offset in pixels. Positive
- * numbers will scroll the content to the left.
- * @param startY Starting vertical scroll offset in pixels. Positive numbers
- * will scroll the content up.
- * @param dx Horizontal distance to travel. Positive numbers will scroll the
- * content to the left.
- * @param dy Vertical distance to travel. Positive numbers will scroll the
- * content up.
- */
- public void startScroll(int startX, int startY, int dx, int dy) {
- startScroll(startX, startY, dx, dy, DEFAULT_DURATION);
- }
-
- /**
- * Start scrolling by providing a starting point and the distance to travel.
- *
- * @param startX Starting horizontal scroll offset in pixels. Positive
- * numbers will scroll the content to the left.
- * @param startY Starting vertical scroll offset in pixels. Positive numbers
- * will scroll the content up.
- * @param dx Horizontal distance to travel. Positive numbers will scroll the
- * content to the left.
- * @param dy Vertical distance to travel. Positive numbers will scroll the
- * content up.
- * @param duration Duration of the scroll in milliseconds.
- */
- public void startScroll(int startX, int startY, int dx, int dy, int duration) {
- mMode = SCROLL_MODE;
- mScrollerX.startScroll(startX, dx, duration);
- mScrollerY.startScroll(startY, dy, duration);
- }
-
- /**
- * Call this when you want to 'spring back' into a valid coordinate range.
- *
- * @param startX Starting X coordinate
- * @param startY Starting Y coordinate
- * @param minX Minimum valid X value
- * @param maxX Maximum valid X value
- * @param minY Minimum valid Y value
- * @param maxY Minimum valid Y value
- * @return true if a springback was initiated, false if startX and startY were
- * already within the valid range.
- */
- public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) {
- mMode = FLING_MODE;
-
- // Make sure both methods are called.
- final boolean spingbackX = mScrollerX.springback(startX, minX, maxX);
- final boolean spingbackY = mScrollerY.springback(startY, minY, maxY);
- return spingbackX || spingbackY;
- }
-
- public void fling(int startX, int startY, int velocityX, int velocityY,
- int minX, int maxX, int minY, int maxY) {
- fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, 0, 0);
- }
-
- /**
- * Start scrolling based on a fling gesture. The distance traveled will
- * depend on the initial velocity of the fling.
- *
- * @param startX Starting point of the scroll (X)
- * @param startY Starting point of the scroll (Y)
- * @param velocityX Initial velocity of the fling (X) measured in pixels per
- * second.
- * @param velocityY Initial velocity of the fling (Y) measured in pixels per
- * second
- * @param minX Minimum X value. The scroller will not scroll past this point
- * unless overX > 0. If overfling is allowed, it will use minX as
- * a springback boundary.
- * @param maxX Maximum X value. The scroller will not scroll past this point
- * unless overX > 0. If overfling is allowed, it will use maxX as
- * a springback boundary.
- * @param minY Minimum Y value. The scroller will not scroll past this point
- * unless overY > 0. If overfling is allowed, it will use minY as
- * a springback boundary.
- * @param maxY Maximum Y value. The scroller will not scroll past this point
- * unless overY > 0. If overfling is allowed, it will use maxY as
- * a springback boundary.
- * @param overX Overfling range. If > 0, horizontal overfling in either
- * direction will be possible.
- * @param overY Overfling range. If > 0, vertical overfling in either
- * direction will be possible.
- */
- public void fling(int startX, int startY, int velocityX, int velocityY,
- int minX, int maxX, int minY, int maxY, int overX, int overY) {
- // Continue a scroll or fling in progress
- if (mFlywheel && !isFinished()) {
- float oldVelocityX = mScrollerX.mCurrVelocity;
- float oldVelocityY = mScrollerY.mCurrVelocity;
- if (Math.signum(velocityX) == Math.signum(oldVelocityX) &&
- Math.signum(velocityY) == Math.signum(oldVelocityY)) {
- velocityX += oldVelocityX;
- velocityY += oldVelocityY;
- }
- }
-
- mMode = FLING_MODE;
- mScrollerX.fling(startX, velocityX, minX, maxX, overX);
- mScrollerY.fling(startY, velocityY, minY, maxY, overY);
- }
-
- /**
- * Notify the scroller that we've reached a horizontal boundary.
- * Normally the information to handle this will already be known
- * when the animation is started, such as in a call to one of the
- * fling functions. However there are cases where this cannot be known
- * in advance. This function will transition the current motion and
- * animate from startX to finalX as appropriate.
- *
- * @param startX Starting/current X position
- * @param finalX Desired final X position
- * @param overX Magnitude of overscroll allowed. This should be the maximum
- * desired distance from finalX. Absolute value - must be positive.
- */
- public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) {
- mScrollerX.notifyEdgeReached(startX, finalX, overX);
- }
-
- /**
- * Notify the scroller that we've reached a vertical boundary.
- * Normally the information to handle this will already be known
- * when the animation is started, such as in a call to one of the
- * fling functions. However there are cases where this cannot be known
- * in advance. This function will animate a parabolic motion from
- * startY to finalY.
- *
- * @param startY Starting/current Y position
- * @param finalY Desired final Y position
- * @param overY Magnitude of overscroll allowed. This should be the maximum
- * desired distance from finalY. Absolute value - must be positive.
- */
- public void notifyVerticalEdgeReached(int startY, int finalY, int overY) {
- mScrollerY.notifyEdgeReached(startY, finalY, overY);
- }
-
- /**
- * Returns whether the current Scroller is currently returning to a valid position.
- * Valid bounds were provided by the
- * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method.
- *
- * One should check this value before calling
- * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress
- * to restore a valid position will then be stopped. The caller has to take into account
- * the fact that the started scroll will start from an overscrolled position.
- *
- * @return true when the current position is overscrolled and in the process of
- * interpolating back to a valid value.
- */
- public boolean isOverScrolled() {
- return ((!mScrollerX.mFinished &&
- mScrollerX.mState != SplineOverScroller.SPLINE) ||
- (!mScrollerY.mFinished &&
- mScrollerY.mState != SplineOverScroller.SPLINE));
- }
-
- /**
- * Stops the animation. Contrary to {@link #forceFinished(boolean)},
- * aborting the animating causes the scroller to move to the final x and y
- * positions.
- *
- * @see #forceFinished(boolean)
- */
- public void abortAnimation() {
- mScrollerX.finish();
- mScrollerY.finish();
- }
-
- /**
- * Returns the time elapsed since the beginning of the scrolling.
- *
- * @return The elapsed time in milliseconds.
- *
- * @hide
- */
- public int timePassed() {
- final long time = AnimationUtils.currentAnimationTimeMillis();
- final long startTime = Math.min(mScrollerX.mStartTime, mScrollerY.mStartTime);
- return (int) (time - startTime);
- }
-
- /**
- * @hide
- */
- public boolean isScrollingInDirection(float xvel, float yvel) {
- final int dx = mScrollerX.mFinal - mScrollerX.mStart;
- final int dy = mScrollerY.mFinal - mScrollerY.mStart;
- return !isFinished() && Math.signum(xvel) == Math.signum(dx) &&
- Math.signum(yvel) == Math.signum(dy);
- }
-
- static class SplineOverScroller {
- // Initial position
- private int mStart;
-
- // Current position
- private int mCurrentPosition;
-
- // Final position
- private int mFinal;
-
- // Initial velocity
- private int mVelocity;
-
- // Current velocity
- private float mCurrVelocity;
-
- // Constant current deceleration
- private float mDeceleration;
-
- // Animation starting time, in system milliseconds
- private long mStartTime;
-
- // Animation duration, in milliseconds
- private int mDuration;
-
- // Duration to complete spline component of animation
- private int mSplineDuration;
-
- // Distance to travel along spline animation
- private int mSplineDistance;
-
- // Whether the animation is currently in progress
- private boolean mFinished;
-
- // The allowed overshot distance before boundary is reached.
- private int mOver;
-
- // Fling friction
- private float mFlingFriction = ViewConfiguration.getScrollFriction();
-
- // Current state of the animation.
- private int mState = SPLINE;
-
- // Constant gravity value, used in the deceleration phase.
- private static final float GRAVITY = 2000.0f;
-
- // A context-specific coefficient adjusted to physical values.
- private final float mPhysicalCoeff;
-
- private static float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9));
- private static final float INFLEXION = 0.35f; // Tension lines cross at (INFLEXION, 1)
- private static final float START_TENSION = 0.5f;
- private static final float END_TENSION = 1.0f;
- private static final float P1 = START_TENSION * INFLEXION;
- private static final float P2 = 1.0f - END_TENSION * (1.0f - INFLEXION);
-
- private static final int NB_SAMPLES = 100;
- private static final float[] SPLINE_POSITION = new float[NB_SAMPLES + 1];
- private static final float[] SPLINE_TIME = new float[NB_SAMPLES + 1];
-
- private static final int SPLINE = 0;
- private static final int CUBIC = 1;
- private static final int BALLISTIC = 2;
-
- static {
- float x_min = 0.0f;
- float y_min = 0.0f;
- for (int i = 0; i < NB_SAMPLES; i++) {
- final float alpha = (float) i / NB_SAMPLES;
-
- float x_max = 1.0f;
- float x, tx, coef;
- while (true) {
- x = x_min + (x_max - x_min) / 2.0f;
- coef = 3.0f * x * (1.0f - x);
- tx = coef * ((1.0f - x) * P1 + x * P2) + x * x * x;
- if (Math.abs(tx - alpha) < 1E-5) break;
- if (tx > alpha) x_max = x;
- else x_min = x;
- }
- SPLINE_POSITION[i] = coef * ((1.0f - x) * START_TENSION + x) + x * x * x;
-
- float y_max = 1.0f;
- float y, dy;
- while (true) {
- y = y_min + (y_max - y_min) / 2.0f;
- coef = 3.0f * y * (1.0f - y);
- dy = coef * ((1.0f - y) * START_TENSION + y) + y * y * y;
- if (Math.abs(dy - alpha) < 1E-5) break;
- if (dy > alpha) y_max = y;
- else y_min = y;
- }
- SPLINE_TIME[i] = coef * ((1.0f - y) * P1 + y * P2) + y * y * y;
- }
- SPLINE_POSITION[NB_SAMPLES] = SPLINE_TIME[NB_SAMPLES] = 1.0f;
- }
-
- void setFriction(float friction) {
- mFlingFriction = friction;
- }
-
- SplineOverScroller(Context context) {
- mFinished = true;
- final float ppi = context.getResources().getDisplayMetrics().density * 160.0f;
- mPhysicalCoeff = SensorManager.GRAVITY_EARTH // g (m/s^2)
- * 39.37f // inch/meter
- * ppi
- * 0.84f; // look and feel tuning
- }
-
- void updateScroll(float q) {
- mCurrentPosition = mStart + Math.round(q * (mFinal - mStart));
- }
-
- /*
- * Get a signed deceleration that will reduce the velocity.
- */
- static private float getDeceleration(int velocity) {
- return velocity > 0 ? -GRAVITY : GRAVITY;
- }
-
- /*
- * Modifies mDuration to the duration it takes to get from start to newFinal using the
- * spline interpolation. The previous duration was needed to get to oldFinal.
- */
- private void adjustDuration(int start, int oldFinal, int newFinal) {
- final int oldDistance = oldFinal - start;
- final int newDistance = newFinal - start;
- final float x = Math.abs((float) newDistance / oldDistance);
- final int index = (int) (NB_SAMPLES * x);
- if (index < NB_SAMPLES) {
- final float x_inf = (float) index / NB_SAMPLES;
- final float x_sup = (float) (index + 1) / NB_SAMPLES;
- final float t_inf = SPLINE_TIME[index];
- final float t_sup = SPLINE_TIME[index + 1];
- final float timeCoef = t_inf + (x - x_inf) / (x_sup - x_inf) * (t_sup - t_inf);
- mDuration *= timeCoef;
- }
- }
-
- void startScroll(int start, int distance, int duration) {
- mFinished = false;
-
- mStart = start;
- mFinal = start + distance;
-
- mStartTime = AnimationUtils.currentAnimationTimeMillis();
- mDuration = duration;
-
- // Unused
- mDeceleration = 0.0f;
- mVelocity = 0;
- }
-
- void finish() {
- mCurrentPosition = mFinal;
- // Not reset since WebView relies on this value for fast fling.
- // TODO: restore when WebView uses the fast fling implemented in this class.
- // mCurrVelocity = 0.0f;
- mFinished = true;
- }
-
- void setFinalPosition(int position) {
- mFinal = position;
- mFinished = false;
- }
-
- void extendDuration(int extend) {
- final long time = AnimationUtils.currentAnimationTimeMillis();
- final int elapsedTime = (int) (time - mStartTime);
- mDuration = elapsedTime + extend;
- mFinished = false;
- }
-
- boolean springback(int start, int min, int max) {
- mFinished = true;
-
- mStart = mFinal = start;
- mVelocity = 0;
-
- mStartTime = AnimationUtils.currentAnimationTimeMillis();
- mDuration = 0;
-
- if (start < min) {
- startSpringback(start, min, 0);
- } else if (start > max) {
- startSpringback(start, max, 0);
- }
-
- return !mFinished;
- }
-
- private void startSpringback(int start, int end, int velocity) {
- // mStartTime has been set
- mFinished = false;
- mState = CUBIC;
- mStart = start;
- mFinal = end;
- final int delta = start - end;
- mDeceleration = getDeceleration(delta);
- // TODO take velocity into account
- mVelocity = -delta; // only sign is used
- mOver = Math.abs(delta);
- mDuration = (int) (1000.0 * Math.sqrt(-2.0 * delta / mDeceleration));
- }
-
- void fling(int start, int velocity, int min, int max, int over) {
- mOver = over;
- mFinished = false;
- mCurrVelocity = mVelocity = velocity;
- mDuration = mSplineDuration = 0;
- mStartTime = AnimationUtils.currentAnimationTimeMillis();
- mCurrentPosition = mStart = start;
-
- if (start > max || start < min) {
- startAfterEdge(start, min, max, velocity);
- return;
- }
-
- mState = SPLINE;
- double totalDistance = 0.0;
-
- if (velocity != 0) {
- mDuration = mSplineDuration = getSplineFlingDuration(velocity);
- totalDistance = getSplineFlingDistance(velocity);
- }
-
- mSplineDistance = (int) (totalDistance * Math.signum(velocity));
- mFinal = start + mSplineDistance;
-
- // Clamp to a valid final position
- if (mFinal < min) {
- adjustDuration(mStart, mFinal, min);
- mFinal = min;
- }
-
- if (mFinal > max) {
- adjustDuration(mStart, mFinal, max);
- mFinal = max;
- }
- }
-
- private double getSplineDeceleration(int velocity) {
- return Math.log(INFLEXION * Math.abs(velocity) / (mFlingFriction * mPhysicalCoeff));
- }
-
- private double getSplineFlingDistance(int velocity) {
- final double l = getSplineDeceleration(velocity);
- final double decelMinusOne = DECELERATION_RATE - 1.0;
- return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l);
- }
-
- /* Returns the duration, expressed in milliseconds */
- private int getSplineFlingDuration(int velocity) {
- final double l = getSplineDeceleration(velocity);
- final double decelMinusOne = DECELERATION_RATE - 1.0;
- return (int) (1000.0 * Math.exp(l / decelMinusOne));
- }
-
- private void fitOnBounceCurve(int start, int end, int velocity) {
- // Simulate a bounce that started from edge
- final float durationToApex = - velocity / mDeceleration;
- final float distanceToApex = velocity * velocity / 2.0f / Math.abs(mDeceleration);
- final float distanceToEdge = Math.abs(end - start);
- final float totalDuration = (float) Math.sqrt(
- 2.0 * (distanceToApex + distanceToEdge) / Math.abs(mDeceleration));
- mStartTime -= (int) (1000.0f * (totalDuration - durationToApex));
- mStart = end;
- mVelocity = (int) (- mDeceleration * totalDuration);
- }
-
- private void startBounceAfterEdge(int start, int end, int velocity) {
- mDeceleration = getDeceleration(velocity == 0 ? start - end : velocity);
- fitOnBounceCurve(start, end, velocity);
- onEdgeReached();
- }
-
- private void startAfterEdge(int start, int min, int max, int velocity) {
- if (start > min && start < max) {
- Log.e("OverScroller", "startAfterEdge called from a valid position");
- mFinished = true;
- return;
- }
- final boolean positive = start > max;
- final int edge = positive ? max : min;
- final int overDistance = start - edge;
- boolean keepIncreasing = overDistance * velocity >= 0;
- if (keepIncreasing) {
- // Will result in a bounce or a to_boundary depending on velocity.
- startBounceAfterEdge(start, edge, velocity);
- } else {
- // TODO: figure out how to absorb the velocity properly.
- final double totalDistance = getSplineFlingDistance(velocity);
- if (false) {
- fling(start, velocity, positive ? min : start, positive ? start : max, mOver);
- } else {
- startSpringback(start, edge, velocity);
- }
- }
- }
-
- void notifyEdgeReached(int start, int end, int over) {
- // mState is used to detect successive notifications
- if (mState == SPLINE) {
- mOver = over;
- mStartTime = AnimationUtils.currentAnimationTimeMillis();
- // We were in fling/scroll mode before: current velocity is such that distance to
- // edge is increasing. This ensures that startAfterEdge will not start a new fling.
- startAfterEdge(start, end, end, (int) mCurrVelocity);
- }
- }
-
- private void onEdgeReached() {
- // mStart, mVelocity and mStartTime were adjusted to their values when edge was reached.
- float distance = mVelocity * mVelocity / (2.0f * Math.abs(mDeceleration));
- final float sign = Math.signum(mVelocity);
-
- if (distance > mOver) {
- // Default deceleration is not sufficient to slow us down before boundary
- mDeceleration = - sign * mVelocity * mVelocity / (2.0f * mOver);
- distance = mOver;
- }
-
- mOver = (int) distance;
- mState = BALLISTIC;
- mFinal = mStart + (int) (mVelocity > 0 ? distance : -distance);
- mDuration = - (int) (1000.0f * mVelocity / mDeceleration);
- }
-
- boolean continueWhenFinished() {
- switch (mState) {
- case SPLINE:
- // Duration from start to null velocity
- if (mDuration < mSplineDuration) {
- // If the animation was clamped, we reached the edge
- mStart = mFinal;
- // TODO Better compute speed when edge was reached
- mVelocity = (int) mCurrVelocity;
- mDeceleration = getDeceleration(mVelocity);
- mStartTime += mDuration;
- onEdgeReached();
- } else {
- // Normal stop, no need to continue
- return false;
- }
- break;
- case BALLISTIC:
- mStartTime += mDuration;
- startSpringback(mFinal, mStart, 0);
- break;
- case CUBIC:
- return false;
- }
-
- update();
- return true;
- }
-
- /*
- * Update the current position and velocity for current time. Returns
- * true if update has been done and false if animation duration has been
- * reached.
- */
- boolean update() {
- final long time = AnimationUtils.currentAnimationTimeMillis();
- final long currentTime = time - mStartTime;
-
- if (currentTime > mDuration) {
- return false;
- }
-
- double distance = 0.0;
- switch (mState) {
- case SPLINE: {
- final float t = (float) currentTime / mSplineDuration;
- final int index = (int) (NB_SAMPLES * t);
- float distanceCoef = 1.f;
- float velocityCoef = 0.f;
- if (index < NB_SAMPLES) {
- final float t_inf = (float) index / NB_SAMPLES;
- final float t_sup = (float) (index + 1) / NB_SAMPLES;
- final float d_inf = SPLINE_POSITION[index];
- final float d_sup = SPLINE_POSITION[index + 1];
- velocityCoef = (d_sup - d_inf) / (t_sup - t_inf);
- distanceCoef = d_inf + (t - t_inf) * velocityCoef;
- }
-
- distance = distanceCoef * mSplineDistance;
- mCurrVelocity = velocityCoef * mSplineDistance / mSplineDuration * 1000.0f;
- break;
- }
-
- case BALLISTIC: {
- final float t = currentTime / 1000.0f;
- mCurrVelocity = mVelocity + mDeceleration * t;
- distance = mVelocity * t + mDeceleration * t * t / 2.0f;
- break;
- }
-
- case CUBIC: {
- final float t = (float) (currentTime) / mDuration;
- final float t2 = t * t;
- final float sign = Math.signum(mVelocity);
- distance = sign * mOver * (3.0f * t2 - 2.0f * t * t2);
- mCurrVelocity = sign * mOver * 6.0f * (- t + t2);
- break;
- }
- }
-
- mCurrentPosition = mStart + (int) Math.round(distance);
-
- return true;
- }
- }
-}
diff --git a/src/com/android/deskclock/widget/sgv/ReorderHelper.java b/src/com/android/deskclock/widget/sgv/ReorderHelper.java
deleted file mode 100644
index 91fd4ea..0000000
--- a/src/com/android/deskclock/widget/sgv/ReorderHelper.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All Rights Reserved.
- */
-
-package com.android.deskclock.widget.sgv;
-
-import android.graphics.Point;
-import android.util.Log;
-import android.view.View;
-
-import com.android.deskclock.widget.sgv.StaggeredGridView.LayoutParams;
-import com.android.deskclock.widget.sgv.StaggeredGridView.ReorderListener;
-
-
-/**
- * Helper class for doing reorder animations. Works out the logical position of
- * where an item would be placed as the user drags it around.
- */
-public final class ReorderHelper {
-
- private static final String TAG = "DeskClock";
-
- /**
- * Constant to indicate an unsupported reordering position.
- */
- public static final int INVALID_REORDER_POS = -2;
-
- private final ReorderListener mReorderListener;
-
- // Current {@link ReorderView} that is currently being dragged over. If drag is released here,
- // and this child supports reordering, the dragged view will be reordered to be next
- // to this child.
- private ReorderView mCurrentDraggedOverChild;
-
- // The current child that is being dragged for reordering.
- private ReorderView mDraggedChild;
-
- // The id of mDraggedChild.
- private long mDraggedChildId = -1;
-
- // The parent view group that dragged children are attached to.
- private final StaggeredGridView mParentView;
-
- private boolean mEnableUpdatesOnDrag = true;
-
- public ReorderHelper(ReorderListener listener, StaggeredGridView parentView) {
- mReorderListener = listener;
- mParentView = parentView;
- if (listener == null) {
- throw new IllegalArgumentException("ReorderListener cannot be null");
- }
-
- if (parentView == null) {
- throw new IllegalArgumentException("ParentView cannot be null");
- }
- }
-
- /**
- * Handle dropping the dragged child.
- * @return true if the drop results in a reordering, false otherwise.
- */
- public boolean handleDrop(Point p) {
- View reorderTarget = null;
- if (mCurrentDraggedOverChild != null) {
- reorderTarget = getReorderableChildAtCoordinate(p);
- } else {
- Log.w(TAG, "Current dragged over child does not exist");
- }
-
- // If reorder target is null, the drag coordinate is not over any
- // reordering areas. Don't update dragged over child if its the same as
- // it was before or is the same as the child's original item.
- if (reorderTarget != null) {
- final LayoutParams lp = (LayoutParams) reorderTarget.getLayoutParams();
- // Ensure that target position is not the same as the original,
- // since that's a no-op.
- if (lp.position != mCurrentDraggedOverChild.position) {
- updateDraggedOverChild(reorderTarget);
- }
- }
-
- if (mCurrentDraggedOverChild != null &&
- mDraggedChild.position != mCurrentDraggedOverChild.position) {
- return mReorderListener.onReorder(mDraggedChild.target, mDraggedChild.id,
- mDraggedChild.position,
- mCurrentDraggedOverChild.position);
- } else {
- // Even if the dragged child is not dropped in a reorder area, we
- // would still need to notify the listener of the drop event.
- mReorderListener.onDrop(mDraggedChild.target, mDraggedChild.position,
- mCurrentDraggedOverChild.position);
- return false;
- }
- }
-
- public void handleDragCancelled(View draggedView) {
- mReorderListener.onCancelDrag(draggedView);
- }
-
- public void handleDragStart(View view, int pos, long id, Point p) {
- mDraggedChild = new ReorderView(view, pos, id);
- mDraggedChildId = id;
- mCurrentDraggedOverChild = new ReorderView(view, pos, id);
- mReorderListener.onPickedUp(mDraggedChild.target);
- }
-
- /**
- * Handles determining which child views should be moved out of the way to
- * make space for a reordered item and updates the ReorderListener when a
- * new child view's space is entered by the dragging view.
- */
- public void handleDrag(Point p) {
- if (p == null || p.y < 0 && p.y > mParentView.getHeight()) {
- // If the user drags off screen, DragEvent.ACTION_DRAG_ENDED, would be called, so we'll
- // treat it as though the user has released drag.
- handleDrop(p);
- return;
- }
-
- if (!mEnableUpdatesOnDrag) {
- return;
- }
-
- View reorderTarget = null;
- if (mCurrentDraggedOverChild != null) {
- reorderTarget = getReorderableChildAtCoordinate(p);
- } else {
- Log.w(TAG, "Current dragged over child does not exist");
- }
-
- // If reorder target is null, the drag coordinate is not over any
- // reordering areas. Don't update dragged over child if its the same as
- // it was before or is the same as the child's original item.
- if (reorderTarget != null) {
- final LayoutParams lp = (LayoutParams) reorderTarget.getLayoutParams();
- if (lp.position != mCurrentDraggedOverChild.position) {
- updateDraggedOverChild(reorderTarget);
- // Ensure that target position is not the same as the original,
- // since that's a no-op.
- mReorderListener.onEnterReorderArea(reorderTarget, lp.position);
- }
- }
- }
-
- /**
- * Enable updates on drag events. If set to false, handleDrag will not update place holder
- */
- public void enableUpdatesOnDrag(boolean enabled) {
- mEnableUpdatesOnDrag = enabled;
- }
-
- /**
- * Clear dragged over child info
- */
- public void clearDraggedOverChild() {
- mCurrentDraggedOverChild = null;
- }
-
- /**
- * Return if the currently dragged view is over a valid reordering area.
- */
- public boolean isOverReorderingArea() {
- return mCurrentDraggedOverChild != null;
- }
-
- /**
- * Get the position of the child that is being dragged over. If there isn't one, returns
- * {@link #INVALID_REORDER_POS}
- */
- public int getCurrentDraggedOverChildPosition() {
- if (mCurrentDraggedOverChild != null) {
- return mCurrentDraggedOverChild.position;
- }
-
- return INVALID_REORDER_POS;
- }
-
- /**
- * Get the id of the child that is being dragged. If there isn't one, returns -1
- */
- public long getDraggedChildId() {
- return mDraggedChildId;
- }
-
- /**
- * Get the original view of the child that is being dragged. If there isn't
- * one, returns null
- */
- public View getDraggedChild() {
- return mDraggedChild != null ? mDraggedChild.target : null;
- }
-
- /**
- * Clear original dragged child info
- */
- public void clearDraggedChild() {
- mDraggedChild = null;
- }
-
- // TODO: Consolidate clearDraggedChild() and clearDraggedChildId().
- public void clearDraggedChildId() {
- mDraggedChildId = -1;
- }
-
- /**
- * Get the original position of the child that is being dragged. If there isn't one, returns
- * {@link #INVALID_REORDER_POS};
- */
- public int getDraggedChildPosition() {
- return mDraggedChild != null ? mDraggedChild.position : INVALID_REORDER_POS;
- }
-
- public void updateDraggedChildView(View v) {
- if (mDraggedChild != null && v != mDraggedChild.target) {
- mDraggedChild.target = v;
- }
- }
-
- public void updateDraggedOverChildView(View v) {
- if (mCurrentDraggedOverChild != null && v != mCurrentDraggedOverChild.target) {
- mCurrentDraggedOverChild.target = v;
- }
- }
-
- /**
- * Update the current view that is being dragged over, and clean up all drag and hover
- * UI states from other sibling views.
- * @param child The new child that is being dragged over.
- */
- private void updateDraggedOverChild(View child) {
- final LayoutParams childLayoutParam = (LayoutParams) child.getLayoutParams();
- mCurrentDraggedOverChild = new ReorderView(
- child, childLayoutParam.position, childLayoutParam.id);
- }
-
- /**
- * Return the child view specified by the coordinates if
- * there exists a child there.
- *
- * @return the child in this StaggeredGridView at the coordinates, null otherwise.
- */
- public View getReorderableChildAtCoordinate(Point p) {
- if (p == null || p.y < 0) {
- // TODO: If we've dragged off the screen, return null for now until we know what
- // we'd like the experience to be like.
- return null;
- }
-
- final int count = mParentView.getChildCount();
- for (int i = 0; i < count; i++) {
- if (!mParentView.isChildReorderable(i)) {
- continue;
- }
- final View childView = mParentView.getChildAt(i);
- if (p.x >= childView.getLeft() && p.x < childView.getRight()
- && p.y >= childView.getTop() && p.y < childView.getBottom()) {
- return childView;
- }
- }
-
- return null;
- }
-
- public boolean hasReorderListener() {
- return mReorderListener != null;
- }
-
- private class ReorderView {
- final long id;
- final int position;
- View target;
- public ReorderView(View v, int pos, long i) {
- target = v;
- position = pos;
- id = i;
- }
- }
-}
\ No newline at end of file
diff --git a/src/com/android/deskclock/widget/sgv/ReorderUtils.java b/src/com/android/deskclock/widget/sgv/ReorderUtils.java
deleted file mode 100644
index daa538f..0000000
--- a/src/com/android/deskclock/widget/sgv/ReorderUtils.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2012 Google Inc. All Rights Reserved.
- */
-
-package com.android.deskclock.widget.sgv;
-
-public class ReorderUtils {
- /**
- * Possible states a dragged view can be in.
- */
- public static final int ON_PICKED_UP = 0;
- public static final int ON_DRAG_RELEASE = 1;
- public static final int ON_DRAG_CANCELLED = 2;
-
- /**
- * Reordering area of a view in a StaggeredGridView.
- */
- public static final int REORDER_AREA_NONE = 0x0;
- public static final int REORDER_AREA_VALID = 0x1;
-
- /**
- * Reordering states
- */
- public static final int DRAG_STATE_NONE = 0;
- public static final int DRAG_STATE_DRAGGING = 1;
- public static final int DRAG_STATE_RELEASED_REORDER= 2;
- public static final int DRAG_STATE_RELEASED_HOVER = 3;
-
- /**
- * Reordering directions allowed. {@link #REORDER_DIRECTION_HORIZONTAL} direction means that
- * the user is only allowed to drag a view along the horizontal axis. Likewise for
- * {@link #REORDER_DIRECTION_VERTICAL}. These two flags can be OR'ed together to allow for
- * free dragging across both horizontal and vertical axes.
- */
- public static final int REORDER_DIRECTION_HORIZONTAL = 0x1;
- public static final int REORDER_DIRECTION_VERTICAL = 0x2;
-}
diff --git a/src/com/android/deskclock/widget/sgv/SgvAnimationHelper.java b/src/com/android/deskclock/widget/sgv/SgvAnimationHelper.java
deleted file mode 100644
index f6f32c3..0000000
--- a/src/com/android/deskclock/widget/sgv/SgvAnimationHelper.java
+++ /dev/null
@@ -1,334 +0,0 @@
-// Copyright 2013 Google Inc. All Rights Reserved.
-
-package com.android.deskclock.widget.sgv;
-
-import android.R.interpolator;
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.graphics.Point;
-import android.view.View;
-import android.view.WindowManager;
-import android.view.animation.AnimationUtils;
-import android.view.animation.Interpolator;
-
-
-import java.util.List;
-
-public class SgvAnimationHelper {
-
- /**
- * Supported entrance animations for views in the {@link StaggeredGridView}.
- */
- public enum AnimationIn {
- NONE,
- // Fly in all views from the bottom of the screen
- FLY_UP_ALL_VIEWS,
- // New views expand into view from height 0. Existing views are updated and translated
- // to their new positions if appropriate.
- EXPAND_NEW_VIEWS,
- // New views expand into view from height 0. Existing views are updated and translated
- // to their new positions if appropriate. This animation is done for all views
- // simultaneously without a cascade effect.
- EXPAND_NEW_VIEWS_NO_CASCADE,
- // New views are flown in from the bottom. Existing views are updated and translated
- // to their new positions if appropriate.
- FLY_IN_NEW_VIEWS,
- // New views are slid in from the side. Existing views are updated and translated
- // to their new positions if appropriate.
- SLIDE_IN_NEW_VIEWS,
- // Fade in all new views
- FADE,
- }
-
- /**
- * Supported exit animations for views in the {@link StaggeredGridView}.
- */
- public enum AnimationOut {
- NONE,
- // Stale views are faded out of view. Existing views are then updated and translated
- // to their new positions if appropriate.
- FADE,
- // Stale views are dropped to the bottom of the screen. Existing views are then updated
- // and translated to their new positions if appropriate.
- FLY_DOWN,
- // Stale views are slid to the side of the screen. Existing views are then updated
- // and translated to their new positions if appropriate.
- SLIDE,
- // Stale views are collapsed to height 0. Existing views are then updated
- // and translated to their new positions if appropriate.
- COLLAPSE
- }
-
- private static Interpolator sDecelerateQuintInterpolator;
-
- private static final int ANIMATION_LONG_SCREEN_SIZE = 1600;
- private static final int ANIMATION_MED_SCREEN_SIZE = 1200;
-
- // Duration of an individual animation when the children of the grid are laid out again. These
- // are measured in milliseconds and based on the height of the screen.
- private static final int ANIMATION_SHORT_DURATION = 400;
- private static final int ANIMATION_MED_DURATION = 450;
- private static final int ANIMATION_LONG_DURATION = 500;
-
- public static final float ANIMATION_ROTATION_DEGREES = 25.0f;
-
- /**
- * Duration of an individual animation when the children of the grid are laid out again.
- * This is measured in milliseconds.
- */
- private static int sAnimationDuration = ANIMATION_MED_DURATION;
-
- public static void initialize(Context context) {
- sDecelerateQuintInterpolator = AnimationUtils.loadInterpolator(context,
- interpolator.decelerate_quint);
-
- final Point size = new Point();
- ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).
- getDefaultDisplay().getSize(size);
- final int screenHeight = size.y;
-
- if (screenHeight >= ANIMATION_LONG_SCREEN_SIZE) {
- sAnimationDuration = ANIMATION_LONG_DURATION;
- } else if (screenHeight >= ANIMATION_MED_SCREEN_SIZE) {
- sAnimationDuration = ANIMATION_MED_DURATION;
- } else {
- sAnimationDuration = ANIMATION_SHORT_DURATION;
- }
- }
-
- public static int getDefaultAnimationDuration() {
- return sAnimationDuration;
- }
-
- public static Interpolator getDefaultAnimationInterpolator() {
- return sDecelerateQuintInterpolator;
- }
-
- /**
- * Add animations to translate a view's X-translation. {@link AnimatorListener} can be null.
- */
- private static void addXTranslationAnimators(List<Animator> animators,
- final View view, int startTranslation, final int endTranslation, int animationDelay,
- AnimatorListener listener) {
- // We used to skip the animation if startTranslation == endTranslation,
- // but to add a recycle view listener, we need at least one animation
- view.setTranslationX(startTranslation);
- final ObjectAnimator translateAnimatorX = ObjectAnimator.ofFloat(view,
- View.TRANSLATION_X, startTranslation, endTranslation);
- translateAnimatorX.setInterpolator(sDecelerateQuintInterpolator);
- translateAnimatorX.setDuration(sAnimationDuration);
- translateAnimatorX.setStartDelay(animationDelay);
- if (listener != null) {
- translateAnimatorX.addListener(listener);
- }
-
- animators.add(translateAnimatorX);
- }
-
- /**
- * Add animations to translate a view's Y-translation. {@link AnimatorListener} can be null.
- */
- private static void addYTranslationAnimators(List<Animator> animators,
- final View view, int startTranslation, final int endTranslation, int animationDelay,
- AnimatorListener listener) {
- // We used to skip the animation if startTranslation == endTranslation,
- // but to add a recycle view listener, we need at least one animation
- view.setTranslationY(startTranslation);
- final ObjectAnimator translateAnimatorY = ObjectAnimator.ofFloat(view,
- View.TRANSLATION_Y, startTranslation, endTranslation);
- translateAnimatorY.setInterpolator(sDecelerateQuintInterpolator);
- translateAnimatorY.setDuration(sAnimationDuration);
- translateAnimatorY.setStartDelay(animationDelay);
-
- if (listener != null) {
- translateAnimatorY.addListener(listener);
- }
-
- animators.add(translateAnimatorY);
- }
-
- /**
- * Translate a view to the specified translation values, and animate the translations to 0.
- */
- public static void addXYTranslationAnimators(List<Animator> animators, final View view,
- int xTranslation, int yTranslation, int animationDelay) {
- addXTranslationAnimators(animators, view, xTranslation, 0, animationDelay, null);
- addYTranslationAnimators(animators, view, yTranslation, 0, animationDelay, null);
- }
-
- /**
- * Translate a view to the specified translation values, while rotating to the specified
- * rotation value.
- */
- public static void addTranslationRotationAnimators(List<Animator> animators, final View view,
- int xTranslation, int yTranslation, float rotation, int animationDelay) {
- addXYTranslationAnimators(animators, view, xTranslation, yTranslation, animationDelay);
-
- view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- view.setRotation(rotation);
-
- final ObjectAnimator rotateAnimatorY = ObjectAnimator.ofFloat(view,
- View.ROTATION, view.getRotation(), 0.0f);
- rotateAnimatorY.setInterpolator(sDecelerateQuintInterpolator);
- rotateAnimatorY.setDuration(sAnimationDuration);
- rotateAnimatorY.setStartDelay(animationDelay);
- rotateAnimatorY.addListener(new AnimatorListenerAdapter() {
- private boolean mIsCanceled = false;
-
- @Override
- public void onAnimationCancel(Animator animation) {
- mIsCanceled = true;
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (!mIsCanceled) {
- view.setRotation(0);
- }
-
- view.setLayerType(View.LAYER_TYPE_NONE, null);
- }
- });
-
- animators.add(rotateAnimatorY);
- }
-
- /**
- * Expand a view into view by scaling up vertically from 0.
- */
- public static void addExpandInAnimators(List<Animator> animators, final View view,
- int animationDelay) {
- view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- view.setScaleY(0);
-
- final ObjectAnimator scaleAnimatorY = ObjectAnimator.ofFloat(view,
- View.SCALE_Y, view.getScaleY(), 1.0f);
- scaleAnimatorY.setInterpolator(sDecelerateQuintInterpolator);
- scaleAnimatorY.setDuration(sAnimationDuration);
- scaleAnimatorY.setStartDelay(animationDelay);
- scaleAnimatorY.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- view.setScaleY(1.0f);
- view.setLayerType(View.LAYER_TYPE_NONE, null);
- }
- });
-
- animators.add(scaleAnimatorY);
- }
-
- /**
- * Collapse a view out by scaling it from its current scaled value to 0.
- */
- public static void addCollapseOutAnimators(List<Animator> animators, final View view,
- int animationDelay) {
- view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
-
- final ObjectAnimator scaleAnimatorY = ObjectAnimator.ofFloat(view, View.SCALE_Y,
- view.getScaleY(), 0);
- scaleAnimatorY.setInterpolator(sDecelerateQuintInterpolator);
- scaleAnimatorY.setDuration(sAnimationDuration);
- scaleAnimatorY.setStartDelay(animationDelay);
- scaleAnimatorY.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- view.setScaleY(0);
- view.setLayerType(View.LAYER_TYPE_NONE, null);
- }
- });
-
- animators.add(scaleAnimatorY);
- }
-
- /**
- * Collapse a view out by scaling it from its current scaled value to 0.
- * The animators are expected to run immediately without a start delay.
- */
- public static void addCollapseOutAnimators(List<Animator> animators, final View view) {
- addCollapseOutAnimators(animators, view, 0 /* animation delay */);
- }
-
-
-
- /**
- * Fly a view out by moving it vertically off the bottom of the screen.
- */
- public static void addFlyOutAnimators(List<Animator> animators,
- final View view, int startTranslation, int endTranslation, int animationDelay) {
- addYTranslationAnimators(animators, view, startTranslation, endTranslation,
- animationDelay, null);
- }
-
- public static void addFlyOutAnimators(List<Animator> animators, final View view,
- int startTranslation, int endTranslation) {
- addFlyOutAnimators(animators, view, startTranslation,
- endTranslation, 0 /* animation delay */);
- }
-
- public static void addSlideInFromRightAnimators(List<Animator> animators, final View view,
- int startTranslation, int animationDelay) {
- addXTranslationAnimators(animators, view, startTranslation, 0, animationDelay, null);
- addFadeAnimators(animators, view, 0, 1.0f, animationDelay);
- }
-
- /**
- * Slide a view out of view from the start to end position, fading the view out as it
- * approaches the end position.
- */
- public static void addSlideOutAnimators(List<Animator> animators, final View view,
- int startTranslation, int endTranslation, int animationDelay) {
- addFadeAnimators(animators, view, view.getAlpha(), 0, animationDelay);
- addXTranslationAnimators(animators, view, startTranslation, endTranslation,
- animationDelay, null);
- }
-
- /**
- * Slide a view out of view from the start to end position, fading the view out as it
- * approaches the end position. The animators are expected to run immediately without a
- * start delay.
- */
- public static void addSlideOutAnimators(List<Animator> animators, final View view,
- int startTranslation, int endTranslation) {
- addSlideOutAnimators(animators, view, startTranslation,
- endTranslation, 0 /* animation delay */);
- }
-
- /**
- * Add animations to fade a view from the specified start alpha value to end value.
- */
- public static void addFadeAnimators(List<Animator> animators, final View view,
- float startAlpha, final float endAlpha, int animationDelay) {
- if (startAlpha == endAlpha) {
- return;
- }
-
- view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
- view.setAlpha(startAlpha);
-
- final ObjectAnimator fadeAnimator = ObjectAnimator.ofFloat(view, View.ALPHA,
- view.getAlpha(), endAlpha);
- fadeAnimator.setInterpolator(sDecelerateQuintInterpolator);
- fadeAnimator.setDuration(sAnimationDuration);
- fadeAnimator.setStartDelay(animationDelay);
- fadeAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- view.setAlpha(endAlpha);
- view.setLayerType(View.LAYER_TYPE_NONE, null);
- }
- });
- animators.add(fadeAnimator);
- }
-
- /**
- * Add animations to fade a view from the specified start alpha value to end value.
- * The animators are expected to run immediately without a start delay.
- */
- public static void addFadeAnimators(List<Animator> animators, final View view,
- float startAlpha, final float endAlpha) {
- addFadeAnimators(animators, view, startAlpha, endAlpha, 0 /* animation delay */);
- }
-}
diff --git a/src/com/android/deskclock/widget/sgv/StaggeredGridView.java b/src/com/android/deskclock/widget/sgv/StaggeredGridView.java
deleted file mode 100644
index aa44df4..0000000
--- a/src/com/android/deskclock/widget/sgv/StaggeredGridView.java
+++ /dev/null
@@ -1,4148 +0,0 @@
-/*
- * Copyright (C) 2012 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.widget.sgv;
-
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.AnimatorSet;
-import android.animation.ValueAnimator;
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.database.DataSetObserver;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.PixelFormat;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.os.Handler;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.v4.util.SparseArrayCompat;
-import android.support.v4.view.MotionEventCompat;
-import android.support.v4.view.VelocityTrackerCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.widget.EdgeEffectCompat;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.DragEvent;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.GridView;
-import android.widget.ImageView;
-import android.widget.ScrollView;
-
-import com.android.deskclock.widget.sgv.SgvAnimationHelper.AnimationIn;
-import com.android.deskclock.widget.sgv.SgvAnimationHelper.AnimationOut;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Temporarily copied from support v4 library so that StaggeredGridView can access
- * animation APIs on the current SDK version.
- */
-/**
- * ListView and GridView just not complex enough? Try StaggeredGridView!
- *
- * <p>StaggeredGridView presents a multi-column grid with consistent column sizes
- * but varying row sizes between the columns. Each successive item from a
- * {@link android.widget.ListAdapter ListAdapter} will be arranged from top to bottom,
- * left to right. The largest vertical gap is always filled first.</p>
- *
- * <p>Item views may span multiple columns as specified by their {@link LayoutParams}.
- * The attribute <code>android:layout_span</code> may be used when inflating
- * item views from xml.</p>
- */
-public class StaggeredGridView extends ViewGroup {
-
- private static final String TAG = "Clock-" + StaggeredGridView.class.getSimpleName();
-
- /*
- * There are a few things you should know if you're going to make modifications
- * to StaggeredGridView.
- *
- * Like ListView, SGV populates from an adapter and recycles views that fall out
- * of the visible boundaries of the grid. A few invariants always hold:
- *
- * - mFirstPosition is the adapter position of the View returned by getChildAt(0).
- * - Any child index can be translated to an adapter position by adding mFirstPosition.
- * - Any adapter position can be translated to a child index by subtracting mFirstPosition.
- * - Views for items in the range [mFirstPosition, mFirstPosition + getChildCount()) are
- * currently attached to the grid as children. All other adapter positions do not have
- * active views.
- *
- * This means a few things thanks to the staggered grid's nature. Some views may stay attached
- * long after they have scrolled offscreen if removing and recycling them would result in
- * breaking one of the invariants above.
- *
- * LayoutRecords are used to track data about a particular item's layout after the associated
- * view has been removed. These let positioning and the choice of column for an item
- * remain consistent even though the rules for filling content up vs. filling down vary.
- *
- * Whenever layout parameters for a known LayoutRecord change, other LayoutRecords before
- * or after it may need to be invalidated. e.g. if the item's height or the number
- * of columns it spans changes, all bets for other items in the same direction are off
- * since the cached information no longer applies.
- */
-
- private GridAdapter mAdapter;
-
- public static final int COLUMN_COUNT_AUTO = -1;
-
- /**
- * The window size to search for a specific item when restoring scroll position.
- */
- private final int SCROLL_RESTORE_WINDOW_SIZE = 10;
-
- private static final int CHILD_TO_REORDER_AREA_RATIO = 4;
-
- private static final int SINGLE_COL_REORDERING_AREA_SIZE = 30;
-
- // Time delay in milliseconds between posting each scroll runnables.
- private static final int SCROLL_HANDLER_DELAY = 5;
-
- // The default rate of pixels to scroll by when a child view is dragged towards the
- // upper and lower bound of this view.
- private static final int DRAG_SCROLL_RATE = 10;
-
- public static final int ANIMATION_DELAY_IN_MS = 50;
-
- private AnimationIn mAnimationInMode = AnimationIn.NONE;
- private AnimationOut mAnimationOutMode = AnimationOut.NONE;
-
- private AnimatorSet mCurrentRunningAnimatorSet = null;
-
- /**
- * Flag to indicate whether the current running animator set was canceled before it reaching
- * the end of the animations. This flag is used to help indicate whether the next set of
- * animators should resume from where the last animator set left off.
- */
- boolean mIsCurrentAnimationCanceled = false;
-
- private int mColCountSetting = 2;
- private int mColCount = 2;
- private int mMinColWidth = 0;
- private int mItemMargin = 0;
-
- private int[] mItemTops;
- private int[] mItemBottoms;
-
- private final Rect mTempRect = new Rect();
-
- private boolean mFastChildLayout;
- private boolean mPopulating;
- private boolean mInLayout;
-
- private boolean mIsRtlLayout;
-
- private final RecycleBin mRecycler = new RecycleBin();
-
- private final AdapterDataSetObserver mObserver = new AdapterDataSetObserver();
-
- private boolean mDataChanged;
- private int mItemCount;
-
- /**
- * After data set change, we ask adapter the first view that changed.
- * Any view from 0 to mFirstChangedPosition - 1 is not changed.
- */
- private int mFirstChangedPosition;
-
- /**
- * If set to true, then we guard against jagged edges in the grid by doing expensive
- * computation. Otherwise if this is false, we skip the computation.
- */
- private boolean mGuardAgainstJaggedEdges;
-
- private boolean mHasStableIds;
-
- /**
- * List of all views to animate out. This is used when we need to animate out stale views.
- */
- private final List<View> mViewsToAnimateOut = new ArrayList<View>();
-
- private int mFirstPosition;
-
- private long mFocusedChildIdToScrollIntoView;
- private ScrollState mCurrentScrollState;
-
- private final int mTouchSlop;
- private final int mMaximumVelocity;
- private final int mFlingVelocity;
- private float mLastTouchY = 0;
- private float mTouchRemainderY;
- private int mActivePointerId;
-
- private static final int TOUCH_MODE_IDLE = 0;
- private static final int TOUCH_MODE_DRAGGING = 1;
- private static final int TOUCH_MODE_FLINGING = 2;
- private static final int TOUCH_MODE_OVERFLING = 3;
-
- // Value used to estimate the range of scroll and scroll position
- final static int SCROLLING_ESTIMATED_ITEM_HEIGHT = 100;
-
- private int mTouchMode;
- private final VelocityTracker mVelocityTracker = VelocityTracker.obtain();
- private final OverScrollerSGV mScroller;
-
- private final EdgeEffectCompat mTopEdge;
- private final EdgeEffectCompat mBottomEdge;
-
- private boolean mIsDragReorderingEnabled;
-
- private ScrollListener mScrollListener;
- private OnSizeChangedListener mOnSizeChangedListener;
-
- // The view to show when the adapter is empty.
- private View mEmptyView;
-
- // The size of the region at location relative to the child's edges where reordering
- // can happen if another child view is dragged and dropped over it.
- private int mHorizontalReorderingAreaSize;
-
- // TODO: Put these states into a ReorderingParam object for maintainability.
- private ImageView mDragView;
-
- // X and Y positions of the touch down event that started the drag
- private int mTouchDownForDragStartX;
- private int mTouchDownForDragStartY;
-
- // X and Y offsets inside the item from where the user grabbed to the
- // child's left coordinate.
- // This is used to aid in the drawing of the drag shadow.
- private int mTouchOffsetToChildLeft;
- private int mTouchOffsetToChildTop;
-
- // Difference between screen coordinates and coordinates in this view.
- private int mOffsetToAbsoluteX;
- private int mOffsetToAbsoluteY;
-
- // the cached positions of the drag view when released.
- private Rect mCachedDragViewRect;
-
- // the current drag state
- private int mDragState;
-
- // the height of this view
- private int mHeight;
-
- // The bounds of the screen that should initiate scrolling when a view
- // is dragged past these positions.
- private int mUpperScrollBound;
- private int mLowerScrollBound;
-
- // The Bitmap that contains the drag shadow.
- private Bitmap mDragBitmap;
- private final int mOverscrollDistance;
-
- private final WindowManager mWindowManager;
- private WindowManager.LayoutParams mWindowParams;
- private static final int mWindowManagerLayoutFlags =
- WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
- WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
- WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
- WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
- WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
-
- private ReorderHelper mReorderHelper;
-
- /**
- * Indicates whether to use pixels-based or position-based scrollbar
- * properties.
- * This property is borrow from AbsListView
- */
- private boolean mSmoothScrollbarEnabled = false;
-
- private static final class LayoutRecord {
- public int column;
- public long id = -1;
- public int height;
- public int span;
- private int[] mMargins;
-
- private final void ensureMargins() {
- if (mMargins == null) {
- // Don't need to confirm length;
- // all layoutrecords are purged when column count changes.
- mMargins = new int[span * 2];
- }
- }
-
- public final int getMarginAbove(int col) {
- if (mMargins == null) {
- return 0;
- }
- return mMargins[col * 2];
- }
-
- public final int getMarginBelow(int col) {
- if (mMargins == null) {
- return 0;
- }
- return mMargins[col * 2 + 1];
- }
-
- public final void setMarginAbove(int col, int margin) {
- if (mMargins == null && margin == 0) {
- return;
- }
- ensureMargins();
- mMargins[col * 2] = margin;
- }
-
- public final void setMarginBelow(int col, int margin) {
- if (mMargins == null && margin == 0) {
- return;
- }
- ensureMargins();
- mMargins[col * 2 + 1] = margin;
- }
-
- @Override
- public String toString() {
- String result = "LayoutRecord{c=" + column + ", id=" + id + " h=" + height +
- " s=" + span;
- if (mMargins != null) {
- result += " margins[above, below](";
- for (int i = 0; i < mMargins.length; i += 2) {
- result += "[" + mMargins[i] + ", " + mMargins[i+1] + "]";
- }
- result += ")";
- }
- return result + "}";
- }
- }
-
- private final Map<Long, ViewRectPair> mChildRectsForAnimation =
- new HashMap<Long, ViewRectPair>();
-
- private final SparseArrayCompat<LayoutRecord> mLayoutRecords =
- new SparseArrayCompat<LayoutRecord>();
-
- // Handler for executing the scroll runnable
- private Handler mScrollHandler;
-
- // Boolean is true when the {@link #mDragScroller} scroll runanbled has been kicked off.
- // This is set back to false when it is removed from the handler.
- private boolean mIsDragScrollerRunning;
-
- /**
- * Scroller runnable to invoke scrolling when user is holding a dragged view over the upper
- * or lower bounds of the screen.
- */
- private final Runnable mDragScroller = new Runnable() {
- @Override
- public void run() {
- if (mDragState == ReorderUtils.DRAG_STATE_NONE) {
- return;
- }
-
- boolean enableUpdate = true;
- if (mLastTouchY >= mLowerScrollBound) {
- // scroll the list up a bit if we're past the lower bound, and the direction
- // of the movement is towards the bottom of the view.
- if (trackMotionScroll(-DRAG_SCROLL_RATE, false)) {
- // Disable reordering if the view is scrolling
- enableUpdate = false;
- }
- } else if (mLastTouchY <= mUpperScrollBound) {
- // scroll the list down a bit if we're past the upper bound, and the direction
- // of the movement is towards the top of the view.
- if (trackMotionScroll(DRAG_SCROLL_RATE, false)) {
- // Disable reordering if the view is scrolling
- enableUpdate = false;
- }
- }
-
- mReorderHelper.enableUpdatesOnDrag(enableUpdate);
-
- mScrollHandler.postDelayed(this, SCROLL_HANDLER_DELAY);
- }
- };
-
- public StaggeredGridView(Context context) {
- this(context, null);
- }
-
- public StaggeredGridView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- public StaggeredGridView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- final ViewConfiguration vc = ViewConfiguration.get(context);
- mTouchSlop = vc.getScaledTouchSlop();
- mMaximumVelocity = vc.getScaledMaximumFlingVelocity();
- mFlingVelocity = vc.getScaledMinimumFlingVelocity();
- mScroller = new OverScrollerSGV(context);
-
- mTopEdge = new EdgeEffectCompat(context);
- mBottomEdge = new EdgeEffectCompat(context);
- setWillNotDraw(false);
- setClipToPadding(false);
-
- SgvAnimationHelper.initialize(context);
-
- mDragState = ReorderUtils.DRAG_STATE_NONE;
- mIsDragReorderingEnabled = true;
- mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
- final ViewConfiguration configuration = ViewConfiguration.get(context);
- mOverscrollDistance = configuration.getScaledOverflingDistance();
- // Disable splitting event. Only one of the children can handle motion event.
- setMotionEventSplittingEnabled(false);
- }
-
- /**
- * Check to see if the current layout is Right-to-Left. This check is only supported for
- * API 17+. For earlier versions, this method will just return false.
- *
- * NOTE: This is based on the private API method in {@link View} class.
- *
- * @return boolean Boolean indicating whether the currently locale is RTL.
- */
- @SuppressLint("NewApi")
- private boolean isLayoutRtl() {
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
- return View.LAYOUT_DIRECTION_RTL == getLayoutDirection();
- } else {
- return false;
- }
- }
-
- /**
- * Set a fixed number of columns for this grid. Space will be divided evenly
- * among all columns, respecting the item margin between columns.
- * The default is 2. (If it were 1, perhaps you should be using a
- * {@link android.widget.ListView ListView}.)
- *
- * @param colCount Number of columns to display.
- * @see #setMinColumnWidth(int)
- */
- public void setColumnCount(int colCount) {
- if (colCount < 1 && colCount != COLUMN_COUNT_AUTO) {
- throw new IllegalArgumentException("Column count must be at least 1 - received " +
- colCount);
- }
- final boolean needsPopulate = colCount != mColCount;
- mColCount = mColCountSetting = colCount;
- if (needsPopulate) {
- // When switching column count, for now, don't restore scroll position, and just
- // start layout fresh again.
- clearAllState();
-
- mHorizontalReorderingAreaSize = 0;
- populate();
- }
- }
-
- public int getColumnCount() {
- return mColCount;
- }
-
- /**
- * Set whether or not to explicitly guard against "jagged edges" in the grid
- * (meaning that the top edge of the children views in the first row of the grid can be
- * horizontally misaligned).
- *
- * If guardAgainstJaggedEdges is true, then we prevent jagged edges by computing the heights of
- * all views starting at the 0th position of the adapter to figure out the proper offset of the
- * views currently on screen. This is an expensive operation and should be avoided if possible.
- *
- * If guardAgainstJaggedEdges is false, then we can skip the expensive computation that
- * guards against jagged edges and just layout views on the screen starting from mFirstPosition
- * (ignoring what came before it).
- */
- public void setGuardAgainstJaggedEdges(boolean guardAgainstJaggedEdges) {
- mGuardAgainstJaggedEdges = guardAgainstJaggedEdges;
- }
-
- /**
- * Set a minimum column width for
- * @param minColWidth
- */
- public void setMinColumnWidth(int minColWidth) {
- mMinColWidth = minColWidth;
- setColumnCount(COLUMN_COUNT_AUTO);
- }
-
- /**
- * Set the margin between items in pixels. This margin is applied
- * both vertically and horizontally.
- *
- * @param marginPixels Spacing between items in pixels
- */
- public void setItemMargin(int marginPixels) {
- // We only need to {@link #populate()} if the margin has been changed.
- if (marginPixels != mItemMargin) {
- mItemMargin = marginPixels;
- populate();
- }
- }
-
- public int getItemMargin() {
- return mItemMargin;
- }
-
- /**
- * When smooth scrollbar is enabled, the position and size of the scrollbar thumb
- * is computed based on the number of visible pixels in the visible items. This
- * however assumes that all list items have the same height. If you use a list in
- * which items have different heights, the scrollbar will change appearance as the
- * user scrolls through the list. To avoid this issue, you need to disable this
- * property.
- *
- * When smooth scrollbar is disabled, the position and size of the scrollbar thumb
- * is based solely on the number of items in the adapter and the position of the
- * visible items inside the adapter. This provides a stable scrollbar as the user
- * navigates through a list of items with varying heights.
- *
- * @param enabled Whether or not to enable smooth scrollbar.
- *
- * @see #setSmoothScrollbarEnabled(boolean)
- * @attr ref android.R.styleable#AbsListView_smoothScrollbar
- */
- public void setSmoothScrollbarEnabled(boolean enabled) {
- mSmoothScrollbarEnabled = enabled;
- }
-
- /**
- * Returns the current state of the fast scroll feature.
- *
- * @return True if smooth scrollbar is enabled is enabled, false otherwise.
- *
- * @see #setSmoothScrollbarEnabled(boolean)
- */
- public boolean isSmoothScrollbarEnabled() {
- return mSmoothScrollbarEnabled;
- }
-
-
- /**
- * Return the child view specified by the coordinates if
- * there exists a child there.
- *
- * @return the child in this StaggeredGridView at the coordinates, null otherwise.
- */
- private View getChildAtCoordinate(int x, int y) {
- if (y < 0) {
- // TODO: If we've dragged off the screen, return null for now until we know what
- // we'd like the experience to be like.
- return null;
- }
-
- final Rect frame = new Rect();
- final int count = getChildCount();
- for (int i = 0; i < count; i++) {
-
- final View childView = getChildAt(i);
- childView.getHitRect(frame);
- if (frame.contains(x, y)) {
- return getChildAt(i);
- }
- }
-
- // No child view at this coordinate.
- return null;
- }
-
- /**
- * Get the last Y coordinate on this grid where the last touch was made
- */
- public float getLastTouchY() {
- return mLastTouchY;
- }
-
- /**
- * Enable drag reordering of child items.
- */
- public void enableDragReordering() {
- mIsDragReorderingEnabled = true;
- }
-
- /**
- * Disable drag reordering of child items.
- */
- public void disableDragReordering() {
- mIsDragReorderingEnabled = false;
- }
-
- /**
- * Check to see if drag reordering is supported. The switch must be flipped to true, and there
- * must be a {@link ReorderListener} registered to listen for reordering events.
- *
- * @return boolean indicating whether drag reordering is currently supported.
- */
- private boolean isDragReorderingSupported() {
- return mIsDragReorderingEnabled && mReorderHelper != null &&
- mReorderHelper.hasReorderListener();
- }
-
- /**
- * Calculate bounds to assist in scrolling during a drag
- * @param y The y coordinate of the current drag.
- */
- private void initializeDragScrollParameters(int y) {
- // Calculate the upper and lower bound of the screen to support drag scrolling
- mHeight = getHeight();
- mUpperScrollBound = Math.min(y - mTouchSlop, mHeight / 5);
- mLowerScrollBound = Math.max(y + mTouchSlop, mHeight * 4 / 5);
- }
-
- /**
- * Initiate the dragging process. Create a bitmap that is displayed as the dragging event
- * happens and is moved around across the screen. This function is called once for each time
- * that a dragging event is initiated.
- *
- * The logic to this method was borrowed from the TouchInterceptor.java class from the
- * music app.
- *
- * @param draggedChild The child view being dragged
- * @param x The x coordinate of this view where dragging began
- * @param y The y coordinate of this view where dragging began
- */
- private void startDragging(final View draggedChild, final int x, final int y) {
- if (!isDragReorderingSupported()) {
- return;
- }
-
- mDragBitmap = createDraggedChildBitmap(draggedChild);
- if (mDragBitmap == null) {
- // It appears that creating bitmaps for large views fail. For now, don't allow
- // dragging in this scenario. When using the framework's drag and drop implementation,
- // drag shadow also fails with a OutofResourceException when trying to draw the drag
- // shadow onto a Surface.
- mReorderHelper.handleDragCancelled(draggedChild);
- return;
- }
- mTouchOffsetToChildLeft = x - draggedChild.getLeft();
- mTouchOffsetToChildTop = y - draggedChild.getTop();
- updateReorderStates(ReorderUtils.DRAG_STATE_DRAGGING);
-
- initializeDragScrollParameters(y);
-
- final LayoutParams params = (LayoutParams) draggedChild.getLayoutParams();
- mReorderHelper.handleDragStart(draggedChild, params.position, params.id,
- new Point(mTouchDownForDragStartX, mTouchDownForDragStartY));
-
- // TODO: Reconsider using the framework's DragShadow support for dragging,
- // and only draw the bitmap in onDrop for animation.
- final Context context = getContext();
- mDragView = new ImageView(context);
- mDragView.setImageBitmap(mDragBitmap);
- mDragView.setAlpha(160);
-
- mWindowParams = new WindowManager.LayoutParams();
- mWindowParams.gravity = Gravity.TOP | Gravity.START;
-
- mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
- mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
- mWindowParams.flags = mWindowManagerLayoutFlags;
- mWindowParams.format = PixelFormat.TRANSLUCENT;
- // Use WindowManager to overlay a transparent image on drag
- mWindowManager.addView(mDragView, mWindowParams);
- updateDraggedBitmapLocation(x, y);
- }
-
- private Bitmap createDraggedChildBitmap(View view) {
- view.setDrawingCacheEnabled(true);
- final Bitmap cache = view.getDrawingCache();
-
- Bitmap bitmap = null;
- if (cache != null) {
- try {
- bitmap = cache.copy(Bitmap.Config.ARGB_8888, false);
- } catch (final OutOfMemoryError e) {
- Log.w(TAG, "Failed to copy bitmap from Drawing cache", e);
- bitmap = null;
- }
- }
-
- view.destroyDrawingCache();
- view.setDrawingCacheEnabled(false);
-
- return bitmap;
- }
-
- /**
- * Updates the current drag state and the UI appropriately.
- * @param state the new drag state to update to.
- */
- private void updateReorderStates(int state) throws IllegalStateException {
- boolean resetDraggedChildView = false;
- boolean resetDragProperties = false;
-
- mDragState = state;
-
- switch (state) {
- case ReorderUtils.DRAG_STATE_NONE:
- case ReorderUtils.DRAG_STATE_DRAGGING:
- // reset all states when a drag is complete or when we're starting a new drag.
- resetDraggedChildView = true;
- resetDragProperties = true;
- break;
-
- case ReorderUtils.DRAG_STATE_RELEASED_REORDER:
- // In a release over a valid reordering zone, don't reset any UI. Let
- // LayoutChildren() take care of doing the appropriate animation
- // based on the result
- break;
-
- case ReorderUtils.DRAG_STATE_RELEASED_HOVER:
- // When a dragged child is released over another child, the dragged child will
- // remain hidden. It is up to the ReorderListener to refresh the UI state
- // of the child if it does not handle the drop.
- resetDragProperties = true;
- break;
-
- default:
- throw new IllegalStateException("Illegal drag state: " + mDragState);
- }
-
- if (resetDraggedChildView && mReorderHelper.getDraggedChild() != null) {
- // DraggedChildId and mCachedDragViewRect need to stay around longer than
- // the other properties because on the next data change, as we lay out, we'll need
- // mCachedDragViewRect to position the view's animation start position, and
- // draggedChildId to check if the current was the dragged view.
- // For the other properties - DraggedOverChildView, DraggedChildView, etc.,
- // as soon as drag is released, we can reset them because they have no impact on the
- // next layout pass.
- mReorderHelper.clearDraggedChildId();
- mCachedDragViewRect = null;
- }
-
- if (resetDragProperties) {
- if (mDragView != null) {
- mDragView.setVisibility(INVISIBLE);
- mWindowManager.removeView(mDragView);
- mDragView.setImageDrawable(null);
- mDragView = null;
-
- if (mDragBitmap != null) {
- mDragBitmap.recycle();
- mDragBitmap = null;
- }
- }
-
- // We don't reset DraggedChildId here because it may still be in used.
- // Let LayoutChildren reset it when it's done with it.
- mReorderHelper.clearDraggedChild();
- mReorderHelper.clearDraggedOverChild();
- }
- }
-
- /**
- * Redraw the dragged child's bitmap based on the new coordinates. If the reordering direction
- * is {@link ReorderUtils#REORDER_DIRECTION_VERTICAL}, then ignore the x coordinate, as
- * only vertical movement is allowed. Similarly, if reordering direction is
- * {@link ReorderUtils#REORDER_DIRECTION_HORIZONTAL}. Even though this class does not manage
- * drag shadow directly, we need to make sure we position the dragged bitmap at where the
- * drag shadow is so that when drag ends, we can swap the shadow and the bitmap to animate
- * the view into place.
- * @param x The updated x coordinate of the drag shadow.
- * @param y THe updated y coordinate of the drag shadow.
- */
- private void updateDraggedBitmapLocation(int x, int y) {
- final int direction = mAdapter.getReorderingDirection();
- if ((direction & ReorderUtils.REORDER_DIRECTION_HORIZONTAL) ==
- ReorderUtils.REORDER_DIRECTION_HORIZONTAL) {
- if (mDragBitmap != null && mDragBitmap.getWidth() > getWidth()) {
- // If the bitmap is wider than the width of the screen, then some parts of the view
- // are off screen. In this case, just set the drag shadow to start at x = 0
- // (adjusted to the absolute position on screen) so that at least the beginning of
- // the drag shadow is guaranteed to be within view.
- mWindowParams.x = mOffsetToAbsoluteX;
- } else {
- // WindowParams is RTL agnostic and operates on raw coordinates. So in an RTL
- // layout, we would still want to find the view's left coordinate for the
- // drag shadow, rather than the view's start.
- mWindowParams.x = x - mTouchOffsetToChildLeft + mOffsetToAbsoluteX;
- }
- } else {
- mWindowParams.x = mOffsetToAbsoluteX;
- }
-
- if ((direction & ReorderUtils.REORDER_DIRECTION_VERTICAL) ==
- ReorderUtils.REORDER_DIRECTION_VERTICAL) {
- mWindowParams.y = y - mTouchOffsetToChildTop + mOffsetToAbsoluteY;
- } else {
- mWindowParams.y = mOffsetToAbsoluteY;
- }
-
- mWindowManager.updateViewLayout(mDragView, mWindowParams);
- }
-
- /**
- * Update the visual state of the drag event based on the current drag location. If the user
- * has attempted to re-order by dragging a child over another child's drop zone, call the
- * appropriate {@link ReorderListener} callback.
- *
- * @param x The current x coordinate of the drag event
- * @param y The current y coordinate of the drag event
- */
- private void handleDrag(int x, int y) {
- if (mDragState != ReorderUtils.DRAG_STATE_DRAGGING) {
- return;
- }
-
- // TODO: Consider moving drag shadow management logic into mReorderHelper as well, or
- // scrap the custom logic and use the framework's drag-and-drop support now that we're not
- // doing anything special to the drag shadow.
- updateDraggedBitmapLocation(x, y);
-
- if (mCurrentRunningAnimatorSet == null) {
- // If the current animator set is not null, then animation is running, in which case,
- // we shouldn't do any reordering processing, as views will be moving around, and
- // interfering with drag target calculations.
- mReorderHelper.handleDrag(new Point(x, y));
- }
- }
-
- /**
- * Check if a view is reorderable.
- * @param i the child index in view group
- */
- public boolean isChildReorderable(int i) {
- return mAdapter.isDraggable(mFirstPosition + i);
- }
-
- /**
- * Handle the the release of a dragged view.
- * @param x The current x coordinate where the drag was released.
- * @param y The current y coordinate where the drag was released.
- */
- private void handleDrop(int x, int y) {
- if (!mReorderHelper.hasReorderListener()) {
- updateReorderStates(ReorderUtils.DRAG_STATE_NONE);
- return;
- }
-
- if (mReorderHelper.isOverReorderingArea()) {
- // Store the location of the drag shadow at where dragging stopped
- // for animation if a reordering has just happened. Since the drag
- // shadow is drawn as a WindowManager view, its coordinates are
- // absolute. However, for views inside the grid, we need to operate
- // with coordinate values that's relative to this grid, so we need
- // to subtract the offset to absolute screen coordinates that have
- // been added to mWindowParams.
- final int left = mWindowParams.x - mOffsetToAbsoluteX;
- final int top = mWindowParams.y - mOffsetToAbsoluteY;
-
- mCachedDragViewRect = new Rect(
- left, top, left + mDragView.getWidth(), top + mDragView.getHeight());
- if (getChildCount() > 0) {
- final View view = getChildAt(0);
- final LayoutParams lp = (LayoutParams) view.getLayoutParams();
- if (lp.position > mReorderHelper.getDraggedChildPosition()) {
- // If the adapter position of the first child in view is
- // greater than the position of the original dragged child,
- // this means that the user has scrolled the child out of
- // view. Those off screen views would have been recycled. If
- // mFirstPosition is currently x, after the reordering
- // operation, the child[mFirstPosition] will be
- // at mFirstPosition-1. We want to adjust mFirstPosition so
- // that we render the view in the correct location after
- // reordering completes.
- //
- // If the user has not scrolled the original dragged child
- // out of view, then the view has not been recycled and is
- // still in view.
- // When onLayout() gets called, we'll automatically fill in
- // the empty space that the child leaves behind from the
- // reordering operation.
- mFirstPosition--;
- }
- }
-
- // Get the current scroll position so that after reordering
- // completes, we can restore the scroll position of mFirstPosition.
- mCurrentScrollState = getScrollState();
- }
-
- final boolean reordered = mReorderHelper.handleDrop(new Point(x, y));
- if (reordered) {
- updateReorderStates(ReorderUtils.DRAG_STATE_RELEASED_REORDER);
- } else {
- updateReorderStates(ReorderUtils.DRAG_STATE_NONE);
- }
- }
-
- @Override
- public boolean onInterceptTouchEvent(MotionEvent ev) {
- mVelocityTracker.addMovement(ev);
- final int action = ev.getAction() & MotionEventCompat.ACTION_MASK;
- switch (action) {
- case MotionEvent.ACTION_DOWN: {
- mOffsetToAbsoluteX = (int)(ev.getRawX() - ev.getX());
- mOffsetToAbsoluteY = (int)(ev.getRawY() - ev.getY());
-
- // Per bug 7377413, event.getX() and getY() returns rawX and rawY when accessed in
- // dispatchDragEvent, so since an action down is required before a drag can be
- // initiated, initialize mTouchDownForDragStartX/Y here for the most accurate value.
- mTouchDownForDragStartX = (int) ev.getX();
- mTouchDownForDragStartY = (int) ev.getY();
-
- mVelocityTracker.clear();
- mScroller.abortAnimation();
- mLastTouchY = ev.getY();
- mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
- mTouchRemainderY = 0;
- if (mTouchMode == TOUCH_MODE_FLINGING) {
- // Catch!
- mTouchMode = TOUCH_MODE_DRAGGING;
- return true;
- }
- break;
- }
- case MotionEvent.ACTION_MOVE: {
- final int index = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
- if (index < 0) {
- Log.e(TAG, "onInterceptTouchEvent could not find pointer with id " +
- mActivePointerId + " - did StaggeredGridView receive an inconsistent " +
- "event stream?");
- return false;
- }
- final float y = MotionEventCompat.getY(ev, index);
- final float dy = y - mLastTouchY + mTouchRemainderY;
- final int deltaY = (int) dy;
- mTouchRemainderY = dy - deltaY;
-
- if (Math.abs(dy) > mTouchSlop) {
- mTouchMode = TOUCH_MODE_DRAGGING;
- return true;
- }
- }
- }
-
- return false;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent ev) {
- mVelocityTracker.addMovement(ev);
- final int action = ev.getAction() & MotionEventCompat.ACTION_MASK;
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- resetScroller();
- mVelocityTracker.clear();
- mScroller.abortAnimation();
- mLastTouchY = ev.getY();
- mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
- mTouchRemainderY = 0;
- break;
-
- case MotionEvent.ACTION_MOVE: {
- final int index = MotionEventCompat.findPointerIndex(ev, mActivePointerId);
- if (index < 0) {
- Log.e(TAG, "onInterceptTouchEvent could not find pointer with id " +
- mActivePointerId + " - did StaggeredGridView receive an inconsistent " +
- "event stream?");
- return false;
- }
-
- final float y = MotionEventCompat.getY(ev, index);
- final float dy = y - mLastTouchY + mTouchRemainderY;
- final int deltaY = (int) dy;
- mTouchRemainderY = dy - deltaY;
-
- if (Math.abs(dy) > mTouchSlop) {
- mTouchMode = TOUCH_MODE_DRAGGING;
- }
-
- if (mTouchMode == TOUCH_MODE_DRAGGING) {
- mLastTouchY = y;
- if (!trackMotionScroll(deltaY, true)) {
- // Break fling velocity if we impacted an edge.
- mVelocityTracker.clear();
- }
- }
- break;
- }
-
- case MotionEvent.ACTION_CANCEL: {
- mTouchMode = TOUCH_MODE_IDLE;
- break;
- }
-
- case MotionEvent.ACTION_UP: {
- mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
- final float velocity = VelocityTrackerCompat.getYVelocity(mVelocityTracker,
- mActivePointerId);
- if (Math.abs(velocity) > mFlingVelocity) {
- mTouchMode = TOUCH_MODE_FLINGING;
- resetScroller();
- mScroller.fling(0, 0, 0, (int) velocity, 0, 0,
- Integer.MIN_VALUE, Integer.MAX_VALUE);
- mLastTouchY = 0;
- ViewCompat.postInvalidateOnAnimation(this);
- } else {
- mTouchMode = TOUCH_MODE_IDLE;
- }
- }
- break;
- }
-
- return true;
- }
-
- private void resetScroller() {
- mTouchMode = TOUCH_MODE_IDLE;
- mTopEdge.finish();
- mBottomEdge.finish();
- mScroller.abortAnimation();
- }
-
- @Override
- public boolean dispatchDragEvent(DragEvent event) {
- if (!isDragReorderingSupported()) {
- // If the consumer of this StaggeredGridView has not registered a ReorderListener,
- // don't bother handling drag events.
- return super.dispatchDragEvent(event);
- }
-
- switch(event.getAction()) {
- case DragEvent.ACTION_DRAG_STARTED:
- // Per bug 7071594, we won't be able to catch this event in onDragEvent,
- // so we'll handle the event as it is being dispatched on the way down.
- if (mReorderHelper.hasReorderListener() && mIsDragReorderingEnabled) {
- final View child = getChildAtCoordinate(
- mTouchDownForDragStartX, mTouchDownForDragStartY);
- if (child != null) {
- // Child can be null if the touch point is not on a child view, but is
- // still within the bounds of this StaggeredGridView (i.e., margins
- // between cells).
- startDragging(child, mTouchDownForDragStartX, mTouchDownForDragStartY);
- // We must return true in order to continue getting future
- // {@link DragEvent}s.
- return true;
- }
- }
- // Be sure to return a value here instead of calling super.dispatchDragEvent()
- // which will unnecessarily dispatch to all the children (since the
- // {@link StaggeredGridView} handles all drag events for our purposes)
- return false;
-
- case DragEvent.ACTION_DROP:
- case DragEvent.ACTION_DRAG_ENDED:
- if (mDragState == ReorderUtils.DRAG_STATE_DRAGGING) {
- handleDrop((int)event.getX(), (int)event.getY());
- }
-
- // Return early here to avoid calling super.dispatchDragEvent() which dispatches to
- // children (since this view already can handle all drag events). The super call
- // can also cause a NPE if the view hierarchy changed in the middle of a drag
- // and the {@link DragEvent} gets nulled out. This is a workaround for
- // a framework bug: 8298439.
- // Since the {@link StaggeredGridView} handles all drag events for our purposes,
- // just manually fire the drag event to ourselves.
- return onDragEvent(event);
- }
-
- // In all other cases, default to the superclass implementation. We need this so that
- // the drag/drop framework will fire off {@link #onDragEvent(DragEvent ev)} calls to us.
- return super.dispatchDragEvent(event);
- }
-
- @Override
- public boolean onDragEvent(DragEvent ev) {
- if (!isDragReorderingSupported()) {
- // If the consumer of this StaggeredGridView has not registered a ReorderListener,
- // don't bother handling drag events.
- return false;
- }
-
- final int x = (int)ev.getX();
- final int y = (int)ev.getY();
-
- switch(ev.getAction()) {
- case DragEvent.ACTION_DRAG_LOCATION:
- if (mDragState == ReorderUtils.DRAG_STATE_DRAGGING) {
- handleDrag(x, y);
- mLastTouchY = y;
- }
-
- // Kick off the scroll handler on the first drag location event,
- // if it's not already running
- if (!mIsDragScrollerRunning &&
- // And if the distance traveled while dragging exceeds the touch slop
- ((Math.abs(x - mTouchDownForDragStartX) >= 4 * mTouchSlop) ||
- (Math.abs(y - mTouchDownForDragStartY) >= 4 * mTouchSlop))) {
- // Set true because that the scroller is running now
- mIsDragScrollerRunning = true;
-
- if (mScrollHandler == null) {
- mScrollHandler = getHandler();
- }
- mScrollHandler.postDelayed(mDragScroller, SCROLL_HANDLER_DELAY);
- }
-
- return true;
-
- case DragEvent.ACTION_DROP:
- case DragEvent.ACTION_DRAG_ENDED:
- // We can either expect to receive:
- // 1. Both {@link DragEvent#ACTION_DROP} and then
- // {@link DragEvent#ACTION_DRAG_ENDED} if the drop is over this view.
- // 2. Only {@link DragEvent#ACTION_DRAG_ENDED} if the drop happened over a
- // different view.
- // For this reason, we should always handle the drop. In case #1, if this code path
- // gets executed again then nothing will happen because we will have already
- // updated {@link #mDragState} to not be {@link ReorderUtils#DRAG_STATE_DRAGGING}.
- if (mScrollHandler != null) {
- mScrollHandler.removeCallbacks(mDragScroller);
- // Scroller is no longer running
- mIsDragScrollerRunning = false;
- }
-
- return true;
- }
-
- return false;
- }
-
- /**
- *
- * @param deltaY Pixels that content should move by
- * @return true if the movement completed, false if it was stopped prematurely.
- */
- private boolean trackMotionScroll(int deltaY, boolean allowOverScroll) {
- final boolean contentFits = contentFits();
- final int allowOverhang = Math.abs(deltaY);
- final int overScrolledBy;
- final int movedBy;
- if (!contentFits) {
- int overhang;
- final boolean up;
- mPopulating = true;
- if (deltaY > 0) {
- overhang = fillUp(mFirstPosition - 1, allowOverhang);
- up = true;
- } else {
- overhang = fillDown(mFirstPosition + getChildCount(), allowOverhang);
-
- if (overhang < 0) {
- // Overhang when filling down indicates how many pixels past the bottom of the
- // screen has been filled in. If this value is negative, it should be set to
- // 0 so that we don't allow over scrolling.
- overhang = 0;
- }
-
- up = false;
- }
-
- movedBy = Math.min(overhang, allowOverhang);
- offsetChildren(up ? movedBy : -movedBy);
- recycleOffscreenViews();
- mPopulating = false;
- overScrolledBy = allowOverhang - overhang;
- } else {
- overScrolledBy = allowOverhang;
- movedBy = 0;
- }
-
- if (allowOverScroll) {
- final int overScrollMode = ViewCompat.getOverScrollMode(this);
-
- if (overScrollMode == ViewCompat.OVER_SCROLL_ALWAYS ||
- (overScrollMode == ViewCompat.OVER_SCROLL_IF_CONTENT_SCROLLS && !contentFits)) {
-
- if (overScrolledBy > 0) {
- final EdgeEffectCompat edge = deltaY > 0 ? mTopEdge : mBottomEdge;
- edge.onPull((float) Math.abs(deltaY) / getHeight());
- ViewCompat.postInvalidateOnAnimation(this);
- }
- }
- }
-
- awakenScrollBars(0 /* show immediately */, true /* invalidate */);
- return deltaY == 0 || movedBy != 0;
- }
-
- public final boolean contentFits() {
- if (mFirstPosition != 0 || getChildCount() != mItemCount) {
- return false;
- }
-
- int topmost = Integer.MAX_VALUE;
- int bottommost = Integer.MIN_VALUE;
- for (int i = 0; i < mColCount; i++) {
- if (mItemTops[i] < topmost) {
- topmost = mItemTops[i];
- }
- if (mItemBottoms[i] > bottommost) {
- bottommost = mItemBottoms[i];
- }
- }
-
- return topmost >= getPaddingTop() && bottommost <= getHeight() - getPaddingBottom();
- }
-
- /**
- * Recycle views within the range starting from startIndex (inclusive) until the last
- * attached child view.
- */
- private void recycleViewsInRange(int startIndex, int endIndex) {
- for (int i = endIndex; i >= startIndex; i--) {
- final View child = getChildAt(i);
-
- if (mInLayout) {
- removeViewsInLayout(i, 1);
- } else {
- removeViewAt(i);
- }
-
- mRecycler.addScrap(child);
- }
- }
-
- // TODO: Have other overloaded recycle methods call into this one so we would just have one
- // code path.
- private void recycleView(View view) {
- if (view == null) {
- return;
- }
-
- if (mInLayout) {
- removeViewInLayout(view);
- invalidate();
- } else {
- removeView(view);
- }
-
- mRecycler.addScrap(view);
- }
-
- /**
- * Important: this method will leave offscreen views attached if they
- * are required to maintain the invariant that child view with index i
- * is always the view corresponding to position mFirstPosition + i.
- */
- private void recycleOffscreenViews() {
- if (getChildCount() == 0) {
- return;
- }
-
- final int height = getHeight();
- final int clearAbove = -mItemMargin;
- final int clearBelow = height + mItemMargin;
- for (int i = getChildCount() - 1; i >= 0; i--) {
- final View child = getChildAt(i);
- if (child.getTop() <= clearBelow) {
- // There may be other offscreen views, but we need to maintain
- // the invariant documented above.
- break;
- }
-
- child.clearFocus();
- if (mInLayout) {
- removeViewsInLayout(i, 1);
- } else {
- removeViewAt(i);
- }
-
- mRecycler.addScrap(child);
- }
-
- while (getChildCount() > 0) {
- final View child = getChildAt(0);
- if (child.getBottom() >= clearAbove) {
- // There may be other offscreen views, but we need to maintain
- // the invariant documented above.
- break;
- }
-
- child.clearFocus();
- if (mInLayout) {
- removeViewsInLayout(0, 1);
- } else {
- removeViewAt(0);
- }
-
- mRecycler.addScrap(child);
- mFirstPosition++;
- }
-
- final int childCount = getChildCount();
- if (childCount > 0) {
- // Repair the top and bottom column boundaries from the views we still have
- Arrays.fill(mItemTops, Integer.MAX_VALUE);
- Arrays.fill(mItemBottoms, Integer.MIN_VALUE);
- for (int i = 0; i < childCount; i++){
- final View child = getChildAt(i);
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
- final int top = child.getTop() - mItemMargin;
- final int bottom = child.getBottom();
- LayoutRecord rec = mLayoutRecords.get(mFirstPosition + i);
-
- // It's possible the layout record could be null for visible views because
- // they are cleared between adapter data set changes, but the views are left
- // attached for the purpose of animations. Hence, populate the layout record again.
- if (rec == null) {
- rec = recreateLayoutRecord(mFirstPosition + i, child, lp);
- }
-
- // In LTR layout, iterate across each column that this child is laid out in,
- // starting from the child's first column (lp.column). For each column, update
- // mItemTops and mItemBottoms appropriately to take into account this child's
- // dimension. In RTL layout, iterate in reverse, where the child's starting
- // column would start from the right-most.
- final int span = Math.min(mColCount, lp.span);
- for (int spanIndex = 0; spanIndex < span; spanIndex++) {
- final int col = mIsRtlLayout ? lp.column - spanIndex :
- lp.column + spanIndex;
- final int colTop = top - rec.getMarginAbove(spanIndex);
- final int colBottom = bottom + rec.getMarginBelow(spanIndex);
- if (colTop < mItemTops[col]) {
- mItemTops[col] = colTop;
- }
- if (colBottom > mItemBottoms[col]) {
- mItemBottoms[col] = colBottom;
- }
- }
- }
-
- for (int col = 0; col < mColCount; col++) {
- if (mItemTops[col] == Integer.MAX_VALUE) {
- // If one was untouched, both were.
- final int top = getPaddingTop();
- mItemTops[col] = top;
- mItemBottoms[col] = top;
- }
- }
- }
-
- mCurrentScrollState = getScrollState();
- }
-
- private LayoutRecord recreateLayoutRecord(int position, View child, LayoutParams lp) {
- final LayoutRecord rec = new LayoutRecord();
- mLayoutRecords.put(position, rec);
- rec.column = lp.column;
- rec.height = child.getHeight();
- rec.id = lp.id;
- rec.span = Math.min(mColCount, lp.span);
- return rec;
- }
-
- @Override
- public void computeScroll() {
- if (mTouchMode == TOUCH_MODE_OVERFLING) {
- handleOverfling();
- } else if (mScroller.computeScrollOffset()) {
- final int overScrollMode = ViewCompat.getOverScrollMode(this);
- final boolean supportsOverscroll = overScrollMode != ViewCompat.OVER_SCROLL_NEVER;
- final int y = mScroller.getCurrY();
- final int dy = (int) (y - mLastTouchY);
- // TODO: Figure out why mLastTouchY is being updated here. Consider using a new class
- // variable since this value does not represent the last place on the screen where a
- // touch occurred.
- mLastTouchY = y;
- // Check if the top of the motion view is where it is
- // supposed to be
- final View motionView = supportsOverscroll &&
- getChildCount() > 0 ? getChildAt(0) : null;
- final int motionViewPrevTop = motionView != null ? motionView.getTop() : 0;
- final boolean stopped = !trackMotionScroll(dy, false);
- if (!stopped && !mScroller.isFinished()) {
- mTouchMode = TOUCH_MODE_IDLE;
- ViewCompat.postInvalidateOnAnimation(this);
- } else if (stopped && dy != 0 && supportsOverscroll) {
- // Check to see if we have bumped into the scroll limit
- if (motionView != null) {
- final int motionViewRealTop = motionView.getTop();
- // Apply overscroll
- final int overscroll = -dy - (motionViewRealTop - motionViewPrevTop);
- overScrollBy(0, overscroll, 0, getScrollY(), 0, 0, 0, mOverscrollDistance,
- true);
- }
- final EdgeEffectCompat edge;
- if (dy > 0) {
- edge = mTopEdge;
- mBottomEdge.finish();
- } else {
- edge = mBottomEdge;
- mTopEdge.finish();
- }
- edge.onAbsorb(Math.abs((int) mScroller.getCurrVelocity()));
- if (mScroller.computeScrollOffset()) {
- mScroller.notifyVerticalEdgeReached(getScrollY(), 0, mOverscrollDistance);
- }
- mTouchMode = TOUCH_MODE_OVERFLING;
- ViewCompat.postInvalidateOnAnimation(this);
- } else {
- mTouchMode = TOUCH_MODE_IDLE;
- }
- }
- }
-
- private void handleOverfling() {
- // If the animation is not finished yet, determine next steps.
- if (mScroller.computeScrollOffset()) {
- final int scrollY = getScrollY();
- final int currY = mScroller.getCurrY();
- final int deltaY = currY - scrollY;
- if (overScrollBy(0, deltaY, 0, scrollY, 0, 0, 0, mOverscrollDistance, false)) {
- final boolean crossDown = scrollY <= 0 && currY > 0;
- final boolean crossUp = scrollY >= 0 && currY < 0;
- if (crossDown || crossUp) {
- int velocity = (int) mScroller.getCurrVelocity();
- if (crossUp) {
- velocity = -velocity;
- }
-
- // Don't flywheel from this; we're just continuing
- // things.
- mTouchMode = TOUCH_MODE_IDLE;
- mScroller.abortAnimation();
- } else {
- // Spring back! We are done overscrolling.
- if (mScroller.springBack(0, scrollY, 0, 0, 0, 0)) {
- mTouchMode = TOUCH_MODE_OVERFLING;
- ViewCompat.postInvalidateOnAnimation(this);
- } else {
- // If already valid, we are done. Exit overfling mode.
- mTouchMode = TOUCH_MODE_IDLE;
- }
- }
- } else {
- // Still over-flinging; just post the next frame of the animation.
- ViewCompat.postInvalidateOnAnimation(this);
- }
- } else {
- // Otherwise, exit overfling mode.
- mTouchMode = TOUCH_MODE_IDLE;
- mScroller.abortAnimation();
- }
- }
-
- @Override
- protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
- if (getScrollY() != scrollY) {
- scrollTo(0, scrollY);
- }
- }
-
- @Override
- public void draw(Canvas canvas) {
- super.draw(canvas);
-
- if (mTopEdge != null) {
- boolean needsInvalidate = false;
- if (!mTopEdge.isFinished()) {
- final int restoreCount = canvas.save();
- canvas.translate(0, 0);
- mTopEdge.draw(canvas);
- canvas.restoreToCount(restoreCount);
- needsInvalidate = true;
- }
- if (!mBottomEdge.isFinished()) {
- final int restoreCount = canvas.save();
- final int width = getWidth();
- canvas.translate(-width, getHeight());
- canvas.rotate(180, width, 0);
- mBottomEdge.draw(canvas);
- canvas.restoreToCount(restoreCount);
- needsInvalidate = true;
- }
-
- if (needsInvalidate) {
- ViewCompat.postInvalidateOnAnimation(this);
- }
- }
- }
-
- public void beginFastChildLayout() {
- mFastChildLayout = true;
- }
-
- public void endFastChildLayout() {
- mFastChildLayout = false;
- populate();
- }
-
- @Override
- public void requestLayout() {
- if (!mPopulating && !mFastChildLayout) {
- super.requestLayout();
- }
- }
-
- /**
- * Sets the view to show if the adapter is empty
- */
- public void setEmptyView(View emptyView) {
- mEmptyView = emptyView;
-
- updateEmptyStatus();
- }
-
- public View getEmptyView() {
- return mEmptyView;
- }
-
- /**
- * Update the status of the list based on the whether the adapter is empty. If is it empty and
- * we have an empty view, display it. In all the other cases, make sure that the
- * StaggeredGridView is VISIBLE and that the empty view is GONE (if it's not null).
- */
- private void updateEmptyStatus() {
- if (mAdapter == null || mAdapter.isEmpty()) {
- if (mEmptyView != null) {
- mEmptyView.setVisibility(View.VISIBLE);
- setVisibility(View.GONE);
- } else {
- setVisibility(View.VISIBLE);
- }
- } else {
- if (mEmptyView != null) {
- mEmptyView.setVisibility(View.GONE);
- }
- setVisibility(View.VISIBLE);
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- int heightMode = MeasureSpec.getMode(heightMeasureSpec);
- final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
- final int heightSize = MeasureSpec.getSize(heightMeasureSpec);
-
- if (widthMode != MeasureSpec.EXACTLY) {
- Log.d(TAG, "onMeasure: must have an exact width or match_parent! " +
- "Using fallback spec of EXACTLY " + widthSize);
- widthMode = MeasureSpec.EXACTLY;
- }
- if (heightMode != MeasureSpec.EXACTLY) {
- Log.d(TAG, "onMeasure: must have an exact height or match_parent! " +
- "Using fallback spec of EXACTLY " + heightSize);
- heightMode = MeasureSpec.EXACTLY;
- }
-
- setMeasuredDimension(widthSize, heightSize);
-
- if (mColCountSetting == COLUMN_COUNT_AUTO) {
- final int colCount = widthSize / mMinColWidth;
- if (colCount != mColCount) {
- mColCount = colCount;
- }
- }
-
- if (mHorizontalReorderingAreaSize == 0) {
- if (mColCount > 1) {
- final int totalMarginWidth = mItemMargin * (mColCount + 1);
- final int singleViewWidth = (widthSize - totalMarginWidth) / mColCount;
- mHorizontalReorderingAreaSize = singleViewWidth / CHILD_TO_REORDER_AREA_RATIO;
- } else {
- mHorizontalReorderingAreaSize = SINGLE_COL_REORDERING_AREA_SIZE;
- }
- }
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- mIsRtlLayout = isLayoutRtl();
-
- mInLayout = true;
- populate();
- mInLayout = false;
- final int width = r - l;
- final int height = b - t;
- mTopEdge.setSize(width, height);
- mBottomEdge.setSize(width, height);
- }
-
- private void populate() {
- if (getWidth() == 0 || getHeight() == 0 || mAdapter == null) {
- return;
- }
-
- if (mColCount == COLUMN_COUNT_AUTO) {
- final int colCount = getWidth() / mMinColWidth;
- if (colCount != mColCount) {
- mColCount = colCount;
- }
- }
-
- final int colCount = mColCount;
- if (mItemTops == null || mItemBottoms == null || mItemTops.length != colCount ||
- mItemBottoms.length != colCount) {
- mItemTops = new int[colCount];
- mItemBottoms = new int[colCount];
-
- mLayoutRecords.clear();
- if (mInLayout) {
- removeAllViewsInLayout();
- } else {
- removeAllViews();
- }
- }
-
- // Before we do layout, if there are any pending animations and data has changed,
- // cancel the animation, as layout on new data will likely trigger another animation
- // set to be run.
- if (mDataChanged && mCurrentRunningAnimatorSet != null) {
- mCurrentRunningAnimatorSet.cancel();
- mCurrentRunningAnimatorSet = null;
- }
-
- if (isSelectionAtTop()) {
- mCurrentScrollState = null;
- }
-
- if (mCurrentScrollState != null) {
- restoreScrollPosition(mCurrentScrollState);
- } else {
- calculateLayoutStartOffsets(getPaddingTop() /* layout start offset */);
- }
-
- mPopulating = true;
-
- mFocusedChildIdToScrollIntoView = -1;
- final View focusedChild = getFocusedChild();
- if (focusedChild != null) {
- final LayoutParams lp = (LayoutParams) focusedChild.getLayoutParams();
- mFocusedChildIdToScrollIntoView = lp.id;
- }
-
- layoutChildren(mDataChanged);
- fillDown(mFirstPosition + getChildCount(), 0);
- fillUp(mFirstPosition - 1, 0);
-
- if (isDragReorderingSupported() &&
- mDragState == ReorderUtils.DRAG_STATE_RELEASED_REORDER ||
- mDragState == ReorderUtils.DRAG_STATE_RELEASED_HOVER) {
- // This child was dragged and dropped with the UI likely
- // still showing. Call updateReorderStates, to update
- // all UI appropriately.
- mReorderHelper.clearDraggedChildId();
- updateReorderStates(ReorderUtils.DRAG_STATE_NONE);
- }
-
- if (mDataChanged) {
- // Animation should only play if data has changed since populate() can be called
- // multiple times with the same data set (e.g., screen size changed).
- handleLayoutAnimation();
- }
-
- recycleOffscreenViews();
-
- mPopulating = false;
- mDataChanged = false;
- }
-
- @Override
- public void scrollBy(int x, int y) {
- if (y != 0) {
- // TODO: Implement smooth scrolling for this so that scrolling does more than just
- // jumping by y pixels.
- trackMotionScroll(y, false /* over scroll */);
- }
- }
-
- private void offsetChildren(int offset) {
- final int childCount = getChildCount();
- for (int i = 0; i < childCount; i++) {
- final View child = getChildAt(i);
-
- child.offsetTopAndBottom(offset);
-
- // As we're scrolling, we need to make sure the children that are coming into view
- // have their reordering area set.
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
- setReorderingArea(lp);
- }
-
- final int colCount = mColCount;
- for (int i = 0; i < colCount; i++) {
- mItemTops[i] += offset;
- mItemBottoms[i] += offset;
- }
-
- if (mScrollListener != null) {
- mScrollListener.onScrollChanged(offset, computeVerticalScrollOffset(),
- computeVerticalScrollRange());
- }
- }
-
- /**
- * Performs layout animation of child views.
- * @throws IllegalStateException Exception is thrown of currently set animation mode is
- * not recognized.
- */
- private void handleLayoutAnimation() throws IllegalStateException {
- final List<Animator> animators = new ArrayList<Animator>();
-
- // b/8422632 - Without this dummy first animator, startDelays of subsequent animators won't
- // be honored correctly; all animators will block regardless of startDelay until the first
- // animator in the AnimatorSet truly starts playing.
- final ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
- anim.setDuration(0);
- animators.add(anim);
-
- addOutAnimatorsForStaleViews(animators, mAnimationOutMode);
-
- // Play the In animators at a slight delay after all Out animators have started.
- final int animationInStartDelay = animators.size() > 0 ?
- (SgvAnimationHelper.getDefaultAnimationDuration() / 2) : 0;
- addInAnimators(animators, mAnimationInMode, animationInStartDelay);
-
- if (animators != null && animators.size() > 0) {
- final AnimatorSet animatorSet = new AnimatorSet();
- animatorSet.playTogether(animators);
- animatorSet.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- mIsCurrentAnimationCanceled = false;
- mCurrentRunningAnimatorSet = animatorSet;
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- mIsCurrentAnimationCanceled = true;
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (!mIsCurrentAnimationCanceled) {
- // If this animation ended naturally, not because it was canceled, then
- // reset the animation mode back to ANIMATION_MODE_NONE. However, if
- // the animation was canceled by a data change, then keep the mode as is,
- // so that on a re-layout, we can resume animation from the views' current
- // positions.
- resetAnimationMode();
- }
- mCurrentRunningAnimatorSet = null;
- }
- });
-
- Log.v(TAG, "starting");
- animatorSet.start();
- } else {
- resetAnimationMode();
- }
-
- mViewsToAnimateOut.clear();
- mChildRectsForAnimation.clear();
- }
-
- /**
- * Reset the current animation mode.
- */
- private void resetAnimationMode() {
- mAnimationInMode = AnimationIn.NONE;
- mAnimationOutMode = AnimationOut.NONE;
- }
-
- /**
- * Add animators for animating in new views as well as updating positions of views that
- * should remain on screen.
- */
- private void addInAnimators(List<Animator> animators, AnimationIn animationInMode,
- int startDelay) {
- if (animationInMode == AnimationIn.NONE) {
- return;
- }
-
- switch (animationInMode) {
- case FLY_UP_ALL_VIEWS:
- addFlyInAllViewsAnimators(animators);
- break;
-
- case EXPAND_NEW_VIEWS:
- addUpdateViewPositionsAnimators(animators, true /* cascade animation */,
- AnimationIn.EXPAND_NEW_VIEWS, startDelay);
- break;
-
- case EXPAND_NEW_VIEWS_NO_CASCADE:
- addUpdateViewPositionsAnimators(animators, false /* cascade animation */,
- AnimationIn.EXPAND_NEW_VIEWS_NO_CASCADE, startDelay);
- break;
-
- case SLIDE_IN_NEW_VIEWS:
- addUpdateViewPositionsAnimators(animators, true /* cascade animation */,
- AnimationIn.SLIDE_IN_NEW_VIEWS, startDelay);
- break;
-
- case FLY_IN_NEW_VIEWS:
- addUpdateViewPositionsAnimators(animators, true /* cascade animation */,
- AnimationIn.FLY_IN_NEW_VIEWS, startDelay);
- break;
-
- case FADE:
- addUpdateViewPositionsAnimators(animators, true /* cascade animation */,
- AnimationIn.FADE, startDelay);
- break;
-
- default:
- throw new IllegalStateException("Unknown animationInMode: " + mAnimationInMode);
- }
- }
-
- /**
- * Add animators for animating out stale views
- * @param animationOutMode The animation mode to play for stale views
- */
- private void addOutAnimatorsForStaleViews(List<Animator> animators,
- AnimationOut animationOutMode) {
- if (animationOutMode == AnimationOut.NONE) {
- return;
- }
-
- for (final View v : mViewsToAnimateOut) {
- // For each stale view to animate out, retrieve the animators for the view, then attach
- // the StaleViewAnimationEndListener which checks to see if the view should be recycled
- // at the end of the animation.
- final List<Animator> viewAnimators = new ArrayList<Animator>();
-
- switch (animationOutMode) {
- case SLIDE:
- final LayoutParams lp = (LayoutParams) v.getLayoutParams();
- // Bias towards sliding right, but depending on the column that this view
- // is laid out in, slide towards the nearest side edge.
- int endTranslation = (int)(v.getWidth() * 1.5);
- if (lp.column < (mColCount / 2)) {
- endTranslation = -endTranslation;
- }
- SgvAnimationHelper.addSlideOutAnimators(viewAnimators, v,
- (int) v.getTranslationX(), endTranslation);
- break;
-
- case COLLAPSE:
- SgvAnimationHelper.addCollapseOutAnimators(viewAnimators, v);
- break;
-
- case FLY_DOWN:
- SgvAnimationHelper.addFlyOutAnimators(viewAnimators, v,
- (int) v.getTranslationY(), getHeight());
- break;
-
- case FADE:
- SgvAnimationHelper.addFadeAnimators(viewAnimators, v, v.getAlpha(),
- 0 /* end alpha */);
- break;
-
- default:
- throw new IllegalStateException("Unknown animationOutMode: " +
- animationOutMode);
- }
-
- if (viewAnimators.size() > 0) {
- addStaleViewAnimationEndListener(v, viewAnimators);
- animators.addAll(viewAnimators);
- }
- }
- }
-
- /**
- * Handle setting up the animators of child views when the animation is invoked by a change
- * in the adapter. This method has a side effect of translating view positions in preparation
- * for the animations.
- */
- private List<Animator> addFlyInAllViewsAnimators(List<Animator> animators) {
- final int childCount = getChildCount();
- if (childCount == 0) {
- return null;
- }
-
- if (animators == null) {
- animators = new ArrayList<Animator>();
- }
-
- for (int i = 0; i < childCount; i++) {
- final int animationDelay = i * ANIMATION_DELAY_IN_MS;
- final View childToAnimate = getChildAt(i);
-
- // Start all views from below the bottom of this grid and animate them upwards. This
- // is done simply by translating the current view's vertical position by the height
- // of the entire grid.
- float yTranslation = getHeight();
- float rotation = SgvAnimationHelper.ANIMATION_ROTATION_DEGREES;
- if (mIsCurrentAnimationCanceled) {
- // If mIsAnimationCanceled is true, then this is not the first time that this
- // animation is running. For this particular case, we should resume from where
- // the previous animation left off, rather than resetting translation and rotation.
- yTranslation = childToAnimate.getTranslationY();
- rotation = childToAnimate.getRotation();
- }
-
- SgvAnimationHelper.addTranslationRotationAnimators(animators, childToAnimate,
- 0 /* xTranslation */, (int) yTranslation, rotation, animationDelay);
- }
-
- return animators;
- }
-
- /**
- * Animations to update the views on screen to their new positions. For new views that aren't
- * currently on screen, animate them in using the specified animationInMode.
- */
- private List<Animator> addUpdateViewPositionsAnimators(List<Animator> animators,
- boolean cascadeAnimation, AnimationIn animationInMode, int startDelay) {
- final int childCount = getChildCount();
- if (childCount == 0) {
- return null;
- }
-
- if (animators == null) {
- animators = new ArrayList<Animator>();
- }
-
- int viewsAnimated = 0;
- for (int i = 0; i < childCount; i++) {
- final View childToAnimate = getChildAt(i);
-
- if (mViewsToAnimateOut.contains(childToAnimate)) {
- // If the stale views are still animating, then they are still laid out, so
- // getChildCount() would've accounted for them. Since they have their own set
- // of animations to play, we'll skip over them in this loop.
- continue;
- }
-
- // Use progressive animation delay to create the staggered effect of animating
- // views. This is done by having each view delay their animation by
- // ANIMATION_DELAY_IN_MS after the animation of the previous view.
- int animationDelay = startDelay +
- (cascadeAnimation ? viewsAnimated * ANIMATION_DELAY_IN_MS : 0);
-
- // Figure out whether a view with this item ID existed before
- final LayoutParams lp = (LayoutParams) childToAnimate.getLayoutParams();
-
- final ViewRectPair viewRectPair = mChildRectsForAnimation.get(lp.id);
-
- final int xTranslation;
- final int yTranslation;
-
- // If there is a valid {@link Rect} for the view with this newId, then
- // setup an animation.
- if (viewRectPair != null && viewRectPair.rect != null) {
- // In the special case where the items are explicitly fading, we don't want to do
- // any of the translations.
- if (animationInMode == AnimationIn.FADE) {
- SgvAnimationHelper.addFadeAnimators(animators, childToAnimate,
- 0 /* start alpha */, 1.0f /* end alpha */, animationDelay);
- continue;
- }
-
- final Rect oldRect = viewRectPair.rect;
- // Since the view already exists, translate it to its new position.
- // Reset the child back to its previous position given by oldRect if the child
- // has not already been translated. If the child has been translated, use the
- // current translated values, as this child may be in the middle of a previous
- // animation, so we don't want to simply force it to new location.
-
- xTranslation = oldRect.left - childToAnimate.getLeft();
- yTranslation = oldRect.top - childToAnimate.getTop();
- final float rotation = childToAnimate.getRotation();
-
- // First set the translation X and Y. The current translation might be out of date.
- childToAnimate.setTranslationX(xTranslation);
- childToAnimate.setTranslationY(yTranslation);
-
- if (xTranslation == 0 && yTranslation == 0 && rotation == 0) {
- // Bail early if this view doesn't need to be translated.
- continue;
- }
-
- SgvAnimationHelper.addTranslationRotationAnimators(animators, childToAnimate,
- xTranslation, yTranslation, rotation, animationDelay);
- } else {
- // If this view was not present before the data updated, rather than just flashing
- // the view into its designated position, fly it up from the bottom.
- xTranslation = 0;
- yTranslation = (animationInMode == AnimationIn.FLY_IN_NEW_VIEWS) ? getHeight() : 0;
-
- // Since this is a new view coming in, add additional delays so that these IN
- // animations start after all the OUT animations have been played.
- animationDelay += SgvAnimationHelper.getDefaultAnimationDuration();
-
- childToAnimate.setTranslationX(xTranslation);
- childToAnimate.setTranslationY(yTranslation);
-
- switch (animationInMode) {
- case FLY_IN_NEW_VIEWS:
- SgvAnimationHelper.addTranslationRotationAnimators(animators,
- childToAnimate, xTranslation, yTranslation,
- SgvAnimationHelper.ANIMATION_ROTATION_DEGREES, animationDelay);
- break;
-
- case SLIDE_IN_NEW_VIEWS:
- // Bias towards sliding right, but depending on the column that this view
- // is laid out in, slide towards the nearest side edge.
- int startTranslation = (int)(childToAnimate.getWidth() * 1.5);
- if (lp.column < (mColCount / 2)) {
- startTranslation = -startTranslation;
- }
-
- SgvAnimationHelper.addSlideInFromRightAnimators(animators,
- childToAnimate, startTranslation,
- animationDelay);
- break;
-
- case EXPAND_NEW_VIEWS:
- case EXPAND_NEW_VIEWS_NO_CASCADE:
- if (i == 0) {
- // Initially set the alpha of this view to be invisible, then fade in.
- childToAnimate.setAlpha(0);
-
- // Create animators that translate the view back to translation = 0
- // which would be its new layout position
- final int offset = -1 * childToAnimate.getHeight();
- SgvAnimationHelper.addXYTranslationAnimators(animators,
- childToAnimate, 0 /* xTranslation */, offset, animationDelay);
-
- SgvAnimationHelper.addFadeAnimators(animators, childToAnimate,
- 0 /* start alpha */, 1.0f /* end alpha */, animationDelay);
- } else {
- SgvAnimationHelper.addExpandInAnimators(animators,
- childToAnimate, animationDelay);
- }
- break;
- case FADE:
- SgvAnimationHelper.addFadeAnimators(animators, childToAnimate,
- 0 /* start alpha */, 1.0f /* end alpha */, animationDelay);
- break;
-
- default:
- continue;
- }
- }
-
- viewsAnimated++;
- }
-
- return animators;
- }
-
- private void addStaleViewAnimationEndListener(final View view, List<Animator> viewAnimators) {
- if (viewAnimators == null) {
- return;
- }
-
- for (final Animator animator : viewAnimators) {
- animator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- // In the event that onChanged is called before this animation finishes,
- // we would have mistakenly cached a view that would be recycled. So
- // check if it's there, and remove it so that obtainView() doesn't
- // accidentally use the cached view later when it's already been
- // moved to the recycler.
- final LayoutParams lp = (LayoutParams) view.getLayoutParams();
- if (mChildRectsForAnimation.containsKey(lp.id)) {
- mChildRectsForAnimation.remove(lp.id);
- }
-
- recycleView(view);
- }
- });
- }
- }
-
- /**
- * Calculate and cache the {@link LayoutRecord}s for all positions up to mFirstPosition.
- * mFirstPosition is the position that layout will start from, but we need to know where all
- * views preceding it will be laid out so that mFirstPosition will be laid out at the correct
- * position. If this is not done, mFirstPosition will be laid out at the first empty space
- * possible (i.e., top left), and this may not be the correct position in the overall layout.
- *
- * This can be optimized if we don't need to guard against jagged edges in the grid or if
- * mFirstChangedPosition is set to a non-zero value (so we can skip calculating some views).
- */
- private void calculateLayoutStartOffsets(int offset) {
- // Bail early if we don't guard against jagged edges or if nothing has changed before
- // mFirstPosition.
- // Also check that we're not at the top of the list because sometimes grid padding isn't set
- // until after mItemTops and mItemBottoms arrays have been initialized, so we should
- // go through and compute the right layout start offset for mFirstPosition = 0.
- if (mFirstPosition != 0 &&
- (!mGuardAgainstJaggedEdges || mFirstPosition < mFirstChangedPosition)) {
- // At this time, we know that mItemTops should be the same, because
- // nothing has changed before view at mFirstPosition. The only thing
- // we need to do is to reset mItemBottoms. The result should be the
- // same, if we don't bail early and execute the following code
- // again. Notice that mItemBottoms always equal to mItemTops after
- // this method.
- System.arraycopy(mItemTops, 0, mItemBottoms, 0, mColCount);
- return;
- }
-
- final int colWidth = (getWidth() - getPaddingLeft() - getPaddingRight() -
- mItemMargin * (mColCount - 1)) / mColCount;
-
- Arrays.fill(mItemTops, getPaddingTop());
- Arrays.fill(mItemBottoms, getPaddingTop());
-
- // Since we will be doing a pass to calculate all views up to mFirstPosition, it is likely
- // that all existing {@link LayoutRecord}s will be stale, so clear it out to avoid
- // accidentally the re-use of stale values.
- //
- // Note: We cannot just invalidate all layout records after mFirstPosition because it is
- // possible that this layout pass is caused by a down sync from the server that may affect
- // the layout of views from position 0 to mFirstPosition - 1.
- if (mDataChanged) {
- mLayoutRecords.clear();
- }
-
- for (int i = 0; i < mFirstPosition; i++) {
- LayoutRecord rec = mLayoutRecords.get(i);
-
- if (mDataChanged || rec == null) {
- final View view = obtainView(i, null);
- final LayoutParams lp = (LayoutParams) view.getLayoutParams();
-
- final int heightSpec;
- if (lp.height == LayoutParams.WRAP_CONTENT) {
- heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
- } else {
- heightSpec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);
- }
-
- final int span = Math.min(mColCount, lp.span);
- final int widthSize = colWidth * span + mItemMargin * (span - 1);
- final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);
-
- view.measure(widthSpec, heightSpec);
- final int height = view.getMeasuredHeight();
-
- if (rec == null) {
- rec = new LayoutRecord();
- mLayoutRecords.put(i, rec);
- }
-
- rec.height = height;
- rec.id = lp.id;
- rec.span = span;
-
- // We're not actually using this view, so add this back to the recycler.
- mRecycler.addScrap(view);
- }
-
- int nextColumn = getNextColumnDown();
-
- // Given the span, check if there's enough space to put this view at this column.
- // IMPORTANT Use the same logic in {@link #layoutChildren}.
- if (rec.span > 1) {
- if (mIsRtlLayout) {
- if (nextColumn + 1 < rec.span) {
- nextColumn = mColCount - 1;
- }
- } else {
- if (mColCount - nextColumn < rec.span) {
- nextColumn = 0;
- }
- }
- }
- rec.column = nextColumn;
-
- // Place the top of this child beneath the last by finding the lowest coordinate across
- // the columns that this child will span. For LTR layout, we scan across from left to
- // right, and for RTL layout, we scan from right to left.
- // TODO: Consolidate this logic with getNextRecordDown() in the future, as that method
- // already calculates the margins for us. This will keep the implementation consistent
- // with layoutChildren(), fillUp() and fillDown().
- int lowest = mItemBottoms[nextColumn] + mItemMargin;
- if (rec.span > 1) {
- for (int spanIndex = 0; spanIndex < rec.span; spanIndex++) {
- final int index = mIsRtlLayout ? nextColumn - spanIndex :
- nextColumn + spanIndex;
- final int bottom = mItemBottoms[index] + mItemMargin;
- if (bottom > lowest) {
- lowest = bottom;
- }
- }
- }
-
- for (int spanIndex = 0; spanIndex < rec.span; spanIndex++) {
- final int col = mIsRtlLayout ? nextColumn - spanIndex : nextColumn + spanIndex;
- mItemBottoms[col] = lowest + rec.height;
-
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, " position: " + i + " bottoms: ");
- for (int j = 0; j < mColCount; j++) {
- Log.v(TAG, " mItemBottoms["+j+"]: " + mItemBottoms[j]);
- }
- }
- }
- }
-
- // mItemBottoms[] at this point contains the values of all views up to mFirstPosition. To
- // figure out where view at mFirstPosition will be laid out, we'll need to find the column
- // that is the highest (i.e., i where mItemBottoms[i] <= mItemBottoms[j] for all j
- // from 0 to mColCount.)
- int highestValue = Integer.MAX_VALUE;
- for (int k = 0; k < mColCount; k++) {
- if (mItemBottoms[k] < highestValue) {
- highestValue = mItemBottoms[k];
- }
- }
-
- // Adjust the offsets in each column so that values in mItemTops[] and mItemBottoms[]
- // reflect coordinates on screen. These offsets will be the actual values where layout
- // will start from, otherwise, we'd naively start at (leftPadding, topPadding) for
- // mFirstPosition.
- for (int k = 0; k < mColCount; k++) {
- mItemBottoms[k] = mItemBottoms[k] - highestValue + offset;
- mItemTops[k] = mItemBottoms[k];
-
- // Log.v(TAG, "Adjusting to offset = mItemBottoms[" + k + "]: " + mItemBottoms[k]);
- }
- }
-
- /**
- * Measure and layout all currently visible children.
- *
- * @param queryAdapter true to requery the adapter for view data
- */
- final void layoutChildren(boolean queryAdapter) {
- final int paddingLeft = getPaddingLeft();
- final int paddingRight = getPaddingRight();
- final int itemMargin = mItemMargin;
- final int availableWidth = (getWidth() - paddingLeft - paddingRight - itemMargin
- * (mColCount - 1));
- final int colWidth = availableWidth / mColCount;
- // The availableWidth may not be divisible by mColCount. Keep the
- // remainder. It will be added to the width of the last view in the row.
- final int remainder = availableWidth % mColCount;
-
- boolean viewsRemovedInLayout = false;
-
- // If we're animating out stale views, then we want to defer recycling of views.
- final boolean deferRecyclingForAnimation = mAnimationOutMode != AnimationOut.NONE;
-
- if (!deferRecyclingForAnimation) {
- final int childCount = getChildCount();
- // If the latest data set has fewer data items than mFirstPosition, don't keep any
- // views on screen, and just let the layout logic below retrieve appropriate views
- // from the recycler.
- final int viewsToKeepOnScreen = (mItemCount <= mFirstPosition) ? 0 :
- mItemCount - mFirstPosition;
-
- if (childCount > viewsToKeepOnScreen) {
- // If there are more views laid out than the number of data items remaining to be
- // laid out, recycle the extraneous views.
- recycleViewsInRange(viewsToKeepOnScreen, childCount - 1);
- viewsRemovedInLayout = true;
- }
- } else {
- mViewsToAnimateOut.clear();
- }
-
- for (int i = 0; i < getChildCount(); i++) {
- final int position = mFirstPosition + i;
- View child = getChildAt(i);
-
- final int highestAvailableLayoutPosition = mItemBottoms[getNextColumnDown()];
- if (deferRecyclingForAnimation &&
- (position >= mItemCount || highestAvailableLayoutPosition >= getHeight())) {
- // For the remainder of views on screen, they should not be on screen, so we can
- // skip layout. Add them to the list of views to animate out.
- // We should only get in this position if deferRecyclingForAnimation = true,
- // otherwise, we should've recycled all views before getting into this layout loop.
- mViewsToAnimateOut.add(child);
- continue;
- }
-
- LayoutParams lp = null;
- int col = -1;
-
- if (child != null) {
- lp = (LayoutParams) child.getLayoutParams();
- col = lp.column;
- }
-
- final boolean needsLayout = queryAdapter || child == null || child.isLayoutRequested();
- if (queryAdapter) {
- View newView = null;
- if (deferRecyclingForAnimation) {
- // If we are deferring recycling for animation, then we don't want to pass the
- // current child in to obtainView for re-use. obtainView() in this case should
- // try to find the view belonging to this item on screen, or populate a fresh
- // one from the recycler.
- newView = obtainView(position);
- } else {
- newView = obtainView(position, child);
- }
-
- // Update layout params since they may have changed
- lp = (LayoutParams) newView.getLayoutParams();
-
- if (newView != child) {
- if (child != null && !deferRecyclingForAnimation) {
- mRecycler.addScrap(child);
- removeViewInLayout(child);
- viewsRemovedInLayout = true;
- }
-
- // If this view is already in the layout hierarchy, we can just detach it
- // from the parent and re-attach it at the correct index. If the view has
- // already been removed from the layout hierarchy, getParent() == null.
- if (newView.getParent() == this) {
- detachViewFromParent(newView);
- attachViewToParent(newView, i, lp);
- } else {
- addViewInLayout(newView, i, lp);
- }
- }
-
- child = newView;
-
- // Since the data has changed, we need to make sure the next child is in the
- // right column. We choose the next column down (vs. next column up) because we
- // are filling from the top of the screen downwards as we iterate through
- // visible children. (We take span into account below.)
- lp.column = getNextColumnDown();
- col = lp.column;
- }
-
- setReorderingArea(lp);
-
- final int span = Math.min(mColCount, lp.span);
-
- // Given the span, check if there's enough space to put this view at this column.
- // IMPORTANT Propagate the same logic to {@link #calculateLayoutStartOffsets}.
- if (span > 1) {
- if (mIsRtlLayout) {
- // For RTL layout, if the current column index is less than the span of the
- // child, then we know that there is not enough room remaining to lay this
- // child out (e.g., if col == 0, but span == 2, then laying this child down
- // at column = col would put us out of bound into a negative column index.).
- // For this scenario, reset the index back to the right-most column, and lay
- // out the child at this position where we can ensure that we can display as
- // much of the child as possible.
- if (col + 1 < span) {
- col = mColCount - 1;
- }
- } else {
- if (mColCount - col < span) {
- // If not, reset the col to 0.
- col = 0;
- }
- }
-
- lp.column = col;
- }
-
- int widthSize = (colWidth * span + itemMargin * (span - 1));
- // If it is rtl, we layout the view from col to col - span +
- // 1. If it reaches the most left column, i.e. we added the
- // additional width. So the check it span == col +1
- if ((mIsRtlLayout && span == col + 1)
- || (!mIsRtlLayout && span + col == mColCount)) {
- widthSize += remainder;
- }
- if (needsLayout) {
- final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);
-
- final int heightSpec;
- if (lp.height == LayoutParams.WRAP_CONTENT) {
- heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
- } else {
- heightSpec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);
- }
-
- child.measure(widthSpec, heightSpec);
- }
-
- // Place the top of this child beneath the last by finding the lowest coordinate across
- // the columns that this child will span. For LTR layout, we scan across from left to
- // right, and for RTL layout, we scan from right to left.
- // TODO: Consolidate this logic with getNextRecordDown() in the future, as that method
- // already calculates the margins for us. This will keep the implementation consistent
- // with fillUp() and fillDown().
- int childTop = mItemBottoms[col] + mItemMargin;
- if (span > 1) {
- int lowest = childTop;
- for (int spanIndex = 0; spanIndex < span; spanIndex++) {
- final int index = mIsRtlLayout ? col - spanIndex : col + spanIndex;
- final int bottom = mItemBottoms[index] + mItemMargin;
- if (bottom > lowest) {
- lowest = bottom;
- }
- }
-
- childTop = lowest;
- }
-
- final int childHeight = child.getMeasuredHeight();
- final int childBottom = childTop + childHeight;
- int childLeft = 0;
- int childRight = 0;
- if (mIsRtlLayout) {
- childRight = (getWidth() - paddingRight) -
- (mColCount - col - 1) * (colWidth + itemMargin);
- childLeft = childRight - child.getMeasuredWidth();
- } else {
- childLeft = paddingLeft + col * (colWidth + itemMargin);
- childRight = childLeft + child.getMeasuredWidth();
- }
-
- /* Log.v(TAG, "[layoutChildren] height: " + childHeight
- + " top: " + childTop + " bottom: " + childBottom
- + " left: " + childLeft
- + " column: " + col
- + " position: " + position
- + " id: " + lp.id);
-*/
- child.layout(childLeft, childTop, childRight, childBottom);
- if (lp.id == mFocusedChildIdToScrollIntoView) {
- child.requestFocus();
- }
-
- for (int spanIndex = 0; spanIndex < span; spanIndex++) {
- final int index = mIsRtlLayout ? col - spanIndex : col + spanIndex;
- mItemBottoms[index] = childBottom;
- }
-
- // Whether or not LayoutRecords may have already existed for the view at this position
- // on screen, we'll update it after we lay out to ensure that the LayoutRecord
- // has the most updated information about the view at this position. We can be assured
- // that all views before those on screen (views with adapter position < mFirstPosition)
- // have the correct LayoutRecords because calculateLayoutStartOffsets() would have
- // set them appropriately.
- LayoutRecord rec = mLayoutRecords.get(position);
- if (rec == null) {
- rec = new LayoutRecord();
- mLayoutRecords.put(position, rec);
- }
-
- rec.column = lp.column;
- rec.height = childHeight;
- rec.id = lp.id;
- rec.span = span;
- }
-
- // It appears that removeViewInLayout() does not invalidate. So if we make use of this
- // method during layout, we should invalidate explicitly.
- if (viewsRemovedInLayout || deferRecyclingForAnimation) {
- invalidate();
- }
- }
-
- /**
- * Set the reordering area for the child layout specified
- */
- private void setReorderingArea(LayoutParams childLayoutParams) {
- final boolean isLastColumn = childLayoutParams.column == (mColCount - 1);
- childLayoutParams.reorderingArea =
- mAdapter.getReorderingArea(childLayoutParams.position, isLastColumn);
- }
-
- final void invalidateLayoutRecordsBeforePosition(int position) {
- int endAt = 0;
- while (endAt < mLayoutRecords.size() && mLayoutRecords.keyAt(endAt) < position) {
- endAt++;
- }
- mLayoutRecords.removeAtRange(0, endAt);
- }
-
- final void invalidateLayoutRecordsAfterPosition(int position) {
- int beginAt = mLayoutRecords.size() - 1;
- while (beginAt >= 0 && mLayoutRecords.keyAt(beginAt) > position) {
- beginAt--;
- }
- beginAt++;
- mLayoutRecords.removeAtRange(beginAt + 1, mLayoutRecords.size() - beginAt);
- }
-
- /**
- * Before doing an animation, map the item IDs for the currently visible children to the
- * {@link Rect} that defines their position on the screen so a translation animation
- * can be applied to their new layout positions.
- */
- private void cacheChildRects() {
- final int childCount = getChildCount();
- mChildRectsForAnimation.clear();
-
- long originalDraggedChildId = -1;
- if (isDragReorderingSupported()) {
- originalDraggedChildId = mReorderHelper.getDraggedChildId();
- if (mCachedDragViewRect != null && originalDraggedChildId != -1) {
- // This child was dragged in a reordering operation. Use the cached position
- // of where the drag event was released as the cached location.
- mChildRectsForAnimation.put(originalDraggedChildId,
- new ViewRectPair(mDragView, mCachedDragViewRect));
- mCachedDragViewRect = null;
- }
- }
-
- for (int i = 0; i < childCount; i++) {
- final View child = getChildAt(i);
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
- Rect rect;
- if (lp.id != originalDraggedChildId) {
- final int childTop = (int) child.getY();
- final int childBottom = childTop + child.getHeight();
- final int childLeft = (int) child.getX();
- final int childRight = childLeft + child.getWidth();
- rect = new Rect(childLeft, childTop, childRight, childBottom);
- mChildRectsForAnimation.put(lp.id /* item id */, new ViewRectPair(child, rect));
- }
- }
- }
-
- /**
- * Should be called with mPopulating set to true
- *
- * @param fromPosition Position to start filling from
- * @param overhang the number of extra pixels to fill beyond the current top edge
- * @return the max overhang beyond the beginning of the view of any added items at the top
- */
- final int fillUp(int fromPosition, int overhang) {
- final int paddingLeft = getPaddingLeft();
- final int paddingRight = getPaddingRight();
- final int itemMargin = mItemMargin;
- final int availableWidth = (getWidth() - paddingLeft - paddingRight - itemMargin
- * (mColCount - 1));
- final int colWidth = availableWidth / mColCount;
- // The availableWidth may not be divisible by mColCount. Keep the
- // remainder. It will be added to the width of the last view in the row.
- final int remainder = availableWidth % mColCount;
- final int gridTop = getPaddingTop();
- final int fillTo = -overhang;
- int nextCol = getNextColumnUp();
- int position = fromPosition;
-
- while (nextCol >= 0 && mItemTops[nextCol] > fillTo && position >= 0) {
- final View child = obtainView(position, null);
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
-
- if (child.getParent() != this) {
- if (mInLayout) {
- addViewInLayout(child, 0, lp);
- } else {
- addView(child, 0);
- }
- }
-
- final int span = Math.min(mColCount, lp.span);
-
- LayoutRecord rec;
- if (span > 1) {
- rec = getNextRecordUp(position, span);
- nextCol = rec.column;
- } else {
- rec = mLayoutRecords.get(position);
- }
-
- boolean invalidateBefore = false;
- if (rec == null) {
- rec = new LayoutRecord();
- mLayoutRecords.put(position, rec);
- rec.column = nextCol;
- rec.span = span;
- } else if (span != rec.span) {
- rec.span = span;
- rec.column = nextCol;
- invalidateBefore = true;
- } else {
- nextCol = rec.column;
- }
-
- if (mHasStableIds) {
- rec.id = lp.id;
- }
-
- lp.column = nextCol;
- setReorderingArea(lp);
-
- int widthSize = colWidth * span + itemMargin * (span - 1);
- // If it is rtl, we layout the view from nextCol to nextCol - span +
- // 1. If it reaches the most left column, i.e. we added the
- // additional width. So the check it span == nextCol + 1
- if ((mIsRtlLayout && span == nextCol + 1)
- || (!mIsRtlLayout && span + nextCol == mColCount)) {
- widthSize += remainder;
- }
- final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);
- final int heightSpec;
- if (lp.height == LayoutParams.WRAP_CONTENT) {
- heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
- } else {
- heightSpec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);
- }
- child.measure(widthSpec, heightSpec);
-
- final int childHeight = child.getMeasuredHeight();
- if (invalidateBefore || (childHeight != rec.height && rec.height > 0)) {
- invalidateLayoutRecordsBeforePosition(position);
- }
- rec.height = childHeight;
-
- // Iterate across each column that this child spans and add the margin calculated
- // for that column to mItemTops. getMarginBelow() is expected to give us the correct
- // margin values at each column such that mItemTops ends up with a smooth edge across
- // the column spans. We need to do this before actually laying down the child,
- // otherwise we risk overlapping one child over another. mItemTops stores the top
- // index for where the next child should be laid out. For RTL, we do the update
- // in reverse order.
- for (int i = 0; i < span; i++) {
- final int index = mIsRtlLayout ? nextCol - i : nextCol + i;
- mItemTops[index] += rec.getMarginBelow(i);
- }
-
- final int startFrom = mItemTops[nextCol];
- final int childBottom = startFrom;
- final int childTop = childBottom - childHeight;
-
- int childLeft = 0;
- int childRight = 0;
- // For LTR layout, the child's left is calculated as the
- // (column index from left) * (columnWidth plus item margins).
- // For RTL layout, the child's left is relative to its right, and its right coordinate
- // is calculated as the difference between the width of this grid and
- // (column index from right) * (columnWidth plus item margins).
- if (mIsRtlLayout) {
- childRight = (getWidth() - paddingRight) -
- (mColCount - nextCol - 1) * (colWidth + itemMargin);
- childLeft = childRight - child.getMeasuredWidth();
- } else {
- childLeft = paddingLeft + nextCol * (colWidth + itemMargin);
- childRight = childLeft + child.getMeasuredWidth();
- }
- child.layout(childLeft, childTop, childRight, childBottom);
-
- Log.v(TAG, "[fillUp] position: " + position + " id: " + lp.id
- + " childLeft: " + childLeft + " childTop: " + childTop
- + " column: " + rec.column + " childHeight:" + childHeight);
-
- // Since we're filling up, once the child is laid out, update mItemTops again
- // to reflect the next available top value at this column. This is simply the child's
- // top coordinates, minus any available margins set. For LTR, we start at the column
- // that this child is laid out from (nextCol) and move right for span amount. For RTL
- // layout, we start at the column that this child is laid out from and move left.
- for (int i = 0; i < span; i++) {
- final int index = mIsRtlLayout ? nextCol - i : nextCol + i;
- mItemTops[index] = childTop - rec.getMarginAbove(i) - itemMargin;
- }
-
- if (lp.id == mFocusedChildIdToScrollIntoView) {
- child.requestFocus();
- }
-
- nextCol = getNextColumnUp();
- mFirstPosition = position--;
- }
-
- int highestView = getHeight();
- for (int i = 0; i < mColCount; i++) {
- if (mItemTops[i] < highestView) {
- highestView = mItemTops[i];
- }
- }
- return gridTop - highestView;
- }
-
- /**
- * Should be called with mPopulating set to true
- *
- * @param fromPosition Position to start filling from
- * @param overhang the number of extra pixels to fill beyond the current bottom edge
- * @return the max overhang beyond the end of the view of any added items at the bottom
- */
- final int fillDown(int fromPosition, int overhang) {
- final int paddingLeft = getPaddingLeft();
- final int paddingRight = getPaddingRight();
- final int itemMargin = mItemMargin;
- final int availableWidth = (getWidth() - paddingLeft - paddingRight - itemMargin
- * (mColCount - 1));
- final int colWidth = availableWidth / mColCount;
- // The availableWidth may not be divisible by mColCount. Keep the
- // remainder. It will be added to the width of the last view in the row.
- final int remainder = availableWidth % mColCount;
- final int gridBottom = getHeight() - getPaddingBottom();
- final int fillTo = gridBottom + overhang;
- int nextCol = getNextColumnDown();
- int position = fromPosition;
-
- while (nextCol >= 0 && mItemBottoms[nextCol] < fillTo && position < mItemCount) {
- final View child = obtainView(position, null);
- final LayoutParams lp = (LayoutParams) child.getLayoutParams();
- if (child.getParent() != this) {
- if (mInLayout) {
- addViewInLayout(child, -1, lp);
- } else {
- addView(child);
- }
- }
-
- final int span = Math.min(mColCount, lp.span);
-
- LayoutRecord rec;
- if (span > 1) {
- rec = getNextRecordDown(position, span);
- nextCol = rec.column;
- } else {
- rec = mLayoutRecords.get(position);
- }
-
- boolean invalidateAfter = false;
- if (rec == null) {
- rec = new LayoutRecord();
- mLayoutRecords.put(position, rec);
- rec.column = nextCol;
- rec.span = span;
- } else if (span != rec.span) {
- rec.span = span;
- rec.column = nextCol;
- invalidateAfter = true;
- } else {
- nextCol = rec.column;
- }
-
- if (mHasStableIds) {
- rec.id = lp.id;
- }
-
- lp.column = nextCol;
- setReorderingArea(lp);
-
-
- int widthSize = colWidth * span + itemMargin * (span - 1);
- // If it is rtl, we layout the view from nextCol to nextCol - span +
- // 1. If it reaches the most left column, i.e. we added the
- // additional width. So the check it span == nextCol +1
- if ((mIsRtlLayout && span == nextCol + 1)
- || (!mIsRtlLayout && span + nextCol == mColCount)) {
- widthSize += remainder;
- }
- final int widthSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.EXACTLY);
- final int heightSpec;
- if (lp.height == LayoutParams.WRAP_CONTENT) {
- heightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
- } else {
- heightSpec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY);
- }
- child.measure(widthSpec, heightSpec);
-
- final int childHeight = child.getMeasuredHeight();
- if (invalidateAfter || (childHeight != rec.height && rec.height > 0)) {
- invalidateLayoutRecordsAfterPosition(position);
- }
-
- rec.height = childHeight;
-
- // Before laying out the child, we need to make sure mItemBottoms is updated with the
- // correct values such that there is a smooth edge across the child's span.
- // getMarginAbove() is expected to give us these values. For LTR layout, we start at
- // nextCol, and update forward for the number of columns this child spans. For RTL
- // layout, we start at nextCol and update backwards for the same number of columns.
- for (int i = 0; i < span; i++) {
- final int index = mIsRtlLayout ? nextCol - i : nextCol + i;
- mItemBottoms[index] += rec.getMarginAbove(i);
- }
-
- final int startFrom = mItemBottoms[nextCol];
- final int childTop = startFrom + itemMargin;
- final int childBottom = childTop + childHeight;
- int childLeft = 0;
- int childRight = 0;
- if (mIsRtlLayout) {
- childRight = (getWidth() - paddingRight) -
- (mColCount - nextCol - 1) * (colWidth + itemMargin);
- childLeft = childRight - child.getMeasuredWidth();
- } else {
- childLeft = paddingLeft + nextCol * (colWidth + itemMargin);
- childRight = childLeft + child.getMeasuredWidth();
- }
-
- Log.v(TAG, "[fillDown] position: " + position + " id: " + lp.id
- + " childLeft: " + childLeft + " childTop: " + childTop
- + " column: " + rec.column + " childHeight:" + childHeight);
-
- child.layout(childLeft, childTop, childRight, childBottom);
-
- // Once we've laid down the child, update mItemBottoms again to reflect the next
- // available set of bottom values for the next child.
- for (int i = 0; i < span; i++) {
- final int index = mIsRtlLayout ? nextCol - i : nextCol + i;
- mItemBottoms[index] = childBottom + rec.getMarginBelow(i);
- }
-
- if (lp.id == mFocusedChildIdToScrollIntoView) {
- child.requestFocus();
- }
-
- nextCol = getNextColumnDown();
- position++;
- }
-
- int lowestView = 0;
- for (int i = 0; i < mColCount; i++) {
- final int index = mIsRtlLayout ? mColCount - (i + 1) : i;
- if (mItemBottoms[index] > lowestView) {
- lowestView = mItemBottoms[index];
- }
- }
-
- return lowestView - gridBottom;
- }
-
- /**
- * @return column that the next view filling upwards should occupy. This is the bottom-most
- * position available for a single-column item.
- */
- final int getNextColumnUp() {
- int result = -1;
- int bottomMost = Integer.MIN_VALUE;
-
- final int colCount = mColCount;
- for (int i = colCount - 1; i >= 0; i--) {
- final int index = mIsRtlLayout ? colCount - (i + 1) : i;
- final int top = mItemTops[index];
- if (top > bottomMost) {
- bottomMost = top;
- result = index;
- }
- }
-
- return result;
- }
-
- /**
- * Return a LayoutRecord for the given position
- * @param position
- * @param span
- * @return
- */
- final LayoutRecord getNextRecordUp(int position, int span) {
- LayoutRecord rec = mLayoutRecords.get(position);
- if (rec == null || rec.span != span) {
- if (span > mColCount) {
- throw new IllegalStateException("Span larger than column count! Span:" + span
- + " ColumnCount:" + mColCount);
- }
- rec = new LayoutRecord();
- rec.span = span;
- mLayoutRecords.put(position, rec);
- }
- int targetCol = -1;
- int bottomMost = Integer.MIN_VALUE;
-
- // For LTR layout, we start from the bottom-right corner upwards when we need to find the
- // NextRecordUp. For RTL, we will start from bottom-left.
- final int colCount = mColCount;
- if (mIsRtlLayout) {
- for (int i = span - 1; i < colCount; i++) {
- int top = Integer.MAX_VALUE;
- for (int j = i; j > i - span; j--) {
- final int singleTop = mItemTops[j];
- if (singleTop < top) {
- top = singleTop;
- }
- }
- if (top > bottomMost) {
- bottomMost = top;
- targetCol = i;
- }
- }
- } else {
- for (int i = colCount - span; i >= 0; i--) {
- int top = Integer.MAX_VALUE;
- for (int j = i; j < i + span; j++) {
- final int singleTop = mItemTops[j];
- if (singleTop < top) {
- top = singleTop;
- }
- }
- if (top > bottomMost) {
- bottomMost = top;
- targetCol = i;
- }
- }
- }
-
- rec.column = targetCol;
-
- // Once we've found the target column for the view at this position, we update mItemTops
- // for all columns that this view will occupy. We set the margin such that mItemTops is
- // equal for all columns in the view's span. For LTR layout, we start at targetCol and
- // move right, and for RTL, we start at targetCol and move left.
- for (int i = 0; i < span; i++) {
- final int nextCol = mIsRtlLayout ? targetCol - i : targetCol + i;
- rec.setMarginBelow(i, mItemTops[nextCol] - bottomMost);
- }
-
- return rec;
- }
-
- /**
- * @return column that the next view filling downwards should occupy. This is the top-most
- * position available.
- */
- final int getNextColumnDown() {
- int topMost = Integer.MAX_VALUE;
- int result = 0;
- final int colCount = mColCount;
-
- for (int i = 0; i < colCount; i++) {
- final int index = mIsRtlLayout ? colCount - (i + 1) : i;
- final int bottom = mItemBottoms[index];
- if (bottom < topMost) {
- topMost = bottom;
- result = index;
- }
- }
-
- return result;
- }
-
- final LayoutRecord getNextRecordDown(int position, int span) {
- LayoutRecord rec = mLayoutRecords.get(position);
- if (rec == null || rec.span != span) {
- if (span > mColCount) {
- throw new IllegalStateException("Span larger than column count! Span:" + span
- + " ColumnCount:" + mColCount);
- }
-
- rec = new LayoutRecord();
- rec.span = span;
- mLayoutRecords.put(position, rec);
- }
-
- int targetCol = -1;
- int topMost = Integer.MAX_VALUE;
-
- final int colCount = mColCount;
-
- // For LTR layout, we start from the top-left corner and move right-downwards, when we
- // need to find the NextRecordDown. For RTL we will start from Top-Right corner, and move
- // left-downwards.
- if (mIsRtlLayout) {
- for (int i = colCount - 1; i >= span - 1; i--) {
- int bottom = Integer.MIN_VALUE;
- for (int j = i; j > i - span; j--) {
- final int singleBottom = mItemBottoms[j];
- if (singleBottom > bottom) {
- bottom = singleBottom;
- }
- }
- if (bottom < topMost) {
- topMost = bottom;
- targetCol = i;
- }
- }
- } else {
- for (int i = 0; i <= colCount - span; i++) {
- int bottom = Integer.MIN_VALUE;
- for (int j = i; j < i + span; j++) {
- final int singleBottom = mItemBottoms[j];
- if (singleBottom > bottom) {
- bottom = singleBottom;
- }
- }
- if (bottom < topMost) {
- topMost = bottom;
- targetCol = i;
- }
- }
- }
-
- rec.column = targetCol;
-
- // Once we've found the target column for the view at this position, we update mItemBottoms
- // for all columns that this view will occupy. We set the margins such that mItemBottoms
- // is equal for all columns in the view's span. For LTR layout, we start at targetCol and
- // move right, and for RTL, we start at targetCol and move left.
- for (int i = 0; i < span; i++) {
- final int nextCol = mIsRtlLayout ? targetCol - i : targetCol + i;
- rec.setMarginAbove(i, topMost - mItemBottoms[nextCol]);
- }
-
- return rec;
- }
-
- private int getItemWidth(int itemColumnSpan) {
- final int colWidth = (getWidth() - getPaddingLeft() - getPaddingRight() -
- mItemMargin * (mColCount - 1)) / mColCount;
- return colWidth * itemColumnSpan + mItemMargin * (itemColumnSpan - 1);
- }
-
- /**
- * Obtain a populated view from the adapter. This method checks to see if the view to populate
- * is already laid out on screen somewhere by comparing the item ids.
- *
- * If the view is already laid out, and the view type has not changed, populate the contents
- * and return.
- *
- * If the view is not laid out on screen somewhere, grab a view from the recycler and populate.
- *
- * NOTE: This method should be called during layout.
- *
- * TODO: This can probably be consolidated with the overloaded {@link #obtainView(int, View)}.
- *
- * @param position Position to get the view for.
- */
- final View obtainView(int position) {
- // TODO: This method currently does not support transient state views.
-
- final Object item = mAdapter.getItem(position);
-
- View scrap = null;
- final int positionViewType = mAdapter.getItemViewType(item, position);
-
- final long id = mAdapter.getItemId(item, position);
- final ViewRectPair viewRectPair = mChildRectsForAnimation.get(id);
- if (viewRectPair != null) {
- scrap = viewRectPair.view;
-
- // TODO: Make use of stable ids by retrieving the cached views using stable ids. In
- // theory, we should maintain a list of active views, and then fetch the views
- // from that list. If that fails, then we should go to the recycler.
- // For the collection holding stable ids, we must ensure that those views don't get
- // repurposed for other items at different positions.
- }
-
- final int scrapViewType = scrap != null &&
- (scrap.getLayoutParams() instanceof LayoutParams) ?
- ((LayoutParams) scrap.getLayoutParams()).viewType : -1;
-
- if (scrap == null || scrapViewType != positionViewType) {
- // If there is no cached view or the cached view's type no longer match the type
- // of the item at the specified position, retrieve a new view from the recycler and
- // recycle the cached view.
- if (scrap != null) {
- // The cached view we had is not valid, so add it to the recycler and
- // remove it from the current layout.
- recycleView(scrap);
- }
-
- scrap = mRecycler.getScrapView(positionViewType);
- }
-
- final int itemColumnSpan = mAdapter.getItemColumnSpan(item, position);
- final int itemWidth = getItemWidth(itemColumnSpan);
- final View view = mAdapter.getView(item, position, scrap, this, itemWidth);
-
- ViewGroup.LayoutParams lp = view.getLayoutParams();
- if (view.getParent() != this) {
- if (lp == null) {
- lp = generateDefaultLayoutParams();
- } else if (!checkLayoutParams(lp)) {
- lp = generateLayoutParams(lp);
- }
-
- view.setLayoutParams(lp);
- }
-
- final LayoutParams sglp = (LayoutParams) view.getLayoutParams();
- sglp.position = position;
- sglp.viewType = positionViewType;
- sglp.id = id;
- sglp.span = itemColumnSpan;
-
- // When the view at the positions we are tracking update, make sure to
- // update our views as well. That way, we have the correct
- // rectangle for comparing when the drag target enters/ leaves the
- // placeholder view.
- if (isDragReorderingSupported() && mReorderHelper.getDraggedChildId() == id) {
- mReorderHelper.updateDraggedChildView(view);
- mReorderHelper.updateDraggedOverChildView(view);
- }
- return view;
- }
-
- /**
- * Obtain a populated view from the adapter. If optScrap is non-null and is not
- * reused it will be placed in the recycle bin.
- *
- * @param position position to get view for
- * @param optScrap Optional scrap view; will be reused if possible
- * @return A new view, a recycled view from mRecycler, or optScrap
- */
- final View obtainView(int position, View optScrap) {
- View view = mRecycler.getTransientStateView(position);
- final Object item = mAdapter.getItem(position);
- final int positionViewType = mAdapter.getItemViewType(item, position);
-
- if (view == null) {
- // Reuse optScrap if it's of the right type (and not null)
- final int optType = optScrap != null ?
- ((LayoutParams) optScrap.getLayoutParams()).viewType : -1;
-
- final View scrap = optType == positionViewType ?
- optScrap : mRecycler.getScrapView(positionViewType);
-
- final int itemColumnSpan = mAdapter.getItemColumnSpan(item, position);
- final int itemWidth = getItemWidth(itemColumnSpan);
- view = mAdapter.getView(item, position, scrap, this, itemWidth);
-
- if (view != scrap && scrap != null) {
- // The adapter didn't use it; put it back.
- mRecycler.addScrap(scrap);
- }
-
- ViewGroup.LayoutParams lp = view.getLayoutParams();
-
- if (view.getParent() != this) {
- if (lp == null) {
- lp = generateDefaultLayoutParams();
- } else if (!checkLayoutParams(lp)) {
- lp = generateLayoutParams(lp);
- }
-
- view.setLayoutParams(lp);
- }
- }
-
- final LayoutParams sglp = (LayoutParams) view.getLayoutParams();
- sglp.position = position;
- sglp.viewType = positionViewType;
- final long id = mAdapter.getItemIdFromView(view, position);
- sglp.id = id;
- sglp.span = mAdapter.getItemColumnSpan(item, position);
-
- // When the view at the positions we are tracking update, make sure to
- // update our views as well. That way, we have the correct
- // rectangle for comparing when the drag target enters/ leaves the
- // placeholder view.
- if (isDragReorderingSupported() && mReorderHelper.getDraggedChildId() == id) {
- mReorderHelper.updateDraggedChildView(view);
- mReorderHelper.updateDraggedOverChildView(view);
- }
-
- return view;
- }
-
- /**
- * Animation mode to play for new data coming in as well as the stale data that should be
- * animated out.
- * @param animationIn The animation to play to introduce new or updated data into view
- * @param animationOut The animation to play to transition stale data out of view.
- */
- public void setAnimationMode(AnimationIn animationIn, AnimationOut animationOut) {
- mAnimationInMode = animationIn;
- mAnimationOutMode = animationOut;
- }
-
- public AnimationIn getAnimationInMode() {
- return mAnimationInMode;
- }
-
- public AnimationOut getAnimationOutMode() {
- return mAnimationOutMode;
- }
-
- public GridAdapter getAdapter() {
- return mAdapter;
- }
-
- public void setAdapter(GridAdapter adapter) {
- if (mAdapter != null) {
- mAdapter.unregisterDataSetObserver(mObserver);
- }
-
- clearAllState();
-
- mAdapter = adapter;
- mDataChanged = true;
- mItemCount = adapter != null ? adapter.getCount() : 0;
-
- if (adapter != null) {
- adapter.registerDataSetObserver(mObserver);
- mRecycler.setViewTypeCount(adapter.getViewTypeCount());
- mHasStableIds = adapter.hasStableIds();
- } else {
- mHasStableIds = false;
- }
-
- if (isDragReorderingSupported()) {
- updateReorderStates(ReorderUtils.DRAG_STATE_NONE);
- }
-
- updateEmptyStatus();
- }
-
- public void setAdapter(GridAdapter adapter, ScrollState scrollState) {
- setAdapter(adapter);
- mCurrentScrollState = scrollState;
- }
-
- /**
- * Clear all state because the grid will be used for a completely different set of data.
- */
- private void clearAllState() {
- // Clear all layout records and views
- mLayoutRecords.clear();
- removeAllViews();
-
- mItemTops = null;
- mItemBottoms = null;
-
- setSelectionToTop();
-
- // Clear recycler because there could be different view types now
- mRecycler.clear();
-
- // Reset the last touch y coordinate so that any animation/events won't use stale values.
- mLastTouchY = 0;
-
- // Reset the first changed position to 0. At least we will update all views.
- mFirstChangedPosition = 0;
- }
-
- /**
- * Scroll the list so the first visible position in the grid is the first item in the adapter.
- */
- public void setSelectionToTop() {
- mCurrentScrollState = null;
- setFirstPositionAndOffsets(0 /* position */, getPaddingTop() /* offset */);
- }
-
- /**
- * Get {@link #mFirstPosition}, which is the adapter position of the View
- * returned by getChildAt(0).
- */
- public int getCurrentFirstPosition() {
- return mFirstPosition;
- }
-
- /**
- * Indicate whether the scrolling state is currently at the topmost of this grid
- * @return boolean Indicates whether the current view is the top most of this grid.
- */
- private boolean isSelectionAtTop() {
- if (mCurrentScrollState != null && mCurrentScrollState.getAdapterPosition() == 0) {
- // ScrollState is how far the top of the first child is from the top of the screen, and
- // does not include top padding when the adapter position is the first child. If the
- // vertical offset of the scroll state is exactly equal to {@link #mItemMargin}, then
- // the first item, and therefore the view of the grid, is at the top.
- return mCurrentScrollState.getVerticalOffset() == mItemMargin;
- }
-
- return false;
- }
-
- /**
- * Set the first position and offset so that on layout, we would start laying out starting
- * with the specified position at the top of the view.
- * @param position The child position to place at the top of this view.
- * @param offset The vertical layout offset of the view at the specified position.
- */
- public void setFirstPositionAndOffsets(int position, int offset) {
- // Reset the first visible position in the grid to be item 0
- mFirstPosition = position;
- if (mItemTops == null || mItemBottoms == null) {
- mItemTops = new int[mColCount];
- mItemBottoms = new int[mColCount];
- }
-
- calculateLayoutStartOffsets(offset);
- }
-
- /**
- * Restore the view to the states specified by the {@link ScrollState}.
- * @param scrollState {@link ScrollState} containing the scroll states to restore to.
- */
- private void restoreScrollPosition(ScrollState scrollState) {
- if (mAdapter == null || scrollState == null || mAdapter.getCount() == 0) {
- return;
- }
-
- Log.v(TAG, "[restoreScrollPosition] " + scrollState);
-
- int targetPosition = 0;
- long itemId = -1;
-
- final int originalPosition = scrollState.getAdapterPosition();
- final int adapterCount = mAdapter.getCount();
- // ScrollState is defined as the vertical offset of the first item that is laid out
- // on screen. To restore scroll state, we check within a window to see if we can
- // find that original first item in this new data set. If we can, restore that item
- // to the first position on screen, offset by its previous vertical offset. If we
- // cannot find that item, then we'll simply layout out everything from the beginning
- // again.
-
- // TODO: Perhaps it is more efficient if we check the cursor in one direction first
- // before going backwards, rather than jumping back and forth as we are doing now.
- for (int i = 0; i < SCROLL_RESTORE_WINDOW_SIZE; i++) {
- if (originalPosition + i < adapterCount) {
- itemId = mAdapter.getItemId(originalPosition + i);
- if (itemId != -1 && itemId == scrollState.getItemId()) {
- targetPosition = originalPosition + i;
- break;
- }
- }
-
- if (originalPosition - i >= 0 && originalPosition - i < adapterCount) {
- itemId = mAdapter.getItemId(originalPosition - i);
- if (itemId != -1 && itemId == scrollState.getItemId()) {
- targetPosition = originalPosition - i;
- break;
- }
- }
- }
-
- // layoutChildren(), fillDown() and fillUp() always apply mItemMargin when laying out
- // views. Since restoring scroll position is effectively laying out a particular child
- // as the first child, we need to ensure we strip mItemMargin from the offset, as it
- // will be re-applied when the view is laid out.
- //
- // Since top padding varies with screen orientation and is not stored in the scroll
- // state when the scroll adapter position is the first child, we add it here.
- int offset = scrollState.getVerticalOffset() - mItemMargin;
- if (targetPosition == 0) {
- offset += getPaddingTop();
- }
-
- setFirstPositionAndOffsets(targetPosition, offset);
- mCurrentScrollState = null;
- }
-
- /**
- * Return the current scroll state of this view.
- * @return {@link ScrollState} The current scroll state
- */
- public ScrollState getScrollState() {
- final View v = getChildAt(0);
- if (v == null) {
- return null;
- }
-
- final LayoutParams lp = (LayoutParams) v.getLayoutParams();
- // Since top padding varies with screen orientation, it is not stored in the scroll state
- // when the scroll adapter position is the first child.
- final int offset = (lp.position == 0 ? v.getTop() - getPaddingTop() : v.getTop());
- return new ScrollState(lp.id, lp.position, offset);
- }
-
- /**
- * NOTE This method is borrowed from {@link ScrollView}.
- */
- @Override
- public boolean requestChildRectangleOnScreen(View child, Rect rectangle,
- boolean immediate) {
- // offset into coordinate space of this scroll view
- rectangle.offset(child.getLeft() - child.getScrollX(),
- child.getTop() - child.getScrollY());
-
- return scrollToChildRect(rectangle, immediate);
- }
-
- /**
- * If rect is off screen, scroll just enough to get it (or at least the
- * first screen size chunk of it) on screen.
- * NOTE This method is borrowed from {@link ScrollView}.
- *
- * @param rect The rectangle.
- * @param immediate True to scroll immediately without animation. Not used here.
- * @return true if scrolling was performed
- */
- private boolean scrollToChildRect(Rect rect, boolean immediate) {
- final int delta = computeScrollDeltaToGetChildRectOnScreen(rect);
- final boolean scroll = delta != 0;
- if (scroll) {
- // TODO smoothScrollBy if immediate is false.
- scrollBy(0, delta);
- }
- return scroll;
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
-
- if (mOnSizeChangedListener != null) {
- mOnSizeChangedListener.onSizeChanged(w, h, oldw, oldh);
- }
-
- // NOTE Below is borrowed from {@link ScrollView}.
- final View currentFocused = findFocus();
- if (null == currentFocused || this == currentFocused) {
- return;
- }
-
- // If the currently-focused view was visible on the screen when the
- // screen was at the old height, then scroll the screen to make that
- // view visible with the new screen height.
- if (isWithinDeltaOfScreen(currentFocused, 0, oldh)) {
- currentFocused.getDrawingRect(mTempRect);
- offsetDescendantRectToMyCoords(currentFocused, mTempRect);
- scrollBy(0, computeScrollDeltaToGetChildRectOnScreen(mTempRect));
- }
- }
-
- /**
- *
- * NOTE This method is borrowed from {@link ScrollView}.
- *
- * @return whether the descendant of this scroll view is within delta
- * pixels of being on the screen.
- */
- private boolean isWithinDeltaOfScreen(View descendant, int delta, int height) {
- descendant.getDrawingRect(mTempRect);
- offsetDescendantRectToMyCoords(descendant, mTempRect);
-
- return (mTempRect.bottom + delta) >= getScrollY()
- && (mTempRect.top - delta) <= (getScrollY() + height);
- }
-
- /**
- * NOTE: borrowed from {@link GridView}
- * Comments from {@link View}
- *
- * Compute the vertical extent of the vertical scrollbar's thumb within the vertical range.
- * This value is used to compute the length of the thumb within the scrollbar's track.
- * The range is expressed in arbitrary units that must be the same as the units used by
- * {@link #computeVerticalScrollRange} and {@link #computeVerticalScrollOffset}.
- *
- * The default extent is the drawing height of this view.
- *
- * @return the vertical extent of the scrollbar's thumb
- */
- @Override
- protected int computeVerticalScrollExtent() {
-
- final int count = getChildCount();
- if (count > 0) {
- if (mSmoothScrollbarEnabled) {
- final int rowCount = (count + mColCount - 1) / mColCount;
- int extent = rowCount * SCROLLING_ESTIMATED_ITEM_HEIGHT;
-
- View view = getChildAt(0);
- final int top = view.getTop();
- int height = view.getHeight();
- if (height > 0) {
- extent += (top * SCROLLING_ESTIMATED_ITEM_HEIGHT) / height;
- }
-
- view = getChildAt(count - 1);
- final int bottom = view.getBottom();
- height = view.getHeight();
- if (height > 0) {
- extent -= ((bottom - getHeight()) * SCROLLING_ESTIMATED_ITEM_HEIGHT) / height;
- }
-
- return extent;
- } else {
- return 1;
- }
- }
- return 0;
- }
-
- /**
- * NOTE: borrowed from {@link GridView} and altered as appropriate to accommodate for
- * {@link StaggeredGridView}
- *
- * Comments from {@link View}
- *
- * Compute the vertical offset of the vertical scrollbar's thumb within the horizontal range.
- * This value is used to compute the position of the thumb within the scrollbar's track.
- * The range is expressed in arbitrary units that must be the same as the units used by
- * {@link #computeVerticalScrollRange()} and {@link #computeVerticalScrollExtent()}.
- *
- * The default offset is the scroll offset of this view.
- *
- * @return the vertical offset of the scrollbar's thumb
- */
- @Override
- protected int computeVerticalScrollOffset() {
- final int firstPosition = mFirstPosition;
- final int childCount = getChildCount();
- final int paddingTop = getPaddingTop();
-
- if (firstPosition >= 0 && childCount > 0) {
- if (mSmoothScrollbarEnabled) {
- final View view = getChildAt(0);
- final int top = view.getTop();
- final int currentTopViewHeight = view.getHeight();
- if (currentTopViewHeight > 0) {
- // In an ideal world, all items would have a fixed height that we would know
- // a priori, calculating the scroll offset would simply be:
- // [A] (mFirstPosition * fixedHeight) - childView[0].top
- // where childView[0] is the first view on screen.
- //
- // However, given that we do not know the height ahead of time, and that each
- // item in this grid can have varying heights, we'd need to assign an arbitrary
- // item height (SCROLLING_ESTIMATED_ITEM_HEIGHT) in order to estimate the scroll
- // offset. The previous equation thus transforms to:
- // [B] (mFirstPosition * SCROLLING_ESTIMATED_ITEM_HEIGHT) -
- // ((childView[0].top * SCROLLING_ESTIMATED_ITEM_HEIGHT) /
- // childView[0].height)
- //
- // Equation [B] gives a pretty good calculation of the offset if this were a
- // single column grid view, for a multi-column grid, one slight modification is
- // needed:
- // [C] ((mFirstPosition * SCROLLING_ESTIMATED_ITEM_HEIGHT) / mColCount) -
- // ((childView[0].top * SCROLLING_ESTIMATED_ITEM_HEIGHT) /
- // childView[0].height)
- final int estimatedScrollOffset =
- ((firstPosition * SCROLLING_ESTIMATED_ITEM_HEIGHT) / mColCount) -
- ((top * SCROLLING_ESTIMATED_ITEM_HEIGHT) / currentTopViewHeight);
-
- final int rowCount = (mItemCount + mColCount - 1) / mColCount;
- final int overScrollCompensation = (int) ((float) getScrollY() / getHeight() *
- rowCount * SCROLLING_ESTIMATED_ITEM_HEIGHT);
-
- int val = Math.max(estimatedScrollOffset + overScrollCompensation, 0);
- // If mFirstPosition is currently the very first item in the adapter, check to
- // see if we need to take into account any top padding. This is so that we
- // don't return 0 when in fact the user may still be scrolling through some
- // top padding.
- if (firstPosition == 0 && paddingTop > 0) {
- val += paddingTop - top + mItemMargin;
- }
- return val;
- }
- } else {
- int index;
- final int count = mItemCount;
- if (firstPosition == 0) {
- index = 0;
- } else if (firstPosition + childCount == count) {
- index = count;
- } else {
- index = firstPosition + childCount / 2;
- }
- return (int) (firstPosition + childCount * (index / (float) count));
- }
- }
-
- return paddingTop;
- }
-
- /**
- * NOTE: borrowed from {@link GridView} and altered as appropriate to accommodate for
- * {@link StaggeredGridView}
- *
- * Comments from {@link View}
- *
- * Compute the vertical range that the vertical scrollbar represents.
- * The range is expressed in arbitrary units that must be the same as the units used by
- * {@link #computeVerticalScrollExtent} and {@link #computeVerticalScrollOffset}.
- *
- * The default range is the drawing height of this view.
- *
- * @return the total vertical range represented by the vertical scrollbar
- */
- @Override
- protected int computeVerticalScrollRange() {
- final int rowCount = (mItemCount + mColCount - 1) / mColCount;
- int result = Math.max(rowCount * SCROLLING_ESTIMATED_ITEM_HEIGHT, 0);
-
- if (mSmoothScrollbarEnabled) {
- if (getScrollY() != 0) {
- // Compensate for overscroll
- result += Math.abs((int) ((float) getScrollY() / getHeight() * rowCount
- * SCROLLING_ESTIMATED_ITEM_HEIGHT));
- }
- } else {
- result = mItemCount;
- }
-
- return result;
- }
-
- /**
- * Compute the amount to scroll in the Y direction in order to get
- * a rectangle completely on the screen (or, if taller than the screen,
- * at least the first screen size chunk of it).
- *
- * NOTE This method is borrowed from {@link ScrollView}.
- *
- * @param rect The rect.
- * @return The scroll delta.
- */
- protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
- if (getChildCount() == 0) {
- return 0;
- }
-
- final int height = getHeight();
- final int fadingEdge = getVerticalFadingEdgeLength();
-
- int screenTop = getScrollY();
- int screenBottom = screenTop + height;
-
- // leave room for top fading edge as long as rect isn't at very top
- if (rect.top > 0) {
- screenTop += fadingEdge;
- }
-
- // leave room for bottom fading edge as long as rect isn't at very bottom
- if (rect.bottom < getHeight()) {
- screenBottom -= fadingEdge;
- }
-
- int scrollYDelta = 0;
-
- if (rect.bottom > screenBottom && rect.top > screenTop) {
- // need to move down to get it in view: move down just enough so
- // that the entire rectangle is in view (or at least the first
- // screen size chunk).
-
- if (rect.height() > height) {
- // just enough to get screen size chunk on
- scrollYDelta = screenTop - rect.top;
- } else {
- // get entire rect at bottom of screen
- scrollYDelta = screenBottom - rect.bottom;
- }
- } else if (rect.top < screenTop && rect.bottom < screenBottom) {
- // need to move up to get it in view: move up just enough so that
- // entire rectangle is in view (or at least the first screen
- // size chunk of it).
-
- if (rect.height() > height) {
- // screen size chunk
- scrollYDelta = screenBottom - rect.bottom;
- } else {
- // entire rect at top
- scrollYDelta = screenTop - rect.top;
- }
- }
- return scrollYDelta;
- }
-
- @Override
- protected LayoutParams generateDefaultLayoutParams() {
- return new LayoutParams(LayoutParams.WRAP_CONTENT);
- }
-
- @Override
- protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) {
- return new LayoutParams(lp);
- }
-
- @Override
- protected boolean checkLayoutParams(ViewGroup.LayoutParams lp) {
- return lp instanceof LayoutParams;
- }
-
- @Override
- public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
- return new LayoutParams(getContext(), attrs);
- }
-
- @Override
- public Parcelable onSaveInstanceState() {
- final Parcelable superState = super.onSaveInstanceState();
- final SavedState ss = new SavedState(superState);
- final int position = mFirstPosition;
- ss.position = position;
- if (position >= 0 && mAdapter != null && position < mAdapter.getCount()) {
- ss.firstId = mAdapter.getItemId(position);
- }
- if (getChildCount() > 0) {
- // Since top padding varies with screen orientation, it is not stored in the scroll
- // state when the scroll adapter position is the first child.
- ss.topOffset = position == 0 ?
- getChildAt(0).getTop() - getPaddingTop() : getChildAt(0).getTop();
- }
- return ss;
- }
-
- @Override
- public void onRestoreInstanceState(Parcelable state) {
- final SavedState ss = (SavedState) state;
- super.onRestoreInstanceState(ss.getSuperState());
- mDataChanged = true;
- mFirstPosition = ss.position;
- mCurrentScrollState = new ScrollState(ss.firstId, ss.position, ss.topOffset);
- requestLayout();
- }
-
- public static class LayoutParams extends ViewGroup.LayoutParams {
- private static final int[] LAYOUT_ATTRS = new int[] {
- android.R.attr.layout_span
- };
-
- private static final int SPAN_INDEX = 0;
-
- /**
- * The number of columns this item should span
- */
- public int span = 1;
-
- /**
- * Item position this view represents
- */
- public int position = -1;
-
- /**
- * Type of this view as reported by the adapter
- */
- int viewType;
-
- /**
- * The column this view is occupying
- */
- int column;
-
- /**
- * The stable ID of the item this view displays
- */
- long id = -1;
-
- /**
- * The position where reordering can happen for this view
- */
- public int reorderingArea = ReorderUtils.REORDER_AREA_NONE;
-
- public LayoutParams(int height) {
- super(MATCH_PARENT, height);
-
- if (this.height == MATCH_PARENT) {
- Log.w(TAG, "Constructing LayoutParams with height FILL_PARENT - " +
- "impossible! Falling back to WRAP_CONTENT");
- this.height = WRAP_CONTENT;
- }
- }
-
- public LayoutParams(Context c, AttributeSet attrs) {
- super(c, attrs);
-
- if (this.width != MATCH_PARENT) {
- Log.w(TAG, "Inflation setting LayoutParams width to " + this.width +
- " - must be MATCH_PARENT");
- this.width = MATCH_PARENT;
- }
- if (this.height == MATCH_PARENT) {
- Log.w(TAG, "Inflation setting LayoutParams height to MATCH_PARENT - " +
- "impossible! Falling back to WRAP_CONTENT");
- this.height = WRAP_CONTENT;
- }
-
- final TypedArray a = c.obtainStyledAttributes(attrs, LAYOUT_ATTRS);
- span = a.getInteger(SPAN_INDEX, 1);
- a.recycle();
- }
-
- public LayoutParams(ViewGroup.LayoutParams other) {
- super(other);
-
- if (this.width != MATCH_PARENT) {
- Log.w(TAG, "Constructing LayoutParams with width " + this.width +
- " - must be MATCH_PARENT");
- this.width = MATCH_PARENT;
- }
- if (this.height == MATCH_PARENT) {
- Log.w(TAG, "Constructing LayoutParams with height MATCH_PARENT - " +
- "impossible! Falling back to WRAP_CONTENT");
- this.height = WRAP_CONTENT;
- }
- }
- }
-
- private class RecycleBin {
- private ArrayList<View>[] mScrapViews;
- private int mViewTypeCount;
- private int mMaxScrap;
-
- private SparseArray<View> mTransientStateViews;
-
- public void setViewTypeCount(int viewTypeCount) {
- if (viewTypeCount < 1) {
- throw new IllegalArgumentException("Must have at least one view type (" +
- viewTypeCount + " types reported)");
- }
- if (viewTypeCount == mViewTypeCount) {
- return;
- }
-
- final ArrayList<View>[] scrapViews = new ArrayList[viewTypeCount];
- for (int i = 0; i < viewTypeCount; i++) {
- scrapViews[i] = new ArrayList<View>();
- }
- mViewTypeCount = viewTypeCount;
- mScrapViews = scrapViews;
- }
-
- public void clear() {
- final int typeCount = mViewTypeCount;
- for (int i = 0; i < typeCount; i++) {
- mScrapViews[i].clear();
- }
- if (mTransientStateViews != null) {
- mTransientStateViews.clear();
- }
- }
-
- public void clearTransientViews() {
- if (mTransientStateViews != null) {
- mTransientStateViews.clear();
- }
- }
-
- public void addScrap(View v) {
- if (!(v.getLayoutParams() instanceof LayoutParams)) {
- return;
- }
-
- final LayoutParams lp = (LayoutParams) v.getLayoutParams();
- if (ViewCompat.hasTransientState(v)) {
- if (mTransientStateViews == null) {
- mTransientStateViews = new SparseArray<View>();
- }
- mTransientStateViews.put(lp.position, v);
- return;
- }
-
- final int childCount = getChildCount();
- if (childCount > mMaxScrap) {
- mMaxScrap = childCount;
- }
-
- // Clear possible modified states applied to the view when adding to the recycler.
- // This view may have been part of a cancelled animation, so clear that state so that
- // future consumer of this view won't have to deal with states from its past life.
- v.setTranslationX(0);
- v.setTranslationY(0);
- v.setRotation(0);
- v.setAlpha(1.0f);
- v.setScaleY(1.0f);
-
- final ArrayList<View> scrap = mScrapViews[lp.viewType];
- if (scrap.size() < mMaxScrap) {
- // The number of scraps have not yet exceeded our limit, check to see that this
- // view does not already exist in the recycler. This can happen if a caller
- // mistakenly calls addScrap(view) multiple times for the same view.
- if (!scrap.contains(v)) {
- scrap.add(v);
- }
- }
- }
-
- public View getTransientStateView(int position) {
- if (mTransientStateViews == null) {
- return null;
- }
-
- final View result = mTransientStateViews.get(position);
- if (result != null) {
- mTransientStateViews.remove(position);
- }
- return result;
- }
-
- public View getScrapView(int type) {
- final ArrayList<View> scrap = mScrapViews[type];
- if (scrap.isEmpty()) {
- return null;
- }
-
- final int index = scrap.size() - 1;
- final View result = scrap.remove(index);
-
- return result;
- }
-
- // TODO: Implement support to maintain a list of active views so that we can make use of
- // stable ids to retrieve the same view that is currently laid out for a particular item.
- // Currently, all views "recycled" are shoved into the same collection, this may not be
- // the most effective way. Refer to the RecycleBin as implemented for AbsListView.
- public View getView(int type, long stableId) {
- final ArrayList<View> scrap = mScrapViews[type];
- if (scrap.isEmpty()) {
- return null;
- }
-
- for (int i = 0; i < scrap.size(); i++) {
- final View v = scrap.get(i);
- final LayoutParams lp = (LayoutParams) v.getLayoutParams();
- if (lp.id == stableId) {
- scrap.remove(i);
- return v;
- }
- }
-
- return null;
- }
- }
-
- private class AdapterDataSetObserver extends DataSetObserver {
- @Override
- public void onChanged() {
- mDataChanged = true;
-
- mItemCount = mAdapter.getCount();
- mFirstChangedPosition = mAdapter.getFirstChangedPosition();
- if (mFirstPosition >= mItemCount) {
- // If the latest data set has fewer data items than mFirstPosition, we will not be
- // able to accurately restore scroll state, so just reset to the top.
- mFirstPosition = 0;
- mCurrentScrollState = null;
- }
-
- // TODO: Consider matching these back up if we have stable IDs.
- mRecycler.clearTransientViews();
-
- if (mHasStableIds) {
- // If we will animate the transition to the new layout, cache the current positions
- // of the visible children. This is before any views get removed below.
- cacheChildRects();
- } else {
- // Clear all layout records
- mLayoutRecords.clear();
-
- // Reset item bottoms to be equal to item tops
- final int colCount = mColCount;
- for (int i = 0; i < colCount; i++) {
- mItemBottoms[i] = mItemTops[i];
- }
- }
-
- updateEmptyStatus();
-
- // TODO: consider repopulating in a deferred runnable instead
- // (so that successive changes may still be batched)
- requestLayout();
- }
-
- @Override
- public void onInvalidated() {
- }
- }
-
- static class SavedState extends BaseSavedState {
- long firstId = -1;
- int position;
-
- // topOffset is the vertical value that the view specified by position should
- // start rendering from. If it is 0, the view would be at the top of the grid.
- int topOffset;
-
- SavedState(Parcelable superState) {
- super(superState);
- }
-
- private SavedState(Parcel in) {
- super(in);
- firstId = in.readLong();
- position = in.readInt();
- topOffset = in.readInt();
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- super.writeToParcel(out, flags);
- out.writeLong(firstId);
- out.writeInt(position);
- out.writeInt(topOffset);
- }
-
- @Override
- public String toString() {
- return "StaggereGridView.SavedState{"
- + Integer.toHexString(System.identityHashCode(this))
- + " firstId=" + firstId
- + " position=" + position + "}";
- }
-
- public static final Parcelable.Creator<SavedState> CREATOR
- = new Parcelable.Creator<SavedState>() {
- @Override
- public SavedState createFromParcel(Parcel in) {
- return new SavedState(in);
- }
-
- @Override
- public SavedState[] newArray(int size) {
- return new SavedState[size];
- }
- };
- }
-
- public void setDropListener(ReorderListener listener) {
- mReorderHelper = new ReorderHelper(listener, this);
- }
-
- public void setScrollListener(ScrollListener listener) {
- mScrollListener = listener;
- }
-
- public void setOnSizeChangedListener(OnSizeChangedListener listener) {
- mOnSizeChangedListener = listener;
- }
-
- /**
- * Helper class to store a {@link View} with its corresponding layout positions
- * as a {@link Rect}.
- */
- private static class ViewRectPair {
- public final View view;
- public final Rect rect;
-
- public ViewRectPair(View v, Rect r) {
- view = v;
- rect = r;
- }
- }
-
- public static class ScrollState implements Parcelable {
- private final long mItemId;
- private final int mAdapterPosition;
-
- // The offset that the view specified by mAdapterPosition should start rendering from. If
- // this value is 0, then the view would be rendered from the very top of this grid.
- private int mVerticalOffset;
-
- public ScrollState(long itemId, int adapterPosition, int offset) {
- mItemId = itemId;
- mAdapterPosition = adapterPosition;
- mVerticalOffset = offset;
- }
-
- private ScrollState(Parcel in) {
- mItemId = in.readLong();
- mAdapterPosition = in.readInt();
- mVerticalOffset = in.readInt();
- }
-
- public long getItemId() {
- return mItemId;
- }
-
- public int getAdapterPosition() {
- return mAdapterPosition;
- }
-
- public void setVerticalOffset(int offset) {
- mVerticalOffset = offset;
- }
-
- public int getVerticalOffset() {
- return mVerticalOffset;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeLong(mItemId);
- dest.writeInt(mAdapterPosition);
- dest.writeInt(mVerticalOffset);
- }
-
- public static final Parcelable.Creator<ScrollState> CREATOR =
- new Parcelable.Creator<ScrollState>() {
- @Override
- public ScrollState createFromParcel(Parcel source) {
- return new ScrollState(source);
- }
-
- @Override
- public ScrollState[] newArray(int size) {
- return new ScrollState[size];
- }
- };
-
- @Override
- public String toString() {
- return "ScrollState {mItemId=" + mItemId +
- " mAdapterPosition=" + mAdapterPosition +
- " mVerticalOffset=" + mVerticalOffset + "}";
- }
- }
-
- /**
- * Listener of {@Link StaggeredGridView} for grid size change.
- */
- public interface OnSizeChangedListener {
- void onSizeChanged(int width, int height, int oldWidth, int oldHeight);
- }
-
- /**
- * Listener of {@Link StaggeredGridView} for scroll change.
- */
- public interface ScrollListener {
-
- /**
- * Called when scroll happens on this view.
- *
- * @param offset The scroll offset amount.
- * @param currentScrollY The current y position of this view.
- * @param maxScrollY The maximum amount of scroll possible in this view.
- */
- void onScrollChanged(int offset, int currentScrollY, int maxScrollY);
- }
-
- /**
- * Listener of {@link StaggeredGridView} for animations. This listener is responsible
- * for playing all animations created by this {@link StaggeredGridView}
- */
- public interface AnimationListener {
- /**
- * Called when animations are ready to be played
- * @param animationMode The current animation mode based on the state of the data. Valid
- * animation modes are {@link ANIMATION_MODE_NONE}, {@link ANIMATION_MODE_NEW_DATA}, and
- * {@link ANIMATION_MODE_UPDATE_DATA}.
- * @param animators The list of animators to be played
- */
- void onAnimationReady(int animationMode, List<Animator> animators);
- }
-
- /**
- * Listener of {@link StaggeredGridView} for drag and drop reordering of child views.
- */
- public interface ReorderListener {
-
- /**
- * onPickedUp is called to notify listeners that an item has been picked up for reordering.
- * @param draggedChild the original child view that picked up.
- */
- void onPickedUp(View draggedChild);
-
- /**
- * onDrop is called to notify listeners that an intent to drop the
- * item at position "from" over the position "target"
- * @param draggedView the original child view that was dropped
- * @param sourcePosition the original position where the item was dragged from
- * @param targetPosition the target position where the item is dropped at
- */
- void onDrop(View draggedView, int sourcePosition, int targetPosition);
-
- /**
- * onCancelDrag is called to notify listeners that the drag event has been cancelled.
- * @param draggediew the original child view that was dragged.
- */
- void onCancelDrag(View draggediew);
-
- /**
- * onReorder is called to notify listeners that an intent to move the
- * item at position "from" to position "to"
- * @param draggedView the original child view that was dragged
- * @param id id of the original item that was picked up
- * @param from
- * @param to the target position where the item is dropped at
- */
- boolean onReorder(View draggedView, long id, int from, int to);
-
- /**
- * Event handler for a drag entering the {@link StaggeredGridView} element's
- * reordering area.
- * @param view The child view that just received an enter event on the reordering area.
- * @param position The adapter position of the view that just received an enter event.
- */
- void onEnterReorderArea(View view, int position);
- }
-}
diff --git a/src/com/android/deskclock/widget/toast/LinearLayoutWithSnackbarBehavior.java b/src/com/android/deskclock/widget/toast/LinearLayoutWithSnackbarBehavior.java
new file mode 100644
index 0000000..3b9c61f
--- /dev/null
+++ b/src/com/android/deskclock/widget/toast/LinearLayoutWithSnackbarBehavior.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 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.widget.toast;
+
+import android.content.Context;
+import android.support.design.widget.CoordinatorLayout;
+import android.support.design.widget.Snackbar;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.LinearLayout;
+
+/**
+ * LinearLayout Behavior that slides up and down when snackbar appears/disappears.
+ */
+public final class LinearLayoutWithSnackbarBehavior
+ extends CoordinatorLayout.Behavior<LinearLayout> {
+
+ public LinearLayoutWithSnackbarBehavior(Context context, AttributeSet attrs) {}
+
+ @Override
+ public boolean layoutDependsOn(CoordinatorLayout parent, LinearLayout child, View dependency) {
+ return dependency instanceof Snackbar.SnackbarLayout;
+ }
+
+ @Override
+ public boolean onDependentViewChanged(CoordinatorLayout parent, LinearLayout child,
+ View dependency) {
+ final float translationY = Math.min(0,
+ dependency.getTranslationY() - dependency.getHeight());
+ child.setTranslationY(translationY);
+ return true;
+ }
+}
diff --git a/src/com/android/deskclock/widget/toast/SnackbarManager.java b/src/com/android/deskclock/widget/toast/SnackbarManager.java
new file mode 100644
index 0000000..4a01cf0
--- /dev/null
+++ b/src/com/android/deskclock/widget/toast/SnackbarManager.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2015 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.widget.toast;
+
+import android.support.design.widget.Snackbar;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Manages visibility of Snackbar and allow preemptively dismiss current Snackbar on screen.
+ */
+public final class SnackbarManager {
+
+ private static WeakReference<Snackbar> sSnackbar = null;
+
+ private SnackbarManager() {}
+
+ public static void show(Snackbar snackbar) {
+ sSnackbar = new WeakReference<>(snackbar);
+ snackbar.show();
+ }
+
+ public static void dismiss() {
+ if (sSnackbar != null && sSnackbar.get() != null) {
+ sSnackbar.get().dismiss();
+ sSnackbar = null;
+ }
+ }
+}
diff --git a/src/com/android/deskclock/ToastMaster.java b/src/com/android/deskclock/widget/toast/ToastManager.java
similarity index 89%
rename from src/com/android/deskclock/ToastMaster.java
rename to src/com/android/deskclock/widget/toast/ToastManager.java
index 4d51696..09be715 100644
--- a/src/com/android/deskclock/ToastMaster.java
+++ b/src/com/android/deskclock/widget/toast/ToastManager.java
@@ -14,15 +14,15 @@
* limitations under the License.
*/
-package com.android.deskclock;
+package com.android.deskclock.widget.toast;
import android.widget.Toast;
-public class ToastMaster {
+public final class ToastManager {
private static Toast sToast = null;
- private ToastMaster() {
+ private ToastManager() {
}
diff --git a/src/com/android/deskclock/worldclock/Cities.java b/src/com/android/deskclock/worldclock/Cities.java
deleted file mode 100644
index dbd017d..0000000
--- a/src/com/android/deskclock/worldclock/Cities.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2012 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.worldclock;
-
-import android.content.SharedPreferences;
-import android.util.Log;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-
-public class Cities {
-
- public static final String WORLDCLOCK_UPDATE_INTENT = "com.android.deskclock.worldclock.update";
- private static final String NUMBER_OF_CITIES = "number_of_cities";
-
- public static void saveCitiesToSharedPrefs(
- SharedPreferences prefs, HashMap<String, CityObj> cities) {
- SharedPreferences.Editor editor = prefs.edit();
- editor.putInt(NUMBER_OF_CITIES, cities.size());
- Collection<CityObj> col = cities.values();
- Iterator<CityObj> i = col.iterator();
- int count = 0;
- while (i.hasNext()) {
- CityObj c = i.next();
- c.saveCityToSharedPrefs(editor, count);
- count++;
- }
- editor.apply();
- }
-
- public static HashMap<String, CityObj> readCitiesFromSharedPrefs(SharedPreferences prefs) {
- int size = prefs.getInt(NUMBER_OF_CITIES, -1);
- HashMap<String, CityObj> c = new HashMap<String, CityObj>();
- if (size > 0) {
- for (int i = 0; i < size; i++) {
- CityObj o = new CityObj(prefs, i);
- if (o.mCityName != null && o.mTimeZone != null) {
- c.put(o.mCityId, o);
- }
- }
- }
- return c;
- }
-
- private static void dumpCities(SharedPreferences prefs, String title) {
- int size = prefs.getInt(NUMBER_OF_CITIES, -1);
- Log.d("Cities", "Selected Cities List " + title);
- Log.d("Cities", "Number of cities " + size);
- HashMap<String, CityObj> c = new HashMap<String, CityObj>();
- if (size > 0) {
- for (int i = 0; i < size; i++) {
- CityObj o = new CityObj(prefs, i);
- if (o.mCityName != null && o.mTimeZone != null) {
- Log.d("Cities", "Name " + o.mCityName + " tz " + o.mTimeZone);
- }
- }
- }
- }
-}
diff --git a/src/com/android/deskclock/worldclock/CitiesActivity.java b/src/com/android/deskclock/worldclock/CitiesActivity.java
deleted file mode 100644
index f7dff8b..0000000
--- a/src/com/android/deskclock/worldclock/CitiesActivity.java
+++ /dev/null
@@ -1,632 +0,0 @@
-/*
- * Copyright (C) 2012 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.worldclock;
-
-import android.content.ActivityNotFoundException;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.media.AudioManager;
-import android.os.Build;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.support.v4.view.MenuItemCompat;
-import android.support.v7.widget.SearchView;
-import android.text.TextUtils;
-import android.text.format.DateFormat;
-import android.util.TypedValue;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.view.inputmethod.EditorInfo;
-import android.widget.BaseAdapter;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.Filter;
-import android.widget.Filterable;
-import android.widget.ListView;
-import android.widget.SectionIndexer;
-import android.widget.TextView;
-
-import com.android.deskclock.BaseActivity;
-import com.android.deskclock.R;
-import com.android.deskclock.SettingsActivity;
-import com.android.deskclock.Utils;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.TimeZone;
-
-/**
- * Cities chooser for the world clock
- */
-public class CitiesActivity extends BaseActivity implements OnCheckedChangeListener,
- View.OnClickListener, SearchView.OnQueryTextListener {
-
- private static final String KEY_SEARCH_QUERY = "search_query";
- private static final String KEY_SEARCH_MODE = "search_mode";
- private static final String KEY_LIST_POSITION = "list_position";
-
- private static final String PREF_SORT = "sort_preference";
-
- private static final int SORT_BY_NAME = 0;
- private static final int SORT_BY_GMT_OFFSET = 1;
-
- /**
- * This must be false for production. If true, turns on logging, test code,
- * etc.
- */
- static final boolean DEBUG = false;
- static final String TAG = "CitiesActivity";
-
- private LayoutInflater mFactory;
- private ListView mCitiesList;
- private CityAdapter mAdapter;
- private HashMap<String, CityObj> mUserSelectedCities;
- private Calendar mCalendar;
-
- private SearchView mSearchView;
- private StringBuffer mQueryTextBuffer = new StringBuffer();
- private boolean mSearchMode;
- private int mPosition = -1;
-
- private SharedPreferences mPrefs;
- private int mSortType;
-
- private String mSelectedCitiesHeaderString;
-
- /***
- * Adapter for a list of cities with the respected time zone. The Adapter
- * sorts the list alphabetically and create an indexer.
- ***/
- private class CityAdapter extends BaseAdapter implements Filterable, SectionIndexer {
- private static final int VIEW_TYPE_CITY = 0;
- private static final int VIEW_TYPE_HEADER = 1;
-
- private static final String DELETED_ENTRY = "C0";
-
- private List<CityObj> mDisplayedCitiesList;
-
- private CityObj[] mCities;
- private CityObj[] mSelectedCities;
-
- private final int mLayoutDirection;
-
- // A map that caches names of cities in local memory. The names in this map are
- // preferred over the names of the selected cities stored in SharedPreferences, which could
- // be in a different language. This map gets reloaded on a locale change, when the new
- // language's city strings are read from the xml file.
- private HashMap<String, String> mCityNameMap = new HashMap<String, String>();
-
- private String[] mSectionHeaders;
- private Integer[] mSectionPositions;
-
- private CityNameComparator mSortByNameComparator = new CityNameComparator();
- private CityGmtOffsetComparator mSortByTimeComparator = new CityGmtOffsetComparator();
-
- private final LayoutInflater mInflater;
- private boolean mIs24HoursMode; // AM/PM or 24 hours mode
-
- private final String mPattern12;
- private final String mPattern24;
-
- private int mSelectedEndPosition = 0;
-
- private Filter mFilter = new Filter() {
-
- @Override
- protected synchronized FilterResults performFiltering(CharSequence constraint) {
- FilterResults results = new FilterResults();
- String modifiedQuery = constraint.toString().trim().toUpperCase();
-
- ArrayList<CityObj> filteredList = new ArrayList<>();
- ArrayList<String> sectionHeaders = new ArrayList<>();
- ArrayList<Integer> sectionPositions = new ArrayList<>();
-
- // Update the list first when user using search filter
- final Collection<CityObj> selectedCities = mUserSelectedCities.values();
- mSelectedCities = selectedCities.toArray(new CityObj[selectedCities.size()]);
- // If the search query is empty, add in the selected cities
- if (TextUtils.isEmpty(modifiedQuery) && mSelectedCities != null) {
- if (mSelectedCities.length > 0) {
- sectionHeaders.add("+");
- sectionPositions.add(0);
- filteredList.add(new CityObj(mSelectedCitiesHeaderString,
- mSelectedCitiesHeaderString, null, null));
- }
- for (CityObj city : mSelectedCities) {
- city.isHeader = false;
- filteredList.add(city);
- }
- }
-
- final HashSet<String> selectedCityIds = new HashSet<>();
- for (CityObj c : mSelectedCities) {
- selectedCityIds.add(c.mCityId);
- }
- mSelectedEndPosition = filteredList.size();
-
- long currentTime = System.currentTimeMillis();
- String val = null;
- int offset = -100000; //some value that cannot be a real offset
- for (CityObj city : mCities) {
-
- // If the city is a deleted entry, ignore it.
- if (city.mCityId.equals(DELETED_ENTRY)) {
- continue;
- }
-
- // If the search query is empty, add section headers.
- if (TextUtils.isEmpty(modifiedQuery)) {
- if (!selectedCityIds.contains(city.mCityId)) {
- // If the list is sorted by name, and the city has an index
- // different than the previous city's index, update the section header.
- if (mSortType == SORT_BY_NAME
- && !city.mCityIndex.equals(val)) {
- val = city.mCityIndex.toUpperCase();
- sectionHeaders.add(val);
- sectionPositions.add(filteredList.size());
- city.isHeader = true;
- } else {
- city.isHeader = false;
- }
-
- // If the list is sorted by time, and the gmt offset is different than
- // the previous city's gmt offset, insert a section header.
- if (mSortType == SORT_BY_GMT_OFFSET) {
- TimeZone timezone = TimeZone.getTimeZone(city.mTimeZone);
- int newOffset = timezone.getOffset(currentTime);
- if (offset != newOffset) {
- offset = newOffset;
- // Because JB fastscroll only supports ~1 char strings
- // and KK ellipsizes strings, trim section headers to the
- // nearest hour.
- final String offsetString = Utils.getGMTHourOffset(timezone,
- Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT
- /* useShortForm */ );
- sectionHeaders.add(offsetString);
- sectionPositions.add(filteredList.size());
- city.isHeader = true;
- } else {
- city.isHeader = false;
- }
- }
-
- filteredList.add(city);
- }
- } else {
- // If the city name begins with the non-empty query, add it into the list.
- String cityName = city.mCityName.trim().toUpperCase();
- if (city.mCityId != null && cityName.startsWith(modifiedQuery)) {
- city.isHeader = false;
- filteredList.add(city);
- }
- }
- }
-
- mSectionHeaders = sectionHeaders.toArray(new String[sectionHeaders.size()]);
- mSectionPositions = sectionPositions.toArray(new Integer[sectionPositions.size()]);
-
- results.values = filteredList;
- results.count = filteredList.size();
- return results;
- }
-
- @Override
- protected void publishResults(CharSequence constraint, FilterResults results) {
- mDisplayedCitiesList = (ArrayList<CityObj>) results.values;
- if (mPosition >= 0) {
- mCitiesList.setSelectionFromTop(mPosition, 0);
- mPosition = -1;
- }
- notifyDataSetChanged();
- }
- };
-
- public CityAdapter(
- Context context, LayoutInflater factory) {
- super();
- mCalendar = Calendar.getInstance();
- mCalendar.setTimeInMillis(System.currentTimeMillis());
- mLayoutDirection = TextUtils.getLayoutDirectionFromLocale(Locale.getDefault());
- mInflater = factory;
-
- // Load the cities from xml.
- mCities = Utils.loadCitiesFromXml(context);
-
- // Reload the city name map with the recently parsed city names of the currently
- // selected language for use with selected cities.
- mCityNameMap.clear();
- for (CityObj city : mCities) {
- mCityNameMap.put(city.mCityId, city.mCityName);
- }
-
- // Re-organize the selected cities into an array.
- Collection<CityObj> selectedCities = mUserSelectedCities.values();
- mSelectedCities = selectedCities.toArray(new CityObj[selectedCities.size()]);
-
- // Override the selected city names in the shared preferences with the
- // city names in the updated city name map, which will always reflect the
- // current language.
- for (CityObj city : mSelectedCities) {
- String newCityName = mCityNameMap.get(city.mCityId);
- if (newCityName != null) {
- city.mCityName = newCityName;
- }
- }
-
- mPattern24 = Utils.isJBMR2OrLater()
- ? DateFormat.getBestDateTimePattern(Locale.getDefault(), "Hm")
- : getString(R.string.time_format_24_mode);
-
- // There's an RTL layout bug that causes jank when fast-scrolling through
- // the list in 12-hour mode in an RTL locale. We can work around this by
- // ensuring the strings are the same length by using "hh" instead of "h".
- String pattern12 = Utils.isJBMR2OrLater()
- ? DateFormat.getBestDateTimePattern(Locale.getDefault(), "hma")
- : getString(R.string.time_format_12_mode);
-
- if (mLayoutDirection == View.LAYOUT_DIRECTION_RTL) {
- pattern12 = pattern12.replaceAll("h", "hh");
- }
- mPattern12 = pattern12;
-
- sortCities(mSortType);
- set24HoursMode(context);
- }
-
- public void toggleSort() {
- if (mSortType == SORT_BY_NAME) {
- sortCities(SORT_BY_GMT_OFFSET);
- } else {
- sortCities(SORT_BY_NAME);
- }
- }
-
- private void sortCities(final int sortType) {
- mSortType = sortType;
- Arrays.sort(mCities, sortType == SORT_BY_NAME ? mSortByNameComparator
- : mSortByTimeComparator);
- if (mSelectedCities != null) {
- Arrays.sort(mSelectedCities, sortType == SORT_BY_NAME ? mSortByNameComparator
- : mSortByTimeComparator);
- }
- mPrefs.edit().putInt(PREF_SORT, sortType).commit();
- mFilter.filter(mQueryTextBuffer.toString());
- }
-
- @Override
- public int getCount() {
- return mDisplayedCitiesList != null ? mDisplayedCitiesList.size() : 0;
- }
-
- @Override
- public Object getItem(int p) {
- if (mDisplayedCitiesList != null && p >= 0 && p < mDisplayedCitiesList.size()) {
- return mDisplayedCitiesList.get(p);
- }
- return null;
- }
-
- @Override
- public long getItemId(int p) {
- return p;
- }
-
- @Override
- public boolean isEnabled(int p) {
- return mDisplayedCitiesList != null && mDisplayedCitiesList.get(p).mCityId != null;
- }
-
- @Override
- public synchronized View getView(int position, View view, ViewGroup parent) {
- if (mDisplayedCitiesList == null || position < 0
- || position >= mDisplayedCitiesList.size()) {
- return null;
- }
- CityObj c = mDisplayedCitiesList.get(position);
- // Header view: A CityObj with nothing but the "selected cities" label
- if (c.mCityId == null) {
- if (view == null) {
- view = mInflater.inflate(R.layout.city_list_header, parent, false);
- }
- } else { // City view
- // Make sure to recycle a City view only
- if (view == null) {
- view = mInflater.inflate(R.layout.city_list_item, parent, false);
- final CityViewHolder holder = new CityViewHolder();
- holder.index = (TextView) view.findViewById(R.id.index);
- holder.name = (TextView) view.findViewById(R.id.city_name);
- holder.time = (TextView) view.findViewById(R.id.city_time);
- holder.selected = (CheckBox) view.findViewById(R.id.city_onoff);
- view.setTag(holder);
- }
- view.setOnClickListener(CitiesActivity.this);
- CityViewHolder holder = (CityViewHolder) view.getTag();
-
- holder.selected.setTag(c);
- holder.selected.setChecked(mUserSelectedCities.containsKey(c.mCityId));
- holder.selected.setOnCheckedChangeListener(CitiesActivity.this);
- holder.name.setText(c.mCityName, TextView.BufferType.SPANNABLE);
- holder.time.setText(getTimeCharSequence(c.mTimeZone));
- if (c.isHeader) {
- holder.index.setVisibility(View.VISIBLE);
- if (mSortType == SORT_BY_NAME) {
- holder.index.setText(c.mCityIndex);
- holder.index.setTextSize(TypedValue.COMPLEX_UNIT_SP, 24);
- } else { // SORT_BY_GMT_OFFSET
- holder.index.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
- holder.index.setText(Utils.getGMTHourOffset(
- TimeZone.getTimeZone(c.mTimeZone), false));
- }
- } else {
- // If not a header, use the invisible index for left padding
- holder.index.setVisibility(View.INVISIBLE);
- }
- // skip checkbox and other animations
- view.jumpDrawablesToCurrentState();
- }
- return view;
- }
-
- private CharSequence getTimeCharSequence(String timeZone) {
- mCalendar.setTimeZone(TimeZone.getTimeZone(timeZone));
- return DateFormat.format(mIs24HoursMode ? mPattern24 : mPattern12, mCalendar);
- }
-
- @Override
- public int getViewTypeCount() {
- return 2;
- }
-
- @Override
- public int getItemViewType(int position) {
- return (mDisplayedCitiesList.get(position).mCityId != null)
- ? VIEW_TYPE_CITY : VIEW_TYPE_HEADER;
- }
-
- private class CityViewHolder {
- TextView index;
- TextView name;
- TextView time;
- CheckBox selected;
- }
-
- public void set24HoursMode(Context c) {
- mIs24HoursMode = DateFormat.is24HourFormat(c);
- notifyDataSetChanged();
- }
-
- @Override
- public int getPositionForSection(int section) {
- return !isEmpty(mSectionPositions) ? mSectionPositions[section] : 0;
- }
-
-
- @Override
- public int getSectionForPosition(int p) {
- final Integer[] positions = mSectionPositions;
- if (!isEmpty(positions)) {
- for (int i = 0; i < positions.length - 1; i++) {
- if (p >= positions[i]
- && p < positions[i + 1]) {
- return i;
- }
- }
- if (p >= positions[positions.length - 1]) {
- return positions.length - 1;
- }
- }
- return 0;
- }
-
- @Override
- public Object[] getSections() {
- return mSectionHeaders;
- }
-
- @Override
- public Filter getFilter() {
- return mFilter;
- }
-
- private boolean isEmpty(Object[] array) {
- return array == null || array.length == 0;
- }
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setVolumeControlStream(AudioManager.STREAM_ALARM);
-
- mFactory = LayoutInflater.from(this);
- mPrefs = Utils.getDefaultSharedPreferences(this);
- mSortType = mPrefs.getInt(PREF_SORT, SORT_BY_NAME);
- mSelectedCitiesHeaderString = getString(R.string.selected_cities_label);
- if (savedInstanceState != null) {
- mQueryTextBuffer.append(savedInstanceState.getString(KEY_SEARCH_QUERY));
- mSearchMode = savedInstanceState.getBoolean(KEY_SEARCH_MODE);
- mPosition = savedInstanceState.getInt(KEY_LIST_POSITION);
- }
- updateLayout();
- }
-
- @Override
- public void onSaveInstanceState(Bundle bundle) {
- super.onSaveInstanceState(bundle);
- bundle.putString(KEY_SEARCH_QUERY, mQueryTextBuffer.toString());
- bundle.putBoolean(KEY_SEARCH_MODE, mSearchMode);
- bundle.putInt(KEY_LIST_POSITION, mCitiesList.getFirstVisiblePosition());
- }
-
- private void updateLayout() {
- setContentView(R.layout.cities_activity);
- mCitiesList = (ListView) findViewById(R.id.cities_list);
- setFastScroll(TextUtils.isEmpty(mQueryTextBuffer.toString().trim()));
- mCitiesList.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
- mUserSelectedCities = Cities.readCitiesFromSharedPrefs(
- Utils.getDefaultSharedPreferences(this));
- mAdapter = new CityAdapter(this, mFactory);
- mCitiesList.setAdapter(mAdapter);
- }
-
- private void setFastScroll(boolean enabled) {
- if (mCitiesList != null) {
- mCitiesList.setFastScrollAlwaysVisible(enabled);
- mCitiesList.setFastScrollEnabled(enabled);
- }
- }
-
- @Override
- public void onResume() {
- super.onResume();
- if (mAdapter != null) {
- mAdapter.set24HoursMode(this);
- }
- }
-
- @Override
- public void onPause() {
- super.onPause();
- Cities.saveCitiesToSharedPrefs(Utils.getDefaultSharedPreferences(this),
- mUserSelectedCities);
- Intent i = new Intent(Cities.WORLDCLOCK_UPDATE_INTENT);
- sendBroadcast(i);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case android.R.id.home:
- finish();
- return true;
- case R.id.menu_item_settings:
- startActivity(new Intent(this, SettingsActivity.class));
- return true;
- case R.id.menu_item_help:
- Intent i = item.getIntent();
- if (i != null) {
- try {
- startActivity(i);
- } catch (ActivityNotFoundException e) {
- // No activity found to match the intent - ignore
- }
- }
- return true;
- case R.id.menu_item_sort:
- if (mAdapter != null) {
- mAdapter.toggleSort();
- setFastScroll(TextUtils.isEmpty(mQueryTextBuffer.toString().trim()));
- }
- return true;
- default:
- break;
- }
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.cities_menu, menu);
- MenuItem help = menu.findItem(R.id.menu_item_help);
- if (help != null) {
- Utils.prepareHelpMenuItem(this, help);
- }
-
- MenuItem searchMenu = menu.findItem(R.id.menu_item_search);
- mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenu);
- mSearchView.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
- mSearchView.setOnSearchClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View arg0) {
- mSearchMode = true;
- }
- });
- mSearchView.setOnCloseListener(new SearchView.OnCloseListener() {
-
- @Override
- public boolean onClose() {
- mSearchMode = false;
- return false;
- }
- });
- if (mSearchView != null) {
- mSearchView.setOnQueryTextListener(this);
- mSearchView.setQuery(mQueryTextBuffer.toString(), false);
- if (mSearchMode) {
- mSearchView.requestFocus();
- mSearchView.setIconified(false);
- }
- }
- return super.onCreateOptionsMenu(menu);
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- MenuItem sortMenuItem = menu.findItem(R.id.menu_item_sort);
- if (mSortType == SORT_BY_NAME) {
- sortMenuItem.setTitle(getString(R.string.menu_item_sort_by_gmt_offset));
- } else {
- sortMenuItem.setTitle(getString(R.string.menu_item_sort_by_name));
- }
- return super.onPrepareOptionsMenu(menu);
- }
-
- @Override
- public void onCheckedChanged(CompoundButton b, boolean checked) {
- CityObj c = (CityObj) b.getTag();
- if (checked) {
- mUserSelectedCities.put(c.mCityId, c);
- } else {
- mUserSelectedCities.remove(c.mCityId);
- }
- }
-
- @Override
- public void onClick(View v) {
- CompoundButton b = (CompoundButton) v.findViewById(R.id.city_onoff);
- boolean checked = b.isChecked();
- onCheckedChanged(b, checked);
- b.setChecked(!checked);
- }
-
- @Override
- public boolean onQueryTextChange(String queryText) {
- mQueryTextBuffer.setLength(0);
- mQueryTextBuffer.append(queryText);
- mCitiesList.setFastScrollEnabled(TextUtils.isEmpty(mQueryTextBuffer.toString().trim()));
- mAdapter.getFilter().filter(queryText);
- return true;
- }
-
- @Override
- public boolean onQueryTextSubmit(String arg0) {
- return false;
- }
-}
diff --git a/src/com/android/deskclock/worldclock/CityGmtOffsetComparator.java b/src/com/android/deskclock/worldclock/CityGmtOffsetComparator.java
deleted file mode 100644
index e18cb63..0000000
--- a/src/com/android/deskclock/worldclock/CityGmtOffsetComparator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2013 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.worldclock;
-
-import java.util.Comparator;
-import java.util.TimeZone;
-
-public class CityGmtOffsetComparator implements Comparator<CityObj> {
-
- private CityNameComparator mNameComparator = null;
-
- @Override
- public int compare(CityObj c1, CityObj c2) {
- long currentTime = System.currentTimeMillis();
- int offset = TimeZone.getTimeZone(c1.mTimeZone).getOffset(currentTime);
- int offset2 = TimeZone.getTimeZone(c2.mTimeZone).getOffset(currentTime);
- return (offset < offset2) ? -1 : (offset > offset2) ? 1 :
- getCityNameComparator().compare(c1, c2);
- }
-
- private CityNameComparator getCityNameComparator() {
- if (mNameComparator == null) {
- mNameComparator = new CityNameComparator();
- }
- return mNameComparator;
- }
-}
diff --git a/src/com/android/deskclock/worldclock/CityNameComparator.java b/src/com/android/deskclock/worldclock/CityNameComparator.java
deleted file mode 100644
index 832f206..0000000
--- a/src/com/android/deskclock/worldclock/CityNameComparator.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2013 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.worldclock;
-
-import java.text.Collator;
-import java.util.Comparator;
-
-public class CityNameComparator implements Comparator<CityObj> {
-
- private Collator mCollator;
-
- public CityNameComparator() {
- mCollator = Collator.getInstance();
- }
-
- @Override
- public int compare(CityObj c1, CityObj c2) {
- return mCollator.compare(c1.mCityName, c2.mCityName);
- }
-}
diff --git a/src/com/android/deskclock/worldclock/CityObj.java b/src/com/android/deskclock/worldclock/CityObj.java
deleted file mode 100644
index 8893b90..0000000
--- a/src/com/android/deskclock/worldclock/CityObj.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2012 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.worldclock;
-
-import android.content.SharedPreferences;
-
-public class CityObj {
-
- private static final String CITY_NAME = "city_name_";
- private static final String CITY_TIME_ZONE = "city_tz_";
- private static final String CITY_ID = "city_id_";
- private static final String CITY_INDEX = "city_index_";
-
- public String mCityName;
- public String mTimeZone;
- public String mCityId;
- public String mCityIndex;
- public boolean isHeader;
-
- public CityObj(String name, String timezone, String id, String index) {
- mCityName = name;
- mTimeZone = timezone;
- mCityId = id;
- mCityIndex = index;
- }
-
- @Override
- public String toString() {
- return "CityObj{" +
- "name=" + mCityName +
- ", timezone=" + mTimeZone +
- ", id=" + mCityId +
- ", index=" + mCityIndex +
- '}';
- }
-
- public CityObj(SharedPreferences prefs, int index) {
- mCityName = prefs.getString(CITY_NAME + index, null);
- mTimeZone = prefs.getString(CITY_TIME_ZONE + index, null);
- mCityId = prefs.getString(CITY_ID + index, null);
- mCityIndex = prefs.getString(CITY_INDEX + index, null);
- }
-
- public void saveCityToSharedPrefs(SharedPreferences.Editor editor, int index) {
- editor.putString(CITY_NAME + index, mCityName);
- editor.putString(CITY_TIME_ZONE + index, mTimeZone);
- editor.putString(CITY_ID + index, mCityId);
- editor.putString(CITY_INDEX + index, mCityIndex);
- }
-}
diff --git a/src/com/android/deskclock/worldclock/CitySelectionActivity.java b/src/com/android/deskclock/worldclock/CitySelectionActivity.java
new file mode 100644
index 0000000..d38ac71
--- /dev/null
+++ b/src/com/android/deskclock/worldclock/CitySelectionActivity.java
@@ -0,0 +1,599 @@
+/*
+ * Copyright (C) 2015 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.worldclock;
+
+import android.content.Context;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.support.v7.widget.SearchView;
+import android.text.TextUtils;
+import android.text.format.DateFormat;
+import android.util.ArraySet;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.ListView;
+import android.widget.SectionIndexer;
+import android.widget.TextView;
+
+import com.android.deskclock.BaseActivity;
+import com.android.deskclock.R;
+import com.android.deskclock.Utils;
+import com.android.deskclock.actionbarmenu.AbstractMenuItemController;
+import com.android.deskclock.actionbarmenu.ActionBarMenuManager;
+import com.android.deskclock.actionbarmenu.MenuItemControllerFactory;
+import com.android.deskclock.actionbarmenu.NavUpMenuItemController;
+import com.android.deskclock.actionbarmenu.SearchMenuItemController;
+import com.android.deskclock.actionbarmenu.SettingMenuItemController;
+import com.android.deskclock.data.City;
+import com.android.deskclock.data.DataModel;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.TimeZone;
+
+/**
+ * This activity allows the user to alter the cities selected for display.
+ *
+ * Note, it is possible for two instances of this Activity to exist simultaneously:
+ *
+ * <ul>
+ * <li>Clock Tab-> Tap Floating Action Button</li>
+ * <li>Digital Widget -> Tap any city clock</li>
+ * </ul>
+ *
+ * As a result, {@link #onResume()} conservatively refreshes itself from the backing
+ * {@link DataModel} which may have changed since this activity was last displayed.
+ */
+public final class CitySelectionActivity extends BaseActivity {
+
+ /** The list of all selected and unselected cities, indexed and possibly filtered. */
+ private ListView mCitiesList;
+
+ /** The adapter that presents all of the selected and unselected cities. */
+ private CityAdapter mCitiesAdapter;
+
+ /** Manages all action bar menu display and click handling. */
+ private final ActionBarMenuManager mActionBarMenuManager = new ActionBarMenuManager(this);
+
+ /** Menu item controller for search view. */
+ private SearchMenuItemController mSearchMenuItemController;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setVolumeControlStream(AudioManager.STREAM_ALARM);
+
+ setContentView(R.layout.cities_activity);
+ mSearchMenuItemController =
+ new SearchMenuItemController(new SearchView.OnQueryTextListener() {
+ @Override
+ public boolean onQueryTextSubmit(String query) {
+ return false;
+ }
+
+ @Override
+ public boolean onQueryTextChange(String query) {
+ mCitiesAdapter.filter(query);
+ updateFastScrolling();
+ return true;
+ }
+ }, savedInstanceState);
+ mCitiesAdapter = new CityAdapter(this, mSearchMenuItemController);
+ mActionBarMenuManager.addMenuItemController(new NavUpMenuItemController(this))
+ .addMenuItemController(mSearchMenuItemController)
+ .addMenuItemController(new SortOrderMenuItemController())
+ .addMenuItemController(new SettingMenuItemController(this))
+ .addMenuItemController(MenuItemControllerFactory.getInstance()
+ .buildMenuItemControllers(this));
+ mCitiesList = (ListView) findViewById(R.id.cities_list);
+ mCitiesList.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
+ mCitiesList.setAdapter(mCitiesAdapter);
+
+ updateFastScrolling();
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle bundle) {
+ super.onSaveInstanceState(bundle);
+ mSearchMenuItemController.saveInstance(bundle);
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ // Recompute the contents of the adapter before displaying on screen.
+ mCitiesAdapter.refresh();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+
+ // Save the selected cities.
+ DataModel.getDataModel().setSelectedCities(mCitiesAdapter.getSelectedCities());
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ mActionBarMenuManager.createOptionsMenu(menu, getMenuInflater());
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ mActionBarMenuManager.prepareShowMenu(menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (mActionBarMenuManager.handleMenuItemClick(item)) {
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * Fast scrolling is only enabled while no filtering is happening.
+ */
+ private void updateFastScrolling() {
+ final boolean enabled = !mCitiesAdapter.isFiltering();
+ mCitiesList.setFastScrollAlwaysVisible(enabled);
+ mCitiesList.setFastScrollEnabled(enabled);
+ }
+
+ /**
+ * This adapter presents data in 2 possible modes. If selected cities exist the format is:
+ *
+ * <pre>
+ * Selected Cities
+ * City 1 (alphabetically first)
+ * City 2 (alphabetically second)
+ * ...
+ * A City A1 (alphabetically first starting with A)
+ * City A2 (alphabetically second starting with A)
+ * ...
+ * B City B1 (alphabetically first starting with B)
+ * City B2 (alphabetically second starting with B)
+ * ...
+ * </pre>
+ *
+ * If selected cities do not exist, that section is removed and all that remains is:
+ *
+ * <pre>
+ * A City A1 (alphabetically first starting with A)
+ * City A2 (alphabetically second starting with A)
+ * ...
+ * B City B1 (alphabetically first starting with B)
+ * City B2 (alphabetically second starting with B)
+ * ...
+ * </pre>
+ */
+ private static final class CityAdapter extends BaseAdapter implements View.OnClickListener,
+ CompoundButton.OnCheckedChangeListener, SectionIndexer {
+
+ /** The type of the single optional "Selected Cities" header entry. */
+ private static final int VIEW_TYPE_SELECTED_CITIES_HEADER = 0;
+
+ /** The type of each city entry. */
+ private static final int VIEW_TYPE_CITY = 1;
+
+ private final Context mContext;
+
+ private final LayoutInflater mInflater;
+
+ /** The 12-hour time pattern for the current locale. */
+ private final String mPattern12;
+
+ /** The 24-hour time pattern for the current locale. */
+ private final String mPattern24;
+
+ /** {@code true} time should honor {@link #mPattern24}; {@link #mPattern12} otherwise. */
+ private boolean mIs24HoursMode;
+
+ /** A calendar used to format time in a particular timezone. */
+ private final Calendar mCalendar;
+
+ /** The list of cities which may be filtered by a search term. */
+ private List<City> mFilteredCities = Collections.emptyList();
+
+ /** A mutable set of cities currently selected by the user. */
+ private final Set<City> mUserSelectedCities = new ArraySet<>();
+
+ /** The number of user selections at the top of the adapter to avoid indexing. */
+ private int mOriginalUserSelectionCount;
+
+ /** The precomputed section headers. */
+ private String[] mSectionHeaders;
+
+ /** The corresponding location of each precomputed section header. */
+ private Integer[] mSectionHeaderPositions;
+
+ /** Menu item controller for search. Search query is maintained here. */
+ private final SearchMenuItemController mSearchMenuItemController;
+
+ public CityAdapter(Context context, SearchMenuItemController searchMenuItemController) {
+ mContext = context;
+ mSearchMenuItemController = searchMenuItemController;
+ mInflater = LayoutInflater.from(context);
+
+ mCalendar = Calendar.getInstance();
+ mCalendar.setTimeInMillis(System.currentTimeMillis());
+
+ final Locale locale = Locale.getDefault();
+ mPattern24 = DateFormat.getBestDateTimePattern(locale, "Hm");
+
+ String pattern12 = DateFormat.getBestDateTimePattern(locale, "hma");
+ if (TextUtils.getLayoutDirectionFromLocale(locale) == View.LAYOUT_DIRECTION_RTL) {
+ // There's an RTL layout bug that causes jank when fast-scrolling through
+ // the list in 12-hour mode in an RTL locale. We can work around this by
+ // ensuring the strings are the same length by using "hh" instead of "h".
+ pattern12 = pattern12.replaceAll("h", "hh");
+ }
+ mPattern12 = pattern12;
+ }
+
+ @Override
+ public int getCount() {
+ final int headerCount = hasHeader() ? 1 : 0;
+ return headerCount + mFilteredCities.size();
+ }
+
+ @Override
+ public City getItem(int position) {
+ if (hasHeader()) {
+ final int itemViewType = getItemViewType(position);
+ switch (itemViewType) {
+ case VIEW_TYPE_SELECTED_CITIES_HEADER:
+ return null;
+ case VIEW_TYPE_CITY:
+ return mFilteredCities.get(position - 1);
+ }
+ throw new IllegalStateException("unexpected item view type: " + itemViewType);
+ }
+
+ return mFilteredCities.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public synchronized View getView(int position, View view, ViewGroup parent) {
+ final int itemViewType = getItemViewType(position);
+ switch (itemViewType) {
+ case VIEW_TYPE_SELECTED_CITIES_HEADER:
+ if (view == null) {
+ view = mInflater.inflate(R.layout.city_list_header, parent, false);
+ }
+ return view;
+
+ case VIEW_TYPE_CITY:
+ final City city = getItem(position);
+ final TimeZone timeZone = city.getTimeZone();
+
+ // Inflate a new view if necessary.
+ if (view == null) {
+ view = mInflater.inflate(R.layout.city_list_item, parent, false);
+ final TextView index = (TextView) view.findViewById(R.id.index);
+ final TextView name = (TextView) view.findViewById(R.id.city_name);
+ final TextView time = (TextView) view.findViewById(R.id.city_time);
+ final CheckBox selected = (CheckBox) view.findViewById(R.id.city_onoff);
+ view.setTag(new CityItemHolder(index, name, time, selected));
+ }
+
+ // Bind data into the child views.
+ final CityItemHolder holder = (CityItemHolder) view.getTag();
+ holder.selected.setTag(city);
+ holder.selected.setChecked(mUserSelectedCities.contains(city));
+ holder.selected.setContentDescription(city.getName());
+ holder.selected.setOnCheckedChangeListener(this);
+ holder.name.setText(city.getName(), TextView.BufferType.SPANNABLE);
+ holder.time.setText(getTimeCharSequence(timeZone));
+
+ final boolean showIndex = getShowIndex(position);
+ holder.index.setVisibility(showIndex ? View.VISIBLE : View.INVISIBLE);
+ if (showIndex) {
+ switch (getCitySort()) {
+ case NAME:
+ holder.index.setText(city.getIndexString());
+ holder.index.setTextSize(TypedValue.COMPLEX_UNIT_SP, 24);
+ break;
+
+ case UTC_OFFSET:
+ holder.index.setText(Utils.getGMTHourOffset(timeZone, false));
+ holder.index.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
+ break;
+ }
+ }
+
+ // skip checkbox and other animations
+ view.jumpDrawablesToCurrentState();
+ view.setOnClickListener(this);
+ return view;
+ }
+
+ throw new IllegalStateException("unexpected item view type: " + itemViewType);
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return 2;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return hasHeader() && position == 0 ? VIEW_TYPE_SELECTED_CITIES_HEADER : VIEW_TYPE_CITY;
+ }
+
+ @Override
+ public void onCheckedChanged(CompoundButton b, boolean checked) {
+ final City city = (City) b.getTag();
+ if (checked) {
+ mUserSelectedCities.add(city);
+ b.announceForAccessibility(mContext.getString(R.string.city_checked,
+ city.getName()));
+ } else {
+ mUserSelectedCities.remove(city);
+ b.announceForAccessibility(mContext.getString(R.string.city_unchecked,
+ city.getName()));
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ final CheckBox b = (CheckBox) v.findViewById(R.id.city_onoff);
+ b.setChecked(!b.isChecked());
+ }
+
+ @Override
+ public Object[] getSections() {
+ if (mSectionHeaders == null) {
+ // Make an educated guess at the expected number of sections.
+ final int approximateSectionCount = getCount() / 5;
+ final List<String> sections = new ArrayList<>(approximateSectionCount);
+ final List<Integer> positions = new ArrayList<>(approximateSectionCount);
+
+ // Add a section for the "Selected Cities" header if it exists.
+ if (hasHeader()) {
+ sections.add("+");
+ positions.add(0);
+ }
+
+ for (int position = 0; position < getCount(); position++) {
+ // Add a section if this position should show the section index.
+ if (getShowIndex(position)) {
+ final City city = getItem(position);
+ switch (getCitySort()) {
+ case NAME:
+ sections.add(city.getIndexString());
+ break;
+ case UTC_OFFSET:
+ final TimeZone timezone = city.getTimeZone();
+ sections.add(Utils.getGMTHourOffset(timezone, Utils.isPreL()));
+ break;
+ }
+ positions.add(position);
+ }
+ }
+
+ mSectionHeaders = sections.toArray(new String[sections.size()]);
+ mSectionHeaderPositions = positions.toArray(new Integer[positions.size()]);
+ }
+ return mSectionHeaders;
+ }
+
+ @Override
+ public int getPositionForSection(int sectionIndex) {
+ return getSections().length == 0 ? 0 : mSectionHeaderPositions[sectionIndex];
+ }
+
+ @Override
+ public int getSectionForPosition(int position) {
+ if (getSections().length == 0) {
+ return 0;
+ }
+
+ for (int i = 0; i < mSectionHeaderPositions.length - 2; i++) {
+ if (position < mSectionHeaderPositions[i]) continue;
+ if (position >= mSectionHeaderPositions[i + 1]) continue;
+
+ return i;
+ }
+
+ return mSectionHeaderPositions.length - 1;
+ }
+
+ /**
+ * Clear the section headers to force them to be recomputed if they are now stale.
+ */
+ private void clearSectionHeaders() {
+ mSectionHeaders = null;
+ mSectionHeaderPositions = null;
+ }
+
+ /**
+ * Rebuilds all internal data structures from scratch.
+ */
+ private void refresh() {
+ // Update the 12/24 hour mode.
+ mIs24HoursMode = DateFormat.is24HourFormat(mContext);
+
+ // Refresh the user selections.
+ final List<City> selected = DataModel.getDataModel().getSelectedCities();
+ mUserSelectedCities.clear();
+ mUserSelectedCities.addAll(selected);
+ mOriginalUserSelectionCount = selected.size();
+
+ // Recompute section headers.
+ clearSectionHeaders();
+
+ // Recompute filtered cities.
+ filter(mSearchMenuItemController.getQueryText());
+ }
+
+ /**
+ * Filter the cities using the given {@code queryText}.
+ */
+ private void filter(String queryText) {
+ mSearchMenuItemController.setQueryText(queryText);
+ final String query = queryText.trim().toUpperCase();
+
+ // Compute the filtered list of cities.
+ final List<City> filteredCities;
+ if (TextUtils.isEmpty(query)) {
+ filteredCities = DataModel.getDataModel().getAllCities();
+ } else {
+ final List<City> unselected = DataModel.getDataModel().getUnselectedCities();
+ filteredCities = new ArrayList<>(unselected.size());
+ for (City city : unselected) {
+ if (city.getNameUpperCase().startsWith(query)) {
+ filteredCities.add(city);
+ }
+ }
+ }
+
+ // Swap in the filtered list of cities and notify of the data change.
+ mFilteredCities = filteredCities;
+ notifyDataSetChanged();
+ }
+
+ private boolean isFiltering() {
+ return !TextUtils.isEmpty(mSearchMenuItemController.getQueryText().trim());
+ }
+
+ private Collection<City> getSelectedCities() { return mUserSelectedCities; }
+ private boolean hasHeader() { return !isFiltering() && mOriginalUserSelectionCount > 0; }
+
+ private DataModel.CitySort getCitySort() {
+ return DataModel.getDataModel().getCitySort();
+ }
+
+ private Comparator<City> getCitySortComparator() {
+ return DataModel.getDataModel().getCityIndexComparator();
+ }
+
+ private CharSequence getTimeCharSequence(TimeZone timeZone) {
+ mCalendar.setTimeZone(timeZone);
+ return DateFormat.format(mIs24HoursMode ? mPattern24 : mPattern12, mCalendar);
+ }
+
+ private boolean getShowIndex(int position) {
+ // Indexes are never displayed on filtered cities.
+ if (isFiltering()) {
+ return false;
+ }
+
+ if (hasHeader()) {
+ // None of the original user selections should show their index.
+ if (position <= mOriginalUserSelectionCount) {
+ return false;
+ }
+
+ // The first item after the original user selections must always show its index.
+ if (position == mOriginalUserSelectionCount + 1) {
+ return true;
+ }
+ } else {
+ // None of the original user selections should show their index.
+ if (position < mOriginalUserSelectionCount) {
+ return false;
+ }
+
+ // The first item after the original user selections must always show its index.
+ if (position == mOriginalUserSelectionCount) {
+ return true;
+ }
+ }
+
+ // Otherwise compare the city with its predecessor to test if it is a header.
+ final City priorCity = getItem(position - 1);
+ final City city = getItem(position);
+ return getCitySortComparator().compare(priorCity, city) != 0;
+ }
+
+ /**
+ * Cache the child views of each city item view.
+ */
+ private static final class CityItemHolder {
+
+ private final TextView index;
+ private final TextView name;
+ private final TextView time;
+ private final CheckBox selected;
+
+ public CityItemHolder(TextView index, TextView name, TextView time, CheckBox selected) {
+ this.index = index;
+ this.name = name;
+ this.time = time;
+ this.selected = selected;
+ }
+ }
+ }
+
+ private final class SortOrderMenuItemController extends AbstractMenuItemController {
+
+ private static final int SORT_MENU_RES_ID = R.id.menu_item_sort;
+
+ @Override
+ public int getId() {
+ return SORT_MENU_RES_ID;
+ }
+
+ @Override
+ public void showMenuItem(Menu menu) {
+ final MenuItem sortMenuItem = menu.findItem(SORT_MENU_RES_ID);
+ final String title;
+ if (DataModel.getDataModel().getCitySort() == DataModel.CitySort.NAME) {
+ title = getString(R.string.menu_item_sort_by_gmt_offset);
+ } else {
+ title = getString(R.string.menu_item_sort_by_name);
+ }
+ sortMenuItem.setTitle(title);
+ sortMenuItem.setVisible(true);
+ }
+
+ @Override
+ public boolean handleMenuItemClick(MenuItem item) {
+ // Save the new sort order.
+ DataModel.getDataModel().toggleCitySort();
+
+ // Section headers are influenced by sort order and must be cleared.
+ mCitiesAdapter.clearSectionHeaders();
+
+ // Honor the new sort order in the adapter.
+ mCitiesAdapter.filter(mSearchMenuItemController.getQueryText());
+ return true;
+ }
+ }
+}
diff --git a/src/com/android/deskclock/worldclock/WorldClockAdapter.java b/src/com/android/deskclock/worldclock/WorldClockAdapter.java
deleted file mode 100644
index 01da740..0000000
--- a/src/com/android/deskclock/worldclock/WorldClockAdapter.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (C) 2012 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.worldclock;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.TextClock;
-import android.widget.TextView;
-
-import com.android.deskclock.AnalogClock;
-import com.android.deskclock.R;
-import com.android.deskclock.SettingsActivity;
-import com.android.deskclock.Utils;
-
-import java.text.Collator;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.TimeZone;
-
-public class WorldClockAdapter extends BaseAdapter {
- protected Object [] mCitiesList;
- private final LayoutInflater mInflater;
- private final Context mContext;
- private String mClockStyle;
- private final Collator mCollator = Collator.getInstance();
- protected HashMap<String, CityObj> mCitiesDb = new HashMap<String, CityObj>();
- protected int mClocksPerRow;
-
- public WorldClockAdapter(Context context) {
- super();
- mContext = context;
- loadData(context);
- loadCitiesDb(context);
- mInflater = LayoutInflater.from(context);
- mClocksPerRow = context.getResources().getInteger(R.integer.world_clocks_per_row);
- }
-
- public void reloadData(Context context) {
- loadData(context);
- notifyDataSetChanged();
- }
-
- public void loadData(Context context) {
- SharedPreferences prefs = Utils.getDefaultSharedPreferences(mContext);
- mClockStyle = prefs.getString(SettingsActivity.KEY_CLOCK_STYLE,
- mContext.getResources().getString(R.string.default_clock_style));
- mCitiesList = Cities.readCitiesFromSharedPrefs(prefs).values().toArray();
- sortList();
- mCitiesList = addHomeCity();
- }
-
- public void loadCitiesDb(Context context) {
- mCitiesDb.clear();
- // Read the cities DB so that the names and timezones will be taken from the DB
- // and not from the selected list so that change of locale or changes in the DB will
- // be reflected.
- CityObj[] cities = Utils.loadCitiesFromXml(context);
- if (cities != null) {
- for (int i = 0; i < cities.length; i ++) {
- mCitiesDb.put(cities[i].mCityId, cities [i]);
- }
- }
- }
-
- /***
- * Adds the home city as the first item of the adapter if the feature is on and the device time
- * zone is different from the home time zone that was set by the user.
- * return the list of cities.
- */
- private Object[] addHomeCity() {
- if (needHomeCity()) {
- SharedPreferences sharedPref = Utils.getDefaultSharedPreferences(mContext);
- String homeTZ = sharedPref.getString(SettingsActivity.KEY_HOME_TZ, "");
- CityObj c = new CityObj(
- mContext.getResources().getString(R.string.home_label), homeTZ, null, null);
- Object[] temp = new Object[mCitiesList.length + 1];
- temp[0] = c;
- for (int i = 0; i < mCitiesList.length; i++) {
- temp[i + 1] = mCitiesList[i];
- }
- return temp;
- } else {
- return mCitiesList;
- }
- }
-
- public void updateHomeLabel(Context context) {
- // Update the "home" label if the home time zone clock is shown
- if (needHomeCity() && mCitiesList.length > 0) {
- ((CityObj) mCitiesList[0]).mCityName =
- context.getResources().getString(R.string.home_label);
- }
- }
-
- public boolean needHomeCity() {
- SharedPreferences sharedPref = Utils.getDefaultSharedPreferences(mContext);
- if (sharedPref.getBoolean(SettingsActivity.KEY_AUTO_HOME_CLOCK, false)) {
- String homeTZ = sharedPref.getString(
- SettingsActivity.KEY_HOME_TZ, TimeZone.getDefault().getID());
- final Date now = new Date();
- return TimeZone.getTimeZone(homeTZ).getOffset(now.getTime())
- != TimeZone.getDefault().getOffset(now.getTime());
- } else {
- return false;
- }
- }
-
- public boolean hasHomeCity() {
- return (mCitiesList != null) && mCitiesList.length > 0
- && ((CityObj) mCitiesList[0]).mCityId == null;
- }
-
- private void sortList() {
- final Date now = new Date();
-
- // Sort by the Offset from GMT taking DST into account
- // and if the same sort by City Name
- Arrays.sort(mCitiesList, new Comparator<Object>() {
- private int safeCityNameCompare(CityObj city1, CityObj city2) {
- if (city1.mCityName == null && city2.mCityName == null) {
- return 0;
- } else if (city1.mCityName == null) {
- return -1;
- } else if (city2.mCityName == null) {
- return 1;
- } else {
- return mCollator.compare(city1.mCityName, city2.mCityName);
- }
- }
-
- @Override
- public int compare(Object object1, Object object2) {
- CityObj city1 = (CityObj) object1;
- CityObj city2 = (CityObj) object2;
- if (city1.mTimeZone == null && city2.mTimeZone == null) {
- return safeCityNameCompare(city1, city2);
- } else if (city1.mTimeZone == null) {
- return -1;
- } else if (city2.mTimeZone == null) {
- return 1;
- }
-
- int gmOffset1 = TimeZone.getTimeZone(city1.mTimeZone).getOffset(now.getTime());
- int gmOffset2 = TimeZone.getTimeZone(city2.mTimeZone).getOffset(now.getTime());
- if (gmOffset1 == gmOffset2) {
- return safeCityNameCompare(city1, city2);
- } else {
- return gmOffset1 - gmOffset2;
- }
- }
- });
- }
-
- @Override
- public int getCount() {
- if (mClocksPerRow == 1) {
- // In the special case where we have only 1 clock per view.
- return mCitiesList.length;
- }
-
- // Otherwise, each item in the list holds 1 or 2 clocks
- return (mCitiesList.length + 1)/2;
- }
-
- @Override
- public Object getItem(int p) {
- return null;
- }
-
- @Override
- public long getItemId(int p) {
- return p;
- }
-
- @Override
- public boolean isEnabled(int p) {
- return false;
- }
-
- @Override
- public View getView(int position, View view, ViewGroup parent) {
- // Index in cities list
- int index = position * mClocksPerRow;
- if (index < 0 || index >= mCitiesList.length) {
- return null;
- }
-
- if (view == null) {
- view = mInflater.inflate(R.layout.world_clock_list_item, parent, false);
- }
- updateView(view.findViewById(R.id.city_left), (CityObj)mCitiesList[index]);
- return view;
- }
-
- private void updateView(View clock, CityObj cityObj) {
- TextView name = (TextView)(clock.findViewById(R.id.city_name));
- TextView dayOfWeek = (TextView)(clock.findViewById(R.id.city_day));
- TextClock dclock = (TextClock)(clock.findViewById(R.id.digital_clock));
- AnalogClock aclock = (AnalogClock)(clock.findViewById(R.id.analog_clock));
-
- if (mClockStyle.equals("analog")) {
- dclock.setVisibility(View.GONE);
- aclock.setVisibility(View.VISIBLE);
- aclock.setTimeZone(cityObj.mTimeZone);
- aclock.enableSeconds(false);
- } else {
- dclock.setVisibility(View.VISIBLE);
- aclock.setVisibility(View.GONE);
- dclock.setTimeZone(cityObj.mTimeZone);
- Utils.setTimeFormat(mContext, dclock,
- mContext.getResources().getDimensionPixelSize(R.dimen.label_font_size));
- }
- CityObj cityInDb = mCitiesDb.get(cityObj.mCityId);
- // Home city or city not in DB , use data from the save selected cities list
- name.setText(Utils.getCityName(cityObj, cityInDb));
-
- final Calendar now = Calendar.getInstance();
- now.setTimeZone(TimeZone.getDefault());
- int myDayOfWeek = now.get(Calendar.DAY_OF_WEEK);
- // Get timezone from cities DB if available
- String cityTZ = (cityInDb != null) ? cityInDb.mTimeZone : cityObj.mTimeZone;
- now.setTimeZone(TimeZone.getTimeZone(cityTZ));
- int cityDayOfWeek = now.get(Calendar.DAY_OF_WEEK);
- if (myDayOfWeek != cityDayOfWeek) {
- dayOfWeek.setText(mContext.getString(R.string.world_day_of_week_label,
- now.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, Locale.getDefault())));
- dayOfWeek.setVisibility(View.VISIBLE);
- } else {
- dayOfWeek.setVisibility(View.GONE);
- }
- }
-}