private void onMessageSuccess() { progressBar.setVisibility(View.GONE); statusView.setVisibility(View.GONE); // Show "1 Read" if this msg is a ding-type msg. if (EaseDingMessageHelper.get().isDingMessage(message) && ackedView != null) { ackedView.setVisibility(VISIBLE); List<String> userList = EaseDingMessageHelper.get().getAckUsers(message); int count = userList == null ? 0 : userList.size(); ackedView.setText(String.format(getContext().getString(R.string.group_ack_read_count), count)); } // Set ack-user list change listener. EaseDingMessageHelper.get().setUserUpdateListener(message, userUpdateListener); }
@Override public void onCmdMessageReceived(List<EMMessage> messages) { for (EMMessage message : messages) { // To handle group-ack msg. EaseDingMessageHelper.get().handleAckMessage(message); } } });
@Override protected void onPause() { super.onPause(); // Remove ack-user change listener. EaseDingMessageHelper.get().setUserUpdateListener(msg, null); }
@Test public void testHandleAckMessage() throws Exception { assertNotNull(helper); // Data will store in memory. helper.handleAckMessage(createDingAckMessage("1", "-1", "user1")); assertEquals(helper.getDataCache().size(), 1); LruCache<String, List<String>> msgCache = helper.getDataCache().get("1"); assertNotNull(msgCache); List<String> userList = msgCache.get("-1"); assertNotNull(userList); assertEquals(userList.size(), 1); assertEquals(userList.get(0), "user1"); // Data will store in SharedPreferences too. assertTrue(helper.getDataPrefs().contains(helper.generateKey("1", "-1"))); }
@Override protected void onResume() { super.onResume(); List<String> list = EaseDingMessageHelper.get().getAckUsers(msg); userList.clear(); if (list != null) { userList.addAll(list); } userAdapter.notifyDataSetChanged(); // Set ack-user change listener. EaseDingMessageHelper.get().setUserUpdateListener(msg, userUpdateListener); }
@Test public void testDelete() throws Exception { testHandleAckMessage(); helper.delete(createDingMessage("1", "-1")); // Data removed from memory. LruCache<String, List<String>> msgCache = helper.getDataCache().get("1"); assertTrue(msgCache.get("-1") == null); // Data removed from SharedPreferences. assertTrue(!helper.getDataPrefs().contains(helper.generateKey("1", "-1"))); }
if (!validateMessage(message)) { return null; msgCache = createCache(); dataCache.put(conversationId, msgCache); String key = generateKey(conversationId, msgId);
if (!isDingAckMessage(message)) { return; msgCache = createCache(); dataCache.put(conversationId, msgCache); String key = generateKey(conversationId, msgId); Set<String> set = new HashSet<>(); set.addAll(userList);
/** * Delete the native stored acked users if this message deleted. * * @param message */ public void delete(EMMessage message) { if (!validateMessage(message)) { return; } String conversationId = message.getTo(); String msgId = message.getMsgId(); // Remove the memory data. LruCache<String, List<String>> msgCache = dataCache.get(conversationId); if (msgCache != null) { msgCache.remove(msgId); } // Delete the data in preferences. String key = generateKey(conversationId, msgId); if (dataPrefs.contains(key)) { prefsEditor.remove(key).commit(); } }
@Test public void testGetAckUsers() throws Exception { // Clear memory cache first. helper.getDataCache().evictAll(); assertEquals(helper.getDataCache().size(), 0); // After this action, the data will store in memory. helper.getAckUsers(createDingMessage("1", "-1")); assertEquals(helper.getDataCache().size(), 1); }
@Test public void testWeakReference() throws Exception { for (int i = 0; i < 10; i++) { helper.setUserUpdateListener(createDingMessage(String.valueOf(i), String.valueOf(-i)), new EaseDingMessageHelper.IAckUserUpdateListener() { @Override public void onUpdate(List<String> list) { } }); } Runtime.getRuntime().gc(); SystemClock.sleep(1000); WeakReference<EaseDingMessageHelper.IAckUserUpdateListener> listenerRefs = helper.getListenerMap().get("-1"); System.out.println("listenerRefs get() -> " + listenerRefs.get()); assertTrue(true); }
@Test public void testLruCache() throws Exception { /** * {@link EaseDingMessageHelper#dataCache} dataCache can contains {@link EaseDingMessageHelper#CACHE_SIZE_CONVERSATION} * size of conversations at most. */ // Clear memory cache first. helper.getDataCache().evictAll(); // Create size + 1 ding-type ack msg and add to dataCache. for (int i = 0; i <= EaseDingMessageHelper.CACHE_SIZE_CONVERSATION; i++) { helper.handleAckMessage(createDingAckMessage(String.valueOf(i), String.valueOf(-i), String.valueOf("user" + i))); } assertEquals(helper.getDataCache().size(), EaseDingMessageHelper.CACHE_SIZE_CONVERSATION); /** * Every conversation can contains {@link EaseDingMessageHelper#CACHE_SIZE_MESSAGE} size of ding-type msg at most. */ // Clear memory cache first. helper.getDataCache().evictAll(); for (int i = 0; i <= EaseDingMessageHelper.CACHE_SIZE_MESSAGE; i++) { helper.handleAckMessage(createDingAckMessage("1", String.valueOf(-i), String.valueOf("user" + i))); } LruCache<String, List<String>> msgCache = helper.getDataCache().get("1"); assertEquals(msgCache.size(), EaseDingMessageHelper.CACHE_SIZE_MESSAGE); }
public static EaseDingMessageHelper get() { if (instance == null) { synchronized (EaseDingMessageHelper.class) { if (instance == null) { instance = new EaseDingMessageHelper(EMClient.getInstance().getContext()); } } } return instance; }
@Override public void onBubbleClick(EMMessage message) { super.onBubbleClick(message); if (!EaseDingMessageHelper.get().isDingMessage(message)) { return; } // If this msg is a ding-type msg, click to show a list who has already read this message. Intent i = new Intent(getContext(), EaseDingAckUserListActivity.class); i.putExtra("msg", message); getContext().startActivity(i); }
/** * Delete the native stored acked users if this conversation deleted. * * @param conversation */ public void delete(EMConversation conversation) { if (!conversation.isGroup()) { return; } // Remove the memory data. String conversationId = conversation.conversationId(); dataCache.remove(conversationId); // Remove the preferences data. String keyPrefix = generateKey(conversationId, ""); Map<String, ?> prefsMap = dataPrefs.getAll(); Set<String> keySet = prefsMap.keySet(); for (String key : keySet) { if (key.startsWith(keyPrefix)) { prefsEditor.remove(key); } } prefsEditor.commit(); }
EMLog.i(TAG, "To send the ding-type msg, content: " + msgContent); EMMessage dingMsg = EaseDingMessageHelper.get().createDingMessage(toChatUsername, msgContent); sendMessage(dingMsg);
@Override protected void handleReceiveMessage(EMMessage message) { if (!message.isAcked() && message.getChatType() == EMMessage.ChatType.Chat) { try { EMClient.getInstance().chatManager().ackMessageRead(message.getFrom(), message.getMsgId()); } catch (HyphenateException e) { e.printStackTrace(); } return; } // Send the group-ack cmd type msg if this msg is a ding-type msg. EaseDingMessageHelper.get().sendAckMessage(message); } }
@Before public void setUp() throws Exception { Context context = InstrumentationRegistry.getContext(); assertNotNull(context); helper = new EaseDingMessageHelper(context); assertNotNull(helper); // Load this for EMMessage native creation. System.loadLibrary("hyphenate"); }