am 062bd465: Merge "jni: fix C99 inline linking"

* commit '062bd465cd25806ea37200639c6b1200a62db9d4':
  jni: fix C99 inline linking
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 8f48edf..59da7ea 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -164,7 +164,6 @@
         <!-- This activity acts as a trampoline to the new Gallery activity,
              so that existing shortcuts are preserved. -->
         <activity android:name="com.android.gallery3d.app.Gallery"
-            android:excludeFromRecents="true"
             android:theme="@style/android:Theme.NoDisplay">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/res/drawable-hdpi-v19/overscroll_edge.png b/res/drawable-hdpi-v19/overscroll_edge.png
new file mode 100644
index 0000000..1952e0e
--- /dev/null
+++ b/res/drawable-hdpi-v19/overscroll_edge.png
Binary files differ
diff --git a/res/drawable-hdpi-v19/overscroll_glow.png b/res/drawable-hdpi-v19/overscroll_glow.png
new file mode 100644
index 0000000..45c0135
--- /dev/null
+++ b/res/drawable-hdpi-v19/overscroll_glow.png
Binary files differ
diff --git a/res/drawable-mdpi-v19/overscroll_edge.png b/res/drawable-mdpi-v19/overscroll_edge.png
new file mode 100644
index 0000000..baf2d0c
--- /dev/null
+++ b/res/drawable-mdpi-v19/overscroll_edge.png
Binary files differ
diff --git a/res/drawable-mdpi-v19/overscroll_glow.png b/res/drawable-mdpi-v19/overscroll_glow.png
new file mode 100644
index 0000000..c6cddd4
--- /dev/null
+++ b/res/drawable-mdpi-v19/overscroll_glow.png
Binary files differ
diff --git a/res/drawable-xhdpi-v19/overscroll_edge.png b/res/drawable-xhdpi-v19/overscroll_edge.png
new file mode 100644
index 0000000..b5e6e61
--- /dev/null
+++ b/res/drawable-xhdpi-v19/overscroll_edge.png
Binary files differ
diff --git a/res/drawable-xhdpi-v19/overscroll_glow.png b/res/drawable-xhdpi-v19/overscroll_glow.png
new file mode 100644
index 0000000..779c3a5
--- /dev/null
+++ b/res/drawable-xhdpi-v19/overscroll_glow.png
Binary files differ
diff --git a/res/drawable-xxhdpi-v19/overscroll_edge.png b/res/drawable-xxhdpi-v19/overscroll_edge.png
new file mode 100644
index 0000000..734bfa7
--- /dev/null
+++ b/res/drawable-xxhdpi-v19/overscroll_edge.png
Binary files differ
diff --git a/res/drawable-xxhdpi-v19/overscroll_glow.png b/res/drawable-xxhdpi-v19/overscroll_glow.png
new file mode 100644
index 0000000..dc1f279
--- /dev/null
+++ b/res/drawable-xxhdpi-v19/overscroll_glow.png
Binary files differ
diff --git a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java
index 69edd60..52c296c 100644
--- a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java
+++ b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java
@@ -129,36 +129,52 @@
         } finally {
             Utils.closeSilently(cursor);
         }
