From 1b37387043ff1af8d565fe33c2a941188254e3c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sat, 3 Apr 2021 09:43:32 +0800 Subject: [PATCH] Improve batch translate --- .../nekomimi/nekogram/parts/ArticleTrans.kt | 43 +++++------- .../nekomimi/nekogram/parts/MessageTrans.kt | 69 +++++++++++-------- 2 files changed, 58 insertions(+), 54 deletions(-) diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ArticleTrans.kt b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ArticleTrans.kt index f2fa656bd..2e7bdda84 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ArticleTrans.kt +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ArticleTrans.kt @@ -5,11 +5,11 @@ import org.telegram.messenger.LocaleController import org.telegram.messenger.R import org.telegram.tgnet.TLRPC import org.telegram.ui.ArticleViewer -import tw.nekomimi.nekogram.NekoConfig import tw.nekomimi.nekogram.transtale.TranslateDb import tw.nekomimi.nekogram.transtale.Translator import tw.nekomimi.nekogram.utils.AlertUtil import tw.nekomimi.nekogram.utils.UIUtil +import tw.nekomimi.nekogram.utils.uUpdate import java.lang.Runnable import java.util.* import java.util.concurrent.atomic.AtomicBoolean @@ -50,21 +50,15 @@ fun HashSet.filterBaseTexts(): HashSet { fun ArticleViewer.doTransLATE() { - val dialog = AlertUtil.showProgress(parentActivity) + val status = AlertUtil.showProgress(parentActivity) - dialog.show() - - fun update(message: String) { - - UIUtil.runOnUIThread(Runnable { dialog.setMessage(message) }) - - } + status.show() val transPool = newFixedThreadPoolContext(5, "Article Trans Pool") val cancel = AtomicBoolean(false) - dialog.setOnCancelListener { + status.setOnCancelListener { adapter[0].trans = false transMenu.setTextAndIcon(LocaleController.getString("Translate", R.string.Translate), R.drawable.ic_translate) @@ -85,13 +79,14 @@ fun ArticleViewer.doTransLATE() { val all = array.size val taskCount = AtomicInteger(array.size) - update("0 / $all") + status.uUpdate("0 / $all") array.forEach { item -> when (item) { - is TLRPC.RichText -> getText(adapter[0], null, item, item, copy[item] ?: copy[item.parentRichText], 1000, true).takeIf { it.isNotBlank() }?.toString() + is TLRPC.RichText -> getText(adapter[0], null, item, item, copy[item] + ?: copy[item.parentRichText], 1000, true).takeIf { it.isNotBlank() }?.toString() is String -> item else -> null @@ -101,7 +96,7 @@ fun ArticleViewer.doTransLATE() { if (TranslateDb.currentTarget().contains(str)) { - update("${all - taskCount.get()} / $all") + status.uUpdate("${all - taskCount.get()} / $all") if (taskCount.decrementAndGet() % 10 == 0) UIUtil.runOnUIThread(Runnable { @@ -119,7 +114,7 @@ fun ArticleViewer.doTransLATE() { Translator.translate(str) - update((all - taskCount.get()).toString() + " / " + all) + status.uUpdate((all - taskCount.get()).toString() + " / " + all) if (taskCount.decrementAndGet() % 10 == 0) UIUtil.runOnUIThread(Runnable { @@ -138,12 +133,13 @@ fun ArticleViewer.doTransLATE() { UIUtil.runOnUIThread(Runnable { cancel.set(true) - dialog.dismiss() + status.dismiss() updatePaintSize() adapter[0].trans = false transMenu.setTextAndIcon(LocaleController.getString("Translate", R.string.Translate), R.drawable.ic_translate) - AlertUtil.showTransFailedDialog(parentActivity, it is UnsupportedOperationException,it.message ?: it.javaClass.simpleName, Runnable { + AlertUtil.showTransFailedDialog(parentActivity, it is UnsupportedOperationException, it.message + ?: it.javaClass.simpleName, Runnable { doTransLATE() }) @@ -164,19 +160,14 @@ fun ArticleViewer.doTransLATE() { } deferreds.awaitAll() + transPool.cancel() - UIUtil.runOnUIThread(Runnable { + if (!cancel.get()) UIUtil.runOnUIThread { - transPool.cancel() + updatePaintSize() + status.dismiss() - if (!cancel.get()) { - - updatePaintSize() - dialog.dismiss() - - } - - }) + } } diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/MessageTrans.kt b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/MessageTrans.kt index 462b216dc..956bf7baa 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/MessageTrans.kt +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/MessageTrans.kt @@ -1,9 +1,6 @@ package tw.nekomimi.nekogram.parts -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext +import kotlinx.coroutines.* import org.telegram.messenger.LocaleController import org.telegram.messenger.MessageObject import org.telegram.tgnet.TLRPC @@ -13,10 +10,12 @@ import tw.nekomimi.nekogram.transtale.TranslateDb import tw.nekomimi.nekogram.transtale.Translator import tw.nekomimi.nekogram.transtale.code2Locale import tw.nekomimi.nekogram.utils.AlertUtil +import tw.nekomimi.nekogram.utils.UIUtil import tw.nekomimi.nekogram.utils.uDismiss import tw.nekomimi.nekogram.utils.uUpdate import java.util.* import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicInteger fun MessageObject.toRawString(): String { @@ -109,45 +108,50 @@ fun ChatActivity.translateMessages(target: Locale = NekoConfig.translateToLang?. } val status = AlertUtil.showProgress(parentActivity) - val canceled = AtomicBoolean() + + val cancel = AtomicBoolean() status.setOnCancelListener { - - canceled.set(true) - + cancel.set(true) } status.show() + val deferreds = LinkedList>() + val taskCount = AtomicInteger(messages.size) + val transPool = newFixedThreadPoolContext(5, "Message Trans Pool") + + suspend fun next() { + val index = taskCount.decrementAndGet() + if (index == 0) { + status.uDismiss() + } else if (messages.size > 1) { + status.uUpdate("${messages.size - index} / ${messages.size}") + } + } + GlobalScope.launch(Dispatchers.IO) { - messages.forEachIndexed { i, selectedObject -> - - val isEnd = i == messages.size - 1 + messages.forEachIndexed { _, selectedObject -> val state = selectedObject.translateFinished(target) - if (messages.size > 1) status.uUpdate("${i + 1} / ${messages.size}") - if (state == 1) { + next() return@forEachIndexed } else if (state == 2) { + next() withContext(Dispatchers.Main) { - selectedObject.messageOwner.translated = true - messageHelper.resetMessageContent(dialogId, selectedObject) - - if (isEnd) status.dismiss() - } return@forEachIndexed } - withContext(Dispatchers.IO) trans@{ + deferreds.add(async(transPool) trans@{ val db = TranslateDb.forLocale(target) @@ -159,7 +163,7 @@ fun ChatActivity.translateMessages(target: Locale = NekoConfig.translateToLang?. if (question == null) { - if (canceled.get()) return@trans + if (cancel.get()) return@trans runCatching { @@ -171,7 +175,7 @@ fun ChatActivity.translateMessages(target: Locale = NekoConfig.translateToLang?. val parentActivity = parentActivity - if (parentActivity != null && !canceled.get()) { + if (parentActivity != null && !cancel.get()) { AlertUtil.showTransFailedDialog(parentActivity, it is UnsupportedOperationException, it.message ?: it.javaClass.simpleName) { @@ -196,7 +200,7 @@ fun ChatActivity.translateMessages(target: Locale = NekoConfig.translateToLang?. if (answer == null) { - if (canceled.get()) return@trans + if (cancel.get()) return@trans runCatching { @@ -208,7 +212,7 @@ fun ChatActivity.translateMessages(target: Locale = NekoConfig.translateToLang?. val parentActivity = parentActivity - if (parentActivity != null && !canceled.get()) { + if (parentActivity != null && !cancel.get()) { AlertUtil.showTransFailedDialog(parentActivity, e is UnsupportedOperationException, e.message ?: e.javaClass.simpleName) { @@ -245,7 +249,7 @@ fun ChatActivity.translateMessages(target: Locale = NekoConfig.translateToLang?. val parentActivity = parentActivity - if (parentActivity != null && !canceled.get()) { + if (parentActivity != null && !cancel.get()) { AlertUtil.showTransFailedDialog(parentActivity, it is UnsupportedOperationException, it.message ?: it.javaClass.simpleName) { @@ -267,21 +271,30 @@ fun ChatActivity.translateMessages(target: Locale = NekoConfig.translateToLang?. } - if (!canceled.get()) { + if (!cancel.get()) { selectedObject.messageOwner.translated = true + next() + withContext(Dispatchers.Main) { messageHelper.resetMessageContent(dialogId, selectedObject) - if (isEnd) status.dismiss() - } } else return@trans - } + }) + + } + + deferreds.awaitAll() + transPool.cancel() + + UIUtil.runOnUIThread { + + if (!cancel.get()) status.uDismiss() }