From 17920ed8224b1a9a61fcbfb7b001f812a4af8767 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 13 Mar 2018 11:01:44 +0100 Subject: [PATCH] Reduced number of time ChatRoom.getUnreadMessageCount is called --- src/android/org/linphone/LinphoneManager.java | 49 +++++++++++++++++++ src/android/org/linphone/LinphoneService.java | 1 - .../linphone/activities/LinphoneActivity.java | 39 +++------------ .../org/linphone/call/CallActivity.java | 6 +-- .../org/linphone/chat/ChatRoomsAdapter.java | 2 +- .../org/linphone/chat/GroupChatFragment.java | 6 ++- 6 files changed, 63 insertions(+), 40 deletions(-) diff --git a/src/android/org/linphone/LinphoneManager.java b/src/android/org/linphone/LinphoneManager.java index 1889c8f39..5e8a901e0 100644 --- a/src/android/org/linphone/LinphoneManager.java +++ b/src/android/org/linphone/LinphoneManager.java @@ -139,6 +139,8 @@ import java.io.IOException; import java.io.InputStream; import java.sql.Timestamp; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import java.util.Timer; import java.util.TimerTask; @@ -200,6 +202,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou public String wizardLoginViewDomain = null; protected LinphoneManager(final Context c) { + mUnreadChatsPerRoom = new HashMap(); sExited = false; echoTesterIsRunning = false; mServiceContext = c; @@ -236,6 +239,7 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou private final String mFriendsDatabaseFile; private byte[] mUploadingImage; private Timer mTimer; + private Map mUnreadChatsPerRoom; private void routeAudioToSpeakerHelper(boolean speakerOn) { Log.w("Routing audio to " + (speakerOn ? "speaker" : "earpiece") + ", disabling bluetooth audio route"); @@ -784,6 +788,8 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou accountCreator = LinphoneManager.getLc().createAccountCreator(LinphonePreferences.instance().getXmlrpcUrl()); accountCreator.setListener(this); callGsmON = false; + + updateMissedChatCount(); } public void setHandsetMode(Boolean on){ @@ -1089,6 +1095,8 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou return; } + increaseUnreadCountForChatRoom(cr); + Address from = message.getFromAddress(); LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(from); String textMessage = (message.getFileTransferInformation() != null) ? getString(R.string.content_description_incoming_file) : message.getTextContent(); @@ -1748,4 +1756,45 @@ public class LinphoneManager implements CoreListener, SensorEventListener, Accou public void onUpdateAccount(AccountCreator accountCreator, AccountCreator.Status status, String resp) { } + + private void updateMissedChatCount() { + for (ChatRoom cr : LinphoneManager.getLc().getChatRooms()) { + updateUnreadCountForChatRoom(cr, cr.getUnreadMessagesCount()); + } + } + + public int getUnreadMessageCount() { + int count = 0; + for (Integer unread : mUnreadChatsPerRoom.values()) { + count += unread; + } + return count; + } + + public void updateUnreadCountForChatRoom(String key, Integer value) { + mUnreadChatsPerRoom.put(key, value); + } + + + public void updateUnreadCountForChatRoom(ChatRoom cr, Integer value) { + String key = cr.getPeerAddress().asStringUriOnly(); + updateUnreadCountForChatRoom(key, value); + } + + public int getUnreadCountForChatRoom(ChatRoom cr) { + String key = cr.getPeerAddress().asStringUriOnly(); + if (mUnreadChatsPerRoom.containsKey(key)) { + return mUnreadChatsPerRoom.get(key); + } + return 0; + } + + private void increaseUnreadCountForChatRoom(ChatRoom cr) { + String key = cr.getPeerAddress().asStringUriOnly(); + if (mUnreadChatsPerRoom.containsKey(key)) { + mUnreadChatsPerRoom.put(key, mUnreadChatsPerRoom.get(key) + 1); + } else { + mUnreadChatsPerRoom.put(key, 1); + } + } } diff --git a/src/android/org/linphone/LinphoneService.java b/src/android/org/linphone/LinphoneService.java index e09629b57..d1e1f9dce 100644 --- a/src/android/org/linphone/LinphoneService.java +++ b/src/android/org/linphone/LinphoneService.java @@ -30,7 +30,6 @@ import org.linphone.contacts.LinphoneContact; import org.linphone.core.Address; import org.linphone.core.Call; import org.linphone.core.Call.State; -import org.linphone.core.Call.Status; import org.linphone.core.Core; import org.linphone.core.GlobalState; import org.linphone.core.RegistrationState; diff --git a/src/android/org/linphone/activities/LinphoneActivity.java b/src/android/org/linphone/activities/LinphoneActivity.java index ba0549996..1b781099a 100644 --- a/src/android/org/linphone/activities/LinphoneActivity.java +++ b/src/android/org/linphone/activities/LinphoneActivity.java @@ -233,7 +233,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick mListener = new CoreListenerStub(){ @Override public void onMessageReceived(Core lc, ChatRoom cr, ChatMessage message) { - displayMissedChats(getUnreadMessageCount()); + displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); } @Override @@ -666,30 +666,6 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick startActivity(new Intent(LinphoneActivity.this, InAppPurchaseActivity.class)); } - public int getUnreadMessageCount() { - int count = 0; - ChatRoom[] chats = LinphoneManager.getLc().getChatRooms(); - for (ChatRoom chatroom : chats) { - count += chatroom.getUnreadMessagesCount(); - } - return count; - } - - public void displayInfoChat(List list) { - Bundle extras = new Bundle(); - ArrayList listUri = new ArrayList(); - if (LinphoneManager.isInstanciated() && LinphoneManager.getLc() != null - && LinphoneManager.getLc().getDefaultProxyConfig() != null - && LinphoneManager.getLc().getDefaultProxyConfig().getIdentityAddress() != null) { - listUri.add(LinphoneManager.getLc().getDefaultProxyConfig().getIdentityAddress().asStringUriOnly()); - } - for (ContactAddress ca : list) { - listUri.add(ca.getAddressAsDisplayableString()); - } - extras.putStringArrayList("contactsSelected", listUri); - changeCurrentFragment(FragmentsAvailable.INFO_GROUP_CHAT, extras); - } - private void displayChat(String sipUri, String message, String fileUri, String pictureUri, String thumbnailUri, String displayName, Address lAddress) { Bundle extras = new Bundle(); extras.putString("SipUri", sipUri); @@ -728,7 +704,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick LinphoneService.instance().resetMessageNotifCount(); LinphoneService.instance().removeMessageNotification(); - displayMissedChats(getUnreadMessageCount()); + LinphoneManager.getInstance().updateUnreadCountForChatRoom(sipUri, 0); + displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); } public void goToChatGroupInfos(String address, ArrayList contacts, String subject, boolean isEditionEnabled, boolean isGoBack) { @@ -789,7 +766,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick LinphoneService.instance().resetMessageNotifCount(); LinphoneService.instance().removeMessageNotification(); - displayMissedChats(getUnreadMessageCount()); + LinphoneManager.getInstance().updateUnreadCountForChatRoom(sipUri, 0); + displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); } @Override @@ -912,8 +890,8 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick return statusFragment; } - public void updateMissedChatCount() { - displayMissedChats(getUnreadMessageCount()); + public void refreshMissedChatCountDisplay() { + displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); } public void displayMissedCalls(final int missedCallsCount) { @@ -1433,8 +1411,7 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick isTrialAccount(); } - updateMissedChatCount(); - + displayMissedChats(LinphoneManager.getInstance().getUnreadMessageCount()); displayMissedCalls(LinphoneManager.getLc().getMissedCallsCount()); LinphoneManager.getInstance().changeStatusToOnline(); diff --git a/src/android/org/linphone/call/CallActivity.java b/src/android/org/linphone/call/CallActivity.java index 9e9a595c5..54a52d6d1 100644 --- a/src/android/org/linphone/call/CallActivity.java +++ b/src/android/org/linphone/call/CallActivity.java @@ -1573,11 +1573,7 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList } private void displayMissedChats() { - int count = 0; - ChatRoom[] chats = LinphoneManager.getLc().getChatRooms(); - for (ChatRoom chatroom : chats) { - count += chatroom.getUnreadMessagesCount(); - } + int count = LinphoneManager.getInstance().getUnreadMessageCount(); if (count > 0) { missedChats.setText(count + ""); diff --git a/src/android/org/linphone/chat/ChatRoomsAdapter.java b/src/android/org/linphone/chat/ChatRoomsAdapter.java index c39e3975c..fe510fe95 100644 --- a/src/android/org/linphone/chat/ChatRoomsAdapter.java +++ b/src/android/org/linphone/chat/ChatRoomsAdapter.java @@ -162,7 +162,7 @@ public class ChatRoomsAdapter extends ListSelectionAdapter { chatRoom.setUserData(holder); } - int unreadMessagesCount = chatRoom.getUnreadMessagesCount(); + int unreadMessagesCount = LinphoneManager.getInstance().getUnreadCountForChatRoom(chatRoom); ChatMessage lastMessage = chatRoom.getLastMessageInHistory(); holder.lastMessageView.setText(""); holder.lastMessageSenderView.setText(""); diff --git a/src/android/org/linphone/chat/GroupChatFragment.java b/src/android/org/linphone/chat/GroupChatFragment.java index 536d8944a..f6bc5a414 100644 --- a/src/android/org/linphone/chat/GroupChatFragment.java +++ b/src/android/org/linphone/chat/GroupChatFragment.java @@ -398,7 +398,8 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con } mChatRoom.addListener(this); mChatRoom.markAsRead(); - LinphoneActivity.instance().updateMissedChatCount(); + LinphoneManager.getInstance().updateUnreadCountForChatRoom(mChatRoom, 0); + LinphoneActivity.instance().refreshMissedChatCountDisplay(); mRemoteParticipantAddress = mRemoteSipAddress; if (mChatRoom.hasCapability(ChatRoomCapabilities.OneToOne.toInt()) && mChatRoom.getParticipants().length > 0) { @@ -653,7 +654,8 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con @Override public void onChatMessageReceived(ChatRoom cr, EventLog event) { cr.markAsRead(); - LinphoneActivity.instance().updateMissedChatCount(); + LinphoneManager.getInstance().updateUnreadCountForChatRoom(mChatRoom, 0); + LinphoneActivity.instance().refreshMissedChatCountDisplay(); ChatMessage msg = event.getChatMessage(); if (msg.getErrorInfo() != null && msg.getErrorInfo().getReason() == Reason.UnsupportedContent) {