-
Notifications
You must be signed in to change notification settings - Fork 135
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
base: EaseIMKit
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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; | ||
|
@@ -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; | ||
|
@@ -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(); | ||
|
@@ -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
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 相关逻辑是否可以移到EaseChatLayout中的EaseHandleMessagePresenterImpl中?与发送消息等放到一块,方便将来维护。 |
||
|
||
/** | ||
* 是否有新的消息 | ||
* 判断依据为:数据库中最新的一条数据的时间戳是否大于页面上的最新一条数据的时间戳 | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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; | ||
|
||
|
@@ -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); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. SDK中是否提供了EMMessage.setSubMessage的接口? |
||
} | ||
} | ||
} | ||
} | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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); | ||
|
@@ -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 | ||
|
@@ -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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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); | ||
} | ||
|
||
} | ||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
建议将此dialog移到demo层,并将相应的文案统一(用中文还是英文?),并修改为资源引用的形式。