瀏覽代碼

Merge pull request #9865 from nextcloud/centralizeThemeUtils

Cache capabilities
Álvaro Brey 3 年之前
父節點
當前提交
55c9811db6

+ 5 - 3
app/src/main/java/com/nextcloud/client/mixins/SessionMixin.kt

@@ -31,6 +31,7 @@ import com.nextcloud.java.util.Optional
 import com.owncloud.android.datamodel.FileDataStorageManager
 import com.owncloud.android.lib.resources.status.OCCapability
 import com.owncloud.android.ui.activity.BaseActivity
+import com.owncloud.android.utils.theme.CapabilityUtils
 
 /**
  * Session mixin collects all account / user handling logic currently
@@ -53,8 +54,10 @@ class SessionMixin constructor(
         private set
     var storageManager: FileDataStorageManager? = null
         private set
-    var capabilities: OCCapability? = null
-        private set
+    val capabilities: OCCapability?
+        get() = getUser()
+            .map { CapabilityUtils.getCapability(it, activity) }
+            .orElse(null)
 
     fun setAccount(account: Account?) {
         val validAccount = account != null && accountManager.setCurrentOwnCloudAccount(account.name)
@@ -67,7 +70,6 @@ class SessionMixin constructor(
         currentAccount?.let {
             val storageManager = FileDataStorageManager(getUser().get(), contentResolver)
             this.storageManager = storageManager
-            this.capabilities = storageManager.getCapability(it.name)
         }
     }
 

+ 4 - 0
app/src/main/java/com/owncloud/android/operations/GetCapabilitiesOperation.java

@@ -25,6 +25,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.resources.status.GetCapabilitiesRemoteOperation;
 import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.operations.common.SyncOperation;
+import com.owncloud.android.utils.theme.CapabilityUtils;
 
 /**
  * Get and save capabilities from the server
@@ -53,6 +54,9 @@ public class GetCapabilitiesOperation extends SyncOperation {
 
             // Save the capabilities into database
             storageManager.saveCapabilities(capability);
+
+            // update cached entry
+            CapabilityUtils.updateCapability(capability);
         }
 
         return result;

+ 6 - 8
app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -79,7 +79,6 @@ import com.owncloud.android.R;
 import com.owncloud.android.authentication.PassCodeManager;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
 import com.owncloud.android.datamodel.ExternalLinksProvider;
-import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.ExternalLink;
 import com.owncloud.android.lib.common.ExternalLinkType;
@@ -112,6 +111,7 @@ import com.owncloud.android.utils.svg.MenuSimpleTarget;
 import com.owncloud.android.utils.svg.SVGorImage;
 import com.owncloud.android.utils.svg.SvgOrImageBitmapTranscoder;
 import com.owncloud.android.utils.svg.SvgOrImageDecoder;
+import com.owncloud.android.utils.theme.CapabilityUtils;
 import com.owncloud.android.utils.theme.ThemeBarUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeDrawableUtils;
@@ -300,9 +300,9 @@ public abstract class DrawerActivity extends ToolbarActivity
 
     public void updateHeader() {
         if (getAccount() != null &&
-            getStorageManager().getCapability(getAccount().name).getServerBackground() != null) {
+            getCapabilities().getServerBackground() != null) {
 
-            OCCapability capability = getStorageManager().getCapability(getAccount().name);
+            OCCapability capability = getCapabilities();
             String logo = capability.getServerLogo();
             int primaryColor = ThemeColorUtils.primaryColor(getAccount(), false, this);
 
@@ -403,9 +403,7 @@ public abstract class DrawerActivity extends ToolbarActivity
     }
 
     private void filterDrawerMenu(final Menu menu, @NonNull final User user) {
-        FileDataStorageManager storageManager = new FileDataStorageManager(user,
-                                                                           getContentResolver());
-        OCCapability capability = storageManager.getCapability(user.getAccountName());
+        OCCapability capability = getCapabilities();
 
         DrawerMenuUtil.filterSearchMenuItems(menu, user, getResources());
         DrawerMenuUtil.filterTrashbinMenuItem(menu, capability);
@@ -1136,8 +1134,8 @@ public abstract class DrawerActivity extends ToolbarActivity
                 }
 
                 User user = accountManager.getUser();
-                String name = user.getAccountName();
-                if (getStorageManager() != null && getStorageManager().getCapability(name).getExternalLinks().isTrue()) {
+                if (getStorageManager() != null && CapabilityUtils.getCapability(user, this)
+                    .getExternalLinks().isTrue()) {
 
                     int count = arbitraryDataProvider.getIntegerValue(FilesSyncHelper.GLOBAL,
                                                                       FileActivity.APP_OPENED_COUNT);

+ 2 - 1
app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java

@@ -83,6 +83,7 @@ import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
+import com.owncloud.android.utils.theme.CapabilityUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
@@ -838,7 +839,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 
         if (updatedStorageManager != null && !updatedStorageManager.equals(mStorageManager)) {
             mStorageManager = updatedStorageManager;
-            showShareAvatar = mStorageManager.getCapability(account.getAccountName()).getVersion().isShareesOnDavSupported();
+            showShareAvatar = CapabilityUtils.getCapability(account, activity).getVersion().isShareesOnDavSupported();
             this.user = account;
         }
         if (mStorageManager != null) {

+ 46 - 2
app/src/main/java/com/owncloud/android/utils/theme/CapabilityUtils.java

@@ -22,17 +22,24 @@
  */
 package com.owncloud.android.utils.theme;
 
