This commit is contained in:
世界 2020-04-06 01:21:44 +08:00
parent 8c4c541c00
commit fbd6458bbe
No known key found for this signature in database
GPG Key ID: CD109927C34A63C4
15 changed files with 362 additions and 125 deletions

View File

@ -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')

View File

@ -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">
<activity
android:name="org.telegram.ui.LaunchActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"

View File

@ -4329,7 +4329,7 @@ public class MessagesController extends BaseController implements NotificationCe
removeCurrent = 1;
}
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;
int checkProxyId = lastCheckProxyId;
TLRPC.TL_help_getProxyData req = new TLRPC.TL_help_getProxyData();

View File

@ -168,7 +168,6 @@ public class SharedConfig {
}
public boolean isInternal;
public boolean isPublic;
public ProxyInfo() {
@ -1346,15 +1345,6 @@ public class SharedConfig {
public static boolean proxyEnabled;
public static VmessProxy publicProxy;
static {
publicProxy = new VmessProxy(VmessLoader.getPublic());
publicProxy.isInternal = true;
}
static {
loadProxyList();
@ -1363,13 +1353,7 @@ public class SharedConfig {
boolean proxyEnabledValue = preferences.getBoolean("proxy_enabled", false);
if (proxyEnabledValue && currentProxy == null) {
currentProxy = publicProxy;
publicProxy.start();
}
if (proxyEnabledValue && currentProxy == null) proxyEnabledValue = false;
proxyEnabled = proxyEnabledValue;
@ -1439,12 +1423,6 @@ public class SharedConfig {
int current = MessagesController.getGlobalMainSettings().getInt("current_proxy", 0);
if (!NekoXConfig.hidePublicProxy) {
proxyList.add(publicProxy);
}
File remoteProxyListFile = ProxyUtil.cacheFile;
if (remoteProxyListFile.isFile() && !NekoXConfig.hidePublicProxy) {
@ -1481,7 +1459,6 @@ public class SharedConfig {
}
info.isInternal = true;
info.isPublic = true;
proxyList.add(info);
@ -1664,7 +1641,7 @@ public class SharedConfig {
for (ProxyInfo info : new LinkedList<>(proxyList)) {
try {
JSONObject obj = info.toJson();
if (info.isInternal) {
if (info.isPublic) {
continue;
}
proxyArray.put(obj);

View File

@ -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<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) {
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<TextSelectionHelper.TextLayoutBlock> 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);

View File

@ -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;

View File

@ -300,7 +300,6 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
private int joinRow;
private int lastSectionRow;
private final Property<ProfileActivity, Float> HEADER_SHADOW = new AnimationProperties.FloatProperty<ProfileActivity>("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);

View File

@ -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, () -> {

View File

@ -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) {

View File

@ -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) -> {

View File

@ -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")

View File

@ -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");
}
}

View File

@ -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
}
}

View File

@ -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();
}

View File

@ -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() })
}