auto import from //branches/cupcake/...@125939
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index bd8fc34..574d301 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -3,10 +3,8 @@
         android:sharedUserId="android.media">
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-    <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.SET_WALLPAPER" />
-    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
     <application android:icon="@drawable/ic_launcher_camera"
             android:label="@string/camera_label"
             android:taskAffinity="">
@@ -46,6 +44,10 @@
                 <action android:name="android.media.action.VIDEO_CAMERA" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
+            <intent-filter>
+                <action android:name="android.media.action.VIDEO_CAPTURE" />
+                <category android:name="android.intent.category.DEFAULT" />
+            </intent-filter>
         </activity>
         <activity android:name="GalleryPicker" android:label="@string/gallery_picker_label"
                 android:configChanges="orientation|keyboardHidden"
@@ -86,6 +88,7 @@
                 <category android:name="android.intent.category.OPENABLE" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <data android:mimeType="image/*" />
+                <data android:mimeType="video/*" />
             </intent-filter>
             <intent-filter>
                 <action android:name="android.intent.action.PICK" />
@@ -191,16 +194,6 @@
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
-
-        <!--<activity android:name=".DrmWallpaper"-->
-            <!--android:label="@string/camera_setas_wallpaper_drm"-->
-            <!--android:icon="@drawable/ic_launcher_gallery">-->
-            <!--<intent-filter>-->
-                <!--<action android:name="android.intent.action.SET_WALLPAPER" />-->
-                <!--<category android:name="android.intent.category.DEFAULT" />-->
-            <!--</intent-filter>-->
-        <!--</activity>-->
-
     </application>
 </manifest>
 
