Sfoglia il codice sorgente

avatar loading for account manager too + house keeping

Andy Scherzinger 9 anni fa
parent
commit
892cfd6f8f

+ 46 - 0
res/layout/account_action.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ownCloud Android client application
+
+  Copyright (C) 2016 ownCloud Inc.
+
+  This program is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License version 2,
+  as published by the Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="72dp"
+    android:orientation="horizontal"
+    android:weightSum="1">
+
+    <ImageView
+        android:id="@+id/user_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center_vertical"
+        android:layout_marginLeft="20dp"
+        android:src="@drawable/ic_account_plus"/>
+
+    <TextView
+        android:id="@+id/user_name"
+        android:layout_width="0dp"
+        android:layout_height="fill_parent"
+        android:layout_marginLeft="28dp"
+        android:layout_weight="1"
+        android:gravity="center_vertical"
+        android:paddingRight="@dimen/standard_padding"
+        android:text="@string/placeholder_filename"
+        android:textColor="@color/primary"
+        android:textSize="@dimen/two_line_primary_text_size"/>
+
+</LinearLayout>         

+ 1 - 1
res/layout/account_item.xml

@@ -33,7 +33,7 @@
 
     <TextView
         android:id="@+id/user_name"
-        android:layout_width="fill_parent"
+        android:layout_width="0dp"
         android:layout_height="fill_parent"
         android:layout_marginLeft="@dimen/standard_margin"
         android:layout_weight="1"

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

