Merge "Get new camera activity up to date" into gb-ub-photos-carlsbad
diff --git a/src/com/android/camera/NewCameraActivity.java b/src/com/android/camera/NewCameraActivity.java
index 0ad38b2..3313ede 100644
--- a/src/com/android/camera/NewCameraActivity.java
+++ b/src/com/android/camera/NewCameraActivity.java
@@ -37,8 +37,10 @@
 import android.view.ViewGroup;
 import android.view.Window;
 import android.view.WindowManager;
+import android.widget.ImageView;
 
 import com.android.camera.data.CameraDataAdapter;
+import com.android.camera.data.LocalData;
 import com.android.camera.ui.CameraSwitcher.CameraSwitchListener;
 import com.android.camera.ui.FilmStripView;
 import com.android.camera.ui.NewCameraRootView;
@@ -152,8 +154,6 @@
         String action = intent.getAction();
         if (INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action)) {
             mSecureCamera = true;
-            // Use a new album when this is started from the lock screen.
-        //TODO:    sSecureAlbumId++;
         } else if (ACTION_IMAGE_CAPTURE_SECURE.equals(action)) {
             mSecureCamera = true;
         } else {
@@ -236,7 +236,20 @@
         mCurrentModule.onResumeAfterSuper();
 
         // The loading is done in background and will update the filmstrip later.
-        mDataAdapter.requestLoad(getContentResolver());
+        if (!mSecureCamera) {
+            mDataAdapter.requestLoad(getContentResolver());
+        } else {
+            // Flush out all the original data first.
+            mDataAdapter.flush();
+            ImageView v = (ImageView) getLayoutInflater().inflate(
+                    R.layout.secure_album_placeholder, null);
+            mDataAdapter.addLocalData(
+                    new LocalData.LocalViewData(
+                            v,
+                            v.getDrawable().getIntrinsicWidth(),
+                            v.getDrawable().getIntrinsicHeight(),
+                            0, 0));
+        }
     }
 
     @Override
diff --git a/src/com/android/camera/NewPhotoUI.java b/src/com/android/camera/NewPhotoUI.java
index 691c371..cd93a7e 100644
--- a/src/com/android/camera/NewPhotoUI.java
+++ b/src/com/android/camera/NewPhotoUI.java
@@ -647,7 +647,7 @@
     public void onPieOpened(int centerX, int centerY) {
       //TODO:   mActivity.cancelActivityTouchHandling();
       //TODO:    mActivity.setSwipingEnabled(false);
-        dismissPopup(false);
+        dismissPopup();
         if (mFaceView != null) {
             mFaceView.setBlockDraw(true);
         }
diff --git a/src/com/android/camera/data/CameraDataAdapter.java b/src/com/android/camera/data/CameraDataAdapter.java
index 6e2ff10..32b3afe 100644
--- a/src/com/android/camera/data/CameraDataAdapter.java
+++ b/src/com/android/camera/data/CameraDataAdapter.java
@@ -164,6 +164,55 @@
         }
     }
 
+    // Update all the data but keep the camera data if already set.
+    private void replaceData(List<LocalData> list) {
+        boolean changed = (list != mImages);
+        LocalData cameraData = null;
+        if (mImages != null && mImages.size() > 0) {
+            cameraData = mImages.get(0);
+            if (cameraData.getType() != ImageData.TYPE_CAMERA_PREVIEW) {
+                cameraData = null;
+            }
+        }
+
+        mImages = list;
+        if (cameraData != null) {
+            // camera view exists, so we make sure at least 1 data is in the list.
+            if (mImages == null) {
+                mImages = new ArrayList<LocalData>();
+            }
+            mImages.add(0, cameraData);
+            if (mListener != null) {
+                // Only the camera data is not changed, everything else is changed.
+                mListener.onDataUpdated(new UpdateReporter() {
+                    @Override
+                    public boolean isDataRemoved(int id) {
+                        return false;
+                    }
+
+                    @Override
+                    public boolean isDataUpdated(int id) {
+                        if (id == 0) return false;
+                        return true;
+                    }
+                });
+            }
+        } else {
+            // both might be null.
+            if (changed) {
+                mListener.onDataLoaded();
+            }
+        }
+    }
+
+    public void flush() {
+        replaceData(null);
+    }
+
+    public void addLocalData(LocalData data) {
+        insertData(data);
+    }
+
     private LocalData buildCameraImageData(int width, int height) {
         LocalData d = new CameraPreviewData(width, height);
         return d;
@@ -277,43 +326,7 @@
 
         @Override
         protected void onPostExecute(List<LocalData> l) {
-            boolean changed = (l != mImages);
-            LocalData cameraData = null;
-            if (mImages != null && mImages.size() > 0) {
-                cameraData = mImages.get(0);
-                if (cameraData.getType() != ImageData.TYPE_CAMERA_PREVIEW) {
-                    cameraData = null;
-                }
-            }
-
-            mImages = l;
-            if (cameraData != null) {
-                // camera view exists, so we make sure at least 1 data is in the list.
-                if (mImages == null) {
-                    mImages = new ArrayList<LocalData>();
-                }
-                mImages.add(0, cameraData);
-                if (mListener != null) {
-                    // Only the camera data is not changed, everything else is changed.
-                    mListener.onDataUpdated(new UpdateReporter() {
-                        @Override
-                        public boolean isDataRemoved(int id) {
-                            return false;
-                        }
-
-                        @Override
-                        public boolean isDataUpdated(int id) {
-                            if (id == 0) return false;
-                            return true;
-                        }
-                    });
-                }
-            } else {
-                // both might be null.
-                if (changed) {
-                    mListener.onDataLoaded();
-                }
-            }
+            replaceData(l);
         }
     }
 
