/*
* Copyright (c) 2010-2019 Belledonne Communications SARL.
*
* This file is part of linphone-android
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package org.linphone.chat;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.DiffUtil;
import java.util.Arrays;
import java.util.List;
import org.linphone.LinphoneManager;
import org.linphone.core.ChatRoom;
import org.linphone.utils.SelectableAdapter;
import org.linphone.utils.SelectableHelper;
public class ChatRoomsAdapter extends SelectableAdapter {
private final Context mContext;
private List mRooms;
private final int mItemResource;
private final ChatRoomViewHolder.ClickListener mClickListener;
public ChatRoomsAdapter(
Context context,
int itemResource,
List rooms,
ChatRoomViewHolder.ClickListener clickListener,
SelectableHelper helper) {
super(helper);
mClickListener = clickListener;
mRooms = rooms;
mContext = context;
mItemResource = itemResource;
}
@Override
public ChatRoomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(mItemResource, parent, false);
return new ChatRoomViewHolder(mContext, view, mClickListener);
}
@Override
public void onBindViewHolder(ChatRoomViewHolder holder, int position) {
ChatRoom room = mRooms.get(position);
holder.delete.setVisibility(isEditionEnabled() ? View.VISIBLE : View.INVISIBLE);
holder.unreadMessages.setVisibility(
isEditionEnabled()
? View.INVISIBLE
: (room.getUnreadMessagesCount() > 0 ? View.VISIBLE : View.INVISIBLE));
holder.delete.setChecked(isSelected(position));
room.setUserData(holder);
holder.bindChatRoom(room);
}
public void refresh() {
refresh(false);
}
public void refresh(boolean force) {
ChatRoom[] rooms = LinphoneManager.getCore().getChatRooms();
List roomsList = Arrays.asList(rooms);
if (!force) {
DiffUtil.DiffResult diffResult =
DiffUtil.calculateDiff(new ChatRoomDiffCallback(roomsList, mRooms));
diffResult.dispatchUpdatesTo(this);
mRooms = roomsList;
} else {
mRooms = roomsList;
notifyDataSetChanged();
}
}
/** Adapter's methods */
@Override
public int getItemCount() {
return mRooms.size();
}
@Override
public Object getItem(int position) {
if (position < mRooms.size()) return mRooms.get(position);
return null;
}
@Override
public long getItemId(int position) {
return position;
}
class ChatRoomDiffCallback extends DiffUtil.Callback {
List oldChatRooms;
List newChatRooms;
public ChatRoomDiffCallback(List newRooms, List oldRooms) {
oldChatRooms = oldRooms;
newChatRooms = newRooms;
}
@Override
public int getOldListSize() {
return oldChatRooms.size();
}
@Override
public int getNewListSize() {
return newChatRooms.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return oldChatRooms.get(oldItemPosition) == (newChatRooms.get(newItemPosition));
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return newChatRooms.get(newItemPosition).getUnreadMessagesCount() == 0;
}
}
}