nextcloud-android/src/main/java/com/owncloud/android/ui/adapter/AccountListAdapter.java

216 lines
8.4 KiB
Java

/*
* ownCloud Android client application
*
* @author Andy Scherzinger
* @author Chris Narkiewicz
* Copyright (C) 2016 ownCloud Inc.
* Copyright (C) 2019 Chris Narkiewicz <hello@ezaquarii.com>
* <p/>
* 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.
* <p/>
* 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.
* <p/>
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.owncloud.android.ui.adapter;
import android.accounts.Account;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.nextcloud.client.account.UserAccountManager;
import com.owncloud.android.R;
import com.owncloud.android.lib.common.OwnCloudAccount;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.activity.BaseActivity;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.ThemeUtils;
import java.util.List;
import androidx.annotation.NonNull;
/**
* This Adapter populates a ListView with all accounts within the app.
*/
public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements DisplayUtils.AvatarGenerationListener {
private static final String TAG = AccountListAdapter.class.getSimpleName();
private float mAccountAvatarRadiusDimension;
private final BaseActivity mContext;
private List<AccountListItem> mValues;
private AccountListAdapterListener mListener;
private Drawable mTintedCheck;
private UserAccountManager accountManager;
public AccountListAdapter(BaseActivity context, UserAccountManager accountManager, List<AccountListItem> values, Drawable tintedCheck) {
super(context, -1, values);
this.mContext = context;
this.accountManager = accountManager;
this.mValues = values;
if (context instanceof AccountListAdapterListener) {
this.mListener = (AccountListAdapterListener) context;
}
this.mAccountAvatarRadiusDimension = context.getResources().getDimension(R.dimen.list_item_avatar_icon_radius);
this.mTintedCheck = tintedCheck;
}
@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
AccountViewHolderItem viewHolder;
View view = convertView;
if (view == null) {
LayoutInflater inflater = mContext.getLayoutInflater();
view = inflater.inflate(R.layout.account_item, parent, false);
viewHolder = new AccountViewHolderItem();
viewHolder.imageViewItem = view.findViewById(R.id.user_icon);
viewHolder.checkViewItem = view.findViewById(R.id.ticker);
viewHolder.checkViewItem.setImageDrawable(mTintedCheck);
viewHolder.usernameViewItem = view.findViewById(R.id.user_name);
viewHolder.accountViewItem = view.findViewById(R.id.account);
view.setTag(viewHolder);
} else {
viewHolder = (AccountViewHolderItem) view.getTag();
}
AccountListItem accountListItem = mValues.get(position);
if (accountListItem != null) {
// create account item
if (AccountListItem.TYPE_ACCOUNT == accountListItem.getType()) {
Account account = accountListItem.getAccount();
setAccount(viewHolder, account);
setUsername(viewHolder, account);
setAvatar(viewHolder, account);
setCurrentlyActiveState(viewHolder, account);
TextView usernameView = viewHolder.usernameViewItem;
TextView accountView = viewHolder.accountViewItem;
if (!accountListItem.isEnabled()) {
usernameView.setPaintFlags(usernameView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
accountView.setPaintFlags(accountView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
} else {
usernameView.setPaintFlags(usernameView.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
accountView.setPaintFlags(accountView.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
}
} // create add account action item
else if (AccountListItem.TYPE_ACTION_ADD == accountListItem.getType() && mListener != null) {
return setupAddAccountListItem(parent);
}
}
return view;
}
@NonNull
private View setupAddAccountListItem(ViewGroup parent) {
LayoutInflater inflater = mContext.getLayoutInflater();
View actionView = inflater.inflate(R.layout.account_action, parent, false);
TextView userName = actionView.findViewById(R.id.user_name);
userName.setText(R.string.prefs_add_account);
userName.setTextColor(ThemeUtils.primaryColor(getContext(), true));
((ImageView) actionView.findViewById(R.id.user_icon)).setImageResource(R.drawable.ic_account_plus);
// bind action listener
boolean isProviderOrOwnInstallationVisible = mContext.getResources()
.getBoolean(R.bool.show_provider_or_own_installation);
if (isProviderOrOwnInstallationVisible) {
actionView.setOnClickListener(v -> mListener.showFirstRunActivity());
} else {
actionView.setOnClickListener(v -> mListener.createAccount());
}
return actionView;
}
private void setAccount(AccountViewHolderItem viewHolder, Account account) {
viewHolder.accountViewItem.setText(DisplayUtils.convertIdn(account.name, false));
viewHolder.accountViewItem.setTag(account.name);
}
private void setCurrentlyActiveState(AccountViewHolderItem viewHolder, Account account) {
Account currentAccount = accountManager.getCurrentAccount();
if (currentAccount != null && currentAccount.name.equals(account.name)) {
viewHolder.checkViewItem.setVisibility(View.VISIBLE);
} else {
viewHolder.checkViewItem.setVisibility(View.INVISIBLE);
}
}
private void setAvatar(AccountViewHolderItem viewHolder, Account account) {
try {
View viewItem = viewHolder.imageViewItem;
viewItem.setTag(account.name);
DisplayUtils.setAvatar(account, this, mAccountAvatarRadiusDimension, mContext.getResources(), viewItem,
mContext);
} catch (Exception e) {
Log_OC.e(TAG, "Error calculating RGB value for account list item.", e);
// use user icon as a fallback
viewHolder.imageViewItem.setImageResource(R.drawable.ic_user);
}
}
private void setUsername(AccountViewHolderItem viewHolder, Account account) {
try {
OwnCloudAccount oca = new OwnCloudAccount(account, mContext);
viewHolder.usernameViewItem.setText(oca.getDisplayName());
} catch (Exception e) {
Log_OC.w(TAG, "Account not found right after being read; using account name instead");
viewHolder.usernameViewItem.setText(UserAccountManager.getUsername(account));
}
viewHolder.usernameViewItem.setTag(account.name);
}
@Override
public void avatarGenerated(Drawable avatarDrawable, Object callContext) {
((ImageView)callContext).setImageDrawable(avatarDrawable);
}
@Override
public boolean shouldCallGeneratedCallback(String tag, Object callContext) {
return String.valueOf(((ImageView)callContext).getTag()).equals(tag);
}
/**
* Listener interface for Activities using the {@link AccountListAdapter}
*/
public interface AccountListAdapterListener {
void showFirstRunActivity();
void createAccount();
}
/**
* Account ViewHolderItem to get smooth scrolling.
*/
private static class AccountViewHolderItem {
private ImageView imageViewItem;
private ImageView checkViewItem;
private TextView usernameViewItem;
private TextView accountViewItem;
}
}