diff --git a/res/drawable/detail_photo_border.9.png b/res/drawable/detail_photo_border.9.png
new file mode 100644
index 0000000..6de37b7
--- /dev/null
+++ b/res/drawable/detail_photo_border.9.png
Binary files differ
diff --git a/res/drawable/frame_thumbnail.xml b/res/drawable/frame_thumbnail.xml
new file mode 100644
index 0000000..782436c
--- /dev/null
+++ b/res/drawable/frame_thumbnail.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+  
+          http://www.apache.org/licenses/LICENSE-2.0
+  
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item android:state_window_focused="false"
+        android:drawable="@drawable/frame_thumbnail_default" />
+
+    <item android:state_pressed="true"
+        android:drawable="@drawable/frame_thumbnail_pressed" />
+
+    <item android:state_selected="true"
+        android:drawable="@drawable/frame_thumbnail_selected" />
+
+</selector>
diff --git a/res/drawable/frame_thumbnail_default.png b/res/drawable/frame_thumbnail_default.png
new file mode 100644
index 0000000..50f2ecf
--- /dev/null
+++ b/res/drawable/frame_thumbnail_default.png
Binary files differ
diff --git a/res/drawable/frame_thumbnail_pressed.png b/res/drawable/frame_thumbnail_pressed.png
new file mode 100644
index 0000000..f46ad06
--- /dev/null
+++ b/res/drawable/frame_thumbnail_pressed.png
Binary files differ
diff --git a/res/drawable/frame_thumbnail_selected.png b/res/drawable/frame_thumbnail_selected.png
new file mode 100644
index 0000000..2d32aa2
--- /dev/null
+++ b/res/drawable/frame_thumbnail_selected.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_capture_default.png b/res/drawable/ic_btn_actionmenu_capture_default.png
new file mode 100644
index 0000000..2837405
--- /dev/null
+++ b/res/drawable/ic_btn_actionmenu_capture_default.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_capture_pressed.png b/res/drawable/ic_btn_actionmenu_capture_pressed.png
new file mode 100644
index 0000000..617c366
--- /dev/null
+++ b/res/drawable/ic_btn_actionmenu_capture_pressed.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_capture_selected.png b/res/drawable/ic_btn_actionmenu_capture_selected.png
new file mode 100644
index 0000000..81c0278
--- /dev/null
+++ b/res/drawable/ic_btn_actionmenu_capture_selected.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_delete_default.png b/res/drawable/ic_btn_actionmenu_delete_default.png
index d7d4899..7e25f0d 100644
--- a/res/drawable/ic_btn_actionmenu_delete_default.png
+++ b/res/drawable/ic_btn_actionmenu_delete_default.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_delete_pressed.png b/res/drawable/ic_btn_actionmenu_delete_pressed.png
index 2a39eb0..94087f6 100644
--- a/res/drawable/ic_btn_actionmenu_delete_pressed.png
+++ b/res/drawable/ic_btn_actionmenu_delete_pressed.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_delete_selected.png b/res/drawable/ic_btn_actionmenu_delete_selected.png
index 7d41002..780310b 100644
--- a/res/drawable/ic_btn_actionmenu_delete_selected.png
+++ b/res/drawable/ic_btn_actionmenu_delete_selected.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_gallery_default.png b/res/drawable/ic_btn_actionmenu_gallery_default.png
new file mode 100644
index 0000000..a2d38db
--- /dev/null
+++ b/res/drawable/ic_btn_actionmenu_gallery_default.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_gallery_pressed.png b/res/drawable/ic_btn_actionmenu_gallery_pressed.png
new file mode 100644
index 0000000..a01b7f8
--- /dev/null
+++ b/res/drawable/ic_btn_actionmenu_gallery_pressed.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_gallery_selected.png b/res/drawable/ic_btn_actionmenu_gallery_selected.png
new file mode 100644
index 0000000..400a63b
--- /dev/null
+++ b/res/drawable/ic_btn_actionmenu_gallery_selected.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_play_default.png b/res/drawable/ic_btn_actionmenu_play_default.png
index b8724aa..17e0748 100644
--- a/res/drawable/ic_btn_actionmenu_play_default.png
+++ b/res/drawable/ic_btn_actionmenu_play_default.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_play_pressed.png b/res/drawable/ic_btn_actionmenu_play_pressed.png
index eaa308b..c671669 100644
--- a/res/drawable/ic_btn_actionmenu_play_pressed.png
+++ b/res/drawable/ic_btn_actionmenu_play_pressed.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_play_selected.png b/res/drawable/ic_btn_actionmenu_play_selected.png
index c7cbfec..35e1425 100644
--- a/res/drawable/ic_btn_actionmenu_play_selected.png
+++ b/res/drawable/ic_btn_actionmenu_play_selected.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_set_as_default.png b/res/drawable/ic_btn_actionmenu_set_as_default.png
index f9a5f23..0d341c7 100644
--- a/res/drawable/ic_btn_actionmenu_set_as_default.png
+++ b/res/drawable/ic_btn_actionmenu_set_as_default.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_set_as_pressed.png b/res/drawable/ic_btn_actionmenu_set_as_pressed.png
index 5b1fddd..58dc85c 100644
--- a/res/drawable/ic_btn_actionmenu_set_as_pressed.png
+++ b/res/drawable/ic_btn_actionmenu_set_as_pressed.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_set_as_selected.png b/res/drawable/ic_btn_actionmenu_set_as_selected.png
index 1e25cf3..6281229 100644
--- a/res/drawable/ic_btn_actionmenu_set_as_selected.png
+++ b/res/drawable/ic_btn_actionmenu_set_as_selected.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_share_default.png b/res/drawable/ic_btn_actionmenu_share_default.png
index 0e806c8..19f6ef4 100644
--- a/res/drawable/ic_btn_actionmenu_share_default.png
+++ b/res/drawable/ic_btn_actionmenu_share_default.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_share_pressed.png b/res/drawable/ic_btn_actionmenu_share_pressed.png
index e9e5845..8583114 100644
--- a/res/drawable/ic_btn_actionmenu_share_pressed.png
+++ b/res/drawable/ic_btn_actionmenu_share_pressed.png
Binary files differ
diff --git a/res/drawable/ic_btn_actionmenu_share_selected.png b/res/drawable/ic_btn_actionmenu_share_selected.png
index f9998b6..fc9679b 100644
--- a/res/drawable/ic_btn_actionmenu_share_selected.png
+++ b/res/drawable/ic_btn_actionmenu_share_selected.png
Binary files differ
diff --git a/res/drawable/ic_menu_camera.png b/res/drawable/ic_menu_camera.png
deleted file mode 100644
index cdf7ca3..0000000
--- a/res/drawable/ic_menu_camera.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/ic_menu_capture.xml b/res/drawable/ic_menu_capture.xml
new file mode 100644
index 0000000..aedcab9
--- /dev/null
+++ b/res/drawable/ic_menu_capture.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* grid_background.xml
+**
+** Copyright 2006, The Android Open 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_btn_actionmenu_capture_pressed" />
+    <item android:state_focused="true" android:drawable="@drawable/ic_btn_actionmenu_capture_selected" />
+    <item android:drawable="@drawable/ic_btn_actionmenu_capture_default" />
+</selector>
diff --git a/res/drawable/ic_menu_gallery.xml b/res/drawable/ic_menu_gallery.xml
new file mode 100644
index 0000000..1ecb4f9
--- /dev/null
+++ b/res/drawable/ic_menu_gallery.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/* grid_background.xml
+**
+** Copyright 2006, The Android Open 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_btn_actionmenu_gallery_pressed" />
+    <item android:state_focused="true" android:drawable="@drawable/ic_btn_actionmenu_gallery_selected" />
+    <item android:drawable="@drawable/ic_btn_actionmenu_gallery_default" />
+</selector>
diff --git a/res/layout/camera.xml b/res/layout/camera.xml
index 40b579b..8892134 100644
--- a/res/layout/camera.xml
+++ b/res/layout/camera.xml
@@ -55,6 +55,18 @@
         android:layout_marginRight="5dip"
         android:layout_marginTop="15dip"
         android:scaleType="center"/>
+
+	<ImageView
+	    android:id="@+id/last_picture_button"
+		android:layout_width="75dip"
+		android:layout_height="75dip"
+		android:clickable="true"
+		android:focusable="true"
+		android:focusableInTouchMode="true"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentBottom="true"
+        android:layout_marginLeft="10dip"
+        android:layout_marginBottom="10dip"/>
     
     <TextView
             android:id="@+id/hint_toast"
@@ -66,44 +78,5 @@
             android:gravity="center"
             android:text="@string/camera_button_hint"
             android:textSize="18sp"/>
-
-    <LinearLayout
-            android:visibility="gone"
-            android:id="@+id/post_picture_panel"
-            android:layout_alignParentBottom="true"
-            android:layout_alignParentRight="true"
-            android:paddingLeft="7dip"
-            android:paddingRight="7dip"
-            android:paddingTop="6dip"
-            android:paddingBottom="6dip"
-            android:layout_width="wrap_content" 
-            android:layout_height="wrap_content"
-            android:orientation="horizontal">
-
-        <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"
-        />
-    </LinearLayout>
 </RelativeLayout>
 
diff --git a/res/layout/detailsview.xml b/res/layout/detailsview.xml
index 21cac08..e28f06c 100644
--- a/res/layout/detailsview.xml
+++ b/res/layout/detailsview.xml
@@ -23,8 +23,8 @@
 		android:orientation="vertical"
 		android:layout_width="fill_parent"
 		android:layout_height="wrap_content"
-		android:paddingLeft="10dip"
-		android:paddingRight="10dip"
+		android:paddingLeft="5dip"
+		android:paddingRight="5dip"
 		android:paddingBottom="10dp">
 		
 		<LinearLayout
@@ -32,11 +32,18 @@
 			android:gravity="center_vertical"
 			android:layout_width="fill_parent"
 			android:layout_height="wrap_content">
-			
-			<ImageView
-				android:id="@+id/details_thumbnail_image"
-				android:layout_width="64dip"
-				android:layout_height="64dip"/>
+
+			<LinearLayout
+			    android:orientation="horizontal"
+			    android:gravity="center_vertical"
+			    android:layout_width="wrap_content"
+			    android:layout_height="wrap_content"
+                android:background="@drawable/detail_photo_border">
+			    <ImageView
+				    android:id="@+id/details_thumbnail_image"
+				    android:layout_width="64dip"
+				    android:layout_height="64dip"/>
+		    </LinearLayout>
 
 		    <TextView
 		    	android:id="@+id/details_image_title"
@@ -51,15 +58,16 @@
 		<TableLayout
 		    android:layout_width="fill_parent"
 		    android:layout_height="wrap_content"
+		    android:paddingLeft="5dip"
 		    android:layout_marginTop="10dip">
 		
 		    <TableRow>
 		        <TextView
-				    android:id="@+id/details_attrname_1"
 				    android:gravity="right"
-				    android:textAppearance="?android:attr/textAppearanceSmall" />
+				    android:textAppearance="?android:attr/textAppearanceSmall" 
+				    android:text="@string/details_file_size"/>
 		        <TextView
-		            android:id="@+id/details_attrvalu_1"
+		            android:id="@+id/details_file_size_value"
 		            android:textAppearance="?android:attr/textAppearanceSmall"
 		            android:paddingLeft="5dip"
 		            android:textColor="?android:attr/textColorPrimary"/>
@@ -67,24 +75,86 @@
 		
 		    <TableRow>
 		        <TextView
-		            android:id="@+id/details_attrname_2"
 		            android:gravity="right"
-		            android:textAppearance="?android:attr/textAppearanceSmall"/>
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:text="@string/details_image_resolution"/>
 		        <TextView
-		            android:id="@+id/details_attrvalu_2"
+		            android:id="@+id/details_resolution_value"
+        	   	    android:layout_height="wrap_content" 
+			   	    android:layout_width="fill_parent"
 		            android:textAppearance="?android:attr/textAppearanceSmall"
 		            android:paddingLeft="5dip"
 		            android:textColor="?android:attr/textColorPrimary"/>
 		    </TableRow>
-		
 		    <TableRow
-		    	android:id="@+id/details_daterow">
+		    	android:id="@+id/details_duration_row">
 		        <TextView
-		            android:id="@+id/details_attrname_3"
 		            android:gravity="right"
-		            android:textAppearance="?android:attr/textAppearanceSmall"/>
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:text="@string/details_duration"/>
 		        <TextView
-		            android:id="@+id/details_attrvalu_3"
+		            android:id="@+id/details_duration_value"
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:paddingLeft="5dip"
+		            android:textColor="?android:attr/textColorPrimary"/>
+		    </TableRow>
+		    <TableRow
+		    	android:id="@+id/details_frame_rate_row">
+		        <TextView
+		            android:gravity="right"
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:text="@string/details_frame_rate"/>
+		        <TextView
+		            android:id="@+id/details_frame_rate_value"
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:paddingLeft="5dip"
+		            android:textColor="?android:attr/textColorPrimary"/>
+		    </TableRow>
+		    
+		    <TableRow
+		    	android:id="@+id/details_bit_rate_row">
+		        <TextView
+		            android:gravity="right"
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:text="@string/details_bit_rate"/>
+		        <TextView
+		            android:id="@+id/details_bit_rate_value"
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:paddingLeft="5dip"
+		            android:textColor="?android:attr/textColorPrimary"/>
+		    </TableRow>
+		    <TableRow
+		    	android:id="@+id/details_format_row">
+		        <TextView
+		            android:gravity="right"
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:text="@string/details_format"/>
+		        <TextView
+		            android:id="@+id/details_format_value"
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:paddingLeft="5dip"
+		            android:textColor="?android:attr/textColorPrimary"/>
+		    </TableRow>
+		    <TableRow
+		    	android:id="@+id/details_codec_row">
+		        <TextView
+		            android:gravity="right"
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:text="@string/details_codec"/>
+		        <TextView
+		            android:id="@+id/details_codec_value"
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:paddingLeft="5dip"
+		            android:textColor="?android:attr/textColorPrimary"/>
+		    </TableRow>
+		    <TableRow
+		    	android:id="@+id/details_date_taken_row">
+		        <TextView
+		            android:gravity="right"
+		            android:textAppearance="?android:attr/textAppearanceSmall"
+		            android:text="@string/details_date_taken"/>
+		        <TextView
+		            android:id="@+id/details_date_taken_value"
 		            android:textAppearance="?android:attr/textAppearanceSmall"
 		            android:paddingLeft="5dip"
 		            android:textColor="?android:attr/textColorPrimary"/>
diff --git a/res/layout/gallery_picker_item.xml b/res/layout/gallery_picker_item.xml
index 5536dad..62d8333 100644
--- a/res/layout/gallery_picker_item.xml
+++ b/res/layout/gallery_picker_item.xml
@@ -4,9 +4,9 @@
      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.
@@ -14,30 +14,25 @@
      limitations under the License.
 -->
 
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="160dp" android:paddingTop="0dip"
-    android:paddingBottom="0dip" android:paddingLeft="0dip"
-    android:layout_height="wrap_content">
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="148dp"
+    android:layout_height="wrap_content"
+    android:gravity="center_horizontal">
 
-    <LinearLayout android:orientation="vertical"
+    <com.android.camera.GalleryPickerItem android:id="@+id/thumbnail"
+        android:layout_width="142dip"
+        android:layout_height="142dip"
+        android:scaleType="centerCrop" />
+
+    <TextView android:id="@+id/title"
+        android:paddingTop="3dip"
+        android:paddingBottom="9dip"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:gravity="center_horizontal">
+        android:textSize="14sp"
+        android:singleLine="true"
+        android:textColor="#ffffffff"
+        android:ellipsize="middle"
+        android:layout_height="wrap_content" />
 
-        <com.android.camera.GalleryPickerItem android:id="@+id/thumbnail"
-            android:layout_width="142dip" 
-            android:layout_height="142dip"
-            android:scaleType="centerCrop" />
-
-        <TextView android:id="@+id/title"
-        	android:paddingTop="3dip"
-        	android:paddingBottom="9dip"
-            android:layout_width="wrap_content"
-            android:textSize="14sp" 
-            android:maxLines="2" 
-            android:textColor="#ffffffff"
-            android:ellipsize="end"
-            android:layout_height="wrap_content" />
-
-	</LinearLayout>
-</FrameLayout>
+</LinearLayout>
diff --git a/res/layout/gallerypicker.xml b/res/layout/gallerypicker.xml
index fd6f40a..2227989 100644
--- a/res/layout/gallerypicker.xml
+++ b/res/layout/gallerypicker.xml
@@ -14,19 +14,14 @@
      limitations under the License.
 -->
 
-<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root"
+<GridView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/albums"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
-    android:background="#000000">
-    
-    <GridView android:id="@+id/albums"
-            android:layout_width="fill_parent"
-            android:layout_height="fill_parent" 
-            android:paddingTop="2dip"
-	        android:numColumns="auto_fit"
-    	    android:columnWidth="148dp"
-        	android:stretchMode="spacingWidthUniform"
-            android:drawSelectorOnTop="false" />
-
-</AbsoluteLayout>
-
+    android:paddingTop="2dip"
+    android:numColumns="auto_fit"
+    android:columnWidth="148dp"
+    android:stretchMode="spacingWidthUniform"
+    android:drawSelectorOnTop="false"
+    android:cacheColorHint="#000000"
+    android:background="#000000"/>
diff --git a/res/layout/video_camera.xml b/res/layout/video_camera.xml
index bd84d3d..652b354 100644
--- a/res/layout/video_camera.xml
+++ b/res/layout/video_camera.xml
@@ -107,6 +107,14 @@
 			android:orientation="horizontal">
 
 		<com.android.camera.ActionMenuButton
+			android:id="@+id/capture"
+			android:drawableTop="@drawable/ic_menu_capture"
+			android:layout_width="fill_parent"
+			android:layout_height="fill_parent"
+			android:text="@string/camera_capture"
+			style="@style/OnscreenActionIcon"
+		/>
+		<com.android.camera.ActionMenuButton
 			android:id="@+id/play"
 			android:drawableTop="@drawable/ic_menu_camera_play"
 			android:layout_width="wrap_content"
@@ -130,6 +138,22 @@
 			android:text="@string/camera_toss"
 			style="@style/OnscreenActionIcon"
 		/>
+		<com.android.camera.ActionMenuButton
+			android:id="@+id/accept"
+			android:drawableTop="@drawable/ic_menu_share"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:text="@string/camera_accept"
+			style="@style/OnscreenActionIcon"
+		/>
+		<com.android.camera.ActionMenuButton
+			android:id="@+id/cancel"
+			android:drawableTop="@drawable/ic_menu_delete"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:text="@string/camera_cancel"
+			style="@style/OnscreenActionIcon"
+		/>
 	</LinearLayout>
 </RelativeLayout>
 
diff --git a/res/layout/viewimage.xml b/res/layout/viewimage.xml
index de042f1..e27bd7c 100644
--- a/res/layout/viewimage.xml
+++ b/res/layout/viewimage.xml
@@ -76,6 +76,61 @@
 		</view>
 	</AbsoluteLayout>
 	
+    <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_width="wrap_content" 
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+        <com.android.camera.ActionMenuButton
+            android:id="@+id/capture"
+            android:drawableTop="@drawable/ic_menu_capture"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/camera_capture"
+            style="@style/OnscreenActionIcon"
+        />
+        <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"
+        />
+    </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-fr/arrays.xml b/res/values-fr/arrays.xml
new file mode 100644
index 0000000..e3513ac
--- /dev/null
+++ b/res/values-fr/arrays.xml
@@ -0,0 +1,8 @@
+<?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 pref_camera_videoquality_entries:0 (4155278146225809483) -->
+    <!-- no translation found for pref_camera_videoquality_entries:1 (2439895494739176281) -->
+    <!-- no translation found for pref_camera_videoquality_entryvalues:0 (4757859881176606698) -->
+    <!-- no translation found for pref_camera_videoquality_entryvalues:1 (8585619597157636291) -->
+</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
new file mode 100644
index 0000000..44665c0
--- /dev/null
+++ b/res/values-fr/strings.xml
@@ -0,0 +1,182 @@
+<?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">
+    <string name="all_images">"Toutes les images"</string>
+    <!-- no translation found for all_videos (3380966619230896013) -->
+    <skip />
+    <string name="camera_label">"Caméra"</string>
+    <!-- no translation found for gallery_picker_label (3080425245006492787) -->
+    <skip />
+    <!-- no translation found for gallery_camera_bucket_name (2924618424339240831) -->
+    <skip />
+    <!-- no translation found for gallery_camera_videos_bucket_name (3369151581398551623) -->
+    <skip />
+    <!-- no translation found for switch_to_video_lable (4525451949497982385) -->
+    <skip />
+    <!-- no translation found for switch_to_camera_lable (8248495141797448471) -->
+    <skip />
+    <string name="crop_label">"Rogner l\'image"</string>
+    <string name="view_label">"Afficher l\'image"</string>
+    <string name="preferences_label">"Paramètres de la caméra"</string>
+    <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>
+    <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>
+    <string name="flip_orientation">"Changer l\'orientation"</string>
+    <string name="settings">"Paramètres"</string>
+    <string name="view">"Afficher"</string>
+    <string name="details">"Détails"</string>
+    <string name="rotate">"Faire pivoter"</string>
+    <string name="rotate_left">"Faire pivoter à gauche"</string>
+    <string name="rotate_right">"Faire pivoter à droite"</string>
+    <string name="slide_show">"Diaporama"</string>
+    <!-- no translation found for capture_picture (4114265595549284643) -->
+    <skip />
+    <!-- no translation found for capture_video (4047046282358697155) -->
+    <skip />
+    <string name="crop_save_text">"Enregistrer"</string>
+    <string name="crop_discard_text">"Annuler"</string>
+    <string name="confirm_delete_title">"Supprimer"</string>
+    <string name="confirm_delete_message">"L\'image sera supprimée."</string>
+    <!-- no translation found for confirm_delete_video_message (5796154324948010221) -->
+    <skip />
+    <string name="camera_toss">"Supprimer"</string>
+    <string name="camera_share">"Partager"</string>
+    <string name="camera_set">"Définir en tant que"</string>
+    <!-- no translation found for camera_play (8248000517869959980) -->
+    <skip />
+    <string name="camera_crop">"Rogner"</string>
+    <string name="camera_tossing">"Suppression..."</string>
+    <string name="no_way_to_share_image">"Impossible de partager cette image."</string>
+    <string name="no_way_to_share_video">"Cette vidéo ne peut pas être partagée."</string>
+    <!-- no translation found for camera_gallery_photos_text (6558048736561932758) -->
+    <skip />
+    <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>
+    <!-- no translation found for pref_camera_general_settings_category (2135384248699549300) -->
+    <skip />
+    <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>
+    <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>
+    <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>
+    <item>"La plus récente en dernier"</item>
+  </string-array>
+    <string name="pref_gallery_slideshow_interval_title">"Intervalle du diaporama"</string>
+    <string name="pref_gallery_slideshow_interval_summary">"Sélectionner la durée d\'affichage de chaque diapositive dans le diaporama"</string>
+    <string name="pref_gallery_slideshow_interval_dialogtitle">"Intervalle du diaporama"</string>
+  <string-array name="pref_gallery_slideshow_interval_choices">
+    <item>"2 secondes"</item>
+    <item>"3 secondes"</item>
+    <item>"4 secondes"</item>
+  </string-array>
+    <string name="pref_gallery_slideshow_transition_title">"Transition du diaporama"</string>
+    <string name="pref_gallery_slideshow_transition_summary">"Sélectionner l\'effet utilisé lors de la transition d\'une diapositive à une autre"</string>
+    <string name="pref_gallery_slideshow_transition_dialogtitle">"Transition du diaporama"</string>
+  <string-array name="pref_gallery_slideshow_transition_choices">
+    <item>"Ouverture et fermeture en fondu"</item>
+    <item>"Glisser vers la gauche - la droite"</item>
+    <item>"Glisser vers le haut - le bas"</item>
+    <item>"Sélection aléatoire"</item>
+  </string-array>
+    <string name="pref_gallery_slideshow_repeat_title">"Rejouer le diaporama"</string>
+    <string name="pref_gallery_slideshow_repeat_summary">"Rejouer le diaporama plusieurs fois"</string>
+    <string name="pref_gallery_slideshow_shuffle_title">"Lecture aléatoire des diapositives"</string>
+    <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>
+    <!-- no translation found for pref_camera_videoquality_category (2682407964628441297) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_title (4127153321803677407) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_summary (882761255405402886) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_entry_0 (6300182041472826848) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_entry_1 (6742349839919099735) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_dialogtitle (9154437474111181737) -->
+    <skip />
+    <string name="camerasettings">"Paramètres"</string>
+    <string name="image_gallery_NoImageView_text">"Aucune image trouvée."</string>
+    <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>
+    <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>
+    <!-- no translation found for details_duration (1028116471387901402) -->
+    <skip />
+    <string name="details_date_taken">"Date de création :"</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">"Options de l\'image"</string>
+    <!-- no translation found for video_context_menu_header (7318971116949475029) -->
+    <skip />
+    <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>
+    <!-- no translation found for video_camera_button_hint (8134161307608750427) -->
+    <skip />
+    <!-- no translation found for photos_gallery_title (6914406246471015448) -->
+    <skip />
+    <string name="pick_photos_gallery_title">"Sélectionner l\'image"</string>
+    <!-- no translation found for videos_gallery_title (6150354029982749479) -->
+    <skip />
+    <!-- no translation found for pick_videos_gallery_title (326727095201227333) -->
+    <skip />
+    <string name="loading_progress_format_string">"<xliff:g id="COUNTER">%d</xliff:g> vignettes restantes"</string>
+    <string name="sendImage">"Partager l\'image via"</string>
+    <string name="setImage">"Définir l\'image en tant que"</string>
+    <string name="sendVideo">"Partager la vidéo via"</string>
+    <!-- no translation found for movieviewlabel (7363495772706775465) -->
+    <skip />
+    <!-- no translation found for loading_video (4013492720121891585) -->
+    <skip />
+    <!-- no translation found for picture_saved (2867013634030333968) -->
+    <skip />
+    <!-- no translation found for picture_deleted (6339411528782927441) -->
+    <skip />
+    <!-- no translation found for video_saved (6750750630389373504) -->
+    <skip />
+    <!-- no translation found for video_deleted (5799599433975142828) -->
+    <skip />
+    <!-- no translation found for spaceIsLow_title (2673833354017115190) -->
+    <skip />
+    <!-- no translation found for spaceIsLow_content (2848517537672543641) -->
+    <skip />
+</resources>
diff --git a/res/values-it/arrays.xml b/res/values-it/arrays.xml
new file mode 100644
index 0000000..e3513ac
--- /dev/null
+++ b/res/values-it/arrays.xml
@@ -0,0 +1,8 @@
+<?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 pref_camera_videoquality_entries:0 (4155278146225809483) -->
+    <!-- no translation found for pref_camera_videoquality_entries:1 (2439895494739176281) -->
+    <!-- no translation found for pref_camera_videoquality_entryvalues:0 (4757859881176606698) -->
+    <!-- no translation found for pref_camera_videoquality_entryvalues:1 (8585619597157636291) -->
+</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
new file mode 100644
index 0000000..69bdc82
--- /dev/null
+++ b/res/values-it/strings.xml
@@ -0,0 +1,182 @@
+<?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">
+    <string name="all_images">"Tutte le foto"</string>
+    <!-- no translation found for all_videos (3380966619230896013) -->
+    <skip />
+    <string name="camera_label">"Fotocamera"</string>
+    <!-- no translation found for gallery_picker_label (3080425245006492787) -->
+    <skip />
+    <!-- no translation found for gallery_camera_bucket_name (2924618424339240831) -->
+    <skip />
+    <!-- no translation found for gallery_camera_videos_bucket_name (3369151581398551623) -->
+    <skip />
+    <!-- no translation found for switch_to_video_lable (4525451949497982385) -->
+    <skip />
+    <!-- no translation found for switch_to_camera_lable (8248495141797448471) -->
+    <skip />
+    <string name="crop_label">"Ritaglia foto"</string>
+    <string name="view_label">"Visualizza foto"</string>
+    <string name="preferences_label">"Impostazioni fotocamera"</string>
+    <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>
+    <string name="wallpaper">"Impostazione sfondo, attendi..."</string>
+    <string name="savingImage">"Salvataggio foto..."</string>
+    <string name="runningFaceDetection">"Attendere..."</string>
+    <string name="flip_orientation">"Capovolgi orientamento"</string>
+    <string name="settings">"Impostazioni"</string>
+    <string name="view">"Visualizza"</string>
+    <string name="details">"Dettagli"</string>
+    <string name="rotate">"Ruota"</string>
+    <string name="rotate_left">"Ruota a sinistra"</string>
+    <string name="rotate_right">"Ruota a destra"</string>
+    <string name="slide_show">"Presentazione"</string>
+    <!-- no translation found for capture_picture (4114265595549284643) -->
+    <skip />
+    <!-- no translation found for capture_video (4047046282358697155) -->
+    <skip />
+    <string name="crop_save_text">"Salva"</string>
+    <string name="crop_discard_text">"Ignora"</string>
+    <string name="confirm_delete_title">"Elimina"</string>
+    <string name="confirm_delete_message">"La foto verrà eliminata."</string>
+    <!-- no translation found for confirm_delete_video_message (5796154324948010221) -->
+    <skip />
+    <string name="camera_toss">"Elimina"</string>
+    <string name="camera_share">"Condividi"</string>
+    <string name="camera_set">"Imposta come"</string>
+    <!-- no translation found for camera_play (8248000517869959980) -->
+    <skip />
+    <string name="camera_crop">"Ritaglia"</string>
+    <string name="camera_tossing">"Eliminazione..."</string>
+    <string name="no_way_to_share_image">"Impossibile condividere la foto."</string>
+    <string name="no_way_to_share_video">"Impossibile condividere il video."</string>
+    <!-- no translation found for camera_gallery_photos_text (6558048736561932758) -->
+    <skip />
+    <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>
+    <!-- no translation found for pref_camera_general_settings_category (2135384248699549300) -->
+    <skip />
+    <string name="pref_gallery_size_title">"Dimensioni foto"</string>
+    <string name="pref_gallery_size_summary">"Seleziona dimensioni di visualizz. delle foto"</string>
+    <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>
+    <string name="pref_gallery_sort_dialogtitle">"Ordine foto"</string>
+  <string-array name="pref_gallery_sort_choices">
+    <item>"Da più recente"</item>
+    <item>"Da meno recente"</item>
+  </string-array>
+    <string name="pref_gallery_slideshow_interval_title">"Intervallo presentazione"</string>
+    <string name="pref_gallery_slideshow_interval_summary">"Seleziona la durata di ogni diapositiva"</string>
+    <string name="pref_gallery_slideshow_interval_dialogtitle">"Intervallo presentazione"</string>
+  <string-array name="pref_gallery_slideshow_interval_choices">
+    <item>"2 secondi"</item>
+    <item>"3 secondi"</item>
+    <item>"4 secondi"</item>
+  </string-array>
+    <string name="pref_gallery_slideshow_transition_title">"Transizione presentazione"</string>
+    <string name="pref_gallery_slideshow_transition_summary">"Seleziona l\'effetto da usare per passare da una diapositiva all\'altra"</string>
+    <string name="pref_gallery_slideshow_transition_dialogtitle">"Transizione presentazione"</string>
+  <string-array name="pref_gallery_slideshow_transition_choices">
+    <item>"Dissolvenza"</item>
+    <item>"Da sinistra a destra"</item>
+    <item>"Dall\'alto verso il basso"</item>
+    <item>"Selezione casuale"</item>
+  </string-array>
+    <string name="pref_gallery_slideshow_repeat_title">"Ripeti presentazione"</string>
+    <string name="pref_gallery_slideshow_repeat_summary">"Riproduci più volte la presentazione"</string>
+    <string name="pref_gallery_slideshow_shuffle_title">"Riproduzione casuale"</string>
+    <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>
+    <!-- no translation found for pref_camera_videoquality_category (2682407964628441297) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_title (4127153321803677407) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_summary (882761255405402886) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_entry_0 (6300182041472826848) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_entry_1 (6742349839919099735) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_dialogtitle (9154437474111181737) -->
+    <skip />
+    <string name="camerasettings">"Impostazioni"</string>
+    <string name="image_gallery_NoImageView_text">"Nessuna foto trovata."</string>
+    <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>
+    <string name="details_panel_title">"Dettagli"</string>
+    <string name="details_file_size">"Dim. file:"</string>
+    <string name="details_image_resolution">"Risoluzione:"</string>
+    <!-- no translation found for details_duration (1028116471387901402) -->
+    <skip />
+    <string name="details_date_taken">"Data scatto:"</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">"Opzioni foto"</string>
+    <!-- no translation found for video_context_menu_header (7318971116949475029) -->
+    <skip />
+    <string name="multiface_crop_help">"Tocca un viso per iniziare."</string>
+    <string name="camera_button_hint">"Premi Scatta per scattare la foto."</string>
+    <!-- no translation found for video_camera_button_hint (8134161307608750427) -->
+    <skip />
+    <!-- no translation found for photos_gallery_title (6914406246471015448) -->
+    <skip />
+    <string name="pick_photos_gallery_title">"Seleziona foto"</string>
+    <!-- no translation found for videos_gallery_title (6150354029982749479) -->
+    <skip />
+    <!-- no translation found for pick_videos_gallery_title (326727095201227333) -->
+    <skip />
+    <string name="loading_progress_format_string">"<xliff:g id="COUNTER">%d</xliff:g> rimanenti"</string>
+    <string name="sendImage">"Condividi foto via"</string>
+    <string name="setImage">"Imposta foto come"</string>
+    <string name="sendVideo">"Condividi video via"</string>
+    <!-- no translation found for movieviewlabel (7363495772706775465) -->
+    <skip />
+    <!-- no translation found for loading_video (4013492720121891585) -->
+    <skip />
+    <!-- no translation found for picture_saved (2867013634030333968) -->
+    <skip />
+    <!-- no translation found for picture_deleted (6339411528782927441) -->
+    <skip />
+    <!-- no translation found for video_saved (6750750630389373504) -->
+    <skip />
+    <!-- no translation found for video_deleted (5799599433975142828) -->
+    <skip />
+    <!-- no translation found for spaceIsLow_title (2673833354017115190) -->
+    <skip />
+    <!-- no translation found for spaceIsLow_content (2848517537672543641) -->
+    <skip />
+</resources>
diff --git a/res/values-zh-rCN/arrays.xml b/res/values-zh-rCN/arrays.xml
new file mode 100644
index 0000000..e3513ac
--- /dev/null
+++ b/res/values-zh-rCN/arrays.xml
@@ -0,0 +1,8 @@
+<?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 pref_camera_videoquality_entries:0 (4155278146225809483) -->
+    <!-- no translation found for pref_camera_videoquality_entries:1 (2439895494739176281) -->
+    <!-- no translation found for pref_camera_videoquality_entryvalues:0 (4757859881176606698) -->
+    <!-- no translation found for pref_camera_videoquality_entryvalues:1 (8585619597157636291) -->
+</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..ad72b20
--- /dev/null
+++ b/res/values-zh-rCN/strings.xml
@@ -0,0 +1,182 @@
+<?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">
+    <string name="all_images">"所有图片"</string>
+    <!-- no translation found for all_videos (3380966619230896013) -->
+    <skip />
+    <string name="camera_label">"相机"</string>
+    <!-- no translation found for gallery_picker_label (3080425245006492787) -->
+    <skip />
+    <!-- no translation found for gallery_camera_bucket_name (2924618424339240831) -->
+    <skip />
+    <!-- no translation found for gallery_camera_videos_bucket_name (3369151581398551623) -->
+    <skip />
+    <!-- no translation found for switch_to_video_lable (4525451949497982385) -->
+    <skip />
+    <!-- no translation found for switch_to_camera_lable (8248495141797448471) -->
+    <skip />
+    <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>
+    <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>
+    <!-- no translation found for capture_picture (4114265595549284643) -->
+    <skip />
+    <!-- no translation found for capture_video (4047046282358697155) -->
+    <skip />
+    <string name="crop_save_text">"保存"</string>
+    <string name="crop_discard_text">"放弃"</string>
+    <string name="confirm_delete_title">"删除"</string>
+    <string name="confirm_delete_message">"会删除该图片。"</string>
+    <!-- no translation found for confirm_delete_video_message (5796154324948010221) -->
+    <skip />
+    <string name="camera_toss">"删除"</string>
+    <string name="camera_share">"共享"</string>
+    <string name="camera_set">"设置为"</string>
+    <!-- no translation found for camera_play (8248000517869959980) -->
+    <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>
+    <!-- no translation found for camera_gallery_photos_text (6558048736561932758) -->
+    <skip />
+    <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>
+    <!-- no translation found for pref_camera_general_settings_category (2135384248699549300) -->
+    <skip />
+    <string name="pref_gallery_size_title">"图片大小"</string>
+    <string name="pref_gallery_size_summary">"选择图片的显示大小"</string>
+    <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>
+    <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_postpicturemenu_title">"在拍摄后提示"</string>
+    <string name="pref_camera_postpicturemenu_summary">"在拍摄后显示操作菜单(保存、删除等等)"</string>
+    <!-- no translation found for pref_camera_videoquality_category (2682407964628441297) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_title (4127153321803677407) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_summary (882761255405402886) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_entry_0 (6300182041472826848) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_entry_1 (6742349839919099735) -->
+    <skip />
+    <!-- no translation found for pref_camera_videoquality_dialogtitle (9154437474111181737) -->
+    <skip />
+    <string name="camerasettings">"设置"</string>
+    <string name="image_gallery_NoImageView_text">"未找到图片。"</string>
+    <string name="pref_gallery_confirm_delete_title">"确认删除"</string>
+    <string name="pref_gallery_confirm_delete_summary">"在删除图片之前显示确认"</string>
+    <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>
+    <!-- no translation found for video_context_menu_header (7318971116949475029) -->
+    <skip />
+    <string name="multiface_crop_help">"轻击一张脸开始裁切。"</string>
+    <string name="camera_button_hint">"按“拍摄”按钮获得该图片。"</string>
+    <!-- no translation found for video_camera_button_hint (8134161307608750427) -->
+    <skip />
+    <!-- no translation found for photos_gallery_title (6914406246471015448) -->
+    <skip />
+    <string name="pick_photos_gallery_title">"选择图片"</string>
+    <!-- no translation found for videos_gallery_title (6150354029982749479) -->
+    <skip />
+    <!-- no translation found for pick_videos_gallery_title (326727095201227333) -->
+    <skip />
+    <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>
+    <!-- no translation found for movieviewlabel (7363495772706775465) -->
+    <skip />
+    <!-- no translation found for loading_video (4013492720121891585) -->
+    <skip />
+    <!-- no translation found for picture_saved (2867013634030333968) -->
+    <skip />
+    <!-- no translation found for picture_deleted (6339411528782927441) -->
+    <skip />
+    <!-- no translation found for video_saved (6750750630389373504) -->
+    <skip />
+    <!-- no translation found for video_deleted (5799599433975142828) -->
+    <skip />
+    <!-- no translation found for spaceIsLow_title (2673833354017115190) -->
+    <skip />
+    <!-- no translation found for spaceIsLow_content (2848517537672543641) -->
+    <skip />
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d465c52..55e1d51 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -118,6 +118,12 @@
     <!-- button indicating that the picture just taken should be deleted -->
     <string name="camera_toss">Delete</string>
 
+    <!-- Lable for the button that takes the user to the camera pictures Gallery -->
+    <string name="camera_gallery">Gallery</string>
+    
+    <!-- Label for the button that takes the user back to still-image capture mode -->
+    <string name="camera_capture">Capture</string>
+    
     <!-- button indicating that the picture just taken should be shared by email, mms, etc -->
     <string name="camera_share">Share</string>
 
@@ -127,6 +133,12 @@
     <!-- button indicating that the video just taken should be played -->
     <string name="camera_play">Play</string>
     
+    <!-- button indicating that the video just taken should be accepted -->
+    <string name="camera_accept">Accept</string>
+
+    <!-- button indicating that the video recording session should be canceled -->
+    <string name="camera_cancel">Cancel</string>
+    
     <!-- button indicating that the picture just taken should be cropped -->
     <string name="camera_crop">Crop</string>
 
@@ -299,23 +311,20 @@
     <!-- Do not translate -->
     <string name="pref_camera_upload_albumname_dialogtitle">Picasa album name</string>
 
-    <!-- Settings screen, setting title text -->
+    <!-- [No longer used.] Settings screen, setting title text -->
     <string name="pref_camera_postpicturemenu_title">Prompt after capture</string>
 
-    <!-- Settings screen, setting summary text -->
+    <!-- [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>
     
     <!-- Default video quality setting. A numerical value. Do not translate. -->
-    <string name="pref_camera_videoquality_default">0</string>
+    <string name="pref_camera_videoquality_default">1</string>
     
-    <!-- Settings screen, Video quality title -->
-    <string name="pref_camera_videoquality_title">Video quality</string>
-    
-    <!-- Settings screen, Video quality summary -->
-    <string name="pref_camera_videoquality_summary">Select video quality level</string>
+    <!-- Settings screen, Select Video quality title -->
+    <string name="pref_camera_videoquality_title">Select video quality</string>
     
     <!-- Settings screen, Video quality dialog radio button choices -->
     <string name="pref_camera_videoquality_entry_0">Low (for MMS messages)</string>
@@ -367,7 +376,32 @@
     <!-- Label in message of Details dialog  -->
     <string name="details_image_resolution">Resolution:</string>
     <!-- Label in message of Details dialog  -->
+    <string name="details_duration">Duration:</string>
+    <!-- Label in message of Details dialog  -->
     <string name="details_date_taken">Date taken:</string>
+    <!-- Label in message of Details dialog  -->
+    <string name="details_frame_rate">Frame rate:</string>
+    <!-- Label in message of Details dialog  -->
+    <string name="details_bit_rate">Bit rate:</string>
+    <!-- Label in message of Details dialog  -->
+    <string name="details_codec">Codec:</string>
+    <!-- Label in message of Details dialog  -->
+    <string name="details_format">Format:</string>
+    
+    <!-- Used to format image dimensions in Details dialog. e.g. 64 x 64 -->
+    <string name="details_dimension_x">%1$d x %2$d</string>
+    <!-- Used to format short video duration in Details dialog. minutes:seconds e.g. 00:30 -->
+    <string name="details_ms">%1$02d:%2$02d</string>
+    <!-- Used to format video duration in Details dialog. hours:minutes:seconds e.g. 0:21:30 -->
+    <string name="details_hms">%1$d:%2$02d:%3$02d</string>
+    <!-- Unit of measure in the Details dialog frames per second. e.g. 20 fps -->
+    <string name="details_fps">%1$d fps</string>
+    <!-- Unit of measure in the Details dialog K bits per second. e.g. 192 Kbps -->
+    <string name="details_kbps">%1$d Kbps</string>
+    <!-- Unit of measure in the Details dialog M bits per second. e.g. 2.3 Mbps -->
+    <string name="details_mbps">%1$g Mbps</string>
+    <!-- Details dialog "OK" button. Dismisses dialog. -->
+    <string name="details_ok">OK</string>
     
     <!-- Text of context menu when an image is selected -->
     <string name="context_menu_header">Picture options</string>
diff --git a/res/xml/camera_preferences.xml b/res/xml/camera_preferences.xml
index 77c01b3..4d8b7b7 100644
--- a/res/xml/camera_preferences.xml
+++ b/res/xml/camera_preferences.xml
@@ -20,43 +20,21 @@
 
     <PreferenceCategory
       android:title="@string/pref_camera_general_settings_category">
-<!--            
-        <CheckBoxPreference
-                android:key="pref_camera_autoupload_key"
-                android:title="@string/pref_camera_autoupload_title"
-                android:summary="@string/pref_camera_autoupload_summary"
-                android:defaultValue="false"/>
-        <EditTextPreference
-                android:key="pref_camera_upload_albumname_key"
-                android:title="@string/pref_camera_upload_albumname_title"
-                android:summary="@string/pref_camera_upload_albumname_summary"
-                android:dialogTitle="@string/pref_camera_upload_albumname_dialogtitle"
-                android:singleLine="true" />
-        <CheckBoxPreference
-                android:key="pref_camera_shuttersound_key"
-                android:title="@string/pref_camera_shuttersound_title"
-                android:summary="@string/pref_camera_shuttersound_summary"
-                android:defaultValue="true"/>
--->
+
         <CheckBoxPreference
                 android:key="pref_camera_recordlocation_key"
                 android:title="@string/pref_camera_recordlocation_title"
                 android:summary="@string/pref_camera_recordlocation_summary"
                 android:defaultValue="false"/>
-        <CheckBoxPreference
-                android:key="pref_camera_postpicturemenu_key"
-                android:title="@string/pref_camera_postpicturemenu_title"
-                android:summary="@string/pref_camera_postpicturemenu_summary"
-                android:defaultValue="true"/>
     </PreferenceCategory>
     
     <PreferenceCategory
       android:title="@string/pref_camera_videoquality_category">
+        <!-- android:summary is filled in by CameraSettings -->
         <ListPreference
                 android:key="pref_camera_videoquality_key"
                 android:defaultValue="@string/pref_camera_videoquality_default"
                 android:title="@string/pref_camera_videoquality_title"
-                android:summary="@string/pref_camera_videoquality_summary"
                 android:entries="@array/pref_camera_videoquality_entries"
                 android:entryValues="@array/pref_camera_videoquality_entryvalues"
                 android:dialogTitle="@string/pref_camera_videoquality_dialogtitle" />
diff --git a/src/com/android/camera/Camera.java b/src/com/android/camera/Camera.java
index b79e7d1..993e15c 100644
--- a/src/com/android/camera/Camera.java
+++ b/src/com/android/camera/Camera.java
@@ -25,19 +25,22 @@
 
 import android.app.Activity;
 import android.app.ProgressDialog;
-import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
+import android.content.pm.ActivityInfo;
 import android.content.res.AssetFileDescriptor;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Matrix;
+import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
 import android.hardware.Camera.PictureCallback;
 import android.hardware.Camera.Size;
 import android.location.Location;
@@ -65,17 +68,18 @@
 import android.view.MenuItem;
 import android.view.OrientationListener;
 import android.view.SurfaceHolder;
-import android.view.SurfaceView;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.Window;
 import android.view.WindowManager;
 import android.view.MenuItem.OnMenuItemClickListener;
+import android.view.ViewGroup.LayoutParams;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 import android.widget.ImageView;
 import android.widget.Toast;
 
+import com.android.camera.ImageManager.IImageList;
+
 public class Camera extends Activity implements View.OnClickListener, SurfaceHolder.Callback {
 
     private static final String TAG = "camera";
@@ -88,7 +92,6 @@
     private static final int CLEAR_SCREEN_DELAY = 4;
 
     private static final int SCREEN_DELAY = 2 * 60 * 1000;
-    private static final int POST_PICTURE_ALERT_TIMEOUT = 6 * 1000;
     private static final int FOCUS_BEEP_VOLUME = 100;
 
     private static final int NO_STORAGE_ERROR = -1;
@@ -105,8 +108,6 @@
     public static final int MENU_GALLERY_VIDEOS = 8;
     public static final int MENU_SAVE_SELECT_PHOTOS = 30;
     public static final int MENU_SAVE_NEW_PHOTO = 31;
-    public static final int MENU_SAVE_SELECTVIDEO = 32;
-    public static final int MENU_SAVE_TAKE_NEW_VIDEO = 33;
     public static final int MENU_SAVE_GALLERY_PHOTO = 34;
     public static final int MENU_SAVE_GALLERY_VIDEO_PHOTO = 35;
     public static final int MENU_SAVE_CAMERA_DONE = 36;
@@ -154,7 +155,8 @@
 
     boolean mMenuSelectionMade;
 
-    View mPostPictureAlert;
+    ImageView mLastPictureButton;
+    Uri mLastPictureUri;
     LocationManager mLocationManager = null;
 
     private Animation mFocusBlinkAnimation;
@@ -216,7 +218,6 @@
                         // TODO remove polling
                         mHandler.sendEmptyMessageDelayed(RESTART_PREVIEW, 100);
                     } else if (mStatus == SNAPSHOT_COMPLETED){
-                        hidePostPictureAlert();
                         mCaptureObject.dismissFreezeFrame(true);
                     }
                     break;
@@ -316,9 +317,6 @@
                 Log.v(TAG, "got RawPictureCallback...");
             mRawPictureCallbackTime = System.currentTimeMillis();
             mBlackout.setVisibility(View.INVISIBLE);
-            if (!isPickIntent() && mPreferences.getBoolean("pref_camera_postpicturemenu_key", true)) {
-                showPostPictureAlert();
-            }
         }
     };
 
@@ -337,23 +335,10 @@
 
             mStatus = SNAPSHOT_COMPLETED;
 
-            if (!mPreferences.getBoolean("pref_camera_postpicturemenu_key", true)) {
-                if (mKeepAndRestartPreview) {
-                    long delay = 1500 - (System.currentTimeMillis() - mRawPictureCallbackTime);
-                    mHandler.sendEmptyMessageDelayed(RESTART_PREVIEW, Math.max(delay, 0));
-                }
-                return;
-            }
-
             if (mKeepAndRestartPreview) {
-                mKeepAndRestartPreview = false;
-                mPostPictureAlert.setVisibility(View.INVISIBLE);
-
-                // Post this message so that we can finish processing the request. This also
-                // prevents the preview from showing up before mPostPictureAlert is dismissed.
-                mHandler.sendEmptyMessage(RESTART_PREVIEW);
+                long delay = 1500 - (System.currentTimeMillis() - mRawPictureCallbackTime);
+                mHandler.sendEmptyMessageDelayed(RESTART_PREVIEW, Math.max(delay, 0));
             }
-
         }
     };
 
@@ -489,6 +474,8 @@
             if (!captureOnly) {
                 storeImage(data, loc);
                 sendBroadcast(new Intent("com.android.camera.NEW_PICTURE", mLastContentUri));
+                setLastPictureThumb(data);
+                dismissFreezeFrame(true);
             } else {
                 BitmapFactory.Options options = new BitmapFactory.Options();
                 options.inSampleSize = 4;
@@ -517,6 +504,46 @@
             }
         }
 
+        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.
@@ -619,7 +646,6 @@
             if (mStatus == SNAPSHOT_IN_PROGRESS || mStatus == SNAPSHOT_COMPLETED) {
                 mKeepAndRestartPreview = true;
                 mHandler.sendEmptyMessage(RESTART_PREVIEW);
-                mPostPictureAlert.setVisibility(View.INVISIBLE);
                 return;
             }
 
@@ -633,7 +659,7 @@
 
             mStatus = SNAPSHOT_IN_PROGRESS;
 
-            mKeepAndRestartPreview = !mPreferences.getBoolean("pref_camera_postpicturemenu_key", true);
+            mKeepAndRestartPreview = true;
 
             boolean getContentAction = isPickIntent();
             if (getContentAction) {
@@ -712,17 +738,9 @@
         mBlackout = (ImageView) findViewById(R.id.blackout);
         mBlackout.setBackgroundDrawable(new ColorDrawable(0xFF000000));
 
-        mPostPictureAlert = findViewById(R.id.post_picture_panel);
-        View b;
-
-        b = findViewById(R.id.discard);
-        b.setOnClickListener(this);
-
-        b = findViewById(R.id.share);
-        b.setOnClickListener(this);
-
-        b = findViewById(R.id.setas);
-        b.setOnClickListener(this);
+        mLastPictureButton = (ImageView) findViewById(R.id.last_picture_button);
+        mLastPictureButton.setOnClickListener(this);
+        mLastPictureButton.setVisibility(View.INVISIBLE);
 
         try {
             mClickSound = new MediaPlayer();
@@ -796,59 +814,9 @@
 
     public void onClick(View v) {
         switch (v.getId()) {
-        /*
-            case R.id.save: {
-                mPostPictureAlert.setVisibility(View.GONE);
-                postAfterKeep(null);
-                break;
-            }
-         */
 