-
-        // Fall back to checking EXIF tags in file.
-        if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
-            String mimeType = getMimeType(uri);
-            if (!JPEG_MIME_TYPE.equals(mimeType)) {
-                return ORI_NORMAL;
-            }
-            String path = uri.getPath();
-            ExifInterface exif = new ExifInterface();
-            try {
+        ExifInterface exif = new ExifInterface();
+        InputStream is = null;
+        // Fall back to checking EXIF tags in file or input stream.
+        try {
+            if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {
+                String mimeType = getMimeType(uri);
+                if (!JPEG_MIME_TYPE.equals(mimeType)) {
+                    return ORI_NORMAL;
+                }
+                String path = uri.getPath();
                 exif.readExif(path);
-                Integer tagval = exif.getTagIntValue(ExifInterface.TAG_ORIENTATION);
-                if (tagval != null) {
-                    int orientation = tagval;
-                    switch(orientation) {
-                        case ORI_NORMAL:
-                        case ORI_ROTATE_90:
-                        case ORI_ROTATE_180:
-                        case ORI_ROTATE_270:
-                        case ORI_FLIP_HOR:
-                        case ORI_FLIP_VERT:
-                        case ORI_TRANSPOSE:
-                        case ORI_TRANSVERSE:
-                            return orientation;
-                        default:
-                            return ORI_NORMAL;
-                    }
+            } else {
+                is = context.getContentResolver().openInputStream(uri);
+                exif.readExif(is);
+            }
+            return parseExif(exif);
+        } catch (IOException e) {
+            Log.w(LOGTAG, "Failed to read EXIF orientation", e);
+        } finally {
+            try {
+                if (is != null) {
+                    is.close();
                 }
             } catch (IOException e) {
-                Log.w(LOGTAG, "Failed to read EXIF orientation", e);
+                Log.w(LOGTAG, "Failed to close InputStream", e);
+            }
+        }
+        return ORI_NORMAL;
+    }
+
+    private static int parseExif(ExifInterface exif){
+        Integer tagval = exif.getTagIntValue(ExifInterface.TAG_ORIENTATION);
+        if (tagval != null) {
+            int orientation = tagval;
+            switch(orientation) {
+                case ORI_NORMAL:
+                case ORI_ROTATE_90:
+                case ORI_ROTATE_180:
+                case ORI_ROTATE_270:
+                case ORI_FLIP_HOR:
+                case ORI_FLIP_VERT:
+                case ORI_TRANSPOSE:
+                case ORI_TRANSVERSE:
+                    return orientation;
+                default:
+                    return ORI_NORMAL;
             }
         }
         return ORI_NORMAL;
diff --git a/src/com/android/gallery3d/filtershow/category/MainPanel.java b/src/com/android/gallery3d/filtershow/category/MainPanel.java
index eb1ce2b..082bf14 100644
--- a/src/com/android/gallery3d/filtershow/category/MainPanel.java
+++ b/src/com/android/gallery3d/filtershow/category/MainPanel.java
@@ -27,6 +27,7 @@
 
 import com.android.gallery3d.R;
 import com.android.gallery3d.filtershow.FilterShowActivity;
+import com.android.gallery3d.filtershow.imageshow.MasterImage;
 import com.android.gallery3d.filtershow.state.StatePanel;
 
 public class MainPanel extends Fragment {
@@ -176,6 +177,9 @@
         if (mCurrentSelected == GEOMETRY) {
             return;
         }
+        if (MasterImage.getImage().hasTinyPlanet()) {
+            return;
+        }
         boolean fromRight = isRightAnimation(GEOMETRY);
         selection(mCurrentSelected, false);
         CategoryPanel categoryPanel = new CategoryPanel();
diff --git a/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java b/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java
index 64b4974..8350ff3 100644
--- a/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java
+++ b/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java
@@ -263,7 +263,7 @@
                 "LUT3D_INSTANT",
                 "LUT3D_WASHOUT",
                 "LUT3D_BLUECRUSH",
-                "LUT3D_WASHOUT",
+                "LUT3D_WASHOUT_COLOR",
                 "LUT3D_XPROCESS"
         };
 
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java b/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java
index 4b03991..4e53f82 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java
@@ -265,6 +265,7 @@
         mImageBounds.set(0, 0, bitmap.getWidth(), bitmap.getHeight());
         // If display matrix doesn't exist, create it and its dependencies
         if (mDisplayCropMatrix == null || mDisplayMatrix == null || mDisplayMatrixInverse == null) {
+            mCropObj.unsetAspectRatio();
             mDisplayMatrix = GeometryMathUtils.getFullGeometryToScreenMatrix(mGeometry,
                     bitmap.getWidth(), bitmap.getHeight(), canvas.getWidth(), canvas.getHeight());
             float straighten = mGeometry.straighten;
diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
index 3513ded..f6b97f1 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java
@@ -829,4 +829,8 @@
     public BitmapCache getBitmapCache() {
         return mBitmapCache;
     }
+
+    public boolean hasTinyPlanet() {
+        return mPreset.contains(FilterRepresentation.TYPE_TINYPLANET);
+    }
 }
diff --git a/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java b/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java
index 4322ed7..4765a59 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/ImagePreset.java
@@ -394,7 +394,7 @@
                     break;
                 }
             }
-            if (!replaced) {
+            if (!replaced && !isNoneFxFilter(representation)) {
                 mFilters.add(0, representation);
             }
         } else {
diff --git a/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java b/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
index b5b636e..e5736d4 100644
--- a/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
+++ b/src/com/android/gallery3d/filtershow/pipeline/ProcessingService.java
@@ -288,7 +288,7 @@
         if (mNeedsAlive) {
             // If the app has been restarted while we were saving...
             mFiltershowActivity.updateUIAfterServiceStarted();
-        } else if (mFiltershowActivity.isSimpleEditAction()) {
+        } else if (exit || mFiltershowActivity.isSimpleEditAction()) {
             // terminate now
             mFiltershowActivity.completeSaveImage(result);
         }
diff --git a/src/com/android/gallery3d/filtershow/tools/SaveImage.java b/src/com/android/gallery3d/filtershow/tools/SaveImage.java
index 354081e..c3cdea8 100644
--- a/src/com/android/gallery3d/filtershow/tools/SaveImage.java
+++ b/src/com/android/gallery3d/filtershow/tools/SaveImage.java
@@ -402,6 +402,10 @@
                     // if we have a valid size
                     int w = (int) (bitmap.getWidth() * sizeFactor);
                     int h = (int) (bitmap.getHeight() * sizeFactor);
+                    if (w == 0 || h == 0) {
+                        w = 1;
+                        h = 1;
+                    }
                     bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true);
                 }
                 updateProgress();
