Эх сурвалжийг харах

Merge branch 'master' into removeGCMagain

Tobias Kaminsky 7 жил өмнө
parent
commit
33af68536a
29 өөрчлөгдсөн 161 нэмэгдсэн , 89 устгасан
  1. 1 1
      README.md
  2. 1 1
      scripts/lint/lint-results.txt
  3. 27 27
      src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
  4. 3 3
      src/main/java/com/owncloud/android/authentication/SsoWebViewClient.java
  5. 9 5
      src/main/java/com/owncloud/android/datamodel/MediaProvider.java
  6. 5 0
      src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
  7. 1 1
      src/main/java/com/owncloud/android/db/ProviderMeta.java
  8. 74 12
      src/main/java/com/owncloud/android/providers/FileContentProvider.java
  9. 6 1
      src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
  10. 1 1
      src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java
  11. 29 33
      src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java
  12. 4 4
      src/main/java/com/owncloud/android/utils/glide/HttpStreamFetcher.java
  13. BIN
      src/main/res/drawable-hdpi/ic_synced.png
  14. BIN
      src/main/res/drawable-hdpi/ic_synchronizing.png
  15. BIN
      src/main/res/drawable-hdpi/ic_synchronizing_error.png
  16. BIN
      src/main/res/drawable-mdpi/ic_synced.png
  17. BIN
      src/main/res/drawable-mdpi/ic_synchronizing.png
  18. BIN
      src/main/res/drawable-mdpi/ic_synchronizing_error.png
  19. BIN
      src/main/res/drawable-xhdpi/ic_synced.png
  20. BIN
      src/main/res/drawable-xhdpi/ic_synchronizing.png
  21. BIN
      src/main/res/drawable-xhdpi/ic_synchronizing_error.png
  22. BIN
      src/main/res/drawable-xxhdpi/ic_synced.png
  23. BIN
      src/main/res/drawable-xxhdpi/ic_synchronizing.png
  24. BIN
      src/main/res/drawable-xxhdpi/ic_synchronizing_error.png
  25. BIN
      src/main/res/drawable-xxxhdpi/ic_synced.png
  26. BIN
      src/main/res/drawable-xxxhdpi/ic_synchronizing.png
  27. BIN
      src/main/res/drawable-xxxhdpi/ic_synchronizing_error.png
  28. BIN
      src/main/res/drawable/ic_synchronizing.png
  29. BIN
      src/main/res/drawable/ic_synchronizing_error.png

+ 1 - 1
README.md

@@ -1,4 +1,4 @@
-# [Nextcloud](https://nextcloud.com) Android app [![Build Status](https://drone.nextcloud.com/api/badges/nextcloud/android/status.svg)](https://drone.nextcloud.com/nextcloud/android) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/80401cb343854343b4d94acbfb72d3ec)](https://www.codacy.com/app/Nextcloud/android?utm_source=github.com&utm_medium=referral&utm_content=nextcloud/android&utm_campaign=Badge_Grade)
+# [Nextcloud](https://nextcloud.com) Android app [![Build Status](https://drone.nextcloud.com/api/badges/nextcloud/android/status.svg)](https://drone.nextcloud.com/nextcloud/android) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/80401cb343854343b4d94acbfb72d3ec)](https://www.codacy.com/app/Nextcloud/android?utm_source=github.com&utm_medium=referral&utm_content=nextcloud/android&utm_campaign=Badge_Grade) [![Releases](https://img.shields.io/github/release/nextcloud/android.svg)](https://github.com/nextcloud/android/releases/latest)
 
 [<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png" 
       alt="Download from Google Play" 

+ 1 - 1
scripts/lint/lint-results.txt

@@ -1,2 +1,2 @@
 DO NOT TOUCH; GENERATED BY DRONE
-      <span class="mdl-layout-title">Lint Report: 1 error and 581 warnings</span>
+      <span class="mdl-layout-title">Lint Report: 1 error and 576 warnings</span>

+ 27 - 27
src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java

@@ -52,7 +52,6 @@ import android.content.pm.ActivityInfo;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import android.net.http.SslCertificate;
 import android.net.http.SslError;
 import android.os.Build;
 import android.os.Bundle;
@@ -69,6 +68,7 @@ import android.text.Editable;
 import android.text.InputType;
 import android.text.TextUtils;
 import android.text.TextWatcher;
+import android.util.AndroidRuntimeException;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
@@ -123,10 +123,6 @@ import com.owncloud.android.ui.dialog.SslUntrustedCertDialog.OnSslUntrustedCertL
 import com.owncloud.android.utils.AnalyticsUtils;
 import com.owncloud.android.utils.DisplayUtils;
 
-import java.io.ByteArrayInputStream;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 import java.util.HashMap;
 import java.util.Map;
@@ -345,13 +341,17 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
     }
 
     private void deleteCookies() {
-        CookieSyncManager.createInstance(this);
-        CookieManager cookieManager = CookieManager.getInstance();
+        try {
+            CookieSyncManager.createInstance(this);
+            CookieManager cookieManager = CookieManager.getInstance();
 
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            cookieManager.removeAllCookies(null);
-        } else {
-            cookieManager.removeAllCookie();
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+                cookieManager.removeAllCookies(null);
+            } else {
+                cookieManager.removeAllCookie();
+            }
+        } catch (AndroidRuntimeException e) {
+            Log_OC.e(TAG, e.getMessage());
         }
     }
 