-            case R.id.discard: {
-                if (mCaptureObject != null) {
-                    mCaptureObject.cancelSave();
-                    Uri uri = mCaptureObject.getLastCaptureUri();
-                    if (uri != null) {
-                        mContentResolver.delete(uri, null, null);
-                    }
-                    mCaptureObject.dismissFreezeFrame(true);
-                }
-                mPostPictureAlert.setVisibility(View.GONE);
-                break;
-            }
-
-            case R.id.share: {
-                mPostPictureAlert.setVisibility(View.GONE);
-                postAfterKeep(new Runnable() {
-                    public void run() {
-                        Uri u = mCaptureObject.getLastCaptureUri();
-                        Intent intent = new Intent();
-                        intent.setAction(Intent.ACTION_SEND);
-                        intent.setType("image/jpeg");
-                        intent.putExtra(Intent.EXTRA_STREAM, u);
-                        try {
-                            startActivity(Intent.createChooser(intent, getText(R.string.sendImage)));
-                        } catch (android.content.ActivityNotFoundException ex) {
-                            Toast.makeText(Camera.this, R.string.no_way_to_share_image, Toast.LENGTH_SHORT).show();
-                        }
-                    }
-                });
-                break;
-            }
-
-            case R.id.setas: {
-                mPostPictureAlert.setVisibility(View.GONE);
-                postAfterKeep(new Runnable() {
-                    public void run() {
-                        Uri u = mCaptureObject.getLastCaptureUri();
-                        Intent intent = new Intent(Intent.ACTION_ATTACH_DATA, u);
-                        try {
-                            startActivity(Intent.createChooser(intent, getText(R.string.setImage)));
-                        } catch (android.content.ActivityNotFoundException ex) {
-                            Toast.makeText(Camera.this, R.string.no_way_to_share_video, Toast.LENGTH_SHORT).show();
-                        }
-                    }
-                });
+            case R.id.last_picture_button: {
+                viewLastImage();
                 break;
             }
         }