diff --git a/src/com/android/gallery3d/filtershow/ui/ExportDialog.java b/src/com/android/gallery3d/filtershow/ui/ExportDialog.java
index f6a84ce..b42c9f3 100644
--- a/src/com/android/gallery3d/filtershow/ui/ExportDialog.java
+++ b/src/com/android/gallery3d/filtershow/ui/ExportDialog.java
@@ -202,8 +202,8 @@
             return;
         }
         mEditing = true;
-        int width = 0;
-        int height = 0;
+        int width = 1;
+        int height = 1;
         if (text.getId() == R.id.editableWidth) {
             if (mWidthText.getText() != null) {
                 String value = String.valueOf(mWidthText.getText());
@@ -213,6 +213,10 @@
                         width = mOriginalBounds.width();
                         mWidthText.setText("" + width);
                     }
+                    if (width <= 0) {
+                        width = (int) Math.ceil(mRatio);
+                        mWidthText.setText("" + width);
+                    }
                     height = (int) (width / mRatio);
                 }
                 mHeightText.setText("" + height);
@@ -226,6 +230,10 @@
                         height = mOriginalBounds.height();
                         mHeightText.setText("" + height);
                     }
+                    if (height <= 0) {
+                        height = 1;
+                        mHeightText.setText("" + height);
+                    }
                     width = (int) (height * mRatio);
                 }
                 mWidthText.setText("" + width);
diff --git a/src/com/android/gallery3d/util/GalleryUtils.java b/src/com/android/gallery3d/util/GalleryUtils.java
index 9a78fcd..8fb926c 100644
--- a/src/com/android/gallery3d/util/GalleryUtils.java
+++ b/src/com/android/gallery3d/util/GalleryUtils.java
@@ -43,6 +43,7 @@
 import com.android.gallery3d.data.DataManager;
 import com.android.gallery3d.data.MediaItem;
 import com.android.gallery3d.ui.TiledScreenNail;
+import com.android.gallery3d.util.IntentHelper;
 import com.android.gallery3d.util.ThreadPool.CancelListener;
 import com.android.gallery3d.util.ThreadPool.JobContext;
 
@@ -235,12 +236,10 @@
     public static boolean isCameraAvailable(Context context) {
         if (sCameraAvailableInitialized) return sCameraAvailable;
         PackageManager pm = context.getPackageManager();
-        ComponentName name = new ComponentName(context, CAMERA_LAUNCHER_NAME);
-        int state = pm.getComponentEnabledSetting(name);
+        Intent cameraIntent = IntentHelper.getCameraIntent(context);
+        List<ResolveInfo> apps = pm.queryIntentActivities(cameraIntent, 0);
         sCameraAvailableInitialized = true;
-        sCameraAvailable =
-           (state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)
-           || (state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
+        sCameraAvailable = !apps.isEmpty();
         return sCameraAvailable;
     }
 
@@ -248,7 +247,13 @@
         Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA)
                 .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                         | Intent.FLAG_ACTIVITY_NEW_TASK);
-        context.startActivity(intent);
+        try {
+            context.startActivity(intent);
+        } catch (ActivityNotFoundException e) {
+            // This will only occur if Camera was disabled while Gallery is open
+            // since we cache our availability check. Just abort the attempt.
+            Log.e(TAG, "Camera activity previously detected but cannot be found", e);
+        }
     }
 
     public static void startGalleryActivity(Context context) {
diff --git a/src_pd/com/android/gallery3d/util/IntentHelper.java b/src_pd/com/android/gallery3d/util/IntentHelper.java
index 13f69eb..8aebfc1 100644
--- a/src_pd/com/android/gallery3d/util/IntentHelper.java
+++ b/src_pd/com/android/gallery3d/util/IntentHelper.java
@@ -22,7 +22,7 @@
 
     public static Intent getCameraIntent(Context context) {
         return new Intent(Intent.ACTION_MAIN)
-            .setClassName("com.android.camera2", "com.android.camera.CameraActivity");
+            .setClassName("com.android.camera2", "com.android.camera.CameraLauncher");
     }
 
     public static Intent getGalleryIntent(Context context) {