summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml4
-rw-r--r--res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_1080p.pngbin0 -> 561 bytes
-rw-r--r--res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_480p.pngbin0 -> 659 bytes
-rw-r--r--res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_720p.pngbin0 -> 553 bytes
-rw-r--r--res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_high.pngbin0 -> 422 bytes
-rw-r--r--res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_low.pngbin0 -> 518 bytes
-rw-r--r--res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_1080p.pngbin0 -> 871 bytes
-rw-r--r--res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_480p.pngbin0 -> 981 bytes
-rw-r--r--res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_720p.pngbin0 -> 972 bytes
-rw-r--r--res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_high.pngbin0 -> 808 bytes
-rw-r--r--res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_low.pngbin0 -> 736 bytes
-rw-r--r--res/layout-xlarge/attach_camera_control.xml80
-rw-r--r--res/layout-xlarge/camera_control.xml75
-rw-r--r--res/layout/camera.xml1
-rw-r--r--res/layout/thumbnail_item.xml21
-rw-r--r--res/layout/video_camera.xml3
-rw-r--r--res/values-cs/strings.xml22
-rw-r--r--res/values-da/strings.xml22
-rw-r--r--res/values-de/strings.xml22
-rw-r--r--res/values-el/strings.xml22
-rw-r--r--res/values-es-rUS/strings.xml22
-rw-r--r--res/values-es/strings.xml22
-rw-r--r--res/values-fr/strings.xml22
-rw-r--r--res/values-it/strings.xml22
-rw-r--r--res/values-ja/strings.xml22
-rw-r--r--res/values-ko/strings.xml22
-rw-r--r--res/values-nb/strings.xml22
-rw-r--r--res/values-nl/strings.xml22
-rw-r--r--res/values-pl/strings.xml22
-rw-r--r--res/values-pt-rPT/strings.xml22
-rw-r--r--res/values-pt/strings.xml22
-rw-r--r--res/values-ru/strings.xml22
-rw-r--r--res/values-sv/strings.xml22
-rw-r--r--res/values-tr/strings.xml22
-rw-r--r--res/values-zh-rCN/strings.xml22
-rw-r--r--res/values-zh-rTW/strings.xml22
-rw-r--r--res/values/arrays.xml52
-rw-r--r--res/values/strings.xml38
-rw-r--r--res/values/styles.xml3
-rw-r--r--res/xml/video_preferences.xml13
-rw-r--r--src/com/android/camera/Camera.java249
-rw-r--r--src/com/android/camera/CameraSettings.java21
-rw-r--r--src/com/android/camera/IconListPreference.java11
-rw-r--r--src/com/android/camera/MenuHelper.java1
-rw-r--r--src/com/android/camera/RotateImageView.java147
-rw-r--r--src/com/android/camera/ThumbnailAdapter.java77
-rw-r--r--src/com/android/camera/ThumbnailController.java195
-rw-r--r--src/com/android/camera/Util.java56
-rw-r--r--src/com/android/camera/VideoCamera.java413
-rw-r--r--src/com/android/camera/ui/BasicIndicator.java50
-rw-r--r--src/com/android/camera/ui/CamcorderHeadUpDisplay.java14
-rw-r--r--src/com/android/camera/ui/GLListView.java27
-rw-r--r--src/com/android/camera/ui/GLRootView.java10
-rw-r--r--src/com/android/camera/ui/GLView.java24
-rw-r--r--src/com/android/camera/ui/GpsIndicator.java2
-rw-r--r--src/com/android/camera/ui/HeadUpDisplay.java17
-rw-r--r--src/com/android/camera/ui/PopupWindow.java5
-rw-r--r--src/com/android/camera/ui/RotatePane.java8
58 files changed, 1357 insertions, 700 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 9cdd779..14bf99e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -27,7 +27,7 @@
</receiver>
<activity android:name="com.android.camera.Camera"
android:configChanges="orientation|keyboardHidden"
- android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
+ android:theme="@style/ThemeCamera"
android:screenOrientation="landscape"
android:clearTaskOnLaunch="true"
android:taskAffinity="android.task.camera">
@@ -49,7 +49,7 @@
android:label="@string/video_camera_label"
android:configChanges="orientation|keyboardHidden"
android:icon="@drawable/ic_launcher_video_camera"
- android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
+ android:theme="@style/ThemeCamera"
android:screenOrientation="landscape"
android:clearTaskOnLaunch="true"
android:taskAffinity="android.task.camcorder">
diff --git a/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_1080p.png b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_1080p.png
new file mode 100644
index 0000000..d2a39e4
--- /dev/null
+++ b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_1080p.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_480p.png b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_480p.png
new file mode 100644
index 0000000..398a4b9
--- /dev/null
+++ b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_480p.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_720p.png b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_720p.png
new file mode 100644
index 0000000..5567eb0
--- /dev/null
+++ b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_720p.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_high.png b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_high.png
new file mode 100644
index 0000000..ce0cf42
--- /dev/null
+++ b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_high.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_low.png b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_low.png
new file mode 100644
index 0000000..cb66c52
--- /dev/null
+++ b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_low.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_1080p.png b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_1080p.png
new file mode 100644
index 0000000..199e0ef
--- /dev/null
+++ b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_1080p.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_480p.png b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_480p.png
new file mode 100644
index 0000000..e0b4974
--- /dev/null
+++ b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_480p.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_720p.png b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_720p.png
new file mode 100644
index 0000000..1104ce5
--- /dev/null
+++ b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_720p.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_high.png b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_high.png
new file mode 100644
index 0000000..8b99109
--- /dev/null
+++ b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_high.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_low.png b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_low.png
new file mode 100644
index 0000000..36e2c1a
--- /dev/null
+++ b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_low.png
Binary files differ
diff --git a/res/layout-xlarge/attach_camera_control.xml b/res/layout-xlarge/attach_camera_control.xml
new file mode 100644
index 0000000..0eab2e6
--- /dev/null
+++ b/res/layout-xlarge/attach_camera_control.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:camera="http://schemas.android.com/apk/res/com.android.camera"
+ android:id="@+id/control_bar"
+ android:layout_height="match_parent"
+ android:layout_width="90dp"
+ android:layout_marginTop="20dp"
+ android:layout_marginBottom="20dp"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:layout_alignParentRight="true">
+ <LinearLayout android:orientation="vertical"
+ android:gravity="top|center_horizontal"
+ android:layout_alignParentTop="true"
+ android:layout_centerHorizontal="true"
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent">
+ <LinearLayout style="@style/ReviewControlGroup"
+ android:layout_marginBottom="15dp">
+ <ImageView style="@style/ReviewControlIcon"
+ android:id="@+id/btn_cancel"
+ android:src="@drawable/btn_ic_review_cancel"/>
+ <TextView style="@style/ReviewControlText"
+ android:text="@string/review_cancel" />
+ </LinearLayout>
+ <LinearLayout style="@style/ReviewControlGroup"
+ android:visibility="gone"
+ android:layout_marginBottom="15dp">
+ <ImageView style="@style/ReviewControlIcon"
+ android:id="@+id/btn_retake"
+ android:src="@drawable/btn_ic_review_retake_photo"/>
+ <TextView style="@style/ReviewControlText"
+ android:text="@string/review_retake" />
+ </LinearLayout>
+ <LinearLayout style="@style/ReviewControlGroup"
+ android:visibility="gone"
+ android:layout_marginBottom="15dp">
+ <ImageView style="@style/ReviewControlIcon"
+ android:id="@+id/btn_play"
+ android:src="@drawable/btn_ic_review_play"/>
+ <TextView style="@style/ReviewControlText"
+ android:text="@string/review_play" />
+ </LinearLayout>
+ </LinearLayout>
+ <com.android.camera.ShutterButton android:id="@+id/shutter_button"
+ android:layout_centerInParent="true"
+ android:layout_centerHorizontal="true"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:scaleType="center"
+ android:clickable="true"
+ android:focusable="true"
+ android:src="@drawable/btn_ic_camera_shutter"
+ android:background="@drawable/btn_shutter"/>
+ <LinearLayout style="@style/ReviewControlGroup"
+ android:visibility="invisible"
+ android:layout_alignParentBottom="true"
+ android:layout_centerHorizontal="true">
+ <ImageView style="@style/ReviewControlIcon"
+ android:id="@+id/btn_done"
+ android:src="@drawable/btn_ic_review_done"/>
+ <TextView style="@style/ReviewControlText"
+ android:text="@string/review_ok" />
+ </LinearLayout>
+</RelativeLayout>
diff --git a/res/layout-xlarge/camera_control.xml b/res/layout-xlarge/camera_control.xml
new file mode 100644
index 0000000..497da74
--- /dev/null
+++ b/res/layout-xlarge/camera_control.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/control_bar"
+ android:layout_height="match_parent"
+ android:layout_width="190dp"
+ android:layout_marginTop="20dp"
+ android:layout_marginBottom="20dp"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:layout_alignParentRight="true">
+
+ <ListView android:id="@+id/image_list"
+ android:layout_width="93dp"
+ android:layout_height="match_parent"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentBottom="true"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:dividerHeight="10dp"
+ android:orientation="vertical"
+ android:gravity="center">
+ </ListView>
+
+ <com.android.camera.ShutterButton android:id="@+id/shutter_button"
+ android:layout_centerInParent="true"
+ android:layout_alignParentRight="true"
+ android:layout_toRightOf="@id/image_list"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:scaleType="center"
+ android:clickable="true"
+ android:focusable="true"
+ android:src="@drawable/btn_ic_camera_shutter"
+ android:background="@drawable/btn_shutter"/>
+
+ <LinearLayout android:id="@+id/camera_switch_set"
+ android:orientation="vertical"
+ android:gravity="center"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentRight="true"
+ android:layout_toRightOf="@id/image_list"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content">
+ <com.android.camera.RotateImageView android:id="@+id/video_switch_icon"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:src="@drawable/btn_ic_mode_switch_video"/>
+ <com.android.camera.Switcher android:id="@+id/camera_switch"
+ android:layout_width="wrap_content"
+ android:layout_height="70dp"
+ android:src="@drawable/btn_mode_switch_knob"
+ android:background="@drawable/btn_mode_switch_bg" />
+ <com.android.camera.RotateImageView
+ android:id="@+id/camera_switch_icon"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:src="@drawable/btn_ic_mode_switch_camera"/>
+ </LinearLayout>
+</RelativeLayout>
+
diff --git a/res/layout/camera.xml b/res/layout/camera.xml
index 772106b..182084a 100644
--- a/res/layout/camera.xml
+++ b/res/layout/camera.xml
@@ -16,7 +16,6 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:camera="http://schemas.android.com/apk/res/com.android.camera"
- android:background="@drawable/camera_background"
android:id="@+id/camera"
android:orientation="horizontal"
android:layout_width="match_parent"
diff --git a/res/layout/thumbnail_item.xml b/res/layout/thumbnail_item.xml
new file mode 100644
index 0000000..7f6522c
--- /dev/null
+++ b/res/layout/thumbnail_item.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<com.android.camera.RotateImageView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentRight="true"
+ android:layout_height="90dp"
+ android:layout_width="90dp"
+ android:background="@drawable/border_last_picture"/>
diff --git a/res/layout/video_camera.xml b/res/layout/video_camera.xml
index ea4cf51..1dae598 100644
--- a/res/layout/video_camera.xml
+++ b/res/layout/video_camera.xml
@@ -17,7 +17,6 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:camera="http://schemas.android.com/apk/res/com.android.camera"
android:id="@+id/video_camera"
- android:background="@drawable/camera_background"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -41,7 +40,7 @@
attribute is required because otherwise the
text's drop shadow will be clipped. -->
<TextView android:id="@+id/recording_time"
- android:layout_width="180dp"
+ android:layout_width="300dp"
android:layout_height="wrap_content"
android:layout_gravity="left|bottom"
android:layout_marginBottom="13dp"
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index c931705..64b9b79 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Pořízené fotografie"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Pořízená videa"</string>
<string name="wait" msgid="8600187532323801552">"Čekejte prosím..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Než začnete používat fotoaparát, vložte kartu SD."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Než začnete používat fotoaparát, vložte kartu SD."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"Vaše karta SD je plná."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"Vaše karta SD je plná."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Příprava karty SD..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Příprava karty SD..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Nelze získat přístup ke kartě SD."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Nelze získat přístup ke kartě SD."</string>
+ <string name="no_storage" msgid="820691042667338625">"Než začnete používat fotoaparát, vložte kartu SD."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"Vaše karta SD je plná."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Příprava karty SD..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Nelze získat přístup ke kartě SD."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Obnovit výchozí nastavení"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Bude obnoveno výchozí nastavení fotoaparátu."</string>
<string name="review_play" msgid="6015456244323302817">"PŘEHRÁT"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"Pořídit další"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galerie"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Přepnout fotoaparát"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Zapnout časosběr"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Vypnout časosběr"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Vybrat fotoaparát"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Zadní"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Přední"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Nízká (30m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (Nízká, 30s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (Vysoká, 10m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Kvalita časoběrného videa"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Nízká"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Vysoká"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Nastavení fotoaparátu"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Nastavení videokamery"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Velikost fotografií"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Obnovit výchozí nastavení"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Expozice"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Na vaší kartě SD je málo místa. Změňte nastavení kvality nebo smažte položky z Galerie."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Na vaší kartě SD je málo místa. Změňte nastavení kvality nebo smažte položky z Galerie."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Na vaší kartě SD je málo místa. Změňte nastavení kvality nebo smažte položky z Galerie."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Bylo dosaženo limitu velikosti."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Přiblížení"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Přepnout do režimu fotoaparát"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 631f4d9..7795694 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Kamerabilleder"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Kameravideoer"</string>
<string name="wait" msgid="8600187532323801552">"Vent ..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Indsæt et SD-kort, inden du bruger kameraet."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Indsæt et SD-kort, inden du bruger kameraet."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"Dit SD-kort er fuldt."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"Dit SD-kort er fuldt."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Forbereder SD-kort ..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Forbereder SD-kort ..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"SD-kortet er ikke tilgængeligt."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"SD-kortet er ikke tilgængeligt."</string>
+ <string name="no_storage" msgid="820691042667338625">"Indsæt et SD-kort, inden du bruger kameraet."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"Dit SD-kort er fuldt."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Forbereder SD-kort ..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"SD-kortet er ikke tilgængeligt."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Gendan standarder"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Kameraets standardindstillinger bliver gendannet."</string>
<string name="review_play" msgid="6015456244323302817">"AFSPIL"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"TAG IGEN"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galleri"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Skift kamera"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Aktiver tidsforløb"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Deaktiver tidsforløb"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Vælg kamera"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Bagest"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Forrest"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Lav (30 m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (Lav, 30 s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (Høj, 10 m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Tidsforløb for videokvalitet"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Lav"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Høj"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Indstillinger for kamera"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Indstillinger for videokamera"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Billedstørrelse"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Gendan til standarder"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Eksponering"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Der er snart ikke mere plads på diit SD-kort. Rediger indstillingerne for kvaliteten, eller slet elementer fra Galleriet."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Der er snart ikke mere plads på diit SD-kort. Rediger indstillingerne for kvaliteten, eller slet elementer fra Galleriet."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Der er snart ikke mere plads på diit SD-kort. Rediger indstillingerne for kvaliteten, eller slet elementer fra Galleriet."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Størrelsesgrænse er nået."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zoom"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Skift til kamera"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 1db5bbe..38b46fe 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Kamerabilder"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Kameravideos"</string>
<string name="wait" msgid="8600187532323801552">"Bitte warten..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Legen Sie vor Verwendung der Kamera eine SD-Karte ein."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Legen Sie vor Verwendung der Kamera eine SD-Karte ein."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"Ihre SD-Karte ist voll."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"Ihre SD-Karte ist voll."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"SD-Karte wird vorbereitet..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"SD-Karte wird vorbereitet..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Kein Zugriff auf SD-Karte möglich"</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Kein Zugriff auf SD-Karte möglich"</string>
+ <string name="no_storage" msgid="820691042667338625">"Legen Sie vor Verwendung der Kamera eine SD-Karte ein."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"Ihre SD-Karte ist voll."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"SD-Karte wird vorbereitet..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Kein Zugriff auf SD-Karte möglich"</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Standard wiederherstellen"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Die Kameraeinstellungen werden auf die Standardeinstellungen wiederhergestellt."</string>
<string name="review_play" msgid="6015456244323302817">"WIEDERGEBEN"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"ERNEUT AUFNEHMEN"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galerie"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Kamera wechseln"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Zeitraffer ein"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Zeitraffer aus"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Kamera auswählen"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Zurück"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Front"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Niedrig (30m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (niedrig, 30s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (hoch, 10m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Zeitraffer-Videoqualität"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Niedrig"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Hoch"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Kameraeinstellungen"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Camcordereinstellungen"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Bildgröße"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Standard wiederherstellen"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Belichtung"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Auf Ihrer SD-Karte ist nicht mehr genügend Speicherplatz vorhanden. Ändern Sie die Qualitätseinstellung oder löschen Sie Elemente aus der Galerie."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Auf Ihrer SD-Karte ist nicht mehr genügend Speicherplatz vorhanden. Ändern Sie die Qualitätseinstellung oder löschen Sie Elemente aus der Galerie."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Auf Ihrer SD-Karte ist nicht mehr genügend Speicherplatz vorhanden. Ändern Sie die Qualitätseinstellung oder löschen Sie Elemente aus der Galerie."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Maximale Größe erreicht"</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zoom"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Zu Kamera wechseln"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 7899df1..9a21ec3 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Εικόνες φωτογραφικής μηχανής"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Βίντεο φωτογραφικής μηχανής"</string>
<string name="wait" msgid="8600187532323801552">"Περιμένετε..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Πριν χρησιμοποιήσετε τη φωτογραφική μηχανή, εισάγετε μία κάρτα SD."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Πριν χρησιμοποιήσετε τη φωτογραφική μηχανή, εισάγετε μία κάρτα SD."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"Η κάρτα SD είναι πλήρης."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"Η κάρτα SD είναι πλήρης."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Προετοιμασία κάρτας SD…"</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Προετοιμασία κάρτας SD…"</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Δεν είναι δυνατή η πρόσβαση στην κάρτα SD."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Δεν είναι δυνατή η πρόσβαση στην κάρτα SD."</string>
+ <string name="no_storage" msgid="820691042667338625">"Πριν χρησιμοποιήσετε τη φωτογραφική μηχανή, εισάγετε μία κάρτα SD."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"Η κάρτα SD είναι πλήρης."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Προετοιμασία κάρτας SD…"</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Δεν είναι δυνατή η πρόσβαση στην κάρτα SD."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Επαναφορά προεπιλογών"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Οι ρυθμίσεις της φωτογραφικής μηχανής θα επανέλθουν στις προεπιλογές."</string>
<string name="review_play" msgid="6015456244323302817">"ΑΝΑΠΑΡΑΓΩΓΗ"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"ΝΕΑ ΛΗΨΗ"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Συλλογή"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Εναλλαγή κάμερας"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Εν. παρελ. χρόν."</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Απ. παρελ. χρόν."</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Επιλογή κάμερας"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Πίσω"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Μπροστά"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Χαμηλή (30m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (Χαμηλή, 30s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (Υψηλή, 10m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Ποιότητα βίντεο παρελ. χρόνου"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Χαμηλή"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Υψηλή"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Ρυθμίσεις φωτογραφικής μηχανής"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Ρυθμίσεις βιντεοκάμερας"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Μέγεθος εικόνας"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Επαναφορά στις προεπιλογές"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Έκθεση"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Ο διαθέσιμος χώρος στην κάρτα SD είναι ελάχιστος. Αλλάξτε τη ρύθμιση ποιότητας ή διαγράψτε στοιχεία από τη συλλογή."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Ο διαθέσιμος χώρος στην κάρτα SD είναι ελάχιστος. Αλλάξτε τη ρύθμιση ποιότητας ή διαγράψτε στοιχεία από τη συλλογή."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Ο διαθέσιμος χώρος στην κάρτα SD είναι ελάχιστος. Αλλάξτε τη ρύθμιση ποιότητας ή διαγράψτε στοιχεία από τη συλλογή."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Συμπληρώθηκε το όριο μεγέθους."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Εστίαση"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Αλλαγή σε λειτουργία φωτογραφικής μηχανής"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 42f9c68..da6fb49 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Imágenes de la cámara"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Videos de la cámara"</string>
<string name="wait" msgid="8600187532323801552">"Espera, por favor..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Inserta una tarjeta SD antes de utilizar la cámara."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Inserta una tarjeta SD antes de utilizar la cámara."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"Tu tarjeta SD está llena."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"Tu tarjeta SD está llena."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Preparando la tarjeta SD..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Preparando la tarjeta SD..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"No se ha podido acceder a la tarjeta SD."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"No se ha podido acceder a la tarjeta SD."</string>
+ <string name="no_storage" msgid="820691042667338625">"Inserta una tarjeta SD antes de utilizar la cámara."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"Tu tarjeta SD está llena."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Preparando la tarjeta SD..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"No se ha podido acceder a la tarjeta SD."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Restaurar configuraciones predeterminadas"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"La configuración de la cámara se restaurará al modo predeterminado."</string>
<string name="review_play" msgid="6015456244323302817">"REPRODUCIR"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"VOLVER A TOMAR"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galería"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Cambiar cámara"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Habilitar intervalo de tiempo"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Inhabilitar intervalo de tiempo"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Seleccionar cámara"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Parte trasera"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Parte delantera"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Baja (30 min.)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (Baja, 30 seg.)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (Alta, 10 min.)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Calidad del video según el intervalo de tiempo"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Bajo"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Alta"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Configuración de cámara"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Configuración de videocámara"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Tamaño de imagen"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Restaurar a configuraciones predeterminadas"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Exposición"</string>
<string name="details_ok" msgid="6848594369924424312">"Aceptar"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Tu tarjeta SD se está quedando sin espacio. Cambia la configuración de calidad o elimina elementos de la galería."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Tu tarjeta SD se está quedando sin espacio. Cambia la configuración de calidad o elimina elementos de la galería."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Tu tarjeta SD se está quedando sin espacio. Cambia la configuración de calidad o elimina elementos de la galería."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Se alcanzó el límite del tamaño."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Ampliar"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Cambiar a cámara"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 5a3a200..2fd7d3b 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Imágenes de cámara"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Vídeos de cámara"</string>
<string name="wait" msgid="8600187532323801552">"Por favor, espera..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Inserta o activa la tarjeta SD para poder utilizar la cámara."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Inserta o activa la tarjeta SD para poder utilizar la cámara."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"La tarjeta SD está llena."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"La tarjeta SD está llena."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Preparando tarjeta SD…"</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Preparando tarjeta SD…"</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Sin acceso a la tarjeta SD"</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Sin acceso a la tarjeta SD"</string>
+ <string name="no_storage" msgid="820691042667338625">"Inserta o activa la tarjeta SD para poder utilizar la cámara."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"La tarjeta SD está llena."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Preparando tarjeta SD…"</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Sin acceso a la tarjeta SD"</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Restaurar valores predeterminados"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Se restaurará la configuración de cámara predeterminada."</string>
<string name="review_play" msgid="6015456244323302817">"REPRODUCIR"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"VOLVER A REALIZAR"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galería"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Cambiar cámara"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Habilitar intervalos tiempo"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Inhabilitar intervalos tiempo"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Seleccionar cámara"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Trasera"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Delantera"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Baja (30 m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (baja, 30 s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (alta, 10 min)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Calidad vídeo intervalo tiempo"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Baja"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Alta"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Configuración de cámara"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Configuración de videocámara"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Tamaño de imagen"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Restaurar a los valores predeterminados"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Exposición"</string>
<string name="details_ok" msgid="6848594369924424312">"Aceptar"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"No queda espacio en la tarjeta SD. Cambia la configuración de calidad o elimina elementos de la galería."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"No queda espacio en la tarjeta SD. Cambia la configuración de calidad o elimina elementos de la galería."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"No queda espacio en la tarjeta SD. Cambia la configuración de calidad o elimina elementos de la galería."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Se ha alcanzado el límite de tamaño."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zoom"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Cambiar a cámara"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a29de11..d17dc5c 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Photos de l\'appareil"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Vidéos de la caméra"</string>
<string name="wait" msgid="8600187532323801552">"Veuillez patienter..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Veuillez insérer une carte SD avant d\'utiliser l\'appareil photo."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Veuillez insérer une carte SD avant d\'utiliser l\'appareil photo."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"Votre carte SD est pleine."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"Votre carte SD est pleine."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Préparation de la carte SD..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Préparation de la carte SD..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Impossible d\'accéder à la carte SD."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Impossible d\'accéder à la carte SD."</string>
+ <string name="no_storage" msgid="820691042667338625">"Veuillez insérer une carte SD avant d\'utiliser l\'appareil photo."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"Votre carte SD est pleine."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Préparation de la carte SD..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Impossible d\'accéder à la carte SD."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Rétablir les paramètres par défaut"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Les paramètres par défaut de l\'appareil photo seront rétablis."</string>
<string name="review_play" msgid="6015456244323302817">"LIRE"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"AUTRE PHOTO"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galerie"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Changer d\'appareil photo"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Activer time lapse"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Désact. time lapse"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Choisir appareil ph."</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Arrière"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Avant"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Faible (30 mn)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (faible, 30 s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (élevée, 10 mn)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Qualité de la vidéo time lapse"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Faible"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Élevée"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Paramètres de l\'appareil photo"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Mode Caméra"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Taille d\'image"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Rétablir les paramètres par défaut"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Exposition"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Votre carte SD est pleine. Modifiez le paramètre de qualité ou supprimez des éléments de la galerie."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Votre carte SD est pleine. Modifiez le paramètre de qualité ou supprimez des éléments de la galerie."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Votre carte SD est pleine. Modifiez le paramètre de qualité ou supprimez des éléments de la galerie."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Taille maximale atteinte."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zoom"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Passer en mode photo"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 445ebfb..e9fca65 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Foto"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Video"</string>
<string name="wait" msgid="8600187532323801552">"Attendere..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Per usare la fotocamera devi inserire una scheda SD."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Per usare la fotocamera devi inserire una scheda SD."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"La scheda SD è piena."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"La scheda SD è piena."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Preparazione scheda SD…"</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Preparazione scheda SD…"</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Accesso alla scheda SD non riuscito."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Accesso alla scheda SD non riuscito."</string>
+ <string name="no_storage" msgid="820691042667338625">"Per usare la fotocamera devi inserire una scheda SD."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"La scheda SD è piena."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Preparazione scheda SD…"</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Accesso alla scheda SD non riuscito."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Ripristina predefinite"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Verranno ripristinate le impostazioni predefinite della fotocamera."</string>
<string name="review_play" msgid="6015456244323302817">"RIPRODUCI"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"SCATTA DI NUOVO"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galleria"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Cambia fotocamera"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Attiva rallentatore"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Disattiva rallentat."</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Seleziona fotocamera"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Posteriore"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Frontale"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Bassa (30 m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (bassa, 30 s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (alta, 10 m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Qualità video a rallentatore"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Bassa"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Alta"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Impostazioni fotocamera"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Impostazioni videocamera"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Dimensioni foto"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Ripristina predefinite"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Esposizione"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Lo spazio della scheda SD si sta esaurendo. Cambia l\'impostazione di qualità o elimina elementi nella galleria."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Lo spazio della scheda SD si sta esaurendo. Cambia l\'impostazione di qualità o elimina elementi nella galleria."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Lo spazio della scheda SD si sta esaurendo. Cambia l\'impostazione di qualità o elimina elementi nella galleria."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Limite di dimensione raggiunto."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zoom"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Passa a fotocamera"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 8d338c6..04451e7 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"カメラ (写真)"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"カメラ (動画)"</string>
<string name="wait" msgid="8600187532323801552">"お待ちください..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"カメラを使用する前にSDカードを挿入してください。"</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"カメラを使用する前にSDカードを挿入してください。"</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"SDカードがいっぱいです。"</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"SDカードがいっぱいです。"</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"SDカードの準備中..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"SDカードの準備中..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"SDカードにアクセスできません。"</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"SDカードにアクセスできません。"</string>
+ <string name="no_storage" msgid="820691042667338625">"カメラを使用する前にSDカードを挿入してください。"</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"SDカードがいっぱいです。"</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"SDカードの準備中..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"SDカードにアクセスできません。"</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"初期設定に戻す"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"カメラを初期設定に戻します。"</string>
<string name="review_play" msgid="6015456244323302817">"再生"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"撮り直し"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"ギャラリー"</string>
<string name="switch_camera_id" msgid="837545176602471325">"カメラを切り替え"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"低速度撮影を有効にする"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"低速度撮影を無効にする"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"カメラを選択"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"背面"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"前面"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"低(30m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS(低、30s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube(高、10m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"低速度撮影の動画画質"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"低"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"高"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"カメラ設定"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"ビデオ録画設定"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"表示サイズ"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"初期設定に戻す"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"露出"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"SDカードの容量が足りません。クオリティ設定を変更するか、ギャラリーからアイテムを削除してください。"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"SDカードの容量が足りません。クオリティ設定を変更するか、ギャラリーからアイテムを削除してください。"</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"SDカードの容量が足りません。クオリティ設定を変更するか、ギャラリーからアイテムを削除してください。"</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"サイズ制限に達しました。"</string>
<string name="zoom_control_title" msgid="6532562653386981815">"ズーム"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"写真に切替"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 1008d57..2a93a7f 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"카메라 사진"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"카메라 동영상"</string>
<string name="wait" msgid="8600187532323801552">"잠시 기다려 주세요..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"카메라를 사용하려면 SD 카드를 넣으세요."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"카메라를 사용하려면 SD 카드를 넣으세요."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"SD 카드가 꽉 찼습니다."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"SD 카드가 꽉 찼습니다."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"SD 카드 준비중..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"SD 카드 준비중..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"SD 카드에 액세스하지 못했습니다."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"SD 카드에 액세스하지 못했습니다."</string>
+ <string name="no_storage" msgid="820691042667338625">"카메라를 사용하려면 SD 카드를 넣으세요."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"SD 카드가 꽉 찼습니다."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"SD 카드 준비중..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"SD 카드에 액세스하지 못했습니다."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"기본값 복원"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"카메라 설정이 기본값으로 복원됩니다."</string>
<string name="review_play" msgid="6015456244323302817">"재생"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"다시 촬영"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"갤러리"</string>
<string name="switch_camera_id" msgid="837545176602471325">"카메라 전환"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"시간 경과 사용"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"시간 경과 사용안함"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"카메라 선택"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"후방"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"전방"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"낮음(30분)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"멀티미디어 메시지(낮음, 30초)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube(높음, 10분)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"시간 경과 동영상 화질"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"낮음"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"높음"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"카메라 설정"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"캠코더 설정"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"사진 크기"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"기본값으로 복원"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"노출"</string>
<string name="details_ok" msgid="6848594369924424312">"확인"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"SD 카드의 공간이 부족합니다. 화질 설정을 변경하거나 갤러리에서 항목을 삭제하세요."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"SD 카드의 공간이 부족합니다. 화질 설정을 변경하거나 갤러리에서 항목을 삭제하세요."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"SD 카드의 공간이 부족합니다. 화질 설정을 변경하거나 갤러리에서 항목을 삭제하세요."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"크기 한도에 도달했습니다."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"확대/축소"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"카메라로 전환"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 92d93f8..a82bc16 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Bilder fra kamera"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Videoer fra kamera"</string>
<string name="wait" msgid="8600187532323801552">"Vent litt…"</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Sett inn et minnekort før du bruker kameraet."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Sett inn et minnekort før du bruker kameraet."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"Minnekortet er fullt."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"Minnekortet er fullt."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Forbereder minnekort…"</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Forbereder minnekort…"</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Får ikke tilgang til SD-kort."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Får ikke tilgang til SD-kort."</string>
+ <string name="no_storage" msgid="820691042667338625">"Sett inn et minnekort før du bruker kameraet."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"Minnekortet er fullt."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Forbereder minnekort…"</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Får ikke tilgang til SD-kort."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Gjenopprett standardinnstillingene"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Kamerainnstillingene gjenopprettes til standard."</string>
<string name="review_play" msgid="6015456244323302817">"Spill"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"Ta på nytt"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galleri"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Bytt kamera"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Aktiver tidsforløp"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Deaktiv. tidsforløp"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Velg kamera"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Bakside"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Forside"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Lav (30 m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"Multimediemelding (lav, 30 s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (høy, 10 m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Tidsforløp for videokvalitet"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Lav"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Høy"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Kamerainnstillinger"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Videoinnstillinger"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Bildestørrelse"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Gjenopprett til standardinnstillingene"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Eksponering"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Minnekortet begynner å gå tom for plass. Endre kvalitetsinnstillingen eller slett bilder fra galleriet."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Minnekortet begynner å gå tom for plass. Endre kvalitetsinnstillingen eller slett bilder fra galleriet."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Minnekortet begynner å gå tom for plass. Endre kvalitetsinnstillingen eller slett bilder fra galleriet."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Videoen ble for stor."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zoom"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Bytt til kamera"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index ad03250..37356fe 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Camerafoto\'s"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Cameravideo\'s"</string>
<string name="wait" msgid="8600187532323801552">"Een ogenblik geduld..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Plaats een SD-kaart voordat u de camera gebruikt."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Plaats een SD-kaart voordat u de camera gebruikt."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"De SD-kaart is vol."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"De SD-kaart is vol."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"SD-kaart voorbereiden…"</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"SD-kaart voorbereiden…"</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Toegang krijgen tot SD-kaart is mislukt."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Toegang krijgen tot SD-kaart is mislukt."</string>
+ <string name="no_storage" msgid="820691042667338625">"Plaats een SD-kaart voordat u de camera gebruikt."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"De SD-kaart is vol."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"SD-kaart voorbereiden…"</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Toegang krijgen tot SD-kaart is mislukt."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Standaardwaarden herstellen"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"De standaardwaarden voor de camera-instellingen worden hersteld."</string>
<string name="review_play" msgid="6015456244323302817">"AFSPELEN"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"OPNIEUW OPNEMEN"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galerij"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Camera wijzigen"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Time-lapse aan"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Time-lapse uit"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Camera selecteren"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Achterzijde"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Voorzijde"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Laag (30m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (Laag, 30s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (Hoog, 10m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Videokwaliteit time-lapse"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Laag"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Hoog"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Camera-instellingen"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Camcorder-instellingen"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Grootte van foto"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Terugzetten naar standaardwaarden"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Belichting"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Er is weinig ruimte beschikbaar op uw SD-kaart. U kunt de kwaliteitsinstelling wijzigen of items uit de galerij verwijderen."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Er is weinig ruimte beschikbaar op uw SD-kaart. U kunt de kwaliteitsinstelling wijzigen of items uit de galerij verwijderen."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Er is weinig ruimte beschikbaar op uw SD-kaart. U kunt de kwaliteitsinstelling wijzigen of items uit de galerij verwijderen."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Maximale grootte bereikt"</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zoomen"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Overschakelen naar camera"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 3d5126a..b3c8539 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Zdjęcia z aparatu"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Filmy z aparatu"</string>
<string name="wait" msgid="8600187532323801552">"Proszę czekać…"</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Zanim zaczniesz korzystać z aparatu fotograficznego, włóż kartę SD."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Zanim zaczniesz korzystać z aparatu fotograficznego, włóż kartę SD."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"Karta SD jest pełna."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"Karta SD jest pełna."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Przygotowywanie karty SD..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Przygotowywanie karty SD..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Nie można uzyskać dostępu do karty SD."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Nie można uzyskać dostępu do karty SD."</string>
+ <string name="no_storage" msgid="820691042667338625">"Zanim zaczniesz korzystać z aparatu fotograficznego, włóż kartę SD."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"Karta SD jest pełna."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Przygotowywanie karty SD..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Nie można uzyskać dostępu do karty SD."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Przywróć wartości domyślne"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Zostaną przywrócone ustawienia domyślne aparatu."</string>
<string name="review_play" msgid="6015456244323302817">"ODTWÓRZ"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"ZRÓB PONOWNIE"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galeria"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Przełącz aparat"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Wł. tryb poklatkowy"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Wył. tryb poklatkowy"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Wybierz aparat"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Tył"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Przód"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Niska (30 min)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (niska, 30 s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (wysoka, 10 min)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Jakość filmu poklatkowego"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Niska"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Wysoka"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Ustawienia aparatu"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Ustawienia kamery"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Rozmiar zdjęcia"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Przywróć wartości domyślne"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Ekspozycja"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Na karcie SD brakuje miejsca. Zmień ustawienie jakości lub usuń elementy z Galerii."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Na karcie SD brakuje miejsca. Zmień ustawienie jakości lub usuń elementy z Galerii."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Na karcie SD brakuje miejsca. Zmień ustawienie jakości lub usuń elementy z Galerii."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Osiągnięto limit rozmiaru."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Powiększenie"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Przełącz na aparat"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index ed35fef..184052a 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Imagens da câmara"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Vídeos da câmara"</string>
<string name="wait" msgid="8600187532323801552">"Aguarde..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Insira um cartão SD antes de utilizar a câmara."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Insira um cartão SD antes de utilizar a câmara."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"O cartão SD está cheio."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"O cartão SD está cheio."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"A preparar o cartão SD..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"A preparar o cartão SD..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Falha ao aceder ao cartão SD."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Falha ao aceder ao cartão SD."</string>
+ <string name="no_storage" msgid="820691042667338625">"Insira um cartão SD antes de utilizar a câmara."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"O cartão SD está cheio."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"A preparar o cartão SD..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Falha ao aceder ao cartão SD."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Restaurar predefinições"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"As definições da câmara serão restauradas para os valores predefinidos."</string>
<string name="review_play" msgid="6015456244323302817">"REPRODUZIR"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"VOLTAR A TIRAR"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galeria"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Trocar câmara"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Act. lapso de tempo"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Des. lapso de tempo"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Seleccionar câmara"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Traseira"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Frontal"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Baixa (30 m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (baixa, 30 s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (Alta, 10 m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Qual. do vídeo lapso de tempo"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Baixa"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Alta"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Definições da câmara"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Definições da câmara de vídeo"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Tamanho da imagem"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Restaurar para valores predefinidos"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Exposição"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Está a ficar sem espaço no cartão SD. Altere as definições de qualidade ou elimine itens da Galeria."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Está a ficar sem espaço no cartão SD. Altere as definições de qualidade ou elimine itens da Galeria."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Está a ficar sem espaço no cartão SD. Altere as definições de qualidade ou elimine itens da Galeria."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Limite de tamanho atingido."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zoom"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Mudar para câmara"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 7187632..f7a56ec 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Imagens da câmera"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Vídeos de câmera"</string>
<string name="wait" msgid="8600187532323801552">"Aguarde..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Insira um cartão SD antes de usar a câmera."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Insira um cartão SD antes de usar a câmera."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"O seu cartão SD está cheio."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"O seu cartão SD está cheio."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Preparando o cartão SD…"</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Preparando o cartão SD…"</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Falha ao acessar o cartão SD."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Falha ao acessar o cartão SD."</string>
+ <string name="no_storage" msgid="820691042667338625">"Insira um cartão SD antes de usar a câmera."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"O seu cartão SD está cheio."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Preparando o cartão SD…"</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Falha ao acessar o cartão SD."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Restaurar padrões"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"As configurações da câmera serão restauradas para os valores padrão."</string>
<string name="review_play" msgid="6015456244323302817">"REPRODUZIR"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"TIRAR OUTRA"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galeria"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Alternar câmera"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Ativar tempo grav."</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Desat. tempo grav."</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Selecionar câmera"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Voltar"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Visão frontal"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Baixa (30m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (Baixo, 30s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (Alta, 10m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Qualidade do vídeo com tempo"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Baixa"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Alta"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Configurações da câmera"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Configurações da filmadora"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Tamanho da imagem"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Restaurar para os valores padrão"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Exposição"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"O seu cartão SD está sem espaço. Mude a configuração de qualidade ou exclua itens da Galeria."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"O seu cartão SD está sem espaço. Mude a configuração de qualidade ou exclua itens da Galeria."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"O seu cartão SD está sem espaço. Mude a configuração de qualidade ou exclua itens da Galeria."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Limite de tamanho atingido."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zoom"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Alternar para câmera"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 8169984..fa322a0 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Снимки, сделанные камерой"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Видео"</string>
<string name="wait" msgid="8600187532323801552">"Подождите..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Прежде чем использовать камеру, вставьте SD-карту."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Прежде чем использовать камеру, вставьте SD-карту."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"Ваша SD-карта заполнена."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"Ваша SD-карта заполнена."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Подготовка карты SD..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Подготовка карты SD..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Не удалось получить доступ к SD-карте."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Не удалось получить доступ к SD-карте."</string>
+ <string name="no_storage" msgid="820691042667338625">"Прежде чем использовать камеру, вставьте SD-карту."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"Ваша SD-карта заполнена."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Подготовка карты SD..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Не удалось получить доступ к SD-карте."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Восстановить настройки по умолчанию"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Для камеры будут восстановлены настройки по умолчанию."</string>
<string name="review_play" msgid="6015456244323302817">"ВОСПРОИЗВЕСТИ"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"ДРУГОЙ СНИМОК"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Галерея"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Переключить камеру"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Вкл. замедл. съемку"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Откл. замедл. съемку"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Выберите камеру"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Задняя"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Передняя"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Низкое (30 мин.)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (низкое, 30 с.)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (высокое, 10 мин.)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Качество при замедл. съемке"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Низкое"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Высокое"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Настройки камеры"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Настройки видеокамеры"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Размер фотографии"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Заводские настройки"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Экспозиция"</string>
<string name="details_ok" msgid="6848594369924424312">"ОК"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Место на вашей SD-карте заканчивается. Измените настройки качества или удалите содержимое из галереи."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Место на вашей SD-карте заканчивается. Измените настройки качества или удалите содержимое из галереи."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Место на вашей SD-карте заканчивается. Измените настройки качества или удалите содержимое из галереи."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Достигнут предельный размер видео."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Масштаб"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Переключить на фото"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index ce2246f..5edf342 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Kamerabilder"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Kameravideor"</string>
<string name="wait" msgid="8600187532323801552">"Vänta…"</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Sätt i ett SD-kort innan du använder kameran."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Sätt i ett SD-kort innan du använder kameran."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"Ditt SD-kort är fullt."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"Ditt SD-kort är fullt."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"Förbereder SD-kort…"</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"Förbereder SD-kort…"</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"Det gick inte att öppna SD-kortet."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"Det gick inte att öppna SD-kortet."</string>
+ <string name="no_storage" msgid="820691042667338625">"Sätt i ett SD-kort innan du använder kameran."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"Ditt SD-kort är fullt."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"Förbereder SD-kort…"</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"Det gick inte att öppna SD-kortet."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Återställ standardinställningar"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Kamerans standardinställningar återställs."</string>
<string name="review_play" msgid="6015456244323302817">"SPELA"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"TA OM"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galleri"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Växla kamera"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Tidsavvikelse på"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Tidsavvikelse av"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Välj kamera"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Bakre"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Främre"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Låg (30 m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (Låg, 30 s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (Hög, 10 m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Videokvalitet, tidsavvikelse"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Låg"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Hög"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Kamerainställningar"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Videokamerainställningar"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Bildstorlek"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Återställ standardvärden"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Exponering"</string>
<string name="details_ok" msgid="6848594369924424312">"OK"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"Ditt SD-kort börjar bli fullt. Ändra inställningen för kvalitet eller ta bort objekt från Galleri."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"Ditt SD-kort börjar bli fullt. Ändra inställningen för kvalitet eller ta bort objekt från Galleri."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"Ditt SD-kort börjar bli fullt. Ändra inställningen för kvalitet eller ta bort objekt från Galleri."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Storleksgränsen nådd."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zoom"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Växla till kamera"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 39cd49d..69c0af7 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"Kamera resimleri"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"Kamera videoları"</string>
<string name="wait" msgid="8600187532323801552">"Lütfen bekleyin..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"Kamerayı kullanmadan önce lütfen bir SD kart takın."</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"Kamerayı kullanmadan önce lütfen bir SD kart takın."</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"SD kartınız dolu."</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"SD kartınız dolu."</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"SD kart hazırlanıyor..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"SD kart hazırlanıyor..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"SD karta erişilemiyor."</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"SD karta erişilemiyor."</string>
+ <string name="no_storage" msgid="820691042667338625">"Kamerayı kullanmadan önce lütfen bir SD kart takın."</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"SD kartınız dolu."</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"SD kart hazırlanıyor..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"SD karta erişilemiyor."</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"Varsayılanları geri yükle"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"Kamera ayarlarının varsayılan değerleri geri yüklenecek."</string>
<string name="review_play" msgid="6015456244323302817">"YÜRÜT"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"YENİDEN ÇEK"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"Galeri"</string>
<string name="switch_camera_id" msgid="837545176602471325">"Kamerayı Değiştir"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"Zaman Atl Etkinlştr"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"Zaman Atl Dvr Dş Brk"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"Kamera seçin"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"Arka"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"Ön"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"Düşük (30m)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (Düşük, 30s)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (Yüksek, 10m)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"Zaman atlamalı video kalitesi"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"Düşük"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"Yüksek"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"Kamera ayarları"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"Kamera ayarları"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"Resim boyutu"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"Varsayılan değerleri geri yükle"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"Pozlama"</string>
<string name="details_ok" msgid="6848594369924424312">"Tamam"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"SD kartınızda boş alan azalıyor. Kalite ayarlarını değiştirin veya Galeri\'den öğe silin."</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"SD kartınızda boş alan azalıyor. Kalite ayarlarını değiştirin veya Galeri\'den öğe silin."</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"SD kartınızda boş alan azalıyor. Kalite ayarlarını değiştirin veya Galeri\'den öğe silin."</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"Boyut sınırına ulaşıldı."</string>
<string name="zoom_control_title" msgid="6532562653386981815">"Zum:"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"Kameraya geç"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 86b7f55..9d1b9eb 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"用相机拍摄的照片"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"用相机拍摄的视频"</string>
<string name="wait" msgid="8600187532323801552">"请稍候..."</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"使用相机前请先插入 SD 卡。"</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"使用相机前请先插入 SD 卡。"</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"SD 卡已满。"</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"SD 卡已满。"</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"正在准备 SD 卡..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"正在准备 SD 卡..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"无法访问 SD 卡。"</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"无法访问 SD 卡。"</string>
+ <string name="no_storage" msgid="820691042667338625">"使用相机前请先插入 SD 卡。"</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"SD 卡已满。"</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"正在准备 SD 卡..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"无法访问 SD 卡。"</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"还原默认设置"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"相机设置将还原为默认值。"</string>
<string name="review_play" msgid="6015456244323302817">"播放"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"重拍"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"图库"</string>
<string name="switch_camera_id" msgid="837545176602471325">"切换相机"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"启用延时模式"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"停用延时模式"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"选择相机"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"背面相机"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"正面相机"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"低画质(30 分钟)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"彩信(低画质,30 秒)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube(高画质,10 分钟)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"延时视频品质"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"低"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"高"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"相机设置"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"摄像机设置"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"照片大小"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"还原为默认设置"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"曝光"</string>
<string name="details_ok" msgid="6848594369924424312">"确定"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"SD 卡空间已快用完。请更改画质设置或删除图库中的部分内容。"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"SD 卡空间已快用完。请更改画质设置或删除图库中的部分内容。"</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"SD 卡空间已快用完。请更改画质设置或删除图库中的部分内容。"</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"已达到大小上限。"</string>
<string name="zoom_control_title" msgid="6532562653386981815">"缩放"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"切换到相机"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 5b2e768..0d3dbd8 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -23,14 +23,10 @@
<string name="gallery_camera_bucket_name" msgid="2924618424339240831">"相機圖片"</string>
<string name="gallery_camera_videos_bucket_name" msgid="3369151581398551623">"相機影片"</string>
<string name="wait" msgid="8600187532323801552">"請稍候…"</string>
- <!-- outdated translation 820691042667338625 --> <string name="no_storage" product="nosdcard" msgid="2585076435604779811">"使用相機前請先插入 SD 卡。"</string>
- <string name="no_storage" product="default" msgid="820691042667338625">"使用相機前請先插入 SD 卡。"</string>
- <!-- outdated translation 6655334407957844653 --> <string name="not_enough_space" product="nosdcard" msgid="7966388882416357252">"SD 卡已滿。"</string>
- <string name="not_enough_space" product="default" msgid="6655334407957844653">"SD 卡已滿。"</string>
- <!-- outdated translation 2914969119574812666 --> <string name="preparing_sd" product="nosdcard" msgid="183917364005592061">"正在準備 SD 卡..."</string>
- <string name="preparing_sd" product="default" msgid="2914969119574812666">"正在準備 SD 卡..."</string>
- <!-- outdated translation 4427585260986849912 --> <string name="access_sd_fail" product="nosdcard" msgid="1518739048621172182">"無法存取 SD 卡。"</string>
- <string name="access_sd_fail" product="default" msgid="4427585260986849912">"無法存取 SD 卡。"</string>
+ <string name="no_storage" msgid="820691042667338625">"使用相機前請先插入 SD 卡。"</string>
+ <string name="not_enough_space" msgid="6655334407957844653">"SD 卡已滿。"</string>
+ <string name="preparing_sd" msgid="2914969119574812666">"正在準備 SD 卡..."</string>
+ <string name="access_sd_fail" msgid="4427585260986849912">"無法存取 SD 卡。"</string>
<string name="confirm_restore_title" msgid="1229914538263792180">"還原預設值"</string>
<string name="confirm_restore_message" msgid="5239464943578877295">"相機設定即將還原成預設值。"</string>
<string name="review_play" msgid="6015456244323302817">"播放"</string>
@@ -39,6 +35,8 @@
<string name="review_retake" msgid="7804864054896088338">"重拍"</string>
<string name="camera_gallery_photos_text" msgid="6558048736561932758">"圖庫"</string>
<string name="switch_camera_id" msgid="837545176602471325">"切換相機"</string>
+ <string name="enable_time_lapse_mode" msgid="9176865387013576340">"啟用延時攝影"</string>
+ <string name="disable_time_lapse_mode" msgid="1025813874111023552">"停用延時攝影"</string>
<string name="pref_camera_id_title" msgid="6023059405578511534">"選取鏡頭"</string>
<string name="pref_camera_id_entry_back" msgid="5142699735103692485">"後置鏡頭"</string>
<string name="pref_camera_id_entry_front" msgid="5668958706828733669">"前置鏡頭"</string>
@@ -50,6 +48,11 @@
<string name="pref_video_quality_entry_low" msgid="5282945640948667598">"低 (30 分鐘)"</string>
<string name="pref_video_quality_entry_mms" msgid="2271260293894247704">"MMS (低,30 秒)"</string>
<string name="pref_video_quality_entry_youtube" msgid="3731902408685997150">"YouTube (高,10 分鐘)"</string>
+ <string name="pref_video_time_lapse_quality_title" msgid="1163053302966946838">"延時攝影的影片品質"</string>
+ <string name="pref_video_time_lapse_quality_entry_low" msgid="5315843743598116968">"低畫質"</string>
+ <string name="pref_video_time_lapse_quality_entry_high" msgid="3933491126045555205">"高畫質"</string>
+ <!-- no translation found for pref_video_time_lapse_frame_interval_title (5023524580863002541) -->
+ <skip />
<string name="pref_camera_settings_category" msgid="2576236450859613120">"相機設定"</string>
<string name="pref_camcorder_settings_category" msgid="460313486231965141">"攝錄影機設定"</string>
<string name="pref_camera_picturesize_title" msgid="4333724936665883006">"相片大小"</string>
@@ -105,8 +108,7 @@
<string name="pref_restore_detail" msgid="5326039608800383369">"還原成預設值"</string>
<string name="pref_exposure_title" msgid="1229093066434614811">"曝光"</string>
<string name="details_ok" msgid="6848594369924424312">"確定"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="nosdcard" msgid="3117623741859928332">"您的 SD 卡空間已快用完。請變更品質設定或刪除圖庫中的項目。"</string>
- <!-- outdated translation 2848517537672543641 --> <string name="spaceIsLow_content" product="default" msgid="1732882643101247179">"您的 SD 卡空間已快用完。請變更品質設定或刪除圖庫中的項目。"</string>
+ <string name="spaceIsLow_content" msgid="2848517537672543641">"您的 SD 卡空間已快用完。請變更品質設定或刪除圖庫中的項目。"</string>
<string name="video_reach_size_limit" msgid="6179877322015552390">"已達大小上限。"</string>
<string name="zoom_control_title" msgid="6532562653386981815">"縮放"</string>
<string name="switch_to_camera_lable" msgid="8248495141797448471">"切換為相機"</string>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index d953aa0..0e89d1b 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -38,6 +38,58 @@
<item>@drawable/ic_viewfinder_video_quality_youtube</item>
</array>
+ <!-- Camera Preferences Time Lapse Video Quality entries -->
+ <string-array name="pref_video_time_lapse_quality_entries" translatable="false">
+ <item>@string/pref_video_time_lapse_quality_entry_low</item>
+ <item>@string/pref_video_time_lapse_quality_entry_high</item>
+ <item>@string/pref_video_time_lapse_quality_entry_480p</item>
+ <item>@string/pref_video_time_lapse_quality_entry_720p</item>
+ <item>@string/pref_video_time_lapse_quality_entry_1080p</item>
+ </string-array>
+
+ <!-- These values correspond to the quality level integers defined
+ in CamcorderProfile.java. E.g. QUALITY_TIME_LAPSE_480P = 1004 -->
+ <string-array name="pref_video_time_lapse_quality_entryvalues" translatable="false">
+ <item>1000</item>
+ <item>1001</item>
+ <item>1004</item>
+ <item>1005</item>
+ <item>1006</item>
+ </string-array>
+
+ <!-- Camera Preferences Time Lapse Frame Interval entries -->
+ <string-array name="pref_video_time_lapse_frame_interval_entries" translatable="false">
+ <item>@string/pref_video_time_lapse_frame_interval_entry_500</item>
+ <item>@string/pref_video_time_lapse_frame_interval_entry_1000</item>
+ <item>@string/pref_video_time_lapse_frame_interval_entry_1500</item>
+ <item>@string/pref_video_time_lapse_frame_interval_entry_2000</item>
+ <item>@string/pref_video_time_lapse_frame_interval_entry_2500</item>
+ <item>@string/pref_video_time_lapse_frame_interval_entry_3000</item>
+ <item>@string/pref_video_time_lapse_frame_interval_entry_5000</item>
+ <item>@string/pref_video_time_lapse_frame_interval_entry_10000</item>
+ </string-array>
+
+ <!-- These values correspond to the time interval between frame capture in millseconds
+ for time lapse recording -->
+ <string-array name="pref_video_time_lapse_frame_interval_entryvalues" translatable="false">
+ <item>500</item>
+ <item>1000</item>
+ <item>1500</item>
+ <item>2000</item>
+ <item>2500</item>
+ <item>3000</item>
+ <item>5000</item>
+ <item>10000</item>
+ </string-array>
+
+ <array name="video_time_lapse_quality_icons" translatable="false">
+ <item>@drawable/ic_viewfinder_video_time_lapse_quality_low</item>
+ <item>@drawable/ic_viewfinder_video_time_lapse_quality_high</item>
+ <item>@drawable/ic_viewfinder_video_time_lapse_quality_480p</item>
+ <item>@drawable/ic_viewfinder_video_time_lapse_quality_720p</item>
+ <item>@drawable/ic_viewfinder_video_time_lapse_quality_1080p</item>
+ </array>
+
<!-- Camera Preferences Picture size dialog box entries -->
<string-array name="pref_camera_picturesize_entries" translatable="false">
<!-- TODO: Change to a better name of the preference.
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d7c76d4..aa2e420 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -113,6 +113,15 @@
<!-- Button indicating to switch to another camera -->
<string name="switch_camera_id">Switch Camera</string>
+ <!-- Button indicating to enable the time lapse mode. Time lapse mode refers
+ to capturing video at a rate much slower than it is played back. Appears as
+ a Menu item in Camcorder mode. [CHAR LIMIT=20] -->
+ <string name="enable_time_lapse_mode">Enable Time Lapse</string>
+
+ <!-- Button indicating to disable the time lapse mode. Appears as a Menu item in
+ Camcorder mode. [CHAR LIMIT=20] -->
+ <string name="disable_time_lapse_mode">Disable Time Lapse</string>
+
<!-- Settings screen, camera selection dialog title. Users can select a camera from the phone (front-facing or back-facing). [CHAR LIMIT=20] -->
<string name="pref_camera_id_title">Select camera</string>
@@ -140,6 +149,35 @@
<string name="pref_video_quality_entry_mms">MMS (Low, 30s)</string>
<string name="pref_video_quality_entry_youtube">YouTube (High, 10m)</string>
+ <!-- Describes the preference dialog for choosing quality for time lapse video.
+ Appears at top of the dialog. [CHAR LIMIT=30] -->
+ <string name="pref_video_time_lapse_quality_title">Time lapse video quality</string>
+ <string name="pref_video_time_lapse_quality_default" translatable="false">1001</string>
+ <!-- Refers to the video quality [CHAR LIMIT=8] -->
+ <string name="pref_video_time_lapse_quality_entry_low">Low</string>
+ <!-- Refers to the video quality [CHAR LIMIT=8] -->
+ <string name="pref_video_time_lapse_quality_entry_high">High</string>
+ <!-- Refers to the video quality -->
+ <string name="pref_video_time_lapse_quality_entry_480p" translatable="false">480p</string>
+ <!-- Refers to the video quality -->
+ <string name="pref_video_time_lapse_quality_entry_720p" translatable="false">720p</string>
+ <!-- Refers to the video quality -->
+ <string name="pref_video_time_lapse_quality_entry_1080p" translatable="false">1080p</string>
+
+ <!-- Describes the preference dialog for choosing interval between frame capture for
+ time lapse recording. Appears at top of the dialog. [CHAR LIMIT=30] -->
+ <string name="pref_video_time_lapse_frame_interval_title">Frame capture interval</string>
+ <string name="pref_video_time_lapse_frame_interval_default" translatable="false">2000</string>
+ <!-- The time interval between frame capture for time lapse recording -->
+ <string name="pref_video_time_lapse_frame_interval_entry_500" translatable="false">0.5s</string>
+ <string name="pref_video_time_lapse_frame_interval_entry_1000" translatable="false">1s</string>
+ <string name="pref_video_time_lapse_frame_interval_entry_1500" translatable="false">1.5s</string>
+ <string name="pref_video_time_lapse_frame_interval_entry_2000" translatable="false">2s</string>
+ <string name="pref_video_time_lapse_frame_interval_entry_2500" translatable="false">2.5s</string>
+ <string name="pref_video_time_lapse_frame_interval_entry_3000" translatable="false">3s</string>
+ <string name="pref_video_time_lapse_frame_interval_entry_5000" translatable="false">5s</string>
+ <string name="pref_video_time_lapse_frame_interval_entry_10000" translatable="false">10s</string>
+
<!-- Settings screen, Camera setting category title -->
<string name="pref_camera_settings_category">Camera settings</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 613ac34..6de4a96 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -18,6 +18,9 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
+ <style name="ThemeCamera" parent="android:Theme.Black.NoTitleBar.Fullscreen">
+ <item name="android:windowBackground">@drawable/camera_background</item>
+ </style>
<style name="OnScreenHintTextAppearance">
<item name="android:textColor">@android:color/primary_text_dark</item>
<item name="android:textColorHighlight">#FFFF9200</item>
diff --git a/res/xml/video_preferences.xml b/res/xml/video_preferences.xml
index 3929b03..5f0e9e7 100644
--- a/res/xml/video_preferences.xml
+++ b/res/xml/video_preferences.xml
@@ -26,6 +26,19 @@
camera:entries="@array/pref_video_quality_entries"
camera:entryValues="@array/pref_video_quality_entryvalues"/>
<IconListPreference
+ camera:key="pref_video_time_lapse_quality_key"
+ camera:defaultValue="@string/pref_video_time_lapse_quality_default"
+ camera:title="@string/pref_video_time_lapse_quality_title"
+ camera:largeIcons="@array/video_time_lapse_quality_icons"
+ camera:entries="@array/pref_video_time_lapse_quality_entries"
+ camera:entryValues="@array/pref_video_time_lapse_quality_entryvalues"/>
+ <ListPreference
+ camera:key="pref_video_time_lapse_frame_interval_key"
+ camera:defaultValue="@string/pref_video_time_lapse_frame_interval_default"
+ camera:title="@string/pref_video_time_lapse_frame_interval_title"
+ camera:entries="@array/pref_video_time_lapse_frame_interval_entries"
+ camera:entryValues="@array/pref_video_time_lapse_frame_interval_entryvalues"/>
+ <IconListPreference
camera:key="pref_camera_video_flashmode_key"
camera:defaultValue="@string/pref_camera_video_flashmode_default"
camera:title="@string/pref_camera_flashmode_title"
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java
index fc16f16..7a963b1 100644
--- a/src/com/android/camera/Camera.java
+++ b/src/com/android/camera/Camera.java
@@ -16,6 +16,13 @@
package com.android.camera;
+import com.android.camera.gallery.IImage;
+import com.android.camera.gallery.IImageList;
+import com.android.camera.ui.CameraHeadUpDisplay;
+import com.android.camera.ui.GLRootView;
+import com.android.camera.ui.HeadUpDisplay;
+import com.android.camera.ui.ZoomControllerListener;
+
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.BroadcastReceiver;
@@ -24,10 +31,10 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera.CameraInfo;
@@ -43,18 +50,16 @@ import android.media.ToneGenerator;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
-import android.os.Debug;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
-import android.os.SystemClock;
import android.provider.MediaStore;
import android.provider.Settings;
+import android.provider.MediaStore.Images.ImageColumns;
import android.util.AttributeSet;
import android.util.Log;
-import android.view.Display;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -69,15 +74,11 @@ import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.MenuItem.OnMenuItemClickListener;
+import android.widget.AdapterView;
+import android.widget.CursorAdapter;
import android.widget.FrameLayout;
-import android.widget.ImageView;
-
-import com.android.camera.gallery.IImage;
-import com.android.camera.gallery.IImageList;
-import com.android.camera.ui.CameraHeadUpDisplay;
-import com.android.camera.ui.GLRootView;
-import com.android.camera.ui.HeadUpDisplay;
-import com.android.camera.ui.ZoomControllerListener;
+import android.widget.ListView;
+import android.widget.AdapterView.OnItemClickListener;
import java.io.File;
import java.io.FileNotFoundException;
@@ -163,10 +164,14 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
private GLRootView mGLRootView;
- // mPostCaptureAlert, mLastPictureButton, mThumbController
- // are non-null only if isImageCaptureIntent() is true.
- private ImageView mLastPictureButton;
- private ThumbnailController mThumbController;
+ // The layouts of small devices have a thumbnail button, which shows the last
+ // captured picture.
+ private RotateImageView mThumbnailButton;
+ // The layouts of xlarge devices have a list of thumbnails, which show the
+ // last captured pictures.
+ private ListView mThumbnailList;
+ private OnItemClickListener mThumbnailItemClickListener =
+ new ThumbnailItemClickListener();
// mCropValue and mSaveUri are used only if isImageCaptureIntent() is true.
private String mCropValue;
@@ -323,14 +328,8 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
mContentResolver = getContentResolver();
if (!mIsImageCaptureIntent) {
findViewById(R.id.camera_switch).setOnClickListener(this);
- mLastPictureButton =
- (ImageView) findViewById(R.id.review_thumbnail);
- mLastPictureButton.setOnClickListener(this);
- mThumbController = new ThumbnailController(
- getResources(), mLastPictureButton, mContentResolver);
- mThumbController.loadData(ImageManager.getLastImageThumbPath());
- // Update last image thumbnail.
- updateThumbnailButton();
+ initThumbnailButton();
+ initThumbnailList();
}
// Initialize shutter button.
@@ -363,12 +362,82 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
});
}
+ private void initThumbnailButton() {
+ mThumbnailButton =
+ (RotateImageView) findViewById(R.id.review_thumbnail);
+ if (mThumbnailButton != null) {
+ mThumbnailButton.setOnClickListener(this);
+ mThumbnailButton.loadData(ImageManager.getLastImageThumbPath());
+ updateThumbnailButton();
+ }
+ }
+
private void updateThumbnailButton() {
+ if (mThumbnailButton == null) return;
// Update last image if URI is invalid and the storage is ready.
- if (!mThumbController.isUriValid() && mPicturesRemaining >= 0) {
- updateLastImage();
+ if (!mThumbnailButton.isUriValid() && mPicturesRemaining >= 0) {
+ IImageList list = ImageManager.makeImageList(
+ mContentResolver,
+ dataLocation(),
+ ImageManager.INCLUDE_IMAGES,
+ ImageManager.SORT_ASCENDING,
+ ImageManager.CAMERA_IMAGE_BUCKET_ID);
+ int count = list.getCount();
+ if (count > 0) {
+ IImage image = list.getImageAt(count - 1);
+ Uri uri = image.fullSizeImageUri();
+ mThumbnailButton.setData(uri, image.miniThumbBitmap());
+ } else {
+ mThumbnailButton.setData(null, null);
+ }
+ list.close();
+ }
+ }
+
+ private void setLastPictureThumb(byte[] data, int degree, Uri uri) {
+ if (mThumbnailButton == null) return;
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inSampleSize = 16;
+ Bitmap lastPictureThumb =
+ BitmapFactory.decodeByteArray(data, 0, data.length, options);
+ lastPictureThumb = Util.rotate(lastPictureThumb, degree);
+ mThumbnailButton.setData(uri, lastPictureThumb);
+ }
+
+ private void initThumbnailList() {
+ mThumbnailList = (ListView) findViewById(R.id.image_list);
+ if (mThumbnailList != null) {
+ int width = mThumbnailList.getWidth();
+ int height = mThumbnailList.getHeight();
+ int thumbnailCount = (height + mThumbnailList.getDividerHeight())
+ / (width + mThumbnailList.getDividerHeight());
+ Cursor cursor = getThumbnailsCursor(thumbnailCount);
+ ThumbnailAdapter adapter = new ThumbnailAdapter(
+ getApplicationContext(), R.layout.thumbnail_item, cursor,
+ true);
+ mThumbnailList.setAdapter(adapter);
+ mThumbnailList.setOnItemClickListener(mThumbnailItemClickListener);
}
- mThumbController.updateDisplayIfNeeded();
+ }
+
+ private void updateThumbnailList() {
+ if (mThumbnailList == null) return;
+ CursorAdapter adapter = (CursorAdapter) mThumbnailList.getAdapter();
+ Cursor cursor = adapter.getCursor();
+ cursor.requery();
+ adapter.notifyDataSetChanged();
+ }
+
+ private Cursor getThumbnailsCursor(int thumbnailCount) {
+ Log.v(TAG, "thumbnailCount=" + thumbnailCount);
+ String[] projections = { MediaStore.Images.Thumbnails._ID };
+ Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
+ .buildUpon()
+ .appendQueryParameter("limit", String.valueOf(thumbnailCount))
+ .build();
+ // TODO: managedQuery is deprecated.
+ return managedQuery(uri, projections, null, null,
+ ImageColumns._ID + " DESC");
}
// If the activity is paused and resumed, this method will be called in
@@ -486,6 +555,7 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
checkStorage();
if (!mIsImageCaptureIntent) {
updateThumbnailButton();
+ updateThumbnailList();
}
}
}
@@ -747,7 +817,7 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
"com.android.camera.NEW_PICTURE", mLastContentUri));
setLastPictureThumb(data, degree,
mImageCapture.getLastCaptureUri());
- mThumbController.updateDisplayIfNeeded();
+ updateThumbnailList();
} else {
mCaptureOnlyData = data;
showPostCaptureAlert();
@@ -863,15 +933,6 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
return true;
}
- private void setLastPictureThumb(byte[] data, int degree, Uri uri) {
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inSampleSize = 16;
- Bitmap lastPictureThumb =
- BitmapFactory.decodeByteArray(data, 0, data.length, options);
- lastPictureThumb = Util.rotate(lastPictureThumb, degree);
- mThumbController.setData(uri, lastPictureThumb);
- }
-
private String createName(long dateTaken) {
Date date = new Date(dateTaken);
SimpleDateFormat dateFormat = new SimpleDateFormat(
@@ -1058,8 +1119,10 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
}
private void setOrientationIndicator(int degree) {
- ((RotateImageView) findViewById(
- R.id.review_thumbnail)).setDegree(degree);
+ RotateImageView thumbnail = (RotateImageView) findViewById(
+ R.id.review_thumbnail);
+ if (thumbnail != null) thumbnail.setDegree(degree);
+
((RotateImageView) findViewById(
R.id.camera_switch_icon)).setDegree(degree);
((RotateImageView) findViewById(
@@ -1096,7 +1159,7 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
break;
case R.id.review_thumbnail:
if (isCameraIdle()) {
- viewLastImage();
+ viewImage(mThumbnailButton);
}
break;
case R.id.btn_done:
@@ -1107,6 +1170,12 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
}
}
+ private class ThumbnailItemClickListener implements OnItemClickListener {
+ public void onItemClick(AdapterView<?> p, View v, int pos, long id) {
+ viewImage((RotateImageView)v);
+ }
+ }
+
private Bitmap createCaptureBitmap(byte[] data) {
// This is really stupid...we just want to read the orientation in
// the jpeg header.
@@ -1341,8 +1410,10 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
if (mFirstTimeInitialized) {
mOrientationListener.disable();
if (!mIsImageCaptureIntent) {
- mThumbController.storeData(
- ImageManager.getLastImageThumbPath());
+ if (mThumbnailButton != null) {
+ mThumbnailButton.storeData(
+ ImageManager.getLastImageThumbPath());
+ }
}
hidePostCaptureAlert();
}
@@ -1605,24 +1676,6 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
}
}
- private void updateLastImage() {
- IImageList list = ImageManager.makeImageList(
- mContentResolver,
- dataLocation(),
- ImageManager.INCLUDE_IMAGES,
- ImageManager.SORT_ASCENDING,
- ImageManager.CAMERA_IMAGE_BUCKET_ID);
- int count = list.getCount();
- if (count > 0) {
- IImage image = list.getImageAt(count - 1);
- Uri uri = image.fullSizeImageUri();
- mThumbController.setData(uri, image.miniThumbBitmap());
- } else {
- mThumbController.setData(null, null);
- }
- list.close();
- }
-
private void showCameraErrorAndFinish() {
Resources ress = getResources();
Util.showFatalErrorAndFinish(Camera.this,
@@ -1686,53 +1739,6 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
clearFocusState();
}
- private Size getOptimalPreviewSize(List<Size> sizes, double targetRatio) {
- final double ASPECT_TOLERANCE = 0.05;
- if (sizes == null) return null;
-
- Size optimalSize = null;
- double minDiff = Double.MAX_VALUE;
-
- // Because of bugs of overlay and layout, we sometimes will try to
- // layout the viewfinder in the portrait orientation and thus get the
- // wrong size of mSurfaceView. When we change the preview size, the
- // new overlay will be created before the old one closed, which causes
- // an exception. For now, just get the screen size
-
- Display display = getWindowManager().getDefaultDisplay();
- int targetHeight = Math.min(display.getHeight(), display.getWidth());
-
- if (targetHeight <= 0) {
- // We don't know the size of SurefaceView, use screen height
- WindowManager windowManager = (WindowManager)
- getSystemService(Context.WINDOW_SERVICE);
- targetHeight = windowManager.getDefaultDisplay().getHeight();
- }
-
- // Try to find an size match aspect ratio and size
- for (Size size : sizes) {
- double ratio = (double) size.width / size.height;
- if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
- if (Math.abs(size.height - targetHeight) < minDiff) {
- optimalSize = size;
- minDiff = Math.abs(size.height - targetHeight);
- }
- }
-
- // Cannot find the one match the aspect ratio, ignore the requirement
- if (optimalSize == null) {
- Log.v(TAG, "No preview size match the aspect ratio");
- minDiff = Double.MAX_VALUE;
- for (Size size : sizes) {
- if (Math.abs(size.height - targetHeight) < minDiff) {
- optimalSize = size;
- minDiff = Math.abs(size.height - targetHeight);
- }
- }
- }
- return optimalSize;
- }
-
private static boolean isSupported(String value, List<String> supported) {
return supported == null ? false : supported.indexOf(value) >= 0;
}
@@ -1776,7 +1782,7 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
// Set a preview size that is closest to the viewfinder height and has
// the right aspect ratio.
List<Size> sizes = mParameters.getSupportedPreviewSizes();
- Size optimalSize = getOptimalPreviewSize(
+ Size optimalSize = Util.getOptimalPreviewSize(this,
sizes, (double) size.width / size.height);
if (optimalSize != null) {
Size original = mParameters.getPreviewSize();
@@ -1940,21 +1946,22 @@ public class Camera extends NoSearchActivity implements View.OnClickListener,
MenuHelper.gotoCameraImageGallery(this);
}
- private void viewLastImage() {
- if (mThumbController.isUriValid()) {
- Intent intent = new Intent(Util.REVIEW_ACTION, mThumbController.getUri());
+ private void viewImage(RotateImageView view) {
+ if(!view.isUriValid()) {
+ Log.e(TAG, "Uri invalid. uri=" + view.getUri());
+ return;
+ }
+
+ try {
+ startActivity(new Intent(
+ Util.REVIEW_ACTION, view.getUri()));
+ } catch (ActivityNotFoundException ex) {
try {
- startActivity(intent);
- } catch (ActivityNotFoundException ex) {
- try {
- intent = new Intent(Intent.ACTION_VIEW, mThumbController.getUri());
- startActivity(intent);
- } catch (ActivityNotFoundException e) {
- Log.e(TAG, "review image fail", e);
- }
+ startActivity(new Intent(
+ Intent.ACTION_VIEW, view.getUri()));
+ } catch (ActivityNotFoundException e) {
+ Log.e(TAG, "review image fail. uri=" + view.getUri(), e);
}
- } else {
- Log.e(TAG, "Can't view last image.");
}
}
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index 2c6bdf1..cde3d9d 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -39,6 +39,8 @@ public class CameraSettings {
public static final String KEY_LOCAL_VERSION = "pref_local_version_key";
public static final String KEY_RECORD_LOCATION = RecordLocationPreference.KEY;
public static final String KEY_VIDEO_QUALITY = "pref_video_quality_key";
+ public static final String KEY_VIDEO_TIME_LAPSE_QUALITY = "pref_video_time_lapse_quality_key";
+ public static final String KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL = "pref_video_time_lapse_frame_interval_key";
public static final String KEY_PICTURE_SIZE = "pref_camera_picturesize_key";
public static final String KEY_JPEG_QUALITY = "pref_camera_jpegquality_key";
public static final String KEY_FOCUS_MODE = "pref_camera_focusmode_key";
@@ -133,6 +135,7 @@ public class CameraSettings {
private void initPreference(PreferenceGroup group) {
ListPreference videoQuality = group.findPreference(KEY_VIDEO_QUALITY);
+ ListPreference videoTimeLapseQuality = group.findPreference(KEY_VIDEO_TIME_LAPSE_QUALITY);
ListPreference pictureSize = group.findPreference(KEY_PICTURE_SIZE);
ListPreference whiteBalance = group.findPreference(KEY_WHITE_BALANCE);
ListPreference colorEffect = group.findPreference(KEY_COLOR_EFFECT);
@@ -163,6 +166,9 @@ public class CameraSettings {
}
// Filter out unsupported settings / options
+ if (videoTimeLapseQuality != null) {
+ filterUnsupportedOptions(group, videoTimeLapseQuality, getSupportedTimeLapseProfiles());
+ }
if (pictureSize != null) {
filterUnsupportedOptions(group, pictureSize, sizeListToStringList(
mParameters.getSupportedPictureSizes()));
@@ -195,6 +201,21 @@ public class CameraSettings {
if (cameraId != null) buildCameraId(group, cameraId);
}
+ private static List<String> getSupportedTimeLapseProfiles() {
+ ArrayList<String> supportedProfiles = new ArrayList<String>();
+ if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_480P)) {
+ supportedProfiles.add(Integer.toString(CamcorderProfile.QUALITY_TIME_LAPSE_480P));
+ }
+ if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_720P)) {
+ supportedProfiles.add(Integer.toString(CamcorderProfile.QUALITY_TIME_LAPSE_720P));
+ }
+ if (CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_TIME_LAPSE_1080P)) {
+ supportedProfiles.add(Integer.toString(CamcorderProfile.QUALITY_TIME_LAPSE_1080P));
+ }
+
+ return supportedProfiles;
+ }
+
private void buildExposureCompensation(
PreferenceGroup group, ListPreference exposure) {
int max = mParameters.getMaxExposureCompensation();
diff --git a/src/com/android/camera/IconListPreference.java b/src/com/android/camera/IconListPreference.java
index fc23f6c..de9cba1 100644
--- a/src/com/android/camera/IconListPreference.java
+++ b/src/com/android/camera/IconListPreference.java
@@ -77,15 +77,18 @@ public class IconListPreference extends ListPreference {
IntArray iconIds = new IntArray();
IntArray largeIconIds = new IntArray();
+ // We allow mIconsIds to be null, but not mLargeIconIds. The reason is that if large icons
+ // are unspecified, the on screen icons will be blank which is a bug.
for (int i = 0, len = entryValues.length; i < len; i++) {
if (supported.indexOf(entryValues[i].toString()) >= 0) {
- iconIds.add(mIconIds[i]);
+ if (mIconIds != null) {
+ iconIds.add(mIconIds[i]);
+ }
largeIconIds.add(mLargeIconIds[i]);
}
}
- int size = iconIds.size();
- mIconIds = iconIds.toArray(new int[size]);
- mLargeIconIds = iconIds.toArray(new int[size]);
+ if (mIconIds != null) mIconIds = iconIds.toArray(new int[iconIds.size()]);
+ mLargeIconIds = largeIconIds.toArray(new int[largeIconIds.size()]);
super.filterUnsupported(supported);
}
}
diff --git a/src/com/android/camera/MenuHelper.java b/src/com/android/camera/MenuHelper.java
index 629cf87..a90726b 100644
--- a/src/com/android/camera/MenuHelper.java
+++ b/src/com/android/camera/MenuHelper.java
@@ -57,6 +57,7 @@ public class MenuHelper {
public static final int POSITION_SWITCH_CAMERA_MODE = 1;
public static final int POSITION_GOTO_GALLERY = 2;
public static final int POSITION_SWITCH_CAMERA_ID = 3;
+ public static final int POSITION_SWITCH_TIME_LAPSE_MODE = 4;
public static final int NO_STORAGE_ERROR = -1;
public static final int CANNOT_STAT_ERROR = -2;
diff --git a/src/com/android/camera/RotateImageView.java b/src/com/android/camera/RotateImageView.java
index 40fd007..57a7f13 100644
--- a/src/com/android/camera/RotateImageView.java
+++ b/src/com/android/camera/RotateImageView.java
@@ -17,13 +17,30 @@
package com.android.camera;
import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.Canvas;
-import android.graphics.Rect;
+import android.graphics.drawable.TransitionDrawable;
+import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.Rect;
+import android.media.ThumbnailUtils;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.animation.AnimationUtils;
+import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
/**
* A @{code ImageView} which can rotate it's content.
*/
@@ -38,15 +55,21 @@ public class RotateImageView extends ImageView {
private int mStartDegree = 0;
private int mTargetDegree = 0;
- private boolean mClockwise = false;
+ private boolean mClockwise = false, mEnableAnimation = true;
private long mAnimationStartTime = 0;
private long mAnimationEndTime = 0;
+ private Uri mUri;
+
public RotateImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
+ public void enableAnimation(boolean enable) {
+ mEnableAnimation = enable;
+ }
+
public void setDegree(int degree) {
// make sure in the range of [0, 359]
degree = degree >= 0 ? degree % 360 : degree % 360 + 360;
@@ -72,7 +95,6 @@ public class RotateImageView extends ImageView {
@Override
protected void onDraw(Canvas canvas) {
-
Drawable drawable = getDrawable();
if (drawable == null) return;
@@ -110,4 +132,123 @@ public class RotateImageView extends ImageView {
drawable.draw(canvas);
canvas.restoreToCount(saveCount);
}
+
+ private Bitmap mThumb;
+ private Drawable[] mThumbs;
+ private TransitionDrawable mThumbTransition;
+
+ public void setData(Uri uri, Bitmap original) {
+ // Make sure uri and original are consistently both null or both
+ // non-null.
+ if (uri == null || original == null) {
+ uri = null;
+ original = null;
+ }
+ mUri = uri;
+ updateThumb(original);
+ }
+
+ public Uri getUri() {
+ return mUri;
+ }
+
+ private static final int BUFSIZE = 4096;
+
+ // Stores the data from the specified file.
+ // Returns true for success.
+ public boolean storeData(String filePath) {
+ if (mUri == null) {
+ return false;
+ }
+
+ FileOutputStream f = null;
+ BufferedOutputStream b = null;
+ DataOutputStream d = null;
+ try {
+ f = new FileOutputStream(filePath);
+ b = new BufferedOutputStream(f, BUFSIZE);
+ d = new DataOutputStream(b);
+ d.writeUTF(mUri.toString());
+ mThumb.compress(Bitmap.CompressFormat.PNG, 100, d);
+ d.close();
+ } catch (IOException e) {
+ return false;
+ } finally {
+ MenuHelper.closeSilently(f);
+ MenuHelper.closeSilently(b);
+ MenuHelper.closeSilently(d);
+ }
+ return true;
+ }
+
+ // Loads the data from the specified file.
+ // Returns true for success.
+ public boolean loadData(String filePath) {
+ FileInputStream f = null;
+ BufferedInputStream b = null;
+ DataInputStream d = null;
+ try {
+ f = new FileInputStream(filePath);
+ b = new BufferedInputStream(f, BUFSIZE);
+ d = new DataInputStream(b);
+ Uri uri = Uri.parse(d.readUTF());
+ Bitmap thumb = BitmapFactory.decodeStream(d);
+ setData(uri, thumb);
+ d.close();
+ } catch (IOException e) {
+ return false;
+ } finally {
+ MenuHelper.closeSilently(f);
+ MenuHelper.closeSilently(b);
+ MenuHelper.closeSilently(d);
+ }
+ return true;
+ }
+
+ private void updateThumb(Bitmap original) {
+ if (original == null) {
+ mThumb = null;
+ mThumbs = null;
+ setImageDrawable(null);
+ return;
+ }
+
+ LayoutParams param = getLayoutParams();
+ final int miniThumbWidth = param.width
+ - getPaddingLeft() - getPaddingRight();
+ final int miniThumbHeight = param.height
+ - getPaddingTop() - getPaddingBottom();
+ mThumb = ThumbnailUtils.extractThumbnail(
+ original, miniThumbWidth, miniThumbHeight);
+ Drawable drawable;
+ if (mThumbs == null || !mEnableAnimation) {
+ mThumbs = new Drawable[2];
+ mThumbs[1] = new BitmapDrawable(getContext().getResources(), mThumb);
+ setImageDrawable(mThumbs[1]);
+ } else {
+ mThumbs[0] = mThumbs[1];
+ mThumbs[1] = new BitmapDrawable(getContext().getResources(), mThumb);
+ mThumbTransition = new TransitionDrawable(mThumbs);
+ setImageDrawable(mThumbTransition);
+ mThumbTransition.startTransition(500);
+ }
+ }
+
+ public boolean isUriValid() {
+ if (mUri == null) {
+ return false;
+ }
+ try {
+ ParcelFileDescriptor pfd =
+ getContext().getContentResolver().openFileDescriptor(mUri, "r");
+ if (pfd == null) {
+ Log.e(TAG, "Fail to open URI. URI=" + mUri);
+ return false;
+ }
+ pfd.close();
+ } catch (IOException ex) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/src/com/android/camera/ThumbnailAdapter.java b/src/com/android/camera/ThumbnailAdapter.java
new file mode 100644
index 0000000..31d3e02
--- /dev/null
+++ b/src/com/android/camera/ThumbnailAdapter.java
@@ -0,0 +1,77 @@
+/*
+ * 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.camera;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.provider.MediaStore;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ResourceCursorAdapter;
+import android.util.Log;
+
+public class ThumbnailAdapter extends ResourceCursorAdapter {
+ private final String TAG = "ThumbnailAdapter";
+ private int idIndex;
+ private boolean mIsImage;
+ public ThumbnailAdapter(Context context, int layout, Cursor c,
+ boolean isImage) {
+ super(context, layout, c, false);
+ mIsImage = isImage;
+ if (mIsImage) {
+ idIndex = c.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
+ } else {
+ idIndex = c.getColumnIndexOrThrow(MediaStore.Video.Thumbnails._ID);
+ }
+ }
+
+ @Override
+ public void bindView(View view, Context context, Cursor cursor) {
+ int id = cursor.getInt(idIndex);
+ Bitmap b;
+ Uri uri;
+ RotateImageView v = (RotateImageView) view;
+ if (mIsImage) {
+ uri = Uri.withAppendedPath(
+ MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id);
+ if (!uri.equals(v.getUri())) {
+ b = MediaStore.Images.Thumbnails.getThumbnail(
+ context.getContentResolver(), id,
+ MediaStore.Images.Thumbnails.MINI_KIND, null);
+ v.setData(uri, b);
+ }
+ } else {
+ uri = Uri.withAppendedPath(
+ MediaStore.Video.Media.EXTERNAL_CONTENT_URI, "" + id);
+ if (!uri.equals(v.getUri())) {
+ b = MediaStore.Video.Thumbnails.getThumbnail(
+ context.getContentResolver(), id,
+ MediaStore.Video.Thumbnails.MINI_KIND, null);
+ v.setData(uri, b);
+ }
+ }
+ }
+
+ @Override
+ public View newView(Context context, Cursor cursor, ViewGroup parent) {
+ View view = super.newView(context, cursor, parent);
+ ((RotateImageView)view).enableAnimation(false);
+ return view;
+ }
+}
diff --git a/src/com/android/camera/ThumbnailController.java b/src/com/android/camera/ThumbnailController.java
deleted file mode 100644
index 6b67cb0..0000000
--- a/src/com/android/camera/ThumbnailController.java
+++ /dev/null
@@ -1,195 +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.camera;
-
-
-import android.content.ContentResolver;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.TransitionDrawable;
-import android.media.ThumbnailUtils;
-import android.net.Uri;
-import android.os.ParcelFileDescriptor;
-import android.util.Log;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.ImageView;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-/**
- * A controller shows thumbnail picture on a button. The thumbnail picture
- * corresponds to a URI of the original picture/video. The thumbnail bitmap
- * and the URI can be saved to a file (and later loaded from it).
- */
-public class ThumbnailController {
-
- @SuppressWarnings("unused")
- private static final String TAG = "ThumbnailController";
- private final ContentResolver mContentResolver;
- private Uri mUri;
- private Bitmap mThumb;
- private final ImageView mButton;
- private Drawable[] mThumbs;
- private TransitionDrawable mThumbTransition;
- private boolean mShouldAnimateThumb;
- private final Resources mResources;
-
- // The "frame" is a drawable we want to put on top of the thumbnail.
- public ThumbnailController(Resources resources,
- ImageView button, ContentResolver contentResolver) {
- mResources = resources;
- mButton = button;
- mContentResolver = contentResolver;
- }
-
- public void setData(Uri uri, Bitmap original) {
- // Make sure uri and original are consistently both null or both
- // non-null.
- if (uri == null || original == null) {
- uri = null;
- original = null;
- }
- mUri = uri;
- updateThumb(original);
- }
-
- public Uri getUri() {
- return mUri;
- }
-
- private static final int BUFSIZE = 4096;
-
- // Stores the data from the specified file.
- // Returns true for success.
- public boolean storeData(String filePath) {
- if (mUri == null) {
- return false;
- }
-
- FileOutputStream f = null;
- BufferedOutputStream b = null;
- DataOutputStream d = null;
- try {
- f = new FileOutputStream(filePath);
- b = new BufferedOutputStream(f, BUFSIZE);
- d = new DataOutputStream(b);
- d.writeUTF(mUri.toString());
- mThumb.compress(Bitmap.CompressFormat.PNG, 100, d);
- d.close();
- } catch (IOException e) {
- return false;
- } finally {
- MenuHelper.closeSilently(f);
- MenuHelper.closeSilently(b);
- MenuHelper.closeSilently(d);
- }
- return true;
- }
-
- // Loads the data from the specified file.
- // Returns true for success.
- public boolean loadData(String filePath) {
- FileInputStream f = null;
- BufferedInputStream b = null;
- DataInputStream d = null;
- try {
- f = new FileInputStream(filePath);
- b = new BufferedInputStream(f, BUFSIZE);
- d = new DataInputStream(b);
- Uri uri = Uri.parse(d.readUTF());
- Bitmap thumb = BitmapFactory.decodeStream(d);
- setData(uri, thumb);
- d.close();
- } catch (IOException e) {
- return false;
- } finally {
- MenuHelper.closeSilently(f);
- MenuHelper.closeSilently(b);
- MenuHelper.closeSilently(d);
- }
- return true;
- }
-
- public void updateDisplayIfNeeded() {
- if (mUri == null) {
- mButton.setImageDrawable(null);
- return;
- }
-
- if (mShouldAnimateThumb) {
- mThumbTransition.startTransition(500);
- mShouldAnimateThumb = false;
- }
- }
-
- private void updateThumb(Bitmap original) {
- if (original == null) {
- mThumb = null;
- mThumbs = null;
- return;
- }
-
- LayoutParams param = mButton.getLayoutParams();
- final int miniThumbWidth = param.width
- - mButton.getPaddingLeft() - mButton.getPaddingRight();
- final int miniThumbHeight = param.height
- - mButton.getPaddingTop() - mButton.getPaddingBottom();
- mThumb = ThumbnailUtils.extractThumbnail(
- original, miniThumbWidth, miniThumbHeight);
- Drawable drawable;
- if (mThumbs == null) {
- mThumbs = new Drawable[2];
- mThumbs[1] = new BitmapDrawable(mResources, mThumb);
- drawable = mThumbs[1];
- mShouldAnimateThumb = false;
- } else {
- mThumbs[0] = mThumbs[1];
- mThumbs[1] = new BitmapDrawable(mResources, mThumb);
- mThumbTransition = new TransitionDrawable(mThumbs);
- drawable = mThumbTransition;
- mShouldAnimateThumb = true;
- }
- mButton.setImageDrawable(drawable);
- }
-
- public boolean isUriValid() {
- if (mUri == null) {
- return false;
- }
- try {
- ParcelFileDescriptor pfd =
- mContentResolver.openFileDescriptor(mUri, "r");
- if (pfd == null) {
- Log.e(TAG, "Fail to open URI.");
- return false;
- }
- pfd.close();
- } catch (IOException ex) {
- return false;
- }
- return true;
- }
-}
diff --git a/src/com/android/camera/Util.java b/src/com/android/camera/Util.java
index adf9152..2bff219 100644
--- a/src/com/android/camera/Util.java
+++ b/src/com/android/camera/Util.java
@@ -16,22 +16,24 @@
package com.android.camera;
+import com.android.camera.gallery.IImage;
+
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
+import android.hardware.Camera.Size;
import android.util.Log;
+import android.view.Display;
import android.view.Surface;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
-import com.android.camera.gallery.IImage;
-import com.android.camera.R;
-
import java.io.Closeable;
+import java.util.List;
/**
* Collection of utility functions used in this package.
@@ -43,7 +45,7 @@ public class Util {
public static final int DIRECTION_UP = 2;
public static final int DIRECTION_DOWN = 3;
- public static final String REVIEW_ACTION = "com.cooliris.media.action.REVIEW";
+ public static final String REVIEW_ACTION = "com.android.camera.action.REVIEW";
private Util() {
}
@@ -301,4 +303,50 @@ public class Util {
int result = (info.orientation - degrees + 360) % 360;
camera.setDisplayOrientation(result);
}
+
+ public static Size getOptimalPreviewSize(Activity currentActivity,
+ List<Size> sizes, double targetRatio) {
+ final double ASPECT_TOLERANCE = 0.05;
+ if (sizes == null) return null;
+
+ Size optimalSize = null;
+ double minDiff = Double.MAX_VALUE;
+
+ // Because of bugs of overlay and layout, we sometimes will try to
+ // layout the viewfinder in the portrait orientation and thus get the
+ // wrong size of mSurfaceView. When we change the preview size, the
+ // new overlay will be created before the old one closed, which causes
+ // an exception. For now, just get the screen size
+
+ Display display = currentActivity.getWindowManager().getDefaultDisplay();
+ int targetHeight = Math.min(display.getHeight(), display.getWidth());
+
+ if (targetHeight <= 0) {
+ // We don't know the size of SurfaceView, use screen height
+ targetHeight = display.getHeight();
+ }
+
+ // Try to find an size match aspect ratio and size
+ for (Size size : sizes) {
+ double ratio = (double) size.width / size.height;
+ if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
+ if (Math.abs(size.height - targetHeight) < minDiff) {
+ optimalSize = size;
+ minDiff = Math.abs(size.height - targetHeight);
+ }
+ }
+
+ // Cannot find the one match the aspect ratio, ignore the requirement
+ if (optimalSize == null) {
+ Log.v(TAG, "No preview size match the aspect ratio");
+ minDiff = Double.MAX_VALUE;
+ for (Size size : sizes) {
+ if (Math.abs(size.height - targetHeight) < minDiff) {
+ optimalSize = size;
+ minDiff = Math.abs(size.height - targetHeight);
+ }
+ }
+ }
+ return optimalSize;
+ }
}
diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java
index a92e33c..fb71b6a 100644
--- a/src/com/android/camera/VideoCamera.java
+++ b/src/com/android/camera/VideoCamera.java
@@ -33,6 +33,7 @@ import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.hardware.Camera.Parameters;
@@ -50,9 +51,11 @@ import android.os.Message;
import android.os.StatFs;
import android.os.SystemClock;
import android.provider.MediaStore;
-import android.provider.Settings;
import android.provider.MediaStore.Video;
+import android.provider.MediaStore.Video.VideoColumns;
+import android.provider.Settings;
import android.util.Log;
+import android.view.Display;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -66,8 +69,12 @@ import android.view.WindowManager;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.CursorAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
+import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
@@ -130,13 +137,19 @@ public class VideoCamera extends NoSearchActivity
private ImageView mVideoFrame;
private GLRootView mGLRootView;
private CamcorderHeadUpDisplay mHeadUpDisplay;
+ private MenuItem mSwitchTimeLapseMenuItem;
private boolean mIsVideoCaptureIntent;
private boolean mQuickCapture;
- // mLastPictureButton and mThumbController
- // are non-null only if mIsVideoCaptureIntent is true.
- private ImageView mLastPictureButton;
- private ThumbnailController mThumbController;
+
+ // The layout of small devices has a thumbnail button, which shows the last
+ // captured picture.
+ private RotateImageView mThumbnailButton;
+ // The layout of xlarge devices have a list of thumbnails, which show the
+ // last captured pictures.
+ private ListView mThumbnailList;
+ private OnItemClickListener mThumbnailItemClickListener =
+ new ThumbnailItemClickListener();
private boolean mStartPreviewFail = false;
private int mStorageStatus = STORAGE_STATUS_OK;
@@ -160,6 +173,13 @@ public class VideoCamera extends NoSearchActivity
// The video duration limit. 0 menas no limit.
private int mMaxVideoDurationInMs;
+ // Time Lapse parameters.
+ private boolean mCaptureTimeLapse = false;
+ private int mTimeBetweenTimeLapseFrameCaptureMs = 2000;
+
+ private int mDesiredPreviewWidth;
+ private int mDesiredPreviewHeight;
+
boolean mPausing = false;
boolean mPreviewing = false; // True if preview is started.
@@ -339,12 +359,7 @@ public class VideoCamera extends NoSearchActivity
if (!mIsVideoCaptureIntent) {
View controlBar = inflater.inflate(
R.layout.camera_control, rootView);
- mLastPictureButton =
- (ImageView) controlBar.findViewById(R.id.review_thumbnail);
- mThumbController = new ThumbnailController(
- getResources(), mLastPictureButton, mContentResolver);
- mLastPictureButton.setOnClickListener(this);
- mThumbController.loadData(ImageManager.getLastVideoThumbPath());
+ initThumbnailButton();
mSwitcher = ((Switcher) findViewById(R.id.camera_switch));
mSwitcher.setOnSwitchListener(this);
mSwitcher.addTouchView(findViewById(R.id.camera_switch_set));
@@ -402,12 +417,11 @@ public class VideoCamera extends NoSearchActivity
CameraSettings settings = new CameraSettings(this, mParameters,
CameraHolder.instance().getCameraInfo());
- PreferenceGroup group =
- settings.getPreferenceGroup(R.xml.video_preferences);
+ PreferenceGroup group = settings.getPreferenceGroup(R.xml.video_preferences);
if (mIsVideoCaptureIntent) {
group = filterPreferenceScreenByIntent(group);
}
- mHeadUpDisplay.initialize(this, group);
+ mHeadUpDisplay.initialize(this, group, mCaptureTimeLapse);
}
private void attachHeadUpDisplay() {
@@ -452,10 +466,11 @@ public class VideoCamera extends NoSearchActivity
doReturnToCaller(true);
break;
case R.id.btn_cancel:
- stopVideoRecordingAndReturn(false);
+ stopVideoRecording();
+ doReturnToCaller(false);
break;
case R.id.review_thumbnail:
- if (!mMediaRecorderRecording) viewLastVideo();
+ if (!mMediaRecorderRecording) viewVideo(mThumbnailButton);
break;
}
}
@@ -465,14 +480,15 @@ public class VideoCamera extends NoSearchActivity
}
private void onStopVideoRecording(boolean valid) {
+ stopVideoRecording();
if (mIsVideoCaptureIntent) {
if (mQuickCapture) {
- stopVideoRecordingAndReturn(valid);
+ doReturnToCaller(valid);
} else {
- stopVideoRecordingAndShowAlert();
+ showAlert();
}
} else {
- stopVideoRecordingAndGetThumbnail();
+ getThumbnail();
initializeRecorder();
}
}
@@ -500,7 +516,8 @@ public class VideoCamera extends NoSearchActivity
private void discardCurrentVideoAndInitRecorder() {
deleteCurrentVideo();
- hideAlertAndInitializeRecorder();
+ hideAlert();
+ mHandler.sendEmptyMessage(INIT_RECORDER);
}
private OnScreenHint mStorageHint;
@@ -548,7 +565,39 @@ public class VideoCamera extends NoSearchActivity
: STORAGE_STATUS_OK;
}
+ private void readTimeLapseVideoPreferences() {
+ // Read CamcorderProfile quality.
+ String qualityStr = mPreferences.getString(
+ CameraSettings.KEY_VIDEO_TIME_LAPSE_QUALITY,
+ getString(R.string.pref_video_time_lapse_quality_default));
+ mProfile = CamcorderProfile.get(mCameraId, Integer.parseInt(qualityStr));
+
+ // Read interval between frame capture.
+ String frameIntervalStr = mPreferences.getString(
+ CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL,
+ getString(R.string.pref_video_time_lapse_frame_interval_default));
+ mTimeBetweenTimeLapseFrameCaptureMs = Integer.parseInt(frameIntervalStr);
+
+ mMaxVideoDurationInMs = 0; // No limit
+
+ // Time lapse mode can capture video (using the still camera) at resolutions
+ // higher than the supported preview sizes. In that case
+ // mProfile.{videoFrameWidth,videoFrameHeight} will correspond to an unsupported
+ // preview size. So choose preview size optimally from the supported preview
+ // sizes.
+ List<Size> sizes = mParameters.getSupportedPreviewSizes();
+ Size optimalSize = Util.getOptimalPreviewSize(this,
+ sizes, (double) mProfile.videoFrameWidth / mProfile.videoFrameHeight);
+ mDesiredPreviewWidth = optimalSize.width;
+ mDesiredPreviewHeight = optimalSize.height;
+ }
+
private void readVideoPreferences() {
+ if (mCaptureTimeLapse) {
+ readTimeLapseVideoPreferences();
+ return;
+ }
+
String quality = mPreferences.getString(
CameraSettings.KEY_VIDEO_QUALITY,
CameraSettings.DEFAULT_VIDEO_QUALITY_VALUE);
@@ -577,6 +626,9 @@ public class VideoCamera extends NoSearchActivity
videoQualityHigh
? CamcorderProfile.QUALITY_HIGH
: CamcorderProfile.QUALITY_LOW);
+
+ mDesiredPreviewWidth = mProfile.videoFrameWidth;
+ mDesiredPreviewHeight = mProfile.videoFrameHeight;
}
private void resizeForPreviewAspectRatio() {
@@ -620,6 +672,13 @@ public class VideoCamera extends NoSearchActivity
}
changeHeadUpDisplayState();
+ // Update the last video thumbnail.
+ if (!mIsVideoCaptureIntent) {
+ if (mThumbnailButton != null && !mThumbnailButton.isUriValid()) {
+ updateThumbnailButton();
+ }
+ updateThumbnailList();
+ }
}
private void setPreviewDisplay(SurfaceHolder holder) {
@@ -677,17 +736,7 @@ public class VideoCamera extends NoSearchActivity
mPreviewing = false;
}
- @Override
- protected void onPause() {
- super.onPause();
- mPausing = true;
-
- changeHeadUpDisplayState();
-
- // Hide the preview now. Otherwise, the preview may be rotated during
- // onPause and it is annoying to users.
- mVideoPreview.setVisibility(View.INVISIBLE);
-
+ private void finishRecorderAndCloseCamera() {
// This is similar to what mShutterButton.performClick() does,
// but not quite the same.
if (mMediaRecorderRecording) {
@@ -695,12 +744,27 @@ public class VideoCamera extends NoSearchActivity
stopVideoRecording();
showAlert();
} else {
- stopVideoRecordingAndGetThumbnail();
+ stopVideoRecording();
+ getThumbnail();
}
} else {
stopVideoRecording();
}
closeCamera();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mPausing = true;
+
+ changeHeadUpDisplayState();
+
+ // Hide the preview now. Otherwise, the preview may be rotated during
+ // onPause and it is annoying to users.
+ mVideoPreview.setVisibility(View.INVISIBLE);
+
+ finishRecorderAndCloseCamera();
if (mReceiver != null) {
unregisterReceiver(mReceiver);
@@ -708,8 +772,8 @@ public class VideoCamera extends NoSearchActivity
}
resetScreenOn();
- if (!mIsVideoCaptureIntent) {
- mThumbController.storeData(ImageManager.getLastVideoThumbPath());
+ if (!mIsVideoCaptureIntent && mThumbnailButton != null) {
+ mThumbnailButton.storeData(ImageManager.getLastVideoThumbPath());
}
if (mStorageHint != null) {
@@ -808,6 +872,7 @@ public class VideoCamera extends NoSearchActivity
setPreviewDisplay(holder);
mCameraDevice.unlock();
mHandler.sendEmptyMessage(INIT_RECORDER);
+ initThumbnailList();
} else {
stopVideoRecording();
// If video quality changes, the surface will change. But we need to
@@ -928,10 +993,17 @@ public class VideoCamera extends NoSearchActivity
mMediaRecorder = new MediaRecorder();
mMediaRecorder.setCamera(mCameraDevice);
- mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+ if (!mCaptureTimeLapse) {
+ mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
+ }
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setProfile(mProfile);
- mMediaRecorder.setMaxDuration(mMaxVideoDurationInMs);
+ if (mMaxVideoDurationInMs != 0) {
+ mMediaRecorder.setMaxDuration(mMaxVideoDurationInMs);
+ }
+ if (mCaptureTimeLapse) {
+ mMediaRecorder.setCaptureRate((1000 / (double) mTimeBetweenTimeLapseFrameCaptureMs));
+ }
// Set output file.
if (mStorageStatus != STORAGE_STATUS_OK) {
@@ -980,14 +1052,6 @@ public class VideoCamera extends NoSearchActivity
throw new RuntimeException(e);
}
mMediaRecorderRecording = false;
-
- // Update the last video thumbnail.
- if (!mIsVideoCaptureIntent) {
- if (!mThumbController.isUriValid()) {
- updateLastVideo();
- }
- mThumbController.updateDisplayIfNeeded();
- }
}
private void releaseMediaRecorder() {
@@ -1059,6 +1123,14 @@ public class VideoCamera extends NoSearchActivity
}
}
+ private void setTimeLapseSwitchTitle(boolean enableTimeLapse) {
+ int labelId = enableTimeLapse
+ ? R.string.enable_time_lapse_mode
+ : R.string.disable_time_lapse_mode;
+
+ mSwitchTimeLapseMenuItem.setTitle(labelId);
+ }
+
private void addBaseMenuItems(Menu menu) {
MenuHelper.addSwitchModeMenuItem(menu, false, new Runnable() {
public void run() {
@@ -1089,6 +1161,45 @@ public class VideoCamera extends NoSearchActivity
}
}).setIcon(android.R.drawable.ic_menu_camera);
}
+
+ mSwitchTimeLapseMenuItem = menu.add(Menu.NONE, Menu.NONE,
+ MenuHelper.POSITION_SWITCH_TIME_LAPSE_MODE,
+ R.string.enable_time_lapse_mode)
+ .setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ switchTimeLapseMode();
+ return true;
+ }
+ }).setIcon(android.R.drawable.ic_menu_camera);
+ }
+
+ private void switchTimeLapseMode() {
+ mCaptureTimeLapse = !mCaptureTimeLapse;
+
+ finishRecorderAndCloseCamera();
+ mHandler.removeMessages(INIT_RECORDER);
+
+ // Read the video preferences
+ readVideoPreferences();
+ resetCameraParameters();
+
+ // Restart preview
+ try {
+ startPreview();
+ } catch (CameraHardwareException e) {
+ showCameraErrorAndFinish();
+ return;
+ }
+
+ // Reload the UI.
+ initializeHeadUpDisplay();
+
+ if (mSurfaceHolder != null) {
+ mHandler.sendEmptyMessage(INIT_RECORDER);
+ }
+
+ // Change menu
+ setTimeLapseSwitchTitle(!mCaptureTimeLapse);
}
private void switchCameraId(int cameraId) {
@@ -1096,19 +1207,7 @@ public class VideoCamera extends NoSearchActivity
mCameraId = cameraId;
CameraSettings.writePreferredCameraId(mPreferences, cameraId);
- // This is similar to what mShutterButton.performClick() does,
- // but not quite the same.
- if (mMediaRecorderRecording) {
- if (mIsVideoCaptureIntent) {
- stopVideoRecording();
- showAlert();
- } else {
- stopVideoRecordingAndGetThumbnail();
- }
- } else {
- stopVideoRecording();
- }
- closeCamera();
+ finishRecorderAndCloseCamera();
mHandler.removeMessages(INIT_RECORDER);
// Reload the preferences.
@@ -1221,19 +1320,9 @@ public class VideoCamera extends NoSearchActivity
mShutterButton.setImageDrawable(drawable);
}
- private void stopVideoRecordingAndGetThumbnail() {
- stopVideoRecording();
+ private void getThumbnail() {
acquireVideoThumb();
- }
-
- private void stopVideoRecordingAndReturn(boolean valid) {
- stopVideoRecording();
- doReturnToCaller(valid);
- }
-
- private void stopVideoRecordingAndShowAlert() {
- stopVideoRecording();
- showAlert();
+ updateThumbnailList();
}
private void showAlert() {
@@ -1279,22 +1368,21 @@ public class VideoCamera extends NoSearchActivity
return this.mVideoFrame.getVisibility() == View.VISIBLE;
}
- private void viewLastVideo() {
- Intent intent = null;
- if (mThumbController.isUriValid()) {
- intent = new Intent(Util.REVIEW_ACTION, mThumbController.getUri());
+ private void viewVideo(RotateImageView view) {
+ if(view.isUriValid()) {
+ Intent intent = new Intent(Util.REVIEW_ACTION, view.getUri());
try {
startActivity(intent);
} catch (ActivityNotFoundException ex) {
try {
- intent = new Intent(Intent.ACTION_VIEW, mThumbController.getUri());
+ intent = new Intent(Intent.ACTION_VIEW, view.getUri());
startActivity(intent);
} catch (ActivityNotFoundException e) {
- Log.e(TAG, "review video fail", e);
+ Log.e(TAG, "review video fail. uri=" + view.getUri(), e);
}
}
} else {
- Log.e(TAG, "Can't view last video.");
+ Log.e(TAG, "Uri invalid. uri=" + view.getUri());
}
}
@@ -1347,22 +1435,23 @@ public class VideoCamera extends NoSearchActivity
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
- private void hideAlertAndInitializeRecorder() {
- hideAlert();
- mHandler.sendEmptyMessage(INIT_RECORDER);
- }
-
private void acquireVideoThumb() {
- Bitmap videoFrame = ThumbnailUtils.createVideoThumbnail(
- mCurrentVideoFilename, Video.Thumbnails.MINI_KIND);
- mThumbController.setData(mCurrentVideoUri, videoFrame);
+ if (mThumbnailButton != null) {
+ Bitmap videoFrame = ThumbnailUtils.createVideoThumbnail(
+ mCurrentVideoFilename, Video.Thumbnails.MINI_KIND);
+ mThumbnailButton.setData(mCurrentVideoUri, videoFrame);
+ }
}
- private static ImageManager.DataLocation dataLocation() {
- return ImageManager.DataLocation.EXTERNAL;
+ private void initThumbnailButton() {
+ mThumbnailButton = (RotateImageView)findViewById(R.id.review_thumbnail);
+ if (mThumbnailButton != null) {
+ mThumbnailButton.setOnClickListener(this);
+ mThumbnailButton.loadData(ImageManager.getLastVideoThumbPath());
+ }
}
- private void updateLastVideo() {
+ private void updateThumbnailButton() {
IImageList list = ImageManager.makeImageList(
mContentResolver,
dataLocation(),
@@ -1373,13 +1462,115 @@ public class VideoCamera extends NoSearchActivity
if (count > 0) {
IImage image = list.getImageAt(count - 1);
Uri uri = image.fullSizeImageUri();
- mThumbController.setData(uri, image.miniThumbBitmap());
+ mThumbnailButton.setData(uri, image.miniThumbBitmap());
} else {
- mThumbController.setData(null, null);
+ mThumbnailButton.setData(null, null);
}
list.close();
}
+ private Cursor getThumbnailsCursor(int thumbnailCount) {
+ Log.v(TAG, "thumbnailCount=" + thumbnailCount);
+ String[] projections = { MediaStore.Video.Thumbnails._ID };
+ Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
+ .buildUpon()
+ .appendQueryParameter("limit", String.valueOf(thumbnailCount))
+ .build();
+ // TODO: managedQuery is deprecated. Use CursorLoader.
+ return managedQuery(uri, projections, null, null,
+ VideoColumns._ID + " DESC");
+ }
+
+ private void initThumbnailList() {
+ mThumbnailList = (ListView) findViewById(R.id.image_list);
+ if (mThumbnailList != null) {
+ int width = mThumbnailList.getWidth();
+ int height = mThumbnailList.getHeight();
+ int thumbnailCount = (height + mThumbnailList.getDividerHeight())
+ / (width + mThumbnailList.getDividerHeight());
+ Cursor cursor = getThumbnailsCursor(thumbnailCount);
+ ThumbnailAdapter adapter = new ThumbnailAdapter(
+ getApplicationContext(), R.layout.thumbnail_item, cursor,
+ false);
+ mThumbnailList.setAdapter(adapter);
+ mThumbnailList.setOnItemClickListener(mThumbnailItemClickListener);
+ }
+ }
+
+ private void updateThumbnailList() {
+ if (mThumbnailList == null) return;
+ CursorAdapter adapter = (CursorAdapter) mThumbnailList.getAdapter();
+ Cursor cursor = adapter.getCursor();
+ cursor.requery();
+ adapter.notifyDataSetChanged();
+ }
+
+ private class ThumbnailItemClickListener implements OnItemClickListener {
+ public void onItemClick(AdapterView<?> p, View v, int pos, long id) {
+ viewVideo((RotateImageView)v);
+ }
+ }
+
+ private static ImageManager.DataLocation dataLocation() {
+ return ImageManager.DataLocation.EXTERNAL;
+ }
+
+ private static String millisecondToTimeString(long milliSeconds, boolean displayCentiSeconds) {
+ long seconds = milliSeconds / 1000; // round down to compute seconds
+ long minutes = seconds / 60;
+ long hours = minutes / 60;
+ long remainderMinutes = minutes - (hours * 60);
+ long remainderSeconds = seconds - (minutes * 60);
+
+ StringBuilder timeStringBuilder = new StringBuilder();
+
+ // Hours
+ if (hours > 0) {
+ if (hours < 10) {
+ timeStringBuilder.append('0');
+ }
+ timeStringBuilder.append(hours);
+
+ timeStringBuilder.append(':');
+ }
+
+ // Minutes
+ if (remainderMinutes < 10) {
+ timeStringBuilder.append('0');
+ }
+ timeStringBuilder.append(remainderMinutes);
+ timeStringBuilder.append(':');
+
+ // Seconds
+ if (remainderSeconds < 10) {
+ timeStringBuilder.append('0');
+ }
+ timeStringBuilder.append(remainderSeconds);
+
+ // Centi seconds
+ if (displayCentiSeconds) {
+ timeStringBuilder.append('.');
+ long remainderCentiSeconds = (milliSeconds - seconds * 1000) / 10;
+ if (remainderCentiSeconds < 10) {
+ timeStringBuilder.append('0');
+ }
+ timeStringBuilder.append(remainderCentiSeconds);
+ }
+
+ return timeStringBuilder.toString();
+ }
+
+ // Calculates the time lapse video length till now and returns it in
+ // the format hh:mm:ss.dd, where dd are the centi seconds.
+ private String getTimeLapseVideoLengthString(long deltaMs) {
+ // For better approximation calculate fractional number of frames captured.
+ // This will update the video time at a higher resolution.
+ double numberOfFrames = (double) deltaMs / mTimeBetweenTimeLapseFrameCaptureMs;
+ long videoTimeMs =
+ (long) (numberOfFrames / (double) mProfile.videoFrameRate * 1000);
+ return millisecondToTimeString(videoTimeMs, true);
+ }
+
private void updateRecordingTime() {
if (!mMediaRecorderRecording) {
return;
@@ -1392,36 +1583,19 @@ public class VideoCamera extends NoSearchActivity
boolean countdownRemainingTime = (mMaxVideoDurationInMs != 0
&& delta >= mMaxVideoDurationInMs - 60000);
- long next_update_delay = 1000 - (delta % 1000);
- long seconds;
+ long deltaAdjusted = delta;
if (countdownRemainingTime) {
- delta = Math.max(0, mMaxVideoDurationInMs - delta);
- seconds = (delta + 999) / 1000;
- } else {
- seconds = delta / 1000; // round to nearest
+ deltaAdjusted = Math.max(0, mMaxVideoDurationInMs - deltaAdjusted) + 999;
}
+ String text = millisecondToTimeString(deltaAdjusted, false);
- long minutes = seconds / 60;
- long hours = minutes / 60;
- long remainderMinutes = minutes - (hours * 60);
- long remainderSeconds = seconds - (minutes * 60);
-
- String secondsString = Long.toString(remainderSeconds);
- if (secondsString.length() < 2) {
- secondsString = "0" + secondsString;
- }
- String minutesString = Long.toString(remainderMinutes);
- if (minutesString.length() < 2) {
- minutesString = "0" + minutesString;
- }
- String text = minutesString + ":" + secondsString;
- if (hours > 0) {
- String hoursString = Long.toString(hours);
- if (hoursString.length() < 2) {
- hoursString = "0" + hoursString;
- }
- text = hoursString + ":" + text;
+ if (mCaptureTimeLapse) {
+ // Since the length of time lapse video is different from the length
+ // of the actual wall clock time elapsed, we display the video length
+ // alongside the wall clock time.
+ text = text + " (" + getTimeLapseVideoLengthString(delta) + ")";
}
+
mRecordingTimeView.setText(text);
if (mRecordingTimeCountsDown != countdownRemainingTime) {
@@ -1436,8 +1610,9 @@ public class VideoCamera extends NoSearchActivity
mRecordingTimeView.setTextColor(color);
}
+ long nextUpdateDelay = 1000 - (delta % 1000);
mHandler.sendEmptyMessageDelayed(
- UPDATE_RECORD_TIME, next_update_delay);
+ UPDATE_RECORD_TIME, nextUpdateDelay);
}
private static boolean isSupported(String value, List<String> supported) {
@@ -1447,7 +1622,7 @@ public class VideoCamera extends NoSearchActivity
private void setCameraParameters() {
mParameters = mCameraDevice.getParameters();
- mParameters.setPreviewSize(mProfile.videoFrameWidth, mProfile.videoFrameHeight);
+ mParameters.setPreviewSize(mDesiredPreviewWidth, mDesiredPreviewHeight);
mParameters.setPreviewFrameRate(mProfile.videoFrameRate);
// Set flash mode.
@@ -1520,8 +1695,8 @@ public class VideoCamera extends NoSearchActivity
private void resetCameraParameters() {
// We need to restart the preview if preview size is changed.
Size size = mParameters.getPreviewSize();
- if (size.width != mProfile.videoFrameWidth
- || size.height != mProfile.videoFrameHeight) {
+ if (size.width != mDesiredPreviewWidth
+ || size.height != mDesiredPreviewHeight) {
// It is assumed media recorder is released before
// onSharedPreferenceChanged, so we can close the camera here.
closeCamera();
diff --git a/src/com/android/camera/ui/BasicIndicator.java b/src/com/android/camera/ui/BasicIndicator.java
index 7630a8e..9f076b8 100644
--- a/src/com/android/camera/ui/BasicIndicator.java
+++ b/src/com/android/camera/ui/BasicIndicator.java
@@ -19,31 +19,47 @@ package com.android.camera.ui;
import android.content.Context;
import com.android.camera.IconListPreference;
+import com.android.camera.ListPreference;
import com.android.camera.R;
import com.android.camera.Util;
import com.android.camera.ui.GLListView.OnItemSelectedListener;
class BasicIndicator extends AbstractIndicator {
+ private static final float FONT_SIZE = 18;
+ private static final int FONT_COLOR = 0xA8FFFFFF;
private static final int COLOR_OPTION_ITEM_HIGHLIGHT = 0xFF181818;
private final ResourceTexture mIcon[];
- private final IconListPreference mPreference;
+ private final ListPreference mPreference;
protected int mIndex;
private GLListView mPopupContent;
private PreferenceAdapter mModel;
private String mOverride;
+ private int mTitleIndex;
+ private StringTexture mTitle;
+ private final float mFontSize;
+ private boolean mIsIconListMode;
- public BasicIndicator(Context context, IconListPreference preference) {
+ public BasicIndicator(Context context, ListPreference preference) {
super(context);
mPreference = preference;
- mIcon = new ResourceTexture[preference.getLargeIconIds().length];
mIndex = preference.findIndexOfValue(preference.getValue());
+ if (preference instanceof IconListPreference) {
+ mIsIconListMode = true;
+ mIcon = new ResourceTexture[((IconListPreference) preference).getLargeIconIds().length];
+ mFontSize = 0;
+ } else {
+ mIsIconListMode = false;
+ mIcon = null;
+ mFontSize = GLRootView.dpToPixel(context, FONT_SIZE);
+ mTitleIndex = -1;
+ }
}
// Set the override and/or reload the value from preferences.
private void updateContent(String override, boolean reloadValue) {
if (!reloadValue && Util.equals(mOverride, override)) return;
- IconListPreference pref = mPreference;
+ ListPreference pref = mPreference;
mOverride = override;
int index = pref.findIndexOfValue(
override == null ? pref.getValue() : override);
@@ -55,7 +71,7 @@ class BasicIndicator extends AbstractIndicator {
@Override
public void overrideSettings(String key, String settings) {
- IconListPreference pref = mPreference;
+ ListPreference pref = mPreference;
if (!pref.getKey().equals(key)) return;
updateContent(settings, false);
}
@@ -104,13 +120,23 @@ class BasicIndicator extends AbstractIndicator {
}
@Override
- protected ResourceTexture getIcon() {
- int index = mIndex;
- if (mIcon[index] == null) {
- Context context = getGLRootView().getContext();
- mIcon[index] = new ResourceTexture(
- context, mPreference.getLargeIconIds()[index]);
+ protected BitmapTexture getIcon() {
+ if (mIsIconListMode) {
+ int index = mIndex;
+ if (mIcon[index] == null) {
+ Context context = getGLRootView().getContext();
+ mIcon[index] = new ResourceTexture(
+ context, ((IconListPreference) mPreference).getLargeIconIds()[index]);
+ }
+ return mIcon[index];
+ } else {
+ if (mTitleIndex != mIndex) {
+ mTitleIndex = mIndex;
+ if (mTitle != null) mTitle.deleteFromGL();
+ String value = mPreference.getEntry();
+ mTitle = StringTexture.newInstance(value, mFontSize, FONT_COLOR);
+ }
+ return mTitle;
}
- return mIcon[index];
}
}
diff --git a/src/com/android/camera/ui/CamcorderHeadUpDisplay.java b/src/com/android/camera/ui/CamcorderHeadUpDisplay.java
index 8e98100..c69b92b 100644
--- a/src/com/android/camera/ui/CamcorderHeadUpDisplay.java
+++ b/src/com/android/camera/ui/CamcorderHeadUpDisplay.java
@@ -26,12 +26,19 @@ public class CamcorderHeadUpDisplay extends HeadUpDisplay {
private static final String TAG = "CamcorderHeadUpDisplay";
+ private boolean mCaptureTimeLapse;
private OtherSettingsIndicator mOtherSettings;
public CamcorderHeadUpDisplay(Context context) {
super(context);
}
+ public void initialize(Context context, PreferenceGroup group,
+ boolean captureTimeLapse) {
+ mCaptureTimeLapse = captureTimeLapse;
+ super.initialize(context, group);
+ }
+
@Override
protected void initializeIndicatorBar(
Context context, PreferenceGroup group) {
@@ -57,7 +64,12 @@ public class CamcorderHeadUpDisplay extends HeadUpDisplay {
addIndicator(context, group, CameraSettings.KEY_WHITE_BALANCE);
addIndicator(context, group, CameraSettings.KEY_VIDEOCAMERA_FLASH_MODE);
- addIndicator(context, group, CameraSettings.KEY_VIDEO_QUALITY);
+ if (mCaptureTimeLapse) {
+ addIndicator(context, group, CameraSettings.KEY_VIDEO_TIME_LAPSE_FRAME_INTERVAL);
+ addIndicator(context, group, CameraSettings.KEY_VIDEO_TIME_LAPSE_QUALITY);
+ } else {
+ addIndicator(context, group, CameraSettings.KEY_VIDEO_QUALITY);
+ }
addIndicator(context, group, CameraSettings.KEY_CAMERA_ID);
}
}
diff --git a/src/com/android/camera/ui/GLListView.java b/src/com/android/camera/ui/GLListView.java
index c1bc11a..ed22ea3 100644
--- a/src/com/android/camera/ui/GLListView.java
+++ b/src/com/android/camera/ui/GLListView.java
@@ -17,10 +17,12 @@
package com.android.camera.ui;
import static android.view.View.MeasureSpec.makeMeasureSpec;
+import com.android.camera.Util;
import android.content.Context;
import android.graphics.Rect;
import android.os.Handler;
+import android.os.Looper;
import android.os.Message;
import android.view.GestureDetector;
import android.view.MotionEvent;
@@ -30,15 +32,13 @@ import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.Scroller;
-import com.android.camera.Util;
-
import javax.microedition.khronos.opengles.GL11;
class GLListView extends GLView {
@SuppressWarnings("unused")
private static final String TAG = "GLListView";
private static final int INDEX_NONE = -1;
- private static final int SCROLL_BAR_TIMEOUT = 2500;
+ private static final int SCROLL_BAR_TIMEOUT = 1000;
private static final int HIDE_SCROLL_BAR = 1;
@@ -77,7 +77,7 @@ class GLListView extends GLView {
public GLListView(Context context) {
mScroller = new Scroller(context);
- mHandler = new Handler() {
+ mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
GLRootView root = getGLRootView();
@@ -102,13 +102,25 @@ class GLListView extends GLView {
context, new MyGestureListener(), mHandler);
}
+ private final Runnable mHideScrollBar = new Runnable() {
+ public void run() {
+ setScrollBarVisible(false);
+ }
+ };
+
@Override
protected void onVisibilityChanged(int visibility) {
super.onVisibilityChanged(visibility);
- if (visibility == GLView.VISIBLE && mScrollHeight > getHeight()) {
+ if (mScrollHeight > getHeight()) updateScrollBar(visibility);
+ }
+
+ private void updateScrollBar(int visibility) {
+ if (isVisible()) {
setScrollBarVisible(true);
mHandler.sendEmptyMessageDelayed(
HIDE_SCROLL_BAR, SCROLL_BAR_TIMEOUT);
+ } else {
+ mHandler.removeMessages(HIDE_SCROLL_BAR);
}
}
@@ -294,7 +306,10 @@ class GLListView extends GLView {
mIsPressed = true;
mHandler.removeMessages(HIDE_SCROLL_BAR);
setScrollBarVisible(mScrollHeight > getHeight());
-
+ if (!mScroller.isFinished()) {
+ mScroller.forceFinished(true);
+ break;
+ }
// fallthrough: we need to highlight the item which is pressed
case MotionEvent.ACTION_MOVE:
if (!mScrollable) {
diff --git a/src/com/android/camera/ui/GLRootView.java b/src/com/android/camera/ui/GLRootView.java
index e7ac5e3..bdb0a8e 100644
--- a/src/com/android/camera/ui/GLRootView.java
+++ b/src/com/android/camera/ui/GLRootView.java
@@ -30,6 +30,7 @@ import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
+import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
@@ -37,7 +38,6 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Stack;
-
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;
@@ -728,4 +728,12 @@ public class GLRootView extends GLSurfaceView
texture.setTextureSize(newWidth, newHeight);
}
+ @Override
+ protected void onVisibilityChanged(View changedView, int v) {
+ super.onVisibilityChanged(changedView, v);
+ if (mContentView != null) {
+ mContentView.onVisibilityChanged(
+ v == View.VISIBLE ? GLView.VISIBLE : GLView.INVISIBLE);
+ }
+ }
}
diff --git a/src/com/android/camera/ui/GLView.java b/src/com/android/camera/ui/GLView.java
index 184016e..811527a 100644
--- a/src/com/android/camera/ui/GLView.java
+++ b/src/com/android/camera/ui/GLView.java
@@ -20,11 +20,11 @@ import android.graphics.Matrix;
import android.graphics.Rect;
import android.os.SystemClock;
import android.view.MotionEvent;
+import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import java.util.ArrayList;
-
import javax.microedition.khronos.opengles.GL11;
public class GLView {
@@ -81,8 +81,22 @@ public class GLView {
} else {
mViewFlags |= FLAG_INVISIBLE;
}
- onVisibilityChanged(visibility);
invalidate();
+
+ // Trigger the onVisibilityChanged() if it is visible on the screen.
+ if (isVisible()) onVisibilityChanged(visibility);
+ }
+
+ public boolean isVisible() {
+ if (mRootView == null || mRootView.getVisibility() != View.VISIBLE) {
+ return false;
+ }
+ GLView parent = mParent;
+ while (parent != null) {
+ if (parent.getVisibility() == GLView.INVISIBLE) return false;
+ parent = parent.mParent;
+ }
+ return true;
}
public int getVisibility() {
@@ -141,6 +155,7 @@ public class GLView {
}
mComponents.add(component);
component.onAddToParent(this);
+ if (isVisible()) component.onVisibilityChanged(VISIBLE);
}
public boolean removeComponent(GLView component) {
@@ -362,10 +377,7 @@ public class GLView {
protected void onVisibilityChanged(int visibility) {
for (int i = 0, n = getComponentCount(); i < n; ++i) {
- GLView child = getComponent(i);
- if (child.getVisibility() == GLView.VISIBLE) {
- child.onVisibilityChanged(visibility);
- }
+ getComponent(i).onVisibilityChanged(visibility);
}
}
diff --git a/src/com/android/camera/ui/GpsIndicator.java b/src/com/android/camera/ui/GpsIndicator.java
index 78a80b8..c1cb2ef 100644
--- a/src/com/android/camera/ui/GpsIndicator.java
+++ b/src/com/android/camera/ui/GpsIndicator.java
@@ -33,7 +33,7 @@ class GpsIndicator extends BasicIndicator {
}
@Override
- protected ResourceTexture getIcon() {
+ protected BitmapTexture getIcon() {
if (mIndex == GPS_ON_INDEX && !mHasSignal) {
if (mNoSignalIcon == null) {
Context context = getGLRootView().getContext();
diff --git a/src/com/android/camera/ui/HeadUpDisplay.java b/src/com/android/camera/ui/HeadUpDisplay.java
index 6a7c604..8751d09 100644
--- a/src/com/android/camera/ui/HeadUpDisplay.java
+++ b/src/com/android/camera/ui/HeadUpDisplay.java
@@ -17,8 +17,11 @@
package com.android.camera.ui;
import static com.android.camera.ui.GLRootView.dpToPixel;
-
-import java.util.ArrayList;
+import com.android.camera.CameraSettings;
+import com.android.camera.ComboPreferences;
+import com.android.camera.ListPreference;
+import com.android.camera.PreferenceGroup;
+import com.android.camera.R;
import android.content.Context;
import android.content.SharedPreferences;
@@ -34,12 +37,7 @@ import android.view.View.MeasureSpec;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
-import com.android.camera.CameraSettings;
-import com.android.camera.ComboPreferences;
-import com.android.camera.IconListPreference;
-import com.android.camera.ListPreference;
-import com.android.camera.PreferenceGroup;
-import com.android.camera.R;
+import java.util.ArrayList;
// This is the UI for the on-screen settings. Since the rendering is run in the
// GL thread. If any values will be changed in the main thread, it needs to
@@ -329,8 +327,7 @@ public class HeadUpDisplay extends GLView {
protected BasicIndicator addIndicator(
Context context, PreferenceGroup group, String key) {
- IconListPreference iconPref =
- (IconListPreference) group.findPreference(key);
+ ListPreference iconPref = group.findPreference(key);
if (iconPref == null) return null;
BasicIndicator indicator = new BasicIndicator(context, iconPref);
mIndicatorBar.addComponent(indicator);
diff --git a/src/com/android/camera/ui/PopupWindow.java b/src/com/android/camera/ui/PopupWindow.java
index c2bf533..cc76f46 100644
--- a/src/com/android/camera/ui/PopupWindow.java
+++ b/src/com/android/camera/ui/PopupWindow.java
@@ -186,11 +186,6 @@ class PopupWindow extends GLView {
mRotatePane.setContent(content);
}
- @Override
- public void clearComponents() {
- throw new UnsupportedOperationException();
- }
-
public void popup() {
setVisibility(GLView.VISIBLE);
diff --git a/src/com/android/camera/ui/RotatePane.java b/src/com/android/camera/ui/RotatePane.java
index 9f9effa..45f6a0d 100644
--- a/src/com/android/camera/ui/RotatePane.java
+++ b/src/com/android/camera/ui/RotatePane.java
@@ -117,8 +117,7 @@ class RotatePane extends GLView {
public void setContent(GLView view) {
if (mChild == view) return;
-
- if (mChild != null) super.clearComponents();
+ if (mChild != null) super.removeComponent(mChild);
mChild = view;
if (view != null) super.addComponent(view);
requestLayout();
@@ -128,9 +127,4 @@ class RotatePane extends GLView {
public void addComponent(GLView view) {
throw new UnsupportedOperationException("use setContent(GLView)");
}
-
- @Override
- public void clearComponents() {
- throw new UnsupportedOperationException("use setContent(null)");
- }
}