@@ -903,6 +871,16 @@
         }
 
         mBlackout.setVisibility(View.INVISIBLE);
+
+        if (mLastPictureUri != null) {
+            IImageList list = ImageManager.makeImageList(mLastPictureUri, this,
+                    ImageManager.SORT_ASCENDING);
+            if (list.getImageForUri(mLastPictureUri) == null) {
+                mLastPictureUri = null;
+                mLastPictureButton.setVisibility(View.INVISIBLE);
+            }
+            list.deactivate();
+        }
     }
 
     private ImageManager.DataLocation dataLocation() {
@@ -921,7 +899,6 @@
     @Override
     protected void onPause() {
         keep();
-        mPostPictureAlert.setVisibility(View.INVISIBLE);
 
         mPausing = true;
         mOrientationListener.disable();
@@ -1012,11 +989,6 @@
         switch (keyCode) {
             case KeyEvent.KEYCODE_BACK:
                 if (mStatus == SNAPSHOT_IN_PROGRESS || mStatus == SNAPSHOT_COMPLETED) {
-                    if (mPostPictureAlert.getVisibility() == View.VISIBLE) {
-                        keep();
-                        mPostPictureAlert.setVisibility(View.INVISIBLE);
-                        restartPreview();
-                    }
                     // ignore backs while we're taking a picture
                     return true;
                 }
@@ -1058,9 +1030,6 @@
                     }
                 }
                 return true;
-            case KeyEvent.KEYCODE_MENU:
-                mPostPictureAlert.setVisibility(View.INVISIBLE);
-                break;
         }
 
         return super.onKeyDown(keyCode, event);
@@ -1260,12 +1229,30 @@
     }
 
     void gotoGallery() {
-        Uri target = Images.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.gotoCameraImageGallery(this);
+    }
+
+    private void viewLastImage() {
+        Uri targetUri = mLastPictureUri;
+        if (targetUri != null) {
+            Uri thisUri = Images.Media.INTERNAL_CONTENT_URI;
+            if (thisUri != null) {
+                String bucket = thisUri.getQueryParameter("bucketId");
+                if (bucket != null) {
+                    targetUri = targetUri.buildUpon().appendQueryParameter("bucketId", bucket).build();
+                }
+            }
+            Intent intent = new Intent(Intent.ACTION_VIEW, targetUri);
+            intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION,
+                    ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+            intent.putExtra(MediaStore.EXTRA_FULL_SCREEN, true);
+            intent.putExtra(MediaStore.EXTRA_SHOW_ACTION_ICONS, true);
+
+            try {
+                startActivity(intent);
+            } catch (android.content.ActivityNotFoundException ex) {
+                // ignore.
+            }
         }
     }
 