+import android.accounts.Account;
 import android.content.Context;
 
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManagerImpl;
+import com.nextcloud.java.util.Optional;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.lib.resources.status.OCCapability;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Utility class with methods for client side button theming.
  */
 public final class CapabilityUtils {
+    private static final Map<String, OCCapability> cachedCapabilities = new HashMap<>();
+
     public static OCCapability getCapability(Context context) {
         User user = null;
         if (context != null) {
@@ -41,10 +48,47 @@ public final class CapabilityUtils {
         }
 
         if (user != null) {
-            FileDataStorageManager storageManager = new FileDataStorageManager(user, context.getContentResolver());
-            return storageManager.getCapability(user.getAccountName());
+            return getCapability(user, context);
         } else {
             return new OCCapability();
         }
     }
+
+    /**
+     * @deprecated use {@link #getCapability(User, Context)} instead
+     */
+    @Deprecated
+    public static OCCapability getCapability(Account acc, Context context) {
+        Optional<User> user = Optional.empty();
+
+        if (acc != null) {
+            user = UserAccountManagerImpl.fromContext(context).getUser(acc.name);
+        } else if (context != null) {
+            // TODO: refactor when dark theme work is completed
+            user = Optional.of(UserAccountManagerImpl.fromContext(context).getUser());
+        }
+
+        if (user.isPresent()) {
+            return getCapability(user.get(), context);
+        } else {
+            return new OCCapability();
+        }
+    }
+
+    public static OCCapability getCapability(User user, Context context) {
+        OCCapability capability = cachedCapabilities.get(user.getAccountName());
+
+        if (capability == null) {
+            FileDataStorageManager storageManager = new FileDataStorageManager(user, context.getContentResolver());
+            capability = storageManager.getCapability(user.getAccountName());
+
+            cachedCapabilities.put(capability.getAccountName(), capability);
+        }
+
+        return capability;
+    }
+
+    public static void updateCapability(OCCapability capability) {
+        cachedCapabilities.put(capability.getAccountName(), capability);
+    }
 }

+ 10 - 34
app/src/main/java/com/owncloud/android/utils/theme/ThemeColorUtils.java

@@ -28,10 +28,7 @@ import android.content.res.Configuration;
 import android.graphics.Color;
 
 import com.nextcloud.client.account.User;
-import com.nextcloud.client.account.UserAccountManagerImpl;
-import com.nextcloud.java.util.Optional;
 import com.owncloud.android.R;
-import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.lib.resources.status.OCCapability;
 
 import androidx.appcompat.app.AppCompatDelegate;
@@ -39,9 +36,9 @@ import androidx.core.content.ContextCompat;
 import androidx.core.graphics.ColorUtils;
 
 /**
- * Utility class with methods for theming related .
+ * Utility class with methods for theming related.
  */
-public final class ThemeColorUtils {
+public class ThemeColorUtils {
 
     private static final int INDEX_LUMINATION = 2;
     private static final double MAX_LIGHTNESS = 0.92;
@@ -52,7 +49,7 @@ public final class ThemeColorUtils {
     }
 
     public static int primaryAccentColor(Context context) {
-        OCCapability capability = getCapability(context);
+        OCCapability capability = CapabilityUtils.getCapability(context);
 
         try {
             float adjust;
@@ -72,7 +69,7 @@ public final class ThemeColorUtils {
     }
 
     public static int primaryDarkColor(Account account, Context context) {
-        OCCapability capability = getCapability(account, context);
+        OCCapability capability = CapabilityUtils.getCapability(account, context);
 
         try {
             return calculateDarkColor(Color.parseColor(capability.getServerColor()), context);
@@ -129,7 +126,7 @@ public final class ThemeColorUtils {
         }
 
         try {
-            int color = Color.parseColor(getCapability(account, context).getServerColor());
+            int color = Color.parseColor(CapabilityUtils.getCapability(account, context).getServerColor());
             if (replaceEdgeColors) {
                 if (isDarkModeActive(context)) {
                     if (Color.BLACK == color) {
@@ -165,7 +162,8 @@ public final class ThemeColorUtils {
     }
 
     public static boolean themingEnabled(Context context) {
-        return getCapability(context).getServerColor() != null && !getCapability(context).getServerColor().isEmpty();
+        return CapabilityUtils.getCapability(context).getServerColor() != null &&
+            !CapabilityUtils.getCapability(context).getServerColor().isEmpty();
     }
 
     /**
@@ -186,7 +184,7 @@ public final class ThemeColorUtils {
         }
 
         try {
-            return Color.parseColor(getCapability(context).getServerTextColor());
+            return Color.parseColor(CapabilityUtils.getCapability(context).getServerTextColor());
         } catch (Exception e) {
             if (darkTheme(context)) {
                 return Color.WHITE;
@@ -286,28 +284,6 @@ public final class ThemeColorUtils {
         }
     }
 
-    private static OCCapability getCapability(Context context) {
-        return getCapability(null, context);
-    }
-
-    private static OCCapability getCapability(Account acc, Context context) {
-        Optional<User> user = Optional.empty();
-
-        if (acc != null) {
-            user = UserAccountManagerImpl.fromContext(context).getUser(acc.name);
-        } else if (context != null) {
-            // TODO: refactor when dark theme work is completed
-            user = Optional.of(UserAccountManagerImpl.fromContext(context).getUser());
-        }
-
-        if (user.isPresent()) {
-            FileDataStorageManager storageManager = new FileDataStorageManager(user.get(), context.getContentResolver());
-            return storageManager.getCapability(user.get().getAccountName());
-        } else {
-            return new OCCapability();
-        }
-    }
-
     public static boolean isDarkModeActive(Context context) {
         int nightModeFlag = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
 
@@ -320,7 +296,7 @@ public final class ThemeColorUtils {
 
     public static int unchangedPrimaryColor(Account account, Context context) {
         try {
-            return Color.parseColor(getCapability(account, context).getServerColor());
+            return Color.parseColor(CapabilityUtils.getCapability(account, context).getServerColor());
         } catch (Exception e) {
             return context.getResources().getColor(R.color.primary);
         }
@@ -328,7 +304,7 @@ public final class ThemeColorUtils {
 
     public static int unchangedFontColor(Context context) {
         try {
-            return Color.parseColor(getCapability(context).getServerTextColor());
+            return Color.parseColor(CapabilityUtils.getCapability(context).getServerTextColor());
         } catch (Exception e) {
             if (darkTheme(context)) {
                 return Color.WHITE;

+ 1 - 1
scripts/analysis/findbugs-results.txt

@@ -1 +1 @@
-627
+628