@@ -378,5 +391,4 @@
             // do nothing.
         }
     }
-
 }
diff --git a/src/com/android/camera/data/LocalData.java b/src/com/android/camera/data/LocalData.java
index 9f9be8e..9ebc9ca 100644
--- a/src/com/android/camera/data/LocalData.java
+++ b/src/com/android/camera/data/LocalData.java
@@ -21,6 +21,7 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Matrix;
+import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.media.MediaMetadataRetriever;
 import android.os.AsyncTask;
@@ -32,6 +33,7 @@
 import android.widget.ImageView;
 
 import com.android.camera.ui.FilmStripView;
+import com.android.gallery3d.R;
 
 import java.util.Comparator;
 import java.util.Date;
@@ -39,7 +41,7 @@
 /* An abstract interface that represents the local media data. Also implements
  * Comparable interface so we can sort in DataAdapter.
  */
-abstract interface LocalData extends FilmStripView.ImageData {
+public abstract interface LocalData extends FilmStripView.ImageData {
     static final String TAG = "LocalData";
 
     abstract View getView(Context c, int width, int height, Drawable placeHolder);
@@ -123,19 +125,23 @@
             return false;
         }
 
-        @Override
-        public View getView(Context c,
+        protected ImageView getImageView(Context c,
                 int decodeWidth, int decodeHeight, Drawable placeHolder) {
             ImageView v = new ImageView(c);
-            v.setImageDrawable(placeHolder);
+            v.setBackground(placeHolder);
 
-            v.setScaleType(ImageView.ScaleType.FIT_XY);
             BitmapLoadTask task = getBitmapLoadTask(v, decodeWidth, decodeHeight);
             task.execute();
             return v;
         }
 
         @Override
+        public View getView(Context c,
+                int decodeWidth, int decodeHeight, Drawable placeHolder) {
+            return getImageView(c, decodeWidth, decodeHeight, placeHolder);
+        }
+
+        @Override
         public void prepare() {
             synchronized (mUsing) {
                 mUsing = true;
@@ -179,8 +185,9 @@
                     Log.e(TAG, "Failed decoding bitmap for file:" + path);
                     return;
                 }
-                mView.setScaleType(ImageView.ScaleType.FIT_XY);
-                mView.setImageBitmap(bitmap);
+                BitmapDrawable d = new BitmapDrawable(bitmap);
+                d.setGravity(android.view.Gravity.FILL);
+                mView.setBackground(d);
             }
         }
     }
@@ -403,6 +410,15 @@
         }
 
         @Override
+        public View getView(Context c,
+                int decodeWidth, int decodeHeight, Drawable placeHolder) {
+            ImageView v = getImageView(c, decodeWidth, decodeHeight, placeHolder);
+            v.setImageResource(R.drawable.ic_control_play);
+            v.setScaleType(ImageView.ScaleType.CENTER);
+            return v;
+        }
+
+        @Override
         protected BitmapLoadTask getBitmapLoadTask(
                 ImageView v, int decodeWidth, int decodeHeight) {
             return new VideoBitmapLoadTask(v);
@@ -438,5 +454,77 @@
             }
         }
     }
