2019-09-01 04:56:23 +02:00
|
|
|
package org.mercury_im.messenger.ui.chatlist;
|
|
|
|
|
2019-09-23 23:20:43 +02:00
|
|
|
import android.content.Context;
|
|
|
|
import android.content.Intent;
|
2019-09-01 04:56:23 +02:00
|
|
|
import android.view.LayoutInflater;
|
2019-10-28 14:56:56 +01:00
|
|
|
import android.view.Menu;
|
|
|
|
import android.view.MenuItem;
|
2019-09-01 04:56:23 +02:00
|
|
|
import android.view.View;
|
|
|
|
import android.view.ViewGroup;
|
2019-09-25 22:50:52 +02:00
|
|
|
import android.widget.ImageView;
|
2019-09-01 04:56:23 +02:00
|
|
|
import android.widget.TextView;
|
|
|
|
|
|
|
|
import androidx.annotation.NonNull;
|
2019-10-28 14:56:56 +01:00
|
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
|
|
import androidx.appcompat.view.ActionMode;
|
2019-09-01 04:56:23 +02:00
|
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
|
|
|
2019-09-13 09:17:59 +02:00
|
|
|
import org.mercury_im.messenger.R;
|
2019-12-06 15:52:50 +01:00
|
|
|
import org.mercury_im.messenger.entity.chat.DirectChat;
|
2019-09-23 23:20:43 +02:00
|
|
|
import org.mercury_im.messenger.ui.chat.ChatActivity;
|
2019-09-13 09:17:59 +02:00
|
|
|
import org.mercury_im.messenger.ui.util.AbstractRecyclerViewAdapter;
|
2019-09-25 22:50:52 +02:00
|
|
|
import org.mercury_im.messenger.util.ColorUtil;
|
|
|
|
|
|
|
|
import butterknife.BindView;
|
|
|
|
import butterknife.ButterKnife;
|
2019-09-13 09:17:59 +02:00
|
|
|
|
2019-09-01 04:56:23 +02:00
|
|
|
public class ChatListRecyclerViewAdapter
|
2019-12-06 15:52:50 +01:00
|
|
|
extends AbstractRecyclerViewAdapter<DirectChat, ChatListRecyclerViewAdapter.ChatHolder> {
|
2019-09-01 04:56:23 +02:00
|
|
|
|
|
|
|
public ChatListRecyclerViewAdapter() {
|
2019-09-02 01:06:17 +02:00
|
|
|
super(new ChatMessageDiffCallback(true));
|
2019-09-01 04:56:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@NonNull
|
|
|
|
@Override
|
2019-09-02 01:06:17 +02:00
|
|
|
public ChatHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
|
|
View view = LayoutInflater.from(parent.getContext())
|
2019-09-23 23:20:43 +02:00
|
|
|
.inflate(R.layout.list_item_chat, parent, false);
|
|
|
|
return new ChatHolder(parent.getContext(), view);
|
2019-09-01 04:56:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-09-02 01:06:17 +02:00
|
|
|
public void onBindViewHolder(@NonNull ChatHolder holder, int position) {
|
2019-12-06 15:52:50 +01:00
|
|
|
DirectChat model = getItemAt(position);
|
|
|
|
holder.nameView.setText(model.getPeer().getAddress() != null ?
|
|
|
|
model.getPeer().getAddress() : model.toString());
|
|
|
|
holder.avatarView.setColorFilter(ColorUtil.consistentColor(model.getPeer().getAddress()));
|
2019-09-23 23:20:43 +02:00
|
|
|
|
|
|
|
holder.itemView.setOnClickListener(view -> {
|
|
|
|
|
|
|
|
Intent intent = new Intent(holder.context, ChatActivity.class);
|
2019-12-06 15:52:50 +01:00
|
|
|
intent.putExtra(ChatActivity.EXTRA_JID, model.getPeer().getAddress());
|
2019-10-28 14:56:56 +01:00
|
|
|
intent.putExtra(ChatActivity.EXTRA_ACCOUNT, model.getPeer().getAccount().getId());
|
2019-09-23 23:20:43 +02:00
|
|
|
|
|
|
|
holder.context.startActivity(intent);
|
|
|
|
});
|
2019-10-28 14:56:56 +01:00
|
|
|
|
|
|
|
holder.itemView.setOnLongClickListener(v -> {
|
|
|
|
((AppCompatActivity) v.getContext()).startSupportActionMode(actionModeCallback);
|
|
|
|
return true;
|
|
|
|
});
|
2019-09-01 04:56:23 +02:00
|
|
|
}
|
|
|
|
|
2019-09-02 01:06:17 +02:00
|
|
|
public static class ChatHolder extends RecyclerView.ViewHolder {
|
2019-09-01 04:56:23 +02:00
|
|
|
|
|
|
|
@BindView(R.id.chat_name)
|
|
|
|
TextView nameView;
|
|
|
|
|
|
|
|
@BindView(R.id.chat_message)
|
|
|
|
TextView chatMessage;
|
|
|
|
|
|
|
|
@BindView(R.id.chat_time)
|
|
|
|
TextView chatTime;
|
|
|
|
|
|
|
|
@BindView(R.id.chat_avatar)
|
2019-09-25 22:50:52 +02:00
|
|
|
ImageView avatarView;
|
2019-09-01 04:56:23 +02:00
|
|
|
|
2019-09-23 23:20:43 +02:00
|
|
|
Context context;
|
|
|
|
|
|
|
|
public ChatHolder(Context context, @NonNull View itemView) {
|
2019-09-01 04:56:23 +02:00
|
|
|
super(itemView);
|
2019-09-23 23:20:43 +02:00
|
|
|
this.context = context;
|
2019-09-02 01:06:17 +02:00
|
|
|
ButterKnife.bind(this, itemView);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-12-06 15:52:50 +01:00
|
|
|
private static class ChatMessageDiffCallback extends AbstractDiffCallback<DirectChat> {
|
2019-09-02 01:06:17 +02:00
|
|
|
|
2019-09-13 09:17:59 +02:00
|
|
|
ChatMessageDiffCallback(boolean detectMoves) {
|
2019-09-02 01:06:17 +02:00
|
|
|
super(detectMoves);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-12-06 15:52:50 +01:00
|
|
|
public boolean areItemsTheSame(DirectChat oldItem, DirectChat newItem) {
|
2019-10-28 14:56:56 +01:00
|
|
|
return oldItem.getId() == newItem.getId();
|
2019-09-01 04:56:23 +02:00
|
|
|
}
|
|
|
|
|
2019-09-02 01:06:17 +02:00
|
|
|
@Override
|
2019-12-06 15:52:50 +01:00
|
|
|
public boolean areContentsTheSame(DirectChat oldItem, DirectChat newItem) {
|
2019-09-02 01:06:17 +02:00
|
|
|
return areItemsTheSame(oldItem, newItem);
|
2019-09-01 04:56:23 +02:00
|
|
|
}
|
|
|
|
}
|
2019-10-28 14:56:56 +01:00
|
|
|
|
|
|
|
private androidx.appcompat.view.ActionMode.Callback actionModeCallback = new androidx.appcompat.view.ActionMode.Callback() {
|
|
|
|
private boolean multiSelect = false;
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
|
|
|
|
mode.getMenuInflater().inflate(R.menu.actionmode_chatlist, menu);
|
|
|
|
multiSelect = true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
|
|
|
|
|
|
|
|
mode.finish();
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onDestroyActionMode(ActionMode mode) {
|
|
|
|
notifyDataSetChanged();
|
|
|
|
}
|
|
|
|
};
|
2019-09-01 04:56:23 +02:00
|
|
|
}
|