Browse Source

fixing the thumbnail caching (user's name can be the same on two different servers), minor housekeeping for account name parsing

Andy Scherzinger 9 năm trước cách đây
mục cha
commit
ee71b38a84

+ 14 - 0
src/com/owncloud/android/authentication/AccountUtils.java

@@ -110,6 +110,20 @@ public class AccountUtils {
         }
         return false;
     }
+
+    /**
+     * returns the user's name based on the account name.
+     *
+     * @param accountName the account name
+     * @return the user's name
+     */
+    public static String getUsernameOfAccount(String accountName) {
+        if (accountName != null) {
+            return accountName.substring(0, accountName.lastIndexOf("@"));
+        } else {
+            return null;
+        }
+    }
     
     /**
      * Returns owncloud account identified by accountName or null if it does not exist.

+ 2 - 6
src/com/owncloud/android/datamodel/ThumbnailsCacheManager.java

@@ -32,8 +32,6 @@ import android.graphics.drawable.Drawable;
 import android.media.ThumbnailUtils;
 import android.net.Uri;
 import android.os.AsyncTask;
-import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
-import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
 import android.view.MenuItem;
 import android.widget.ImageView;
 
@@ -509,7 +507,7 @@ public class ThumbnailsCacheManager {
                         GetMethod get = null;
                         try {
                             String uri = mClient.getBaseUri() + "" +
-                                    "/index.php/avatar/" + username + "/" + px;
+                                    "/index.php/avatar/" + AccountUtils.getUsernameOfAccount(username) + "/" + px;
                             Log_OC.d("Avatar", "URI: " + uri);
                             get = new GetMethod(uri);
                             int status = mClient.executeMethod(get);
@@ -648,9 +646,7 @@ public class ThumbnailsCacheManager {
 
     public static AvatarGenerationTask getAvatarWorkerTask(ImageView imageView) {
         if (imageView != null) {
-            if (imageView != null) {
-                return getAvatarWorkerTask(imageView.getDrawable());
-            }
+            return getAvatarWorkerTask(imageView.getDrawable());
         }
         return null;
     }

+ 22 - 28
src/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -46,6 +46,7 @@ import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.TextDrawable;
+import com.owncloud.android.utils.BitmapUtils;
 
 /**
  * Base class to handle setup of the drawer implementation including user switching and avatar fetching and fallback
@@ -434,8 +435,7 @@ public abstract class DrawerActivity extends ToolbarActivity {
             TextView username = (TextView) findNavigationViewChildById(R.id.drawer_username);
             TextView usernameFull = (TextView) findNavigationViewChildById(R.id.drawer_username_full);
             usernameFull.setText(account.name);
-            int lastAtPos = account.name.lastIndexOf("@");
-            username.setText(account.name.substring(0, lastAtPos));
+            username.setText(AccountUtils.getUsernameOfAccount(account.name));
 
             setAvatar(account, R.id.drawer_current_account, true);
         }
@@ -450,23 +450,20 @@ public abstract class DrawerActivity extends ToolbarActivity {
      */
     private void setAvatar(Account account, int avatarViewId, boolean currentAccount) {
         if (mDrawerLayout != null && account != null) {
-            int lastAtPos = account.name.lastIndexOf("@");
-            String username = account.name.substring(0, lastAtPos);
 
             ImageView userIcon = (ImageView) findNavigationViewChildById(avatarViewId);
             userIcon.setContentDescription(account.name);
 
             // Thumbnail in Cache?
-            Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache("a_" + username);
+            Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache("a_" + account.name);
 
             if (thumbnail != null) {
-                RoundedBitmapDrawable roundedAvatar = RoundedBitmapDrawableFactory.create
-                        (MainApp.getAppContext().getResources(), thumbnail);
-                roundedAvatar.setCircular(true);
-                userIcon.setImageDrawable(roundedAvatar);
+                userIcon.setImageDrawable(
+                        BitmapUtils.bitmapToCircularBitmapDrawable(MainApp.getAppContext().getResources(), thumbnail)
+                );
             } else {
                 // generate new avatar
-                if (ThumbnailsCacheManager.cancelPotentialAvatarWork(username, userIcon)) {
+                if (ThumbnailsCacheManager.cancelPotentialAvatarWork(account.name, userIcon)) {
                     final ThumbnailsCacheManager.AvatarGenerationTask task =
                             new ThumbnailsCacheManager.AvatarGenerationTask(
                                     userIcon, getStorageManager(), account
@@ -499,12 +496,12 @@ public abstract class DrawerActivity extends ToolbarActivity {
                                         thumbnail,
                                         task
                                 );
-                        RoundedBitmapDrawable roundedAvatar = RoundedBitmapDrawableFactory.create
-                                (MainApp.getAppContext().getResources(), asyncDrawable.getBitmap());
-                        roundedAvatar.setCircular(true);
-                        userIcon.setImageDrawable(roundedAvatar);
+                        userIcon.setImageDrawable(
+                                BitmapUtils.bitmapToCircularBitmapDrawable(
+                                        MainApp.getAppContext().getResources(), asyncDrawable.getBitmap())
+                        );
                     }
-                    task.execute(username);
+                    task.execute(account.name);
                 }
             }
         }
@@ -518,20 +515,17 @@ public abstract class DrawerActivity extends ToolbarActivity {
      */
     private void setAvatar(Account account, MenuItem menuItem) {
         if (mDrawerLayout != null && account != null) {
-            int lastAtPos = account.name.lastIndexOf("@");
-            String username = account.name.substring(0, lastAtPos);
 
             // Thumbnail in Cache?
-            Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache("a_" + username);
+            Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache("a_" + account.name);
 
             if (thumbnail != null) {
-                RoundedBitmapDrawable roundedAvatar = RoundedBitmapDrawableFactory.create
-                        (MainApp.getAppContext().getResources(), thumbnail);
-                roundedAvatar.setCircular(true);
-                menuItem.setIcon(roundedAvatar);
+                menuItem.setIcon(
+                        BitmapUtils.bitmapToCircularBitmapDrawable(MainApp.getAppContext().getResources(), thumbnail)
+                );
             } else {
                 // generate new avatar
-                if (ThumbnailsCacheManager.cancelPotentialAvatarWork(username, menuItem)) {
+                if (ThumbnailsCacheManager.cancelPotentialAvatarWork(account.name, menuItem)) {
                     final ThumbnailsCacheManager.AvatarGenerationTask task =
                             new ThumbnailsCacheManager.AvatarGenerationTask(
                                     menuItem, getStorageManager(), account
@@ -555,12 +549,12 @@ public abstract class DrawerActivity extends ToolbarActivity {
                                         thumbnail,
                                         task
                                 );
-                        RoundedBitmapDrawable roundedAvatar = RoundedBitmapDrawableFactory.create
-                                (MainApp.getAppContext().getResources(), asyncDrawable.getBitmap());
-                        roundedAvatar.setCircular(true);
-                        menuItem.setIcon(roundedAvatar);
+                        menuItem.setIcon(
+                                BitmapUtils.bitmapToCircularBitmapDrawable(
+                                        MainApp.getAppContext().getResources(), asyncDrawable.getBitmap())
+                        );
                     }
-                    task.execute(username);
+                    task.execute(account.name);
                 }
             }
         }

+ 19 - 3
src/com/owncloud/android/utils/BitmapUtils.java

@@ -19,14 +19,18 @@
  */
 package com.owncloud.android.utils;
 
+import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.lib.common.utils.Log_OC;
 
+import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Matrix;
 import android.graphics.BitmapFactory.Options;
 import android.media.ExifInterface;
 import android.net.Uri;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
+import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
 import android.webkit.MimeTypeMap;
 
 import java.io.File;
@@ -75,7 +79,6 @@ public class BitmapUtils {
         // decode bitmap with inSampleSize set
         options.inJustDecodeBounds = false;
         return BitmapFactory.decodeFile(srcPath, options);
-        
     }    
 
 
@@ -282,8 +285,7 @@ public class BitmapUtils {
      */
     public static int[] calculateRGB(String accountName) throws UnsupportedEncodingException, NoSuchAlgorithmException {
         // using adapted algorithm from /core/js/placeholder.js:50
-        int lastAtPos = accountName.lastIndexOf("@");
-        String username = accountName.substring(0, lastAtPos);
+        String username = AccountUtils.getUsernameOfAccount(accountName);
         byte[] seed = username.getBytes("UTF-8");
         MessageDigest md = MessageDigest.getInstance("MD5");
 //      Integer seedMd5Int = Math.abs(new String(Hex.encodeHex(seedMd5)).hashCode());
@@ -295,4 +297,18 @@ public class BitmapUtils {
 
         return BitmapUtils.HSLtoRGB(hue, 90.0f, 65.0f, 1.0f);
     }
+
+    /**
+     * Returns a new circular bitmap drawable by creating it from a bitmap, setting initial target density based on
+     * the display metrics of the resources.
+     *
+     * @param resources the resources for initial target density
+     * @param bitmap the original bitmap
+     * @return the circular bitmap
+     */
+    public static RoundedBitmapDrawable bitmapToCircularBitmapDrawable(Resources resources, Bitmap bitmap) {
+        RoundedBitmapDrawable roundedBitmap = RoundedBitmapDrawableFactory.create(resources, bitmap);
+        roundedBitmap.setCircular(true);
+        return roundedBitmap;
+    }
 }