@@ -1523,12 +1510,6 @@
                     return true;
                 }
             });
-            menu.add(MenuHelper.VIDEO_SAVING_ITEM, MENU_SAVE_TAKE_NEW_VIDEO, 0, R.string.camera_takenewvideo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
-                public boolean onMenuItemClick(MenuItem item) {
-                    toss();
-                    return true;
-                }
-            });
         } else {
             addBaseMenuItems(menu);
             MenuHelper.addImageMenuItems(
@@ -1642,16 +1623,6 @@
         item.setIcon(android.R.drawable.ic_menu_preferences);
     }
 
-    private void showPostPictureAlert() {
-        mPostPictureAlert.setVisibility(View.VISIBLE);
-        mHandler.sendEmptyMessageDelayed(RESTART_PREVIEW, POST_PICTURE_ALERT_TIMEOUT);
-    }
-
-    private void hidePostPictureAlert() {
-        cancelRestartPreviewTimeout();
-        mPostPictureAlert.setVisibility(View.INVISIBLE);
-    }
-
     private void cancelRestartPreviewTimeout() {
         mHandler.removeMessages(RESTART_PREVIEW);
     }
diff --git a/src/com/android/camera/CameraSettings.java b/src/com/android/camera/CameraSettings.java
index 0c0f31b..0145d64 100644
--- a/src/com/android/camera/CameraSettings.java
+++ b/src/com/android/camera/CameraSettings.java
@@ -16,28 +16,77 @@
 
 package com.android.camera;
 
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.os.Bundle;
+import android.preference.ListPreference;
 import android.preference.PreferenceActivity;
 
 /**
  *  CameraSettings
  */
 public class CameraSettings extends PreferenceActivity
+    implements OnSharedPreferenceChangeListener
 {
+    public static final String KEY_VIDEO_QUALITY = "pref_camera_videoquality_key";
+    public static final boolean DEFAULT_VIDEO_QUALITY_VALUE = true;
+
+    private ListPreference mVideoQuality;
+
     public CameraSettings()
     {
     }
 
-    protected int resourceId() {
-        return R.xml.camera_preferences;
-    }
-
     /** Called with the activity is first created. */
     @Override
     public void onCreate(Bundle icicle)
     {
         super.onCreate(icicle);
-        addPreferencesFromResource(resourceId());
+        addPreferencesFromResource(R.xml.camera_preferences);
+
+        initUI();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        updateVideoQuality();
+    }
+
+    private void initUI() {
+        mVideoQuality = (ListPreference) findPreference(KEY_VIDEO_QUALITY);
+        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+    }
+
+    private void updateVideoQuality() {
+        boolean vidQualityValue = getBooleanPreference(mVideoQuality, DEFAULT_VIDEO_QUALITY_VALUE);
+        int vidQualityIndex = vidQualityValue ? 1 : 0;
+        String[] vidQualities =
+            getResources().getStringArray(R.array.pref_camera_videoquality_entries);
+        String vidQuality = vidQualities[vidQualityIndex];
+        mVideoQuality.setSummary(vidQuality);
+    }
+
+    private static int getIntPreference(ListPreference preference, int defaultValue) {
+        String s = preference.getValue();
+        int result = defaultValue;
+        try {
+            result = Integer.parseInt(s);
+        } catch (NumberFormatException e) {
+            // Ignore, result is already the default value.
+        }
+        return result;
+    }
+
+    private boolean getBooleanPreference(ListPreference preference, boolean defaultValue) {
+        return getIntPreference(preference, defaultValue ? 1 : 0) != 0;
+    }
+
+    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
+            String key) {
+           if (key.equals(KEY_VIDEO_QUALITY)) {
+               updateVideoQuality();
+           }
 
     }
 }
diff --git a/src/com/android/camera/GalleryPicker.java b/src/com/android/camera/GalleryPicker.java
index da946a0..df9049f 100644
--- a/src/com/android/camera/GalleryPicker.java
+++ b/src/com/android/camera/GalleryPicker.java
@@ -315,6 +315,9 @@
             String cameraBucketId = null;
             for (Map.Entry<String, String> entry: hashMap.entrySet()) {
                 String key = entry.getKey();
+                if (key == null) {
+                    continue;
+                }
                 if (key.equals(cameraItem)) {
                     cameraBucketId = key;
                 } else {
@@ -651,9 +654,7 @@
 
     @Override
     public boolean onPrepareOptionsMenu(android.view.Menu menu) {
-        int keyboard = getResources().getConfiguration().keyboardHidden;
-        mFlipItem.setEnabled(keyboard == android.content.res.Configuration.KEYBOARDHIDDEN_YES);
-
+        MenuHelper.setFlipOrientationEnabled(this, mFlipItem);
         return true;
     }
 
diff --git a/src/com/android/camera/GalleryPickerItem.java b/src/com/android/camera/GalleryPickerItem.java
index 3fc9678..c3b5df1 100644
--- a/src/com/android/camera/GalleryPickerItem.java
+++ b/src/com/android/camera/GalleryPickerItem.java
@@ -41,6 +41,7 @@
         super(context, attrs, defStyle);
         
         mFrame = getResources().getDrawable(R.drawable.frame_gallery_preview);
+        mFrame.setCallback(this);
     }
     
     @Override
diff --git a/src/com/android/camera/GallerySettings.java b/src/com/android/camera/GallerySettings.java
index 8cbeba2..14cff3a 100644
--- a/src/com/android/camera/GallerySettings.java
+++ b/src/com/android/camera/GallerySettings.java
@@ -16,31 +16,24 @@
 
 package com.android.camera;
 
-import android.content.SharedPreferences;
 import android.os.Bundle;
-import android.preference.Preference;
 import android.preference.PreferenceActivity;
-import android.content.Context;
 
 /**
  *  GallerySettings
  */
-public class GallerySettings extends CameraSettings
+public class GallerySettings extends PreferenceActivity
 {
     public GallerySettings()
     {
     }
-    
-    @Override
-    protected int resourceId() {
-        return R.xml.gallery_preferences;
-    }
-    
+
     /** Called with the activity is first created. */
     @Override
     public void onCreate(Bundle icicle)
     {
         super.onCreate(icicle);
+        addPreferencesFromResource(R.xml.gallery_preferences);
     }
 }
 
diff --git a/src/com/android/camera/ImageGallery2.java b/src/com/android/camera/ImageGallery2.java
index 44d297b..92e9c57 100644
--- a/src/com/android/camera/ImageGallery2.java
+++ b/src/com/android/camera/ImageGallery2.java
@@ -113,14 +113,15 @@
                     if (mSelectedImageGetter.getCurrentImage() == null)
                         return;
 
-                    menu.add(0, 0, 0, R.string.view).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
-                        public boolean onMenuItemClick(MenuItem item) {
-                            mGvs.onSelect(mGvs.mCurrentSelection);
-                            return true;
-                        }
-                    });
-
                     boolean isImage = ImageManager.isImage(mSelectedImageGetter.getCurrentImage());
+                    if (isImage) {
+                        menu.add(0, 0, 0, R.string.view).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
+                            public boolean onMenuItemClick(MenuItem item) {
+                                mGvs.onSelect(mGvs.mCurrentSelection);
+                                return true;
+                            }
+                        });
+                    }
 
                     menu.setHeaderTitle(isImage ? R.string.context_menu_header
                             : R.string.video_context_menu_header);
@@ -138,6 +139,7 @@
 
                                         mGvs.clearCache();
                                         mGvs.invalidate();
+                                        mGvs.requestLayout();
                                         mGvs.start();
                                         mNoImagesView.setVisibility(mAllImages.getCount() > 0 ? View.GONE : View.VISIBLE);
                                     }
@@ -187,8 +189,9 @@
             mGvs.clearCache();
             mAllImages.removeImage(mSelectedImageGetter.getCurrentImage());
             mGvs.invalidate();
+            mGvs.requestLayout();
             mGvs.start();
-            mNoImagesView.setVisibility(mAllImages.getCount() > 0 ? View.GONE : View.VISIBLE);
+            mNoImagesView.setVisibility(mAllImages.isEmpty() ? View.VISIBLE : View.GONE);
         }
     };
 
@@ -217,6 +220,7 @@
 
     private Runnable mLongPressCallback = new Runnable() {
         public void run() {
+            mGvs.select(-2, false);
             mGvs.showContextMenu();
         }
     };
@@ -224,6 +228,7 @@
     @Override
     public boolean onKeyUp(int keyCode, KeyEvent event) {
         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
+            mGvs.select(-2, false);
             // The keyUp doesn't get called when the longpress menu comes up. We only get here when the user
             // lets go of the center key before the longpress menu comes up.
             mHandler.removeCallbacks(mLongPressCallback);
@@ -243,6 +248,7 @@
         int sel = mGvs.mCurrentSelection;
         int columns = mGvs.mCurrentSpec.mColumns;
         int count = mAllImages.getCount();
+        boolean pressed = false;
         if (mGvs.mShowSelection) {
             switch (keyCode) {
                 case KeyEvent.KEYCODE_DPAD_RIGHT:
@@ -266,6 +272,7 @@
                     }
                     break;
                 case KeyEvent.KEYCODE_DPAD_CENTER:
+                    pressed = true;
                     mHandler.postDelayed(mLongPressCallback, ViewConfiguration.getLongPressTimeout());
                     break;
                 case KeyEvent.KEYCODE_DEL:
@@ -300,7 +307,7 @@
         }
         }
         if (handled) {
-            mGvs.select(sel);
+            mGvs.select(sel, pressed);
             return true;
         }
         else
@@ -368,13 +375,15 @@
         super.onPause();
         mPausing = true;
         stopCheckingThumbnails();
-        mAllImages.deactivate();
         mGvs.onPause();
 
         if (mReceiver != null) {
             unregisterReceiver(mReceiver);
             mReceiver = null;
         }
