Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

translation ui changes for message chat view and conversation list view #232

Open
wants to merge 1 commit into
base: EaseIMKit
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.hyphenate.easeui.modules.chat;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
Expand Down Expand Up @@ -53,6 +55,9 @@
import com.hyphenate.easeui.modules.menu.EasePopupWindow;
import com.hyphenate.easeui.modules.menu.EasePopupWindowHelper;
import com.hyphenate.easeui.modules.menu.MenuItemBean;
import com.hyphenate.chat.translator.EMTranslationManager;
import com.hyphenate.chat.translator.EMTranslationMessage;
import com.hyphenate.chat.translator.EMTranslationResult;
import com.hyphenate.easeui.utils.EaseCommonUtils;
import com.hyphenate.easeui.utils.EaseUserUtils;
import com.hyphenate.easeui.widget.EaseAlertDialog;
Expand Down Expand Up @@ -137,6 +142,12 @@ public class EaseChatLayout extends RelativeLayout implements IChatLayout, IHand
*/
private boolean isNotFirstSend;

/**
* 翻译目标语言,默认英文
*/

private String targetLanguageCode = "en";

public EaseChatLayout(Context context) {
this(context, null);
}
Expand Down Expand Up @@ -252,6 +263,10 @@ public void loadData(String msgId) {
messageListLayout.loadData(msgId);
}

public void setTargetLanguageCode(String lanugageCode) {
targetLanguageCode = lanugageCode;
}

private void initTypingHandler() {
typingHandler = new Handler() {
@Override
Expand Down Expand Up @@ -948,7 +963,21 @@ public boolean onMenuItemClick(MenuItemBean item) {
EMLog.i(TAG,"currentMsgId = "+message.getMsgId() + " timestamp = "+message.getMsgTime());
}else if(itemId == R.id.action_chat_recall) {
recallMessage(message);
}else if(itemId == R.id.action_chat_translate) {
messageListLayout.translateMessage(message, targetLanguageCode);
}else if(itemId == R.id.action_chat_reTranslate) {
new AlertDialog.Builder(getContext())
.setTitle("Using Translate")
.setMessage("Each translation can be retranslated only once. The translation provided is for reference only.")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
messageListLayout.reTranslate(message, targetLanguageCode);
}
}).show();
Comment on lines +969 to +976
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议将此dialog移到demo层,并将相应的文案统一(用中文还是英文?),并修改为资源引用的形式。

}else if(itemId == R.id.action_chat_hide) {
messageListLayout.hideMessage(message);
}

return true;
}
return false;
Expand All @@ -965,15 +994,45 @@ public void onDismiss(PopupWindow menu) {
menuHelper.show(this, v);
}

private boolean showTranslation(EMMessage message) {
if(!EMTranslationManager.getInstance().isInitialized())
return false;

if(!EMTranslationManager.getInstance().isTranslationPresentForMessage(message.getMsgId()))
return true;

EMTranslationResult result = EMTranslationManager.getInstance().getTranslationMessage(message.getMsgId());
if(result.getShowTranslation())
return false;

return true;
}