@@ -400,13 +400,13 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
 
             @Override
             public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
-                Certificate cert = getX509Certificate(error.getCertificate());
+                X509Certificate cert = SsoWebViewClient.getX509CertificateFromError(error);
 
                 try {
                     if (cert != null && NetworkUtils.isCertInKnownServersStore(cert, getApplicationContext())) {
                         handler.proceed();
                     } else {
-                        handler.cancel();
+                        showUntrustedCertDialog(cert, error, handler);
                     }
                 } catch (Exception e) {
                     Log_OC.e(TAG, "Cert could not be verified");
@@ -421,20 +421,20 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
         });
     }
 
-    private Certificate getX509Certificate(SslCertificate sslCertificate) {
-        Bundle bundle = SslCertificate.saveState(sslCertificate);
-        byte[] bytes = bundle.getByteArray("x509-certificate");
-        if (bytes == null) {
-            return null;
-        } else {
-            try {
-                CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
-                return certFactory.generateCertificate(new ByteArrayInputStream(bytes));
-            } catch (CertificateException e) {
-                return null;
-            }
-        }
-    }
+//    private Certificate getX509Certificate(SslCertificate sslCertificate) {
+//        Bundle bundle = SslCertificate.saveState(sslCertificate);
+//        byte[] bytes = bundle.getByteArray("x509-certificate");
+//        if (bytes == null) {
+//            return null;
+//        } else {
+//            try {
+//                CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+//                return certFactory.generateCertificate(new ByteArrayInputStream(bytes));
+//            } catch (CertificateException e) {
+//                return null;
+//            }
+//        }
+//    }
 
     private void parseAndLoginFromWebView(String dataString) {
         String prefix = getString(R.string.login_data_own_scheme) + PROTOCOL_SUFFIX + "login/";

+ 3 - 3
src/main/java/com/owncloud/android/authentication/SsoWebViewClient.java

@@ -63,7 +63,7 @@ public class SsoWebViewClient extends WebViewClient {
     private String mLastReloadedUrlAtError;
     
     public interface SsoWebViewClientListener {
-        public void onSsoFinished(String sessionCookie);
+        void onSsoFinished(String sessionCookie);
     }
 
     public SsoWebViewClient (Context context, Handler listenerHandler, SsoWebViewClientListener listener) {
@@ -148,7 +148,7 @@ public class SsoWebViewClient extends WebViewClient {
         
         if (x509Certificate != null) {
             try {
-                isKnownServer = NetworkUtils.isCertInKnownServersStore((Certificate) x509Certificate, mContext);
+                isKnownServer = NetworkUtils.isCertInKnownServersStore(x509Certificate, mContext);
             } catch (Exception e) {
                 Log_OC.e(TAG, "Exception: " + e.getMessage());
             }
@@ -166,7 +166,7 @@ public class SsoWebViewClient extends WebViewClient {
      * @param   error     SslError
      * @return  X509Certificate from error
      */
-    public X509Certificate getX509CertificateFromError (SslError error) {
+    public static X509Certificate getX509CertificateFromError(SslError error) {
         Bundle bundle = SslCertificate.saveState(error.getCertificate());
         X509Certificate x509Certificate;
         byte[] bytes = bundle.getByteArray("x509-certificate");

+ 9 - 5
src/main/java/com/owncloud/android/datamodel/MediaProvider.java

@@ -128,7 +128,8 @@ public class MediaProvider {
                         filePath = cursorImages.getString(cursorImages.getColumnIndexOrThrow(
                                 MediaStore.MediaColumns.DATA));
 
-                        if (filePath != null) {
+                        // check if valid path
+                        if (filePath != null && filePath.lastIndexOf("/") > 0) {
                             mediaFolder.filePaths.add(filePath);
                             mediaFolder.absolutePath = filePath.substring(0, filePath.lastIndexOf("/"));
                         }
@@ -136,7 +137,7 @@ public class MediaProvider {
                     cursorImages.close();
 
                     // only do further work if folder is not within the Nextcloud app itself
-                    if (!mediaFolder.absolutePath.startsWith(dataPath)) {
+                    if (mediaFolder.absolutePath != null && !mediaFolder.absolutePath.startsWith(dataPath)) {
 
                         // count images
                         Cursor count = contentResolver.query(
@@ -224,13 +225,16 @@ public class MediaProvider {
                     while (cursorImages.moveToNext()) {
                         filePath = cursorImages.getString(cursorImages.getColumnIndexOrThrow(
                                 MediaStore.MediaColumns.DATA));
-                        mediaFolder.filePaths.add(filePath);
-                        mediaFolder.absolutePath = filePath.substring(0, filePath.lastIndexOf("/"));
+
+                        if (filePath != null) {
+                            mediaFolder.filePaths.add(filePath);
+                            mediaFolder.absolutePath = filePath.substring(0, filePath.lastIndexOf("/"));
+                        }
                     }
                     cursorImages.close();
 
                     // only do further work if folder is not within the Nextcloud app itself
-                    if (!mediaFolder.absolutePath.startsWith(dataPath)) {
+                    if (mediaFolder.absolutePath != null && !mediaFolder.absolutePath.startsWith(dataPath)) {
 
                         // count images
                         Cursor count = contentResolver.query(

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

@@ -43,6 +43,7 @@ import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 import com.owncloud.android.ui.adapter.DiskLruImageCache;
@@ -352,6 +353,10 @@ public class ThumbnailsCacheManager {
                                 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();

+ 1 - 1
src/main/java/com/owncloud/android/db/ProviderMeta.java

@@ -32,7 +32,7 @@ import com.owncloud.android.MainApp;
 public class ProviderMeta {
 
     public static final String DB_NAME = "filelist";
-    public static final int DB_VERSION = 23;
+    public static final int DB_VERSION = 24;
 
     private ProviderMeta() {
     }

+ 74 - 12
src/main/java/com/owncloud/android/providers/FileContentProvider.java

@@ -43,7 +43,6 @@ import android.text.TextUtils;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.db.ProviderMeta;
 import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
 import com.owncloud.android.lib.common.accounts.AccountUtils;
@@ -1067,19 +1066,34 @@ public class FileContentProvider extends ContentProvider {
                 db.beginTransaction();
                 try {
                     // add type column default being CUSTOM (0)
-                    Log_OC.i(SQL, "Add type column and default value 0 (CUSTOM) to synced_folders table");
-                    db.execSQL(ALTER_TABLE + ProviderTableMeta.SYNCED_FOLDERS_TABLE_NAME +
-                            ADD_COLUMN + ProviderTableMeta.SYNCED_FOLDER_TYPE +
-                            " INTEGER " + " DEFAULT 0");
+                    if (!checkIfColumnExists(db, ProviderTableMeta.SYNCED_FOLDERS_TABLE_NAME,
+                            ProviderTableMeta.SYNCED_FOLDER_TYPE)) {
+                        Log_OC.i(SQL, "Add type column and default value 0 (CUSTOM) to synced_folders table");
+                        db.execSQL(ALTER_TABLE + ProviderTableMeta.SYNCED_FOLDERS_TABLE_NAME +
+                                ADD_COLUMN + ProviderTableMeta.SYNCED_FOLDER_TYPE +
+                                " INTEGER " + " DEFAULT 0");
+                    } else {
+                        Log_OC.i(SQL, "Type column of synced_folders table already exists");
+                    }
 
-                    Log_OC.i(SQL, "Add charging and wifi columns to uploads");
-                    db.execSQL(ALTER_TABLE + ProviderTableMeta.UPLOADS_TABLE_NAME +
-                            ADD_COLUMN + ProviderTableMeta.UPLOADS_IS_WIFI_ONLY +
-                            " INTEGER " + " DEFAULT 0");
+                    if (!checkIfColumnExists(db, ProviderTableMeta.SYNCED_FOLDERS_TABLE_NAME,
+                            ProviderTableMeta.UPLOADS_IS_WIFI_ONLY)) {
+                        Log_OC.i(SQL, "Add charging and wifi columns to uploads");
+                        db.execSQL(ALTER_TABLE + ProviderTableMeta.UPLOADS_TABLE_NAME +
+                                ADD_COLUMN + ProviderTableMeta.UPLOADS_IS_WIFI_ONLY +
+                                " INTEGER " + " DEFAULT 0");
+                    } else {
+                        Log_OC.i(SQL, "Wifi column of synced_folders table already exists");
+                    }
 
-                    db.execSQL(ALTER_TABLE + ProviderTableMeta.UPLOADS_TABLE_NAME +
-                            ADD_COLUMN + ProviderTableMeta.UPLOADS_IS_WHILE_CHARGING_ONLY +
-                            " INTEGER " + " DEFAULT 0");
+                    if (!checkIfColumnExists(db, ProviderTableMeta.SYNCED_FOLDERS_TABLE_NAME,
+                            ProviderTableMeta.UPLOADS_IS_WHILE_CHARGING_ONLY)) {
+                        db.execSQL(ALTER_TABLE + ProviderTableMeta.UPLOADS_TABLE_NAME +
+                                ADD_COLUMN + ProviderTableMeta.UPLOADS_IS_WHILE_CHARGING_ONLY +
+                                " INTEGER " + " DEFAULT 0");
+                    } else {
+                        Log_OC.i(SQL, "Charging column of synced_folders table already exists");
+                    }
 
                     // create Filesystem table
                     Log_OC.i(SQL, "Create filesystem table");
@@ -1097,10 +1111,58 @@ public class FileContentProvider extends ContentProvider {
                 if (!upgraded) {
                     Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion));
                 }
+
+                if (oldVersion < 24 && newVersion >= 24) {
+                    Log_OC.i(SQL, "Entering in the #24 Re-adding user theming to capabilities table");
+                    db.beginTransaction();
+                    try {
+                        if (!checkIfColumnExists(db, ProviderTableMeta.CAPABILITIES_TABLE_NAME,
+                                ProviderTableMeta.CAPABILITIES_SERVER_NAME)) {
+                            db.execSQL(ALTER_TABLE + ProviderTableMeta.CAPABILITIES_TABLE_NAME +
+                                    ADD_COLUMN + ProviderTableMeta.CAPABILITIES_SERVER_NAME + " TEXT ");
+                        }
+
+                        if (!checkIfColumnExists(db, ProviderTableMeta.CAPABILITIES_TABLE_NAME,
+                                ProviderTableMeta.CAPABILITIES_SERVER_COLOR)) {
+                            db.execSQL(ALTER_TABLE + ProviderTableMeta.CAPABILITIES_TABLE_NAME +
+                                    ADD_COLUMN + ProviderTableMeta.CAPABILITIES_SERVER_COLOR + " TEXT ");
+                        }
+
+                        if (!checkIfColumnExists(db, ProviderTableMeta.CAPABILITIES_TABLE_NAME,
+                                ProviderTableMeta.CAPABILITIES_SERVER_BACKGROUND_URL)) {
+                            db.execSQL(ALTER_TABLE + ProviderTableMeta.CAPABILITIES_TABLE_NAME +
+                                    ADD_COLUMN + ProviderTableMeta.CAPABILITIES_SERVER_BACKGROUND_URL + " TEXT ");
+                        }
+
+                        if (!checkIfColumnExists(db, ProviderTableMeta.CAPABILITIES_TABLE_NAME,
+                                ProviderTableMeta.CAPABILITIES_SERVER_SLOGAN)) {
+                            db.execSQL(ALTER_TABLE + ProviderTableMeta.CAPABILITIES_TABLE_NAME +
+                                    ADD_COLUMN + ProviderTableMeta.CAPABILITIES_SERVER_SLOGAN + " TEXT ");
+                        }
+
+                        upgraded = true;
+                        db.setTransactionSuccessful();
+                    } finally {
+                        db.endTransaction();
+                    }
+                }
+
+                if (!upgraded) {
+                    Log_OC.i(SQL, String.format(Locale.ENGLISH, UPGRADE_VERSION_MSG, oldVersion, newVersion));
+                }
             }
         }
     }
 
+    private boolean checkIfColumnExists(SQLiteDatabase database, String table, String column) {
+        Cursor cursor = database.rawQuery("SELECT * FROM " + table + " LIMIT 0", null);
+        boolean exists = cursor.getColumnIndex(column) != -1;
+
+        cursor.close();
+
+        return exists;
+    }
+
     private void createFilesTable(SQLiteDatabase db) {
 
         db.execSQL("CREATE TABLE " + ProviderTableMeta.FILE_TABLE_NAME + "("

+ 6 - 1
src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -1282,7 +1282,12 @@ public class FileDisplayActivity extends HookActivity
                 // avoid app crashes after changing the serial id of RemoteOperationResult
                 // in owncloud library with broadcast notifications pending to process
                 removeStickyBroadcast(intent);
-                DataHolderUtil.getInstance().delete(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT));
+
+                try {
+                    DataHolderUtil.getInstance().delete(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT));
+                } catch (RuntimeException re) {
+                    // we did not send this intent, so ignoring
+                }
             }
         }
     }

+ 1 - 1
src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java

@@ -298,7 +298,7 @@ public class UserInfoActivity extends FileActivity {
                             .error(R.drawable.background)
                             .crossFade()
                             .into(target);
-                } else {
+                } else if (!background.isEmpty()) {
                     // plain color
                     int color = Color.parseColor(background);
                     appBar.setBackgroundColor(color);

+ 29 - 33
src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java

@@ -75,8 +75,8 @@ import java.util.List;
 
 public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 
-    public static final int HEADER_TYPE = 100;
-    public static final int ACTIVITY_TYPE = 101;
+    private static final int HEADER_TYPE = 100;
+    private static final int ACTIVITY_TYPE = 101;
     private final ActivityListInterface activityListInterface;
     private final int px;
     private static final String TAG = ActivityListAdapter.class.getSimpleName();
@@ -101,7 +101,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
         String sTime = "";
         for (Object o : activityItems) {
             Activity activity = (Activity) o;
-            String time = null;
+            String time;
             if (activity.getDatetime() != null) {
                 time = DisplayUtils.getRelativeTimestamp(context,
                         activity.getDatetime().getTime()).toString();
@@ -182,18 +182,15 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
                 activityViewHolder.list.setVisibility(View.VISIBLE);
                 activityViewHolder.list.removeAllViews();
 
-                activityViewHolder.list.post(new Runnable() {
-                    @Override
-                    public void run() {
-                        int w = activityViewHolder.list.getMeasuredWidth();
-                        int elPxSize = px + 20;
-                        int totalColumnCount = (int) Math.floor(w / elPxSize);
-
-                        try {
-                            activityViewHolder.list.setColumnCount(totalColumnCount);
-                        } catch (IllegalArgumentException e) {
-                            Log_OC.e(TAG, "error setting column count to " + totalColumnCount);
-                        }
+                activityViewHolder.list.post(() -> {
+                    int w = activityViewHolder.list.getMeasuredWidth();
+                    int elPxSize = px + 20;
+                    int totalColumnCount = (int) Math.floor(w / elPxSize);
+
+                    try {
+                        activityViewHolder.list.setColumnCount(totalColumnCount);
+                    } catch (IllegalArgumentException e) {
+                        Log_OC.e(TAG, "error setting column count to " + totalColumnCount);
                     }
                 });
 
@@ -231,12 +228,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
         params.setMargins(10, 10, 10, 10);
         ImageView imageView = new ImageView(context);
         imageView.setLayoutParams(params);
-        imageView.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                activityListInterface.onActivityClicked(richObject);
-            }
-        });
+        imageView.setOnClickListener(v -> activityListInterface.onActivityClicked(richObject));
         setBitmap(file, imageView);
 
         return imageView;
@@ -246,11 +238,19 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
         // No Folder
         if (!file.isFolder()) {
             if ((MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file))) {
-                String uri = mClient.getBaseUri() + "" +
-                        "/index.php/apps/files/api/v1/thumbnail/" +
-                        px + "/" + px + Uri.encode(file.getRemotePath(), "/");
+                int placeholder;
 
-                Glide.with(context).using(new CustomGlideStreamLoader()).load(uri).into(fileIcon); //Using custom fetcher
+                if (MimeTypeUtil.isImage(file)) {
+                    placeholder = R.drawable.file_image;
+                } else {
+                    placeholder = R.drawable.file_movie;
+                }
+
+                String uri = mClient.getBaseUri() + "/index.php/apps/files/api/v1/thumbnail/" + px + "/" + px +
+                        Uri.encode(file.getRemotePath(), "/");
+
+                Glide.with(context).using(new CustomGlideStreamLoader()).load(uri).placeholder(placeholder)
+                        .error(placeholder).into(fileIcon); // using custom fetcher
 
             } else {
                 fileIcon.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimetype(), file.getFileName(), null));
@@ -258,11 +258,8 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
         } else {
             // Folder
             fileIcon.setImageDrawable(
-                    MimeTypeUtil.getFolderTypeIcon(
-                            file.isSharedWithMe() || file.isSharedWithSharee(),
-                            file.isSharedViaLink()
-                    )
-            );
+                    MimeTypeUtil.getFolderTypeIcon(file.isSharedWithMe() || file.isSharedWithSharee(),
+                            file.isSharedViaLink()));
         }
     }
 
@@ -278,8 +275,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
                 .placeholder(R.drawable.ic_activity)
                 .error(R.drawable.ic_activity)
                 .animate(android.R.anim.fade_in)
-                .listener(new SvgSoftwareLayerSetter<Uri>());
-
+                .listener(new SvgSoftwareLayerSetter<>());
 
         Uri uri = Uri.parse(icon);
         requestBuilder
@@ -319,7 +315,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
         return ssb;
     }
 
-    public RichObject searchObjectByName(ArrayList<RichObject> richObjectList, String name) {
+    private RichObject searchObjectByName(ArrayList<RichObject> richObjectList, String name) {
         for (RichObject richObject : richObjectList) {
             if (richObject.getTag().equalsIgnoreCase(name))
                 return richObject;

+ 4 - 4
src/main/java/com/owncloud/android/utils/glide/HttpStreamFetcher.java

@@ -28,6 +28,7 @@ import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
+import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 
@@ -65,12 +66,11 @@ public class HttpStreamFetcher implements DataFetcher<InputStream> {
                 GetMethod get = null;
                 try {
                     get = new GetMethod(mURL);
-                    get.setRequestHeader("Cookie",
-                            "nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true");
+                    get.setRequestHeader("Cookie", "nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true");
+                    get.setRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE);
                     int status = mClient.executeMethod(get);
                     if (status == HttpStatus.SC_OK) {
-                        InputStream inputStream = get.getResponseBodyAsStream();
-                        return inputStream;
+                        return get.getResponseBodyAsStream();
                     } else {
                         mClient.exhaustResponse(get.getResponseBodyAsStream());
                     }

BIN
src/main/res/drawable-hdpi/ic_synced.png


BIN
src/main/res/drawable-hdpi/ic_synchronizing.png


BIN
src/main/res/drawable-hdpi/ic_synchronizing_error.png


BIN
src/main/res/drawable-mdpi/ic_synced.png


BIN
src/main/res/drawable-mdpi/ic_synchronizing.png


BIN
src/main/res/drawable-mdpi/ic_synchronizing_error.png


BIN
src/main/res/drawable-xhdpi/ic_synced.png


BIN
src/main/res/drawable-xhdpi/ic_synchronizing.png


BIN
src/main/res/drawable-xhdpi/ic_synchronizing_error.png


BIN
src/main/res/drawable-xxhdpi/ic_synced.png


BIN
src/main/res/drawable-xxhdpi/ic_synchronizing.png


BIN
src/main/res/drawable-xxhdpi/ic_synchronizing_error.png


BIN
src/main/res/drawable-xxxhdpi/ic_synced.png


BIN
src/main/res/drawable-xxxhdpi/ic_synchronizing.png


BIN
src/main/res/drawable-xxxhdpi/ic_synchronizing_error.png


BIN
src/main/res/drawable/ic_synchronizing.png


BIN
src/main/res/drawable/ic_synchronizing_error.png