+        // Now that we've paused the threads that are using the cursor it is safe
+        // to deactivate it.
+        mAllImages.deactivate();
     }
 
     private void rebake(boolean unmounted, boolean scanning) {
@@ -567,8 +576,8 @@
         if ((mInclusion & ImageManager.INCLUDE_IMAGES) != 0) {
             mSlideShowItem = addSlideShowMenu(menu, 5);
 
-            mFlipItem = MenuHelper.addFlipOrientation(menu, this, mPrefs);
         }
+        mFlipItem = MenuHelper.addFlipOrientation(menu, this, mPrefs);
 
         item = menu.add(0, 0, 1000, R.string.camerasettings);
         item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@@ -588,14 +597,11 @@
     @Override
     public boolean onPrepareOptionsMenu(android.view.Menu menu) {
         if ((mInclusion & ImageManager.INCLUDE_IMAGES) != 0) {
-            boolean imageSelected = isImageSelected();
             boolean videoSelected = isVideoSelected();
-            int keyboard = getResources().getConfiguration().keyboardHidden;
-            mFlipItem.setEnabled(imageSelected
-                    && (keyboard == android.content.res.Configuration.KEYBOARDHIDDEN_YES));
             // TODO: Only enable slide show if there is at least one image in the folder.
             mSlideShowItem.setEnabled(!videoSelected);
         }
+        MenuHelper.setFlipOrientationEnabled(this, mFlipItem);
 
         return true;
     }
@@ -685,6 +691,7 @@
         private LayoutSpec mCurrentSpec;
         private boolean mShowSelection = false;
         private int mCurrentSelection = -1;
+        private boolean mCurrentSelectionPressed;
 
         private boolean mDirectionBiasDown = true;
         private final static boolean sDump = false;
@@ -748,9 +755,9 @@
 
                     int pos = computeSelectedIndex(e);
                     if (pos >= 0 && pos < mGallery.mAllImages.getCount()) {
-                        select(pos);
+                        select(pos, true);
                     } else {
-                        select(-1);
+                        select(-1, false);
                     }
                     if (mImageBlockManager != null)
                         mImageBlockManager.repaintSelection(mCurrentSelection);
@@ -766,7 +773,7 @@
                     else if (velocityY < -maxVelocity)
                         velocityY = -maxVelocity;
 
-                    select(-1);
+                    select(-1, false);
                     if (mFling) {
                         mScroller = new Scroller(getContext());
                         mScroller.fling(0, mScrollY, 0, -(int)velocityY, 0, 0, 0, mMaxScrollY);
@@ -782,7 +789,7 @@
 
                 @Override
                 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
-                    select(-1);
+                    select(-1, false);
                     scrollBy(0, (int)distanceY);
                     invalidate();
                     return true;
@@ -795,6 +802,7 @@
 
                 @Override
                 public boolean onSingleTapUp(MotionEvent e) {
+                    select(mCurrentSelection, false);
                     int index = computeSelectedIndex(e);
                     if (index >= 0 && index < mGallery.mAllImages.getCount()) {
                         onSelect(index);
@@ -834,13 +842,22 @@
             invalidate();
         }
 
-        public void select(int newSel) {
+        /**
+         *
+         * @param newSel -2 means use old selection, -1 means remove selection
+         * @param newPressed
+         */
+        public void select(int newSel, boolean newPressed) {
+            if (newSel == -2) {
+                newSel = mCurrentSelection;
+            }
             int oldSel = mCurrentSelection;
-            if (oldSel == newSel)
+            if ((oldSel == newSel) && (mCurrentSelectionPressed == newPressed))
                 return;
 
             mShowSelection = (newSel != -1);
             mCurrentSelection = newSel;
+            mCurrentSelectionPressed = newPressed;
             if (mImageBlockManager != null) {
                 mImageBlockManager.repaintSelection(oldSel);
                 mImageBlockManager.repaintSelection(newSel);
@@ -1527,11 +1544,16 @@
                 }
 
                 private void paintSel(int pos, int xPos, int yPos) {
+                    int[] stateSet = EMPTY_STATE_SET;
                     if (pos == mCurrentSelection && mShowSelection) {
-                        mCellOutline.setState(ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET);
-                    } else {
-                        mCellOutline.setState(EMPTY_STATE_SET);
+                        if (mCurrentSelectionPressed) {
+                            stateSet = PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
+                        } else {
+                            stateSet = ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
+                        }
                     }
+
+                    mCellOutline.setState(stateSet);
                     mCanvas.setBitmap(mBitmap);
                     mCellOutline.setBounds(xPos, yPos, xPos+mCurrentSpec.mCellWidth, yPos+mCurrentSpec.mCellHeight);
                     mCellOutline.draw(mCanvas);
diff --git a/src/com/android/camera/ImageManager.java b/src/com/android/camera/ImageManager.java
index 1fe93b5..4ceedb8 100755
--- a/src/com/android/camera/ImageManager.java
+++ b/src/com/android/camera/ImageManager.java
@@ -62,8 +62,17 @@
  *
  */
 public class ImageManager {
-    public static final String CAMERA_IMAGE_BUCKET_NAME = "/sdcard/dcim/camera";
-    public static final String CAMERA_IMAGE_BUCKET_ID = String.valueOf(CAMERA_IMAGE_BUCKET_NAME.hashCode());
+    public static final String CAMERA_IMAGE_BUCKET_NAME =
+        Environment.getExternalStorageDirectory().toString() + "/dcim/Camera";
+    public static final String CAMERA_IMAGE_BUCKET_ID = getBucketId(CAMERA_IMAGE_BUCKET_NAME);
+
+    /**
+     * Matches code in MediaProvider.computeBucketValues. Should be a common function.
+     */
+
+    public static String getBucketId(String path) {
+        return String.valueOf(path.toLowerCase().hashCode());
+    }
 
     // To enable verbose logging for this class, change false to true. The other logic ensures that
     // this logging can be disabled by turned off DEBUG and lower, and that it can be enabled by
@@ -1431,7 +1440,7 @@
                     requery();
                 }
             }
-            return false;
+            return true;
         }
 
 
@@ -1716,6 +1725,11 @@
          */
         public abstract IImage getImageForUri(Uri uri);;
 
+        /**
+         *
+         * @param image
+         * @return true if the image was removed.
+         */
         public abstract boolean removeImage(IImage image);
         /**
          * Removes the image at the ith position.
@@ -2252,6 +2266,7 @@
         protected int indexDisplayName() {  return -1;                     }
         protected int indexThumbId()     {  return INDEX_THUMB_ID;        }
 
+        @Override
         protected IImage make(long id, long miniThumbId, ContentResolver cr, IImageList list, long timestamp, int index, int rotation) {
             return new Image(id, miniThumbId, mContentResolver, this, index, rotation);
         }
@@ -2627,12 +2642,20 @@
         }
 
         public boolean removeImage(IImage image) {
+            IImageList parent = image.getContainer();
             int pos = -1;
+            int baseIndex = 0;
             while (++pos < mSubList.length) {
                 IImageList sub = mSubList[pos];
-                if (sub.removeImage(image)) {
-                    return true;
+                if (sub == parent) {
+                    if (sub.removeImage(image)) {
+                        modifySkipCountForDeletedImage(baseIndex);
+                        return true;
+                    } else {
+                        break;
+                    }
                 }
+                baseIndex += sub.getCount();
             }
             return false;
         }
@@ -3303,8 +3326,9 @@
         protected int indexDisplayName() {  return -1;                    }
         protected int indexThumbId()     {  return INDEX_THUMB_ID;        }
 
+        @Override
         protected IImage make(long id, long miniThumbId, ContentResolver cr, IImageList list,
-                long timestamp, int index) {
+                long timestamp, int index, int rotation) {
             return new VideoObject(id, miniThumbId, mContentResolver, this, timestamp, index);
         }
 
@@ -3572,24 +3596,13 @@
         return sInstance;
     }
 
+
     static public byte [] miniThumbData(Bitmap source) {
         if (source == null)
             return null;
 
-        float scale;
-        if (source.getWidth() < source.getHeight()) {
-            scale = MINI_THUMB_TARGET_SIZE / (float)source.getWidth();
-        } else {
-            scale = MINI_THUMB_TARGET_SIZE / (float)source.getHeight();
-        }
-        Matrix matrix = new Matrix();
-        matrix.setScale(scale, scale);
-        Bitmap miniThumbnail = ImageLoader.transform(matrix, source,
-                MINI_THUMB_TARGET_SIZE, MINI_THUMB_TARGET_SIZE, false);
-
-        if (miniThumbnail != source) {
-            source.recycle();
-        }
+        Bitmap miniThumbnail = extractMiniThumb(source, MINI_THUMB_TARGET_SIZE,
+                MINI_THUMB_TARGET_SIZE);
         java.io.ByteArrayOutputStream miniOutStream = new java.io.ByteArrayOutputStream();
         miniThumbnail.compress(Bitmap.CompressFormat.JPEG, 75, miniOutStream);
         miniThumbnail.recycle();
@@ -3604,6 +3617,33 @@
         return null;
     }
 
+    /**
+     * Creates a centered bitmap of the desired size. Recycles the input.
+     * @param source
+     * @return
+     */
+    static public Bitmap extractMiniThumb(Bitmap source, int width, int height) {
+        if (source == null) {
+            return null;
+        }
+
+        float scale;
+        if (source.getWidth() < source.getHeight()) {
+            scale = width / (float)source.getWidth();
+        } else {
+            scale = height / (float)source.getHeight();
+        }
+        Matrix matrix = new Matrix();
+        matrix.setScale(scale, scale);
+        Bitmap miniThumbnail = ImageLoader.transform(matrix, source,
+                width, height, false);
+
+        if (miniThumbnail != source) {
+            source.recycle();
+        }
+        return miniThumbnail;
+    }
+
     static Bitmap rotate(Bitmap b, int degrees) {
         if (degrees != 0 && b != null) {
             Matrix m = new Matrix();
diff --git a/src/com/android/camera/MenuHelper.java b/src/com/android/camera/MenuHelper.java
index 9e4fb82..f8e1658 100644
--- a/src/com/android/camera/MenuHelper.java
+++ b/src/com/android/camera/MenuHelper.java
@@ -19,11 +19,15 @@
 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.media.MediaMetadataRetriever;
 import android.net.Uri;
 import android.os.Handler;
 import android.provider.MediaStore;
+import android.provider.MediaStore.Images;
 import android.util.Config;
 import android.util.Log;
 import android.view.Menu;
@@ -266,18 +270,107 @@
 
                             } finally {
                             }
-                            ((TextView)d.findViewById(R.id.details_attrname_1)).setText(R.string.details_file_size);
-                            ((TextView)d.findViewById(R.id.details_attrvalu_1)).setText(lengthString);
+                            ((TextView)d.findViewById(R.id.details_file_size_value))
+                                .setText(lengthString);
 
+                            int dimensionWidth = 0;
+                            int dimensionHeight = 0;
                             if (isImage) {
-                                String dimensionsString = String.valueOf(image.getWidth() + " X " + image.getHeight());
-                                ((TextView)d.findViewById(R.id.details_attrname_2)).setText(R.string.details_image_resolution);
-                                ((TextView)d.findViewById(R.id.details_attrvalu_2)).setText(dimensionsString);
+                                dimensionWidth = image.getWidth();
+                                dimensionHeight = image.getHeight();
+                                d.findViewById(R.id.details_duration_row).setVisibility(View.GONE);
+                                d.findViewById(R.id.details_frame_rate_row).setVisibility(View.GONE);
+                                d.findViewById(R.id.details_bit_rate_row).setVisibility(View.GONE);
+                                d.findViewById(R.id.details_format_row).setVisibility(View.GONE);
+                                d.findViewById(R.id.details_codec_row).setVisibility(View.GONE);
                             } else {
-                                d.findViewById(R.id.details_attrname_2).setVisibility(View.GONE);
-                                d.findViewById(R.id.details_attrvalu_2).setVisibility(View.GONE);
+                                MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+                                retriever.setMode(MediaMetadataRetriever.MODE_GET_METADATA_ONLY);
+                                retriever.setDataSource(image.getDataPath());
+                                try {
+                                    dimensionWidth = Integer.parseInt(
+                                            retriever.extractMetadata(
+                                            MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
+                                    dimensionHeight = Integer.parseInt(
+                                            retriever.extractMetadata(
+                                            MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
+                                } catch (NumberFormatException e) {
+                                    dimensionWidth = 0;
+                                    dimensionHeight = 0;
+                                }
+
+                                try {
+                                    long durationMs = Long.parseLong(retriever.extractMetadata(
+                                            MediaMetadataRetriever.METADATA_KEY_DURATION));
+                                    long duration = durationMs / 1000;
+                                    long h = duration / 3600;
+                                    long m = (duration - h * 3600) / 60;
+                                    long s = duration - (h * 3600 + m * 60);
+                                    String durationValue;
+                                    if (h == 0) {
+                                        durationValue = String.format(
+                                                activity.getString(R.string.details_ms), m, s);
+                                    } else {
+                                        durationValue = String.format(
+                                                activity.getString(R.string.details_hms), h, m, s);
+                                    }
+                                    ((TextView)d.findViewById(R.id.details_duration_value))
+                                        .setText(durationValue);
+                                } catch (NumberFormatException e) {
+                                    d.findViewById(R.id.details_frame_rate_row)
+                                    .setVisibility(View.GONE);
+                                }
+
+                                try {
+                                    String frame_rate = String.format(
+                                            activity.getString(R.string.details_fps),
+                                            Integer.parseInt(
+                                                    retriever.extractMetadata(
+                                                            MediaMetadataRetriever.METADATA_KEY_FRAME_RATE)));
+                                    ((TextView)d.findViewById(R.id.details_frame_rate_value))
+                                        .setText(frame_rate);
+                                } catch (NumberFormatException e) {
+                                    d.findViewById(R.id.details_frame_rate_row)
+                                    .setVisibility(View.GONE);
+                                }
+
+                                try {
+                                    long bitRate = Long.parseLong(retriever.extractMetadata(
+                                            MediaMetadataRetriever.METADATA_KEY_BIT_RATE));
+                                    String bps;
+                                    if (bitRate < 1000000) {
+                                        bps = String.format(
+                                                activity.getString(R.string.details_kbps),
+                                                bitRate / 1000);
+                                    } else {
+                                        bps = String.format(
+                                                activity.getString(R.string.details_mbps),
+                                                ((double) bitRate) / 1000000.0);
+                                    }
+                                    ((TextView)d.findViewById(R.id.details_bit_rate_value))
+                                            .setText(bps);
+                                } catch (NumberFormatException e) {
+                                    d.findViewById(R.id.details_bit_rate_row)
+                                            .setVisibility(View.GONE);
+                                }
+
+                                String format = retriever.extractMetadata(
+                                        MediaMetadataRetriever.METADATA_KEY_VIDEO_FORMAT);
+                                ((TextView)d.findViewById(R.id.details_format_value))
+                                    .setText(format);
+
+                                String codec = retriever.extractMetadata(
+                                            MediaMetadataRetriever.METADATA_KEY_CODEC);
+                                ((TextView)d.findViewById(R.id.details_codec_value))
+                                    .setText(codec);
                             }
 
+                            String dimensionsString = String.format(
+                                    activity.getString(R.string.details_dimension_x),
+                                    dimensionWidth, dimensionHeight);
+                            ((TextView)d.findViewById(R.id.details_resolution_value))
+                                .setText(dimensionsString);
+
                             String dateString = "";
                             long dateTaken = image.getDateTaken();
                             if (dateTaken != 0) {
@@ -285,12 +378,19 @@
                                 java.text.SimpleDateFormat dateFormat = new java.text.SimpleDateFormat();
                                 dateString = dateFormat.format(date);
 
-                                ((TextView)d.findViewById(R.id.details_attrname_3)).setText(R.string.details_date_taken);
-                                ((TextView)d.findViewById(R.id.details_attrvalu_3)).setText(dateString);
+                                ((TextView)d.findViewById(R.id.details_date_taken_value))
+                                    .setText(dateString);
                             } else {
-                                d.findViewById(R.id.details_daterow).setVisibility(View.GONE);
+                                d.findViewById(R.id.details_date_taken_row)
+                                    .setVisibility(View.GONE);
                             }
 
+                            builder.setNeutralButton(R.string.details_ok,
+                                    new DialogInterface.OnClickListener() {
+                                    public void onClick(DialogInterface dialog, int which) {
+                                        dialog.dismiss();
+                                    }
+                                });
 
                             builder.setIcon(android.R.drawable.ic_dialog_info)
                                 .setTitle(R.string.details_panel_title)
@@ -356,7 +456,9 @@
     }
 
     static void deleteImage(Activity activity, Runnable onDelete, IImage image) {
-        deleteImageImpl(activity, onDelete, ImageManager.isImage(image));
+        if (image != null) {
+            deleteImageImpl(activity, onDelete, ImageManager.isImage(image));
+        }
     }
 
     private static void deleteImageImpl(Activity activity, final Runnable onDelete, boolean isPhoto) {
@@ -365,33 +467,38 @@
             if (onDelete != null)
                 onDelete.run();
         } else {
-            android.app.AlertDialog.Builder b = new android.app.AlertDialog.Builder(activity);
-            b.setIcon(android.R.drawable.ic_dialog_alert);
-            b.setTitle(R.string.confirm_delete_title);
-            b.setMessage(isPhoto? R.string.confirm_delete_message
-                    : R.string.confirm_delete_video_message);
-            b.setPositiveButton(android.R.string.ok, new android.content.DialogInterface.OnClickListener() {
-                public void onClick(android.content.DialogInterface v, int x) {
-                    if (onDelete != null)
-                        onDelete.run();
-                }
-            });
-            b.setNegativeButton(android.R.string.cancel, new android.content.DialogInterface.OnClickListener() {
-                public void onClick(android.content.DialogInterface v, int x) {
-
-                }
-            });
-            b.create().show();
+            displayDeleteDialog(activity, onDelete, isPhoto);
         }
     }
 
+    public static void displayDeleteDialog(Activity activity,
+            final Runnable onDelete, boolean isPhoto) {
+        android.app.AlertDialog.Builder b = new android.app.AlertDialog.Builder(activity);
+        b.setIcon(android.R.drawable.ic_dialog_alert);
+        b.setTitle(R.string.confirm_delete_title);
+        b.setMessage(isPhoto? R.string.confirm_delete_message
+                : R.string.confirm_delete_video_message);
+        b.setPositiveButton(android.R.string.ok, new android.content.DialogInterface.OnClickListener() {
+            public void onClick(android.content.DialogInterface v, int x) {
+                if (onDelete != null)
+                    onDelete.run();
+            }
+        });
+        b.setNegativeButton(android.R.string.cancel, new android.content.DialogInterface.OnClickListener() {
+            public void onClick(android.content.DialogInterface v, int x) {
+
+            }
+        });
+        b.create().show();
+    }
+
     static void addSwitchModeMenuItem(Menu menu, final Activity activity,
             final boolean switchToVideo) {
         int group = switchToVideo ? MenuHelper.IMAGE_MODE_ITEM : MenuHelper.VIDEO_MODE_ITEM;
         int labelId = switchToVideo ? R.string.switch_to_video_lable
                 : R.string.switch_to_camera_lable;
         int iconId = switchToVideo ? R.drawable.ic_menu_camera_video_view
-                : R.drawable.ic_menu_camera;
+                : android.R.drawable.ic_menu_camera;
         MenuItem item = menu.add(group, MENU_SWITCH_CAMERA_MODE, 0,
                 labelId).setOnMenuItemClickListener(
                         new OnMenuItemClickListener() {
@@ -408,6 +515,26 @@
         item.setIcon(iconId);
     }
 
+    static void gotoStillImageCapture(Activity activity) {
+        Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
+        try {
+            activity.startActivity(intent);
+        } catch (ActivityNotFoundException e) {
+            Log.e(TAG, "Could not start still image capture activity", e);
+        }
+    }
+
+    static void gotoCameraImageGallery(Activity activity) {
+        Uri target = Images.Media.INTERNAL_CONTENT_URI.buildUpon().appendQueryParameter("bucketId",
+                ImageManager.CAMERA_IMAGE_BUCKET_ID).build();
+        Intent intent = new Intent(Intent.ACTION_VIEW, target);
+        try {
+            activity.startActivity(intent);
+        } catch (ActivityNotFoundException e) {
+            Log.e(TAG, "Could not start gallery activity", e);
+        }
+    }
+
     static void addCaptureMenuItems(Menu menu, final Activity activity) {
 
         menu.add(0, MENU_CAPTURE_PICTURE, 1, R.string.capture_picture)
@@ -423,7 +550,7 @@
                 return true;
             }
         })
-        .setIcon(R.drawable.ic_menu_camera);
+        .setIcon(android.R.drawable.ic_menu_camera);
 
         menu.add(0, MENU_CAPTURE_VIDEO, 2, R.string.capture_video)
             .setOnMenuItemClickListener(
@@ -473,5 +600,10 @@
                         ? android.content.pm.ActivityInfo.SCREEN_ORIENTATION_USER
                         : req);
     }
+
+    static void setFlipOrientationEnabled(Activity activity, MenuItem flipItem) {
+        int keyboard = activity.getResources().getConfiguration().hardKeyboardHidden;
+        flipItem.setEnabled(keyboard != android.content.res.Configuration.HARDKEYBOARDHIDDEN_NO);
+    }
 }
 
diff --git a/src/com/android/camera/VideoCamera.java b/src/com/android/camera/VideoCamera.java
index 7fcab9a..9da1f49 100644
--- a/src/com/android/camera/VideoCamera.java
+++ b/src/com/android/camera/VideoCamera.java
@@ -17,11 +17,11 @@
 package com.android.camera;
 
 import java.io.File;
-import java.util.ArrayList;
 import java.io.IOException;
+import java.util.ArrayList;
 
 import android.app.Activity;
-import android.app.ProgressDialog;
+import android.app.AlertDialog;
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
@@ -30,7 +30,6 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
-import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.drawable.ColorDrawable;
 import android.location.LocationManager;
@@ -44,16 +43,14 @@
 import android.os.StatFs;
 import android.os.SystemClock;
 import android.preference.PreferenceManager;
-import android.provider.MediaStore.Images;
+import android.provider.MediaStore;
 import android.provider.MediaStore.Video;
 import android.text.format.DateFormat;
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
-import android.view.MotionEvent;
 import android.view.SurfaceHolder;
-import android.view.SurfaceView;
 import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
@@ -62,40 +59,32 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 import android.widget.Toast;
-import android.widget.RelativeLayout.LayoutParams;
 
 public class VideoCamera extends Activity implements View.OnClickListener, SurfaceHolder.Callback {
 
     private static final String TAG = "videocamera";
 
     private static final boolean DEBUG = true;
-    private static final boolean DEBUG_SUPPRESS_AUDIO_RECORDING = DEBUG && true;
+    private static final boolean DEBUG_SUPPRESS_AUDIO_RECORDING = DEBUG && false;
     private static final boolean DEBUG_DO_NOT_REUSE_MEDIA_RECORDER = DEBUG && true;
 
     private static final int KEEP = 2;
     private static final int CLEAR_SCREEN_DELAY = 4;
     private static final int UPDATE_RECORD_TIME = 5;
-    private static final int RESTART_PREVIEW = 6;
 
     private static final int SCREEN_DELAY = 2 * 60 * 1000;
-    private static final int POST_PICTURE_ALERT_TIMEOUT = 6 * 1000;
 
-    private static final int NO_STORAGE_ERROR = -1;
-    private static final int CANNOT_STAT_ERROR = -2;
+    private static final long NO_STORAGE_ERROR = -1L;
+    private static final long CANNOT_STAT_ERROR = -2L;
+    private static final long LOW_STORAGE_THRESHOLD = 512L * 1024L;
 
-    public static final int MENU_SWITCH_TO_VIDEO = 0;
-    public static final int MENU_SWITCH_TO_CAMERA = 1;
     public static final int MENU_SETTINGS = 6;
     public static final int MENU_GALLERY_PHOTOS = 7;
     public static final int MENU_GALLERY_VIDEOS = 8;
-    public static final int MENU_SAVE_SELECT_PHOTOS = 30;
-    public static final int MENU_SAVE_NEW_PHOTO = 31;
-    public static final int MENU_SAVE_SELECTVIDEO = 32;
-    public static final int MENU_SAVE_TAKE_NEW_VIDEO = 33;
     public static final int MENU_SAVE_GALLERY_PHOTO = 34;
-    public static final int MENU_SAVE_GALLERY_VIDEO_PHOTO = 35;
-    public static final int MENU_SAVE_CAMERA_DONE = 36;
-    public static final int MENU_SAVE_CAMERA_VIDEO_DONE = 37;
+    public static final int MENU_SAVE_PLAY_VIDEO = 35;
+    public static final int MENU_SAVE_SELECT_VIDEO = 36;
+    public static final int MENU_SAVE_NEW_VIDEO = 37;
 
     Toast mToast;
     SharedPreferences mPreferences;
@@ -109,9 +98,12 @@
 
     private MediaRecorder mMediaRecorder;
     private boolean mMediaRecorderRecording = false;
+    private boolean mNeedToDeletePartialRecording;
+    private boolean mNeedToRegisterRecording;
     private long mRecordingStartTime;
     private String mCurrentVideoFilename;
     private Uri mCurrentVideoUri;
+    private ContentValues mCurrentVideoValues;
 
     boolean mPausing = false;
 
@@ -129,8 +121,6 @@
     View mPostPictureAlert;
     LocationManager mLocationManager = null;
 
-    private int mPicturesRemaining;
-
     private Handler mHandler = new MainHandler();
 
     private void cancelSavingNotification() {
@@ -177,15 +167,17 @@
                         }
                         String text = minutesString + ":" + secondsString;
                         mRecordingTimeView.setText(text);
+                        // Work around a limitation of the T-Mobile G1: The T-Mobile
+                        // hardware blitter can't pixel-accurately scale and clip at the same time,
+                        // and the SurfaceFlinger doesn't attempt to work around this limitation.
+                        // In order to avoid visual corruption we must manually refresh the entire
+                        // surface view when changing any overlapping view's contents.
+                        mVideoPreview.invalidate();
                         mHandler.sendEmptyMessageDelayed(UPDATE_RECORD_TIME, 1000);
                     }
                     break;
                 }
 
-                case RESTART_PREVIEW:
-                    hideVideoFrameAndStartPreview();
-                    break;
-
                 default:
                     Log.v(TAG, "Unhandled message: " + msg.what);
                   break;
@@ -254,16 +246,12 @@
         mBlackout.setBackgroundDrawable(new ColorDrawable(0xFF000000));
 
         mPostPictureAlert = findViewById(R.id.post_picture_panel);
-        View b;
 
-        b = findViewById(R.id.play);
-        b.setOnClickListener(this);
-
-        b = findViewById(R.id.share);
-        b.setOnClickListener(this);
-
-        b = findViewById(R.id.discard);
-        b.setOnClickListener(this);
+        int[] ids = new int[]{R.id.play, R.id.share, R.id.discard,
+                R.id.capture, R.id.cancel, R.id.accept};
+        for (int id : ids) {
+            findViewById(id).setOnClickListener(this);
+        }
 
         mModeIndicatorView = (ImageView) findViewById(R.id.mode_indicator);
         mRecordingIndicatorView = (ImageView) findViewById(R.id.recording_indicator);
@@ -281,7 +269,7 @@
 
         Thread t = new Thread(new Runnable() {
             public void run() {
-                final boolean storageOK = calculatePicturesRemaining() > 0;
+                final boolean storageOK = getAvailableStorage() >= LOW_STORAGE_THRESHOLD;
                 if (hintView == null)
                     return;
 
@@ -315,12 +303,20 @@
 
     public void onClick(View v) {
         switch (v.getId()) {
-            case R.id.discard: {
-                File f = new File(mCurrentVideoFilename);
-                f.delete();
-                mContentResolver.delete(mCurrentVideoUri, null, null);
+            case R.id.capture:
+                doDiscardCurrentVideo();
+                break;
 
-                hideVideoFrameAndStartPreview();
+            case R.id.accept:
+                doReturnToPicker(true);
+                break;
+
+            case R.id.cancel:
+                doReturnToPicker(false);
+                break;
+
+            case R.id.discard: {
+                doDiscardCurrentVideo();
                 break;
             }
 
@@ -339,29 +335,35 @@
             }
 
             case R.id.play: {
-                Intent intent = new Intent(Intent.ACTION_VIEW, mCurrentVideoUri);
-                try {
-                    startActivity(intent);
-                } catch (android.content.ActivityNotFoundException ex) {
-                    Log.e(TAG, "Couldn't view video " + mCurrentVideoUri, ex);
-                }
+                doPlayCurrentVideo();
                 break;
             }
         }
     }
 
+    private void doPlayCurrentVideo() {
+        Intent intent = new Intent(Intent.ACTION_VIEW, mCurrentVideoUri);
+        try {
+            startActivity(intent);
+        } catch (android.content.ActivityNotFoundException ex) {
+            Log.e(TAG, "Couldn't view video " + mCurrentVideoUri, ex);
+        }
+    }
+
+    private void doDiscardCurrentVideo() {
+        deleteCurrentVideo();
+        hideVideoFrameAndStartPreview();
+    }
+
     private void showStorageToast() {
-        String noStorageText = null;
-        int remaining = calculatePicturesRemaining();
+        long remaining = getAvailableStorage();
 
         if (remaining == NO_STORAGE_ERROR) {
-            noStorageText = getString(R.string.no_storage);
-        } else if (remaining < 1) {
-            noStorageText = getString(R.string.not_enough_space);
-        }
-
-        if (noStorageText != null) {
-            Toast.makeText(this, noStorageText, 5000).show();
+            Toast.makeText(this, getString(R.string.no_storage), Toast.LENGTH_LONG).show();
+        } else if (remaining < LOW_STORAGE_THRESHOLD) {
+            new AlertDialog.Builder(this).setTitle(R.string.spaceIsLow_title)
+                .setMessage(R.string.spaceIsLow_content)
+                .show();
         }
     }
 
@@ -456,12 +458,6 @@
         return super.onKeyDown(keyCode, event);
     }
 
-    @Override
-    public boolean onTrackballEvent(MotionEvent event) {
-        cancelRestartPreviewTimeout();
-        return super.onTrackballEvent(event);
-    }
-
     public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
         stopVideoRecording();
         initializeVideo();
@@ -511,7 +507,6 @@
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
-
         addBaseMenuItems(menu);
         MenuHelper.addImageMenuItems(
                 menu,
@@ -545,26 +540,47 @@
             }
         });
         gallery.setIcon(android.R.drawable.ic_menu_gallery);
+
         return true;
     }
 
-    private int calculatePicturesRemaining() {
+    private boolean isPickIntent() {
+        String action = getIntent().getAction();
+        return (Intent.ACTION_PICK.equals(action) || MediaStore.ACTION_VIDEO_CAPTURE.equals(action));
+    }
+
+    private void doReturnToPicker(boolean success) {
+        Intent resultIntent = new Intent();
+        int resultCode;
+        if (success) {
+            resultCode = RESULT_OK;
+            resultIntent.setData(mCurrentVideoUri);
+        } else {
+            resultCode = RESULT_CANCELED;
+        }
+        setResult(resultCode, resultIntent);
+        finish();
+    }
+
+    /**
+     * Returns
+     * @return number of bytes available, or an ERROR code.
+     */
+    private static long getAvailableStorage() {
         try {
             if (!ImageManager.hasStorage()) {
-                mPicturesRemaining = NO_STORAGE_ERROR;
+                return NO_STORAGE_ERROR;
             } else {
                 String storageDirectory = Environment.getExternalStorageDirectory().toString();
                 StatFs stat = new StatFs(storageDirectory);
-                float remaining = ((float)stat.getAvailableBlocks() * (float)stat.getBlockSize()) / 400000F;
-                mPicturesRemaining = (int)remaining;
+                return ((long)stat.getAvailableBlocks() * (long)stat.getBlockSize());
             }
         } catch (Exception ex) {
             // if we can't stat the filesystem then we don't know how many
-            // pictures are remaining.  it might be zero but just leave it
+            // free bytes exist.  It might be zero but just leave it
             // blank since we really don't know.
-            mPicturesRemaining = CANNOT_STAT_ERROR;
+            return CANNOT_STAT_ERROR;
         }
-        return mPicturesRemaining;
     }
 
     private void initializeVideo() {
@@ -577,6 +593,8 @@
         }
 
         mMediaRecorder = new MediaRecorder();
+        mNeedToDeletePartialRecording = true;
+        mNeedToRegisterRecording = false;
 
         if (DEBUG_SUPPRESS_AUDIO_RECORDING) {
             Log.v(TAG, "DEBUG_SUPPRESS_AUDIO_RECORDING is true.");
@@ -588,17 +606,26 @@
         Log.v(TAG, "before setOutputFile");
         createVideoPath();
         mMediaRecorder.setOutputFile(mCurrentVideoFilename);
-        Boolean videoQualityLow = getIntPreference("pref_camera_videoquality_key") == 0;
+        boolean videoQualityHigh = getBooleanPreference(CameraSettings.KEY_VIDEO_QUALITY,
+                CameraSettings.DEFAULT_VIDEO_QUALITY_VALUE);
+
+        {
+            Intent intent = getIntent();
+            if (intent.hasExtra(MediaStore.EXTRA_VIDEO_QUALITY)) {
+                int extraVideoQuality = intent.getIntExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
+                videoQualityHigh = (extraVideoQuality > 0);
+            }
+        }
 
         // Use the same frame rate for both, since internally
         // if the frame rate is too large, it can cause camera to become
         // unstable. We need to fix the MediaRecorder to disable the support
         // of setting frame rate for now.
         mMediaRecorder.setVideoFrameRate(20);
-        if (videoQualityLow) {
-            mMediaRecorder.setVideoSize(176,144);
-        } else {
+        if (videoQualityHigh) {
             mMediaRecorder.setVideoSize(352,288);
+        } else {
+            mMediaRecorder.setVideoSize(176,144);
         }
         mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
         if (!DEBUG_SUPPRESS_AUDIO_RECORDING) {
@@ -641,17 +668,29 @@
         }
     }
 
-    private int getIntPreference(String key) {
-        String s = mPreferences.getString(key, "0");
-        return Integer.parseInt(s);
+    private int getIntPreference(String key, int defaultValue) {
+        String s = mPreferences.getString(key, "");
+        int result = defaultValue;
+        try {
+            result = Integer.parseInt(s);
+        } catch (NumberFormatException e) {
+            // Ignore, result is already the default value.
+        }
+        return result;
+    }
+
+    private boolean getBooleanPreference(String key, boolean defaultValue) {
+        return getIntPreference(key, defaultValue ? 1 : 0) != 0;
     }
 
     private void createVideoPath() {
         long dateTaken = System.currentTimeMillis();
         String title = createName(dateTaken);
         String displayName = title + ".3gp"; // Used when emailing.
-        String filename = ImageManager.CAMERA_IMAGE_BUCKET_NAME + "/"
-            + Long.toString(dateTaken) + ".3gp";
+        String cameraDirPath = ImageManager.CAMERA_IMAGE_BUCKET_NAME;
+        File cameraDir = new File(cameraDirPath);
+        cameraDir.mkdirs();
+        String filename = cameraDirPath + "/" + Long.toString(dateTaken) + ".3gp";
         ContentValues values = new ContentValues(7);
         values.put(Video.Media.TITLE, title);
         values.put(Video.Media.DISPLAY_NAME, displayName);
@@ -659,10 +698,31 @@
         values.put(Video.Media.DATE_TAKEN, dateTaken);
         values.put(Video.Media.MIME_TYPE, "video/3gpp");
         values.put(Video.Media.DATA, filename);
-        Uri videoTable = Uri.parse("content://media/external/video/media");
-        Uri item = mContentResolver.insert(videoTable, values);
         mCurrentVideoFilename = filename;
-        mCurrentVideoUri = item;
+        mCurrentVideoValues = values;
+        mCurrentVideoUri = null;
+    }
+
+    private void registerVideo() {
+        Uri videoTable = Uri.parse("content://media/external/video/media");
+        mCurrentVideoUri = mContentResolver.insert(videoTable,
+                mCurrentVideoValues);
+        mCurrentVideoValues = null;
+    }
+
+    private void deleteCurrentVideo() {
+        if (mCurrentVideoFilename != null) {
+            Log.v(TAG, "Deleting stub video " + mCurrentVideoFilename);
+            File f = new File(mCurrentVideoFilename);
+            if (! f.delete()) {
+                Log.v(TAG, "Could not delete " + mCurrentVideoFilename);
+            }
+            mCurrentVideoFilename = null;
+        }
+        if (mCurrentVideoUri != null) {
+            mContentResolver.delete(mCurrentVideoUri, null, null);
+            mCurrentVideoUri = null;
+        }
     }
 
     private void addBaseMenuItems(Menu menu) {
@@ -734,20 +794,20 @@
     }
 
     private void showPostRecordingAlert() {
-        cancelRestartPreviewTimeout();
+        boolean isPick = isPickIntent();
+        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.accept).setVisibility(pickVisible);
+        mPostPictureAlert.findViewById(R.id.cancel).setVisibility(pickVisible);
         mPostPictureAlert.setVisibility(View.VISIBLE);
-        mHandler.sendEmptyMessageDelayed(RESTART_PREVIEW, POST_PICTURE_ALERT_TIMEOUT);
     }
 
     private void hidePostPictureAlert() {
-        cancelRestartPreviewTimeout();
         mPostPictureAlert.setVisibility(View.INVISIBLE);
     }
 
-    private void cancelRestartPreviewTimeout() {
-        mHandler.removeMessages(RESTART_PREVIEW);
-    }
-
     private boolean isPostRecordingAlertVisible() {
         return mPostPictureAlert.getVisibility() == View.VISIBLE;
     }
@@ -757,14 +817,24 @@
         if (mMediaRecorderRecording || mMediaRecorder != null) {
             if (mMediaRecorderRecording) {
                 mMediaRecorder.stop();
+                mNeedToDeletePartialRecording = false;
+                mNeedToRegisterRecording = true;
+                mMediaRecorderRecording = false;
             }
             releaseMediaRecorder();
-            mMediaRecorderRecording = false;
             mModeIndicatorView.setVisibility(View.VISIBLE);
             mRecordingIndicatorView.setVisibility(View.GONE);
             mRecordingTimeView.setVisibility(View.GONE);
             getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
         }
+        if (mNeedToRegisterRecording) {
+            registerVideo();
+            mNeedToRegisterRecording = false;
+        }
+        if (mNeedToDeletePartialRecording){
+            deleteCurrentVideo();
+            mNeedToDeletePartialRecording = false;
+        }
     }
 
     private void hideVideoFrameAndStartPreview() {
diff --git a/src/com/android/camera/ViewImage.java b/src/com/android/camera/ViewImage.java
index 9579f19..d1ef142 100644
--- a/src/com/android/camera/ViewImage.java
+++ b/src/com/android/camera/ViewImage.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.content.pm.ActivityInfo;
 import android.graphics.Bitmap;
 import android.graphics.Matrix;
 import android.net.Uri;
@@ -49,6 +50,7 @@
 import android.widget.RelativeLayout;
 import android.widget.Scroller;
 import android.widget.TextView;
+import android.widget.Toast;
 import android.widget.ZoomControls;
 import android.preference.PreferenceManager;
 
@@ -56,7 +58,7 @@
 
 import java.util.Random;
 
-public class ViewImage extends Activity
+public class ViewImage extends Activity implements View.OnClickListener
 {
     static final String TAG = "ViewImage";
     private ImageGetter mGetter;
@@ -81,6 +83,9 @@
     private static final int MODE_NORMAL = 1;
     private static final int MODE_SLIDESHOW = 2;
     private int mMode = MODE_NORMAL;
+    private boolean mFullScreenInNormalMode;
+    private boolean mShowActionIcons;
+    private View mActionIconPanel;
 
     private boolean mSortAscending = false;
     private int mSlideShowInterval;
@@ -652,8 +657,7 @@
             mImageMenuRunnable.gettingReadyToOpen(menu, mAllImages.getImageAt(mCurrentPosition));
         }
 
-        int keyboard = getResources().getConfiguration().keyboardHidden;
-        mFlipItem.setEnabled(keyboard == android.content.res.Configuration.KEYBOARDHIDDEN_YES);
+        MenuHelper.setFlipOrientationEnabled(this, mFlipItem);
 
         menu.findItem(MenuHelper.MENU_IMAGE_SHARE).setEnabled(isCurrentImageShareable());
 
@@ -1067,6 +1071,12 @@
             mSlideShowImageViews[i].setVisibility(View.INVISIBLE);
         }
 
+        mActionIconPanel = findViewById(R.id.action_icon_panel);
+        int[] ids = {R.id.capture, R.id.gallery, R.id.discard, R.id.share, R.id.setas};
+        for(int id : ids) {
+            findViewById(id).setOnClickListener(this);
+        }
+
         Uri uri = getIntent().getData();
 
         if (Config.LOGV)
@@ -1081,12 +1091,24 @@
             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();
+
         boolean slideShow = b != null ? b.getBoolean("slideshow", false) : false;
         if (slideShow) {
             setMode(MODE_SLIDESHOW);
             loadNextImage(mCurrentPosition, 0, true);
+        } else {
+            if (mFullScreenInNormalMode) {
+                getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+            }
+            if (mShowActionIcons) {
+                mActionIconPanel.setVisibility(View.VISIBLE);
+            }
         }
 
         // Get the zoom controls and add them to the bottom of the map
@@ -1102,7 +1124,20 @@
         mNextImageView = findViewById(R.id.next_image);
         mPrevImageView = findViewById(R.id.prev_image);
 
-        MenuHelper.requestOrientation(this, mPrefs);
+        setOrientation();
+    }
+
+    private void setOrientation() {
+        Intent intent = getIntent();
+        if (intent.hasExtra(MediaStore.EXTRA_SCREEN_ORIENTATION)) {
+            int orientation = intent.getIntExtra(MediaStore.EXTRA_SCREEN_ORIENTATION,
+                    ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+            if (orientation != getRequestedOrientation()) {
+                setRequestedOrientation(orientation);
+            }
+        } else {
+            MenuHelper.requestOrientation(this, mPrefs);
+        }
     }
 
     private Animation makeInAnimation(int id) {
@@ -1134,6 +1169,7 @@
             for (ImageViewTouchBase ivt: mImageViews) {
                 ivt.clear();
             }
+            mActionIconPanel.setVisibility(View.GONE);
 
             if (false) {
                 Log.v(TAG, "current is " + this.mSlideShowImageCurrent);
@@ -1170,8 +1206,12 @@
         } else {
             if (Config.LOGV)
                 Log.v(TAG, "slide show mode off, mCurrentPosition == " + mCurrentPosition);
-            win.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
-                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+            win.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+            if (mFullScreenInNormalMode) {
+                win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+            } else {
+                win.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
+            }
 
             if (mGetter != null)
                 mGetter.cancelCurrent();
@@ -1179,6 +1219,9 @@
             if (sSlideShowHidesStatusBar) {
                 win.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
             }
+            if (mShowActionIcons) {
+                mActionIconPanel.setVisibility(View.VISIBLE);
+            }
 
             ImageViewTouchBase dst = mImageViews[1];
             dst.mLastXTouchPos = -1;
@@ -1403,7 +1446,7 @@
          });
         setImage(mCurrentPosition);
 
-        MenuHelper.requestOrientation(this, mPrefs);
+        setOrientation();
     }
 
     @Override
@@ -1433,4 +1476,49 @@
     public void onStop() {
         super.onStop();
     }
+
+    public void onClick(View v) {
+        switch (v.getId()) {
+
+        case R.id.capture: {
+            MenuHelper.gotoStillImageCapture(this);
+        }
+        break;
+
+        case R.id.gallery: {
+            MenuHelper.gotoCameraImageGallery(this);
+        }
+        break;
+
+        case R.id.discard: {
+            MenuHelper.displayDeleteDialog(this, mDeletePhotoRunnable, true);
+        }
+        break;
+
+        case R.id.share: {
+            Uri u = mAllImages.getImageAt(mCurrentPosition).fullSizeImageUri();
+            Intent intent = new Intent();
+            intent.setAction(Intent.ACTION_SEND);
+            intent.setType("image/jpeg");
+            intent.putExtra(Intent.EXTRA_STREAM, u);
+            try {
+                startActivity(Intent.createChooser(intent, getText(R.string.sendImage)));
+            } catch (android.content.ActivityNotFoundException ex) {
+                Toast.makeText(this, R.string.no_way_to_share_image, Toast.LENGTH_SHORT).show();
+            }
+        }
+        break;
+
+        case R.id.setas: {
+            Uri u = mAllImages.getImageAt(mCurrentPosition).fullSizeImageUri();
+            Intent intent = new Intent(Intent.ACTION_ATTACH_DATA, u);
+            try {
+                startActivity(Intent.createChooser(intent, getText(R.string.setImage)));
+            } catch (android.content.ActivityNotFoundException ex) {
+                Toast.makeText(this, R.string.no_way_to_share_video, Toast.LENGTH_SHORT).show();
+            }
+        }
+        break;
+        }
+    }
 }
diff --git a/src/com/android/camera/Wallpaper.java b/src/com/android/camera/Wallpaper.java
index ff41242..1cc12fb 100644
--- a/src/com/android/camera/Wallpaper.java
+++ b/src/com/android/camera/Wallpaper.java
@@ -74,14 +74,16 @@
     };
     
     static class SetWallpaperThread extends Thread {
-        private Bitmap mBitmap;
-        private Handler mHandler;
-        private Context mContext;
+        private final Bitmap mBitmap;
+        private final Handler mHandler;
+        private final Context mContext;
+        private final File mFile;
         
-        public SetWallpaperThread(Bitmap bitmap, Handler handler, Context context) {
+        public SetWallpaperThread(Bitmap bitmap, Handler handler, Context context, File file) {
             mBitmap = bitmap;
             mHandler = handler;
             mContext = context;
+            mFile = file;
         }
         
         @Override
@@ -92,6 +94,7 @@
                 Log.e(LOG_TAG, "Failed to set wallpaper.", e);
             } finally {
                 mHandler.sendEmptyMessage(FINISH);
+                mFile.delete();
             }
         }
     }