private void setMenuByMsgType(EMMessage message) {
EMMessage.Type type = message.getType();
menuHelper.findItemVisible(R.id.action_chat_copy, false);
menuHelper.findItemVisible(R.id.action_chat_recall, false);
menuHelper.findItemVisible(R.id.action_chat_translate, false);
menuHelper.findItemVisible(R.id.action_chat_reTranslate, false);
menuHelper.findItemVisible(R.id.action_chat_hide, false);

menuHelper.findItem(R.id.action_chat_delete).setTitle(getContext().getString(R.string.action_delete));
switch (type) {
case TXT:
menuHelper.findItemVisible(R.id.action_chat_copy, true);
menuHelper.findItemVisible(R.id.action_chat_recall, true);
if(message instanceof EMTranslationMessage) {
menuHelper.findItemVisible(R.id.action_chat_delete, false);

if(((EMTranslationMessage) message).isReTranslatable())
menuHelper.findItemVisible(R.id.action_chat_reTranslate, true);

menuHelper.findItemVisible(R.id.action_chat_hide, true);
} else {
menuHelper.findItemVisible(R.id.action_chat_copy, true);
menuHelper.findItemVisible(R.id.action_chat_recall, true);

if (showTranslation(message))
menuHelper.findItemVisible(R.id.action_chat_translate, true);
}
break;
case LOCATION:
case FILE:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,12 @@
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;

import com.hyphenate.EMValueCallBack;
import com.hyphenate.chat.EMChatRoom;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMConversation;
import com.hyphenate.chat.EMMessage;
import com.hyphenate.chat.EMTextMessageBody;
import com.hyphenate.easeui.R;
import com.hyphenate.easeui.adapter.EaseMessageAdapter;
import com.hyphenate.easeui.interfaces.MessageListItemClickListener;
Expand All @@ -36,6 +38,9 @@
import com.hyphenate.easeui.modules.chat.presenter.EaseChatMessagePresenter;
import com.hyphenate.easeui.modules.chat.presenter.EaseChatMessagePresenterImpl;
import com.hyphenate.easeui.modules.chat.presenter.IChatMessageListView;
import com.hyphenate.chat.translator.EMTranslationManager;
import com.hyphenate.chat.translator.EMTranslationMessage;
import com.hyphenate.chat.translator.EMTranslationResult;
import com.hyphenate.easeui.utils.EaseCommonUtils;

import java.util.List;
Expand Down Expand Up @@ -602,6 +607,7 @@ public void removeMessage(EMMessage message) {
return;
}
conversation.removeMessage(message.getMsgId());
EMTranslationManager.getInstance().removeTranslationByMsgId(message.getMsgId());
runOnUi(()-> {
if(presenter.isActive()) {
List<EMMessage> messages = messageAdapter.getData();
Expand Down Expand Up @@ -746,6 +752,61 @@ public void removeRVItemDecoration(@NonNull RecyclerView.ItemDecoration decor) {
rvList.removeItemDecoration(decor);
}

public void translateMessage(EMMessage message, String languageCode) {
EMTextMessageBody body = (EMTextMessageBody) message.getBody();
if(body == null)
return;

EMTranslationManager.getInstance().translate(message.getMsgId(),
message.conversationId(),
body.getMessage(),
languageCode,
new EMValueCallBack<EMTranslationResult>() {
@Override
public void onSuccess(EMTranslationResult result) {
if(message == null || messageAdapter.getData() == null) {
return;
}
runOnUi(()-> {
if(presenter.isActive()) {
List<EMMessage> messages = messageAdapter.getData();
int position = messages.lastIndexOf(message);
if(position != -1) {
EMTranslationMessage translationMessage = EMTranslationMessage.createMessage(message, result);
message.setSubMessage(translationMessage);
messageAdapter.notifyItemChanged(position);
}
}
});
}
@Override
public void onError(int errorCode, String errorText) {
//not used here
}
});
}

public void hideMessage(EMMessage message) {
EMTranslationMessage translationMessage = (EMTranslationMessage) message;
EMMessage parent = translationMessage.getParent();
translationMessage.hide();
parent.setSubMessage(null);

int position = messageAdapter.getData().lastIndexOf(parent);
if(position != -1) {
messageAdapter.notifyItemChanged(position);
}

}

public void reTranslate(EMMessage message, String languageCode) {
EMTranslationMessage translationMessage = (EMTranslationMessage) message;
EMMessage parent = translationMessage.getParent();
translationMessage.clearParent();;
parent.setSubMessage(null);
translateMessage(parent, languageCode);
}
Comment on lines +802 to +808
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

相关逻辑是否可以移到EaseChatLayout中的EaseHandleMessagePresenterImpl中?与发送消息等放到一块,方便将来维护。


/**
* 是否有新的消息
* 判断依据为:数据库中最新的一条数据的时间戳是否大于页面上的最新一条数据的时间戳
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import com.hyphenate.chat.EMConversation;
import com.hyphenate.chat.EMCursorResult;
import com.hyphenate.chat.EMMessage;
import com.hyphenate.chat.translator.EMTranslationManager;
import com.hyphenate.chat.translator.EMTranslationMessage;
import com.hyphenate.chat.translator.EMTranslationResult;

import java.util.List;

Expand Down Expand Up @@ -215,16 +218,26 @@ public boolean isMessageId(String msgId) {

/**
* Check message's status, if is not success or fail, set to {@link com.hyphenate.chat.EMMessage.Status#FAIL}
* Also add translation messages if avaliable
* @param messages
*/
private void checkMessageStatus(List<EMMessage> messages) {
if(messages == null || messages.isEmpty()) {
return;
}

for (EMMessage message : messages) {
if(message.status() != EMMessage.Status.SUCCESS && message.status() != EMMessage.Status.FAIL) {
message.setStatus(EMMessage.Status.FAIL);
}

if(EMTranslationManager.getInstance().isTranslationPresentForMessage(message.getMsgId())) {
EMTranslationResult result = EMTranslationManager.getInstance().getTranslationMessage(message.getMsgId());
if(result.getShowTranslation()) {
EMTranslationMessage translationMessage = EMTranslationMessage.createMessage(message, result);
message.setSubMessage(translationMessage);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SDK中是否提供了EMMessage.setSubMessage的接口?

}
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMConversation;
import com.hyphenate.chat.translator.EMTranslationManager;
import com.hyphenate.chat.translator.EMTranslationResult;
import com.hyphenate.easeui.constants.EaseConstant;
import com.hyphenate.easeui.modules.conversation.model.EaseConversationInfo;
import com.hyphenate.easeui.utils.EaseCommonUtils;
Expand Down Expand Up @@ -170,6 +172,7 @@ public void deleteConversation(int position, EaseConversationInfo info) {
if(!isDestroy()) {
if(isDelete) {
mView.deleteItem(position);
EMTranslationManager.getInstance().removeTranslationByConversationId(((EMConversation) info.getInfo()).conversationId());
}else {
mView.deleteItemFail(position, "");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@
import java.util.Map;

public class EasePopupWindowHelper {
private static final int[] itemIds = {R.id.action_chat_copy, R.id.action_chat_delete, R.id.action_chat_recall};
private static final int[] titles = {R.string.action_copy, R.string.action_delete, R.string.action_recall};
private static final int[] icons = {R.drawable.ease_chat_item_menu_copy, R.drawable.ease_chat_item_menu_delete, R.drawable.ease_chat_item_menu_recall};
private static final int[] itemIds = {R.id.action_chat_copy, R.id.action_chat_delete, R.id.action_chat_recall, R.id.action_chat_translate, R.id.action_chat_reTranslate, R.id.action_chat_hide};
private static final int[] titles = {R.string.action_copy, R.string.action_delete, R.string.action_recall, R.string.action_translate, R.string.action_reTranslate, R.string.action_hide };
private static final int[] icons = {R.drawable.ease_chat_item_menu_copy, R.drawable.ease_chat_item_menu_delete, R.drawable.ease_chat_item_menu_recall, R.drawable.ease_chat_item_menu_recall, R.drawable.ease_chat_item_menu_recall, R.drawable.ease_chat_item_menu_recall};
private static final int SPAN_COUNT = 5;
private EasePopupWindow pMenu;
private List<MenuItemBean> menuItems = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,24 @@
import android.text.Spanned;
import android.text.style.URLSpan;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TextView.BufferType;

import com.hyphenate.chat.EMMessage;
import com.hyphenate.chat.EMTextMessageBody;
import com.hyphenate.easeui.R;
import com.hyphenate.easeui.manager.EaseDingMessageHelper;
import com.hyphenate.chat.translator.EMTranslationMessage;
import com.hyphenate.chat.translator.EMTranslationResult;
import com.hyphenate.easeui.utils.EaseSmileUtils;

public class EaseChatRowText extends EaseChatRow {
private TextView contentView;
private TextView translationContentView;
private ImageView translationStatusView;
private View translationContainer;


public EaseChatRowText(Context context, boolean isSender) {
super(context, isSender);
Expand All @@ -27,13 +34,16 @@ public EaseChatRowText(Context context, EMMessage message, int position, Object

@Override
protected void onInflateView() {
inflater.inflate(!showSenderType ? R.layout.ease_row_received_message
inflater.inflate(!showSenderType ? R.layout.ease_row_received_message
: R.layout.ease_row_sent_message, this);
}

@Override
protected void onFindViewById() {
contentView = (TextView) findViewById(R.id.tv_chatcontent);
contentView = (TextView) findViewById(R.id.tv_chatcontent);
translationContentView = (TextView) findViewById(R.id.tv_subContent);
translationStatusView = (ImageView) findViewById(R.id.translation_status);
translationContainer = (View) findViewById(R.id.subBubble);
}

@Override
Expand All @@ -53,7 +63,31 @@ public boolean onLongClick(View v) {
return false;
}
});

replaceSpan();

if(message.subMessage() != null) {
translationContainer.setVisibility(View.VISIBLE);
EMTranslationResult result = ((EMTranslationMessage)message.subMessage()).getTranslationResult();
Comment on lines +68 to +71
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

核实一下subMessage的逻辑。

translationContentView.setText(result.getTranslatedText());
translationContentView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
contentView.setTag(R.id.action_chat_long_click,true);
if (itemClickListener != null) {
return itemClickListener.onBubbleLongClick(v, message.subMessage());
}
return false;
}
});
if(result.isSuccess())
translationStatusView.setImageResource(R.drawable.translation_success);
else
translationStatusView.setImageResource(R.drawable.translation_failure);
} else {
translationContainer.setVisibility(View.GONE);
}

}
}

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
32 changes: 32 additions & 0 deletions ease-im-kit/src/main/res/layout/ease_row_received_message.xml
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,37 @@
android:layout_toRightOf="@id/iv_userhead"
android:visibility="gone" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/subBubble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/bubble"
android:minWidth="30dp"
android:layout_marginLeft="50dp"
android:layout_toRightOf="@id/iv_userhead"
android:padding="8dp"
android:layout_marginTop="2dp"
android:background="@drawable/ease_chat_bubble_receive_bg">

<com.hyphenate.easeui.widget.EaseImageView
android:id="@+id/translation_status"
android:layout_width="10dp"
android:layout_height="10dp" />

<TextView
android:id="@+id/tv_subContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_toRightOf="@id/translation_status"
android:autoLink="web"
android:gravity="center|left"
android:lineSpacingExtra="2dp"
android:maxWidth="225.0dip"
android:minHeight="@dimen/ease_chat_text_min_height"
android:textColor="#ff000000"
android:textSize="15sp"
tools:text="环信" />
</RelativeLayout>

</LinearLayout>
Loading