Performance fix for diff utils in chat rooms list, using library's chat room sort & filter

This commit is contained in:
Sylvain Berfini 2019-06-28 16:48:57 +02:00
parent e8ad6bd39f
commit 6ba56bb8f2
7 changed files with 11 additions and 76 deletions

View file

@ -1,4 +1,4 @@
[![pipeline status](https://gitlab.linphone.org/BC/public/linphone-sdk/badges/master/pipeline.svg)](https://gitlab.linphone.org/BC/public/linphone-android/commits/master)
[![pipeline status](https://gitlab.linphone.org/BC/public/linphone-android/badges/master/pipeline.svg)](https://gitlab.linphone.org/BC/public/linphone-android/commits/master)
Linphone is a free VoIP and video softphone based on the SIP protocol.

View file

@ -25,13 +25,9 @@ import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.DiffUtil;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.linphone.LinphoneManager;
import org.linphone.R;
import org.linphone.core.ChatRoom;
import org.linphone.utils.LinphoneUtils;
import org.linphone.utils.SelectableAdapter;
import org.linphone.utils.SelectableHelper;
@ -75,23 +71,7 @@ public class ChatRoomsAdapter extends SelectableAdapter<ChatRoomViewHolder> {
public void refresh() {
ChatRoom[] rooms = LinphoneManager.getCore().getChatRooms();
List<ChatRoom> roomsList;
if (mContext.getResources().getBoolean(R.bool.hide_empty_one_to_one_chat_rooms)) {
roomsList = LinphoneUtils.removeEmptyOneToOneChatRooms(rooms);
} else {
roomsList = Arrays.asList(rooms);
}
Collections.sort(
roomsList,
new Comparator<ChatRoom>() {
public int compare(ChatRoom cr1, ChatRoom cr2) {
long timeDiff = cr1.getLastUpdateTime() - cr2.getLastUpdateTime();
if (timeDiff > 0) return -1;
else if (timeDiff == 0) return 0;
return 1;
}
});
List<ChatRoom> roomsList = Arrays.asList(rooms);
DiffUtil.DiffResult diffResult =
DiffUtil.calculateDiff(new ChatRoomDiffCallback(roomsList, mRooms));
@ -99,11 +79,6 @@ public class ChatRoomsAdapter extends SelectableAdapter<ChatRoomViewHolder> {
mRooms = roomsList;
}
public void clear() {
mRooms.clear();
// Do not notify data set changed, we don't want the list to empty when fragment is paused
}
/** Adapter's methods */
@Override
public int getItemCount() {
@ -112,7 +87,8 @@ public class ChatRoomsAdapter extends SelectableAdapter<ChatRoomViewHolder> {
@Override
public Object getItem(int position) {
return mRooms.get(position);
if (position < mRooms.size()) return mRooms.get(position);
return null;
}
@Override
@ -141,15 +117,12 @@ public class ChatRoomsAdapter extends SelectableAdapter<ChatRoomViewHolder> {
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
ChatRoom oldRoom = oldChatRooms.get(oldItemPosition);
ChatRoom newRoom = newChatRooms.get(newItemPosition);
return oldRoom.getLocalAddress().weakEqual(newRoom.getLocalAddress())
&& oldRoom.getPeerAddress().weakEqual(newRoom.getPeerAddress());
return oldChatRooms.get(oldItemPosition) == (newChatRooms.get(newItemPosition));
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
return oldChatRooms.get(oldItemPosition).equals(newChatRooms.get(newItemPosition));
return newChatRooms.get(newItemPosition).getUnreadMessagesCount() > 0;
}
}
}

View file

@ -44,7 +44,6 @@ import org.linphone.core.ChatRoomListenerStub;
import org.linphone.core.Core;
import org.linphone.core.CoreListenerStub;
import org.linphone.core.ProxyConfig;
import org.linphone.utils.LinphoneUtils;
import org.linphone.utils.SelectableHelper;
import org.linphone.views.LinphoneLinearLayoutManager;
@ -79,12 +78,7 @@ public class ChatRoomsFragment extends Fragment
mNoChatHistory = view.findViewById(R.id.noChatHistory);
ChatRoom[] rooms = LinphoneManager.getCore().getChatRooms();
List<ChatRoom> mRooms;
if (getResources().getBoolean(R.bool.hide_empty_one_to_one_chat_rooms)) {
mRooms = LinphoneUtils.removeEmptyOneToOneChatRooms(rooms);
} else {
mRooms = Arrays.asList(rooms);
}
List<ChatRoom> mRooms = Arrays.asList(rooms);
mSelectionHelper = new SelectableHelper(view, this);
mChatRoomsAdapter =
@ -244,7 +238,6 @@ public class ChatRoomsFragment extends Fragment
core.removeListener(mListener);
}
ContactsManager.getInstance().removeContactsListener(this);
mChatRoomsAdapter.clear();
super.onPause();
}

View file

@ -26,8 +26,6 @@ import android.content.Context;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import org.linphone.LinphoneManager;
import org.linphone.contacts.ContactsManager;
import org.linphone.contacts.LinphoneContact;
@ -37,7 +35,6 @@ import org.linphone.core.ChatRoomCapabilities;
import org.linphone.core.tools.Log;
import org.linphone.settings.LinphonePreferences;
import org.linphone.utils.LinphoneShortcutManager;
import org.linphone.utils.LinphoneUtils;
@TargetApi(25)
class ApiTwentyFivePlus {
@ -57,24 +54,11 @@ class ApiTwentyFivePlus {
ArrayList<ShortcutInfo> shortcuts = new ArrayList<>();
ChatRoom[] rooms = LinphoneManager.getCore().getChatRooms();
ArrayList<ChatRoom> notEmptyOneToOneRooms =
LinphoneUtils.removeEmptyOneToOneChatRooms(rooms);
Collections.sort(
notEmptyOneToOneRooms,
new Comparator<ChatRoom>() {
public int compare(ChatRoom cr1, ChatRoom cr2) {
long timeDiff = cr1.getLastUpdateTime() - cr2.getLastUpdateTime();
if (timeDiff > 0) return -1;
else if (timeDiff == 0) return 0;
return 1;
}
});
int i = 0;
int maxShortcuts =
min(notEmptyOneToOneRooms.size(), shortcutManager.getMaxShortcutCountPerActivity());
int maxShortcuts = min(rooms.length, shortcutManager.getMaxShortcutCountPerActivity());
ArrayList<LinphoneContact> contacts = new ArrayList<>();
for (ChatRoom room : notEmptyOneToOneRooms) {
for (ChatRoom room : rooms) {
// Android can only have around 4-5 shortcuts at a time
if (i >= maxShortcuts) break;

View file

@ -27,6 +27,7 @@ import com.google.firebase.messaging.RemoteMessage;
import org.linphone.LinphoneManager;
import org.linphone.LinphoneService;
import org.linphone.core.Core;
import org.linphone.core.tools.Log;
import org.linphone.settings.LinphonePreferences;
import org.linphone.utils.LinphoneUtils;
@ -57,7 +58,7 @@ public class FirebaseMessaging extends FirebaseMessagingService {
intent.putExtra("PushNotification", true);
startService(intent);
} else {
android.util.Log.i("FirebaseMessaging", "[Push Notification] Notifying Core");
Log.i("[Push Notification] Notifying Core");
if (LinphoneManager.getInstance() != null) {
Core core = LinphoneManager.getCore();
if (core != null) {

View file

@ -39,7 +39,6 @@ import android.widget.ImageView;
import android.widget.TextView;
import androidx.core.content.ContextCompat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
import java.util.regex.Pattern;
@ -49,8 +48,6 @@ import org.linphone.R;
import org.linphone.core.Address;
import org.linphone.core.Call;
import org.linphone.core.CallLog;
import org.linphone.core.ChatRoom;
import org.linphone.core.ChatRoomCapabilities;
import org.linphone.core.Core;
import org.linphone.core.Factory;
import org.linphone.core.LogCollectionState;
@ -343,18 +340,6 @@ public final class LinphoneUtils {
return Html.fromHtml(text);
}
public static ArrayList<ChatRoom> removeEmptyOneToOneChatRooms(ChatRoom[] rooms) {
ArrayList<ChatRoom> newRooms = new ArrayList<>();
for (ChatRoom room : rooms) {
// Hide 1-1 chat rooms without messages
if (!(room.hasCapability(ChatRoomCapabilities.OneToOne.toInt())
&& room.getHistorySize() == 0)) {
newRooms.add(room);
}
}
return newRooms;
}
public static void showTrustDeniedDialog(Context context) {
final Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

View file

@ -93,7 +93,6 @@
<bool name="send_multiple_images_as_different_messages">true</bool>
<bool name="use_big_pictures_to_preview_images_file_transfers">true</bool>
<bool name="show_sip_uri_in_chat">false</bool>
<bool name="hide_empty_one_to_one_chat_rooms">true</bool>
<bool name="create_most_recent_chat_rooms_shortcuts">true</bool>
<bool name="force_end_to_end_encryption_in_chat">false</bool>