diff options
49 files changed, 1698 insertions, 1138 deletions
diff --git a/res/drawable/btn_camera_arrow_left.xml b/res/drawable/btn_camera_arrow_left.xml index 9d7dcdd..494899b 100644 --- a/res/drawable/btn_camera_arrow_left.xml +++ b/res/drawable/btn_camera_arrow_left.xml @@ -16,12 +16,12 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_window_focused="false" - android:drawable="@drawable/btn_camera_arrow_left_default" /> - <item android:state_pressed="true" android:drawable="@drawable/btn_camera_arrow_left_press" /> + <item android:state_window_focused="true" android:state_focused="true" + android:drawable="@drawable/btn_camera_arrow_left_selected" /> + <item android:drawable="@drawable/btn_camera_arrow_left_default" /> diff --git a/res/drawable/btn_camera_arrow_left_selected.png b/res/drawable/btn_camera_arrow_left_selected.png Binary files differnew file mode 100644 index 0000000..839704f --- /dev/null +++ b/res/drawable/btn_camera_arrow_left_selected.png diff --git a/res/drawable/btn_camera_arrow_right.xml b/res/drawable/btn_camera_arrow_right.xml index cc6ee2d..1d0cc0c 100644 --- a/res/drawable/btn_camera_arrow_right.xml +++ b/res/drawable/btn_camera_arrow_right.xml @@ -16,12 +16,13 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_window_focused="false" - android:drawable="@drawable/btn_camera_arrow_right_default" /> <item android:state_pressed="true" android:drawable="@drawable/btn_camera_arrow_right_press" /> + <item android:state_window_focused="true" android:state_focused="true" + android:drawable="@drawable/btn_camera_arrow_right_selected" /> + <item android:drawable="@drawable/btn_camera_arrow_right_default" /> diff --git a/res/drawable/btn_camera_arrow_right_selected.png b/res/drawable/btn_camera_arrow_right_selected.png Binary files differnew file mode 100644 index 0000000..630a606 --- /dev/null +++ b/res/drawable/btn_camera_arrow_right_selected.png diff --git a/res/drawable/frame_thumbnail_default.png b/res/drawable/frame_thumbnail_default.png Binary files differindex 50f2ecf..3db932e 100644 --- a/res/drawable/frame_thumbnail_default.png +++ b/res/drawable/frame_thumbnail_default.png diff --git a/res/drawable/frame_thumbnail_pressed.png b/res/drawable/frame_thumbnail_pressed.png Binary files differindex f46ad06..b15aea7 100644 --- a/res/drawable/frame_thumbnail_pressed.png +++ b/res/drawable/frame_thumbnail_pressed.png diff --git a/res/drawable/frame_thumbnail_selected.png b/res/drawable/frame_thumbnail_selected.png Binary files differindex 2d32aa2..408b14a 100644 --- a/res/drawable/frame_thumbnail_selected.png +++ b/res/drawable/frame_thumbnail_selected.png diff --git a/res/drawable/ic_btn_camera_default_background.png b/res/drawable/ic_btn_camera_default_background.png Binary files differindex 68bdefd..c37a86e 100644 --- a/res/drawable/ic_btn_camera_default_background.png +++ b/res/drawable/ic_btn_camera_default_background.png diff --git a/res/drawable/ic_btn_camera_pressed_background.png b/res/drawable/ic_btn_camera_pressed_background.png Binary files differindex e5543e1..8707b8a 100644 --- a/res/drawable/ic_btn_camera_pressed_background.png +++ b/res/drawable/ic_btn_camera_pressed_background.png diff --git a/res/drawable/ic_btn_camera_selected_background.png b/res/drawable/ic_btn_camera_selected_background.png Binary files differindex 0d4ff1a..a6bbdb1 100644 --- a/res/drawable/ic_btn_camera_selected_background.png +++ b/res/drawable/ic_btn_camera_selected_background.png diff --git a/res/drawable/ic_camera_bar_indicator_record_pressed.png b/res/drawable/ic_camera_bar_indicator_record_pressed.png Binary files differdeleted file mode 100644 index 517a973..0000000 --- a/res/drawable/ic_camera_bar_indicator_record_pressed.png +++ /dev/null diff --git a/res/drawable/ic_camera_bar_indicator_record_selected.png b/res/drawable/ic_camera_bar_indicator_record_selected.png Binary files differdeleted file mode 100644 index 4965401..0000000 --- a/res/drawable/ic_camera_bar_indicator_record_selected.png +++ /dev/null diff --git a/res/drawable/popup_camera_toast.9.png b/res/drawable/popup_camera_toast.9.png Binary files differdeleted file mode 100644 index c1f0c1f..0000000 --- a/res/drawable/popup_camera_toast.9.png +++ /dev/null diff --git a/res/layout/camera.xml b/res/layout/camera.xml index 46eba7f..340a08c 100644 --- a/res/layout/camera.xml +++ b/res/layout/camera.xml @@ -32,7 +32,7 @@ android:visibility="invisible" /> <com.android.camera.ShutterButton - android:id="@+id/mode_indicator" + android:id="@+id/shutter_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_camera_indicator_photo" @@ -42,7 +42,7 @@ android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:layout_marginRight="50dip" - android:layout_marginTop="10dip" + android:layout_marginTop="12dip" android:scaleType="center" /> <ImageView @@ -50,33 +50,46 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_camera_indicator_auto_focus_green" - android:layout_alignLeft="@id/mode_indicator" - android:layout_alignTop="@id/mode_indicator" + android:layout_alignLeft="@id/shutter_button" + android:layout_alignTop="@id/shutter_button" android:layout_marginLeft="39dip" android:layout_marginTop="16dip" android:scaleType="center" android:visibility="gone" /> + + <LinearLayout + android:visibility="gone" + android:id="@+id/post_picture_panel" + android:layout_alignBottom="@id/shutter_button" + android:layout_toLeftOf="@id/shutter_button" + android:layout_marginRight="27dip" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal"> + + <com.android.camera.ActionMenuButton + android:id="@+id/attach" + android:drawableTop="@drawable/ic_menu_attach" + android:text="@string/camera_attach" + style="@style/OnscreenActionIcon" + /> + <com.android.camera.ActionMenuButton + android:id="@+id/cancel" + android:drawableTop="@drawable/ic_menu_cancel" + android:text="@string/camera_cancel" + style="@style/OnscreenActionIcon" + /> + </LinearLayout> <ImageView + android:visibility="gone" android:id="@+id/last_picture_button" - android:layout_width="75dip" - android:layout_height="75dip" + android:layout_width="72dip" + android:layout_height="72dip" android:clickable="true" android:focusable="true" - android:layout_alignParentLeft="true" - android:layout_alignParentBottom="true" - android:layout_marginLeft="10dip" - android:layout_marginBottom="10dip" /> - - <TextView - android:id="@+id/hint_toast" - android:layout_alignParentRight="true" - android:layout_alignParentTop="true" - android:background="@drawable/popup_camera_toast" - android:layout_width="200dip" - android:layout_height="wrap_content" - android:gravity="center" - android:text="@string/camera_button_hint" - android:textSize="18sp" /> + android:layout_alignTop="@id/shutter_button" + android:layout_toLeftOf="@id/shutter_button" + android:layout_marginRight="20dip" /> </RelativeLayout> diff --git a/res/layout/video_camera.xml b/res/layout/video_camera.xml index 0ffaf5a..e853e02 100644 --- a/res/layout/video_camera.xml +++ b/res/layout/video_camera.xml @@ -40,8 +40,8 @@ android:visibility="invisible" /> - <ImageView - android:id="@+id/mode_indicator" + <com.android.camera.ShutterButton + android:id="@+id/shutter_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_camera_indicator_video" @@ -50,7 +50,7 @@ android:focusable="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" - android:layout_marginRight="50dip" + android:layout_marginRight="55dip" android:layout_marginTop="10dip" android:scaleType="center"/> @@ -61,8 +61,8 @@ android:id="@+id/recording_time" android:layout_width="90dip" android:layout_height="wrap_content" - android:layout_toLeftOf="@id/mode_indicator" - android:layout_alignTop="@id/mode_indicator" + android:layout_toLeftOf="@id/shutter_button" + android:layout_alignTop="@id/shutter_button" android:layout_marginTop="20dip" android:layout_marginRight="6dip" android:paddingRight="2dip" @@ -75,25 +75,13 @@ android:textSize="20dip" android:textStyle="bold" android:visibility="gone"/> - - <TextView - android:id="@+id/hint_toast" - android:layout_alignParentRight="true" - android:layout_alignParentTop="true" - android:background="@drawable/popup_camera_toast" - android:layout_width="200dip" - android:layout_height="wrap_content" - android:gravity="center" - android:text="@string/video_camera_button_hint" - android:textSize="18sp"/> <LinearLayout android:visibility="gone" android:id="@+id/post_picture_panel" - android:layout_alignTop="@id/mode_indicator" - android:layout_toLeftOf="@id/mode_indicator" - android:paddingLeft="7dip" - android:paddingRight="15dip" + android:layout_alignTop="@id/shutter_button" + android:layout_toLeftOf="@id/shutter_button" + android:layout_marginRight="27dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> @@ -101,40 +89,30 @@ <com.android.camera.ActionMenuButton android:id="@+id/play" android:drawableTop="@drawable/ic_menu_camera_play" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:text="@string/camera_play" style="@style/OnscreenActionIcon" /> <com.android.camera.ActionMenuButton android:id="@+id/share" android:drawableTop="@drawable/ic_menu_share" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:text="@string/camera_share" style="@style/OnscreenActionIcon" /> <com.android.camera.ActionMenuButton android:id="@+id/discard" android:drawableTop="@drawable/ic_menu_delete" - android:layout_width="fill_parent" - android:layout_height="fill_parent" android:text="@string/camera_toss" style="@style/OnscreenActionIcon" /> <com.android.camera.ActionMenuButton android:id="@+id/attach" android:drawableTop="@drawable/ic_menu_attach" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:text="@string/camera_attach" style="@style/OnscreenActionIcon" /> <com.android.camera.ActionMenuButton android:id="@+id/cancel" android:drawableTop="@drawable/ic_menu_cancel" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:text="@string/camera_cancel" style="@style/OnscreenActionIcon" /> diff --git a/res/layout/viewimage.xml b/res/layout/viewimage.xml index 6ba66d1..8d52ea1 100644 --- a/res/layout/viewimage.xml +++ b/res/layout/viewimage.xml @@ -76,15 +76,27 @@ </view> </AbsoluteLayout> + <ImageView + android:visibility="gone" + android:id="@+id/shutter_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_camera_indicator_photo" + android:background="@drawable/ic_btn_camera_background" + android:clickable="true" + android:focusable="true" + android:layout_alignParentRight="true" + android:layout_alignParentTop="true" + android:layout_marginRight="50dip" + android:layout_marginTop="12dip" + android:scaleType="center"/> + <LinearLayout android:visibility="gone" android:id="@+id/action_icon_panel" - android:layout_alignParentTop="true" - android:layout_alignParentRight="true" - android:paddingLeft="7dip" - android:paddingRight="18dip" - android:paddingTop="6dip" - android:paddingBottom="6dip" + android:layout_alignBottom="@id/shutter_button" + android:layout_toLeftOf="@id/shutter_button" + android:layout_marginRight="27dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> @@ -92,66 +104,40 @@ <com.android.camera.ActionMenuButton android:id="@+id/gallery" android:drawableTop="@drawable/ic_menu_gallery" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:text="@string/camera_gallery" style="@style/OnscreenActionIcon" /> <com.android.camera.ActionMenuButton android:id="@+id/setas" android:drawableTop="@drawable/ic_menu_set_as" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:text="@string/camera_set" style="@style/OnscreenActionIcon" /> <com.android.camera.ActionMenuButton android:id="@+id/share" android:drawableTop="@drawable/ic_menu_share" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:text="@string/camera_share" style="@style/OnscreenActionIcon" /> <com.android.camera.ActionMenuButton android:id="@+id/discard" android:drawableTop="@drawable/ic_menu_delete" - android:layout_width="fill_parent" - android:layout_height="fill_parent" android:text="@string/camera_toss" style="@style/OnscreenActionIcon" /> <com.android.camera.ActionMenuButton android:id="@+id/attach" android:drawableTop="@drawable/ic_menu_attach" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:text="@string/camera_attach" style="@style/OnscreenActionIcon" /> <com.android.camera.ActionMenuButton android:id="@+id/cancel" android:drawableTop="@drawable/ic_menu_cancel" - android:layout_width="wrap_content" - android:layout_height="wrap_content" android:text="@string/camera_cancel" style="@style/OnscreenActionIcon" /> - <ImageView - android:id="@+id/mode_indicator" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@drawable/ic_camera_indicator_photo" - android:background="@drawable/ic_btn_camera_background" - android:clickable="true" - android:focusable="true" - android:layout_alignParentRight="true" - android:layout_alignParentTop="true" - android:layout_marginRight="5dip" - android:layout_marginTop="15dip" - android:scaleType="center"/> </LinearLayout> - <ImageView android:id="@+id/prev_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 705dbf2..8062838 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"Čekejte prosím..."</string> <string name="no_storage">"Než začnete používat fotoaparát, vložte kartu SD."</string> <string name="not_enough_space">"Vaše karta SD je plná."</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"Nastavování tapety, čekejte prosím..."</string> <string name="savingImage">"Ukládání fotografie..."</string> <string name="runningFaceDetection">"Čekejte prosím..."</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"Galerie"</string> <string name="camera_pick_wallpaper">"Fotografie"</string> <string name="camera_setas_wallpaper">"Tapeta"</string> - <string name="camera_setas_wallpaper_drm">"Zakoupené fotografie"</string> - <string name="camera_selectphoto">"Vybrat tuto fotografii"</string> - <string name="camera_takenewphoto">"Pořídit novou fotografii"</string> <string name="pref_gallery_category">"Obecné nastavení"</string> <string name="pref_slideshow_category">"Nastavení prezentace"</string> <string name="pref_camera_general_settings_category">"Obecné nastavení"</string> - <string name="pref_gallery_size_title">"Velikost fotografie"</string> - <string name="pref_gallery_size_summary">"Vyberte velikost zobrazených fotografií"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"Velikost fotografie"</string> <string-array name="pref_gallery_size_choices"> <item>"Velké"</item> <item>"Malé"</item> </string-array> - <string name="pref_gallery_sort_title">"Řazení fotografií"</string> - <string name="pref_gallery_sort_summary">"Vyberte pořadí fotografií"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"Řazení fotografií"</string> <string-array name="pref_gallery_sort_choices"> <item>"Od nejnovějších"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"Zobrazit fotografie v náhodném pořadí"</string> <string name="pref_camera_recordlocation_title">"K fotografiím ukládat místo pořízení"</string> <string name="pref_camera_recordlocation_summary">"V datech fotografie zaznamenat místo pořízení"</string> - <string name="pref_camera_postpicturemenu_title">"Po pořízení obrázku zobrazit výzvu"</string> - <string name="pref_camera_postpicturemenu_summary">"Po pořízení fotografie zobrazit nabídku činností (uložit, smazat, ...)"</string> <string name="pref_camera_videoquality_category">"Kvalita videa"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"Potvrdit smazání"</string> - <string name="pref_gallery_confirm_delete_summary">"Před smazáním fotografií zobrazit potvrzení"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"Podrobnosti"</string> <string name="details_file_size">"Velikost souboru:"</string> <string name="details_image_resolution">"Rozlišení:"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"Možnosti fotografií"</string> <string name="video_context_menu_header">"Možnosti videa"</string> <string name="multiface_crop_help">"Začněte klepnutím na obličej."</string> - <string name="camera_button_hint">"Chcete-li pořídit fotografii, stiskněte tlačítko pro fotografování."</string> - <string name="video_camera_button_hint">"Chcete-li zaznamenat video, stiskněte spoušť."</string> <string name="photos_gallery_title">"Galerie"</string> <string name="pick_photos_gallery_title">"Vyberte fotografii"</string> <string name="videos_gallery_title">"Galerie"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"Sdílet video pomocí"</string> <string name="movieviewlabel">"Filmy"</string> <string name="loading_video">"Načítání videa..."</string> - <string name="picture_saved">"Fotografie byla uložena na kartu SD."</string> - <string name="picture_deleted">"Fotografie byla odstraněna."</string> - <string name="video_saved">"Video bylo uloženo na kartu SD."</string> - <string name="video_deleted">"Video bylo smazáno."</string> <string name="spaceIsLow_title">"Dochází volné místo"</string> <string name="spaceIsLow_content">"Na vaší kartě SD je málo místa. Změňte nastavení kvality nebo smažte položky z Galerie."</string> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 06a2588..12a4f88 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"Bitte warten..."</string> <string name="no_storage">"Legen Sie vor Verwendung der Kamera eine SD-Karte ein."</string> <string name="not_enough_space">"Ihre SD-Karte ist voll."</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"Hintergrund wird eingestellt, bitte warten..."</string> <string name="savingImage">"Bild wird gespeichert..."</string> <string name="runningFaceDetection">"Bitte warten..."</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"Galerie"</string> <string name="camera_pick_wallpaper">"Bilder"</string> <string name="camera_setas_wallpaper">"Hintergrund"</string> - <string name="camera_setas_wallpaper_drm">"Gekaufte Bilder"</string> - <string name="camera_selectphoto">"Dieses Bild auswählen"</string> - <string name="camera_takenewphoto">"Neues Bild aufnehmen"</string> <string name="pref_gallery_category">"Allgemeine Einstellungen"</string> <string name="pref_slideshow_category">"Einstellungen für Diashow"</string> <string name="pref_camera_general_settings_category">"Allgemeine Einstellungen"</string> - <string name="pref_gallery_size_title">"Bildgröße"</string> - <string name="pref_gallery_size_summary">"Anzeigegröße für Bilder auswählen"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"Bildgröße"</string> <string-array name="pref_gallery_size_choices"> <item>"Groß"</item> <item>"Klein"</item> </string-array> - <string name="pref_gallery_sort_title">"Sortierreihenfolge für Bilder"</string> - <string name="pref_gallery_sort_summary">"Sortierreihenfolge für Bilder auswählen"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"Sortierreihenfolge für Bilder"</string> <string-array name="pref_gallery_sort_choices"> <item>"Neue zuerst"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"Bilder in zufälliger Reihenfolge anzeigen"</string> <string name="pref_camera_recordlocation_title">"Aufnahmeort in Bildern speichern"</string> <string name="pref_camera_recordlocation_summary">"Aufnahmeort in Bilddaten speichern"</string> - <string name="pref_camera_postpicturemenu_title">"Eingabeaufforderung nach Aufnahme"</string> - <string name="pref_camera_postpicturemenu_summary">"Aktionsmenü (Speichern, Löschen...) nach Aufnahme anzeigen"</string> <string name="pref_camera_videoquality_category">"Videoqualität"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"Löschvorgang bestätigen"</string> - <string name="pref_gallery_confirm_delete_summary">"Bestätigung vor dem Löschen von Bildern anzeigen"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"Details"</string> <string name="details_file_size">"Dateigröße:"</string> <string name="details_image_resolution">"Auflösung:"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"Bildoptionen"</string> <string name="video_context_menu_header">"Videooptionen"</string> <string name="multiface_crop_help">"Tippen Sie zum Beginnen auf ein Gesicht."</string> - <string name="camera_button_hint">"Drücken Sie zum Fotografieren auf die Aufnahmetaste."</string> - <string name="video_camera_button_hint">"Drücken Sie die Schaltfläche für die Aufnahme, um ein Video aufzuzeichnen."</string> <string name="photos_gallery_title">"Galerie"</string> <string name="pick_photos_gallery_title">"Bild auswählen"</string> <string name="videos_gallery_title">"Galerie"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"Video weiterleiten via"</string> <string name="movieviewlabel">"Filme"</string> <string name="loading_video">"Video wird geladen..."</string> - <string name="picture_saved">"Bild auf SD-Karte gespeichert."</string> - <string name="picture_deleted">"Bild gelöscht."</string> - <string name="video_saved">"Video auf SD-Karte gespeichert."</string> - <string name="video_deleted">"Video gelöscht."</string> <string name="spaceIsLow_title">"Geringer Speicherplatz"</string> <string name="spaceIsLow_content">"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> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml deleted file mode 100644 index 9a382bc..0000000 --- a/res/values-es-rUS/strings.xml +++ /dev/null @@ -1,140 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for all_images (7177582020160054334) --> - <skip /> - <string name="camera_label">"Cámara"</string> - <string name="gallery_picker_label">"Álbumes"</string> - <!-- no translation found for gallery_camera_bucket_name (8410686962557494439) --> - <skip /> - <!-- no translation found for switch_to_video_lable (1350915759804484157) --> - <skip /> - <!-- no translation found for switch_to_camera_lable (1823306882227066007) --> - <skip /> - <string name="crop_label">"Recortar imagen"</string> - <string name="view_label">"Ver imagen"</string> - <string name="preferences_label">"Configuración de la cámara"</string> - <string name="wait">"Por favor, espere…"</string> - <string name="no_storage">"Inserte una tarjeta SD antes de usar la cámara"</string> - <string name="not_enough_space">"Su tarjeta de almacenamiento está llena"</string> - <string name="wallpaper">"Estableciendo papel tapiz. Por favor, espere…"</string> - <string name="savingImage">"Guardando imagen"</string> - <string name="runningFaceDetection">"Por favor, espere…"</string> - <!-- no translation found for flip_orientation (2488284515852888409) --> - <skip /> - <string name="settings">"Configuración"</string> - <!-- no translation found for view (4639715088471766970) --> - <skip /> - <string name="details">"Detalles"</string> - <string name="rotate">"Girar"</string> - <string name="rotate_left">"Girar a la izquierda"</string> - <string name="rotate_right">"Girar a la derecha"</string> - <string name="slide_show">"Presentación de diapositivas"</string> - <string name="crop_save_text">"Guardar"</string> - <string name="crop_discard_text">"Descartar"</string> - <!-- no translation found for camera_keep (4046418310305917657) --> - <skip /> - <!-- no translation found for confirm_delete_title (8942471980646707642) --> - <skip /> - <!-- no translation found for confirm_delete_message (6944545476499253074) --> - <skip /> - <string name="camera_toss">"Eliminar"</string> - <string name="camera_share">"Compartir"</string> - <string name="camera_set">"Establecer como…"</string> - <!-- no translation found for camera_play (6388821030721929966) --> - <skip /> - <string name="camera_crop">"Recorte automático"</string> - <string name="camera_tossing">"Eliminando…"</string> - <string name="no_way_to_share_image">"Esta imagen no se puede guardar"</string> - <string name="no_way_to_share_video">"Este vídeo no se puede compartir"</string> - <string name="camera_gallery_photos_text">"Imágenes"</string> - <!-- no translation found for camera_pick_wallpaper (2052155470431167023) --> - <skip /> - <string name="camera_setas_wallpaper">"Papel tapiz"</string> - <!-- no translation found for camera_setas_wallpaper_drm (787462863614664620) --> - <skip /> - <string name="camera_selectphoto">"Seleccionar esta imagen"</string> - <string name="camera_takenewphoto">"Capturar nueva imagen"</string> - <string name="pref_gallery_category">"Vista de álbum de imágenes"</string> - <string name="pref_slideshow_category">"Presentación de diapositivas"</string> - <!-- no translation found for pref_camera_general_settings_category (1720434593482716214) --> - <skip /> - <string name="pref_gallery_size_title">"Tamaño de imagen"</string> - <string name="pref_gallery_size_summary">"Seleccione el tamaño de visualización de las imágenes en los álbumes"</string> - <string name="pref_gallery_size_dialogtitle">"Tamaño de imagen"</string> - <!-- no translation found for pref_gallery_size_choices:0 (3341375119334343613) --> - <!-- no translation found for pref_gallery_size_choices:1 (979877976111629768) --> - <string name="pref_gallery_sort_title">"Orden de las imágenes"</string> - <string name="pref_gallery_sort_summary">"Seleccionar el orden de las imágenes en los álbumes"</string> - <string name="pref_gallery_sort_dialogtitle">"Orden de las imágenes"</string> - <!-- no translation found for pref_gallery_sort_choices:0 (2009184885742004467) --> - <!-- no translation found for pref_gallery_sort_choices:1 (7253524441061782381) --> - <string name="pref_gallery_slideshow_interval_title">"Intervalo en presentación de diapositivas"</string> - <string name="pref_gallery_slideshow_interval_summary">"Seleccione el intervalo entre diapositiva y diapositiva en la presentación"</string> - <string name="pref_gallery_slideshow_interval_dialogtitle">"Intervalo en presentación de diapositivas"</string> - <!-- no translation found for pref_gallery_slideshow_interval_choices:0 (3293392256331071955) --> - <!-- no translation found for pref_gallery_slideshow_interval_choices:1 (6762163459545768561) --> - <!-- no translation found for pref_gallery_slideshow_interval_choices:2 (3999753648109312132) --> - <string name="pref_gallery_slideshow_transition_title">"Transición de diapositivas"</string> - <string name="pref_gallery_slideshow_transition_summary">"Seleccione el efecto que desea usar al pasar de una diapositiva a otra"</string> - <string name="pref_gallery_slideshow_transition_dialogtitle">"Transición de diapositivas"</string> - <!-- no translation found for pref_gallery_slideshow_transition_choices:0 (1917959322875321005) --> - <!-- no translation found for pref_gallery_slideshow_transition_choices:1 (6508707204357284687) --> - <!-- no translation found for pref_gallery_slideshow_transition_choices:2 (5628742586795545287) --> - <!-- no translation found for pref_gallery_slideshow_transition_choices:3 (3350644769941682805) --> - <string name="pref_gallery_slideshow_repeat_title">"Repetir presentación de diapositivas"</string> - <string name="pref_gallery_slideshow_repeat_summary">"Seleccione esta opción para reproducir la presentación de diapositivas más de una vez"</string> - <string name="pref_gallery_slideshow_shuffle_title">"Mostrar diapositivas aleatoriamente"</string> - <string name="pref_gallery_slideshow_shuffle_summary">"Seleccione esta opción para mostrar las imágenes en orden aleatorio"</string> - <string name="pref_camera_recordlocation_title">"Registrar ubicación en imágenes"</string> - <string name="pref_camera_recordlocation_summary">"Seleccione esta opción para registrar automáticamente la ubicación en las imágenes"</string> - <!-- no translation found for pref_camera_postpicturemenu_title (6273327212867896720) --> - <skip /> - <!-- no translation found for pref_camera_postpicturemenu_summary (7911699118676137405) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_category (7460987936373873411) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_title (2766490880685686012) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_summary (6370975165195010636) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_entry_0 (8088669040921661814) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_entry_1 (3505027746158170269) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_dialogtitle (1836746975783096625) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_category (907203894431470628) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_title (3330800694130697647) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_summary (8269173339100296159) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_dialogtitle (5759217298675791948) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_entry_0 (6259385536148037705) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_entry_1 (3178021263058501227) --> - <skip /> - <string name="camerasettings">"Configuración"</string> - <string name="image_gallery_NoImageView_text">"Ninguna imagen"</string> - <!-- no translation found for pref_gallery_confirm_delete_title (201485251343856203) --> - <skip /> - <!-- no translation found for pref_gallery_confirm_delete_summary (7235236977784533739) --> - <skip /> - <string name="details_panel_title">"Detalles"</string> - <string name="details_file_size">"Tamaño de archivo:"</string> - <string name="details_image_resolution">"Resolución:"</string> - <string name="details_date_taken">"Fecha de captura:"</string> - <string name="context_menu_header">"Opciones de imagen"</string> - <string name="multiface_crop_help">"Seleccionar cara para empezar"</string> - <string name="camera_button_hint">"Pulse el botón Capturar para sacar una foto"</string> - <string name="photos_gallery_title">"Imágenes"</string> - <string name="pick_photos_gallery_title">"Seleccionar imagen"</string> - <!-- no translation found for loading_progress_format_string (4252016560676330797) --> - <skip /> - <string name="sendImage">"Compartir esta imagen por"</string> - <!-- no translation found for setImage (6676791915351726249) --> - <skip /> - <string name="sendVideo">"Compartir este vídeo por"</string> -</resources> diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 0ef0a73..b826de9 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"Por favor, espera..."</string> <string name="no_storage">"Antes de utilizar la cámara, debes insertar una tarjeta SD."</string> <string name="not_enough_space">"La tarjeta SD está llena."</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"Estableciendo papel tapiz; por favor, espera..."</string> <string name="savingImage">"Guardando imagen..."</string> <string name="runningFaceDetection">"Por favor, espera..."</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"Galería"</string> <string name="camera_pick_wallpaper">"Imágenes"</string> <string name="camera_setas_wallpaper">"Papel tapiz"</string> - <string name="camera_setas_wallpaper_drm">"Imágenes compradas"</string> - <string name="camera_selectphoto">"Seleccionar esta imagen"</string> - <string name="camera_takenewphoto">"Hacer otra fotografía"</string> <string name="pref_gallery_category">"Configuración general"</string> <string name="pref_slideshow_category">"Configuración de presentación"</string> <string name="pref_camera_general_settings_category">"Configuración general"</string> - <string name="pref_gallery_size_title">"Tamaño de imagen"</string> - <string name="pref_gallery_size_summary">"Seleccionar el tamaño de visualización de las imágenes"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"Tamaño de imagen"</string> <string-array name="pref_gallery_size_choices"> <item>"Grande"</item> <item>"Pequeña"</item> </string-array> - <string name="pref_gallery_sort_title">"Orden de imágenes"</string> - <string name="pref_gallery_sort_summary">"Seleccionar el orden de las imágenes"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"Ordenación de imágenes"</string> <string-array name="pref_gallery_sort_choices"> <item>"Más recientes primero"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"Mostrar imágenes en orden aleatorio"</string> <string name="pref_camera_recordlocation_title">"Almacenar ubicación en imágenes"</string> <string name="pref_camera_recordlocation_summary">"Registrar ubicación en datos de imagen"</string> - <string name="pref_camera_postpicturemenu_title">"Mensaje tras la fotografía"</string> - <string name="pref_camera_postpicturemenu_summary">"Mostrar el menú de acción (guardar, eliminar...) tras realizar la fotografía"</string> <string name="pref_camera_videoquality_category">"Calidad de vídeo"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"Confirmar eliminaciones"</string> - <string name="pref_gallery_confirm_delete_summary">"Mostrar confirmación antes de eliminar imágenes"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"Detalles"</string> <string name="details_file_size">"Tamaño de archivo:"</string> <string name="details_image_resolution">"Resolución:"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"Opciones de imagen"</string> <string name="video_context_menu_header">"Opciones de vídeo"</string> <string name="multiface_crop_help">"Selecciona una cara para empezar."</string> - <string name="camera_button_hint">"Pulsa el botón de captura para realizar la fotografía."</string> - <string name="video_camera_button_hint">"Pulsa el botón de captura para grabar un vídeo."</string> <string name="photos_gallery_title">"Galería"</string> <string name="pick_photos_gallery_title">"Seleccionar imagen"</string> <string name="videos_gallery_title">"Galería"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"Compartir vídeo a través de"</string> <string name="movieviewlabel">"Películas"</string> <string name="loading_video">"Cargando vídeo…"</string> - <string name="picture_saved">"La imagen se ha guardado en la tarjeta SD."</string> - <string name="picture_deleted">"La imagen se ha eliminado."</string> - <string name="video_saved">"El vídeo se ha guardado en la tarjeta SD."</string> - <string name="video_deleted">"El vídeo se ha eliminado"</string> <string name="spaceIsLow_title">"Poco espacio"</string> <string name="spaceIsLow_content">"No queda espacio en la tarjeta SD. Cambia la configuración de calidad o elimina elementos de la galería."</string> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index f60340c..d2c6e3d 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"Veuillez patienter..."</string> <string name="no_storage">"Veuillez insérer une carte SD avant d\'utiliser la caméra."</string> <string name="not_enough_space">"Votre carte SD est pleine."</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"Configuration de l\'arrière-plan en cours. Veuillez patienter..."</string> <string name="savingImage">"Enregistrement de l\'image"</string> <string name="runningFaceDetection">"Veuillez patienter..."</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"Galerie"</string> <string name="camera_pick_wallpaper">"Images"</string> <string name="camera_setas_wallpaper">"Arrière-plan"</string> - <string name="camera_setas_wallpaper_drm">"Images achetées"</string> - <string name="camera_selectphoto">"Sélectionner cette image"</string> - <string name="camera_takenewphoto">"Prendre une nouvelle photo"</string> <string name="pref_gallery_category">"Paramètres généraux"</string> <string name="pref_slideshow_category">"Paramètres du diaporama"</string> <string name="pref_camera_general_settings_category">"Paramètres généraux"</string> - <string name="pref_gallery_size_title">"Taille de l\'image"</string> - <string name="pref_gallery_size_summary">"Sélectionner la taille d\'affichage des images"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"Taille de l\'image"</string> <string-array name="pref_gallery_size_choices"> <item>"Grande"</item> <item>"Petite"</item> </string-array> - <string name="pref_gallery_sort_title">"Trier les images"</string> - <string name="pref_gallery_sort_summary">"Sélectionner l\'ordre de tri des images"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"Trier les images"</string> <string-array name="pref_gallery_sort_choices"> <item>"Les plus récentes d\'abord"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"Afficher les images"</string> <string name="pref_camera_recordlocation_title">"Enregistrer un emplacement dans les images"</string> <string name="pref_camera_recordlocation_summary">"Enregistrer un emplacement dans les données d\'image"</string> - <string name="pref_camera_postpicturemenu_title">"Demander après la capture"</string> - <string name="pref_camera_postpicturemenu_summary">"Afficher l\'option de menu (enregistrer, supprimer, ...) après la capture"</string> <string name="pref_camera_videoquality_category">"Qualité vidéo"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"Confirmer les suppressions"</string> - <string name="pref_gallery_confirm_delete_summary">"Afficher la confirmation avant de supprimer les images"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"Détails"</string> <string name="details_file_size">"Taille du fichier :"</string> <string name="details_image_resolution">"Résolution :"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"Options de l\'image"</string> <string name="video_context_menu_header">"Options vidéo"</string> <string name="multiface_crop_help">"Cliquez sur un visage pour commencer."</string> - <string name="camera_button_hint">"Appuyez sur Capture pour prendre la photo."</string> - <string name="video_camera_button_hint">"Appuyez sur le bouton Déclencher pour enregistrer une vidéo."</string> <string name="photos_gallery_title">"Galerie"</string> <string name="pick_photos_gallery_title">"Sélectionner l\'image"</string> <string name="videos_gallery_title">"Galerie"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"Partager la vidéo via"</string> <string name="movieviewlabel">"Films"</string> <string name="loading_video">"Chargement de la vidéo..."</string> - <string name="picture_saved">"Photo sauvegardée sur la carte SD."</string> - <string name="picture_deleted">"Photo supprimée."</string> - <string name="video_saved">"Vidéo enregistrée sur la carte SD."</string> - <string name="video_deleted">"Vidéo supprimée."</string> <string name="spaceIsLow_title">"L\'espace restant est faible"</string> <string name="spaceIsLow_content">"Votre carte SD est pleine. Modifiez le paramètre de qualité ou supprimez des éléments de la galerie."</string> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 41ba4a3..15f6136 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"Attendere..."</string> <string name="no_storage">"Per usare la fotocamera devi inserire una scheda SD."</string> <string name="not_enough_space">"La scheda SD è piena."</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"Impostazione sfondo, attendi..."</string> <string name="savingImage">"Salvataggio foto..."</string> <string name="runningFaceDetection">"Attendere..."</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"Galleria"</string> <string name="camera_pick_wallpaper">"Foto"</string> <string name="camera_setas_wallpaper">"Sfondo"</string> - <string name="camera_setas_wallpaper_drm">"Foto acquistate"</string> - <string name="camera_selectphoto">"Seleziona questa foto"</string> - <string name="camera_takenewphoto">"Scatta nuova foto"</string> <string name="pref_gallery_category">"Impostazioni generali"</string> <string name="pref_slideshow_category">"Impostazioni presentazione"</string> <string name="pref_camera_general_settings_category">"Impostazioni generali"</string> - <string name="pref_gallery_size_title">"Dimensioni foto"</string> - <string name="pref_gallery_size_summary">"Seleziona dimensioni di visualizz. delle foto"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"Dimensioni foto"</string> <string-array name="pref_gallery_size_choices"> <item>"Grandi"</item> <item>"Piccole"</item> </string-array> - <string name="pref_gallery_sort_title">"Ordine foto"</string> - <string name="pref_gallery_sort_summary">"Seleziona l\'ordine delle foto"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"Ordine foto"</string> <string-array name="pref_gallery_sort_choices"> <item>"Da più recente"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"Mostra le foto in ordine casuale"</string> <string name="pref_camera_recordlocation_title">"Salva località nelle foto"</string> <string name="pref_camera_recordlocation_summary">"Registra località nei dati della foto"</string> - <string name="pref_camera_postpicturemenu_title">"Chiedi dopo scatto"</string> - <string name="pref_camera_postpicturemenu_summary">"Visualizza menu di azioni (salva, elimina etc.) dopo lo scatto"</string> <string name="pref_camera_videoquality_category">"Qualità video"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"Conferma eliminazioni"</string> - <string name="pref_gallery_confirm_delete_summary">"Mostra conferma prima di eliminare le foto"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"Dettagli"</string> <string name="details_file_size">"Dim. file:"</string> <string name="details_image_resolution">"Risoluzione:"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"Opzioni foto"</string> <string name="video_context_menu_header">"Opzioni video"</string> <string name="multiface_crop_help">"Tocca un viso per iniziare."</string> - <string name="camera_button_hint">"Premi Scatta per scattare la foto."</string> - <string name="video_camera_button_hint">"Premi Registra per registrare il video."</string> <string name="photos_gallery_title">"Galleria"</string> <string name="pick_photos_gallery_title">"Seleziona foto"</string> <string name="videos_gallery_title">"Galleria"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"Condividi video via"</string> <string name="movieviewlabel">"Film"</string> <string name="loading_video">"Caricamento video..."</string> - <string name="picture_saved">"Foto salvata su scheda SD."</string> - <string name="picture_deleted">"Foto eliminata."</string> - <string name="video_saved">"Video salvato su scheda SD."</string> - <string name="video_deleted">"Video eliminato."</string> <string name="spaceIsLow_title">"Spazio in esaurimento"</string> <string name="spaceIsLow_content">"Lo spazio della scheda SD si sta esaurendo. Cambia l\'impostazione di qualità o elimina elementi nella galleria."</string> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 0cc6f37..329e51b 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"お待ちください..."</string> <string name="no_storage">"カメラを使用する前にSDカードを挿入してください。"</string> <string name="not_enough_space">"SDカードがいっぱいです。"</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"壁紙を設定しています。しばらくお待ちください..."</string> <string name="savingImage">"写真を保存中..."</string> <string name="runningFaceDetection">"お待ちください..."</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"ギャラリー"</string> <string name="camera_pick_wallpaper">"写真"</string> <string name="camera_setas_wallpaper">"壁紙"</string> - <string name="camera_setas_wallpaper_drm">"購入した写真"</string> - <string name="camera_selectphoto">"この写真を選択"</string> - <string name="camera_takenewphoto">"新しい写真を撮る"</string> <string name="pref_gallery_category">"全般設定"</string> <string name="pref_slideshow_category">"スライドショー設定"</string> <string name="pref_camera_general_settings_category">"全般設定"</string> - <string name="pref_gallery_size_title">"写真サイズ"</string> - <string name="pref_gallery_size_summary">"写真の表示サイズを選択"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"写真サイズ"</string> <string-array name="pref_gallery_size_choices"> <item>"大"</item> <item>"小"</item> </string-array> - <string name="pref_gallery_sort_title">"写真の並べ替え"</string> - <string name="pref_gallery_sort_summary">"写真の表示順を選択"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"写真の並べ替え"</string> <string-array name="pref_gallery_sort_choices"> <item>"日付の新しい順"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"写真をランダムに表示"</string> <string name="pref_camera_recordlocation_title">"位置を写真に保存"</string> <string name="pref_camera_recordlocation_summary">"写真データに位置情報を記録します"</string> - <string name="pref_camera_postpicturemenu_title">"撮影後に確認"</string> - <string name="pref_camera_postpicturemenu_summary">"撮影後に操作メニュー (保存や削除など) を表示"</string> <string name="pref_camera_videoquality_category">"動画のクオリティ"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"削除を確認"</string> - <string name="pref_gallery_confirm_delete_summary">"写真を削除する前に確認メッセージを表示"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"詳細"</string> <string name="details_file_size">"ファイルサイズ:"</string> <string name="details_image_resolution">"解像度:"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"写真オプション"</string> <string name="video_context_menu_header">"動画オプション"</string> <string name="multiface_crop_help">"顔を選択して開始します。"</string> - <string name="camera_button_hint">"写真を撮るには[撮影]ボタンを押してください。"</string> - <string name="video_camera_button_hint">"動画を録画するには[録画]ボタンを押してください。"</string> <string name="photos_gallery_title">"ギャラリー"</string> <string name="pick_photos_gallery_title">"写真を選択"</string> <string name="videos_gallery_title">"ギャラリー"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"動画を共有"</string> <string name="movieviewlabel">"映画"</string> <string name="loading_video">"動画を読み込み中..."</string> - <string name="picture_saved">"写真をSDカードに保存しました。"</string> - <string name="picture_deleted">"写真を削除しました。"</string> - <string name="video_saved">"動画をSDカードに保存しました。"</string> - <string name="video_deleted">"動画を削除しました。"</string> <string name="spaceIsLow_title">"空き容量が残り少なくなっています"</string> <string name="spaceIsLow_content">"SDカードの容量が足りません。クオリティ設定を変更するか、ギャラリーからアイテムを削除してください。"</string> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/drawable/ic_camera_bar_indicator_record_combo.xml b/res/values-ko/arrays.xml index 0b01f2e..dfbf090 100644 --- a/res/drawable/ic_camera_bar_indicator_record_combo.xml +++ b/res/values-ko/arrays.xml @@ -1,24 +1,24 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2008 The Android Open Source Project +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2009 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:state_pressed="true" - android:drawable="@drawable/ic_camera_bar_indicator_record_pressed" /> - <item android:state_window_focused="true" android:state_focused="true" - android:drawable="@drawable/ic_camera_bar_indicator_record_selected" /> - <item android:drawable="@drawable/ic_camera_bar_indicator_record" /> - -</selector> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- no translation found for pref_camera_videoquality_entries:0 (4155278146225809483) --> + <!-- no translation found for pref_camera_videoquality_entries:1 (2439895494739176281) --> + <string-array name="pref_camera_videoquality_entryvalues"> + <item>"0"</item> + <item>"1"</item> + </string-array> +</resources> diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml new file mode 100644 index 0000000..72e8d2e --- /dev/null +++ b/res/values-ko/strings.xml @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="all_images">"모든 사진"</string> + <string name="all_videos">"모든 동영상"</string> + <string name="camera_label">"카메라"</string> + <string name="gallery_picker_label">"갤러리"</string> + <string name="gallery_camera_bucket_name">"카메라 사진"</string> + <string name="gallery_camera_videos_bucket_name">"카메라 동영상"</string> + <string name="switch_to_video_lable">"동영상으로 전환"</string> + <string name="switch_to_camera_lable">"카메라로 전환"</string> + <string name="crop_label">"사진 자르기"</string> + <string name="view_label">"사진 보기"</string> + <string name="preferences_label">"카메라 설정"</string> + <string name="wait">"잠시 기다려 주세요..."</string> + <string name="no_storage">"카메라를 사용하기 전에 먼저 SD 카드를 넣으세요."</string> + <string name="not_enough_space">"SD 카드가 꽉 찼습니다."</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> + <string name="wallpaper">"배경화면 설정 중. 잠시 기다려 주세요..."</string> + <string name="savingImage">"사진 저장 중..."</string> + <string name="runningFaceDetection">"잠시 기다려 주세요..."</string> + <string name="flip_orientation">"방향 바꾸기"</string> + <string name="settings">"설정"</string> + <string name="view">"보기"</string> + <string name="details">"상세정보"</string> + <string name="rotate">"회전"</string> + <string name="rotate_left">"왼쪽으로 회전"</string> + <string name="rotate_right">"오른쪽으로 회전"</string> + <string name="slide_show">"슬라이드쇼"</string> + <string name="capture_picture">"사진촬영"</string> + <string name="capture_video">"동영상 캡처"</string> + <string name="crop_save_text">"저장"</string> + <string name="crop_discard_text">"무시"</string> + <string name="confirm_delete_title">"삭제"</string> + <string name="confirm_delete_message">"사진이 삭제됩니다."</string> + <string name="confirm_delete_video_message">"동영상이 삭제됩니다."</string> + <string name="camera_toss">"삭제"</string> + <!-- no translation found for camera_gallery (815753042966032398) --> + <skip /> + <string name="camera_share">"공유"</string> + <string name="camera_set">"사진 설정"</string> + <string name="camera_play">"재생"</string> + <!-- no translation found for camera_attach (4048659554893435232) --> + <skip /> + <!-- no translation found for camera_cancel (8203341746672085747) --> + <skip /> + <string name="camera_crop">"자르기"</string> + <string name="camera_tossing">"삭제 중..."</string> + <string name="no_way_to_share_image">"공유할 수 없는 사진입니다."</string> + <string name="no_way_to_share_video">"공유할 수 없는 동영상입니다."</string> + <string name="camera_gallery_photos_text">"갤러리"</string> + <string name="camera_pick_wallpaper">"사진"</string> + <string name="camera_setas_wallpaper">"배경화면"</string> + <string name="pref_gallery_category">"일반 설정"</string> + <string name="pref_slideshow_category">"슬라이드쇼 설정"</string> + <string name="pref_camera_general_settings_category">"일반 설정"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> + <string name="pref_gallery_size_dialogtitle">"사진 크기"</string> + <string-array name="pref_gallery_size_choices"> + <item>"크게"</item> + <item>"작게"</item> + </string-array> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> + <string name="pref_gallery_sort_dialogtitle">"사진 정렬"</string> + <string-array name="pref_gallery_sort_choices"> + <item>"가장 최근 사진 먼저"</item> + <item>"가장 최근 사진 마지막에"</item> + </string-array> + <string name="pref_gallery_slideshow_interval_title">"슬라이드쇼 간격"</string> + <string name="pref_gallery_slideshow_interval_summary">"쇼에서 각 슬라이드를 표시할 시간 선택"</string> + <string name="pref_gallery_slideshow_interval_dialogtitle">"슬라이드쇼 간격"</string> + <string-array name="pref_gallery_slideshow_interval_choices"> + <item>"2초"</item> + <item>"3초"</item> + <item>"4초"</item> + </string-array> + <string name="pref_gallery_slideshow_transition_title">"슬라이드쇼 화면전환"</string> + <string name="pref_gallery_slideshow_transition_summary">"슬라이드 간에 이동할 때 사용할 효과 선택"</string> + <string name="pref_gallery_slideshow_transition_dialogtitle">"슬라이드쇼 화면전환"</string> + <string-array name="pref_gallery_slideshow_transition_choices"> + <item>"페이드 인/아웃"</item> + <item>"왼쪽에서 오른쪽으로/오른쪽에서 왼쪽으로"</item> + <item>"위에서 아래로/아래에서 위로"</item> + <item>"무작위 선택"</item> + </string-array> + <string name="pref_gallery_slideshow_repeat_title">"슬라이드쇼 반복"</string> + <string name="pref_gallery_slideshow_repeat_summary">"슬라이드쇼를 한 번 이상 재생"</string> + <string name="pref_gallery_slideshow_shuffle_title">"슬라이드 섞기"</string> + <string name="pref_gallery_slideshow_shuffle_summary">"사진을 무작위 순서로 표시"</string> + <string name="pref_camera_recordlocation_title">"사진에 위치 저장"</string> + <string name="pref_camera_recordlocation_summary">"사진 데이터에 위치 기록"</string> + <string name="pref_camera_videoquality_category">"동영상 화질"</string> + <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> + <skip /> + <string name="pref_camera_videoquality_entry_0">"낮음(MMS 메시지용)"</string> + <string name="pref_camera_videoquality_entry_1">"높음(SD 카드용)"</string> + <string name="pref_camera_videoquality_dialogtitle">"동영상 화질"</string> + <string name="camerasettings">"설정"</string> + <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> + <skip /> + <string name="pref_gallery_confirm_delete_title">"삭제 확인"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> + <string name="details_panel_title">"상세정보"</string> + <string name="details_file_size">"파일 크기:"</string> + <string name="details_image_resolution">"해상도:"</string> + <!-- no translation found for details_duration (1028116471387901402) --> + <skip /> + <string name="details_date_taken">"찍은 날짜:"</string> + <!-- no translation found for details_frame_rate (122397836963498191) --> + <skip /> + <!-- no translation found for details_bit_rate (5632311789455402186) --> + <skip /> + <!-- no translation found for details_codec (5580300450432398126) --> + <skip /> + <!-- no translation found for details_format (3700860266600796363) --> + <skip /> + <!-- no translation found for details_dimension_x (4479200210424701240) --> + <skip /> + <!-- no translation found for details_ms (940634969189855292) --> + <skip /> + <!-- no translation found for details_hms (3215779248094151255) --> + <skip /> + <!-- no translation found for details_fps (2707670327505979317) --> + <skip /> + <!-- no translation found for details_kbps (59196416864960850) --> + <skip /> + <!-- no translation found for details_mbps (3978720645766601106) --> + <skip /> + <!-- no translation found for details_ok (6848594369924424312) --> + <skip /> + <string name="context_menu_header">"사진 옵션"</string> + <string name="video_context_menu_header">"동영상 옵션"</string> + <string name="multiface_crop_help">"시작하려면 얼굴을 탭하세요."</string> + <string name="photos_gallery_title">"갤러리"</string> + <string name="pick_photos_gallery_title">"사진 선택"</string> + <string name="videos_gallery_title">"갤러리"</string> + <string name="pick_videos_gallery_title">"동영상 선택"</string> + <string name="loading_progress_format_string">"<xliff:g id="COUNTER">%d</xliff:g>개 남음"</string> + <string name="sendImage">"사진 공유 응용프로그램"</string> + <string name="setImage">"사진 설정"</string> + <string name="sendVideo">"동영상 공유 응용프로그램"</string> + <string name="movieviewlabel">"영화"</string> + <string name="loading_video">"동영상 로드 중..."</string> + <string name="spaceIsLow_title">"공간부족"</string> + <string name="spaceIsLow_content">"SD 카드의 공간이 부족합니다. 화질 설정을 변경하거나 갤러리에서 항목을 삭제하세요."</string> + <!-- no translation found for resume_playing_title (8996677350649355013) --> + <skip /> + <!-- no translation found for resume_playing_message (5184414518126703481) --> + <skip /> + <!-- no translation found for resume_playing_resume (3847915469173852416) --> + <skip /> + <!-- no translation found for resume_playing_restart (5471008499835769292) --> + <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> +</resources> diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml new file mode 100644 index 0000000..1ec9c8a --- /dev/null +++ b/res/values-nb/strings.xml @@ -0,0 +1,161 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="all_images">"Alle bilder"</string> + <string name="all_videos">"Alle videoer"</string> + <string name="camera_label">"Kamera"</string> + <string name="gallery_picker_label">"Galleri"</string> + <string name="gallery_camera_bucket_name">"Bilder fra kamera"</string> + <string name="gallery_camera_videos_bucket_name">"Videoer fra kamera"</string> + <string name="switch_to_video_lable">"Bytt til video"</string> + <string name="switch_to_camera_lable">"Bytt til kamera"</string> + <string name="crop_label">"Beskjær bilde"</string> + <string name="view_label">"Se på bilde"</string> + <string name="preferences_label">"Kamerainnstillinger"</string> + <string name="wait">"Vent litt…"</string> + <string name="no_storage">"Sett inn et minnekort før du bruker kameraet."</string> + <string name="not_enough_space">"Minnekortet er fullt."</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> + <string name="wallpaper">"Setter bakgrunnsbilde, vent litt…"</string> + <string name="savingImage">"Lagrer bilde…"</string> + <string name="runningFaceDetection">"Vent litt…"</string> + <string name="flip_orientation">"Roter skjerm"</string> + <string name="settings">"Innstillinger"</string> + <string name="view">"Vis"</string> + <string name="details">"Detaljer"</string> + <string name="rotate">"Roter"</string> + <string name="rotate_left">"Roter mot venstre"</string> + <string name="rotate_right">"Roter mot høyre"</string> + <string name="slide_show">"Lysbildevisning"</string> + <string name="capture_picture">"Ta bilde"</string> + <string name="capture_video">"Ta opp video"</string> + <string name="crop_save_text">"Lagre"</string> + <string name="crop_discard_text">"Forkast"</string> + <string name="confirm_delete_title">"Slett"</string> + <string name="confirm_delete_message">"Bildet vil bli slettet."</string> + <string name="confirm_delete_video_message">"Videoen vil bli slettet."</string> + <string name="camera_toss">"Slett"</string> + <!-- no translation found for camera_gallery (815753042966032398) --> + <skip /> + <string name="camera_share">"Del"</string> + <string name="camera_set">"Bruk som"</string> + <string name="camera_play">"Spill"</string> + <!-- no translation found for camera_attach (4048659554893435232) --> + <skip /> + <!-- no translation found for camera_cancel (8203341746672085747) --> + <skip /> + <string name="camera_crop">"Beskjær"</string> + <string name="camera_tossing">"Sletter…"</string> + <string name="no_way_to_share_image">"Bildet kan ikke deles."</string> + <string name="no_way_to_share_video">"Videoen kan ikke deles."</string> + <string name="camera_gallery_photos_text">"Galleri"</string> + <string name="camera_pick_wallpaper">"Bilder"</string> + <string name="camera_setas_wallpaper">"Bakgrunnsbilder"</string> + <string name="pref_gallery_category">"Generelle innstillinger"</string> + <string name="pref_slideshow_category">"Innstillinger for lysbildevisning"</string> + <string name="pref_camera_general_settings_category">"Generelle innstillinger"</string> + <string name="pref_gallery_size_title">"Bildestørrelse"</string> + <string name="pref_gallery_size_summary">"Velg hvor stort bilder skal vises"</string> + <string name="pref_gallery_size_dialogtitle">"Bildestørrelse"</string> + <string-array name="pref_gallery_size_choices"> + <item>"Stor"</item> + <item>"Liten"</item> + </string-array> + <string name="pref_gallery_sort_title">"Bildesortering"</string> + <string name="pref_gallery_sort_summary">"Velg i hvilken rekkefølge bildene skal sorteres"</string> + <string name="pref_gallery_sort_dialogtitle">"Bildesortering"</string> + <string-array name="pref_gallery_sort_choices"> + <item>"Nyeste først"</item> + <item>"Nyeste sist"</item> + </string-array> + <string name="pref_gallery_slideshow_interval_title">"Pause i lysbildevisning"</string> + <string name="pref_gallery_slideshow_interval_summary">"Velg hvor lenge hvert lysbilde skal vises"</string> + <string name="pref_gallery_slideshow_interval_dialogtitle">"Pause i lysbildevisning"</string> + <string-array name="pref_gallery_slideshow_interval_choices"> + <item>"2 sekunder"</item> + <item>"3 sekunder"</item> + <item>"4 sekunder"</item> + </string-array> + <string name="pref_gallery_slideshow_transition_title">"Lysbildeovergang"</string> + <string name="pref_gallery_slideshow_transition_summary">"Velg effekten som skal brukes mellom lysbilder"</string> + <string name="pref_gallery_slideshow_transition_dialogtitle">"Lysbildevergang"</string> + <string-array name="pref_gallery_slideshow_transition_choices"> + <item>"Ton inn og ut"</item> + <item>"Skli venstre - høyre"</item> + <item>"Skli opp - ned"</item> + <item>"Tilfeldig"</item> + </string-array> + <string name="pref_gallery_slideshow_repeat_title">"Gjenta lysbildeserie"</string> + <string name="pref_gallery_slideshow_repeat_summary">"Vis lydbildeserie mer enn en gang"</string> + <string name="pref_gallery_slideshow_shuffle_title">"Stokk lysbilder"</string> + <string name="pref_gallery_slideshow_shuffle_summary">"Vis bilder i tilfeldig rekkefølge"</string> + <string name="pref_camera_recordlocation_title">"Lagre sted i bilder"</string> + <string name="pref_camera_recordlocation_summary">"Lagre sted i bildedata"</string> + <string name="pref_camera_videoquality_category">"Videokvalitet"</string> + <string name="pref_camera_videoquality_title">"Videokvalitet"</string> + <string name="pref_camera_videoquality_entry_0">"Lav (for MMS-meldinger)"</string> + <string name="pref_camera_videoquality_entry_1">"Høy (for minnekort)"</string> + <string name="pref_camera_videoquality_dialogtitle">"Videokvalitet"</string> + <string name="camerasettings">"Innstillinger"</string> + <string name="image_gallery_NoImageView_text">"Fant ingen bilder."</string> + <string name="pref_gallery_confirm_delete_title">"Bekreft sletting"</string> + <string name="pref_gallery_confirm_delete_summary">"Vis bekreftelse før bilder slettes"</string> + <string name="details_panel_title">"Detaljer"</string> + <string name="details_file_size">"Filstørrelse:"</string> + <string name="details_image_resolution">"Oppløsning:"</string> + <string name="details_duration">"Varighet:"</string> + <string name="details_date_taken">"Dato tatt:"</string> + <string name="details_frame_rate">"Bildefrekvens:"</string> + <string name="details_bit_rate">"Bitrate:"</string> + <string name="details_codec">"Kodek:"</string> + <string name="details_format">"Format:"</string> + <string name="details_dimension_x">"%1$d x %2$d"</string> + <string name="details_ms">"%1$02d:%2$02d"</string> + <string name="details_hms">"%1$d:%2$02d:%3$02d"</string> + <string name="details_fps">"%1$d fps"</string> + <string name="details_kbps">"%1$d kbps"</string> + <string name="details_mbps">"%1$g Mbps"</string> + <string name="details_ok">"OK"</string> + <string name="context_menu_header">"Bildeinnstillinger"</string> + <string name="video_context_menu_header">"Videoinnstillinger"</string> + <string name="multiface_crop_help">"Trykk på et ansikt for å begynne."</string> + <string name="photos_gallery_title">"Galleri"</string> + <string name="pick_photos_gallery_title">"Velg bilde"</string> + <string name="videos_gallery_title">"Galleri"</string> + <string name="pick_videos_gallery_title">"Velg video"</string> + <string name="loading_progress_format_string">"<xliff:g id="COUNTER">%d</xliff:g> gjenstår"</string> + <string name="sendImage">"Del bilde via"</string> + <string name="setImage">"Bruk bilde som"</string> + <string name="sendVideo">"Del video via"</string> + <string name="movieviewlabel">"Filmer"</string> + <string name="loading_video">"Laster video…"</string> + <string name="spaceIsLow_title">"Lite plass"</string> + <string name="spaceIsLow_content">"Minnekortet begynner å gå tom for plass. Endre kvalitetsinnstillingen eller slett bilder fra galleriet."</string> + <!-- no translation found for resume_playing_title (8996677350649355013) --> + <skip /> + <!-- no translation found for resume_playing_message (5184414518126703481) --> + <skip /> + <!-- no translation found for resume_playing_resume (3847915469173852416) --> + <skip /> + <!-- no translation found for resume_playing_restart (5471008499835769292) --> + <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> + <!-- no translation found for video_file_name_format (8555507706353616970) --> + <skip /> +</resources> diff --git a/res/values-nl-rNL/strings.xml b/res/values-nl-rNL/strings.xml deleted file mode 100644 index 7ac8784..0000000 --- a/res/values-nl-rNL/strings.xml +++ /dev/null @@ -1,140 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for all_images (7177582020160054334) --> - <skip /> - <string name="camera_label">"Camera"</string> - <string name="gallery_picker_label">"Albums"</string> - <!-- no translation found for gallery_camera_bucket_name (8410686962557494439) --> - <skip /> - <!-- no translation found for switch_to_video_lable (1350915759804484157) --> - <skip /> - <!-- no translation found for switch_to_camera_lable (1823306882227066007) --> - <skip /> - <string name="crop_label">"Afbeelding inkorten"</string> - <string name="view_label">"Afbeelding weergeven"</string> - <string name="preferences_label">"Camera-instellingen"</string> - <string name="wait">"Een ogenblik geduld…"</string> - <string name="no_storage">"Plaats een sd-kaart voordat u de camera gebruikt"</string> - <string name="not_enough_space">"Deze geheugenkaart is vol"</string> - <string name="wallpaper">"Achtergrond wordt ingesteld, een ogenblik geduld…"</string> - <string name="savingImage">"Afbeelding opslaan"</string> - <string name="runningFaceDetection">"Een ogenblik geduld…"</string> - <!-- no translation found for flip_orientation (2488284515852888409) --> - <skip /> - <string name="settings">"Instellingen"</string> - <!-- no translation found for view (4639715088471766970) --> - <skip /> - <string name="details">"Details"</string> - <string name="rotate">"Draaien"</string> - <string name="rotate_left">"Links draaien"</string> - <string name="rotate_right">"Rechts draaien"</string> - <string name="slide_show">"Diavoorstelling"</string> - <string name="crop_save_text">"Opslaan"</string> - <string name="crop_discard_text">"Wissen"</string> - <!-- no translation found for camera_keep (4046418310305917657) --> - <skip /> - <!-- no translation found for confirm_delete_title (8942471980646707642) --> - <skip /> - <!-- no translation found for confirm_delete_message (6944545476499253074) --> - <skip /> - <string name="camera_toss">"Verwijderen"</string> - <string name="camera_share">"Delen"</string> - <string name="camera_set">"Instellen als…"</string> - <!-- no translation found for camera_play (6388821030721929966) --> - <skip /> - <string name="camera_crop">"Automatisch inkorten"</string> - <string name="camera_tossing">"Bezig met verwijderen…"</string> - <string name="no_way_to_share_image">"De afbeelding kan niet worden opgeslagen"</string> - <string name="no_way_to_share_video">"Deze video kan niet worden gedeeld"</string> - <string name="camera_gallery_photos_text">"Afbeeldingen"</string> - <!-- no translation found for camera_pick_wallpaper (2052155470431167023) --> - <skip /> - <string name="camera_setas_wallpaper">"Achtergrond"</string> - <!-- no translation found for camera_setas_wallpaper_drm (787462863614664620) --> - <skip /> - <string name="camera_selectphoto">"Dit beeld selecteren"</string> - <string name="camera_takenewphoto">"Nieuwe afbeelding maken"</string> - <string name="pref_gallery_category">"Fotoalbumweergave"</string> - <string name="pref_slideshow_category">"Diavoorstelling"</string> - <!-- no translation found for pref_camera_general_settings_category (1720434593482716214) --> - <skip /> - <string name="pref_gallery_size_title">"Afbeeldinggrootte"</string> - <string name="pref_gallery_size_summary">"Selecteer de grootte van afbeeldingen in albums"</string> - <string name="pref_gallery_size_dialogtitle">"Afbeeldinggrootte"</string> - <!-- no translation found for pref_gallery_size_choices:0 (3341375119334343613) --> - <!-- no translation found for pref_gallery_size_choices:1 (979877976111629768) --> - <string name="pref_gallery_sort_title">"Afbeelding sorteren"</string> - <string name="pref_gallery_sort_summary">"Selecteer de volgorde van afbeeldingen in albums"</string> - <string name="pref_gallery_sort_dialogtitle">"Afbeelding sorteren"</string> - <!-- no translation found for pref_gallery_sort_choices:0 (2009184885742004467) --> - <!-- no translation found for pref_gallery_sort_choices:1 (7253524441061782381) --> - <string name="pref_gallery_slideshow_interval_title">"Diashowinterval"</string> - <string name="pref_gallery_slideshow_interval_summary">"Kies hoe lang elke dia wordt weergegeven"</string> - <string name="pref_gallery_slideshow_interval_dialogtitle">"Diashowinterval"</string> - <!-- no translation found for pref_gallery_slideshow_interval_choices:0 (3293392256331071955) --> - <!-- no translation found for pref_gallery_slideshow_interval_choices:1 (6762163459545768561) --> - <!-- no translation found for pref_gallery_slideshow_interval_choices:2 (3999753648109312132) --> - <string name="pref_gallery_slideshow_transition_title">"Diashowovergang"</string> - <string name="pref_gallery_slideshow_transition_summary">"Kies het effect als van de ene naar de andere dia wordt gewisseld"</string> - <string name="pref_gallery_slideshow_transition_dialogtitle">"Diashowovergang"</string> - <!-- no translation found for pref_gallery_slideshow_transition_choices:0 (1917959322875321005) --> - <!-- no translation found for pref_gallery_slideshow_transition_choices:1 (6508707204357284687) --> - <!-- no translation found for pref_gallery_slideshow_transition_choices:2 (5628742586795545287) --> - <!-- no translation found for pref_gallery_slideshow_transition_choices:3 (3350644769941682805) --> - <string name="pref_gallery_slideshow_repeat_title">"Diashow herhalen"</string> - <string name="pref_gallery_slideshow_repeat_summary">"Selecteren om de diashow meer dan eenmaal af te spelen"</string> - <string name="pref_gallery_slideshow_shuffle_title">"Willekeurige volgorde"</string> - <string name="pref_gallery_slideshow_shuffle_summary">"Selecteren om afbeeldingen in willekeurige volgorde af te spelen"</string> - <string name="pref_camera_recordlocation_title">"Locatie in afbeeldingen opnemen"</string> - <string name="pref_camera_recordlocation_summary">"Selecteren om de locatie automatisch op te nemen bij fotos"</string> - <!-- no translation found for pref_camera_postpicturemenu_title (6273327212867896720) --> - <skip /> - <!-- no translation found for pref_camera_postpicturemenu_summary (7911699118676137405) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_category (7460987936373873411) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_title (2766490880685686012) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_summary (6370975165195010636) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_entry_0 (8088669040921661814) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_entry_1 (3505027746158170269) --> - <skip /> - <!-- no translation found for pref_camera_videoquality_dialogtitle (1836746975783096625) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_category (907203894431470628) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_title (3330800694130697647) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_summary (8269173339100296159) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_dialogtitle (5759217298675791948) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_entry_0 (6259385536148037705) --> - <skip /> - <!-- no translation found for pref_camera_videocodec_entry_1 (3178021263058501227) --> - <skip /> - <string name="camerasettings">"Instellingen"</string> - <string name="image_gallery_NoImageView_text">"Geen afbeeldingen"</string> - <!-- no translation found for pref_gallery_confirm_delete_title (201485251343856203) --> - <skip /> - <!-- no translation found for pref_gallery_confirm_delete_summary (7235236977784533739) --> - <skip /> - <string name="details_panel_title">"Details"</string> - <string name="details_file_size">"Bestandsgrootte:"</string> - <string name="details_image_resolution">"Resolutie:"</string> - <string name="details_date_taken">"Genomen op:"</string> - <string name="context_menu_header">"Beeldopties"</string> - <string name="multiface_crop_help">"Gezicht kiezen om te starten"</string> - <string name="camera_button_hint">"Druk op de Vastlegtoets om een foto te maken"</string> - <string name="photos_gallery_title">"Afbeeldingen"</string> - <string name="pick_photos_gallery_title">"Afbeelding selecteren"</string> - <!-- no translation found for loading_progress_format_string (4252016560676330797) --> - <skip /> - <string name="sendImage">"Deze afbeelding delen via"</string> - <!-- no translation found for setImage (6676791915351726249) --> - <skip /> - <string name="sendVideo">"Deze video delen via"</string> -</resources> diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index b580d7c..9f7aa3b 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"Een ogenblik geduld..."</string> <string name="no_storage">"Plaats een SD-kaart voordat u de camera gebruikt."</string> <string name="not_enough_space">"De SD-kaart is vol."</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"Achtergrond wordt ingesteld. Een ogenblik geduld..."</string> <string name="savingImage">"Foto opslaan..."</string> <string name="runningFaceDetection">"Een ogenblik geduld..."</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"Galerij"</string> <string name="camera_pick_wallpaper">"Foto\'s"</string> <string name="camera_setas_wallpaper">"Achtergrond"</string> - <string name="camera_setas_wallpaper_drm">"Aangeschafte foto\'s"</string> - <string name="camera_selectphoto">"Deze foto selecteren"</string> - <string name="camera_takenewphoto">"Nieuwe foto vastleggen"</string> <string name="pref_gallery_category">"Algemene instellingen"</string> <string name="pref_slideshow_category">"Instellingen van diavoorstelling"</string> <string name="pref_camera_general_settings_category">"Algemene instellingen"</string> - <string name="pref_gallery_size_title">"Grootte van foto"</string> - <string name="pref_gallery_size_summary">"De weergavegrootte van foto\'s selecteren"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"Grootte van foto"</string> <string-array name="pref_gallery_size_choices"> <item>"Groot"</item> <item>"Klein"</item> </string-array> - <string name="pref_gallery_sort_title">"Foto\'s sorteren"</string> - <string name="pref_gallery_sort_summary">"De sorteervolgorde van foto\'s selecteren"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"Foto\'s sorteren"</string> <string-array name="pref_gallery_sort_choices"> <item>"Nieuwste eerst"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"Foto\'s in willekeurige volgorde weergeven"</string> <string name="pref_camera_recordlocation_title">"Locatie opslaan in foto\'s"</string> <string name="pref_camera_recordlocation_summary">"Locatie vastleggen in de gegevens van de foto"</string> - <string name="pref_camera_postpicturemenu_title">"Vragen na vastleggen"</string> - <string name="pref_camera_postpicturemenu_summary">"Menu met acties (opslaan, verwijderen, enz.) weergeven na vastleggen"</string> <string name="pref_camera_videoquality_category">"Videokwaliteit"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"Verwijderen bevestigen"</string> - <string name="pref_gallery_confirm_delete_summary">"Vragen om bevestiging voordat foto\'s worden verwijderd"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"Details"</string> <string name="details_file_size">"Bestandsgrootte:"</string> <string name="details_image_resolution">"Resolutie:"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"Opties voor foto\'s"</string> <string name="video_context_menu_header">"Video-opties"</string> <string name="multiface_crop_help">"Tik op een gezicht om te beginnen."</string> - <string name="camera_button_hint">"Druk op de knop Vastleggen om de foto te maken."</string> - <string name="video_camera_button_hint">"Druk op de knop \'Opnemen\' om videomateriaal op te nemen."</string> <string name="photos_gallery_title">"Galerij"</string> <string name="pick_photos_gallery_title">"Foto selecteren"</string> <string name="videos_gallery_title">"Galerij"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"Video delen via"</string> <string name="movieviewlabel">"Films"</string> <string name="loading_video">"Video laden..."</string> - <string name="picture_saved">"Foto opgeslagen op SD-kaart."</string> - <string name="picture_deleted">"Foto verwijderd."</string> - <string name="video_saved">"Video opgeslagen op SD-kaart."</string> - <string name="video_deleted">"Video verwijderd."</string> <string name="spaceIsLow_title">"Er is weinig ruimte"</string> <string name="spaceIsLow_content">"Er is weinig ruimte beschikbaar op uw SD-kaart. U kunt de kwaliteitsinstelling wijzigen of items uit de galerij verwijderen."</string> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 973ea61..882ae3b 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"Poczekaj…"</string> <string name="no_storage">"Zanim zaczniesz korzystać z aparatu fotograficznego, włóż kartę SD."</string> <string name="not_enough_space">"Karta SD jest pełna."</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"Ustawianie tapety, poczekaj…"</string> <string name="savingImage">"Trwa zapisywanie zdjęcia…"</string> <string name="runningFaceDetection">"Poczekaj…"</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"Galeria"</string> <string name="camera_pick_wallpaper">"Zdjęcia"</string> <string name="camera_setas_wallpaper">"Tapeta"</string> - <string name="camera_setas_wallpaper_drm">"Zakupione zdjęcia"</string> - <string name="camera_selectphoto">"Wybierz to zdjęcie"</string> - <string name="camera_takenewphoto">"Zrób nowe zdjęcie"</string> <string name="pref_gallery_category">"Ustawienia ogólne"</string> <string name="pref_slideshow_category">"Ustawienia pokazu slajdów"</string> <string name="pref_camera_general_settings_category">"Ustawienia ogólne"</string> - <string name="pref_gallery_size_title">"Rozmiar zdjęć"</string> - <string name="pref_gallery_size_summary">"Ustaw wyświetlany rozmiar zdjęć"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"Rozmiar zdjęć"</string> <string-array name="pref_gallery_size_choices"> <item>"Duży"</item> <item>"Mały"</item> </string-array> - <string name="pref_gallery_sort_title">"Sortowanie zdjęć"</string> - <string name="pref_gallery_sort_summary">"Wybierz kolejność sortowania zdjęć"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"Sortowanie zdjęć"</string> <string-array name="pref_gallery_sort_choices"> <item>"Najpierw najnowsze"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"Wyświetlaj zdjęcia w kolejności losowej"</string> <string name="pref_camera_recordlocation_title">"Zapisuj lokalizację w zdjęciach"</string> <string name="pref_camera_recordlocation_summary">"Zapisz lokalizację w danych zdjęcia"</string> - <string name="pref_camera_postpicturemenu_title">"Monit po zrobieniu zdjęcia"</string> - <string name="pref_camera_postpicturemenu_summary">"Wyświetlaj menu działań (zapisz, usuń…) po zrobieniu zdjęcia"</string> <string name="pref_camera_videoquality_category">"Jakość wideo"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"Potwierdzanie usuwania"</string> - <string name="pref_gallery_confirm_delete_summary">"Prośba o potwierdzenie przy usuwaniu zdjęć"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"Szczegóły"</string> <string name="details_file_size">"Rozmiar pliku:"</string> <string name="details_image_resolution">"Rozdzielczość:"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"Opcje zdjęć"</string> <string name="video_context_menu_header">"Opcje wideo"</string> <string name="multiface_crop_help">"Dotknij twarzy, aby rozpocząć"</string> - <string name="camera_button_hint">"Naciśnij przycisk „Zrób zdjęcie”, aby zrobić zdjęcie."</string> - <string name="video_camera_button_hint">"Naciśnij przycisk robienia zdjęć, aby nagrać film wideo."</string> <string name="photos_gallery_title">"Galeria"</string> <string name="pick_photos_gallery_title">"Wybierz zdjęcie"</string> <string name="videos_gallery_title">"Galeria"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"Prześlij film następującą drogą:"</string> <string name="movieviewlabel">"Filmy"</string> <string name="loading_video">"Ładowanie filmu wideo..."</string> - <string name="picture_saved">"Zapisano zdjęcie na karcie SD."</string> - <string name="picture_deleted">"Usunięto zdjęcie."</string> - <string name="video_saved">"Zapisano film wideo na karcie SD."</string> - <string name="video_deleted">"Usunięto film wideo."</string> <string name="spaceIsLow_title">"Miejsca jest mało"</string> <string name="spaceIsLow_content">"Na karcie SD brakuje miejsca. Zmień ustawienie jakości lub usuń elementy z Galerii."</string> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 6a73575..ef3b196 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"Подождите…"</string> <string name="no_storage">"Перед использованием камеры вставьте карту SD."</string> <string name="not_enough_space">"Карта SD заполнена."</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"Установка фонового рисунка, подождите…"</string> <string name="savingImage">"Идет сохранение изображения…"</string> <string name="runningFaceDetection">"Подождите…"</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"Галерея"</string> <string name="camera_pick_wallpaper">"Изображения"</string> <string name="camera_setas_wallpaper">"Фоновый рисунок"</string> - <string name="camera_setas_wallpaper_drm">"Приобретенные изображения"</string> - <string name="camera_selectphoto">"Выбрать это изображение"</string> - <string name="camera_takenewphoto">"Сделать новую фотографию"</string> <string name="pref_gallery_category">"Общие настройки"</string> <string name="pref_slideshow_category">"Настройки слайд-шоу"</string> <string name="pref_camera_general_settings_category">"Общие настройки"</string> - <string name="pref_gallery_size_title">"Размер изображения"</string> - <string name="pref_gallery_size_summary">"Выбор отображаемого размера изображений"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"Размер изображения"</string> <string-array name="pref_gallery_size_choices"> <item>"Крупный"</item> <item>"Мелкий"</item> </string-array> - <string name="pref_gallery_sort_title">"Сортировка изображений"</string> - <string name="pref_gallery_sort_summary">"Выберите порядок сортировки изображений"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"Сортировка изображений"</string> <string-array name="pref_gallery_sort_choices"> <item>"Начиная с новых"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"Показывать изображения в случайном порядке"</string> <string name="pref_camera_recordlocation_title">"Сохранять адрес в изображениях"</string> <string name="pref_camera_recordlocation_summary">"Записывать адрес в данные изображения"</string> - <string name="pref_camera_postpicturemenu_title">"Спрашивать после съемки"</string> - <string name="pref_camera_postpicturemenu_summary">"Отображать меню действий (сохранение, удаление и т.д.) после съемки"</string> <string name="pref_camera_videoquality_category">"Качество видео"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"Подтверждение удаления"</string> - <string name="pref_gallery_confirm_delete_summary">"Просить подтверждения перед удалением изображений"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"Сведения"</string> <string name="details_file_size">"Размер файла:"</string> <string name="details_image_resolution">"Разрешение:"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"Параметры изображения"</string> <string name="video_context_menu_header">"Параметры видео"</string> <string name="multiface_crop_help">"Чтобы начать, выберите лицо."</string> - <string name="camera_button_hint">"Чтобы сделать фотографию, нажмите кнопку Снять."</string> - <string name="video_camera_button_hint">"Нажмите кнопку Съемка для записи видео."</string> <string name="photos_gallery_title">"Галерея"</string> <string name="pick_photos_gallery_title">"Выбор изображения"</string> <string name="videos_gallery_title">"Галерея"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"Отправить видео при помощи"</string> <string name="movieviewlabel">"Фильмы"</string> <string name="loading_video">"Идет загрузка видео…"</string> - <string name="picture_saved">"Изображение сохранено на карту SD."</string> - <string name="picture_deleted">"Изображение удалено."</string> - <string name="video_saved">"Видео сохранено на карту SD."</string> - <string name="video_deleted">"Видео удалено."</string> <string name="spaceIsLow_title">"Осталось мало места"</string> <string name="spaceIsLow_content">"Место на карте SD заканчивается. Измените настройки качества или удалите элементы из галереи."</string> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 4a030c4..324c9e6 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"请稍候..."</string> <string name="no_storage">"请在使用相机之前插入 SD 卡。"</string> <string name="not_enough_space">"您的 SD 卡已满。"</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"正在设置壁纸,请稍候..."</string> <string name="savingImage">"正在保存图片..."</string> <string name="runningFaceDetection">"请稍候..."</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"图片库"</string> <string name="camera_pick_wallpaper">"图片"</string> <string name="camera_setas_wallpaper">"壁纸"</string> - <string name="camera_setas_wallpaper_drm">"购买的图片"</string> - <string name="camera_selectphoto">"选择该图片"</string> - <string name="camera_takenewphoto">"拍摄新照片"</string> <string name="pref_gallery_category">"常规设置"</string> <string name="pref_slideshow_category">"幻灯片演示设置"</string> <string name="pref_camera_general_settings_category">"常规设置"</string> - <string name="pref_gallery_size_title">"图片大小"</string> - <string name="pref_gallery_size_summary">"选择图片的显示大小"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"图片大小"</string> <string-array name="pref_gallery_size_choices"> <item>"大"</item> <item>"小"</item> </string-array> - <string name="pref_gallery_sort_title">"图片排序"</string> - <string name="pref_gallery_sort_summary">"选择图片的排序顺序"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"图片排序"</string> <string-array name="pref_gallery_sort_choices"> <item>"最新的在最前面"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"以随机顺序显示图片"</string> <string name="pref_camera_recordlocation_title">"在图片中存储位置"</string> <string name="pref_camera_recordlocation_summary">"通过图片数据记录位置"</string> - <string name="pref_camera_postpicturemenu_title">"在拍摄后提示"</string> - <string name="pref_camera_postpicturemenu_summary">"在拍摄后显示操作菜单(保存、删除等等)"</string> <string name="pref_camera_videoquality_category">"视频质量"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"确认删除"</string> - <string name="pref_gallery_confirm_delete_summary">"在删除图片之前显示确认"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"详细信息"</string> <string name="details_file_size">"文件大小:"</string> <string name="details_image_resolution">"分辨率:"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"图片选项"</string> <string name="video_context_menu_header">"视频选项"</string> <string name="multiface_crop_help">"轻击一张脸开始裁切。"</string> - <string name="camera_button_hint">"按“拍摄”按钮获得该图片。"</string> - <string name="video_camera_button_hint">"按“拍摄”按钮录制视频。"</string> <string name="photos_gallery_title">"图片库"</string> <string name="pick_photos_gallery_title">"选择图片"</string> <string name="videos_gallery_title">"图片库"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"共享视频的方式"</string> <string name="movieviewlabel">"电影"</string> <string name="loading_video">"正在载入视频..."</string> - <string name="picture_saved">"照片已保存到 SD 卡中。"</string> - <string name="picture_deleted">"照片已删除。"</string> - <string name="video_saved">"视频已保存到 SD 卡中。"</string> - <string name="video_deleted">"视频已删除。"</string> <string name="spaceIsLow_title">"空间不足"</string> <string name="spaceIsLow_content">"您的 SD 卡已满。请更改质量设置或删除图片库中的内容。"</string> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 2fe3a5c..c3243ca 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -29,6 +29,8 @@ <string name="wait">"請稍候…"</string> <string name="no_storage">"使用相機前請先插入 SD 卡。"</string> <string name="not_enough_space">"SD 卡已滿。"</string> + <!-- no translation found for preparing_sd (2914969119574812666) --> + <skip /> <string name="wallpaper">"設定桌布中,請稍候…"</string> <string name="savingImage">"儲存相片中…"</string> <string name="runningFaceDetection">"請稍候…"</string> @@ -64,21 +66,22 @@ <string name="camera_gallery_photos_text">"圖庫"</string> <string name="camera_pick_wallpaper">"相片"</string> <string name="camera_setas_wallpaper">"桌布"</string> - <string name="camera_setas_wallpaper_drm">"已購買的相片"</string> - <string name="camera_selectphoto">"選取此相片"</string> - <string name="camera_takenewphoto">"拍攝新相片"</string> <string name="pref_gallery_category">"一般設定"</string> <string name="pref_slideshow_category">"投影片設定"</string> <string name="pref_camera_general_settings_category">"一般設定"</string> - <string name="pref_gallery_size_title">"相片大小"</string> - <string name="pref_gallery_size_summary">"選取相片顯示大小"</string> + <!-- no translation found for pref_gallery_size_title (1363406603879434418) --> + <skip /> + <!-- no translation found for pref_gallery_size_summary (8179967445295243638) --> + <skip /> <string name="pref_gallery_size_dialogtitle">"相片大小"</string> <string-array name="pref_gallery_size_choices"> <item>"大"</item> <item>"小"</item> </string-array> - <string name="pref_gallery_sort_title">"圖片排序"</string> - <string name="pref_gallery_sort_summary">"選取相片排序順序"</string> + <!-- no translation found for pref_gallery_sort_title (7447949250045443386) --> + <skip /> + <!-- no translation found for pref_gallery_sort_summary (6644398051645595214) --> + <skip /> <string name="pref_gallery_sort_dialogtitle">"圖片排序"</string> <string-array name="pref_gallery_sort_choices"> <item>"最新的優先"</item> @@ -107,8 +110,6 @@ <string name="pref_gallery_slideshow_shuffle_summary">"隨機顯示相片"</string> <string name="pref_camera_recordlocation_title">"在相片儲存位置資訊"</string> <string name="pref_camera_recordlocation_summary">"在相片中紀錄位置資訊"</string> - <string name="pref_camera_postpicturemenu_title">"拍攝後顯示提示"</string> - <string name="pref_camera_postpicturemenu_summary">"照相後顯示動作選單 (儲存、刪除,…)"</string> <string name="pref_camera_videoquality_category">"影片品質"</string> <!-- no translation found for pref_camera_videoquality_title (3836197291744160920) --> <skip /> @@ -119,7 +120,8 @@ <!-- no translation found for image_gallery_NoImageView_text (409595259802877447) --> <skip /> <string name="pref_gallery_confirm_delete_title">"刪除確認"</string> - <string name="pref_gallery_confirm_delete_summary">"刪除相片前顯示確認"</string> + <!-- no translation found for pref_gallery_confirm_delete_summary (5253456492765525245) --> + <skip /> <string name="details_panel_title">"詳細資料"</string> <string name="details_file_size">"檔案大小:"</string> <string name="details_image_resolution">"解析度:"</string> @@ -151,8 +153,6 @@ <string name="context_menu_header">"圖片選項"</string> <string name="video_context_menu_header">"影片選項"</string> <string name="multiface_crop_help">"選取版面開始裁切"</string> - <string name="camera_button_hint">"按下拍攝鍵進行拍攝。"</string> - <string name="video_camera_button_hint">"按下 [拍攝] 按鈕可錄製影片。"</string> <string name="photos_gallery_title">"圖庫"</string> <string name="pick_photos_gallery_title">"選取相片"</string> <string name="videos_gallery_title">"圖庫"</string> @@ -163,10 +163,6 @@ <string name="sendVideo">"透過…分享影片"</string> <string name="movieviewlabel">"電影"</string> <string name="loading_video">"正在載入影片…"</string> - <string name="picture_saved">"儲存至 SD 卡的圖片。"</string> - <string name="picture_deleted">"已刪除圖片。"</string> - <string name="video_saved">"已將影片儲存至 SD 卡。"</string> - <string name="video_deleted">"已刪除影片。"</string> <string name="spaceIsLow_title">"空間不足"</string> <string name="spaceIsLow_content">"您的 SD 卡空間已快用完。請變更品質設定或刪除圖庫中的項目。"</string> <!-- no translation found for resume_playing_title (8996677350649355013) --> @@ -177,4 +173,6 @@ <skip /> <!-- no translation found for resume_playing_restart (5471008499835769292) --> <skip /> + <!-- no translation found for gadget_title (259405922673466798) --> + <skip /> </resources> diff --git a/res/values/strings.xml b/res/values/strings.xml index 8482a60..161f960 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -62,6 +62,9 @@ <!-- alert to the user to that the SD card is too full to complete the operation --> <string name="not_enough_space">Your SD card is full.</string> + <!-- alert to the user to that the SD card is being disk-checked --> + <string name="preparing_sd">Preparing SD card\u2026</string> + <!-- Toast/alert after saving wallpaper --> <string name="wallpaper">Setting wallpaper, please wait\u2026</string> @@ -158,18 +161,6 @@ <string name="camera_pick_wallpaper">Pictures</string> <string name="camera_setas_wallpaper">Wallpaper</string> - <string name="camera_setas_wallpaper_drm">Purchased pictures</string> - - <string name="camera_selectphoto">Select this picture</string> - - <!-- Button indicating to skip the picture just taken and take another one (this is used - when the camera is invoked for the purpose of returning a picture to another activity - such as a contacts photo). --> - <string name="camera_takenewphoto">Capture new picture</string> - - <!-- Do not translate --> - <string name="camera_takenewvideo">Capture new video</string> - <!-- Settings screen, section heading --> <string name="pref_gallery_category">General settings</string> @@ -178,10 +169,10 @@ <string name="pref_camera_general_settings_category">General settings</string> <!-- Settings screen, setting summary text --> - <string name="pref_gallery_size_title">Picture size</string> + <string name="pref_gallery_size_title">Display size</string> <!-- Settings screen, title for preference for image size to be used in the im --> - <string name="pref_gallery_size_summary">Select the display size of pictures</string> + <string name="pref_gallery_size_summary">Select the display size of pictures and videos</string> <!-- Title of dialog that appears after selecting Picture size setting option --> <string name="pref_gallery_size_dialogtitle">Picture size</string> <!-- Options in dialog that appears after selecting Picture size setting option --> @@ -201,9 +192,9 @@ <!-- Do not translate. Default option value in dialog that appears after selecting Picture size setting option --> <string name="default_value_pref_gallery_size">1</string> <!-- Settings screen, setting option name --> - <string name="pref_gallery_sort_title">Picture sort</string> + <string name="pref_gallery_sort_title">Sort order</string> <!-- Settings screen, setting summary text --> - <string name="pref_gallery_sort_summary">Select the sort order of pictures</string> + <string name="pref_gallery_sort_summary">Select the sort order of pictures and videos</string> <!-- Title of dialog that appears after selecting Picture sort setting option --> <string name="pref_gallery_sort_dialogtitle">Picture sort</string> <!-- Options in dialog that appears after selecting Picture sort setting option --> @@ -308,12 +299,6 @@ <!-- Do not translate --> <string name="pref_camera_upload_albumname_dialogtitle">Picasa album name</string> - <!-- [No longer used.] Settings screen, setting title text --> - <string name="pref_camera_postpicturemenu_title">Prompt after capture</string> - - <!-- [No longer used.] Settings screen, setting summary text --> - <string name="pref_camera_postpicturemenu_summary">Display action menu (save, delete, \u2026) after capture</string> - <!-- Settings screen, Video quality category title --> <string name="pref_camera_videoquality_category">Video quality</string> @@ -341,7 +326,7 @@ <string name="pref_gallery_confirm_delete_title">Confirm deletions</string> <!-- Preference summary for whether the user should be prompted form confirmation when deleting images --> - <string name="pref_gallery_confirm_delete_summary">Show confirmation before deleting pictures</string> + <string name="pref_gallery_confirm_delete_summary">Show confirmation before deleting a picture or video</string> <!-- Details stuff --> <!-- Do not translate --> @@ -407,10 +392,6 @@ <string name="video_context_menu_header">Video options</string> <!-- Hint that appears when cropping an image with more than one face --> <string name="multiface_crop_help">Tap a face to begin.</string> - <!-- Hint/toast that appears when user first opens capture screen on still picture camera --> - <string name="camera_button_hint">Press Capture button to take picture.</string> - <!-- Hint/toast that appears when user first opens capture screen on video camera --> - <string name="video_camera_button_hint">Press Capture button to record video.</string> <!-- Activity title when in the image gallery to see pictures --> <string name="photos_gallery_title">Gallery</string> @@ -444,16 +425,6 @@ <!-- shown in the video player view while the video is being loaded, before it starts playing --> <string name="loading_video">Loading video\u2026</string> - <!-- Displayed as a toast when a picture is saved --> - <string name="picture_saved">Picture saved to SD card.</string> - <!-- Displayed as a toast when a picture is deleted --> - <string name="picture_deleted">Picture deleted.</string> - - <!-- Displayed as a toast when a video is saved --> - <string name="video_saved">Video saved to SD card.</string> - <!-- Displayed as a toast when a video is deleted --> - <string name="video_deleted">Video deleted.</string> - <!-- Low-memory dialog title --> <string name="spaceIsLow_title">Space is low</string> <!-- Low-memory dialog message --> @@ -471,4 +442,11 @@ <!-- Movie View Start Playing button "Beginning" --> <string name="resume_playing_restart">Start over</string> + <!-- Title for picture frame gadget to show in list of all available gadgets --> + <string name="gadget_title">Picture frame</string> + + <!-- Video Camera format string for new video files. Passed to java.text.SimpleDateFormat. + Do not localize --> + <string name="video_file_name_format">"'video'-yyyy-MM-dd-HH-mm-ss"</string> + </resources> diff --git a/res/values/styles.xml b/res/values/styles.xml index 726a952..2000bf9 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -28,13 +28,9 @@ <item name="android:shadowRadius">2.0</item> <item name="android:textColor">#FFF</item> <item name="android:gravity">center_horizontal</item> - <item name="android:layout_width">fill_parent</item> - <item name="android:layout_height">fill_parent</item> - <item name="android:paddingLeft">5dip</item> - <item name="android:paddingRight">5dip</item> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginLeft">32dip</item> <item name="android:drawablePadding">3dip</item> - <item name="android:paddingTop">2dip</item> - <item name="android:layout_marginLeft">10dip</item> - <item name="android:layout_marginRight">10dip</item> </style> </resources> diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java index 11b1ccd..a6775ae 100644 --- a/src/com/android/camera/Camera.java +++ b/src/com/android/camera/Camera.java @@ -34,6 +34,7 @@ import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; +import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; @@ -41,6 +42,7 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; +import android.graphics.drawable.TransitionDrawable; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.Size; import android.location.Location; @@ -73,6 +75,7 @@ import android.view.Window; import android.view.WindowManager; import android.view.MenuItem.OnMenuItemClickListener; import android.view.ViewGroup.LayoutParams; +import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; @@ -86,6 +89,8 @@ public class Camera extends Activity implements View.OnClickListener, private static final String TAG = "camera"; private static final boolean DEBUG = false; + private static final boolean DEBUG_TIME_OPERATIONS = DEBUG && false; + private static final boolean DEBUG_FAKE_GPS_LOCATION = DEBUG && false; private static final int CROP_MSG = 1; private static final int KEEP = 2; @@ -124,6 +129,7 @@ public class Camera extends Activity implements View.OnClickListener, private static final String sTempCropFilename = "crop-temp"; private android.hardware.Camera mCameraDevice; + private android.hardware.Camera.Parameters mParameters; private VideoPreview mSurfaceView; private SurfaceHolder mSurfaceHolder = null; private ImageView mBlackout = null; @@ -152,6 +158,12 @@ public class Camera extends Activity implements View.OnClickListener, private boolean mMenuSelectionMade; private ImageView mLastPictureButton; + private LayerDrawable mVignette; + private Animation mShowLastPictureButtonAnimation = new AlphaAnimation(0F, 1F); + private boolean mShouldShowLastPictureButton; + private TransitionDrawable mThumbnailTransition; + private Drawable[] mThumbnails; + private boolean mShouldTransitionThumbnails; private Uri mLastPictureUri; private LocationManager mLocationManager = null; @@ -170,6 +182,9 @@ public class Camera extends Activity implements View.OnClickListener, private boolean mKeepAndRestartPreview; + private View mPostCaptureAlert; + + private Handler mHandler = new MainHandler(); private ProgressDialog mSavingProgress; @@ -217,6 +232,7 @@ public class Camera extends Activity implements View.OnClickListener, mHandler.sendEmptyMessageDelayed(RESTART_PREVIEW, 100); } else if (mStatus == SNAPSHOT_COMPLETED){ mCaptureObject.dismissFreezeFrame(true); + hidePostCaptureAlert(); } break; } @@ -244,9 +260,11 @@ public class Camera extends Activity implements View.OnClickListener, // TODO put up a "please wait" message // TODO also listen for the media scanner finished message showStorageToast(); - } else if (action.equals(Intent.ACTION_MEDIA_UNMOUNTED)) { + } else if (action.equals(Intent.ACTION_MEDIA_UNMOUNTED) || + action.equals(Intent.ACTION_MEDIA_CHECKING)) { // SD card unavailable - showStorageToast(); + mPicturesRemaining = MenuHelper.NO_STORAGE_ERROR; + showStorageToast(mPicturesRemaining); } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_STARTED)) { Toast.makeText(Camera.this, getResources().getString(R.string.wait), 5000); } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) { @@ -298,7 +316,7 @@ public class Camera extends Activity implements View.OnClickListener, private final class ShutterCallback implements android.hardware.Camera.ShutterCallback { public void onShutter() { - if (DEBUG) { + if (DEBUG_TIME_OPERATIONS) { long now = System.currentTimeMillis(); Log.v(TAG, "********** Total shutter lag " + (now - mShutterPressTime) + " ms"); } @@ -314,7 +332,7 @@ public class Camera extends Activity implements View.OnClickListener, if (Config.LOGV) Log.v(TAG, "got RawPictureCallback..."); mRawPictureCallbackTime = System.currentTimeMillis(); - mBlackout.setVisibility(View.INVISIBLE); + mBlackout.setVisibility(View.GONE); } }; @@ -428,7 +446,7 @@ public class Camera extends Activity implements View.OnClickListener, private void storeImage(byte[] data, Location loc) { try { - if (DEBUG) { + if (DEBUG_TIME_OPERATIONS) { startTiming(); } long dateTaken = System.currentTimeMillis(); @@ -455,7 +473,7 @@ public class Camera extends Activity implements View.OnClickListener, mAddImageCancelable = null; } - if (DEBUG) { + if (DEBUG_TIME_OPERATIONS) { stopTiming(); Log.d(TAG, "Storing image took " + (mWallTimeEnd - mWallTimeStart) + " ms. " + "Thread time was " + ((mThreadTimeEnd - mThreadTimeStart) / 1000000) + @@ -472,19 +490,19 @@ public class Camera extends Activity implements View.OnClickListener, if (!captureOnly) { storeImage(data, loc); sendBroadcast(new Intent("com.android.camera.NEW_PICTURE", mLastContentUri)); - setLastPictureThumb(data); + setLastPictureThumb(data, mCaptureObject.getLastCaptureUri()); dismissFreezeFrame(true); } else { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; - if (DEBUG) { + if (DEBUG_TIME_OPERATIONS) { startTiming(); } mCaptureOnlyBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options); - if (DEBUG) { + if (DEBUG_TIME_OPERATIONS) { stopTiming(); Log.d(TAG, "Decoded mCaptureOnly bitmap (" + mCaptureOnlyBitmap.getWidth() + "x" + mCaptureOnlyBitmap.getHeight() + " ) in " + @@ -492,56 +510,16 @@ public class Camera extends Activity implements View.OnClickListener, ((mThreadTimeEnd - mThreadTimeStart) / 1000000) + " ms."); } - openOptionsMenu(); + showPostCaptureAlert(); + cancelAutomaticPreviewRestart(); } - mCapturing = false; if (mPausing) { closeCamera(); } } - private void setLastPictureThumb(byte[] data) { - BitmapFactory.Options options = new BitmapFactory.Options(); - options.inSampleSize = 16; - - if (DEBUG) { - startTiming(); - } - - Bitmap lastPictureThumb = BitmapFactory.decodeByteArray(data, 0, data.length, options); - - if (DEBUG) { - stopTiming(); - Log.d(TAG, "Decoded lastPictureThumb bitmap (" + lastPictureThumb.getWidth() + - "x" + lastPictureThumb.getHeight() + " ) in " + - (mWallTimeEnd - mWallTimeStart) + " ms. Thread time was " + - ((mThreadTimeEnd - mThreadTimeStart) / 1000000) + " ms."); - } - - final int PADDING_WIDTH = 2; - final int PADDING_HEIGHT = 2; - LayoutParams layoutParams = mLastPictureButton.getLayoutParams(); - // Make the mini-thumbnail size smaller than the button size so that the image corners - // don't peek out from the rounded corners of the frame_thumbnail graphic: - final int miniThumbWidth = layoutParams.width - 2 * PADDING_WIDTH; - final int miniThumbHeight = layoutParams.height - 2 * PADDING_HEIGHT; - - lastPictureThumb = ImageManager.extractMiniThumb(lastPictureThumb, - miniThumbWidth, miniThumbHeight); - - Drawable[] layers = new Drawable[2]; - layers[0] = new BitmapDrawable(lastPictureThumb); - layers[1] = getResources().getDrawable(R.drawable.frame_thumbnail); - LayerDrawable layerDrawable = new LayerDrawable(layers); - layerDrawable.setLayerInset(0, PADDING_WIDTH, PADDING_HEIGHT, - PADDING_WIDTH, PADDING_HEIGHT); - mLastPictureButton.setImageDrawable(layerDrawable); - mLastPictureButton.setVisibility(View.VISIBLE); - mLastPictureUri = mCaptureObject.getLastCaptureUri(); - } - /* * Tells the image capture thread to abort the capture of the * current image. @@ -589,44 +567,63 @@ public class Camera extends Activity implements View.OnClickListener, Boolean recordLocation = mPreferences.getBoolean("pref_camera_recordlocation_key", false); Location loc = recordLocation ? getCurrentLocation() : null; - android.hardware.Camera.Parameters parameters = mCameraDevice.getParameters(); // Quality 75 has visible artifacts, and quality 90 looks great but the files begin to // get large. 85 is a good compromise between the two. - parameters.set("jpeg-quality", 85); - parameters.set("rotation", latchedOrientation); - - parameters.remove("gps-latitude"); - parameters.remove("gps-longitude"); - parameters.remove("gps-altitude"); - parameters.remove("gps-timestamp"); - - if (loc != null) { + mParameters.set("jpeg-quality", 85); + mParameters.set("rotation", latchedOrientation); + + mParameters.remove("gps-latitude"); + mParameters.remove("gps-longitude"); + mParameters.remove("gps-altitude"); + mParameters.remove("gps-timestamp"); + + if (DEBUG_FAKE_GPS_LOCATION) { + // Google London office, having trouble encoding longitude + + if (false) { + // This fails: + mParameters.set("gps-latitude", "51.49473309516907"); + mParameters.set("gps-longitude", "-0.14598190784454346"); + mParameters.set("gps-altitude", "71.0"); // meters + mParameters.set("gps-timestamp", "1233744883"); + } else { + // This works OK: + mParameters.set("gps-latitude", "51.49473309516907"); + mParameters.set("gps-longitude", "-1.0"); + mParameters.set("gps-altitude", "71.0"); // meters + mParameters.set("gps-timestamp", "1233744883"); + } + } else if (loc != null) { double lat = loc.getLatitude(); double lon = loc.getLongitude(); + boolean hasLatLon = (lat != 0.0d) || (lon != 0.0d); - if (lat != 0D && lon != 0d) { - parameters.set("gps-latitude", String.valueOf(lat)); - parameters.set("gps-longitude", String.valueOf(lon)); + if (hasLatLon) { + String latString = String.valueOf(lat); + String lonString = String.valueOf(lon); + mParameters.set("gps-latitude", latString); + mParameters.set("gps-longitude", lonString); if (loc.hasAltitude()) - parameters.set("gps-altitude", String.valueOf(loc.getAltitude())); + mParameters.set("gps-altitude", String.valueOf(loc.getAltitude())); if (loc.getTime() != 0) { // Location.getTime() is UTC in milliseconds. // gps-timestamp is UTC in seconds. long utcTimeSeconds = loc.getTime() / 1000; - parameters.set("gps-timestamp", String.valueOf(utcTimeSeconds)); + mParameters.set("gps-timestamp", String.valueOf(utcTimeSeconds)); } } else { loc = null; } } - Size pictureSize = parameters.getPictureSize(); + + Size pictureSize = mParameters.getPictureSize(); // resize the SurfaceView to the aspect-ratio of the still image // and so that we can see the full image that was taken mSurfaceView.setAspectRatio(pictureSize.width, pictureSize.height); - mCameraDevice.setParameters(parameters); + mCameraDevice.setParameters(mParameters); mCameraDevice.takePicture(mShutterCallback, mRawPictureCallback, new JpegPictureCallback(loc)); @@ -653,9 +650,9 @@ public class Camera extends Activity implements View.OnClickListener, // Don't check the filesystem here, we can't afford the latency. Instead, check the // cached value which was calculated when the preview was restarted. - if (DEBUG) mShutterPressTime = System.currentTimeMillis(); + if (DEBUG_TIME_OPERATIONS) mShutterPressTime = System.currentTimeMillis(); if (mPicturesRemaining < 1) { - showStorageToast(); + showStorageToast(mPicturesRemaining); return; } @@ -672,6 +669,52 @@ public class Camera extends Activity implements View.OnClickListener, } } + private void setLastPictureThumb(byte[] data, Uri uri) { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inSampleSize = 16; + + Bitmap lastPictureThumb = BitmapFactory.decodeByteArray(data, 0, data.length, options); + + setLastPictureThumb(lastPictureThumb, uri); + } + + private void setLastPictureThumb(Bitmap lastPictureThumb, Uri uri) { + + final int PADDING_WIDTH = 2; + final int PADDING_HEIGHT = 2; + LayoutParams layoutParams = mLastPictureButton.getLayoutParams(); + // Make the mini-thumbnail size smaller than the button size so that the image corners + // don't peek out from the rounded corners of the frame_thumbnail graphic: + final int miniThumbWidth = layoutParams.width - 2 * PADDING_WIDTH; + final int miniThumbHeight = layoutParams.height - 2 * PADDING_HEIGHT; + + lastPictureThumb = ImageManager.extractMiniThumb(lastPictureThumb, + miniThumbWidth, miniThumbHeight); + + Drawable[] vignetteLayers = new Drawable[2]; + vignetteLayers[1] = getResources().getDrawable(R.drawable.frame_thumbnail); + if (mThumbnails == null) { + mThumbnails = new Drawable[2]; + mThumbnails[1] = new BitmapDrawable(lastPictureThumb); + vignetteLayers[0] = mThumbnails[1]; + } else { + mThumbnails[0] = mThumbnails[1]; + mThumbnails[1] = new BitmapDrawable(lastPictureThumb); + mThumbnailTransition = new TransitionDrawable(mThumbnails); + mShouldTransitionThumbnails = true; + vignetteLayers[0] = mThumbnailTransition; + } + + mVignette = new LayerDrawable(vignetteLayers); + mVignette.setLayerInset(0, PADDING_WIDTH, PADDING_HEIGHT, + PADDING_WIDTH, PADDING_HEIGHT); + mLastPictureButton.setImageDrawable(mVignette); + + if (mLastPictureButton.getVisibility() != View.VISIBLE) { + mShouldShowLastPictureButton = true; + } + mLastPictureUri = uri; + } static private String createName(long dateTaken) { return DateFormat.format("yyyy-MM-dd kk.mm.ss", dateTaken).toString(); @@ -741,10 +784,27 @@ public class Camera extends Activity implements View.OnClickListener, mBlackout.setBackgroundDrawable(new ColorDrawable(0xFF000000)); mLastPictureButton = (ImageView) findViewById(R.id.last_picture_button); - mLastPictureButton.setOnClickListener(this); - mLastPictureButton.setVisibility(View.INVISIBLE); + if (!isImageCaptureIntent()) { + ImageManager.IImageList images = ImageManager.instance().allImages( + this, + getContentResolver(), + ImageManager.DataLocation.ALL, + ImageManager.INCLUDE_IMAGES, + ImageManager.SORT_DESCENDING, + ImageManager.CAMERA_IMAGE_BUCKET_ID); + ImageManager.IImage lastPicture = + images.isEmpty() ? null : images.getImageAt(0); + mLastPictureButton.setOnClickListener(this); + if (lastPicture == null) { + mLastPictureButton.setVisibility(View.GONE); + } else { + Bitmap miniThumb = lastPicture.miniThumbBitmap(); + setLastPictureThumb(miniThumb, lastPicture.fullSizeImageUri()); + } + images.deactivate(); + } - mShutterButton = (ShutterButton) findViewById(R.id.mode_indicator); + mShutterButton = (ShutterButton) findViewById(R.id.shutter_button); mShutterButton.setOnShutterButtonListener(this); try { @@ -773,42 +833,22 @@ public class Camera extends Activity implements View.OnClickListener, mFocusBlinkAnimation = AnimationUtils.loadAnimation(this, R.anim.auto_focus_blink); mFocusBlinkAnimation.setRepeatCount(Animation.INFINITE); mFocusBlinkAnimation.setRepeatMode(Animation.REVERSE); + + mPostCaptureAlert = findViewById(R.id.post_picture_panel); } @Override public void onStart() { super.onStart(); - final View hintView = findViewById(R.id.hint_toast); - if (hintView != null) - hintView.setVisibility(View.GONE); - Thread t = new Thread(new Runnable() { public void run() { final boolean storageOK = calculatePicturesRemaining() > 0; - if (hintView == null) - return; - if (storageOK) { + if (!storageOK) { mHandler.post(new Runnable() { public void run() { - hintView.setVisibility(View.VISIBLE); - } - }); - mHandler.postDelayed(new Runnable() { - public void run() { - Animation a = new android.view.animation.AlphaAnimation(1F, 0F); - a.setDuration(500); - a.startNow(); - hintView.setAnimation(a); - hintView.setVisibility(View.GONE); - } - }, 3000); - } else { - mHandler.post(new Runnable() { - public void run() { - hintView.setVisibility(View.GONE); - showStorageToast(); + showStorageToast(mPicturesRemaining); } }); } @@ -822,12 +862,124 @@ public class Camera extends Activity implements View.OnClickListener, case R.id.last_picture_button: viewLastImage(); break; + case R.id.attach: + doAttach(); + break; + case R.id.cancel: + doCancel(); } } + private void doAttach() { + Bitmap bitmap = mImageCapture.getLastBitmap(); + mCaptureObject.setDone(true); + + String cropValue = null; + Uri saveUri = null; + + Bundle myExtras = getIntent().getExtras(); + if (myExtras != null) { + saveUri = (Uri) myExtras.getParcelable(MediaStore.EXTRA_OUTPUT); + cropValue = myExtras.getString("crop"); + } + + + if (cropValue == null) { + /* + * First handle the no crop case -- just return the value. If the caller + * specifies a "save uri" then write the data to it's stream. Otherwise, + * pass back a scaled down version of the bitmap directly in the extras. + */ + if (saveUri != null) { + OutputStream outputStream = null; + try { + outputStream = mContentResolver.openOutputStream(saveUri); + bitmap.compress(Bitmap.CompressFormat.JPEG, 75, outputStream); + outputStream.close(); + + setResult(RESULT_OK); + finish(); + } catch (IOException ex) { + // + } finally { + if (outputStream != null) { + try { + outputStream.close(); + } catch (IOException ex) { + + } + } + } + } else { + float scale = .5F; + Matrix m = new Matrix(); + m.setScale(scale, scale); + + bitmap = Bitmap.createBitmap(bitmap, 0, 0, + bitmap.getWidth(), + bitmap.getHeight(), + m, true); + + setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap)); + finish(); + } + } + else { + /* + * Save the image to a temp file and invoke the cropper + */ + Uri tempUri = null; + FileOutputStream tempStream = null; + try { + File path = getFileStreamPath(sTempCropFilename); + path.delete(); + tempStream = openFileOutput(sTempCropFilename, 0); + bitmap.compress(Bitmap.CompressFormat.JPEG, 75, tempStream); + tempStream.close(); + tempUri = Uri.fromFile(path); + } catch (FileNotFoundException ex) { + setResult(Activity.RESULT_CANCELED); + finish(); + return; + } catch (IOException ex) { + setResult(Activity.RESULT_CANCELED); + finish(); + return; + } finally { + if (tempStream != null) { + try { + tempStream.close(); + } catch (IOException ex) { + + } + } + } + + Bundle newExtras = new Bundle(); + if (cropValue.equals("circle")) + newExtras.putString("circleCrop", "true"); + if (saveUri != null) + newExtras.putParcelable(MediaStore.EXTRA_OUTPUT, saveUri); + else + newExtras.putBoolean("return-data", true); + + Intent cropIntent = new Intent(); + cropIntent.setClass(Camera.this, CropImage.class); + cropIntent.setData(tempUri); + cropIntent.putExtras(newExtras); + + startActivityForResult(cropIntent, CROP_MSG); + } + } + + private void doCancel() { + setResult(RESULT_CANCELED, new Intent()); + finish(); + } + public void onShutterButtonFocus(ShutterButton button, boolean pressed) { switch (button.getId()) { - case R.id.mode_indicator: + case R.id.shutter_button: doFocus(pressed); break; } @@ -835,7 +987,7 @@ public class Camera extends Activity implements View.OnClickListener, public void onShutterButtonClick(ShutterButton button) { switch (button.getId()) { - case R.id.mode_indicator: + case R.id.shutter_button: doSnap(false); break; } @@ -845,6 +997,10 @@ public class Camera extends Activity implements View.OnClickListener, MenuHelper.showStorageToast(this); } + private void showStorageToast(int remainingPictures) { + MenuHelper.showStorageToast(this, remainingPictures); + } + @Override public void onResume() { super.onResume(); @@ -858,6 +1014,7 @@ public class Camera extends Activity implements View.OnClickListener, intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED); intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); + intentFilter.addAction(Intent.ACTION_MEDIA_CHECKING); intentFilter.addDataScheme("file"); registerReceiver(mReceiver, intentFilter); mDidRegister = true; @@ -878,14 +1035,14 @@ public class Camera extends Activity implements View.OnClickListener, mFocusToneGenerator = null; } - mBlackout.setVisibility(View.INVISIBLE); + mBlackout.setVisibility(View.GONE); if (mLastPictureUri != null) { IImageList list = ImageManager.makeImageList(mLastPictureUri, this, ImageManager.SORT_ASCENDING); if (list.getImageForUri(mLastPictureUri) == null) { mLastPictureUri = null; - mLastPictureButton.setVisibility(View.INVISIBLE); + mLastPictureButton.setVisibility(View.GONE); } list.deactivate(); } @@ -996,7 +1153,7 @@ public class Camera extends Activity implements View.OnClickListener, switch (keyCode) { case KeyEvent.KEYCODE_BACK: - if (mStatus == SNAPSHOT_IN_PROGRESS || mStatus == SNAPSHOT_COMPLETED) { + if (mStatus == SNAPSHOT_IN_PROGRESS) { // ignore backs while we're taking a picture return true; } @@ -1011,6 +1168,18 @@ public class Camera extends Activity implements View.OnClickListener, doSnap(false); } return true; + case KeyEvent.KEYCODE_DPAD_CENTER: + // If we get a dpad center event without any focused view, move the + // focus to the shutter button and press it. + if (event.getRepeatCount() == 0) { + if (mShutterButton.isInTouchMode()) { + mShutterButton.requestFocusFromTouch(); + } else { + mShutterButton.requestFocus(); + } + mShutterButton.setPressed(true); + } + return true; } return super.onKeyDown(keyCode, event); @@ -1053,6 +1222,7 @@ public class Camera extends Activity implements View.OnClickListener, private void doFocus(boolean pressed) { if (pressed) { mIsFocusButtonPressed = true; + mCaptureOnFocus = false; if (mPreviewing) { autoFocus(); } else if (mCaptureObject != null) { @@ -1113,6 +1283,17 @@ public class Camera extends Activity implements View.OnClickListener, // TODO: The best longterm solution is to write a reserve file of maximum JPEG size, always // let the user take a picture, and delete that file if needed to save the new photo. calculatePicturesRemaining(); + + if (mShouldShowLastPictureButton) { + mShouldShowLastPictureButton = false; + mLastPictureButton.setVisibility(View.VISIBLE); + Animation a = mShowLastPictureButtonAnimation; + a.setDuration(500); + mLastPictureButton.setAnimation(a); + } else if (mShouldTransitionThumbnails) { + mShouldTransitionThumbnails = false; + mThumbnailTransition.reverseTransition(500); + } } private void setViewFinder(int w, int h, boolean startPreview) { @@ -1169,10 +1350,10 @@ public class Camera extends Activity implements View.OnClickListener, // request the preview size, the hardware may not honor it, // if we depended on it we would have to query the size again - android.hardware.Camera.Parameters p = mCameraDevice.getParameters(); - p.setPreviewSize(w, h); + mParameters = mCameraDevice.getParameters(); + mParameters.setPreviewSize(w, h); try { - mCameraDevice.setParameters(p); + mCameraDevice.setParameters(mParameters); } catch (IllegalArgumentException e) { // Ignore this error, it happens in the simulator. } @@ -1266,6 +1447,7 @@ public class Camera extends Activity implements View.OnClickListener, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); intent.putExtra(MediaStore.EXTRA_FULL_SCREEN, true); intent.putExtra(MediaStore.EXTRA_SHOW_ACTION_ICONS, true); + intent.putExtra("com.android.camera.ReviewMode", true); try { startActivity(intent); @@ -1374,8 +1556,7 @@ public class Camera extends Activity implements View.OnClickListener, public boolean onMenuOpened(int featureId, Menu menu) { if (featureId == Window.FEATURE_OPTIONS_PANEL) { if (mStatus == SNAPSHOT_IN_PROGRESS) { - mKeepAndRestartPreview = false; - mHandler.removeMessages(RESTART_PREVIEW); + cancelAutomaticPreviewRestart(); mMenuSelectionMade = false; } } @@ -1408,127 +1589,43 @@ public class Camera extends Activity implements View.OnClickListener, return true; } + private void cancelAutomaticPreviewRestart() { + mKeepAndRestartPreview = false; + mHandler.removeMessages(RESTART_PREVIEW); + } + private boolean isImageCaptureIntent() { String action = getIntent().getAction(); return (MediaStore.ACTION_IMAGE_CAPTURE.equals(action)); } + private void showPostCaptureAlert() { + boolean isPick = isImageCaptureIntent(); + int pickVisible = isPick ? View.VISIBLE : View.GONE; + mPostCaptureAlert.setVisibility(pickVisible); + if (isPick) { + int[] pickIds = {R.id.attach, R.id.cancel}; + for(int id : pickIds) { + View view = mPostCaptureAlert.findViewById(id); + view.setOnClickListener(this); + Animation animation = new AlphaAnimation(0F, 1F); + animation.setDuration(500); + view.setAnimation(animation); + } + } + } + + private void hidePostCaptureAlert() { + mPostCaptureAlert.setVisibility(View.GONE); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); if (isImageCaptureIntent()) { - menu.add(MenuHelper.IMAGE_SAVING_ITEM, MENU_SAVE_SELECT_PHOTOS , 0, R.string.camera_selectphoto).setOnMenuItemClickListener(new OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { - Bitmap bitmap = mImageCapture.getLastBitmap(); - mCaptureObject.setDone(true); - - String cropValue = null; - Uri saveUri = null; - - Bundle myExtras = getIntent().getExtras(); - if (myExtras != null) { - saveUri = (Uri) myExtras.getParcelable(MediaStore.EXTRA_OUTPUT); - cropValue = myExtras.getString("crop"); - } - - - if (cropValue == null) { - /* - * First handle the no crop case -- just return the value. If the caller - * specifies a "save uri" then write the data to it's stream. Otherwise, - * pass back a scaled down version of the bitmap directly in the extras. - */ - if (saveUri != null) { - OutputStream outputStream = null; - try { - outputStream = mContentResolver.openOutputStream(saveUri); - bitmap.compress(Bitmap.CompressFormat.JPEG, 75, outputStream); - outputStream.close(); - - setResult(RESULT_OK); - finish(); - } catch (IOException ex) { - // - } finally { - if (outputStream != null) { - try { - outputStream.close(); - } catch (IOException ex) { - - } - } - } - } else { - float scale = .5F; - Matrix m = new Matrix(); - m.setScale(scale, scale); - - bitmap = Bitmap.createBitmap(bitmap, 0, 0, - bitmap.getWidth(), - bitmap.getHeight(), - m, true); - - setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap)); - finish(); - } - } - else { - /* - * Save the image to a temp file and invoke the cropper - */ - Uri tempUri = null; - FileOutputStream tempStream = null; - try { - File path = getFileStreamPath(sTempCropFilename); - path.delete(); - tempStream = openFileOutput(sTempCropFilename, 0); - bitmap.compress(Bitmap.CompressFormat.JPEG, 75, tempStream); - tempStream.close(); - tempUri = Uri.fromFile(path); - } catch (FileNotFoundException ex) { - setResult(Activity.RESULT_CANCELED); - finish(); - return true; - } catch (IOException ex) { - setResult(Activity.RESULT_CANCELED); - finish(); - return true; - } finally { - if (tempStream != null) { - try { - tempStream.close(); - } catch (IOException ex) { - - } - } - } - - Bundle newExtras = new Bundle(); - if (cropValue.equals("circle")) - newExtras.putString("circleCrop", "true"); - if (saveUri != null) - newExtras.putParcelable(MediaStore.EXTRA_OUTPUT, saveUri); - else - newExtras.putBoolean("return-data", true); - - Intent cropIntent = new Intent(); - cropIntent.setClass(Camera.this, CropImage.class); - cropIntent.setData(tempUri); - cropIntent.putExtras(newExtras); - - startActivityForResult(cropIntent, CROP_MSG); - } - return true; - } - }); - - menu.add(MenuHelper.IMAGE_SAVING_ITEM, MENU_SAVE_NEW_PHOTO, 0, R.string.camera_takenewphoto).setOnMenuItemClickListener(new OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { - keep(); - return true; - } - }); + // No options menu for attach mode. + return false; } else { addBaseMenuItems(menu); MenuHelper.addImageMenuItems( @@ -1627,10 +1724,5 @@ public class Camera extends Activity implements View.OnClickListener, }); item.setIcon(android.R.drawable.ic_menu_preferences); } - - private void cancelRestartPreviewTimeout() { - mHandler.removeMessages(RESTART_PREVIEW); - } - } diff --git a/src/com/android/camera/CropImage.java b/src/com/android/camera/CropImage.java index 9542ce0..5250b56 100644 --- a/src/com/android/camera/CropImage.java +++ b/src/com/android/camera/CropImage.java @@ -434,6 +434,7 @@ public class CropImage extends Activity { findViewById(R.id.discard).setOnClickListener(new android.view.View.OnClickListener() { public void onClick(View v) { + setResult(RESULT_CANCELED); finish(); } }); diff --git a/src/com/android/camera/GalleryPicker.java b/src/com/android/camera/GalleryPicker.java index 44f8fc2..cf883dd 100644 --- a/src/com/android/camera/GalleryPicker.java +++ b/src/com/android/camera/GalleryPicker.java @@ -73,7 +73,6 @@ public class GalleryPicker extends Activity { Dialog mMediaScanningDialog; - MenuItem mFlipItem; SharedPreferences mPrefs; boolean mPausing = false; @@ -96,8 +95,49 @@ public class GalleryPicker extends Activity { true, true); } - mAdapter.notifyDataSetChanged(); - mAdapter.init(!unmounted && !scanning); + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + mAdapter.init(!unmounted && !scanning); + } + + if (!unmounted) { + // Warn the user if space is getting low + Thread t = new Thread(new Runnable() { + public void run() { + + // Check available space only if we are writable + if (ImageManager.hasStorage()) { + String storageDirectory = Environment.getExternalStorageDirectory().toString(); + StatFs stat = new StatFs(storageDirectory); + long remaining = (long)stat.getAvailableBlocks() * (long)stat.getBlockSize(); + if (remaining < LOW_STORAGE_THRESHOLD) { + + mHandler.post(new Runnable() { + public void run() { + Toast.makeText(GalleryPicker.this.getApplicationContext(), + R.string.not_enough_space, 5000).show(); + } + }); + } + } + } + }); + t.start(); + } + + // If we just have zero or one folder, open it. (We shouldn't have just one folder + // any more, but we can have zero folders.) + mNoImagesView.setVisibility(View.GONE); + if (!scanning) { + int numItems = mAdapter.mItems.size(); + if (numItems == 0) { + mNoImagesView.setVisibility(View.VISIBLE); + } else if (numItems == 1) { + mAdapter.mItems.get(0).launch(this); + finish(); + return; + } + } } @Override @@ -201,6 +241,7 @@ public class GalleryPicker extends Activity { static class Item implements Comparable<Item>{ // The type is also used as the sort order + public final static int TYPE_NONE = -1; public final static int TYPE_ALL_IMAGES = 0; public final static int TYPE_ALL_VIDEOS = 1; public final static int TYPE_CAMERA_IMAGES = 2; @@ -329,14 +370,16 @@ public class GalleryPicker extends Activity { images.deactivate(); notifyDataSetInvalidated(); - // If just one - addBucketIfNotEmpty(Item.TYPE_ALL_IMAGES, null, R.string.all_images); - addBucketIfNotEmpty(Item.TYPE_ALL_VIDEOS, null, R.string.all_videos); + // Conditionally add all-images and all-videos folders. + addBucket(Item.TYPE_ALL_IMAGES, null, + Item.TYPE_CAMERA_IMAGES, cameraBucketId, R.string.all_images); + addBucket(Item.TYPE_ALL_VIDEOS, null, + Item.TYPE_CAMERA_VIDEOS, cameraBucketId, R.string.all_videos); if (cameraBucketId != null) { - addBucketIfNotEmpty(Item.TYPE_CAMERA_IMAGES, cameraBucketId, + addBucket(Item.TYPE_CAMERA_IMAGES, cameraBucketId, R.string.gallery_camera_bucket_name); - addBucketIfNotEmpty(Item.TYPE_CAMERA_VIDEOS, cameraBucketId, + addBucket(Item.TYPE_CAMERA_VIDEOS, cameraBucketId, R.string.gallery_camera_videos_bucket_name); } @@ -401,7 +444,36 @@ public class GalleryPicker extends Activity { mWorkerThread.toBackground(); } - private void addBucketIfNotEmpty(int itemType, String bucketId, int labelId) { + /** + * Add a bucket, but only if it's interesting. + * Interesting means non-empty and not duplicated by the + * corresponding camera bucket. + */ + private void addBucket(int itemType, String bucketId, + int cameraItemType, String cameraBucketId, + int labelId) { + int itemCount = bucketItemCount( + Item.convertItemTypeToIncludedMediaType(itemType), bucketId); + if (itemCount == 0) { + return; // Bucket is empty, so don't show it. + } + int cameraItemCount = 0; + if (cameraBucketId != null) { + cameraItemCount = bucketItemCount( + Item.convertItemTypeToIncludedMediaType(cameraItemType), cameraBucketId); + } + if (cameraItemCount == itemCount) { + return; // Bucket is the same as the camera bucket, so don't show it. + } + mItems.add(new Item(itemType, bucketId, getResources().getString(labelId))); + } + + /** + * Add a bucket, but only if it's interesting. + * Interesting means non-empty. + */ + private void addBucket(int itemType, String bucketId, + int labelId) { if (!isEmptyBucket(Item.convertItemTypeToIncludedMediaType(itemType), bucketId)) { mItems.add(new Item(itemType, bucketId, getResources().getString(labelId))); } @@ -489,49 +561,10 @@ public class GalleryPicker extends Activity { registerReceiver(mReceiver, intentFilter); MenuHelper.requestOrientation(this, mPrefs); - - // Warn the user if space is getting low - Thread t = new Thread(new Runnable() { - public void run() { - - // Check available space only if we are writable - if (ImageManager.hasStorage()) { - String storageDirectory = Environment.getExternalStorageDirectory().toString(); - StatFs stat = new StatFs(storageDirectory); - long remaining = (long)stat.getAvailableBlocks() * (long)stat.getBlockSize(); - if (remaining < LOW_STORAGE_THRESHOLD) { - - mHandler.post(new Runnable() { - public void run() { - Toast.makeText(GalleryPicker.this.getApplicationContext(), - R.string.not_enough_space, 5000).show(); - } - }); - } - } - } - }); - t.start(); - - // If we just have zero or one folder, open it. (We shouldn't have just one folder - // any more, but we can have zero folders.) - mNoImagesView.setVisibility(View.GONE); - if (!scanning) { - int numItems = mAdapter.mItems.size(); - if (numItems == 0) { - mNoImagesView.setVisibility(View.VISIBLE); - } else if (numItems == 1) { - // Not sure we can ever get here any more. - android.net.Uri uri = Images.Media.INTERNAL_CONTENT_URI; - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - startActivity(intent); - finish(); - return; - } - } } + private void setBackgrounds(Resources r) { mFrameGalleryMask = r.getDrawable(R.drawable.frame_gallery_preview_album_mask); @@ -644,7 +677,6 @@ public class GalleryPicker extends Activity { super.onCreateOptionsMenu(menu); MenuHelper.addCaptureMenuItems(menu, this); - mFlipItem = MenuHelper.addFlipOrientation(menu, this, mPrefs); menu.add(0, 0, 5, R.string.camerasettings) .setOnMenuItemClickListener(new OnMenuItemClickListener() { @@ -661,12 +693,6 @@ public class GalleryPicker extends Activity { return true; } - @Override - public boolean onPrepareOptionsMenu(android.view.Menu menu) { - MenuHelper.setFlipOrientationEnabled(this, mFlipItem); - return true; - } - private boolean isEmptyBucket(int mediaTypes, String bucketId) { // TODO: Find a more efficient way of calculating this ImageManager.IImageList list = createImageList(mediaTypes, bucketId); @@ -678,6 +704,16 @@ public class GalleryPicker extends Activity { } } + private int bucketItemCount(int mediaTypes, String bucketId) { + // TODO: Find a more efficient way of calculating this + ImageManager.IImageList list = createImageList(mediaTypes, bucketId); + try { + return list.getCount(); + } + finally { + list.deactivate(); + } + } private ImageManager.IImageList createImageList(int mediaTypes, String bucketId) { return ImageManager.instance().allImages( this, diff --git a/src/com/android/camera/ImageGallery2.java b/src/com/android/camera/ImageGallery2.java index 92e9c57..d58f04c 100644 --- a/src/com/android/camera/ImageGallery2.java +++ b/src/com/android/camera/ImageGallery2.java @@ -73,7 +73,6 @@ public class ImageGallery2 extends Activity { private Dialog mMediaScanningDialog; - private MenuItem mFlipItem; private MenuItem mSlideShowItem; private SharedPreferences mPrefs; @@ -187,7 +186,10 @@ public class ImageGallery2 extends Activity { private Runnable mDeletePhotoRunnable = new Runnable() { public void run() { mGvs.clearCache(); - mAllImages.removeImage(mSelectedImageGetter.getCurrentImage()); + IImage currentImage = mSelectedImageGetter.getCurrentImage(); + if (currentImage != null) { + mAllImages.removeImage(currentImage); + } mGvs.invalidate(); mGvs.requestLayout(); mGvs.start(); @@ -356,8 +358,10 @@ public class ImageGallery2 extends Activity { switch (requestCode) { case CROP_MSG: { if (Config.LOGV) Log.v(TAG, "onActivityResult " + data); - setResult(resultCode, data); - finish(); + if (resultCode == RESULT_OK) { + setResult(resultCode, data); + finish(); + } break; } case VIEW_MSG: { @@ -504,7 +508,6 @@ public class ImageGallery2 extends Activity { mThumbnailCheckThread = new CameraThread(new Runnable() { public void run() { android.content.res.Resources resources = getResources(); - boolean loadingVideos = mInclusion == ImageManager.INCLUDE_VIDEOS; final TextView progressTextView = (TextView) findViewById(R.id.loading_text); final String progressTextFormatString = resources.getString(R.string.loading_progress_format_string); @@ -547,7 +550,8 @@ public class ImageGallery2 extends Activity { return !mPausing; } }; - allImages(true).checkThumbnails(r); + ImageManager.IImageList imageList = allImages(true); + imageList.checkThumbnails(r, imageList.getCount()); mWakeLock.release(); mThumbnailCheckThread = null; mHandler.post(new Runnable() { @@ -572,12 +576,13 @@ public class ImageGallery2 extends Activity { @Override public boolean onCreateOptionsMenu(android.view.Menu menu) { MenuItem item; - MenuHelper.addCaptureMenuItems(menu, this); - if ((mInclusion & ImageManager.INCLUDE_IMAGES) != 0) { - mSlideShowItem = addSlideShowMenu(menu, 5); + if (! isPickIntent()) { + MenuHelper.addCaptureMenuItems(menu, this); + if ((mInclusion & ImageManager.INCLUDE_IMAGES) != 0) { + mSlideShowItem = addSlideShowMenu(menu, 5); + } } - mFlipItem = MenuHelper.addFlipOrientation(menu, this, mPrefs); item = menu.add(0, 0, 1000, R.string.camerasettings); item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @@ -599,9 +604,10 @@ public class ImageGallery2 extends Activity { if ((mInclusion & ImageManager.INCLUDE_IMAGES) != 0) { boolean videoSelected = isVideoSelected(); // TODO: Only enable slide show if there is at least one image in the folder. - mSlideShowItem.setEnabled(!videoSelected); + if (mSlideShowItem != null) { + mSlideShowItem.setEnabled(!videoSelected); + } } - MenuHelper.setFlipOrientationEnabled(this, mFlipItem); return true; } @@ -745,7 +751,7 @@ public class ImageGallery2 extends Activity { setVerticalScrollBarEnabled(true); initializeScrollbars(context.obtainStyledAttributes(android.R.styleable.View)); - mGestureDetector = new GestureDetector(new SimpleOnGestureListener() { + mGestureDetector = new GestureDetector(context, new SimpleOnGestureListener() { @Override public boolean onDown(MotionEvent e) { if (mScroller != null && !mScroller.isFinished()) { @@ -1037,7 +1043,7 @@ public class ImageGallery2 extends Activity { loadNext(); synchronized (ImageBlockManager.this) { - if (workCounter == mWorkCounter) { + if ((workCounter == mWorkCounter) && (! mDone)) { try { ImageBlockManager.this.wait(); } catch (InterruptedException ex) { diff --git a/src/com/android/camera/ImageManager.java b/src/com/android/camera/ImageManager.java index 4354e92..b21b243 100755 --- a/src/com/android/camera/ImageManager.java +++ b/src/com/android/camera/ImageManager.java @@ -63,7 +63,7 @@ import java.util.HashMap; */ public class ImageManager { public static final String CAMERA_IMAGE_BUCKET_NAME = - Environment.getExternalStorageDirectory().toString() + "/dcim/Camera"; + Environment.getExternalStorageDirectory().toString() + "/DCIM/Camera"; public static final String CAMERA_IMAGE_BUCKET_ID = getBucketId(CAMERA_IMAGE_BUCKET_NAME); /** @@ -830,7 +830,7 @@ public class ImageManager { } String randomAccessFilePath(int version) { - String directoryName = Environment.getExternalStorageDirectory().toString() + "/dcim/.thumbnails"; + String directoryName = Environment.getExternalStorageDirectory().toString() + "/DCIM/.thumbnails"; String path = directoryName + "/.thumbdata" + version + "-" + mUri.hashCode(); return path; } @@ -1035,25 +1035,6 @@ public class ImageManager { return bitmap; } - private Bitmap createVideoThumbnail(String filePath) { - Bitmap bitmap = null; - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - try { - retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); - retriever.setDataSource(filePath); - bitmap = retriever.captureFrame(); - } catch (RuntimeException ex) { - // Assume this is a corrupt video file. - } finally { - try { - retriever.release(); - } catch (RuntimeException ex) { - // Ignore failures while cleaning up. - } - } - return bitmap; - } - // returns id public long checkThumbnail(BaseImage existingImage, Cursor c, int i) { long magic, fileMagic = 0, id; @@ -1114,13 +1095,13 @@ public class ImageManager { } } if (filePath != null) { - bitmap = createThumbnailFromEXIF(filePath, id); - if (bitmap == null) { - String mimeType = c.getString(indexMimeType()); - boolean isVideo = isVideoMimeType(mimeType); - if (isVideo) { - bitmap = createVideoThumbnail(filePath); - } else { + String mimeType = c.getString(indexMimeType()); + boolean isVideo = isVideoMimeType(mimeType); + if (isVideo) { + bitmap = createVideoThumbnail(filePath); + } else { + bitmap = createThumbnailFromEXIF(filePath, id); + if (bitmap == null) { bitmap = createThumbnailFromUri(c, id); } } @@ -1166,13 +1147,13 @@ public class ImageManager { } } - public void checkThumbnails(ThumbCheckCallback cb) { + public void checkThumbnails(ThumbCheckCallback cb, int totalThumbnails) { Cursor c = Images.Media.query( mContentResolver, mBaseUri, new String[] { "_id", "mini_thumb_magic" }, - "mini_thumb_magic isnull and " + sWhereClause, - sAcceptableImageTypes, + thumbnailWhereClause(), + thumbnailWhereClauseArgs(), "_id ASC"); int count = c.getCount(); @@ -1201,7 +1182,6 @@ public class ImageManager { c = getCursor(); try { if (VERBOSE) Log.v(TAG, "checkThumbnails found " + c.getCount()); - int max = c.getCount(); int current = 0; for (int i = 0; i < c.getCount(); i++) { try { @@ -1211,7 +1191,7 @@ public class ImageManager { break; } if (cb != null) { - if (!cb.checking(current, max)) { + if (!cb.checking(current, totalThumbnails)) { if (VERBOSE) Log.v(TAG, "got false from checking... break <<<<<<<<<<<<<<<<<<<<<<<<"); break; } @@ -1228,6 +1208,14 @@ public class ImageManager { } } + protected String thumbnailWhereClause() { + return sMiniThumbIsNull + " and " + sWhereClause; + } + + protected String[] thumbnailWhereClauseArgs() { + return sAcceptableImageTypes; + } + public void commitChanges() { synchronized (mCursor) { mCursor.commitUpdates(); @@ -1696,7 +1684,7 @@ public class ImageManager { public boolean checking(int current, int count); } - public abstract void checkThumbnails(ThumbCheckCallback cb); + public abstract void checkThumbnails(ThumbCheckCallback cb, int totalCount); public abstract void commitChanges(); @@ -2085,6 +2073,7 @@ public class ImageManager { final static private String sWhereClause = "(" + Images.Media.MIME_TYPE + "=? or " + Images.Media.MIME_TYPE + "=?" + ")"; final static private String[] sAcceptableImageTypes = new String[] { "image/jpeg", "image/png" }; + final static private String sMiniThumbIsNull = "mini_thumb_magic isnull"; private static final String[] IMAGE_PROJECTION = new String[] { "_id", @@ -2362,7 +2351,7 @@ public class ImageManager { } @Override - public void checkThumbnails(ThumbCheckCallback cb) { + public void checkThumbnails(ThumbCheckCallback cb, int totalCount) { // do nothing } @@ -2465,13 +2454,12 @@ public class ImageManager { } } - public void checkThumbnails(ThumbCheckCallback cb) { - // TODO this isn't quite right because we need to get the - // total from each sub item and provide that in the callback - final IImageList sublist[] = mSubList; - final int length = sublist.length; - for (int i = 0; i < length; i++) - sublist[i].checkThumbnails(cb); + public void checkThumbnails(ThumbCheckCallback cb, int totalThumbnails) { + for (IImageList i : mSubList) { + int count = i.getCount(); + i.checkThumbnails(cb, totalThumbnails); + totalThumbnails -= count; + } } public void commitChanges() { @@ -3284,7 +3272,6 @@ public class ImageManager { HashMap<String, String> hash = new HashMap<String, String>(); if (c != null && c.moveToFirst()) { do { - Log.e(TAG, "id: " + c.getString(1) + " display_name: " + c.getString(0)); hash.put(c.getString(1), c.getString(0)); } while (c.moveToNext()); } @@ -3303,6 +3290,16 @@ public class ImageManager { return null; } + @Override + protected String thumbnailWhereClause() { + return sMiniThumbIsNull; + } + + @Override + protected String[] thumbnailWhereClauseArgs() { + return null; + } + protected Cursor createCursor() { Cursor c = Images.Media.query( @@ -3366,13 +3363,14 @@ public class ImageManager { return thumbnail; } - private final Bitmap sDefaultThumbnail = Bitmap.createBitmap(32, 32, Bitmap.Config.RGB_565); private String sortOrder() { - return Video.Media.DATE_MODIFIED + (mSort == SORT_ASCENDING ? " ASC " : " DESC"); + return Video.Media.DATE_TAKEN + (mSort == SORT_ASCENDING ? " ASC " : " DESC"); } } + private final static Bitmap sDefaultThumbnail = Bitmap.createBitmap(32, 32, Bitmap.Config.RGB_565); + /** * Represents a particular video and provides access * to the underlying data and two thumbnail bitmaps @@ -3537,10 +3535,10 @@ public class ImageManager { sb.append("" + mId); return sb.toString(); } - - private final Bitmap sNoImageBitmap = Bitmap.createBitmap(128, 128, Bitmap.Config.RGB_565); } + private final static Bitmap sNoImageBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565); + /* * How much quality to use when storing the thumbnail. */ @@ -3900,7 +3898,8 @@ public class ImageManager { public IImageList emptyImageList() { return new IImageList() { - public void checkThumbnails(com.android.camera.ImageManager.IImageList.ThumbCheckCallback cb) { + public void checkThumbnails(ImageManager.IImageList.ThumbCheckCallback cb, + int totalThumbnails) { } public void commitChanges() { @@ -3936,10 +3935,11 @@ public class ImageManager { public void removeImageAt(int i) { } - public void removeOnChangeListener(com.android.camera.ImageManager.IImageList.OnChange changeCallback) { + public void removeOnChangeListener(ImageManager.IImageList.OnChange changeCallback) { } - public void setOnChangeListener(com.android.camera.ImageManager.IImageList.OnChange changeCallback, Handler h) { + public void setOnChangeListener(ImageManager.IImageList.OnChange changeCallback, + Handler h) { } }; @@ -4027,7 +4027,7 @@ public class ImageManager { // Create a temporary file to see whether a volume is really writeable. It's important not to // put it in the root directory which may have a limit on the number of files. static private boolean checkFsWritable() { - String directoryName = Environment.getExternalStorageDirectory().toString() + "/dcim"; + String directoryName = Environment.getExternalStorageDirectory().toString() + "/DCIM"; File directory = new File(directoryName); if (!directory.isDirectory()) { if (!directory.mkdirs()) { @@ -4100,4 +4100,30 @@ public class ImageManager { Log.v(TAG, ">>>>>>>>>>>>>>>>>>>>>>>>> isMediaScannerScanning returning " + result); return result; } + + /** + * Create a video thumbnail for a video. May return null if the video is corrupt. + * @param filePath + * @return + */ + public static Bitmap createVideoThumbnail(String filePath) { + Bitmap bitmap = null; + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + try { + retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); + retriever.setDataSource(filePath); + bitmap = retriever.captureFrame(); + } catch(IllegalArgumentException ex) { + // Assume this is a corrupt video file + } catch (RuntimeException ex) { + // Assume this is a corrupt video file. + } finally { + try { + retriever.release(); + } catch (RuntimeException ex) { + // Ignore failures while cleaning up. + } + } + return bitmap; + } } diff --git a/src/com/android/camera/MenuHelper.java b/src/com/android/camera/MenuHelper.java index 1976444..d4358f6 100644 --- a/src/com/android/camera/MenuHelper.java +++ b/src/com/android/camera/MenuHelper.java @@ -16,13 +16,15 @@ package com.android.camera; +import java.util.ArrayList; + import android.app.Activity; import android.app.AlertDialog; -import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.res.Configuration; import android.media.MediaMetadataRetriever; import android.net.Uri; import android.os.Environment; @@ -37,16 +39,10 @@ import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.view.MenuItem.OnMenuItemClickListener; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.EditText; import android.widget.ImageView; -import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; -import java.util.ArrayList; - import com.android.camera.ImageManager.IImage; public class MenuHelper { @@ -357,8 +353,14 @@ public class MenuHelper { String codec = retriever.extractMetadata( MediaMetadataRetriever.METADATA_KEY_CODEC); - ((TextView)d.findViewById(R.id.details_codec_value)) - .setText(codec); + + if (codec == null) { + d.findViewById(R.id.details_codec_row). + setVisibility(View.GONE); + } else { + ((TextView)d.findViewById(R.id.details_codec_value)) + .setText(codec); + } } catch(RuntimeException ex) { // Assume this is a corrupt video file. } finally { @@ -531,9 +533,26 @@ public class MenuHelper { } static void gotoCameraImageGallery(Activity activity) { + gotoGallery(activity, R.string.gallery_camera_bucket_name, ImageManager.INCLUDE_IMAGES); + } + + static void gotoCameraVideoGallery(Activity activity) { + gotoGallery(activity, R.string.gallery_camera_videos_bucket_name, + ImageManager.INCLUDE_VIDEOS); + } + + static private void gotoGallery(Activity activity, int windowTitleId, int mediaTypes) { Uri target = Images.Media.INTERNAL_CONTENT_URI.buildUpon().appendQueryParameter("bucketId", ImageManager.CAMERA_IMAGE_BUCKET_ID).build(); Intent intent = new Intent(Intent.ACTION_VIEW, target); + intent.putExtra("windowTitle", activity.getString(windowTitleId)); + intent.putExtra("mediaTypes", mediaTypes); + // Request unspecified so that we match the current camera orientation rather than + // matching the "flip orientation" preference. + // Disabled because people don't care for it. Also it's + // not as compelling now that we have implemented have quick orientation flipping. + // intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, + // android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); try { activity.startActivity(intent); } catch (ActivityNotFoundException e) { @@ -575,20 +594,22 @@ public class MenuHelper { } static MenuItem addFlipOrientation(Menu menu, final Activity activity, final SharedPreferences prefs) { // position 41 after rotate + // D return menu .add(Menu.CATEGORY_SECONDARY, 304, 41, R.string.flip_orientation) .setOnMenuItemClickListener( new MenuItem.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { - int current = activity.getRequestedOrientation(); + // Check what our actual orientation is + int current = activity.getResources().getConfiguration().orientation; int newOrientation = android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; - if (current == android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { + if (current == Configuration.ORIENTATION_LANDSCAPE) { newOrientation = android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; } SharedPreferences.Editor editor = prefs.edit(); editor.putInt("nuorientation", newOrientation); editor.commit(); - requestOrientation(activity, prefs); + requestOrientation(activity, prefs, true); return true; } }) @@ -596,15 +617,24 @@ public class MenuHelper { } static void requestOrientation(Activity activity, SharedPreferences prefs) { + requestOrientation(activity, prefs, false); + } + + static private void requestOrientation(Activity activity, SharedPreferences prefs, + boolean ignoreIntentExtra) { int req = prefs.getInt("nuorientation", android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); // A little trick: use USER instead of UNSPECIFIED, so we ignore the // orientation set by the activity below. It may have forced a landscape // orientation, which the user has now cleared here. - activity.setRequestedOrientation( - req == android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED - ? android.content.pm.ActivityInfo.SCREEN_ORIENTATION_USER - : req); + if (req == android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) { + req = android.content.pm.ActivityInfo.SCREEN_ORIENTATION_USER; + } + if (! ignoreIntentExtra) { + Intent intent = activity.getIntent(); + req = intent.getIntExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, req); + } + activity.setRequestedOrientation(req); } static void setFlipOrientationEnabled(Activity activity, MenuItem flipItem) { @@ -628,13 +658,20 @@ public class MenuHelper { return durationValue; } - public static void showStorageToast(Activity activity) { + showStorageToast(activity, calculatePicturesRemaining()); + } + + public static void showStorageToast(Activity activity, int remaining) { String noStorageText = null; - int remaining = calculatePicturesRemaining(); if (remaining == MenuHelper.NO_STORAGE_ERROR) { - noStorageText = activity.getString(R.string.no_storage); + String state = Environment.getExternalStorageState(); + if (state == Environment.MEDIA_CHECKING) { + noStorageText = activity.getString(R.string.preparing_sd); + } else { + noStorageText = activity.getString(R.string.no_storage); + } } else if (remaining < 1) { noStorageText = activity.getString(R.string.not_enough_space); } diff --git a/src/com/android/camera/MovieView.java b/src/com/android/camera/MovieView.java index b93336c..091cc28 100644 --- a/src/com/android/camera/MovieView.java +++ b/src/com/android/camera/MovieView.java @@ -50,6 +50,11 @@ public class MovieView extends Activity implements MediaPlayer.OnErrorListener, private View mProgressView; private boolean mFinishOnCompletion; private Uri mUri; + + // State maintained for proper onPause/OnResume behaviour. + private int mPositionWhenPaused = -1; + private boolean mWasPlayingWhenPaused = false; + public MovieView() { } @@ -172,17 +177,42 @@ public class MovieView extends Activity implements MediaPlayer.OnErrorListener, if ("content".equalsIgnoreCase(scheme)) { ContentValues values = new ContentValues(); values.put(Video.VideoColumns.BOOKMARK, Integer.toString(bookmark)); - getContentResolver().update(mUri, values, null, null); - } + try { + getContentResolver().update(mUri, values, null, null); + } catch (SecurityException ex) { + // Ignore, can happen if we try to set the bookmark on a read-only resource + // such as a video attached to GMail. + } catch (SQLiteException e) { + // ignore. can happen if the content doesn't support a bookmark column. + } + } } @Override public void onPause() { mHandler.removeCallbacksAndMessages(null); setBookmark(mVideoView.getCurrentPosition()); + + mPositionWhenPaused = mVideoView.getCurrentPosition(); + mWasPlayingWhenPaused = mVideoView.isPlaying(); + mVideoView.stopPlayback(); + super.onPause(); } + @Override + public void onResume() { + if (mPositionWhenPaused >= 0) { + mVideoView.setVideoURI(mUri); + mVideoView.seekTo(mPositionWhenPaused); + if (mWasPlayingWhenPaused) { + mVideoView.start(); + } + } + + super.onResume(); + } + Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { diff --git a/src/com/android/camera/SlideShow.java b/src/com/android/camera/SlideShow.java index 2be99ac..23c7d4a 100644 --- a/src/com/android/camera/SlideShow.java +++ b/src/com/android/camera/SlideShow.java @@ -284,7 +284,7 @@ public class SlideShow extends Activity implements ViewSwitcher.ViewFactory throw new UnsupportedOperationException(); } - public void checkThumbnails(ThumbCheckCallback cb) { + public void checkThumbnails(ThumbCheckCallback cb, int totalThumbnails) { // TODO Auto-generated method stub } diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java index 4828b71..3474da6 100644 --- a/src/com/android/camera/VideoCamera.java +++ b/src/com/android/camera/VideoCamera.java @@ -20,11 +20,12 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import android.app.Activity; import android.app.AlertDialog; -import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.ContentValues; @@ -58,12 +59,14 @@ import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.MenuItem.OnMenuItemClickListener; +import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -public class VideoCamera extends Activity implements View.OnClickListener, SurfaceHolder.Callback { +public class VideoCamera extends Activity implements View.OnClickListener, + ShutterButton.OnShutterButtonListener, SurfaceHolder.Callback { private static final String TAG = "videocamera"; @@ -119,8 +122,9 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa int mCurrentZoomIndex = 0; - private ImageView mModeIndicatorView; + private ShutterButton mShutterButton; private TextView mRecordingTimeView; + private boolean mHasSdCard; ArrayList<MenuItem> mGalleryItems = new ArrayList<MenuItem>(); @@ -136,7 +140,7 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa switch (msg.what) { case CLEAR_SCREEN_DELAY: { - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + clearScreenOnFlag(); break; } @@ -185,9 +189,11 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa // TODO put up a "please wait" message // TODO also listen for the media scanner finished message showStorageToast(); + mHasSdCard = true; } else if (action.equals(Intent.ACTION_MEDIA_UNMOUNTED)) { // SD card unavailable showStorageToast(); + mHasSdCard = false; } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_STARTED)) { Toast.makeText(VideoCamera.this, getResources().getString(R.string.wait), 5000); } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) { @@ -215,9 +221,6 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa //setDefaultKeyMode(DEFAULT_KEYS_SHORTCUT); requestWindowFeature(Window.FEATURE_PROGRESS); - - Window win = getWindow(); - win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.video_camera); mVideoPreview = (VideoPreview) findViewById(R.id.camera_preview); @@ -236,12 +239,13 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa mPostPictureAlert = findViewById(R.id.post_picture_panel); int[] ids = new int[]{R.id.play, R.id.share, R.id.discard, - R.id.cancel, R.id.attach, R.id.mode_indicator}; + R.id.cancel, R.id.attach}; for (int id : ids) { findViewById(id).setOnClickListener(this); } - mModeIndicatorView = (ImageView) findViewById(R.id.mode_indicator); + mShutterButton = (ShutterButton) findViewById(R.id.shutter_button); + mShutterButton.setOnShutterButtonListener(this); mRecordingTimeView = (TextView) findViewById(R.id.recording_time); mVideoFrame = (ImageView) findViewById(R.id.video_frame); } @@ -253,35 +257,13 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa } super.onStart(); - final View hintView = findViewById(R.id.hint_toast); - if (hintView != null) - hintView.setVisibility(View.GONE); - Thread t = new Thread(new Runnable() { public void run() { final boolean storageOK = getAvailableStorage() >= LOW_STORAGE_THRESHOLD; - if (hintView == null) - return; - if (storageOK) { + if (!storageOK) { mHandler.post(new Runnable() { public void run() { - hintView.setVisibility(View.VISIBLE); - } - }); - mHandler.postDelayed(new Runnable() { - public void run() { - Animation a = new android.view.animation.AlphaAnimation(1F, 0F); - a.setDuration(500); - a.startNow(); - hintView.setAnimation(a); - hintView.setVisibility(View.GONE); - } - }, 3000); - } else { - mHandler.post(new Runnable() { - public void run() { - hintView.setVisibility(View.GONE); showStorageToast(); } }); @@ -325,19 +307,29 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa doPlayCurrentVideo(); break; } + } + } - case R.id.mode_indicator: - if (mMediaRecorderRecording) { - stopVideoRecordingAndDisplayDialog(); - } else if (mVideoFrame.getVisibility() == View.VISIBLE) { - doStartCaptureMode(); - } else { - startVideoRecording(); + public void onShutterButtonFocus(ShutterButton button, boolean pressed) { + switch (button.getId()) { + case R.id.shutter_button: + if (pressed) { + if (mMediaRecorderRecording) { + stopVideoRecordingAndDisplayDialog(); + } else if (mVideoFrame.getVisibility() == View.VISIBLE) { + doStartCaptureMode(); + } else { + startVideoRecording(); + } } break; } } + public void onShutterButtonClick(ShutterButton button) { + // Do nothing (everything happens in onShutterButtonFocus). + } + private void doStartCaptureMode() { if (isVideoCaptureIntent()) { discardCurrentVideoAndStartPreview(); @@ -379,7 +371,8 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa Log.v(TAG, "onResume " + this.hashCode()); } super.onResume(); - mHandler.sendEmptyMessageDelayed(CLEAR_SCREEN_DELAY, SCREEN_DELAY); + + setScreenTimeoutLong(); mPausing = false; @@ -391,6 +384,7 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa intentFilter.addDataScheme("file"); registerReceiver(mReceiver, intentFilter); mDidRegister = true; + mHasSdCard = ImageManager.hasStorage(); mBlackout.setVisibility(View.INVISIBLE); if (mVideoFrameBitmap == null) { @@ -406,7 +400,7 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa Log.v(TAG, "onStop " + this.hashCode()); } stopVideoRecording(); - mHandler.removeMessages(CLEAR_SCREEN_DELAY); + setScreenTimeoutSystemDefault(); super.onStop(); } @@ -427,12 +421,12 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa mDidRegister = false; } mBlackout.setVisibility(View.VISIBLE); + setScreenTimeoutSystemDefault(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { - mHandler.sendEmptyMessageDelayed(CLEAR_SCREEN_DELAY, SCREEN_DELAY); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + setScreenTimeoutLong(); switch (keyCode) { case KeyEvent.KEYCODE_BACK: @@ -445,19 +439,31 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa return true; } break; - case KeyEvent.KEYCODE_FOCUS: - return true; case KeyEvent.KEYCODE_CAMERA: - case KeyEvent.KEYCODE_DPAD_CENTER: if (event.getRepeatCount() == 0) { - if (!mMediaRecorderRecording) { - startVideoRecording(); + // If we get a dpad center event without any focused view, move the + // focus to the shutter button and press it. + if (mShutterButton.isInTouchMode()) { + mShutterButton.requestFocusFromTouch(); } else { - stopVideoRecordingAndDisplayDialog(); + mShutterButton.requestFocus(); } + mShutterButton.setPressed(true); return true; } return true; + case KeyEvent.KEYCODE_DPAD_CENTER: + if (event.getRepeatCount() == 0) { + // If we get a dpad center event without any focused view, move the + // focus to the shutter button and press it. + if (mShutterButton.isInTouchMode()) { + mShutterButton.requestFocusFromTouch(); + } else { + mShutterButton.requestFocus(); + } + mShutterButton.setPressed(true); + } + break; case KeyEvent.KEYCODE_MENU: if (mMediaRecorderRecording) { stopVideoRecordingAndDisplayDialog(); @@ -469,6 +475,16 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa return super.onKeyDown(keyCode, event); } + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + switch(keyCode) { + case KeyEvent.KEYCODE_CAMERA: + mShutterButton.setPressed(false); + return true; + } + return super.onKeyUp(keyCode, event); + } + public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { stopVideoRecording(); initializeVideo(); @@ -483,13 +499,7 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa } void gotoGallery() { - Uri target = Video.Media.INTERNAL_CONTENT_URI; - Intent intent = new Intent(Intent.ACTION_VIEW, target); - try { - startActivity(intent); - } catch (ActivityNotFoundException e) { - Log.e(TAG, "Could not start gallery activity", e); - } + MenuHelper.gotoCameraVideoGallery(this); } @Override @@ -509,36 +519,41 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); - addBaseMenuItems(menu); - MenuHelper.addImageMenuItems( - menu, - MenuHelper.INCLUDE_ALL & ~MenuHelper.INCLUDE_ROTATE_MENU, - false, - VideoCamera.this, - mHandler, - - // Handler for deletion - new Runnable() { - public void run() { - // What do we do here? - // mContentResolver.delete(uri, null, null); - } - }, - new MenuHelper.MenuInvoker() { - public void run(final MenuHelper.MenuCallback cb) { - } - }); - MenuItem gallery = menu.add(MenuHelper.IMAGE_SAVING_ITEM, MENU_SAVE_GALLERY_PHOTO, 0, - R.string.camera_gallery_photos_text).setOnMenuItemClickListener( - new MenuItem.OnMenuItemClickListener() { - public boolean onMenuItemClick(MenuItem item) { - gotoGallery(); - return true; - } - }); - gallery.setIcon(android.R.drawable.ic_menu_gallery); + if (isVideoCaptureIntent()) { + // No options menu for attach mode. + return false; + } else { + addBaseMenuItems(menu); + MenuHelper.addImageMenuItems( + menu, + MenuHelper.INCLUDE_ALL & ~MenuHelper.INCLUDE_ROTATE_MENU, + false, + VideoCamera.this, + mHandler, + + // Handler for deletion + new Runnable() { + public void run() { + // What do we do here? + // mContentResolver.delete(uri, null, null); + } + }, + new MenuHelper.MenuInvoker() { + public void run(final MenuHelper.MenuCallback cb) { + } + }); + MenuItem gallery = menu.add(MenuHelper.IMAGE_SAVING_ITEM, MENU_SAVE_GALLERY_PHOTO, 0, + R.string.camera_gallery_photos_text).setOnMenuItemClickListener( + new MenuItem.OnMenuItemClickListener() { + public boolean onMenuItemClick(MenuItem item) { + gotoGallery(); + return true; + } + }); + gallery.setIcon(android.R.drawable.ic_menu_gallery); + } return true; } @@ -731,7 +746,11 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa String cameraDirPath = ImageManager.CAMERA_IMAGE_BUCKET_NAME; File cameraDir = new File(cameraDirPath); cameraDir.mkdirs(); - String filename = cameraDirPath + "/" + Long.toString(dateTaken) + ".3gp"; + SimpleDateFormat dateFormat = new SimpleDateFormat( + getString(R.string.video_file_name_format)); + Date date = new Date(dateTaken); + String filepart = dateFormat.format(date); + String filename = cameraDirPath + "/" + filepart + ".3gp"; ContentValues values = new ContentValues(7); values.put(Video.Media.TITLE, title); values.put(Video.Media.DISPLAY_NAME, displayName); @@ -809,11 +828,17 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa Log.v(TAG, "startVideoRecording"); if (!mMediaRecorderRecording) { + if (!mHasSdCard) { + Toast.makeText(this, getString( + R.string.no_storage), Toast.LENGTH_LONG).show(); + Log.v(TAG, "No SD card, ignore start recording"); + return; + } + // Check mMediaRecorder to see whether it is initialized or not. if (mMediaRecorder == null) { initializeVideo(); } - getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); try { mMediaRecorder.start(); // Recording is now started } catch (RuntimeException e) { @@ -826,6 +851,7 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa mRecordingTimeView.setText(""); mRecordingTimeView.setVisibility(View.VISIBLE); mHandler.sendEmptyMessage(UPDATE_RECORD_TIME); + setScreenTimeoutInfinite(); } } @@ -833,7 +859,7 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa int drawableId = showRecording ? R.drawable.ic_camera_bar_indicator_record : R.drawable.ic_camera_indicator_video; Drawable drawable = getResources().getDrawable(drawableId); - mModeIndicatorView.setImageDrawable(drawable); + mShutterButton.setImageDrawable(drawable); } private void stopVideoRecordingAndDisplayDialog() { @@ -846,16 +872,33 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa } private void showPostRecordingAlert() { - boolean isPick = isVideoCaptureIntent(); - int pickVisible = isPick ? View.VISIBLE : View.GONE; - int normalVisible = ! isPick ? View.VISIBLE : View.GONE; - mPostPictureAlert.findViewById(R.id.share).setVisibility(normalVisible); - mPostPictureAlert.findViewById(R.id.discard).setVisibility(normalVisible); - mPostPictureAlert.findViewById(R.id.attach).setVisibility(pickVisible); - mPostPictureAlert.findViewById(R.id.cancel).setVisibility(pickVisible); + int[] pickIds = {R.id.attach, R.id.cancel}; + int[] normalIds = {R.id.share, R.id.discard}; + int[] alwaysOnIds = {R.id.play}; + int[] hideIds = pickIds; + int[] connectIds = normalIds; + if (isVideoCaptureIntent()) { + hideIds = normalIds; + connectIds = pickIds; + } + for(int id : hideIds) { + mPostPictureAlert.findViewById(id).setVisibility(View.GONE); + } + connectAndFadeIn(connectIds); + connectAndFadeIn(alwaysOnIds); mPostPictureAlert.setVisibility(View.VISIBLE); } + private void connectAndFadeIn(int[] connectIds) { + for(int id : connectIds) { + View view = mPostPictureAlert.findViewById(id); + view.setOnClickListener(this); + Animation animation = new AlphaAnimation(0F, 1F); + animation.setDuration(500); + view.setAnimation(animation); + } + } + private void hidePostPictureAlert() { mPostPictureAlert.setVisibility(View.INVISIBLE); } @@ -878,14 +921,44 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa releaseMediaRecorder(); updateRecordingIndicator(false); mRecordingTimeView.setVisibility(View.GONE); - getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + setScreenTimeoutLong(); } if (mNeedToRegisterRecording) { registerVideo(); mNeedToRegisterRecording = false; } - if (mCameraVideoFilename != null){ - deleteVideoFile(mCameraVideoFilename); + mCameraVideoFilename = null; + } + + private void setScreenTimeoutSystemDefault() { + mHandler.removeMessages(CLEAR_SCREEN_DELAY); + clearScreenOnFlag(); + } + + private void setScreenTimeoutLong() { + mHandler.removeMessages(CLEAR_SCREEN_DELAY); + setScreenOnFlag(); + mHandler.sendEmptyMessageDelayed(CLEAR_SCREEN_DELAY, SCREEN_DELAY); + } + + private void setScreenTimeoutInfinite() { + mHandler.removeMessages(CLEAR_SCREEN_DELAY); + setScreenOnFlag(); + } + + private void clearScreenOnFlag() { + Window w = getWindow(); + final int keepScreenOnFlag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; + if ((w.getAttributes().flags & keepScreenOnFlag) != 0) { + w.clearFlags(keepScreenOnFlag); + } + } + + private void setScreenOnFlag() { + Window w = getWindow(); + final int keepScreenOnFlag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; + if ((w.getAttributes().flags & keepScreenOnFlag) == 0) { + w.addFlags(keepScreenOnFlag); } } @@ -897,7 +970,7 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa private void acquireAndShowVideoFrame() { recycleVideoFrameBitmap(); - mVideoFrameBitmap = createVideoThumbnail(mCurrentVideoFilename); + mVideoFrameBitmap = ImageManager.createVideoThumbnail(mCurrentVideoFilename); mVideoFrame.setImageBitmap(mVideoFrameBitmap); mVideoFrame.setVisibility(View.VISIBLE); } @@ -914,19 +987,5 @@ public class VideoCamera extends Activity implements View.OnClickListener, Surfa mVideoFrameBitmap = null; } } - - private Bitmap createVideoThumbnail(String filePath) { - Bitmap bitmap = null; - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - try { - retriever.setMode(MediaMetadataRetriever.MODE_CAPTURE_FRAME_ONLY); - retriever.setDataSource(filePath); - bitmap = retriever.captureFrame(); - } finally { - retriever.release(); - } - return bitmap; - } - } diff --git a/src/com/android/camera/ViewImage.java b/src/com/android/camera/ViewImage.java index 9760562..293f26b 100644 --- a/src/com/android/camera/ViewImage.java +++ b/src/com/android/camera/ViewImage.java @@ -16,8 +16,9 @@ package com.android.camera; +import java.util.Random; + import android.app.Activity; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -28,12 +29,11 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; -import android.os.PowerManager; +import android.preference.PreferenceManager; import android.provider.MediaStore; import android.util.AttributeSet; import android.util.Config; import android.util.Log; -import android.view.GestureDetector; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; @@ -43,21 +43,17 @@ import android.view.Window; import android.view.WindowManager; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; -import android.view.animation.Animation; import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Scroller; -import android.widget.TextView; import android.widget.Toast; import android.widget.ZoomControls; -import android.preference.PreferenceManager; import com.android.camera.ImageManager.IImage; -import java.util.Random; - public class ViewImage extends Activity implements View.OnClickListener { static final String TAG = "ViewImage"; @@ -86,6 +82,7 @@ public class ViewImage extends Activity implements View.OnClickListener private boolean mFullScreenInNormalMode; private boolean mShowActionIcons; private View mActionIconPanel; + private View mShutterButton; private boolean mSortAscending = false; private int mSlideShowInterval; @@ -100,7 +97,6 @@ public class ViewImage extends Activity implements View.OnClickListener private Animation [] mSlideShowOutAnimation; private SharedPreferences mPrefs; - private MenuItem mFlipItem; private View mNextImageView, mPrevImageView; private Animation mHideNextImageViewAnimation = new AlphaAnimation(1F, 0F); @@ -130,8 +126,9 @@ public class ViewImage extends Activity implements View.OnClickListener private MenuHelper.MenuItemsResult mImageMenuRunnable; - Runnable mDismissOnScreenControlsRunnable; - ZoomControls mZoomControls; + private Runnable mDismissOnScreenControlsRunnable; + private ZoomControls mZoomControls; + private boolean mCameraReviewMode; public ViewImage() { } @@ -176,7 +173,9 @@ public class ViewImage extends Activity implements View.OnClickListener if (mZoomControls != null) { if (mZoomControls.getVisibility() == View.GONE) { mZoomControls.show(); - mZoomControls.requestFocus(); // this shouldn't be necessary + if (! mShowActionIcons) { + mZoomControls.requestFocus(); // this shouldn't be necessary + } } updateNextPrevControls(); scheduleDismissOnScreenControls(); @@ -210,21 +209,22 @@ public class ViewImage extends Activity implements View.OnClickListener mDismissOnScreenControlsRunnable = new Runnable() { public void run() { mZoomControls.hide(); + if (!mShowActionIcons) { + if (mNextImageView.getVisibility() == View.VISIBLE) { + Animation a = mHideNextImageViewAnimation; + a.setDuration(500); + a.startNow(); + mNextImageView.setAnimation(a); + mNextImageView.setVisibility(View.INVISIBLE); + } - if (mNextImageView.getVisibility() == View.VISIBLE) { - Animation a = mHideNextImageViewAnimation; - a.setDuration(500); - a.startNow(); - mNextImageView.setAnimation(a); - mNextImageView.setVisibility(View.INVISIBLE); - } - - if (mPrevImageView.getVisibility() == View.VISIBLE) { - Animation a = mHidePrevImageViewAnimation; - a.setDuration(500); - a.startNow(); - mPrevImageView.setAnimation(a); - mPrevImageView.setVisibility(View.INVISIBLE); + if (mPrevImageView.getVisibility() == View.VISIBLE) { + Animation a = mHidePrevImageViewAnimation; + a.setDuration(500); + a.startNow(); + mPrevImageView.setAnimation(a); + mPrevImageView.setVisibility(View.INVISIBLE); + } } } }; @@ -251,12 +251,12 @@ public class ViewImage extends Activity implements View.OnClickListener return (Intent.ACTION_PICK.equals(action) || Intent.ACTION_GET_CONTENT.equals(action)); } - private static final boolean sDragLeftRight = false; private static final boolean sUseBounce = false; private static final boolean sAnimateTransitions = false; static public class ImageViewTouch extends ImageViewTouchBase { private ViewImage mViewImage; + private boolean mEnableTrackballScroll; private static int TOUCH_STATE_REST = 0; private static int TOUCH_STATE_LEFT_PRESS = 1; @@ -277,6 +277,10 @@ public class ViewImage extends Activity implements View.OnClickListener mViewImage = (ViewImage) context; } + public void setEnableTrackballScroll(boolean enable) { + mEnableTrackballScroll = enable; + } + protected void postTranslate(float dx, float dy, boolean bounceOK) { super.postTranslate(dx, dy); if (dx != 0F || dy != 0F) @@ -390,6 +394,14 @@ public class ViewImage extends Activity implements View.OnClickListener @Override public boolean onKeyDown(int keyCode, KeyEvent event) { + // Don't respond to arrow keys if trackball scrolling is not enabled + if (!mEnableTrackballScroll) { + if ((keyCode >= KeyEvent.KEYCODE_DPAD_UP) + && (keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT)) { + return super.onKeyDown(keyCode, event); + } + } + int current = mViewImage.mCurrentPosition; int nextImagePos = -2; // default no next image @@ -557,7 +569,7 @@ public class ViewImage extends Activity implements View.OnClickListener { super.onCreateOptionsMenu(menu); - if (true) { + if (! mCameraReviewMode) { MenuItem item = menu.add(Menu.CATEGORY_SECONDARY, 203, 0, R.string.slide_show); item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { @@ -570,8 +582,6 @@ public class ViewImage extends Activity implements View.OnClickListener item.setIcon(android.R.drawable.ic_menu_slideshow); } - mFlipItem = MenuHelper.addFlipOrientation(menu, ViewImage.this, mPrefs); - final SelectedImageGetter selectedImageGetter = new SelectedImageGetter() { public ImageManager.IImage getCurrentImage() { return mAllImages.getImageAt(mCurrentPosition); @@ -657,8 +667,6 @@ public class ViewImage extends Activity implements View.OnClickListener mImageMenuRunnable.gettingReadyToOpen(menu, mAllImages.getImageAt(mCurrentPosition)); } - MenuHelper.setFlipOrientationEnabled(this, mFlipItem); - menu.findItem(MenuHelper.MENU_IMAGE_SHARE).setEnabled(isCurrentImageShareable()); return true; @@ -986,8 +994,10 @@ public class ViewImage extends Activity implements View.OnClickListener ImageGetterCallback cb = new ImageGetterCallback() { public void completed(boolean wasCanceled) { - mImageViews[1].setFocusableInTouchMode(true); - mImageViews[1].requestFocus(); + if (!mShowActionIcons) { + mImageViews[1].setFocusableInTouchMode(true); + mImageViews[1].requestFocus(); + } } public boolean wantsThumbnail(int pos, int offset) { @@ -1037,6 +1047,11 @@ public class ViewImage extends Activity implements View.OnClickListener public void onCreate(Bundle instanceState) { super.onCreate(instanceState); + Intent intent = getIntent(); + mCameraReviewMode = intent.getBooleanExtra("com.android.camera.ReviewMode", false); + mFullScreenInNormalMode = intent.getBooleanExtra(MediaStore.EXTRA_FULL_SCREEN, true); + mShowActionIcons = intent.getBooleanExtra(MediaStore.EXTRA_SHOW_ACTION_ICONS, false); + mPrefs = PreferenceManager.getDefaultSharedPreferences(this); setDefaultKeyMode(DEFAULT_KEYS_SHORTCUT); @@ -1047,6 +1062,10 @@ public class ViewImage extends Activity implements View.OnClickListener mImageViews[1] = (ImageViewTouch) findViewById(R.id.image2); mImageViews[2] = (ImageViewTouch) findViewById(R.id.image3); + for(ImageViewTouch v : mImageViews) { + v.setEnableTrackballScroll(!mShowActionIcons); + } + mScroller = (ScrollHandler)findViewById(R.id.scroller); makeGetter(); @@ -1066,16 +1085,16 @@ public class ViewImage extends Activity implements View.OnClickListener mSlideShowImageViews[0] = (ImageViewTouch) findViewById(R.id.image1_slideShow); mSlideShowImageViews[1] = (ImageViewTouch) findViewById(R.id.image2_slideShow); - for (int i = 0; i < mSlideShowImageViews.length; i++) { - mSlideShowImageViews[i].setImageBitmapResetBase(null, true, true); - mSlideShowImageViews[i].setVisibility(View.INVISIBLE); + for (ImageViewTouch v : mSlideShowImageViews) { + v.setImageBitmapResetBase(null, true, true); + v.setVisibility(View.INVISIBLE); + v.setEnableTrackballScroll(!mShowActionIcons); } mActionIconPanel = findViewById(R.id.action_icon_panel); { int[] pickIds = {R.id.attach, R.id.cancel}; int[] normalIds = {R.id.gallery, R.id.setas, R.id.share, R.id.discard}; - int[] alwaysOnIds = {R.id.mode_indicator }; int[] hideIds = pickIds; int[] connectIds = normalIds; if (isPickIntent()) { @@ -1083,15 +1102,18 @@ public class ViewImage extends Activity implements View.OnClickListener connectIds = pickIds; } for(int id : hideIds) { - findViewById(id).setVisibility(View.GONE); + mActionIconPanel.findViewById(id).setVisibility(View.GONE); } for(int id : connectIds) { - findViewById(id).setOnClickListener(this); - } - for(int id : alwaysOnIds) { - findViewById(id).setOnClickListener(this); + View view = mActionIconPanel.findViewById(id); + view.setOnClickListener(this); + Animation animation = new AlphaAnimation(0F, 1F); + animation.setDuration(500); + view.setAnimation(animation); } } + mShutterButton = findViewById(R.id.shutter_button); + mShutterButton.setOnClickListener(this); Uri uri = getIntent().getData(); @@ -1107,10 +1129,6 @@ public class ViewImage extends Activity implements View.OnClickListener return; } init(uri); - mFullScreenInNormalMode = getIntent().getBooleanExtra( - MediaStore.EXTRA_SHOW_ACTION_ICONS, false); - mShowActionIcons = getIntent().getBooleanExtra( - MediaStore.EXTRA_SHOW_ACTION_ICONS, false); Bundle b = getIntent().getExtras(); @@ -1124,6 +1142,7 @@ public class ViewImage extends Activity implements View.OnClickListener } if (mShowActionIcons) { mActionIconPanel.setVisibility(View.VISIBLE); + mShutterButton.setVisibility(View.VISIBLE); } } @@ -1140,6 +1159,12 @@ public class ViewImage extends Activity implements View.OnClickListener mNextImageView = findViewById(R.id.next_image); mPrevImageView = findViewById(R.id.prev_image); + if (mShowActionIcons) { + mNextImageView.setOnClickListener(this); + mNextImageView.setFocusable(true); + mPrevImageView.setOnClickListener(this); + mPrevImageView.setFocusable(true); + } setOrientation(); } @@ -1186,6 +1211,7 @@ public class ViewImage extends Activity implements View.OnClickListener ivt.clear(); } mActionIconPanel.setVisibility(View.GONE); + mShutterButton.setVisibility(View.GONE); if (false) { Log.v(TAG, "current is " + this.mSlideShowImageCurrent); @@ -1237,6 +1263,7 @@ public class ViewImage extends Activity implements View.OnClickListener } if (mShowActionIcons) { mActionIconPanel.setVisibility(View.VISIBLE); + mShutterButton.setVisibility(View.VISIBLE); } ImageViewTouchBase dst = mImageViews[1]; @@ -1381,12 +1408,21 @@ public class ViewImage extends Activity implements View.OnClickListener mGetter = new ImageGetter(); } - private void init(Uri uri) { + private boolean desiredSortOrder() { String sortOrder = mPrefs.getString("pref_gallery_sort_key", null); - mSortAscending = false; + boolean sortAscending = false; if (sortOrder != null) { - mSortAscending = sortOrder.equals("ascending"); + sortAscending = sortOrder.equals("ascending"); } + if (mCameraReviewMode) { + // Force left-arrow older pictures, right-arrow newer pictures. + sortAscending = true; + } + return sortAscending; + } + + private void init(Uri uri) { + mSortAscending = desiredSortOrder(); int sort = mSortAscending ? ImageManager.SORT_ASCENDING : ImageManager.SORT_DESCENDING; mAllImages = ImageManager.makeImageList(uri, this, sort); @@ -1436,12 +1472,7 @@ public class ViewImage extends Activity implements View.OnClickListener ImageManager.IImage image = mAllImages.getImageAt(mCurrentPosition); - String sortOrder = mPrefs.getString("pref_gallery_sort_key", null); - boolean sortAscending = false; - if (sortOrder != null) { - sortAscending = sortOrder.equals("ascending"); - } - if (sortAscending != mSortAscending) { + if (desiredSortOrder() != mSortAscending) { init(image.fullSizeImageUri()); } @@ -1496,8 +1527,12 @@ public class ViewImage extends Activity implements View.OnClickListener public void onClick(View v) { switch (v.getId()) { - case R.id.mode_indicator: { - MenuHelper.gotoStillImageCapture(this); + case R.id.shutter_button: { + if (mCameraReviewMode) { + finish(); + } else { + MenuHelper.gotoStillImageCapture(this); + } } break; @@ -1507,7 +1542,11 @@ public class ViewImage extends Activity implements View.OnClickListener break; case R.id.discard: { - MenuHelper.displayDeleteDialog(this, mDeletePhotoRunnable, true); + if (mCameraReviewMode) { + mDeletePhotoRunnable.run(); + } else { + MenuHelper.deletePhoto(this, mDeletePhotoRunnable); + } } break; @@ -1535,6 +1574,23 @@ public class ViewImage extends Activity implements View.OnClickListener } } break; + + case R.id.next_image: { + moveNextOrPrevious(1); + } + break; + + case R.id.prev_image: { + moveNextOrPrevious(-1); + } + break; + } + } + + private void moveNextOrPrevious(int delta) { + int nextImagePos = mCurrentPosition + delta; + if ((0 <= nextImagePos) && (nextImagePos < mAllImages.getCount())) { + setImage(nextImagePos); } } } diff --git a/tests/Android.mk b/tests/Android.mk index 714e078..f5972cb 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -1,3 +1,4 @@ +LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) # We only want this apk build for tests. @@ -14,3 +15,5 @@ LOCAL_PACKAGE_NAME := CameraTests LOCAL_INSTRUMENTATION_FOR := Camera include $(BUILD_PACKAGE) + + diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml index b8074f5..1b7abd2 100644 --- a/tests/AndroidManifest.xml +++ b/tests/AndroidManifest.xml @@ -25,5 +25,10 @@ android:targetPackage="com.android.camera" android:label="Camera Launch Performance"> </instrumentation> + + <instrumentation android:name=".CameraStressTestRunner" + android:targetPackage="com.android.camera" + android:label="Camera Stress Test InstrumentationRunner"> + </instrumentation> </manifest> diff --git a/tests/src/com/android/camera/CameraStressTestRunner.java b/tests/src/com/android/camera/CameraStressTestRunner.java new file mode 100755 index 0000000..e34204c --- /dev/null +++ b/tests/src/com/android/camera/CameraStressTestRunner.java @@ -0,0 +1,50 @@ +/* + * 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.tests; + +import android.test.InstrumentationTestRunner; +import android.test.InstrumentationTestSuite; +import com.android.camera.tests.stress.SwitchPreview; +import com.android.camera.tests.stress.ImageCapture; + +import junit.framework.TestSuite; + + +/** + * Instrumentation Test Runner for all Camera tests. + * + * Running all tests: + * + * adb shell am instrument -w \ + * com.android.camera.tests/.CameraStressTestRunner + */ + +public class CameraStressTestRunner extends InstrumentationTestRunner { + + @Override + public TestSuite getAllTests() { + TestSuite suite = new InstrumentationTestSuite(this); + suite.addTestSuite(SwitchPreview.class); + suite.addTestSuite(ImageCapture.class); + return suite; + } + + @Override + public ClassLoader getLoader() { + return CameraStressTestRunner.class.getClassLoader(); + } +} diff --git a/tests/src/com/android/camera/stress/ImageCapture.java b/tests/src/com/android/camera/stress/ImageCapture.java new file mode 100755 index 0000000..dbb1f64 --- /dev/null +++ b/tests/src/com/android/camera/stress/ImageCapture.java @@ -0,0 +1,96 @@ +/* + * 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.tests.stress; + +import android.app.Activity; +import android.app.Instrumentation; +import android.test.ActivityInstrumentationTestCase2; +import android.util.Log; +import android.view.KeyEvent; +import android.test.suitebuilder.annotation.LargeTest; + +import com.android.camera.Camera; + +/** + * Junit / Instrumentation test case for camera test + * + */ + +public class ImageCapture extends ActivityInstrumentationTestCase2 <Camera> { + private String TAG = "ImageCapture"; + private static final int TOTAL_NUMBER_OF_IMAGECAPTURE = 100; + private static final int TOTAL_NUMBER_OF_VIDEOCAPTURE = 100; + private static final long WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN = 1000; + private static final long WAIT_FOR_VIDEO_CAPTURE_TO_BE_TAKEN = 50000; //50seconds + private static final long WAIT_FOR_PREVIEW = 1000; //1 seconds + + public ImageCapture() { + super("com.android.camera", Camera.class); + } + + @Override + protected void setUp() throws Exception { + getActivity(); + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + @LargeTest + public void testImageCapture() { + Instrumentation inst = getInstrumentation(); + try { + for (int i = 0; i < TOTAL_NUMBER_OF_IMAGECAPTURE; i++) { + Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP); + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); + Thread.sleep(WAIT_FOR_IMAGE_CAPTURE_TO_BE_TAKEN); + } + } catch (Exception e) { + Log.v(TAG, e.toString()); + } + assertTrue("testImageCapture", true); + } + + @LargeTest + public void testVideoCapture() { + Instrumentation inst = getInstrumentation(); + //Switch to the video mode + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_MENU); + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); + try { + for (int i = 0; i < TOTAL_NUMBER_OF_VIDEOCAPTURE; i++) { + Thread.sleep(WAIT_FOR_PREVIEW); + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP); + //record an video + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); + Thread.sleep(WAIT_FOR_VIDEO_CAPTURE_TO_BE_TAKEN); + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); + Thread.sleep(WAIT_FOR_PREVIEW); + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); + } + } catch (Exception e) { + Log.v(TAG, e.toString()); + } + assertTrue("testVideoCapture", true); + } + +} + diff --git a/tests/src/com/android/camera/stress/SwitchPreview.java b/tests/src/com/android/camera/stress/SwitchPreview.java new file mode 100755 index 0000000..c00e553 --- /dev/null +++ b/tests/src/com/android/camera/stress/SwitchPreview.java @@ -0,0 +1,74 @@ +/* + * 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.tests.stress; + +import android.app.Activity; +import android.app.Instrumentation; +import android.test.ActivityInstrumentationTestCase2; +import android.util.Log; +import android.view.KeyEvent; +import android.test.suitebuilder.annotation.LargeTest; + +import com.android.camera.Camera; +import com.android.camera.VideoCamera; + +/** + * Junit / Instrumentation test case for camera test + * + */ + +public class SwitchPreview extends ActivityInstrumentationTestCase2 <VideoCamera>{ + private String TAG = "SwitchPreview"; + private static final int TOTAL_NUMBER_OF_SWITCHING = 200; + private static final long WAIT_FOR_PREVIEW = 2000; + + + public SwitchPreview() { + super("com.android.camera", VideoCamera.class); + } + + @Override + protected void setUp() throws Exception { + getActivity(); + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + getActivity().finish(); + super.tearDown(); + } + + @LargeTest + public void testSwitchMode() { + //Switching the video and the video recorder mode + Instrumentation inst = getInstrumentation(); + try{ + for (int i=0; i< TOTAL_NUMBER_OF_SWITCHING; i++) { + Thread.sleep(WAIT_FOR_PREVIEW); + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_MENU); + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_LEFT); + inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER); + Thread.sleep(WAIT_FOR_PREVIEW); + } + } catch (Exception e){ + Log.v(TAG, e.toString()); + } + assertTrue("testSwitchMode",true); + } +} + |