Handle unexpected exceptions when loading videos.

  bug:10313671
  bug:9757517

Change-Id: I8cb922599c4185a585f90007c3975841d14e179a
diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java
index 4b353f1..1f5ae24 100644
--- a/src/com/android/camera/PhotoUI.java
+++ b/src/com/android/camera/PhotoUI.java
@@ -71,7 +71,6 @@
     CameraManager.CameraFaceDetectionCallback {
 
     private static final String TAG = "CAM_UI";
-    private static final int UPDATE_TRANSFORM_MATRIX = 1;
     private static final int DOWN_SAMPLE_FACTOR = 4;
     private final AnimationManager mAnimationManager;
     private CameraActivity mActivity;
@@ -119,18 +118,6 @@
     private TextureView mTextureView;
     private Matrix mMatrix = null;
     private float mAspectRatio = 4f / 3f;
-    private final Handler mHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case UPDATE_TRANSFORM_MATRIX:
-                    setTransformMatrix(mPreviewWidth, mPreviewHeight);
-                    break;
-                default:
-                    break;
-            }
-        }
-    };
 
     public interface SurfaceTextureSizeChangedListener {
         public void onSurfaceTextureSizeChanged(int uncroppedWidth, int uncroppedHeight);
@@ -152,7 +139,6 @@
             if (mPreviewWidth != width || mPreviewHeight != height) {
                 mPreviewWidth = width;
                 mPreviewHeight = height;
-                onScreenSizeChanged(width, height, w, h);
                 mController.onScreenSizeChanged(width, height, w, h);
             }
         }
@@ -212,10 +198,6 @@
         mAnimationManager = new AnimationManager();
     }
 
-    public void onScreenSizeChanged(int width, int height, int previewWidth, int previewHeight) {
-        setTransformMatrix(width, height);
-    }
-
     public void setSurfaceTextureSizeChangedListener(SurfaceTextureSizeChangedListener listener) {
         mSurfaceTextureSizeListener = listener;
     }
diff --git a/src/com/android/camera/data/LocalMediaData.java b/src/com/android/camera/data/LocalMediaData.java
index 05b907a..d5a929d 100644
--- a/src/com/android/camera/data/LocalMediaData.java
+++ b/src/com/android/camera/data/LocalMediaData.java
@@ -443,16 +443,26 @@
             d.height = c.getInt(COL_HEIGHT);
             d.mPlayUri = d.getContentUri();
             MediaMetadataRetriever retriever = new MediaMetadataRetriever();
-            retriever.setDataSource(d.path);
-            String rotation = retriever.extractMetadata(
+            String rotation = null;
+            try {
+                retriever.setDataSource(d.path);
+            } catch (IllegalArgumentException ex) {
+                retriever.release();
+                Log.e(TAG, "MediaMetadataRetriever.setDataSource() fail:"
+                        + ex.getMessage());
+                return null;
+            }
+            rotation = retriever.extractMetadata(
                     MediaMetadataRetriever.METADATA_KEY_VIDEO_ROTATION);
             if (d.width == 0 || d.height == 0) {
-                d.width = Integer.parseInt(retriever.extractMetadata(
-                    MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH));
-                d.height = Integer.parseInt(retriever.extractMetadata(
-                    MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT));
+                retrieveVideoDimension(retriever, d);
             }
             retriever.release();
+            if (d.width == 0 || d.height == 0) {
+                // Width or height is still not available.
+                Log.e(TAG, "Unable to retrieve dimension of video:" + d.path);
+                return null;
+            }
             if (rotation != null
                     && (rotation.equals("90") || rotation.equals("270"))) {
                 int b = d.width;
@@ -509,6 +519,9 @@
                 return false;
             }
             VideoData newData = buildFromCursor(c);
+            if (newData == null) {
+                return false;
+            }
             id = newData.id;
             title = newData.title;
             mimeType = newData.mimeType;
@@ -587,6 +600,22 @@
                 return bitmap;
             }
         }
+
+        /**
+         * Extracts video height/width if available. If
+         * unavailable, set to 0.
+         * @param retriever An initialized metadata retriever.
+         * @param d The {@link VideoData} whose width/height are to update.
+         */
+        private static void retrieveVideoDimension(
+                MediaMetadataRetriever retriever, VideoData d) {
+            String val = retriever.extractMetadata(
+                    MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH);
+            d.width = (val == null) ? 0 : Integer.parseInt(val);
+            val = retriever.extractMetadata(
+                    MediaMetadataRetriever.METADATA_KEY_VIDEO_HEIGHT);
+            d.height = (val == null) ? 0 : Integer.parseInt(val);
+        }
     }
 
     /**