mirror of https://github.com/NekoX-Dev/NekoX.git
This commit is contained in:
parent
8c4c541c00
commit
fbd6458bbe
|
@ -32,6 +32,7 @@ dependencies {
|
||||||
implementation "com.squareup.okhttp3:okhttp:$okHttpVersion"
|
implementation "com.squareup.okhttp3:okhttp:$okHttpVersion"
|
||||||
implementation "com.squareup.okhttp3:okhttp-dnsoverhttps:$okHttpVersion"
|
implementation "com.squareup.okhttp3:okhttp-dnsoverhttps:$okHttpVersion"
|
||||||
implementation 'dnsjava:dnsjava:3.0.2'
|
implementation 'dnsjava:dnsjava:3.0.2'
|
||||||
|
implementation 'org.dizitart:nitrite:3.4.1'
|
||||||
|
|
||||||
implementation files('libs/libv2ray.aar')
|
implementation files('libs/libv2ray.aar')
|
||||||
implementation files('libs/ss-libev-release.aar')
|
implementation files('libs/ss-libev-release.aar')
|
||||||
|
|
|
@ -88,7 +88,7 @@
|
||||||
android:largeHeap="true"
|
android:largeHeap="true"
|
||||||
android:theme="@style/Theme.TMessages.Start"
|
android:theme="@style/Theme.TMessages.Start"
|
||||||
android:manageSpaceActivity="org.telegram.ui.ExternalActionActivity"
|
android:manageSpaceActivity="org.telegram.ui.ExternalActionActivity"
|
||||||
android:supportsRtl="true">
|
android:supportsRtl="false">
|
||||||
<activity
|
<activity
|
||||||
android:name="org.telegram.ui.LaunchActivity"
|
android:name="org.telegram.ui.LaunchActivity"
|
||||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
|
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
|
||||||
|
|
|
@ -4329,7 +4329,7 @@ public class MessagesController extends BaseController implements NotificationCe
|
||||||
removeCurrent = 1;
|
removeCurrent = 1;
|
||||||
}
|
}
|
||||||
lastCheckProxyId++;
|
lastCheckProxyId++;
|
||||||
if (!NekoConfig.hideProxySponsorChannel && (SharedConfig.currentProxy == null || !SharedConfig.currentProxy.isInternal) && enabled && !TextUtils.isEmpty(proxyAddress) && !TextUtils.isEmpty(proxySecret)) {
|
if (!NekoConfig.hideProxySponsorChannel && (SharedConfig.currentProxy == null || !SharedConfig.currentProxy.isPublic) && enabled && !TextUtils.isEmpty(proxyAddress) && !TextUtils.isEmpty(proxySecret)) {
|
||||||
checkingProxyInfo = true;
|
checkingProxyInfo = true;
|
||||||
int checkProxyId = lastCheckProxyId;
|
int checkProxyId = lastCheckProxyId;
|
||||||
TLRPC.TL_help_getProxyData req = new TLRPC.TL_help_getProxyData();
|
TLRPC.TL_help_getProxyData req = new TLRPC.TL_help_getProxyData();
|
||||||
|
|
|
@ -168,7 +168,6 @@ public class SharedConfig {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInternal;
|
|
||||||
public boolean isPublic;
|
public boolean isPublic;
|
||||||
|
|
||||||
public ProxyInfo() {
|
public ProxyInfo() {
|
||||||
|
@ -1346,15 +1345,6 @@ public class SharedConfig {
|
||||||
|
|
||||||
public static boolean proxyEnabled;
|
public static boolean proxyEnabled;
|
||||||
|
|
||||||
public static VmessProxy publicProxy;
|
|
||||||
|
|
||||||
static {
|
|
||||||
|
|
||||||
publicProxy = new VmessProxy(VmessLoader.getPublic());
|
|
||||||
publicProxy.isInternal = true;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
|
||||||
loadProxyList();
|
loadProxyList();
|
||||||
|
@ -1363,13 +1353,7 @@ public class SharedConfig {
|
||||||
|
|
||||||
boolean proxyEnabledValue = preferences.getBoolean("proxy_enabled", false);
|
boolean proxyEnabledValue = preferences.getBoolean("proxy_enabled", false);
|
||||||
|
|
||||||
if (proxyEnabledValue && currentProxy == null) {
|
if (proxyEnabledValue && currentProxy == null) proxyEnabledValue = false;
|
||||||
|
|
||||||
currentProxy = publicProxy;
|
|
||||||
|
|
||||||
publicProxy.start();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
proxyEnabled = proxyEnabledValue;
|
proxyEnabled = proxyEnabledValue;
|
||||||
|
|
||||||
|
@ -1439,12 +1423,6 @@ public class SharedConfig {
|
||||||
|
|
||||||
int current = MessagesController.getGlobalMainSettings().getInt("current_proxy", 0);
|
int current = MessagesController.getGlobalMainSettings().getInt("current_proxy", 0);
|
||||||
|
|
||||||
if (!NekoXConfig.hidePublicProxy) {
|
|
||||||
|
|
||||||
proxyList.add(publicProxy);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
File remoteProxyListFile = ProxyUtil.cacheFile;
|
File remoteProxyListFile = ProxyUtil.cacheFile;
|
||||||
|
|
||||||
if (remoteProxyListFile.isFile() && !NekoXConfig.hidePublicProxy) {
|
if (remoteProxyListFile.isFile() && !NekoXConfig.hidePublicProxy) {
|
||||||
|
@ -1481,7 +1459,6 @@ public class SharedConfig {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
info.isInternal = true;
|
|
||||||
info.isPublic = true;
|
info.isPublic = true;
|
||||||
|
|
||||||
proxyList.add(info);
|
proxyList.add(info);
|
||||||
|
@ -1664,7 +1641,7 @@ public class SharedConfig {
|
||||||
for (ProxyInfo info : new LinkedList<>(proxyList)) {
|
for (ProxyInfo info : new LinkedList<>(proxyList)) {
|
||||||
try {
|
try {
|
||||||
JSONObject obj = info.toJson();
|
JSONObject obj = info.toJson();
|
||||||
if (info.isInternal) {
|
if (info.isPublic) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
proxyArray.put(obj);
|
proxyArray.put(obj);
|
||||||
|
|
|
@ -137,6 +137,7 @@ import org.telegram.tgnet.TLRPC;
|
||||||
import org.telegram.ui.ActionBar.ActionBar;
|
import org.telegram.ui.ActionBar.ActionBar;
|
||||||
import org.telegram.ui.ActionBar.ActionBarMenu;
|
import org.telegram.ui.ActionBar.ActionBarMenu;
|
||||||
import org.telegram.ui.ActionBar.ActionBarMenuItem;
|
import org.telegram.ui.ActionBar.ActionBarMenuItem;
|
||||||
|
import org.telegram.ui.ActionBar.ActionBarMenuSubItem;
|
||||||
import org.telegram.ui.ActionBar.ActionBarPopupWindow;
|
import org.telegram.ui.ActionBar.ActionBarPopupWindow;
|
||||||
import org.telegram.ui.ActionBar.AlertDialog;
|
import org.telegram.ui.ActionBar.AlertDialog;
|
||||||
import org.telegram.ui.ActionBar.BackDrawable;
|
import org.telegram.ui.ActionBar.BackDrawable;
|
||||||
|
@ -182,14 +183,22 @@ import org.telegram.ui.Components.VideoPlayer;
|
||||||
import org.telegram.ui.Components.WebPlayerView;
|
import org.telegram.ui.Components.WebPlayerView;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
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.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_BOTTOM;
|
||||||
import static org.telegram.messenger.MessageObject.POSITION_FLAG_LEFT;
|
import static org.telegram.messenger.MessageObject.POSITION_FLAG_LEFT;
|
||||||
|
@ -217,7 +226,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
private boolean isVisible;
|
private boolean isVisible;
|
||||||
private boolean collapsed;
|
private boolean collapsed;
|
||||||
private boolean attachedToWindow;
|
private boolean attachedToWindow;
|
||||||
|
|
||||||
private int currentAccount;
|
private int currentAccount;
|
||||||
|
|
||||||
private int lastBlockNum = 1;
|
private int lastBlockNum = 1;
|
||||||
|
@ -305,9 +314,12 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
private LinkPath urlPath = new LinkPath();
|
private LinkPath urlPath = new LinkPath();
|
||||||
|
|
||||||
private static final int search_item = 1;
|
private static final int search_item = 1;
|
||||||
private static final int share_item = 2;
|
private static final int trans_item = 2;
|
||||||
private static final int open_item = 3;
|
private static final int share_item = 3;
|
||||||
private static final int settings_item = 4;
|
private static final int open_item = 4;
|
||||||
|
private static final int settings_item = 5;
|
||||||
|
|
||||||
|
private ActionBarMenuSubItem transMenu;
|
||||||
|
|
||||||
private int anchorsOffsetMeasuredWidth;
|
private int anchorsOffsetMeasuredWidth;
|
||||||
|
|
||||||
|
@ -1739,7 +1751,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
builder.setDelegate(new BottomSheet.BottomSheetDelegate() {
|
builder.setDelegate(new BottomSheet.BottomSheetDelegate() {
|
||||||
@Override
|
@Override
|
||||||
public boolean canDismiss() {
|
public boolean canDismiss() {
|
||||||
if (textSelectionHelperBottomSheet != null && textSelectionHelperBottomSheet.isSelectionMode()){
|
if (textSelectionHelperBottomSheet != null && textSelectionHelperBottomSheet.isSelectionMode()) {
|
||||||
textSelectionHelperBottomSheet.clear();
|
textSelectionHelperBottomSheet.clear();
|
||||||
return false;
|
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) {
|
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) {
|
if (richText == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (richText instanceof TLRPC.TL_textFixed) {
|
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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} 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);
|
MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class);
|
||||||
if (spannableStringBuilder.length() != 0) {
|
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);
|
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;
|
return spannableStringBuilder;
|
||||||
} else if (richText instanceof TLRPC.TL_textUrl) {
|
} else if (richText instanceof TLRPC.TL_textUrl) {
|
||||||
TLRPC.TL_textUrl textUrl = (TLRPC.TL_textUrl) richText;
|
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);
|
MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class);
|
||||||
TextPaint paint = innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null;
|
TextPaint paint = innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null;
|
||||||
MetricAffectingSpan span;
|
MetricAffectingSpan span;
|
||||||
|
@ -1996,7 +2022,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
return ((TLRPC.TL_textPlain) richText).text;
|
return ((TLRPC.TL_textPlain) richText).text;
|
||||||
} else if (richText instanceof TLRPC.TL_textAnchor) {
|
} else if (richText instanceof TLRPC.TL_textAnchor) {
|
||||||
TLRPC.TL_textAnchor textAnchor = (TLRPC.TL_textAnchor) richText;
|
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);
|
spannableStringBuilder.setSpan(new AnchorSpan(textAnchor.name), 0, spannableStringBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||||
return spannableStringBuilder;
|
return spannableStringBuilder;
|
||||||
} else if (richText instanceof TLRPC.TL_textEmpty) {
|
} 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);
|
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 flags = getTextFlags(lastRichText);
|
||||||
int startLength = spannableStringBuilder.length();
|
int startLength = spannableStringBuilder.length();
|
||||||
spannableStringBuilder.append(innerText);
|
spannableStringBuilder.append(innerText);
|
||||||
|
@ -2045,18 +2071,18 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
}
|
}
|
||||||
return spannableStringBuilder;
|
return spannableStringBuilder;
|
||||||
} else if (richText instanceof TLRPC.TL_textSubscript) {
|
} 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) {
|
} 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) {
|
} 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);
|
MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class);
|
||||||
if (spannableStringBuilder.length() != 0) {
|
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);
|
spannableStringBuilder.setSpan(new TextPaintMarkSpan(innerSpans == null || innerSpans.length == 0 ? getTextPaint(parentRichText, richText, parentBlock) : null), 0, spannableStringBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
}
|
}
|
||||||
return spannableStringBuilder;
|
return spannableStringBuilder;
|
||||||
} else if (richText instanceof TLRPC.TL_textPhone) {
|
} 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);
|
MetricAffectingSpan[] innerSpans = spannableStringBuilder.getSpans(0, spannableStringBuilder.length(), MetricAffectingSpan.class);
|
||||||
if (spannableStringBuilder.length() != 0) {
|
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);
|
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) {
|
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) {
|
if (richText == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
if (richText instanceof TLRPC.TL_textFixed) {
|
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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} else if (richText instanceof TLRPC.TL_textPlain) {
|
||||||
return ((TLRPC.TL_textPlain) richText).text;
|
return ((TLRPC.TL_textPlain) richText).text;
|
||||||
} else if (richText instanceof TLRPC.TL_textAnchor) {
|
} 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) {
|
} else if (richText instanceof TLRPC.TL_textEmpty) {
|
||||||
return "";
|
return "";
|
||||||
} else if (richText instanceof TLRPC.TL_textConcat) {
|
} else if (richText instanceof TLRPC.TL_textConcat) {
|
||||||
StringBuilder stringBuilder = new StringBuilder();
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
int count = richText.texts.size();
|
int count = richText.texts.size();
|
||||||
for (int a = 0; a < count; a++) {
|
for (int a = 0; a < count; a++) {
|
||||||
stringBuilder.append(getPlainText(richText.texts.get(a)));
|
stringBuilder.append(getPlainTextInternal(richText.texts.get(a)));
|
||||||
}
|
}
|
||||||
return stringBuilder;
|
return stringBuilder;
|
||||||
} else if (richText instanceof TLRPC.TL_textSubscript) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} 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) {
|
} else if (richText instanceof TLRPC.TL_textImage) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
@ -2134,6 +2174,18 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getUrl(TLRPC.RichText richText) {
|
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) {
|
if (richText instanceof TLRPC.TL_textFixed) {
|
||||||
return getUrl(((TLRPC.TL_textFixed) richText).text);
|
return getUrl(((TLRPC.TL_textFixed) richText).text);
|
||||||
} else if (richText instanceof TLRPC.TL_textItalic) {
|
} else if (richText instanceof TLRPC.TL_textItalic) {
|
||||||
|
@ -2148,7 +2200,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
return ((TLRPC.TL_textEmail) richText).email;
|
return ((TLRPC.TL_textEmail) richText).email;
|
||||||
} else if (richText instanceof TLRPC.TL_textUrl) {
|
} else if (richText instanceof TLRPC.TL_textUrl) {
|
||||||
return ((TLRPC.TL_textUrl) richText).url;
|
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 ((TLRPC.TL_textPhone) richText).phone;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -2419,7 +2471,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
|
|
||||||
CharSequence text;
|
CharSequence text;
|
||||||
if (plainText != null) {
|
if (plainText != null) {
|
||||||
text = plainText;
|
text = (parentAdapter.trans && TranslateDb.contains(plainText.toString())) ? TranslateDb.query(plainText.toString()) : plainText;
|
||||||
} else {
|
} else {
|
||||||
text = getText(parentAdapter, parentView, richText, richText, parentBlock, width);
|
text = getText(parentAdapter, parentView, richText, richText, parentBlock, width);
|
||||||
}
|
}
|
||||||
|
@ -3606,6 +3658,9 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
menuButton.setClickable(true);
|
menuButton.setClickable(true);
|
||||||
menuButton.setIcon(R.drawable.ic_ab_other);
|
menuButton.setIcon(R.drawable.ic_ab_other);
|
||||||
menuButton.addSubItem(search_item, R.drawable.msg_search, LocaleController.getString("Search", R.string.Search));
|
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(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(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));
|
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) {
|
if (id == search_item) {
|
||||||
showSearch(true);
|
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) {
|
} else if (id == share_item) {
|
||||||
showDialog(new ShareAlert(parentActivity, null, adapter[0].currentPage.url, false, adapter[0].currentPage.url, false));
|
showDialog(new ShareAlert(parentActivity, null, adapter[0].currentPage.url, false, adapter[0].currentPage.url, false));
|
||||||
} else if (id == open_item) {
|
} else if (id == open_item) {
|
||||||
|
@ -4027,6 +4092,83 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
updatePaintColors();
|
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<Object, TLRPC.PageBlock> copy = new HashMap<>(adapter[0].textToBlocks);
|
||||||
|
ArrayList<Object> 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) {
|
private void showSearch(boolean show) {
|
||||||
if (searchContainer == null || (searchContainer.getTag() != null) == show) {
|
if (searchContainer == null || (searchContainer.getTag() != null) == show) {
|
||||||
return;
|
return;
|
||||||
|
@ -4379,7 +4521,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
return open(null, webpage, url, true);
|
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) {
|
if (parentActivity == null || isVisible && !collapsed || messageObject == null && webpage == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -4850,7 +4993,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
customViewCallback.onCustomViewHidden();
|
customViewCallback.onCustomViewHidden();
|
||||||
fullscreenVideoContainer.removeView(customView);
|
fullscreenVideoContainer.removeView(customView);
|
||||||
customView = null;
|
customView = null;
|
||||||
} else if (fullscreenedVideo != null) {
|
} else if (fullscreenedVideo != null) {
|
||||||
fullscreenedVideo.exitFullscreen();
|
fullscreenedVideo.exitFullscreen();
|
||||||
}
|
}
|
||||||
if (!force) {
|
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)) {
|
if (loadingChannel || TextUtils.isEmpty(channel.username)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -5122,6 +5266,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
private TLRPC.TL_pageBlockChannel channelBlock;
|
private TLRPC.TL_pageBlockChannel channelBlock;
|
||||||
private boolean isRtl;
|
private boolean isRtl;
|
||||||
|
|
||||||
|
public boolean trans;
|
||||||
|
|
||||||
public WebpageAdapter(Context ctx) {
|
public WebpageAdapter(Context ctx) {
|
||||||
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);
|
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.x = AndroidUtilities.dp(18 + 14 + (avatarVisible ? 40 + 14 : 0));
|
||||||
nameLayout.y = AndroidUtilities.dp(dateLayout != null ? 10 : 19);
|
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 RecyclerListView innerListView;
|
||||||
private RecyclerView.Adapter innerAdapter;
|
private RecyclerView.Adapter innerAdapter;
|
||||||
|
@ -8038,18 +8184,18 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
public float[] heights;
|
public float[] heights;
|
||||||
|
|
||||||
public MessageGroupedLayoutAttempt(int i1, int i2, float f1, float f2) {
|
public MessageGroupedLayoutAttempt(int i1, int i2, float f1, float f2) {
|
||||||
lineCounts = new int[] {i1, i2};
|
lineCounts = new int[]{i1, i2};
|
||||||
heights = new float[] {f1, f2};
|
heights = new float[]{f1, f2};
|
||||||
}
|
}
|
||||||
|
|
||||||
public MessageGroupedLayoutAttempt(int i1, int i2, int i3, float f1, float f2, float f3) {
|
public MessageGroupedLayoutAttempt(int i1, int i2, int i3, float f1, float f2, float f3) {
|
||||||
lineCounts = new int[] {i1, i2, i3};
|
lineCounts = new int[]{i1, i2, i3};
|
||||||
heights = new float[] {f1, f2, f3};
|
heights = new float[]{f1, f2, f3};
|
||||||
}
|
}
|
||||||
|
|
||||||
public MessageGroupedLayoutAttempt(int i1, int i2, int i3, int i4, float f1, float f2, float f3, float f4) {
|
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};
|
lineCounts = new int[]{i1, i2, i3, i4};
|
||||||
heights = new float[] {f1, f2, f3, f4};
|
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.set(0, 1, 1, 1, rightWidth, thirdHeight / maxSizeHeight, POSITION_FLAG_RIGHT | POSITION_FLAG_BOTTOM);
|
||||||
position3.spanSize = maxSizeWidth;
|
position3.spanSize = maxSizeWidth;
|
||||||
|
|
||||||
position1.siblingHeights = new float[] {thirdHeight / maxSizeHeight, secondHeight / maxSizeHeight};
|
position1.siblingHeights = new float[]{thirdHeight / maxSizeHeight, secondHeight / maxSizeHeight};
|
||||||
|
|
||||||
position2.spanSize = maxSizeWidth - leftWidth;
|
position2.spanSize = maxSizeWidth - leftWidth;
|
||||||
position3.leftSpanOffset = leftWidth;
|
position3.leftSpanOffset = leftWidth;
|
||||||
|
@ -8225,7 +8371,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
position3.leftSpanOffset = w0;
|
position3.leftSpanOffset = w0;
|
||||||
position4.leftSpanOffset = w0;
|
position4.leftSpanOffset = w0;
|
||||||
|
|
||||||
position1.siblingHeights = new float[] {h0, h1, h2};
|
position1.siblingHeights = new float[]{h0, h1, h2};
|
||||||
hasSibling = true;
|
hasSibling = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8282,7 +8428,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
MessageGroupedLayoutAttempt attempt = attempts.get(a);
|
MessageGroupedLayoutAttempt attempt = attempts.get(a);
|
||||||
float height = 0;
|
float height = 0;
|
||||||
float minLineHeight = Float.MAX_VALUE;
|
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];
|
height += attempt.heights[b];
|
||||||
if (attempt.heights[b] < minLineHeight) {
|
if (attempt.heights[b] < minLineHeight) {
|
||||||
minLineHeight = attempt.heights[b];
|
minLineHeight = attempt.heights[b];
|
||||||
|
@ -9075,7 +9221,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
if (textLayout != null) {
|
if (textLayout != null) {
|
||||||
canvas.save();
|
canvas.save();
|
||||||
canvas.translate(textX, textY);
|
canvas.translate(textX, textY);
|
||||||
drawTextSelection(canvas,this);
|
drawTextSelection(canvas, this);
|
||||||
textLayout.draw(canvas);
|
textLayout.draw(canvas);
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
}
|
}
|
||||||
|
@ -9273,8 +9419,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
((TextSelectionHelper.ArticleSelectableView) blockLayout.itemView).fillTextLayoutBlocks(textSelectionHelper.arrayList);
|
((TextSelectionHelper.ArticleSelectableView) blockLayout.itemView).fillTextLayoutBlocks(textSelectionHelper.arrayList);
|
||||||
for (TextSelectionHelper.TextLayoutBlock block : textSelectionHelper.arrayList) {
|
for (TextSelectionHelper.TextLayoutBlock block : textSelectionHelper.arrayList) {
|
||||||
if (block instanceof DrawingText) {
|
if (block instanceof DrawingText) {
|
||||||
((DrawingText)block).x += blockX;
|
((DrawingText) block).x += blockX;
|
||||||
((DrawingText)block).y += blockY;
|
((DrawingText) block).y += blockY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9420,7 +9566,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
if (textLayout != null) {
|
if (textLayout != null) {
|
||||||
canvas.save();
|
canvas.save();
|
||||||
canvas.translate(textX, textY);
|
canvas.translate(textX, textY);
|
||||||
drawTextSelection(canvas,this);
|
drawTextSelection(canvas, this);
|
||||||
textLayout.draw(canvas);
|
textLayout.draw(canvas);
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
}
|
}
|
||||||
|
@ -10334,14 +10480,14 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
if (captionLayout != null) {
|
if (captionLayout != null) {
|
||||||
canvas.save();
|
canvas.save();
|
||||||
canvas.translate(textX, textY);
|
canvas.translate(textX, textY);
|
||||||
drawTextSelection(canvas,this, count++);
|
drawTextSelection(canvas, this, count++);
|
||||||
captionLayout.draw(canvas);
|
captionLayout.draw(canvas);
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
}
|
}
|
||||||
if (creditLayout != null) {
|
if (creditLayout != null) {
|
||||||
canvas.save();
|
canvas.save();
|
||||||
canvas.translate(textX, textY + creditOffset);
|
canvas.translate(textX, textY + creditOffset);
|
||||||
drawTextSelection(canvas,this, count);
|
drawTextSelection(canvas, this, count);
|
||||||
creditLayout.draw(canvas);
|
creditLayout.draw(canvas);
|
||||||
canvas.restore();
|
canvas.restore();
|
||||||
}
|
}
|
||||||
|
@ -10961,14 +11107,14 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
|
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
|
||||||
super.onInitializeAccessibilityNodeInfo(info);
|
super.onInitializeAccessibilityNodeInfo(info);
|
||||||
info.setEnabled(true);
|
info.setEnabled(true);
|
||||||
if (textLayout == null)
|
if (textLayout == null)
|
||||||
return;
|
return;
|
||||||
info.setText(textLayout.getText());
|
info.setText(textLayout.getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fillTextLayoutBlocks(ArrayList<TextSelectionHelper.TextLayoutBlock> blocks) {
|
public void fillTextLayoutBlocks(ArrayList<TextSelectionHelper.TextLayoutBlock> blocks) {
|
||||||
|
@ -11037,7 +11183,7 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
if (textLayout != null) {
|
if (textLayout != null) {
|
||||||
canvas.save();
|
canvas.save();
|
||||||
canvas.translate(textX, textY);
|
canvas.translate(textX, textY);
|
||||||
drawTextSelection(canvas,this);
|
drawTextSelection(canvas, this);
|
||||||
textLayout.draw(canvas);
|
textLayout.draw(canvas);
|
||||||
canvas.restore();
|
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 DrawingText textLayout;
|
||||||
private int textX = AndroidUtilities.dp(18);
|
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);
|
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;
|
View v = (View) view;
|
||||||
if (v.getTag() != null && v.getTag() == BOTTOM_SHEET_VIEW_TAG && textSelectionHelperBottomSheet != null) {
|
if (v.getTag() != null && v.getTag() == BOTTOM_SHEET_VIEW_TAG && textSelectionHelperBottomSheet != null) {
|
||||||
textSelectionHelperBottomSheet.draw(canvas, view, i);
|
textSelectionHelperBottomSheet.draw(canvas, view, i);
|
||||||
|
@ -13172,7 +13320,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
animateTo(newScale, newTx, newTy, isZoom, 250);
|
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) {
|
if (scale == newScale && translationX == newTx && translationY == newTy) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -13551,7 +13700,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
return false;
|
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) {
|
if (view instanceof BlockPhotoCell) {
|
||||||
BlockPhotoCell cell = (BlockPhotoCell) view;
|
BlockPhotoCell cell = (BlockPhotoCell) view;
|
||||||
if (cell.currentBlock == pageBlock) {
|
if (cell.currentBlock == pageBlock) {
|
||||||
|
@ -13594,7 +13744,8 @@ public class ArticleViewer implements NotificationCenter.NotificationCenterDeleg
|
||||||
return null;
|
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();
|
int count = listView.getChildCount();
|
||||||
for (int a = 0; a < count; a++) {
|
for (int a = 0; a < count; a++) {
|
||||||
ImageReceiver imageReceiver = getImageReceiverView(listView.getChildAt(a), pageBlock, coords);
|
ImageReceiver imageReceiver = getImageReceiverView(listView.getChildAt(a), pageBlock, coords);
|
||||||
|
|
|
@ -36,6 +36,8 @@ import org.telegram.messenger.UserObject;
|
||||||
import org.telegram.tgnet.TLRPC;
|
import org.telegram.tgnet.TLRPC;
|
||||||
import org.telegram.ui.ActionBar.Theme;
|
import org.telegram.ui.ActionBar.Theme;
|
||||||
|
|
||||||
|
import tw.nekomimi.nekogram.NekoXConfig;
|
||||||
|
|
||||||
@SuppressWarnings("FieldCanBeLocal")
|
@SuppressWarnings("FieldCanBeLocal")
|
||||||
public class UndoView extends FrameLayout {
|
public class UndoView extends FrameLayout {
|
||||||
|
|
||||||
|
@ -259,6 +261,10 @@ public class UndoView extends FrameLayout {
|
||||||
if (currentActionRunnable != null) {
|
if (currentActionRunnable != null) {
|
||||||
currentActionRunnable.run();
|
currentActionRunnable.run();
|
||||||
}
|
}
|
||||||
|
if (NekoXConfig.disableUndo) {
|
||||||
|
if (actionRunnable != null) actionRunnable.run();
|
||||||
|
return;
|
||||||
|
}
|
||||||
isShown = true;
|
isShown = true;
|
||||||
currentActionRunnable = actionRunnable;
|
currentActionRunnable = actionRunnable;
|
||||||
currentCancelRunnable = cancelRunnable;
|
currentCancelRunnable = cancelRunnable;
|
||||||
|
|
|
@ -300,7 +300,6 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||||
private int joinRow;
|
private int joinRow;
|
||||||
private int lastSectionRow;
|
private int lastSectionRow;
|
||||||
|
|
||||||
|
|
||||||
private final Property<ProfileActivity, Float> HEADER_SHADOW = new AnimationProperties.FloatProperty<ProfileActivity>("headerShadow") {
|
private final Property<ProfileActivity, Float> HEADER_SHADOW = new AnimationProperties.FloatProperty<ProfileActivity>("headerShadow") {
|
||||||
@Override
|
@Override
|
||||||
public void setValue(ProfileActivity object, float value) {
|
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));
|
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 -> {
|
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();
|
finishFragment();
|
||||||
} else {
|
} else {
|
||||||
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(user_id);
|
TLRPC.User user = MessagesController.getInstance(currentAccount).getUser(user_id);
|
||||||
|
|
|
@ -155,11 +155,7 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
public void setProxy(SharedConfig.ProxyInfo proxyInfo) {
|
public void setProxy(SharedConfig.ProxyInfo proxyInfo) {
|
||||||
if (proxyInfo.isInternal && !proxyInfo.isPublic) {
|
textView.setText(proxyInfo.getTitle());
|
||||||
textView.setText(LocaleController.formatString("NekoXProxy", R.string.NekoXProxy));
|
|
||||||
} else {
|
|
||||||
textView.setText(proxyInfo.getTitle());
|
|
||||||
}
|
|
||||||
currentInfo = proxyInfo;
|
currentInfo = proxyInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,7 +466,7 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente
|
||||||
|
|
||||||
if (!info.isPublic) continue;
|
if (!info.isPublic) continue;
|
||||||
|
|
||||||
} else if (info.isInternal) {
|
} else if (info.isPublic) {
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -752,11 +748,11 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente
|
||||||
|
|
||||||
builder.setItems(new String[]{
|
builder.setItems(new String[]{
|
||||||
|
|
||||||
info.isInternal ? null : LocaleController.getString("EditProxy", R.string.EditProxy),
|
info.isPublic ? null : LocaleController.getString("EditProxy", R.string.EditProxy),
|
||||||
info.isInternal ? null : LocaleController.getString("ShareProxy", R.string.ShareProxy),
|
info.isPublic ? null : LocaleController.getString("ShareProxy", R.string.ShareProxy),
|
||||||
info.isInternal ? null : LocaleController.getString("ShareQRCode", R.string.ShareQRCode),
|
info.isPublic ? null : LocaleController.getString("ShareQRCode", R.string.ShareQRCode),
|
||||||
info.isInternal ? null : LocaleController.getString("CopyLink", R.string.CopyLink),
|
info.isPublic ? null : LocaleController.getString("CopyLink", R.string.CopyLink),
|
||||||
info.isInternal ? null : LocaleController.getString("ProxyDelete", R.string.ProxyDelete),
|
info.isPublic ? null : LocaleController.getString("ProxyDelete", R.string.ProxyDelete),
|
||||||
LocaleController.getString("Cancel", R.string.Cancel)
|
LocaleController.getString("Cancel", R.string.Cancel)
|
||||||
|
|
||||||
}, new int[]{
|
}, new int[]{
|
||||||
|
@ -1020,7 +1016,7 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente
|
||||||
|
|
||||||
for (SharedConfig.ProxyInfo info : new LinkedList<>(SharedConfig.proxyList)) {
|
for (SharedConfig.ProxyInfo info : new LinkedList<>(SharedConfig.proxyList)) {
|
||||||
|
|
||||||
if (info.isInternal) continue;
|
if (info.isPublic) continue;
|
||||||
|
|
||||||
checkSingleProxy(info, 1, () -> {
|
checkSingleProxy(info, 1, () -> {
|
||||||
|
|
||||||
|
|
|
@ -1956,7 +1956,7 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter
|
||||||
}
|
}
|
||||||
loadingFaqPage = true;
|
loadingFaqPage = true;
|
||||||
final TLRPC.TL_messages_getWebPage req2 = new TLRPC.TL_messages_getWebPage();
|
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;
|
req2.hash = 0;
|
||||||
ConnectionsManager.getInstance(currentAccount).sendRequest(req2, (response2, error2) -> {
|
ConnectionsManager.getInstance(currentAccount).sendRequest(req2, (response2, error2) -> {
|
||||||
if (response2 instanceof TLRPC.WebPage) {
|
if (response2 instanceof TLRPC.WebPage) {
|
||||||
|
|
|
@ -270,7 +270,7 @@ public class NekoSettingsActivity extends BaseFragment {
|
||||||
|
|
||||||
builder.setItemsIndexed(new String[]{
|
builder.setItemsIndexed(new String[]{
|
||||||
LocaleController.getString("FirstLast", R.string.FirstLast),
|
LocaleController.getString("FirstLast", R.string.FirstLast),
|
||||||
LocaleController.getString("FirstLast", R.string.FirstLast)
|
LocaleController.getString("LastFirst", R.string.LastFirst)
|
||||||
}, (i) -> {
|
}, (i) -> {
|
||||||
NekoConfig.setNameOrder(i + 1);
|
NekoConfig.setNameOrder(i + 1);
|
||||||
listAdapter.notifyItemChanged(mapPreviewRow);
|
listAdapter.notifyItemChanged(mapPreviewRow);
|
||||||
|
@ -298,8 +298,8 @@ public class NekoSettingsActivity extends BaseFragment {
|
||||||
PopupBuilder builder = new PopupBuilder(view);
|
PopupBuilder builder = new PopupBuilder(view);
|
||||||
|
|
||||||
builder.setItemsIndexed(new String[]{
|
builder.setItemsIndexed(new String[]{
|
||||||
|
LocaleController.getString("DependsOnDate", R.string.DependsOnDate),
|
||||||
LocaleController.getString("Snowflakes", R.string.Snowflakes),
|
LocaleController.getString("Snowflakes", R.string.Snowflakes),
|
||||||
LocaleController.getString("Christmas", R.string.Christmas),
|
|
||||||
LocaleController.getString("Fireworks", R.string.Fireworks)
|
LocaleController.getString("Fireworks", R.string.Fireworks)
|
||||||
}, (i) -> {
|
}, (i) -> {
|
||||||
|
|
||||||
|
|
|
@ -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")
|
|
@ -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");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -4,7 +4,9 @@ import android.annotation.SuppressLint;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
|
|
||||||
import org.telegram.messenger.LocaleController;
|
import org.telegram.messenger.LocaleController;
|
||||||
|
import org.telegram.messenger.R;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
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) {
|
private void startTask(String query, String toLang, TranslateCallBack translateCallBack) {
|
||||||
new MyAsyncTask().request(query, toLang, translateCallBack).execute();
|
new MyAsyncTask().request(query, toLang, translateCallBack).execute();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,29 +2,29 @@ package tw.nekomimi.nekogram.utils
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.DialogInterface
|
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.TextView
|
||||||
import android.widget.Toast
|
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.AlertDialog
|
||||||
import org.telegram.ui.ActionBar.Theme
|
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 {
|
object AlertUtil {
|
||||||
|
|
||||||
@JvmStatic
|
@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
|
@JvmStatic
|
||||||
fun showSimpleAlert(ctx: Context, text: String) {
|
fun showSimpleAlert(ctx: Context?, text: String) {
|
||||||
|
|
||||||
val builder = AlertDialog.Builder(ctx ?: ApplicationLoader.applicationContext)
|
val builder = AlertDialog.Builder(ctx ?: ApplicationLoader.applicationContext)
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ object AlertUtil {
|
||||||
|
|
||||||
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
|
builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), null);
|
||||||
|
|
||||||
builder.show()
|
UIUtil.runOnUIThread(Runnable { builder.show() })
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue