2019-12-21 03:46:17 +01:00
|
|
|
package org.mercury_im.messenger.ui.account;
|
2019-06-03 01:16:49 +02:00
|
|
|
|
|
|
|
import android.view.LayoutInflater;
|
|
|
|
import android.view.View;
|
|
|
|
import android.view.ViewGroup;
|
2019-09-25 22:50:52 +02:00
|
|
|
import android.widget.ImageView;
|
2019-06-03 01:16:49 +02:00
|
|
|
import android.widget.Switch;
|
|
|
|
import android.widget.TextView;
|
|
|
|
|
2019-12-21 04:18:00 +01:00
|
|
|
import androidx.annotation.NonNull;
|
2019-08-20 20:14:57 +02:00
|
|
|
import androidx.recyclerview.widget.DiffUtil;
|
|
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
|
|
|
2019-12-21 04:18:00 +01:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2019-06-03 01:16:49 +02:00
|
|
|
import org.mercury_im.messenger.R;
|
2019-12-06 15:52:50 +01:00
|
|
|
import org.mercury_im.messenger.entity.Account;
|
2019-12-13 11:54:10 +01:00
|
|
|
import org.mercury_im.messenger.ui.avatar.AvatarDrawable;
|
2019-12-21 03:46:17 +01:00
|
|
|
import org.mercury_im.messenger.ui.account.AccountsFragment.OnAccountListItemClickListener;
|
2019-08-20 20:14:57 +02:00
|
|
|
import org.mercury_im.messenger.util.AbstractDiffCallback;
|
2019-06-03 01:16:49 +02:00
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<AccountsRecyclerViewAdapter.ViewHolder> {
|
|
|
|
|
2019-12-21 04:08:59 +01:00
|
|
|
private final List<Account> accounts = new ArrayList<>();
|
|
|
|
private final OnAccountListItemClickListener onAccountClickListener;
|
2019-09-30 02:54:05 +02:00
|
|
|
private final AccountsViewModel viewModel;
|
2019-06-03 01:16:49 +02:00
|
|
|
|
2019-09-30 02:54:05 +02:00
|
|
|
public AccountsRecyclerViewAdapter(AccountsViewModel viewModel, OnAccountListItemClickListener listener) {
|
2019-12-21 04:08:59 +01:00
|
|
|
onAccountClickListener = listener;
|
2019-09-30 02:54:05 +02:00
|
|
|
this.viewModel = viewModel;
|
2019-06-03 01:16:49 +02:00
|
|
|
}
|
|
|
|
|
2019-12-21 04:18:00 +01:00
|
|
|
@NotNull
|
2019-06-03 01:16:49 +02:00
|
|
|
@Override
|
|
|
|
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
|
|
View view = LayoutInflater.from(parent.getContext())
|
2019-09-23 23:20:43 +02:00
|
|
|
.inflate(R.layout.list_item_account, parent, false);
|
2019-06-03 01:16:49 +02:00
|
|
|
return new ViewHolder(view);
|
|
|
|
}
|
|
|
|
|
2019-12-21 04:08:59 +01:00
|
|
|
public void setValues(List<Account> values) {
|
2019-12-21 04:18:00 +01:00
|
|
|
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(
|
|
|
|
new AccountsDiffCallback(values, accounts), true);
|
2019-12-21 04:08:59 +01:00
|
|
|
accounts.clear();
|
|
|
|
accounts.addAll(values);
|
|
|
|
diffResult.dispatchUpdatesTo(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public int getItemCount() {
|
|
|
|
return accounts.size();
|
|
|
|
}
|
|
|
|
|
2019-06-03 01:16:49 +02:00
|
|
|
@Override
|
|
|
|
public void onBindViewHolder(final ViewHolder holder, int position) {
|
2019-12-21 04:08:59 +01:00
|
|
|
Account account = accounts.get(position);
|
|
|
|
|
|
|
|
holder.account = account;
|
2019-12-06 15:52:50 +01:00
|
|
|
holder.jid.setText(account.getAddress());
|
2019-12-13 11:54:10 +01:00
|
|
|
holder.avatar.setImageDrawable(new AvatarDrawable(account.getAddress(), account.getAddress()));
|
2019-10-28 14:56:56 +01:00
|
|
|
holder.enabled.setChecked(account.isEnabled());
|
2019-12-21 04:18:00 +01:00
|
|
|
holder.enabled.setOnCheckedChangeListener((compoundButton, checked) ->
|
|
|
|
viewModel.setAccountEnabled(account, checked));
|
2019-12-21 04:08:59 +01:00
|
|
|
|
2019-12-21 04:18:00 +01:00
|
|
|
setClickListenersOnViewHolder(holder);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setClickListenersOnViewHolder(ViewHolder holder) {
|
2019-08-20 20:14:57 +02:00
|
|
|
holder.mView.setOnClickListener(v -> {
|
2019-12-21 04:08:59 +01:00
|
|
|
if (null != onAccountClickListener) {
|
|
|
|
onAccountClickListener.onAccountListItemClick(holder.account);
|
2019-06-03 01:16:49 +02:00
|
|
|
}
|
|
|
|
});
|
2019-12-21 04:08:59 +01:00
|
|
|
|
2019-08-24 23:06:06 +02:00
|
|
|
holder.mView.setOnLongClickListener(v -> {
|
2019-12-21 04:08:59 +01:00
|
|
|
if (null != onAccountClickListener) {
|
|
|
|
onAccountClickListener.onAccountListItemLongClick(holder.account);
|
2019-08-24 23:06:06 +02:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
});
|
2019-06-03 01:16:49 +02:00
|
|
|
}
|
|
|
|
|
2019-12-21 04:18:00 +01:00
|
|
|
class ViewHolder extends RecyclerView.ViewHolder {
|
|
|
|
private Account account;
|
|
|
|
final View mView;
|
|
|
|
final ImageView avatar;
|
|
|
|
final TextView jid;
|
|
|
|
final Switch enabled;
|
|
|
|
final TextView status;
|
2019-06-03 01:16:49 +02:00
|
|
|
|
|
|
|
public ViewHolder(View view) {
|
|
|
|
super(view);
|
|
|
|
mView = view;
|
|
|
|
avatar = view.findViewById(R.id.avatar_account);
|
|
|
|
jid = view.findViewById(R.id.text_account_jid);
|
|
|
|
enabled = view.findViewById(R.id.switch_account_enabled);
|
2019-07-03 00:56:55 +02:00
|
|
|
status = view.findViewById(R.id.text_account_status);
|
2019-06-03 01:16:49 +02:00
|
|
|
}
|
|
|
|
}
|
2019-08-20 20:14:57 +02:00
|
|
|
|
2019-12-06 15:52:50 +01:00
|
|
|
public class AccountsDiffCallback extends AbstractDiffCallback<Account> {
|
2019-08-20 20:14:57 +02:00
|
|
|
|
2019-12-06 15:52:50 +01:00
|
|
|
public AccountsDiffCallback(List<Account> newItems, List<Account> oldItems) {
|
2019-08-20 20:14:57 +02:00
|
|
|
super(newItems, oldItems);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
|
|
|
|
return oldItems.get(oldItemPosition).getId() == newItems.get(newItemPosition).getId();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
|
2019-12-06 15:52:50 +01:00
|
|
|
Account oldM = oldItems.get(oldItemPosition);
|
|
|
|
Account newM = newItems.get(newItemPosition);
|
2019-08-20 20:14:57 +02:00
|
|
|
return oldM.equals(newM);
|
|
|
|
}
|
|
|
|
}
|
2019-06-03 01:16:49 +02:00
|
|
|
}
|