merge in klp-release history after reset to klp-dev
diff --git a/src/com/android/providers/media/MediaDocumentsProvider.java b/src/com/android/providers/media/MediaDocumentsProvider.java
index ba63621..cb8cc2f 100644
--- a/src/com/android/providers/media/MediaDocumentsProvider.java
+++ b/src/com/android/providers/media/MediaDocumentsProvider.java
@@ -27,6 +27,7 @@
 import android.graphics.Point;
 import android.net.Uri;
 import android.os.Binder;
+import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.ParcelFileDescriptor;
 import android.provider.BaseColumns;
@@ -47,6 +48,7 @@
 import android.provider.MediaStore.Video.VideoColumns;
 import android.text.TextUtils;
 import android.text.format.DateUtils;
+import android.util.Log;
 
 import libcore.io.IoUtils;
 
@@ -58,6 +60,7 @@
  * contents.
  */
 public class MediaDocumentsProvider extends DocumentsProvider {
+    private static final String TAG = "MediaDocumentsProvider";
 
     private static final String AUTHORITY = "com.android.providers.media.documents";
 
@@ -766,9 +769,10 @@
         final int _DATA = 0;
     }
 
-    private AssetFileDescriptor openImageThumbnailCleared(long id, CancellationSignal signal)
+    private ParcelFileDescriptor openImageThumbnailCleared(long id, CancellationSignal signal)
             throws FileNotFoundException {
         final ContentResolver resolver = getContext().getContentResolver();
+
         Cursor cursor = null;
         try {
             cursor = resolver.query(Images.Thumbnails.EXTERNAL_CONTENT_URI,
@@ -776,9 +780,8 @@
                     null, signal);
             if (cursor.moveToFirst()) {
                 final String data = cursor.getString(ImageThumbnailQuery._DATA);
-                return new AssetFileDescriptor(ParcelFileDescriptor.open(
-                        new File(data), ParcelFileDescriptor.MODE_READ_ONLY), 0,
-                        AssetFileDescriptor.UNKNOWN_LENGTH);
+                return ParcelFileDescriptor.open(
+                        new File(data), ParcelFileDescriptor.MODE_READ_ONLY);
             }
         } finally {
             IoUtils.closeQuietly(cursor);
@@ -790,24 +793,33 @@
             long id, CancellationSignal signal) throws FileNotFoundException {
         final ContentResolver resolver = getContext().getContentResolver();
 
-        AssetFileDescriptor afd = openImageThumbnailCleared(id, signal);
-        if (afd == null) {
+        ParcelFileDescriptor pfd = openImageThumbnailCleared(id, signal);
+        if (pfd == null) {
             // No thumbnail yet, so generate. This is messy, since we drop the
             // Bitmap on the floor, but its the least-complicated way.
             final BitmapFactory.Options opts = new BitmapFactory.Options();
             opts.inJustDecodeBounds = true;
             Images.Thumbnails.getThumbnail(resolver, id, Images.Thumbnails.MINI_KIND, opts);
 
-            afd = openImageThumbnailCleared(id, signal);
+            pfd = openImageThumbnailCleared(id, signal);
         }
 
-        if (afd == null) {
+        if (pfd == null) {
             // Phoey, fallback to full image
             final Uri fullUri = ContentUris.withAppendedId(Images.Media.EXTERNAL_CONTENT_URI, id);
-            afd = resolver.openAssetFileDescriptor(fullUri, "r", signal);
+            pfd = resolver.openFileDescriptor(fullUri, "r", signal);
         }
 
-        return afd;
+        final int orientation = queryOrientationForImage(id, signal);
+        final Bundle extras;
+        if (orientation != 0) {
+            extras = new Bundle(1);
+            extras.putInt(DocumentsContract.EXTRA_ORIENTATION, orientation);
+        } else {
+            extras = null;
+        }
+
+        return new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UNKNOWN_LENGTH, extras);
     }
 
     private interface VideosBucketThumbnailQuery {
@@ -882,4 +894,30 @@
 
         return afd;
     }
+
+    private interface ImageOrientationQuery {
+        final String[] PROJECTION = new String[] {
+                ImageColumns.ORIENTATION };
+
+        final int ORIENTATION = 0;
+    }
+
+    private int queryOrientationForImage(long id, CancellationSignal signal) {
+        final ContentResolver resolver = getContext().getContentResolver();
+
+        Cursor cursor = null;
+        try {
+            cursor = resolver.query(Images.Media.EXTERNAL_CONTENT_URI,
+                    ImageOrientationQuery.PROJECTION, ImageColumns._ID + "=" + id, null, null,
+                    signal);
+            if (cursor.moveToFirst()) {
+                return cursor.getInt(ImageOrientationQuery.ORIENTATION);
+            } else {
+                Log.w(TAG, "Missing orientation data for " + id);
+                return 0;
+            }
+        } finally {
+            IoUtils.closeQuietly(cursor);
+        }
+    }
 }