Browse Source

show thumbnail, if available, else fetch from server

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
tobiasKaminsky 6 years ago
parent
commit
13a29ebc10

+ 53 - 0
src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java

@@ -193,6 +193,10 @@ public final class ThumbnailsCacheManager {
         }
     }
 
+    public static boolean containsBitmap(String key) {
+        return mThumbnailCache.containsKey(key);
+    }
+
     public static Bitmap getBitmapFromDiskCache(String key) {
         synchronized (mThumbnailsDiskCacheLock) {
             // Wait while disk cache is started from background thread
@@ -1166,4 +1170,53 @@ public final class ThumbnailsCacheManager {
             addThumbnailToCache(imageKey, bitmap, file.getStoragePath(), pxW, pxH);
         }
     }
+
+    public static void generateThumbnailFromOCFile(OCFile file) {
+        int pxW;
+        int pxH;
+        pxW = pxH = getThumbnailDimension();
+        String imageKey = PREFIX_THUMBNAIL + String.valueOf(file.getRemoteId());
+
+        GetMethod getMethod = null;
+
+        try {
+            Bitmap thumbnail = null;
+
+            String uri = mClient.getBaseUri() + "/index.php/apps/files/api/v1/thumbnail/" +
+                pxW + "/" + pxH + Uri.encode(file.getRemotePath(), "/");
+
+            Log_OC.d(TAG, "generate thumbnail: " + file.getFileName() + " URI: " + uri);
+            getMethod = new GetMethod(uri);
+            getMethod.setRequestHeader("Cookie", "nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true");
+
+            getMethod.setRequestHeader(RemoteOperation.OCS_API_HEADER,
+                                       RemoteOperation.OCS_API_HEADER_VALUE);
+
+            int status = mClient.executeMethod(getMethod);
+            if (status == HttpStatus.SC_OK) {
+                InputStream inputStream = getMethod.getResponseBodyAsStream();
+                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
+                thumbnail = ThumbnailUtils.extractThumbnail(bitmap, pxW, pxH);
+            } else {
+                mClient.exhaustResponse(getMethod.getResponseBodyAsStream());
+            }
+
+            // Add thumbnail to cache
+            if (thumbnail != null) {
+                // Handle PNG
+                if (file.getMimeType().equalsIgnoreCase(PNG_MIMETYPE)) {
+                    thumbnail = handlePNG(thumbnail, pxW, pxH);
+                }
+
+                Log_OC.d(TAG, "add thumbnail to cache: " + file.getFileName());
+                addBitmapToCache(imageKey, thumbnail);
+            }
+        } catch (Exception e) {
+            Log_OC.d(TAG, e.getMessage(), e);
+        } finally {
+            if (getMethod != null) {
+                getMethod.releaseConnection();
+            }
+        }
+    }
 }

+ 1 - 1
src/main/java/com/owncloud/android/providers/DiskLruImageCacheFileProvider.java

@@ -86,7 +86,7 @@ public class DiskLruImageCacheFileProvider extends ContentProvider {
 
             //Convert bitmap to byte array
             ByteArrayOutputStream bos = new ByteArrayOutputStream();
-            thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bos);
+            thumbnail.compress(Bitmap.CompressFormat.PNG, 90, bos);
             byte[] bitmapData = bos.toByteArray();
 
             //write the bytes in file

+ 18 - 5
src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java

@@ -32,6 +32,7 @@ import android.content.SharedPreferences;
 import android.content.res.AssetFileDescriptor;
 import android.database.Cursor;
 import android.graphics.Point;
+import android.net.Uri;
 import android.os.Build;
 import android.os.CancellationSignal;
 import android.os.Handler;
@@ -49,6 +50,7 @@ import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.files.services.FileDownloader;
 import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.lib.common.OwnCloudAccount;
@@ -67,6 +69,7 @@ import com.owncloud.android.operations.UploadFileOperation;
 import com.owncloud.android.ui.activity.ConflictsResolveActivity;
 import com.owncloud.android.ui.activity.Preferences;
 import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.UriUtils;
 
 import org.nextcloud.providers.cursors.FileCursor;
 import org.nextcloud.providers.cursors.RootCursor;
@@ -304,12 +307,22 @@ public class DocumentsStorageProvider extends DocumentsProvider {
             throw new FileNotFoundException("File with id " + documentId + " not found!");
         }
 
-        File realFile = new File(file.getStoragePath());
+        Context context = getContext();
+
+        if (context == null) {
+            throw new FileNotFoundException("Context may not be null!");
+        }
+
+        boolean exists = ThumbnailsCacheManager.containsBitmap(ThumbnailsCacheManager.PREFIX_THUMBNAIL
+                                                                   + file.getRemoteId());
+
+        if (!exists) {
+            ThumbnailsCacheManager.generateThumbnailFromOCFile(file);
+        }
 
-        return new AssetFileDescriptor(
-                ParcelFileDescriptor.open(realFile, ParcelFileDescriptor.MODE_READ_ONLY),
-                0,
-                AssetFileDescriptor.UNKNOWN_LENGTH);
+        Uri uri = Uri.parse(UriUtils.URI_CONTENT_SCHEME + context.getResources().getString(
+            R.string.image_cache_provider_authority) + file.getRemotePath());
+        return context.getContentResolver().openAssetFileDescriptor(uri, "r");
     }
 
     @Override

+ 2 - 2
src/main/java/com/owncloud/android/ui/adapter/DiskLruImageCache.java

@@ -108,7 +108,7 @@ public class DiskLruImageCache {
         Bitmap bitmap = null;
         DiskLruCache.Snapshot snapshot = null;
         String validKey = convertToValidKey(key);
-        
+
         try {
             snapshot = mDiskCache.get(validKey);
             if (snapshot == null) {
@@ -189,4 +189,4 @@ public class DiskLruImageCache {
             Log_OC.d(TAG, e.getMessage(), e);
         }
     }
-}
+}

+ 1 - 2
src/main/java/org/nextcloud/providers/cursors/FileCursor.java

@@ -48,10 +48,9 @@ public class FileCursor extends MatrixCursor {
 
         final int iconRes = MimeTypeUtil.getFileTypeIconId(file.getMimeType(), file.getFileName());
         final String mimeType = file.isFolder() ? Document.MIME_TYPE_DIR : file.getMimeType();
-        final String imagePath = MimeTypeUtil.isImage(file) && file.isDown() ? file.getStoragePath() : null;
         int flags = Document.FLAG_SUPPORTS_DELETE |
             Document.FLAG_SUPPORTS_WRITE |
-            (imagePath != null ? Document.FLAG_SUPPORTS_THUMBNAIL : 0);
+            (MimeTypeUtil.isImage(file) ? Document.FLAG_SUPPORTS_THUMBNAIL : 0);
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             flags = Document.FLAG_SUPPORTS_COPY | Document.FLAG_SUPPORTS_MOVE | Document.FLAG_SUPPORTS_REMOVE | flags;