Add support for translate selected text

API 23+
Maybe close #74
This commit is contained in:
NekoInverter 2020-05-01 09:37:56 +08:00
parent 4f4e9d1246
commit d75af66bc7
No known key found for this signature in database
GPG Key ID: 280D6CCCF95715F9
3 changed files with 74 additions and 0 deletions

View File

@ -50,6 +50,8 @@ import org.telegram.ui.Components.RecyclerListView;
import java.util.ArrayList;
import tw.nekomimi.nekogram.MessageHelper;
import static org.telegram.ui.ActionBar.FloatingToolbar.STYLE_THEME;
import static org.telegram.ui.ActionBar.Theme.key_chat_inTextSelectionHighlight;
@ -1218,6 +1220,7 @@ public abstract class TextSelectionHelper<Cell extends TextSelectionHelper.Selec
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
menu.add(Menu.NONE, android.R.id.copy, 0, android.R.string.copy);
menu.add(Menu.NONE, android.R.id.selectAll, 1, android.R.string.selectAll);
menu.add(Menu.NONE, R.id.menu_translate, 2, R.string.Translate);
return true;
}
@ -1254,6 +1257,20 @@ public abstract class TextSelectionHelper<Cell extends TextSelectionHelper.Selec
invalidate();
showActions();
return true;
case R.id.menu_translate:
if (!isSelectionMode()) {
return true;
}
CharSequence str = getTextForCopy();
if (str == null) {
return true;
}
MessageHelper.showTranslateDialog(textSelectionOverlay.getContext(), str.toString());
hideActions();
clear(true);
if (TextSelectionHelper.this.callback != null) {
TextSelectionHelper.this.callback.onTextCopied();
}
default:
clear();
}

View File

@ -1,18 +1,27 @@
package tw.nekomimi.nekogram;
import android.content.Context;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.BaseController;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.tgnet.ConnectionsManager;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.AlertDialog;
import org.telegram.ui.Cells.ChatMessageCell;
import java.util.ArrayList;
import tw.nekomimi.nekogram.translator.TranslateBottomSheet;
import tw.nekomimi.nekogram.translator.Translator;
public class MessageHelper extends BaseController {
private static volatile MessageHelper[] Instance = new MessageHelper[UserConfig.MAX_ACCOUNT_COUNT];
private static AlertDialog progressDialog;
private int lastReqId;
public MessageHelper(int num) {
@ -32,6 +41,53 @@ public class MessageHelper extends BaseController {
chatMessageCell.invalidate();
}
public static void showTranslateDialog(Context context, String query) {
if (NekoConfig.translationProvider < 0) {
TranslateBottomSheet.show(context, query);
} else {
if (progressDialog != null) {
progressDialog.dismiss();
}
Translator.translate(query, new Translator.TranslateCallBack() {
@Override
public void onSuccess(String translation) {
if (progressDialog != null) {
progressDialog.dismiss();
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(translation);
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
builder.setNeutralButton(LocaleController.getString("Copy", R.string.Copy), (dialog, which) -> AndroidUtilities.addToClipboard(translation));
builder.show();
}
@Override
public void onError() {
if (progressDialog != null) {
progressDialog.dismiss();
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(LocaleController.getString("TranslateFailed", R.string.TranslateFailed));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
builder.show();
}
@Override
public void onUnsupported() {
if (progressDialog != null) {
progressDialog.dismiss();
}
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(LocaleController.getString("TranslateApiUnsupported", R.string.TranslateApiUnsupported));
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
builder.show();
}
});
progressDialog = new AlertDialog(context, 3);
progressDialog.showDelayed(400);
}
}
public static MessageHelper getInstance(int num) {
MessageHelper localInstance = Instance[num];
if (localInstance == null) {

View File

@ -15,6 +15,7 @@
<item name="acc_action_small_button" type="id"/>
<item name="acc_action_msg_options" type="id"/>
<item name="acc_action_open_photo" type="id"/>
<item name="menu_translate" type="id"/>
<!-- there are required for focusing order customization on the passcode screen -->
<item name="passcode_btn_1" type="id"/>