+
+    /*
+     * A LocalData that does nothing but only shows a view.
+     */
+    public static class LocalViewData implements LocalData {
+        private int mWidth;
+        private int mHeight;
+        View mView;
+        private long mDateTaken;
+        private long mDateModified;
+
+        public LocalViewData(View v,
+                int width, int height,
+                int dateTaken, int dateModified) {
+            mView = v;
+            mWidth = width;
+            mHeight = height;
+            mDateTaken = dateTaken;
+            mDateModified = dateModified;
+        }
+
+        @Override
+        public long getDateTaken() {
+            return mDateTaken;
+        }
+
+        @Override
+        public long getDateModified() {
+            return mDateModified;
+        }
+
+        @Override
+        public String getTitle() {
+            return "";
+        }
+
+        @Override
+        public int getWidth() {
+            return mWidth;
+        }
+
+        @Override
+        public int getHeight() {
+            return mHeight;
+        }
+
+        @Override
+        public int getType() {
+            return FilmStripView.ImageData.TYPE_PHOTO;
+        }
+
+        @Override
+        public boolean isActionSupported(int action) {
+            if (action == FilmStripView.ImageData.ACTION_PLAY) return true;
+            return false;
+        }
+
+        @Override
+        public View getView(Context c, int width, int height, Drawable placeHolder) {
+            return mView;
+        }
+
+        @Override
+        public void prepare() {
+            // do nothing.
+        }
+
+        @Override
+        public void recycle() {
+            // do nothing.
+        }
+    }
 }
 
diff --git a/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java b/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java
index b5de692..9f7cba3 100644
--- a/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java
+++ b/src/com/android/gallery3d/filtershow/tools/SaveCopyTask.java
@@ -65,7 +65,10 @@
         void onCursorResult(Cursor cursor);
     }
 
-    private static final String TIME_STAMP_NAME = "'IMG'_yyyyMMdd_HHmmss";
+    private static final String TIME_STAMP_NAME = "_yyyyMMdd_HHmmss";
+    private static final String PREFIX_PANO = "PANO";
+    private static final String PREFIX_IMG = "IMG";
+    private static final String POSTFIX_JPG = ".jpg";
 
     private final Context context;
     private final Uri sourceUri;
@@ -84,7 +87,7 @@
             this.destinationFile = destination;
         }
 
-        saveFileName = new SimpleDateFormat(TIME_STAMP_NAME).format(new Date(
+        saveFileName = PREFIX_IMG +  new SimpleDateFormat(TIME_STAMP_NAME).format(new Date(
                 System.currentTimeMillis()));
     }
 
@@ -104,7 +107,10 @@
         File saveDirectory = getFinalSaveDirectory(context, sourceUri);
         String filename = new SimpleDateFormat(TIME_STAMP_NAME).format(new Date(
                 System.currentTimeMillis()));
-        return new File(saveDirectory, filename + ".JPG");
+        if (hasPanoPrefix(context, sourceUri)) {
+            return new File(saveDirectory, PREFIX_PANO + filename + POSTFIX_JPG);
+        }
+        return new File(saveDirectory, PREFIX_IMG + filename + POSTFIX_JPG);
     }
 
     public Object getPanoramaXMPData(Uri source, ImagePreset preset) {
@@ -133,7 +139,7 @@
     public ExifInterface getExifData(Uri source) {
         ExifInterface exif = new ExifInterface();
         String mimeType = context.getContentResolver().getType(sourceUri);
-        if (mimeType == ImageLoader.JPEG_MIME_TYPE) {
+        if (mimeType.equals(ImageLoader.JPEG_MIME_TYPE)) {
             InputStream inStream = null;
             try {
                 inStream = context.getContentResolver().openInputStream(source);
@@ -264,6 +270,33 @@
     }
 
     /**
+     * Gets the actual filename for a Uri from Gallery's ContentProvider.
+     */
+    private static String getTrueFilename(Context context, Uri src) {
+        if (context == null || src == null) {
+            return null;
+        }
+        final String[] trueName = new String[1];
+        querySource(context, src, new String[] {
+                ImageColumns.DATA
+        }, new ContentResolverQueryCallback() {
+            @Override
+            public void onCursorResult(Cursor cursor) {
+                trueName[0] = new File(cursor.getString(0)).getName();
+            }
+        });
+        return trueName[0];
+    }
+
+    /**
+     * Checks whether the true filename has the panorama image prefix.
+     */
+    private static boolean hasPanoPrefix(Context context, Uri src) {
+        String name = getTrueFilename(context, src);
+        return name != null && name.startsWith(PREFIX_PANO);
+    }
+
+    /**
      * Insert the content (saved file) with proper source photo properties.
      */
     public static Uri insertContent(Context context, Uri sourceUri, File file, String saveFileName,