QuickBlox / q-municate-android

Qmunicate Android chat application
MIT License
252 stars 198 forks source link

Message delete by using message ID in android #275

Closed firojandev closed 6 years ago

firojandev commented 6 years ago

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

tatanka987 commented 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.

firojandev commented 6 years ago

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

tatanka987 commented 6 years ago

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?

firojandev commented 6 years ago

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?

firojandev commented 6 years ago

Hi @tatanka987 Just for your kind information....I am using Quickblox Adavnced plan.

tatanka987 commented 6 years ago

looks like you call 'new QBChatMessage()' somewhere in your code and use it message for delete, please check it.

firojandev commented 6 years ago

Thanks @tatanka987 Did you mean I am creating new instance of QBChatMessage() at the QBChatMessagesAdapter? OK... I am checking...

tatanka987 commented 6 years ago

yes, because constructor QBChatMessage() every time generates new message id, from your issue's description I did this conclusion.

firojandev commented 6 years ago

I didn't call 'new QBChatMessage()' other place in code.... I checked....

firojandev commented 6 years ago

Hi @tatanka987 We would be very benefited if this message delete feature by using message ID was implemented with q-municate-android project.

leena12345 commented 5 years ago

Hi @tatanka987 Want to delete message from local db can u help me in it?