Closed firojandev closed 6 years ago
hello @firojandev, message ID never can change, maybe you mean message's position in adapter? You can realize deleting messages for example by long press on message bubble. For deleting message you can use QBRestChatService.deleteMessage(messageId, forceDelete). You can set forceDelete=true for own messages and forceDelete=false for opponent's messages. Additionally you should provide for notifying opponents about force deleting ща message, you can use System Notification or common messages with parameter save_to_history=false, after receiving this messages opponent should update UI and DB for deleting message.
Thanks for replying....
I have done below process
Step 1: I have created a interface like below
public interface QBBubbleClickListener { void onBubbleLongClicked(QBChatMessage qbChatMessage, int positionInAdapter); }
Step 2:
At the QBChatMessagesAdapter, I use
holder.bubbleFrame.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { qbBubbleClickListener.onBubbleLongClicked(chatMessage,position); return false; } });
Step 3: At the BaseDialogActivity class
protected class BubbleLongClickListener implements QBBubbleClickListener{ @Override public void onBubbleLongClicked(QBChatMessage qbChatMessage, int positionInAdapter) { ToastUtils.shortToast("MessageId:"+qbChatMessage.getId()+" dialogId:"+qbChatMessage.getDialogId()+" Message Body:"+qbChatMessage.getBody()); Glog.logMsg(TAG,"MessageId:"+qbChatMessage.getId()+" dialogId:"+qbChatMessage.getDialogId()+" Message Body:"+qbChatMessage.getBody()); deleteMsg(qbChatMessage.getId(),positionInAdapter); } }
public void deleteMsg(final String messageId,final int positionInAdapter){
QBRestChatService.deleteMessage(messageId, false).performAsync(new QBEntityCallback<Void>() {
@Override
public void onSuccess(Void aVoid, Bundle bundle) {
hideProgress();
Glog.logMsg(TAG,"onSuccess delete message");
if (combinationMessagesList.size()>0){
combinationMessagesList.remove(positionInAdapter);
messagesAdapter.notifyDataSetChanged();
}
}
@Override
public void onError(QBResponseException e) {
Glog.logMsg(TAG,"onError delete message:"+e.toString());
hideProgress();
ToastUtils.shortToast("Failed to delete message!");
}
});
}
Result: onError delete message:com.quickblox.core.exception.QBResponseException: Entity you are looking for was not found.,The resource wasn't found
So what I make mistake?????
My Observation: when a message created the message id display below
created message = Message [messageId='5a7dac0d9d02de5d0ac059af', dialogOccupant='DialogOccupant [id='1', dialog='Dialog [dialogId='5a7584d7a0eb474e872ed9dd', modifiedDateLocal='1518185485', title='Altaf BL']',..............":"no"}'} ']', body='hi this is for delete test msg ', createdDate='1518185485', state='SYNC']
But when I long press on that message bubble. Another message ID display
MessageId:5a7dac0d9d02de5d0ac059b1 dialogId:null Message Body:hi this is for delete test msg
Please help
Are you sure that message with id 5a7dac0d9d02de5d0ac059af was sent success before, and this message had parameter save_to_history=true? You can check it in logs. Check your adapter, how you get chatMessage from viewHolder, this is the same message?
Hi,
At my QBMessagesAdapter
@Override public void onBindViewHolder(QBMessageViewHolder holder, int position) { T chatMessage = getItem(position); int valueType = getItemViewType(position); switch (valueType) { case TYPE_TEXT_RIGHT: Log.e(TAG, "onBindViewHolder TYPE_TEXT_RIGHT"); onBindViewMsgRightHolder((TextMessageHolder) holder, chatMessage, position); break; case TYPE_TEXT_LEFT: Log.e(TAG, "onBindViewHolder TYPE_TEXT_LEFT"); onBindViewMsgLeftHolder((TextMessageHolder) holder, chatMessage, position); break;
protected void onBindViewAttachRightHolder(ImageAttachHolder holder, final T chatMessage, final int position) { setDateSentAttach(holder, chatMessage); displayAttachment(holder, position); int valueType = getItemViewType(position); String avatarUrl = obtainAvatarUrl(valueType, chatMessage); if (avatarUrl != null) { displayAvatarImage(avatarUrl, holder.avatar); }
holder.bubbleFrame.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { qbBubbleClickListener.onBubbleLongClicked(chatMessage,position); return false; } });
Surprisingly ... When I enter chat screen every time I get new messageId for same message
Example ---> MessageId:5a7dac0d9d02de5d0ac059b1 dialogId:null Message Body:hi this is for delete test msg
--->MessageId:5a7dac0d9d02de5d0ac059cf dialogId:null Message Body:hi this is for delete test msg
-->MessageId:5a7dac0d9d02de5d0ac059ed dialogId:null Message Body:hi this is for delete test msg
When I click on that message bubble after entering chat screen I got above message ID.
I so frustrated.....
Any suggestions?
Hi @tatanka987 Just for your kind information....I am using Quickblox Adavnced plan.
looks like you call 'new QBChatMessage()' somewhere in your code and use it message for delete, please check it.
Thanks @tatanka987 Did you mean I am creating new instance of QBChatMessage() at the QBChatMessagesAdapter? OK... I am checking...
yes, because constructor QBChatMessage() every time generates new message id, from your issue's description I did this conclusion.
I didn't call 'new QBChatMessage()' other place in code.... I checked....
Hi @tatanka987 We would be very benefited if this message delete feature by using message ID was implemented with q-municate-android project.
Hi @tatanka987 Want to delete message from local db can u help me in it?
Hello,
I need to delete message from chat dialog screen? So how can I delete single message at a time when user click on this any message?
I noticed that the message ID is changing when UI refresh or re enter the chat dialog. So how can I implement this message delete fucntion?
Please help