diff options
38 files changed, 569 insertions, 109 deletions
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 Binary files differnew file mode 100644 index 0000000..d2a39e4 --- /dev/null +++ b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_1080p.png 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 Binary files differnew file mode 100644 index 0000000..5567eb0 --- /dev/null +++ b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_720p.png 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 Binary files differnew file mode 100644 index 0000000..ce0cf42 --- /dev/null +++ b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_high.png 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 Binary files differnew file mode 100644 index 0000000..cb66c52 --- /dev/null +++ b/res/drawable-hdpi/ic_viewfinder_video_time_lapse_quality_low.png 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 Binary files differnew file mode 100644 index 0000000..199e0ef --- /dev/null +++ b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_1080p.png 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 Binary files differnew file mode 100644 index 0000000..1104ce5 --- /dev/null +++ b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_720p.png 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 Binary files differnew file mode 100644 index 0000000..8b99109 --- /dev/null +++ b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_high.png 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 Binary files differnew file mode 100644 index 0000000..36e2c1a --- /dev/null +++ b/res/drawable-mdpi/ic_viewfinder_video_time_lapse_quality_low.png diff --git a/res/layout/video_camera.xml b/res/layout/video_camera.xml index ea4cf51..82d1dc9 100644 --- a/res/layout/video_camera.xml +++ b/res/layout/video_camera.xml @@ -41,7 +41,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 9323351..082b475 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index fe29540..413701b 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 19c3531..d8849cc 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index bdb816d..9852295 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -35,6 +35,10 @@ <string name="review_retake" msgid="7804864054896088338">"ΝΕΑ ΛΗΨΗ"</string> <string name="camera_gallery_photos_text" msgid="6558048736561932758">"Συλλογή"</string> <string name="switch_camera_id" msgid="837545176602471325">"Εναλλαγή κάμερας"</string> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index d5f7051..8d49def 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 0118035..257e838 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index f265c3b..11cfa20 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 736aec5..8c401f5 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 66ea853..fd13fff 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -35,6 +35,10 @@ <string name="review_retake" msgid="7804864054896088338">"撮り直し"</string> <string name="camera_gallery_photos_text" msgid="6558048736561932758">"ギャラリー"</string> <string name="switch_camera_id" msgid="837545176602471325">"カメラを切り替え"</string> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index a9d03b6..abd8d27 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -35,6 +35,10 @@ <string name="review_retake" msgid="7804864054896088338">"다시 촬영"</string> <string name="camera_gallery_photos_text" msgid="6558048736561932758">"갤러리"</string> <string name="switch_camera_id" msgid="837545176602471325">"카메라 전환"</string> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 8194709..615c7bf 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index d403b2a..39c94aa 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 0361af8..16fae95 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index c3074e0..ef8d331 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index eea0d90..11c36d4 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 8a02a6f..7be49d3 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -35,6 +35,10 @@ <string name="review_retake" msgid="7804864054896088338">"ДРУГОЙ СНИМОК"</string> <string name="camera_gallery_photos_text" msgid="6558048736561932758">"Галерея"</string> <string name="switch_camera_id" msgid="837545176602471325">"Переключить камеру"</string> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 8eb708f..53fa5c8 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index e3649ff..6f06f52 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -35,6 +35,10 @@ <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> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 91f2c7c..991d58d 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -35,6 +35,10 @@ <string name="review_retake" msgid="7804864054896088338">"重拍"</string> <string name="camera_gallery_photos_text" msgid="6558048736561932758">"图库"</string> <string name="switch_camera_id" msgid="837545176602471325">"切换相机"</string> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index daa5463..4646112 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -35,6 +35,10 @@ <string name="review_retake" msgid="7804864054896088338">"重拍"</string> <string name="camera_gallery_photos_text" msgid="6558048736561932758">"圖庫"</string> <string name="switch_camera_id" msgid="837545176602471325">"切換相機"</string> + <!-- no translation found for enable_time_lapse_mode (9176865387013576340) --> + <skip /> + <!-- no translation found for disable_time_lapse_mode (1025813874111023552) --> + <skip /> <!-- no translation found for pref_camera_id_title (6023059405578511534) --> <skip /> <!-- no translation found for pref_camera_id_entry_back (5142699735103692485) --> @@ -49,6 +53,12 @@ <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> + <!-- no translation found for pref_video_time_lapse_quality_title (1163053302966946838) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_low (5315843743598116968) --> + <skip /> + <!-- no translation found for pref_video_time_lapse_quality_entry_high (3933491126045555205) --> + <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> diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 2299935..4a00e05 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -38,6 +38,28 @@ <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_720p</item> + <item>@string/pref_video_time_lapse_quality_entry_1080p</item> + </string-array> + + <string-array name="pref_video_time_lapse_quality_entryvalues" translatable="false"> + <item>low</item> + <item>high</item> + <item>720p</item> + <item>1080p</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_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 e1e37d9..eeb432d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -105,6 +105,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> @@ -130,6 +139,19 @@ <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">high</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_720p" translatable="false">720p</string> + <!-- Refers to the video quality --> + <string name="pref_video_time_lapse_quality_entry_1080p" translatable="false">1080p</string> + <!-- Settings screen, Camera setting category title --> <string name="pref_camera_settings_category">Camera settings</string> diff --git a/res/xml/video_preferences.xml b/res/xml/video_preferences.xml index eb8e344..6345351 100644 --- a/res/xml/video_preferences.xml +++ b/res/xml/video_preferences.xml @@ -26,6 +26,13 @@ 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"/> + <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 cb76226..3621527 100644 --- a/src/com/android/camera/Camera.java +++ b/src/com/android/camera/Camera.java @@ -1672,53 +1672,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; } @@ -1762,7 +1715,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(); diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java index 8eef3e9..d718b45 100644 --- a/src/com/android/camera/CameraSettings.java +++ b/src/com/android/camera/CameraSettings.java @@ -38,6 +38,7 @@ 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_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"; @@ -57,6 +58,16 @@ public class CameraSettings { private static final String VIDEO_QUALITY_MMS = "mms"; private static final String VIDEO_QUALITY_YOUTUBE = "youtube"; + private static final String VIDEO_TIME_LAPSE_QUALITY_LOW= "low"; + private static final String VIDEO_TIME_LAPSE_QUALITY_HIGH= "high"; + private static final String VIDEO_TIME_LAPSE_QUALITY_720P = "720p"; + private static final String VIDEO_TIME_LAPSE_QUALITY_1080P = "1080p"; + + public static final int TIME_LAPSE_VIDEO_QUALITY_LOW = 1; + public static final int TIME_LAPSE_VIDEO_QUALITY_HIGH = 2; + public static final int TIME_LAPSE_VIDEO_QUALITY_720P = 3; + public static final int TIME_LAPSE_VIDEO_QUALITY_1080P = 4; + public static final String EXPOSURE_DEFAULT_VALUE = "0"; public static final int CURRENT_VERSION = 4; @@ -68,6 +79,7 @@ public class CameraSettings { private static final int DEFAULT_VIDEO_DURATION = 30 * 60; // 10 mins public static final String DEFAULT_VIDEO_QUALITY_VALUE = "high"; + public static final String DEFAULT_VIDEO_TIME_LAPSE_QUALITY_VALUE = "high"; // MMS video length public static final int DEFAULT_VIDEO_DURATION_VALUE = -1; @@ -334,6 +346,20 @@ public class CameraSettings { quality) || VIDEO_QUALITY_HIGH.equals(quality); } + public static int getVideoTimeLapseQuality(String quality) { + if (VIDEO_TIME_LAPSE_QUALITY_LOW.equals(quality)) { + return TIME_LAPSE_VIDEO_QUALITY_LOW; + } else if (VIDEO_TIME_LAPSE_QUALITY_HIGH.equals(quality)) { + return TIME_LAPSE_VIDEO_QUALITY_HIGH; + } else if (VIDEO_TIME_LAPSE_QUALITY_720P.equals(quality)) { + return TIME_LAPSE_VIDEO_QUALITY_720P; + } else if (VIDEO_TIME_LAPSE_QUALITY_1080P.equals(quality)) { + return TIME_LAPSE_VIDEO_QUALITY_1080P; + } else { + throw new IllegalArgumentException("Unknown quality" + quality); + } + } + public static int getVidoeDurationInMillis(String quality) { if (VIDEO_QUALITY_MMS.equals(quality)) { return MMS_VIDEO_DURATION * 1000; diff --git a/src/com/android/camera/MenuHelper.java b/src/com/android/camera/MenuHelper.java index 17755f9..b5e4a13 100644 --- a/src/com/android/camera/MenuHelper.java +++ b/src/com/android/camera/MenuHelper.java @@ -59,6 +59,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/Util.java b/src/com/android/camera/Util.java index de99562..2af46fd 100644 --- a/src/com/android/camera/Util.java +++ b/src/com/android/camera/Util.java @@ -22,7 +22,9 @@ 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; @@ -31,6 +33,7 @@ import android.view.animation.TranslateAnimation; import com.android.camera.gallery.IImage; import com.android.camera.R; +import java.util.List; import java.io.Closeable; /** @@ -298,4 +301,50 @@ public class Util { int result = (info.mOrientation - 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 8916b1b..f6e9c8c 100644 --- a/src/com/android/camera/VideoCamera.java +++ b/src/com/android/camera/VideoCamera.java @@ -53,6 +53,7 @@ import android.provider.MediaStore; import android.provider.Settings; import android.provider.MediaStore.Video; import android.util.Log; +import android.view.Display; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; @@ -130,6 +131,7 @@ public class VideoCamera extends NoSearchActivity private ImageView mVideoFrame; private GLRootView mGLRootView; private CamcorderHeadUpDisplay mHeadUpDisplay; + private MenuItem mSwitchTimeLapseMenuItem; private boolean mIsVideoCaptureIntent; private boolean mQuickCapture; @@ -160,6 +162,15 @@ public class VideoCamera extends NoSearchActivity // The video duration limit. 0 menas no limit. private int mMaxVideoDurationInMs; + // Time Lapse parameters. + private boolean mCaptureTimeLapse = false; + private boolean mUseStillCameraForTimeLapse = false; + private int mTimeBetweenTimeLapseFrameCaptureMs = 2000; + private int mEncoderLevel; + + private int mDesiredPreviewWidth; + private int mDesiredPreviewHeight; + boolean mPausing = false; boolean mSwitching; boolean mPreviewing = false; // True if preview is started. @@ -388,11 +399,10 @@ public class VideoCamera extends NoSearchActivity } private void initializeHeadUpDisplay() { - mHeadUpDisplay = new CamcorderHeadUpDisplay(this); + mHeadUpDisplay = new CamcorderHeadUpDisplay(this, mCaptureTimeLapse); CameraSettings settings = new CameraSettings(this, mParameters); - PreferenceGroup group = - settings.getPreferenceGroup(R.xml.video_preferences); + PreferenceGroup group = settings.getPreferenceGroup(R.xml.video_preferences); if (mIsVideoCaptureIntent) { group = filterPreferenceScreenByIntent(group); } @@ -538,7 +548,77 @@ public class VideoCamera extends NoSearchActivity : STORAGE_STATUS_OK; } + private void readTimeLapseVideoPreferences() { + String qualityStr = mPreferences.getString( + CameraSettings.KEY_VIDEO_TIME_LAPSE_QUALITY, + CameraSettings.DEFAULT_VIDEO_TIME_LAPSE_QUALITY_VALUE); + + int quality = CameraSettings.getVideoTimeLapseQuality(qualityStr); + + mProfile = CamcorderProfile.get( + (quality == CameraSettings.TIME_LAPSE_VIDEO_QUALITY_LOW) + ? CamcorderProfile.QUALITY_LOW + : CamcorderProfile.QUALITY_HIGH); + + mMaxVideoDurationInMs = 0; // No limit + mTimeBetweenTimeLapseFrameCaptureMs = 2000; + + // TODO: Add new profiles for time lapse instead of setting mProfile + // values here. + switch (quality) { + case CameraSettings.TIME_LAPSE_VIDEO_QUALITY_LOW: + mUseStillCameraForTimeLapse = false; + mProfile.videoFrameWidth = 176; + mProfile.videoFrameHeight = 144; + mEncoderLevel = 0; + break; + + case CameraSettings.TIME_LAPSE_VIDEO_QUALITY_HIGH: + mUseStillCameraForTimeLapse = false; + mProfile.videoFrameWidth = 720; + mProfile.videoFrameHeight = 480; + mEncoderLevel = 0; + break; + + case CameraSettings.TIME_LAPSE_VIDEO_QUALITY_720P: + mUseStillCameraForTimeLapse = false; + mProfile.videoFrameWidth = 1280; + mProfile.videoFrameHeight = 720; + mProfile.videoBitRate = 20000000; + mEncoderLevel = 50; + break; + + case CameraSettings.TIME_LAPSE_VIDEO_QUALITY_1080P: + mUseStillCameraForTimeLapse = true; + mProfile.videoFrameWidth = 1920; + mProfile.videoFrameHeight = 1088; + mProfile.videoBitRate = 20000000; + mEncoderLevel = 50; + break; + } + + if (mUseStillCameraForTimeLapse) { + // When using still camera for capturing time lapse frames + // mProfile.{videoFrameWidth,videoFrameHeight} may correspond to + // HD resolution not supported by the video camera. 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; + } else { + mDesiredPreviewWidth = mProfile.videoFrameWidth; + mDesiredPreviewHeight = mProfile.videoFrameHeight; + } + } + private void readVideoPreferences() { + if (mCaptureTimeLapse) { + readTimeLapseVideoPreferences(); + return; + } + String quality = mPreferences.getString( CameraSettings.KEY_VIDEO_QUALITY, CameraSettings.DEFAULT_VIDEO_QUALITY_VALUE); @@ -566,6 +646,9 @@ public class VideoCamera extends NoSearchActivity mProfile = CamcorderProfile.get(videoQualityHigh ? CamcorderProfile.QUALITY_HIGH : CamcorderProfile.QUALITY_LOW); + + mDesiredPreviewWidth = mProfile.videoFrameWidth; + mDesiredPreviewHeight = mProfile.videoFrameHeight; } private void resizeForPreviewAspectRatio() { @@ -672,17 +755,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) { @@ -696,6 +769,20 @@ public class VideoCamera extends NoSearchActivity 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); @@ -921,7 +1008,13 @@ public class VideoCamera extends NoSearchActivity 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.setTimeLapseParameters(mCaptureTimeLapse, mUseStillCameraForTimeLapse, + mTimeBetweenTimeLapseFrameCaptureMs, mEncoderLevel); + } // Set output file. if (mStorageStatus != STORAGE_STATUS_OK) { @@ -1049,6 +1142,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() { @@ -1079,6 +1180,51 @@ 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; + + mSwitching = true; + changeHeadUpDisplayState(); + + finishRecorderAndCloseCamera(); + mHandler.removeMessages(INIT_RECORDER); + + // Read the video preferences + readVideoPreferences(); + resetCameraParameters(); + + // Restart preview + try { + startPreview(); + } catch (CameraHardwareException e) { + showCameraBusyAndFinish(); + return; + } + + // Reload the UI. + initializeHeadUpDisplay(); + + if (mSurfaceHolder != null) { + mHandler.sendEmptyMessage(INIT_RECORDER); + } + + mSwitching = false; + changeHeadUpDisplayState(); + + // Change menu + setTimeLapseSwitchTitle(!mCaptureTimeLapse); } private void switchCameraId() { @@ -1089,19 +1235,7 @@ public class VideoCamera extends NoSearchActivity changeHeadUpDisplayState(); - // 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. @@ -1380,6 +1514,62 @@ public class VideoCamera extends NoSearchActivity list.close(); } + 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 +1582,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 +1609,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 +1621,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 +1694,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/CamcorderHeadUpDisplay.java b/src/com/android/camera/ui/CamcorderHeadUpDisplay.java index c90917d..8c8ed5a 100644 --- a/src/com/android/camera/ui/CamcorderHeadUpDisplay.java +++ b/src/com/android/camera/ui/CamcorderHeadUpDisplay.java @@ -26,10 +26,12 @@ public class CamcorderHeadUpDisplay extends HeadUpDisplay { private static final String TAG = "CamcorderHeadUpDisplay"; + private boolean mCaptureTimeLapse; private OtherSettingsIndicator mOtherSettings; - public CamcorderHeadUpDisplay(Context context) { + public CamcorderHeadUpDisplay(Context context, boolean captureTimeLapse) { super(context); + mCaptureTimeLapse = captureTimeLapse; } @Override @@ -57,6 +59,10 @@ 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_QUALITY); + } else { + addIndicator(context, group, CameraSettings.KEY_VIDEO_QUALITY); + } } } |