1package eu.siacs.conversations.ui.adapter;
2
3import android.view.LayoutInflater;
4import android.view.View;
5import android.view.ViewGroup;
6import android.widget.ArrayAdapter;
7import androidx.annotation.NonNull;
8import androidx.databinding.DataBindingUtil;
9import com.google.android.material.color.MaterialColors;
10import eu.siacs.conversations.R;
11import eu.siacs.conversations.databinding.ItemAccountBinding;
12import eu.siacs.conversations.entities.Account;
13import eu.siacs.conversations.ui.XmppActivity;
14import eu.siacs.conversations.ui.util.AvatarWorkerTask;
15import java.util.List;
16
17public class AccountAdapter extends ArrayAdapter<Account> {
18
19 private final XmppActivity activity;
20 private final boolean showStateButton;
21
22 public AccountAdapter(XmppActivity activity, List<Account> objects, boolean showStateButton) {
23 super(activity, 0, objects);
24 this.activity = activity;
25 this.showStateButton = showStateButton;
26 }
27
28 public AccountAdapter(XmppActivity activity, List<Account> objects) {
29 super(activity, 0, objects);
30 this.activity = activity;
31 this.showStateButton = true;
32 }
33
34 @NonNull
35 @Override
36 public View getView(int position, View view, @NonNull ViewGroup parent) {
37 final Account account = getItem(position);
38 final ViewHolder viewHolder;
39 if (view == null) {
40 ItemAccountBinding binding =
41 DataBindingUtil.inflate(
42 LayoutInflater.from(parent.getContext()),
43 R.layout.item_account,
44 parent,
45 false);
46 view = binding.getRoot();
47 viewHolder = new ViewHolder(binding);
48 view.setTag(viewHolder);
49 } else {
50 viewHolder = (ViewHolder) view.getTag();
51 }
52 viewHolder.binding.accountJid.setText(account.getJid().asBareJid().toString());
53 AvatarWorkerTask.loadAvatar(account, viewHolder.binding.accountImage, R.dimen.avatar);
54 viewHolder.binding.accountStatus.setText(
55 getContext().getString(account.getStatus().getReadableId()));
56 switch (account.getStatus()) {
57 case ONLINE:
58 viewHolder.binding.accountStatus.setTextColor(
59 MaterialColors.getColor(
60 viewHolder.binding.accountStatus,
61 com.google.android.material.R.attr.colorPrimary));
62 break;
63 case DISABLED:
64 case LOGGED_OUT:
65 case CONNECTING:
66 viewHolder.binding.accountStatus.setTextColor(
67 MaterialColors.getColor(
68 viewHolder.binding.accountStatus,
69 com.google.android.material.R.attr.colorOnSurfaceVariant));
70 break;
71 default:
72 viewHolder.binding.accountStatus.setTextColor(
73 MaterialColors.getColor(
74 viewHolder.binding.accountStatus,
75 com.google.android.material.R.attr.colorError));
76 break;
77 }
78 final boolean isDisabled = (account.getStatus() == Account.State.DISABLED);
79 viewHolder.binding.tglAccountStatus.setOnCheckedChangeListener(null);
80 viewHolder.binding.tglAccountStatus.setChecked(!isDisabled);
81 if (this.showStateButton) {
82 viewHolder.binding.tglAccountStatus.setVisibility(View.VISIBLE);
83 } else {
84 viewHolder.binding.tglAccountStatus.setVisibility(View.GONE);
85 }
86 viewHolder.binding.tglAccountStatus.setOnCheckedChangeListener(
87 (compoundButton, b) -> {
88 if (b == isDisabled && activity instanceof OnTglAccountState) {
89 ((OnTglAccountState) activity).onClickTglAccountState(account, b);
90 }
91 });
92 return view;
93 }
94
95 private static class ViewHolder {
96 private final ItemAccountBinding binding;
97
98 private ViewHolder(ItemAccountBinding binding) {
99 this.binding = binding;
100 }
101 }
102
103 public interface OnTglAccountState {
104 void onClickTglAccountState(Account account, boolean state);
105 }
106}