Mercury-IM/app/src/main/java/org/mercury_im/messenger/ui/account/AccountsRecyclerViewAdapter...

130 lines
4.7 KiB
Java
Raw Normal View History

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;
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;
import org.mercury_im.messenger.xmpp.MercuryConnection;
2019-06-03 01:16:49 +02:00
import java.util.ArrayList;
import java.util.List;
2020-01-06 01:27:11 +01:00
import io.reactivex.android.schedulers.AndroidSchedulers;
2019-06-03 01:16:49 +02:00
public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<AccountsRecyclerViewAdapter.ViewHolder> {
private final List<MercuryConnection> connections = new ArrayList<>();
2019-12-21 04:08:59 +01:00
private final OnAccountListItemClickListener onAccountClickListener;
private final AccountsViewModel viewModel;
2019-06-03 01:16:49 +02:00
public AccountsRecyclerViewAdapter(AccountsViewModel viewModel, OnAccountListItemClickListener listener) {
2019-12-21 04:08:59 +01:00
onAccountClickListener = listener;
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);
}
public void setValues(List<MercuryConnection> values) {
2019-12-21 04:18:00 +01:00
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(
new AccountsDiffCallback(values, connections), true);
connections.clear();
connections.addAll(values);
2019-12-21 04:08:59 +01:00
diffResult.dispatchUpdatesTo(this);
}
@Override
public int getItemCount() {
return connections.size();
2019-12-21 04:08:59 +01:00
}
2019-06-03 01:16:49 +02:00
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
MercuryConnection connection = connections.get(position);
Account account = connection.getAccount();
2019-12-21 04:08:59 +01:00
holder.account = account;
2019-12-06 15:52:50 +01:00
holder.jid.setText(account.getAddress());
holder.avatar.setImageDrawable(new AvatarDrawable(account.getAddress(), account.getAddress()));
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
2020-01-06 03:41:37 +01:00
viewModel.getDisposable().add(connection.getState()
2020-01-06 01:27:11 +01:00
.observeOn(AndroidSchedulers.mainThread())
2020-01-06 03:41:37 +01:00
.subscribe(state -> holder.status.setText(state.toString())));
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
public class AccountsDiffCallback extends AbstractDiffCallback<MercuryConnection> {
2019-08-20 20:14:57 +02:00
public AccountsDiffCallback(List<MercuryConnection> newItems, List<MercuryConnection> oldItems) {
2019-08-20 20:14:57 +02:00
super(newItems, oldItems);
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldItems.get(oldItemPosition).getAccount().getId() == newItems.get(newItemPosition).getAccount().getId();
2019-08-20 20:14:57 +02:00
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
Account oldM = oldItems.get(oldItemPosition).getAccount();
Account newM = newItems.get(newItemPosition).getAccount();
2019-08-20 20:14:57 +02:00
return oldM.equals(newM);
}
}
2019-06-03 01:16:49 +02:00
}