From fbd6458bbef9f292294d932da1a47b42776426e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 6 Apr 2020 01:21:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=96=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TMessagesProj/build.gradle | 1 + TMessagesProj/src/main/AndroidManifest.xml | 2 +- .../messenger/MessagesController.java | 2 +- .../org/telegram/messenger/SharedConfig.java | 27 +- .../java/org/telegram/ui/ArticleViewer.java | 285 ++++++++++++++---- .../org/telegram/ui/Components/UndoView.java | 6 + .../java/org/telegram/ui/ProfileActivity.java | 3 +- .../org/telegram/ui/ProxyListActivity.java | 20 +- .../org/telegram/ui/SettingsActivity.java | 2 +- .../nekogram/NekoSettingsActivity.java | 4 +- .../tw/nekomimi/nekogram/database/Nitrites.kt | 9 + .../nekogram/translator/TransItem.java | 40 +++ .../nekogram/translator/TranslateDb.kt | 36 +++ .../nekogram/translator/Translator.java | 22 ++ .../tw/nekomimi/nekogram/utils/AlertUtil.kt | 28 +- 15 files changed, 362 insertions(+), 125 deletions(-) create mode 100644 TMessagesProj/src/main/java/tw/nekomimi/nekogram/database/Nitrites.kt create mode 100644 TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/TransItem.java create mode 100644 TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/TranslateDb.kt diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index a689c9656..c7ae906cd 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -32,6 +32,7 @@ dependencies { implementation "com.squareup.okhttp3:okhttp:$okHttpVersion" implementation "com.squareup.okhttp3:okhttp-dnsoverhttps:$okHttpVersion" implementation 'dnsjava:dnsjava:3.0.2' + implementation 'org.dizitart:nitrite:3.4.1' implementation files('libs/libv2ray.aar') implementation files('libs/ss-libev-release.aar') diff --git a/TMessagesProj/src/main/AndroidManifest.xml b/TMessagesProj/src/main/AndroidManifest.xml index 1dd3abbd1..23420302c 100644 --- a/TMessagesProj/src/main/AndroidManifest.xml +++ b/TMessagesProj/src/main/AndroidManifest.xml @@ -88,7 +88,7 @@ android:largeHeap="true" android:theme="@style/Theme.TMessages.Start" android:manageSpaceActivity="org.telegram.ui.ExternalActionActivity" - android:supportsRtl="true"> + android:supportsRtl="false"> (proxyList)) { try { JSONObject obj = info.toJson(); - if (info.isInternal) { + if (info.isPublic) { continue; } proxyArray.put(obj); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java b/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java index 6dc1e0823..5b9f49328 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ArticleViewer.java @@ -137,6 +137,7 @@ import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.ActionBar; import org.telegram.ui.ActionBar.ActionBarMenu; import org.telegram.ui.ActionBar.ActionBarMenuItem; +import org.telegram.ui.ActionBar.ActionBarMenuSubItem; import org.telegram.ui.ActionBar.ActionBarPopupWindow; import org.telegram.ui.ActionBar.AlertDialog; import org.telegram.ui.ActionBar.BackDrawable; @@ -182,14 +183,22 @@ import org.telegram.ui.Components.VideoPlayer; import org.telegram.ui.Components.WebPlayerView; import java.io.File; +import java.io.IOException; import java.net.URLDecoder; import java.util.ArrayList; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import tw.nekomimi.nekogram.NekoConfig; +import tw.nekomimi.nekogram.translator.TranslateDb; +import tw.nekomimi.nekogram.translator.Translator; +import tw.nekomimi.nekogram.utils.AlertUtil; +import tw.nekomimi.nekogram.utils.UIUtil; import static org.telegram.messenger.MessageObject.POSITION_FLAG_BOTTOM; import static org.telegram.messenger.MessageObject.POSITION_FLAG_LEFT; @@ -217,7 +226,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg private boolean isVisible; private boolean collapsed; private boolean attachedToWindow; - + private int currentAccount; private int lastBlockNum = 1; @@ -305,9 +314,12 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg private LinkPath urlPath = new LinkPath(); private static final int search_item = 1; - private static final int share_item = 2; - private static final int open_item = 3; - private static final int settings_item = 4; + private static final int trans_item = 2; + private static final int share_item = 3; + private static final int open_item = 4; + private static final int settings_item = 5; + + private ActionBarMenuSubItem transMenu; private int anchorsOffsetMeasuredWidth; @@ -1739,7 +1751,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg builder.setDelegate(new BottomSheet.BottomSheetDelegate() { @Override public boolean canDismiss() { - if (textSelectionHelperBottomSheet != null && textSelectionHelperBottomSheet.isSelectionMode()){ + if (textSelectionHelperBottomSheet != null && textSelectionHelperBottomSheet.isSelectionMode()) { textSelectionHelperBottomSheet.clear(); return false; } @@ -1957,21 +1969,35 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg } private CharSequence getText(WebpageAdapter adapter, View parentView, TLRPC.RichText parentRichText, TLRPC.RichText richText, TLRPC.PageBlock parentBlock, int maxWidth) { + + CharSequence text = getTextInternal(adapter, parentView, parentRichText, richText, parentBlock, maxWidth); + + if (adapter.trans && TranslateDb.contains(text.toString())) { + + return TranslateDb.query(text.toString()); + + } + + return text; + + } + + private CharSequence getTextInternal(WebpageAdapter adapter, View parentView, TLRPC.RichText parentRichText, TLRPC.RichText richText, TLRPC.PageBlock parentBlock, int maxWidth) { if (richText == null) { return null; } if (richText instanceof TLRPC.TL_textFixed) { - return getText(adapter, parentView, parentRichText, ((TLRPC.TL_textFixed) richText).text, parentBlock, maxWidth); + return getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textFixed) richText).text, parentBlock, maxWidth); } else if (richText instanceof TLRPC.TL_textItalic) { - return getText(adapter, parentView, parentRichText, ((TLRPC.TL_textItalic) richText).text, parentBlock, maxWidth); + return getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textItalic) richText).text, parentBlock, maxWidth); } else if (richText instanceof TLRPC.TL_textBold) { - return getText(adapter, parentView, parentRichText, ((TLRPC.TL_textBold) richText).text, parentBlock, maxWidth); + return getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textBold) richText).text, parentBlock, maxWidth); } else if (richText instanceof TLRPC.TL_textUnderline) { - return getText(adapter, parentView, parentRichText, ((TLRPC.TL_textUnderline) richText).text, parentBlock, maxWidth); + return getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textUnderline) richText).text, parentBlock, maxWidth); } else if (richText instanceof TLRPC.TL_textStrike) { - return getText(adapter, parentView, parentRichText, ((TLRPC.TL_textStrike) richText).text, parentBlock, maxWidth); + return getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textStrike) richText).text, parentBlock, maxWidth); } else if (richText instanceof TLRPC.TL_textEmail) { - SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getText(adapter, parentView, parentRichText, ((TLRPC.TL_textEmail) richText).text, parentBlock, maxWidth)); + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textEmail) richText).text, parentBlock, maxWidth)); MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class); if (spannableStringBuilder.length() != 0) { spannableStringBuilder.setSpan(new TextPaintUrlSpan(innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null, "mailto:" + getUrl(richText)), 0, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); @@ -1979,7 +2005,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg return spannableStringBuilder; } else if (richText instanceof TLRPC.TL_textUrl) { TLRPC.TL_textUrl textUrl = (TLRPC.TL_textUrl) richText; - SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getText(adapter, parentView, parentRichText, ((TLRPC.TL_textUrl) richText).text, parentBlock, maxWidth)); + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textUrl) richText).text, parentBlock, maxWidth)); MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class); TextPaint paint = innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null; MetricAffectingSpan span; @@ -1996,7 +2022,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg return ((TLRPC.TL_textPlain) richText).text; } else if (richText instanceof TLRPC.TL_textAnchor) { TLRPC.TL_textAnchor textAnchor = (TLRPC.TL_textAnchor) richText; - SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getText(adapter, parentView, parentRichText, textAnchor.text, parentBlock, maxWidth)); + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getTextInternal(adapter, parentView, parentRichText, textAnchor.text, parentBlock, maxWidth)); spannableStringBuilder.setSpan(new AnchorSpan(textAnchor.name), 0, spannableStringBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); return spannableStringBuilder; } else if (richText instanceof TLRPC.TL_textEmpty) { @@ -2013,7 +2039,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg spannableStringBuilder.setSpan(new TextSelectionHelper.IgnoreCopySpannable(), spannableStringBuilder.length() - 1, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } - CharSequence innerText = getText(adapter, parentView, parentRichText, innerRichText, parentBlock, maxWidth); + CharSequence innerText = getTextInternal(adapter, parentView, parentRichText, innerRichText, parentBlock, maxWidth); int flags = getTextFlags(lastRichText); int startLength = spannableStringBuilder.length(); spannableStringBuilder.append(innerText); @@ -2045,18 +2071,18 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg } return spannableStringBuilder; } else if (richText instanceof TLRPC.TL_textSubscript) { - return getText(adapter, parentView, parentRichText, ((TLRPC.TL_textSubscript) richText).text, parentBlock, maxWidth); + return getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textSubscript) richText).text, parentBlock, maxWidth); } else if (richText instanceof TLRPC.TL_textSuperscript) { - return getText(adapter, parentView, parentRichText, ((TLRPC.TL_textSuperscript) richText).text, parentBlock, maxWidth); + return getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textSuperscript) richText).text, parentBlock, maxWidth); } else if (richText instanceof TLRPC.TL_textMarked) { - SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getText(adapter, parentView, parentRichText, ((TLRPC.TL_textMarked) richText).text, parentBlock, maxWidth)); + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textMarked) richText).text, parentBlock, maxWidth)); MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class); if (spannableStringBuilder.length() != 0) { spannableStringBuilder.setSpan(new TextPaintMarkSpan(innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null), 0, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } return spannableStringBuilder; } else if (richText instanceof TLRPC.TL_textPhone) { - SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getText(adapter, parentView, parentRichText, ((TLRPC.TL_textPhone) richText).text, parentBlock, maxWidth)); + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(getTextInternal(adapter, parentView, parentRichText, ((TLRPC.TL_textPhone) richText).text, parentBlock, maxWidth)); MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class); if (spannableStringBuilder.length() != 0) { spannableStringBuilder.setSpan(new TextPaintUrlSpan(innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null, "tel:" + getUrl(richText)), 0, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); @@ -2089,44 +2115,58 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg } public static CharSequence getPlainText(TLRPC.RichText richText) { + + CharSequence text = getPlainTextInternal(richText); + + if (TranslateDb.contains(text.toString())) { + + return TranslateDb.query(text.toString()); + + } + + return text; + + } + + public static CharSequence getPlainTextInternal(TLRPC.RichText richText) { if (richText == null) { return ""; } if (richText instanceof TLRPC.TL_textFixed) { - return getPlainText(((TLRPC.TL_textFixed) richText).text); + return getPlainTextInternal(((TLRPC.TL_textFixed) richText).text); } else if (richText instanceof TLRPC.TL_textItalic) { - return getPlainText(((TLRPC.TL_textItalic) richText).text); + return getPlainTextInternal(((TLRPC.TL_textItalic) richText).text); } else if (richText instanceof TLRPC.TL_textBold) { - return getPlainText(((TLRPC.TL_textBold) richText).text); + return getPlainTextInternal(((TLRPC.TL_textBold) richText).text); } else if (richText instanceof TLRPC.TL_textUnderline) { - return getPlainText(((TLRPC.TL_textUnderline) richText).text); + return getPlainTextInternal(((TLRPC.TL_textUnderline) richText).text); } else if (richText instanceof TLRPC.TL_textStrike) { - return getPlainText(((TLRPC.TL_textStrike) richText).text); + return getPlainTextInternal(((TLRPC.TL_textStrike) richText).text); } else if (richText instanceof TLRPC.TL_textEmail) { - return getPlainText(((TLRPC.TL_textEmail) richText).text); + return getPlainTextInternal(((TLRPC.TL_textEmail) richText).text); } else if (richText instanceof TLRPC.TL_textUrl) { - return getPlainText(((TLRPC.TL_textUrl) richText).text); + return getPlainTextInternal(((TLRPC.TL_textUrl) richText).text); } else if (richText instanceof TLRPC.TL_textPlain) { return ((TLRPC.TL_textPlain) richText).text; } else if (richText instanceof TLRPC.TL_textAnchor) { - return getPlainText(((TLRPC.TL_textAnchor) richText).text); + return getPlainTextInternal(((TLRPC.TL_textAnchor) richText).text); } else if (richText instanceof TLRPC.TL_textEmpty) { return ""; } else if (richText instanceof TLRPC.TL_textConcat) { StringBuilder stringBuilder = new StringBuilder(); int count = richText.texts.size(); for (int a = 0; a < count; a++) { - stringBuilder.append(getPlainText(richText.texts.get(a))); + stringBuilder.append(getPlainTextInternal(richText.texts.get(a))); } return stringBuilder; } else if (richText instanceof TLRPC.TL_textSubscript) { - return getPlainText(((TLRPC.TL_textSubscript) richText).text); + return getPlainTextInternal(((TLRPC.TL_textSubscript) richText).text); } else if (richText instanceof TLRPC.TL_textSuperscript) { - return getPlainText(((TLRPC.TL_textSuperscript) richText).text); + return getPlainTextInternal(((TLRPC.TL_textSuperscript) richText).text); } else if (richText instanceof TLRPC.TL_textMarked) { - return getPlainText(((TLRPC.TL_textMarked) richText).text); + return getPlainTextInternal(((TLRPC.TL_textMarked) richText).text); } else if (richText instanceof TLRPC.TL_textPhone) { - return getPlainText(((TLRPC.TL_textPhone) richText).text); + return getPlainTextInternal(((TLRPC.TL_textPhone) richText).text); } else if (richText instanceof TLRPC.TL_textImage) { return ""; } @@ -2134,6 +2174,18 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg } public static String getUrl(TLRPC.RichText richText) { + String url = getUrlInternal(richText); + + if (TranslateDb.contains(url)) { + + return TranslateDb.query(url); + + } + + return url; + } + + private static String getUrlInternal(TLRPC.RichText richText) { if (richText instanceof TLRPC.TL_textFixed) { return getUrl(((TLRPC.TL_textFixed) richText).text); } else if (richText instanceof TLRPC.TL_textItalic) { @@ -2148,7 +2200,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg return ((TLRPC.TL_textEmail) richText).email; } else if (richText instanceof TLRPC.TL_textUrl) { return ((TLRPC.TL_textUrl) richText).url; - }else if (richText instanceof TLRPC.TL_textPhone) { + } else if (richText instanceof TLRPC.TL_textPhone) { return ((TLRPC.TL_textPhone) richText).phone; } return null; @@ -2419,7 +2471,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg CharSequence text; if (plainText != null) { - text = plainText; + text = (parentAdapter.trans && TranslateDb.contains(plainText.toString())) ? TranslateDb.query(plainText.toString()) : plainText; } else { text = getText(parentAdapter, parentView, richText, richText, parentBlock, width); } @@ -3606,6 +3658,9 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg menuButton.setClickable(true); menuButton.setIcon(R.drawable.ic_ab_other); menuButton.addSubItem(search_item, R.drawable.msg_search, LocaleController.getString("Search", R.string.Search)); + + transMenu = menuButton.addSubItem(trans_item, R.drawable.ic_translate, LocaleController.getString("Translate", R.string.Translate)); + menuButton.addSubItem(share_item, R.drawable.msg_share, LocaleController.getString("ShareFile", R.string.ShareFile)); menuButton.addSubItem(open_item, R.drawable.msg_openin, LocaleController.getString("OpenInExternalApp", R.string.OpenInExternalApp)); menuButton.addSubItem(settings_item, R.drawable.menu_settings, LocaleController.getString("Settings", R.string.Settings)); @@ -3622,6 +3677,16 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg } if (id == search_item) { showSearch(true); + } else if (id == trans_item) { + if (!adapter[0].trans) { + adapter[0].trans = true; + transMenu.setTextAndIcon(LocaleController.getString("UndoTranslate", R.string.UndoTranslate), R.drawable.photo_undo); + doTransLATE(); + } else { + adapter[0].trans = false; + transMenu.setTextAndIcon(LocaleController.getString("Translate", R.string.Translate), R.drawable.ic_translate); + updatePaintSize(); + } } else if (id == share_item) { showDialog(new ShareAlert(parentActivity, null, adapter[0].currentPage.url, false, adapter[0].currentPage.url, false)); } else if (id == open_item) { @@ -4027,6 +4092,83 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg updatePaintColors(); } + private void doTransLATE() { + + AlertDialog.Builder proc = new AlertDialog.Builder(parentActivity, 3); + + ExecutorService transPool = Executors.newFixedThreadPool(5); + + AtomicBoolean cancel = new AtomicBoolean(false); + + proc.setOnCancelListener((it) -> { + + cancel.set(true); + + transPool.shutdown(); + + }); + + AlertDialog dialog = proc.show(); + + HashMap copy = new HashMap<>(adapter[0].textToBlocks); + ArrayList array = new ArrayList<>(adapter[0].textBlocks); + AtomicInteger errorCount = new AtomicInteger(); + AtomicInteger taskCount = new AtomicInteger(array.size()); + for (int b = 0, N = array.size(); b < N; b++) { + Object object = array.get(b); + TLRPC.PageBlock block = copy.get(object); + String textToSearchIn = null; + if (object instanceof TLRPC.RichText) { + TLRPC.RichText richText = (TLRPC.RichText) object; + CharSequence innerText = getText(adapter[0], null, richText, richText, block, 1000); + if (!TextUtils.isEmpty(innerText)) { + textToSearchIn = innerText.toString(); + } + } else if (object instanceof String) { + textToSearchIn = ((String) object); + } + if (textToSearchIn != null) { + if (TranslateDb.contains(textToSearchIn)) continue; + String finalTextToSearchIn = textToSearchIn; + transPool.execute(() -> { + + if (cancel.get()) return; + + String localeText; + try { + localeText = Translator.translateSync(finalTextToSearchIn); + if (cancel.get()) return; + } catch (IOException e) { + if (cancel.get()) return; + boolean finaL = taskCount.decrementAndGet() == 0; + if (errorCount.incrementAndGet() > 3 || finaL) { + UIUtil.runOnUIThread(dialog::dismiss); + AlertUtil.showSimpleAlert(parentActivity, e.getMessage()); + cancel.set(true); + transPool.shutdown(); + } + return; + } + + TranslateDb.save(finalTextToSearchIn, localeText); + UIUtil.runOnUIThread(this::updatePaintSize); + + boolean finaL = taskCount.decrementAndGet() == 0; + + if (finaL) { + + UIUtil.runOnUIThread(dialog::dismiss); + transPool.shutdown(); + + } + + }); + } + + } + + } + private void showSearch(boolean show) { if (searchContainer == null || (searchContainer.getTag() != null) == show) { return; @@ -4379,7 +4521,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg return open(null, webpage, url, true); } - private boolean open(final MessageObject messageObject, TLRPC.WebPage webpage, String url, boolean first) { + private boolean open(final MessageObject messageObject, TLRPC.WebPage webpage, String url, + boolean first) { if (parentActivity == null || isVisible && !collapsed || messageObject == null && webpage == null) { return false; } @@ -4850,7 +4993,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg customViewCallback.onCustomViewHidden(); fullscreenVideoContainer.removeView(customView); customView = null; - } else if (fullscreenedVideo != null) { + } else if (fullscreenedVideo != null) { fullscreenedVideo.exitFullscreen(); } if (!force) { @@ -4963,7 +5106,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg }); } - private void loadChannel(final BlockChannelCell cell, WebpageAdapter adapter, TLRPC.Chat channel) { + private void loadChannel(final BlockChannelCell cell, WebpageAdapter adapter, TLRPC.Chat + channel) { if (loadingChannel || TextUtils.isEmpty(channel.username)) { return; } @@ -5122,6 +5266,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg private TLRPC.TL_pageBlockChannel channelBlock; private boolean isRtl; + public boolean trans; + public WebpageAdapter(Context ctx) { context = ctx; } @@ -7086,7 +7232,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg } } nameLayout = createLayoutForText(this, currentBlock.author, null, width - AndroidUtilities.dp(36 + 14 + (avatarVisible ? 40 + 14 : 0)), 0, currentBlock, Layout.Alignment.ALIGN_NORMAL, 1, parentAdapter); - if (nameLayout != null){ + if (nameLayout != null) { nameLayout.x = AndroidUtilities.dp(18 + 14 + (avatarVisible ? 40 + 14 : 0)); nameLayout.y = AndroidUtilities.dp(dateLayout != null ? 10 : 19); } @@ -8006,7 +8152,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg } } - private class BlockCollageCell extends FrameLayout implements TextSelectionHelper.ArticleSelectableView{ + private class BlockCollageCell extends FrameLayout implements TextSelectionHelper.ArticleSelectableView { private RecyclerListView innerListView; private RecyclerView.Adapter innerAdapter; @@ -8038,18 +8184,18 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg public float[] heights; public MessageGroupedLayoutAttempt(int i1, int i2, float f1, float f2) { - lineCounts = new int[] {i1, i2}; - heights = new float[] {f1, f2}; + lineCounts = new int[]{i1, i2}; + heights = new float[]{f1, f2}; } public MessageGroupedLayoutAttempt(int i1, int i2, int i3, float f1, float f2, float f3) { - lineCounts = new int[] {i1, i2, i3}; - heights = new float[] {f1, f2, f3}; + lineCounts = new int[]{i1, i2, i3}; + heights = new float[]{f1, f2, f3}; } public MessageGroupedLayoutAttempt(int i1, int i2, int i3, int i4, float f1, float f2, float f3, float f4) { - lineCounts = new int[] {i1, i2, i3, i4}; - heights = new float[] {f1, f2, f3, f4}; + lineCounts = new int[]{i1, i2, i3, i4}; + heights = new float[]{f1, f2, f3, f4}; } } @@ -8171,7 +8317,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg position3.set(0, 1, 1, 1, rightWidth, thirdHeight / maxSizeHeight, POSITION_FLAG_RIGHT | POSITION_FLAG_BOTTOM); position3.spanSize = maxSizeWidth; - position1.siblingHeights = new float[] {thirdHeight / maxSizeHeight, secondHeight / maxSizeHeight}; + position1.siblingHeights = new float[]{thirdHeight / maxSizeHeight, secondHeight / maxSizeHeight}; position2.spanSize = maxSizeWidth - leftWidth; position3.leftSpanOffset = leftWidth; @@ -8225,7 +8371,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg position3.leftSpanOffset = w0; position4.leftSpanOffset = w0; - position1.siblingHeights = new float[] {h0, h1, h2}; + position1.siblingHeights = new float[]{h0, h1, h2}; hasSibling = true; } } @@ -8282,7 +8428,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg MessageGroupedLayoutAttempt attempt = attempts.get(a); float height = 0; float minLineHeight = Float.MAX_VALUE; - for (int b = 0; b < attempt.heights.length; b++){ + for (int b = 0; b < attempt.heights.length; b++) { height += attempt.heights[b]; if (attempt.heights[b] < minLineHeight) { minLineHeight = attempt.heights[b]; @@ -9075,7 +9221,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg if (textLayout != null) { canvas.save(); canvas.translate(textX, textY); - drawTextSelection(canvas,this); + drawTextSelection(canvas, this); textLayout.draw(canvas); canvas.restore(); } @@ -9273,8 +9419,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg ((TextSelectionHelper.ArticleSelectableView) blockLayout.itemView).fillTextLayoutBlocks(textSelectionHelper.arrayList); for (TextSelectionHelper.TextLayoutBlock block : textSelectionHelper.arrayList) { if (block instanceof DrawingText) { - ((DrawingText)block).x += blockX; - ((DrawingText)block).y += blockY; + ((DrawingText) block).x += blockX; + ((DrawingText) block).y += blockY; } } } @@ -9420,7 +9566,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg if (textLayout != null) { canvas.save(); canvas.translate(textX, textY); - drawTextSelection(canvas,this); + drawTextSelection(canvas, this); textLayout.draw(canvas); canvas.restore(); } @@ -10334,14 +10480,14 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg if (captionLayout != null) { canvas.save(); canvas.translate(textX, textY); - drawTextSelection(canvas,this, count++); + drawTextSelection(canvas, this, count++); captionLayout.draw(canvas); canvas.restore(); } if (creditLayout != null) { canvas.save(); canvas.translate(textX, textY + creditOffset); - drawTextSelection(canvas,this, count); + drawTextSelection(canvas, this, count); creditLayout.draw(canvas); canvas.restore(); } @@ -10961,14 +11107,14 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg } } - @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - info.setEnabled(true); + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setEnabled(true); if (textLayout == null) return; - info.setText(textLayout.getText()); - } + info.setText(textLayout.getText()); + } @Override public void fillTextLayoutBlocks(ArrayList blocks) { @@ -11037,7 +11183,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg if (textLayout != null) { canvas.save(); canvas.translate(textX, textY); - drawTextSelection(canvas,this); + drawTextSelection(canvas, this); textLayout.draw(canvas); canvas.restore(); } @@ -11338,7 +11484,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg } } - private class BlockSubheaderCell extends View implements TextSelectionHelper.ArticleSelectableView{ + private class BlockSubheaderCell extends View implements TextSelectionHelper.ArticleSelectableView { private DrawingText textLayout; private int textX = AndroidUtilities.dp(18); @@ -11462,11 +11608,13 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg } } - private void drawTextSelection(Canvas canvas, TextSelectionHelper.ArticleSelectableView view) { + private void drawTextSelection(Canvas canvas, TextSelectionHelper.ArticleSelectableView + view) { drawTextSelection(canvas, view, 0); } - private void drawTextSelection(Canvas canvas, TextSelectionHelper.ArticleSelectableView view, int i) { + private void drawTextSelection(Canvas canvas, TextSelectionHelper.ArticleSelectableView + view, int i) { View v = (View) view; if (v.getTag() != null && v.getTag() == BOTTOM_SHEET_VIEW_TAG && textSelectionHelperBottomSheet != null) { textSelectionHelperBottomSheet.draw(canvas, view, i); @@ -13172,7 +13320,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg animateTo(newScale, newTx, newTy, isZoom, 250); } - private void animateTo(float newScale, float newTx, float newTy, boolean isZoom, int duration) { + private void animateTo(float newScale, float newTx, float newTy, boolean isZoom, + int duration) { if (scale == newScale && translationX == newTx && translationY == newTy) { return; } @@ -13551,7 +13700,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg return false; } - private ImageReceiver getImageReceiverView(View view, TLRPC.PageBlock pageBlock, int[] coords) { + private ImageReceiver getImageReceiverView(View view, TLRPC.PageBlock pageBlock, + int[] coords) { if (view instanceof BlockPhotoCell) { BlockPhotoCell cell = (BlockPhotoCell) view; if (cell.currentBlock == pageBlock) { @@ -13594,7 +13744,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg return null; } - private ImageReceiver getImageReceiverFromListView(ViewGroup listView, TLRPC.PageBlock pageBlock, int[] coords) { + private ImageReceiver getImageReceiverFromListView(ViewGroup listView, TLRPC.PageBlock + pageBlock, int[] coords) { int count = listView.getChildCount(); for (int a = 0; a < count; a++) { ImageReceiver imageReceiver = getImageReceiverView(listView.getChildAt(a), pageBlock, coords); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java b/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java index 0278dc35e..320343b3b 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/Components/UndoView.java @@ -36,6 +36,8 @@ import org.telegram.messenger.UserObject; import org.telegram.tgnet.TLRPC; import org.telegram.ui.ActionBar.Theme; +import tw.nekomimi.nekogram.NekoXConfig; + @SuppressWarnings("FieldCanBeLocal") public class UndoView extends FrameLayout { @@ -259,6 +261,10 @@ public class UndoView extends FrameLayout { if (currentActionRunnable != null) { currentActionRunnable.run(); } + if (NekoXConfig.disableUndo) { + if (actionRunnable != null) actionRunnable.run(); + return; + } isShown = true; currentActionRunnable = actionRunnable; currentCancelRunnable = cancelRunnable; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java index c08f3a1c7..70105fa83 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProfileActivity.java @@ -300,7 +300,6 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. private int joinRow; private int lastSectionRow; - private final Property HEADER_SHADOW = new AnimationProperties.FloatProperty("headerShadow") { @Override public void setValue(ProfileActivity object, float value) { @@ -2063,7 +2062,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter. } frameLayout.addView(writeButton, LayoutHelper.createFrame(Build.VERSION.SDK_INT >= 21 ? 56 : 60, Build.VERSION.SDK_INT >= 21 ? 56 : 60, Gravity.RIGHT | Gravity.TOP, 0, 0, 16, 0)); writeButton.setOnClickListener(v -> { - if (playProfileAnimation != 0 && parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 2) instanceof ChatActivity) { + if (playProfileAnimation != 0 && parentLayout.fragmentsStack.get(parentLayout.fragmentsStack.size() - 2) instanceof ChatActivity && !AndroidUtilities.isTablet()) { finishFragment(); } else { TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(user_id); diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProxyListActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProxyListActivity.java index a55c9aa86..ec11b3ee2 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProxyListActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProxyListActivity.java @@ -155,11 +155,7 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente @SuppressLint("SetTextI18n") public void setProxy(SharedConfig.ProxyInfo proxyInfo) { - if (proxyInfo.isInternal && !proxyInfo.isPublic) { - textView.setText(LocaleController.formatString("NekoXProxy", R.string.NekoXProxy)); - } else { - textView.setText(proxyInfo.getTitle()); - } + textView.setText(proxyInfo.getTitle()); currentInfo = proxyInfo; } @@ -470,7 +466,7 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente if (!info.isPublic) continue; - } else if (info.isInternal) { + } else if (info.isPublic) { continue; @@ -752,11 +748,11 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente builder.setItems(new String[]{ - info.isInternal ? null : LocaleController.getString("EditProxy", R.string.EditProxy), - info.isInternal ? null : LocaleController.getString("ShareProxy", R.string.ShareProxy), - info.isInternal ? null : LocaleController.getString("ShareQRCode", R.string.ShareQRCode), - info.isInternal ? null : LocaleController.getString("CopyLink", R.string.CopyLink), - info.isInternal ? null : LocaleController.getString("ProxyDelete", R.string.ProxyDelete), + info.isPublic ? null : LocaleController.getString("EditProxy", R.string.EditProxy), + info.isPublic ? null : LocaleController.getString("ShareProxy", R.string.ShareProxy), + info.isPublic ? null : LocaleController.getString("ShareQRCode", R.string.ShareQRCode), + info.isPublic ? null : LocaleController.getString("CopyLink", R.string.CopyLink), + info.isPublic ? null : LocaleController.getString("ProxyDelete", R.string.ProxyDelete), LocaleController.getString("Cancel", R.string.Cancel) }, new int[]{ @@ -1020,7 +1016,7 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente for (SharedConfig.ProxyInfo info : new LinkedList<>(SharedConfig.proxyList)) { - if (info.isInternal) continue; + if (info.isPublic) continue; checkSingleProxy(info, 1, () -> { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index fac80368b..7a519a88d 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -1956,7 +1956,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter } loadingFaqPage = true; final TLRPC.TL_messages_getWebPage req2 = new TLRPC.TL_messages_getWebPage(); - req2.url = LocaleController.getString("TelegramFaqUrl", R.string.TelegramFaqUrl); + req2.url = NekoXConfig.FAQ_URL; req2.hash = 0; ConnectionsManager.getInstance(currentAccount).sendRequest(req2, (response2, error2) -> { if (response2 instanceof TLRPC.WebPage) { diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoSettingsActivity.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoSettingsActivity.java index 26d66470a..9014039cc 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoSettingsActivity.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoSettingsActivity.java @@ -270,7 +270,7 @@ public class NekoSettingsActivity extends BaseFragment { builder.setItemsIndexed(new String[]{ LocaleController.getString("FirstLast", R.string.FirstLast), - LocaleController.getString("FirstLast", R.string.FirstLast) + LocaleController.getString("LastFirst", R.string.LastFirst) }, (i) -> { NekoConfig.setNameOrder(i + 1); listAdapter.notifyItemChanged(mapPreviewRow); @@ -298,8 +298,8 @@ public class NekoSettingsActivity extends BaseFragment { PopupBuilder builder = new PopupBuilder(view); builder.setItemsIndexed(new String[]{ + LocaleController.getString("DependsOnDate", R.string.DependsOnDate), LocaleController.getString("Snowflakes", R.string.Snowflakes), - LocaleController.getString("Christmas", R.string.Christmas), LocaleController.getString("Fireworks", R.string.Fireworks) }, (i) -> { diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/database/Nitrites.kt b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/database/Nitrites.kt new file mode 100644 index 000000000..f412d3e74 --- /dev/null +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/database/Nitrites.kt @@ -0,0 +1,9 @@ +package tw.nekomimi.nekogram.database + +import org.dizitart.no2.Nitrite +import org.telegram.messenger.ApplicationLoader +import tw.nekomimi.nekogram.translator.TranslateDb + +fun mkCacheDatabase(name: String) = Nitrite.builder().compressed() + .filePath("${ApplicationLoader.applicationContext.cacheDir}/$name.db") + .openOrCreate(name, "nya") \ No newline at end of file diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/TransItem.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/TransItem.java new file mode 100644 index 000000000..badce2b1c --- /dev/null +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/TransItem.java @@ -0,0 +1,40 @@ +package tw.nekomimi.nekogram.translator; + +import org.dizitart.no2.Document; +import org.dizitart.no2.IndexType; +import org.dizitart.no2.mapper.Mappable; +import org.dizitart.no2.mapper.NitriteMapper; +import org.dizitart.no2.objects.Index; +import org.dizitart.no2.objects.Indices; + +@Indices({ + @Index(value = "text", type = IndexType.Unique) +}) +public class TransItem implements Mappable { + + public String text; + public String trans; + + public TransItem() { + } + + public TransItem(String text, String trans) { + this.text = text; + this.trans = trans; + } + + @Override + public Document write(NitriteMapper mapper) { + Document document = new Document(); + document.put("text",text); + document.put("trans", trans); + return document; + } + + @Override + public void read(NitriteMapper mapper, Document document) { + text = (String) document.get("text"); + trans = (String) document.get("trans"); + } + +} diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/TranslateDb.kt b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/TranslateDb.kt new file mode 100644 index 000000000..6ff8302c6 --- /dev/null +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/TranslateDb.kt @@ -0,0 +1,36 @@ +package tw.nekomimi.nekogram.translator + +import org.dizitart.no2.objects.filters.ObjectFilters +import tw.nekomimi.nekogram.database.mkCacheDatabase + +object TranslateDb { + + val db by lazy { mkCacheDatabase("trans") } + val conn by lazy { db.getRepository("trans", TransItem::class.java) } + + @JvmStatic + fun contains(text: String) = conn.find(ObjectFilters.eq("text", text)).count() > 0 + + @JvmStatic + fun save(text: String, trans: String) { + + conn.update(TransItem(text, trans), true) + + } + + @JvmStatic + fun query(text: String): String? { + + val result = conn.find(ObjectFilters.eq("text", text)); + + if (result.hasMore()) { + + return result.first().trans + + } + + return null + + } + +} \ No newline at end of file diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/Translator.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/Translator.java index f0e0eaed3..15c32981b 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/Translator.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/translator/Translator.java @@ -4,7 +4,9 @@ import android.annotation.SuppressLint; import android.os.AsyncTask; import org.telegram.messenger.LocaleController; +import org.telegram.messenger.R; +import java.io.IOException; import java.util.List; import java.util.Locale; @@ -27,6 +29,26 @@ abstract public class Translator { } } + public static String translateSync(String query) throws IOException { + Locale locale = LocaleController.getInstance().currentLocale; + String toLang; + if (NekoConfig.translationProvider != 3 && locale.getLanguage().equals("zh") && (locale.getCountry().toUpperCase().equals("CN") || locale.getCountry().toUpperCase().equals("TW"))) { + toLang = locale.getLanguage() + "-" + locale.getCountry().toUpperCase(); + } else { + toLang = locale.getLanguage(); + } + Translator translator = NekoConfig.translationProvider == 3 ? LingoTranslator.getInstance() : GoogleWebTranslator.getInstance(); + if (!translator.getTargetLanguages().contains(toLang)) { + throw new IOException(LocaleController.getString("TranslateApiUnsupported", R.string.TranslateApiUnsupported)); + } else { + try { + return translator.translate(query, toLang); + } catch (Exception ex) { + throw new IOException(LocaleController.getString("TranslateFailed", R.string.TranslateFailed)); + } + } + } + private void startTask(String query, String toLang, TranslateCallBack translateCallBack) { new MyAsyncTask().request(query, toLang, translateCallBack).execute(); } diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/utils/AlertUtil.kt b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/utils/AlertUtil.kt index e6d5e23ff..23ce6d1a2 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/utils/AlertUtil.kt +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/utils/AlertUtil.kt @@ -2,29 +2,29 @@ package tw.nekomimi.nekogram.utils import android.content.Context import android.content.DialogInterface -import android.text.TextUtils -import android.util.TypedValue -import android.view.Gravity -import android.view.View -import android.widget.FrameLayout import android.widget.TextView import android.widget.Toast -import org.telegram.messenger.* +import org.telegram.messenger.AndroidUtilities +import org.telegram.messenger.ApplicationLoader +import org.telegram.messenger.LocaleController +import org.telegram.messenger.R import org.telegram.ui.ActionBar.AlertDialog import org.telegram.ui.ActionBar.Theme -import org.telegram.ui.ChatActivity -import org.telegram.ui.Components.AvatarDrawable -import org.telegram.ui.Components.BackupImageView -import org.telegram.ui.Components.LayoutHelper -import tw.nekomimi.nekogram.MessageHelper object AlertUtil { @JvmStatic - fun showToast(text: String) = Toast.makeText(ApplicationLoader.applicationContext, text.takeIf { it.isNotBlank() } ?: "喵 !", Toast.LENGTH_LONG).show() + fun showToast(text: String) = UIUtil.runOnUIThread( Runnable { + Toast.makeText( + ApplicationLoader.applicationContext, + text.takeIf { it.isNotBlank() } + ?: "喵 !", + Toast.LENGTH_LONG + ).show() + }) @JvmStatic - fun showSimpleAlert(ctx: Context, text: String) { + fun showSimpleAlert(ctx: Context?, text: String) { val builder = AlertDialog.Builder(ctx ?: ApplicationLoader.applicationContext) @@ -33,7 +33,7 @@ object AlertUtil { builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null); - builder.show() + UIUtil.runOnUIThread(Runnable { builder.show() }) }