@@ -148,6 +151,10 @@
     }
     
     protected void formatIntent(Intent intent) {
+        // TODO: A temporary file is NOT necessary
+        // The CropImage intent should be able to set the wallpaper directly
+        // without writing to a file, which we then need to read here to write
+        // it again as the final wallpaper, this is silly
         File f = getFileStreamPath("temp-wallpaper");
         (new File(f.getParent())).mkdirs();
         mTempFilePath = f.toString();
@@ -162,6 +169,10 @@
         intent.putExtra("scale",           true);    
         intent.putExtra("noFaceDetection", true);
         intent.putExtra("output",          Uri.parse("file:/" + mTempFilePath));
+        intent.putExtra("outputFormat",    Bitmap.CompressFormat.PNG.name());
+        // TODO: we should have an extra called "setWallpaper" to ask CropImage to
+        // set the cropped image as a wallpaper directly
+        // This means the SetWallpaperThread should be moved out of this class to CropImage
     }
 
     @Override
@@ -169,7 +180,8 @@
         if ((requestCode == PHOTO_PICKED || requestCode == CROP_DONE) && (resultCode == RESULT_OK)
                 && (data != null)) {
             try {
-                InputStream s = new FileInputStream(mTempFilePath);
+                File tempFile = new File(mTempFilePath);
+                InputStream s = new FileInputStream(tempFile);
                 Bitmap bitmap = BitmapFactory.decodeStream(s);
                 if (bitmap == null) {
                     Log.e(LOG_TAG, "Failed to set wallpaper.  Couldn't get bitmap for path " + mTempFilePath);
@@ -177,7 +189,7 @@
                     if (android.util.Config.LOGV)
                         Log.v(LOG_TAG, "bitmap size is " + bitmap.getWidth() + " / " + bitmap.getHeight());
                     mHandler.sendEmptyMessage(SHOW_PROGRESS);
-                    new SetWallpaperThread(bitmap, mHandler, this).start();
+                    new SetWallpaperThread(bitmap, mHandler, this, tempFile).start();
                 }
                 mDoLaunch = false;
             } catch (FileNotFoundException ex) {