@@ -47,6 +47,7 @@ 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;
+import com.owncloud.android.utils.DisplayUtils;
 
 /**
  * Base class to handle setup of the drawer implementation including user switching and avatar fetching and fallback
@@ -334,29 +335,35 @@ public abstract class DrawerActivity extends ToolbarActivity {
      */
     public void updateAccountList() {
         Account[] accounts = AccountManager.get(this).getAccountsByType(MainApp.getAccountType());
-        if (accounts.length > 0 && mNavigationView != null) {
-            repopulateAccountList(accounts);
-            setAccountInDrawer(AccountUtils.getCurrentOwnCloudAccount(this));
-            populateDrawerOwnCloudAccounts();
-
-            // activate second/end account avatar
-            if (mAvatars[1] != null) {
-                setAvatar(mAvatars[1], R.id.drawer_account_end, false);
-                mAccountEndAccountAvatar.setVisibility(View.VISIBLE);
-            } else {
-                mAccountEndAccountAvatar.setVisibility(View.GONE);
-            }
+        if (mNavigationView != null && mDrawerLayout != null) {
+            if (accounts.length > 0) {
+                repopulateAccountList(accounts);
+                setAccountInDrawer(AccountUtils.getCurrentOwnCloudAccount(this));
+                populateDrawerOwnCloudAccounts();
+
+                // activate second/end account avatar
+                if (mAvatars[1] != null) {
+                    DisplayUtils.setAvatar(mAvatars[1],
+                            (ImageView) findNavigationViewChildById(R.id.drawer_account_end),
+                            mOtherAccountAvatarRadiusDimension, getResources(), getStorageManager());
+                    mAccountEndAccountAvatar.setVisibility(View.VISIBLE);
+                } else {
+                    mAccountEndAccountAvatar.setVisibility(View.GONE);
+                }
 
-            // activate third/middle account avatar
-            if (mAvatars[2] != null) {
-                setAvatar(mAvatars[2], R.id.drawer_account_middle, false);
-                mAccountMiddleAccountAvatar.setVisibility(View.VISIBLE);
+                // activate third/middle account avatar
+                if (mAvatars[2] != null) {
+                    DisplayUtils.setAvatar(mAvatars[2],
+                            (ImageView) findNavigationViewChildById(R.id.drawer_account_middle),
+                            mOtherAccountAvatarRadiusDimension, getResources(), getStorageManager());
+                    mAccountMiddleAccountAvatar.setVisibility(View.VISIBLE);
+                } else {
+                    mAccountMiddleAccountAvatar.setVisibility(View.GONE);
+                }
             } else {
+                mAccountEndAccountAvatar.setVisibility(View.GONE);
                 mAccountMiddleAccountAvatar.setVisibility(View.GONE);
             }
-        } else {
-            mAccountEndAccountAvatar.setVisibility(View.GONE);
-            mAccountMiddleAccountAvatar.setVisibility(View.GONE);
         }
     }
 
@@ -437,73 +444,8 @@ public abstract class DrawerActivity extends ToolbarActivity {
             usernameFull.setText(account.name);
             username.setText(AccountUtils.getUsernameOfAccount(account.name));
 
-            setAvatar(account, R.id.drawer_current_account, true);
-        }
-    }
-
-    /**
-     * fetches and sets the avatar of the current account in the drawer in case the drawer is available.
-     *
-     * @param account        the account to be set in the drawer
-     * @param avatarViewId   the view to set the avatar on
-     * @param currentAccount flag if it is the current avatar or another (impacts chosen size)
-     */
-    private void setAvatar(Account account, int avatarViewId, boolean currentAccount) {
-        if (mDrawerLayout != null && account != null) {
-
-            ImageView userIcon = (ImageView) findNavigationViewChildById(avatarViewId);
-            userIcon.setContentDescription(account.name);
-
-            // Thumbnail in Cache?
-            Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache("a_" + account.name);
-
-            if (thumbnail != null) {
-                userIcon.setImageDrawable(
-                        BitmapUtils.bitmapToCircularBitmapDrawable(MainApp.getAppContext().getResources(), thumbnail)
-                );
-            } else {
-                // generate new avatar
-                if (ThumbnailsCacheManager.cancelPotentialAvatarWork(account.name, userIcon)) {
-                    final ThumbnailsCacheManager.AvatarGenerationTask task =
-                            new ThumbnailsCacheManager.AvatarGenerationTask(
-                                    userIcon, getStorageManager(), account
-                            );
-                    if (thumbnail == null) {
-                        try {
-                            if (currentAccount) {
-                                userIcon.setImageDrawable(
-                                        TextDrawable.createAvatar(
-                                                account.name,
-                                                mCurrentAccountAvatarRadiusDimension
-                                        )
-                                );
-                            } else {
-                                userIcon.setImageDrawable(
-                                        TextDrawable.createAvatar(
-                                                account.name,
-                                                mOtherAccountAvatarRadiusDimension
-                                        )
-                                );
-                            }
-                        } catch (Exception e) {
-                            Log_OC.e(TAG, "Error calculating RGB value for active account icon.", e);
-                            userIcon.setImageResource(R.drawable.ic_account_circle);
-                        }
-                    } else {
-                        final ThumbnailsCacheManager.AsyncAvatarDrawable asyncDrawable =
-                                new ThumbnailsCacheManager.AsyncAvatarDrawable(
-                                        getResources(),
-                                        thumbnail,
-                                        task
-                                );
-                        userIcon.setImageDrawable(
-                                BitmapUtils.bitmapToCircularBitmapDrawable(
-                                        MainApp.getAppContext().getResources(), asyncDrawable.getBitmap())
-                        );
-                    }
-                    task.execute(account.name);
-                }
-            }
+            DisplayUtils.setAvatar(account, (ImageView) findNavigationViewChildById(R.id.drawer_current_account),
+                    mCurrentAccountAvatarRadiusDimension, getResources(), getStorageManager());
         }
     }
 

+ 5 - 2
src/com/owncloud/android/ui/activity/ManageAccountsActivity.java

@@ -54,7 +54,7 @@ import java.util.Set;
 /**
  * An Activity that allows the user to manage accounts.
  */
-public class ManageAccountsActivity extends ToolbarActivity
+public class ManageAccountsActivity extends FileActivity
         implements AccountListAdapter.AccountListAdapterListener, AccountManagerCallback<Boolean>, ComponentsGetter {
     private static final String TAG = ManageAccountsActivity.class.getSimpleName();
     public static final String KEY_ACCOUNT_LIST_CHANGED = "ACCOUNT_LIST_CHANGED";
@@ -85,6 +85,9 @@ public class ManageAccountsActivity extends ToolbarActivity
         mOriginalAccounts = toAccountNameSet(accountList);
         mOriginalCurrentAccount = AccountUtils.getCurrentOwnCloudAccount(this).name;
 
+        setAccount(AccountUtils.getCurrentOwnCloudAccount(this));
+        onAccountSet(false);
+
         mAccountListAdapter = new AccountListAdapter(this, getAccountListItems());
 
         mListView.setAdapter(mAccountListAdapter);
@@ -300,7 +303,7 @@ public class ManageAccountsActivity extends ToolbarActivity
 
     @Override
     public FileDataStorageManager getStorageManager() {
-        return null;
+        return super.getStorageManager();
     }
 
     @Override

+ 9 - 11
src/com/owncloud/android/ui/adapter/AccountListAdapter.java

@@ -21,6 +21,7 @@ package com.owncloud.android.ui.adapter;
 
 import android.accounts.Account;
 import android.content.Context;
+import android.view.Display;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -31,7 +32,9 @@ import android.widget.TextView;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.TextDrawable;
+import com.owncloud.android.ui.activity.BaseActivity;
 import com.owncloud.android.ui.activity.ManageAccountsActivity;
+import com.owncloud.android.utils.DisplayUtils;
 
 import java.util.List;
 
@@ -41,11 +44,11 @@ import java.util.List;
 public class AccountListAdapter extends ArrayAdapter<AccountListItem> {
     private static final String TAG = AccountListAdapter.class.getSimpleName();
     private float mAccountAvatarRadiusDimension;
-    private final Context mContext;
+    private final BaseActivity mContext;
     private List<AccountListItem> mValues;
     private AccountListAdapterListener mListener;
 
-    public AccountListAdapter(Context context, List<AccountListItem> values) {
+    public AccountListAdapter(BaseActivity context, List<AccountListItem> values) {
         super(context, -1, values);
         this.mContext = context;
         this.mValues = values;
@@ -62,7 +65,7 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> {
         AccountViewHolderItem viewHolder;
 
         if (convertView == null) {
-            LayoutInflater inflater = ((ManageAccountsActivity) mContext).getLayoutInflater();
+            LayoutInflater inflater = mContext.getLayoutInflater();
             convertView = inflater.inflate(R.layout.account_item, parent, false);
 
             viewHolder = new AccountViewHolderItem();
@@ -87,11 +90,8 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> {
                 viewHolder.textViewItem.setTag(account.name);
 
                 try {
-                    TextDrawable icon = TextDrawable.createAvatar(
-                            account.name,
-                            mAccountAvatarRadiusDimension
-                    );
-                    viewHolder.imageViewItem.setImageDrawable(icon);
+                    DisplayUtils.setAvatar(account, viewHolder.imageViewItem, mAccountAvatarRadiusDimension,
+                            mContext.getResources(), mContext.getStorageManager());
                 } catch (Exception e) {
                     Log_OC.e(TAG, "Error calculating RGB value for account list item.", e);
                     // use user icon as a fallback
@@ -118,11 +118,9 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> {
             } // create add account action item
             else if (AccountListItem.TYPE_ACTION_ADD == accountListItem.getType()) {
                 LayoutInflater inflater = ((ManageAccountsActivity) mContext).getLayoutInflater();
-                View actionView = inflater.inflate(R.layout.account_item, parent, false);
+                View actionView = inflater.inflate(R.layout.account_action, parent, false);
                 ((TextView) actionView.findViewById(R.id.user_name)).setText(R.string.prefs_add_account);
                 ((ImageView) actionView.findViewById(R.id.user_icon)).setImageResource(R.drawable.ic_account_plus);
-                actionView.findViewById(R.id.passwordButton).setVisibility(View.GONE);
-                actionView.findViewById(R.id.removeButton).setVisibility(View.GONE);
 
                 // bind action listener
                 actionView.setOnClickListener(new View.OnClickListener() {

+ 57 - 0
src/com/owncloud/android/utils/DisplayUtils.java

@@ -22,9 +22,12 @@
 
 package com.owncloud.android.utils;
 
+import android.accounts.Account;
 import android.annotation.TargetApi;
 import android.app.Activity;
 import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
 import android.graphics.Point;
 import android.graphics.PorterDuff;
 import android.os.Build;
@@ -33,13 +36,18 @@ import android.support.v4.content.ContextCompat;
 import android.text.format.DateUtils;
 import android.view.Display;
 import android.view.View;
+import android.widget.ImageView;
 import android.widget.ProgressBar;
 import android.widget.SeekBar;
 import android.widget.TextView;
 
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
+import com.owncloud.android.datamodel.FileDataStorageManager;
 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 java.math.BigDecimal;
 import java.net.IDN;
@@ -53,6 +61,7 @@ import java.util.Map;
  * A helper class for some string operations.
  */
 public class DisplayUtils {
+    private static final String TAG = DisplayUtils.class.getSimpleName();
     
     private static final String OWNCLOUD_APP_NAME = "ownCloud";
     
@@ -278,4 +287,52 @@ public class DisplayUtils {
         // Changing action button text color
         snackbar.setActionTextColor(ContextCompat.getColor(context, R.color.white));
     }
+
+    /**
+     * fetches and sets the avatar of the current account in the drawer in case the drawer is available.
+     *
+     * @param account        the account to be set in the drawer
+     * @param userIcon       the image view to set the avatar on
+     * @param avatarRadius   the avatar radius
+     * @param resources      reference for density information
+     * @param storageManager reference for caching purposes
+     */
+    public static void setAvatar(Account account, ImageView userIcon, float avatarRadius, Resources resources,
+                           FileDataStorageManager storageManager) {
+        if (account != null) {
+
+            userIcon.setContentDescription(account.name);
+
+            // Thumbnail in Cache?
+            Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache("a_" + account.name);
+
+            if (thumbnail != null) {
+                userIcon.setImageDrawable(
+                        BitmapUtils.bitmapToCircularBitmapDrawable(MainApp.getAppContext().getResources(), thumbnail)
+                );
+            } else {
+                // generate new avatar
+                if (ThumbnailsCacheManager.cancelPotentialAvatarWork(account.name, userIcon)) {
+                    final ThumbnailsCacheManager.AvatarGenerationTask task =
+                            new ThumbnailsCacheManager.AvatarGenerationTask(userIcon, storageManager, account);
+                    if (thumbnail == null) {
+                        try {
+                            userIcon.setImageDrawable(TextDrawable.createAvatar(account.name, avatarRadius));
+                        } catch (Exception e) {
+                            Log_OC.e(TAG, "Error calculating RGB value for active account icon.", e);
+                            userIcon.setImageResource(R.drawable.ic_account_circle);
+                        }
+                    } else {
+                        final ThumbnailsCacheManager.AsyncAvatarDrawable asyncDrawable =
+                                new ThumbnailsCacheManager.AsyncAvatarDrawable(resources, thumbnail, task);
+                        userIcon.setImageDrawable(
+                                BitmapUtils.bitmapToCircularBitmapDrawable(
+                                        MainApp.getAppContext().getResources(), asyncDrawable.getBitmap())
+                        );
+                    }
+                    task.execute(account.name);
+                }
+            }
+        }
+    }
 }