diff --git a/TMessagesProj/build.gradle b/TMessagesProj/build.gradle index 4940c0172..e18f10661 100644 --- a/TMessagesProj/build.gradle +++ b/TMessagesProj/build.gradle @@ -44,9 +44,9 @@ dependencies { // TODO: fix problem with android L implementation 'com.google.zxing:core:3.4.0' - compileOnly 'org.checkerframework:checker-qual:2.5.2' - compileOnly 'org.checkerframework:checker-compat-qual:2.5.0' - implementation 'com.googlecode.mp4parser:isoparser:1.0.6' + compileOnly 'org.checkerframework:checker-qual:3.4.1' + compileOnly 'org.checkerframework:checker-compat-qual:2.5.5' + implementation 'com.googlecode.mp4parser:isoparser:1.1.22' implementation 'com.stripe:stripe-android:2.0.2' implementation 'com.google.code.gson:gson:2.8.6' implementation 'org.osmdroid:osmdroid-android:6.1.6' diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java b/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java index 7daa994c9..4b810c0a0 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/ApplicationLoader.java @@ -42,6 +42,7 @@ import java.util.Set; import tw.nekomimi.nekogram.ExternalGcm; import tw.nekomimi.nekogram.NekoConfig; import tw.nekomimi.nekogram.database.WarppedPref; +import tw.nekomimi.nekogram.parts.ProxySwitcher; import tw.nekomimi.nekogram.utils.EnvUtil; import tw.nekomimi.nekogram.utils.FileUtil; import tw.nekomimi.nekogram.utils.ProxyUtil; @@ -306,7 +307,6 @@ public class ApplicationLoader extends Application { } - ApplicationLoader app = (ApplicationLoader) ApplicationLoader.applicationContext; ExternalGcm.initPlayServices(); if (BuildVars.LOGS_ENABLED) { FileLog.d("app initied"); @@ -322,6 +322,7 @@ public class ApplicationLoader extends Application { if (finalA == UserConfig.selectedAccount) initRunnable.run(); else UIUtil.runOnIoDispatcher(initRunnable); } + } public ApplicationLoader() { diff --git a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java index 658325e1b..fb2d6f239 100644 --- a/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java +++ b/TMessagesProj/src/main/java/org/telegram/messenger/MessagesController.java @@ -4699,7 +4699,7 @@ public class MessagesController extends BaseController implements NotificationCe } else if (response instanceof TLRPC.TL_help_promoData) { final TLRPC.TL_help_promoData res = (TLRPC.TL_help_promoData) response; - if (res.proxy && NekoConfig.hideProxySponsorChannel) { + if (res.proxy && (NekoConfig.hideProxySponsorChannel || (SharedConfig.currentProxy != null || SharedConfig.currentProxy.subId == 1L))) { nextPromoInfoCheckTime = getConnectionsManager().getCurrentTime() + 60 * 60; noDialog = true; } else { @@ -5353,7 +5353,7 @@ public class MessagesController extends BaseController implements NotificationCe } public void processLoadedMessages(TLRPC.messages_Messages messagesRes, long dialogId, long mergeDialogId, int count, int max_id, int offset_date, boolean isCache, int classGuid, - int first_unread, int last_message_id, int unread_count, int last_date, int load_type, boolean isChannel, boolean isEnd, boolean scheduled, int loadIndex, boolean queryFromServer, int mentionsCount) { + int first_unread, int last_message_id, int unread_count, int last_date, int load_type, boolean isChannel, boolean isEnd, boolean scheduled, int loadIndex, boolean queryFromServer, int mentionsCount) { if (BuildVars.LOGS_ENABLED) { FileLog.d("processLoadedMessages size " + messagesRes.messages.size() + " in chat " + dialogId + " count " + count + " max_id " + max_id + " cache " + isCache + " guid " + classGuid + " load_type " + load_type + " last_message_id " + last_message_id + " isChannel " + isChannel + " index " + loadIndex + " firstUnread " + first_unread + " unread_count " + unread_count + " last_date " + last_date + " queryFromServer " + queryFromServer); } diff --git a/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java b/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java index 9a304494b..5bf47b30a 100644 --- a/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java +++ b/TMessagesProj/src/main/java/org/telegram/tgnet/ConnectionsManager.java @@ -49,6 +49,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import tw.nekomimi.nekogram.NekoConfig; +import tw.nekomimi.nekogram.parts.ProxySwitcher; import tw.nekomimi.nekogram.utils.DnsFactory; import tw.nekomimi.nekogram.utils.UIUtil; @@ -489,6 +490,7 @@ public class ConnectionsManager extends BaseController { getInstance(currentAccount).connectionState = state; AccountInstance.getInstance(currentAccount).getNotificationCenter().postNotificationName(NotificationCenter.didUpdateConnectionState); }); + ProxySwitcher.didReceivedNotification(state); } public static void onLogout(final int currentAccount) { diff --git a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java index e04d16108..da7415c56 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java @@ -819,8 +819,12 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa subInfo.lastFetch = System.currentTimeMillis(); SubManager.getSubList().update(subInfo, true); + SharedConfig.reloadProxyList(); } catch (SubInfo.AllTriesFailed allTriesFailed) { + + FileLog.e(allTriesFailed); + } } diff --git a/TMessagesProj/src/main/java/org/telegram/ui/ProxyListActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/ProxyListActivity.java index eebf65cf2..da5d7f944 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/ProxyListActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/ProxyListActivity.java @@ -824,7 +824,8 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente } - @SuppressLint("NewApi") private void addProxy() { + @SuppressLint("NewApi") + private void addProxy() { BottomSheet.Builder builder = new BottomSheet.Builder(getParentActivity()); @@ -1033,10 +1034,6 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente public void checkSingleProxy(SharedConfig.ProxyInfo proxyInfo, int repeat, Runnable callback) { - proxyInfo.checking = true; - - UIUtil.runOnUIThread(() -> NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.proxyCheckDone, proxyInfo)); - UIUtil.runOnIoDispatcher(() -> { if (proxyInfo instanceof SharedConfig.ExternalSocks5Proxy && !((SharedConfig.ExternalSocks5Proxy) proxyInfo).isStarted()) { @@ -1057,11 +1054,11 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente } proxyInfo.proxyCheckPingId = ConnectionsManager.getInstance(currentAccount).checkProxy(proxyInfo.address, proxyInfo.port, proxyInfo.username, proxyInfo.password, proxyInfo.secret, time -> AndroidUtilities.runOnUIThread(() -> { - proxyInfo.availableCheckTime = SystemClock.elapsedRealtime(); if (time == -1) { if (repeat > 0) { checkSingleProxy(proxyInfo, repeat - 1, callback); } else { + proxyInfo.availableCheckTime = SystemClock.elapsedRealtime(); proxyInfo.checking = false; proxyInfo.available = false; proxyInfo.ping = 0; @@ -1073,6 +1070,7 @@ public class ProxyListActivity extends BaseFragment implements NotificationCente } } } else { + proxyInfo.availableCheckTime = SystemClock.elapsedRealtime(); proxyInfo.checking = false; proxyInfo.ping = time; proxyInfo.available = true; diff --git a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java index 77e330d73..3e2babbef 100644 --- a/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java +++ b/TMessagesProj/src/main/java/org/telegram/ui/SettingsActivity.java @@ -900,14 +900,14 @@ public class SettingsActivity extends BaseFragment implements NotificationCenter questionRow = -1; faqRow = rowCount++; policyRow = -1; - if (BuildVars.DEBUG_VERSION) { + if (BuildVars.LOGS_ENABLED) { helpSectionCell = rowCount++; debugHeaderRow = rowCount++; } else { helpSectionCell = -1; debugHeaderRow = -1; } - if (BuildVars.DEBUG_VERSION) { + if (BuildVars.LOGS_ENABLED) { sendLogsRow = rowCount++; clearLogsRow = rowCount++; } else { diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoConfig.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoConfig.java index 65d8c093b..1006789c2 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoConfig.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/NekoConfig.java @@ -106,6 +106,8 @@ public class NekoConfig { public static boolean disableAppBarShadow; public static boolean mediaPreview; + public static boolean proxyAutoSwitch; + public static String formatLang(String name) { if (name == null) { @@ -210,6 +212,8 @@ public class NekoConfig { disableAppBarShadow = preferences.getBoolean("disableAppBarShadow", false); mediaPreview = preferences.getBoolean("mediaPreview", false); + proxyAutoSwitch = preferences.getBoolean("proxy_auto_switch", false); + } public static void toggleShowAddToSavedMessages() { @@ -697,4 +701,11 @@ public class NekoConfig { preferences.edit().putBoolean("mediaPreview",mediaPreview = !mediaPreview).apply(); } + + public static void toggleProxyAutoSwitch() { + + preferences.edit().putBoolean("proxy_auto_switch",proxyAutoSwitch = !proxyAutoSwitch).apply(); + + } + } \ No newline at end of file diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ProxyChecks.kt b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ProxyChecks.kt index 9f8541b19..2d8067301 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ProxyChecks.kt +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ProxyChecks.kt @@ -1,19 +1,117 @@ package tw.nekomimi.nekogram.parts import android.os.SystemClock -import cn.hutool.core.thread.ThreadUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.telegram.messenger.AndroidUtilities import org.telegram.messenger.NotificationCenter import org.telegram.messenger.SharedConfig import org.telegram.messenger.SharedConfig.ExternalSocks5Proxy +import org.telegram.messenger.UserConfig +import org.telegram.tgnet.ConnectionsManager import org.telegram.ui.ProxyListActivity +import tw.nekomimi.nekogram.utils.UIUtil import java.util.concurrent.ExecutorService import java.util.concurrent.atomic.AtomicBoolean -@JvmOverloads +private suspend fun postCheckSingleProxy(proxyInfo: SharedConfig.ProxyInfo, repeat: Int) { + + val lock = AtomicBoolean() + + if (proxyInfo is ExternalSocks5Proxy && !proxyInfo.isStarted) { + proxyInfo.start() + delay(233L) + } + + var time = -1L + val startAt = SystemClock.elapsedRealtime() + + proxyInfo.proxyCheckPingId = ConnectionsManager.getInstance(UserConfig.selectedAccount).checkProxy(proxyInfo.address, proxyInfo.port, proxyInfo.username, proxyInfo.password, proxyInfo.secret) { + time = it + lock.set(true) + } + + while (!lock.get() && SystemClock.elapsedRealtime() - startAt < 4000L) delay(100L) + + if (!lock.get()) { + + proxyInfo.availableCheckTime = SystemClock.elapsedRealtime() + proxyInfo.checking = false + proxyInfo.available = false + proxyInfo.ping = 0 + if (proxyInfo is ExternalSocks5Proxy && proxyInfo !== SharedConfig.currentProxy) { + proxyInfo.stop() + } + + return + + } + + if (time == -1L) { + if (repeat > 0) { + postCheckSingleProxy(proxyInfo, repeat - 1) + } else { + proxyInfo.availableCheckTime = SystemClock.elapsedRealtime() + proxyInfo.checking = false + proxyInfo.available = false + proxyInfo.ping = -1L + if (proxyInfo is ExternalSocks5Proxy && proxyInfo !== SharedConfig.currentProxy) { + proxyInfo.stop() + } + } + } else { + proxyInfo.availableCheckTime = SystemClock.elapsedRealtime() + proxyInfo.checking = false + proxyInfo.ping = time + proxyInfo.available = true + if (proxyInfo is ExternalSocks5Proxy && proxyInfo !== SharedConfig.currentProxy) { + proxyInfo.stop() + } + } + +} + +fun postCheckProxyList() = GlobalScope.launch(Dispatchers.IO) { + + SharedConfig.getProxyList().forEach { proxyInfo -> + + if (proxyInfo.checking || SystemClock.elapsedRealtime() - proxyInfo.availableCheckTime < 2 * 60 * 1000L) { + + return@forEach + + } + + synchronized(proxyInfo) { + + if (proxyInfo.checking || SystemClock.elapsedRealtime() - proxyInfo.availableCheckTime < 2 * 60 * 1000L) { + + return@forEach + + } + + proxyInfo.checking = true + + } + + runCatching { + + postCheckSingleProxy(proxyInfo, 1) + + }.onFailure { + + proxyInfo.availableCheckTime = SystemClock.elapsedRealtime() + proxyInfo.checking = false + proxyInfo.available = false + proxyInfo.ping = 0 + + } + + } + +} + fun ProxyListActivity.checkProxyList(force: Boolean, context: ExecutorService) { GlobalScope.launch(Dispatchers.IO) { @@ -36,7 +134,11 @@ fun ProxyListActivity.checkProxyList(force: Boolean, context: ExecutorService) { val lock = AtomicBoolean() - checkSingleProxy(it, if (it is ExternalSocks5Proxy) 3 else 0) { + val startAt = SystemClock.elapsedRealtime() + + UIUtil.runOnUIThread { NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.proxyCheckDone, it) } + + checkSingleProxy(it, if (it is ExternalSocks5Proxy) 3 else 1) { AndroidUtilities.runOnUIThread { @@ -48,8 +150,26 @@ fun ProxyListActivity.checkProxyList(force: Boolean, context: ExecutorService) { } - while (!lock.get()) ThreadUtil.sleep(100L) + while (!lock.get() && SystemClock.elapsedRealtime() - startAt < 4000L) Thread.sleep(100L) + if (!lock.get()) { + + it.availableCheckTime = SystemClock.elapsedRealtime() + it.checking = false + it.available = false + it.ping = 0 + if (it is ExternalSocks5Proxy && it !== SharedConfig.currentProxy) { + it.stop() + } + + AndroidUtilities.runOnUIThread { + + NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.proxyCheckDone, it) + + } + + + } } } diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ProxySwitcher.kt b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ProxySwitcher.kt new file mode 100644 index 000000000..5ff990f39 --- /dev/null +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/parts/ProxySwitcher.kt @@ -0,0 +1,110 @@ +package tw.nekomimi.nekogram.parts + +import org.telegram.messenger.SharedConfig +import org.telegram.tgnet.ConnectionsManager +import tw.nekomimi.nekogram.NekoConfig +import tw.nekomimi.nekogram.utils.UIUtil +import java.util.* + +object ProxySwitcher { + + var currentConnectionState = ConnectionsManager.ConnectionStateWaitingForNetwork + val switchTimer by lazy { Timer("Proxy Switch Timer") } + var currentTask: SwitchTask? = null + + + fun cancel() { + + currentTask = null + switchTimer.purge() + + } + + fun reschedule() { + + cancel() + switchTimer.schedule(SwitchTask().also { currentTask = it }, 3000L) + + } + + @JvmStatic + fun didReceivedNotification(connectionState: Int) = UIUtil.runOnIoDispatcher run@{ + + if (!NekoConfig.proxyAutoSwitch) return@run + + currentConnectionState = connectionState + + if (currentConnectionState == ConnectionsManager.ConnectionStateConnectingToProxy) { + + reschedule() + + } else { + + cancel() + + } + + } + + class SwitchTask : TimerTask() { + + override fun run() { + + if (this != currentTask) return + + if (currentConnectionState != ConnectionsManager.ConnectionStateConnectingToProxy) return + + var proxyList = SharedConfig.getProxyList().takeIf { it.size > 1 } ?: return + + val current = SharedConfig.currentProxy ?: return + + val currIndex = proxyList.indexOf(current) + + if (currIndex > 0) { + + val proxyListNew = LinkedList() + + proxyListNew.addAll(proxyList.subList(currIndex, proxyList.size)) + proxyListNew.addAll(proxyList.subList(0, currIndex + 1)) + + proxyList = proxyListNew + + } + + if (proxyList.all { it.availableCheckTime == 0L }) { + + if (proxyList.all { !it.checking }) { + + repeat(3) { postCheckProxyList() } + + } + + if (currentConnectionState != ConnectionsManager.ConnectionStateConnectingToProxy) return + + SharedConfig.setCurrentProxy(proxyList[0]) + + reschedule() + + return + + } + + proxyList.forEach { + + if (it.availableCheckTime != 0L && !it.available) return@forEach + + if (currentConnectionState != ConnectionsManager.ConnectionStateConnectingToProxy) return + + SharedConfig.setCurrentProxy(it) + + reschedule() + + return + + } + + } + + } + +} \ No newline at end of file diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java index dbb071373..11408d14e 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/settings/NekoExperimentalSettingsActivity.java @@ -60,14 +60,13 @@ public class NekoExperimentalSettingsActivity extends BaseFragment { private int experimentRow; private int smoothKeyboardRow; private int mediaPreviewRow; + private int proxyAutoSwitchRow; private int disableFilteringRow; private int unlimitedFavedStickersRow; private int unlimitedPinnedDialogsRow; private int deleteAccountRow; private int experiment2Row; - private int shouldNOTTrustMeRow; - private UndoView tooltip; @Override @@ -224,6 +223,11 @@ public class NekoExperimentalSettingsActivity extends BaseFragment { tooltip.setInfoText(AndroidUtilities.replaceTags(LocaleController.formatString("BetaWarning", R.string.BetaWarning))); tooltip.showWithAction(0, UndoView.ACTION_CACHE_WAS_CLEARED, null, null); } + } else if (position == proxyAutoSwitchRow) { + NekoConfig.toggleProxyAutoSwitch(); + if (view instanceof TextCheckCell) { + ((TextCheckCell) view).setChecked(NekoConfig.proxyAutoSwitch); + } } }); @@ -248,6 +252,7 @@ public class NekoExperimentalSettingsActivity extends BaseFragment { experimentRow = rowCount++; smoothKeyboardRow = !AndroidUtilities.isTablet() ? rowCount++ : -1; mediaPreviewRow = rowCount++; + proxyAutoSwitchRow = rowCount++; disableFilteringRow = rowCount++; unlimitedFavedStickersRow = rowCount++; unlimitedPinnedDialogsRow = rowCount++; @@ -389,8 +394,10 @@ public class NekoExperimentalSettingsActivity extends BaseFragment { textCell.setTextAndCheck(LocaleController.getString("DebugMenuEnableSmoothKeyboard", R.string.DebugMenuEnableSmoothKeyboard), SharedConfig.smoothKeyboard, true); } else if (position == unlimitedPinnedDialogsRow) { textCell.setTextAndValueAndCheck(LocaleController.getString("UnlimitedPinnedDialogs", R.string.UnlimitedPinnedDialogs), LocaleController.getString("UnlimitedPinnedDialogsAbout", R.string.UnlimitedPinnedDialogsAbout), NekoConfig.unlimitedPinnedDialogs, true, deleteAccountRow != -1); - } else if (position == mediaPreviewRow) { + } else if (position == mediaPreviewRow) { textCell.setTextAndCheck(LocaleController.getString("MediaPreview", R.string.MediaPreview), NekoConfig.mediaPreview, true); + } else if (position == proxyAutoSwitchRow) { + textCell.setTextAndCheck(LocaleController.getString("ProxyAutoSwitch", R.string.ProxyAutoSwitch), NekoConfig.proxyAutoSwitch, true); } break; } @@ -453,13 +460,10 @@ public class NekoExperimentalSettingsActivity extends BaseFragment { return 1; } else if (position == deleteAccountRow) { return 2; - } else if (position == unlimitedFavedStickersRow || position == disableFilteringRow || - position == smoothKeyboardRow || position == unlimitedPinnedDialogsRow || position == mediaPreviewRow) { - return 3; } else if (position == experimentRow) { return 4; } - return 2; + return 3; } } } diff --git a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/utils/HttpUtil.kt b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/utils/HttpUtil.kt index a5828c0a4..7473758d2 100644 --- a/TMessagesProj/src/main/java/tw/nekomimi/nekogram/utils/HttpUtil.kt +++ b/TMessagesProj/src/main/java/tw/nekomimi/nekogram/utils/HttpUtil.kt @@ -21,14 +21,14 @@ object HttpUtil { @JvmField val okHttpClient = OkHttpClient().newBuilder() .dns(DnsFactory) - .connectTimeout(3, TimeUnit.SECONDS) - .readTimeout(3, TimeUnit.SECONDS) + .connectTimeout(2, TimeUnit.SECONDS) + .readTimeout(2, TimeUnit.SECONDS) .build() val okHttpClientNoDoh = OkHttpClient() .newBuilder() - .connectTimeout(3, TimeUnit.SECONDS) - .readTimeout(3, TimeUnit.SECONDS) + .connectTimeout(2, TimeUnit.SECONDS) + .readTimeout(2, TimeUnit.SECONDS) .build() @JvmStatic diff --git a/TMessagesProj/src/main/res/values-ar/strings_nekox.xml b/TMessagesProj/src/main/res/values-ar/strings_nekox.xml index 5601ed7a7..95606d990 100644 --- a/TMessagesProj/src/main/res/values-ar/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-ar/strings_nekox.xml @@ -51,7 +51,6 @@ تم اكتشاف أنك لم تقم بإيقاف تشغيل إعدادات \"المكالمات من نظير لنظيرp2p\"، قد يتسبب في العثور على هويتك الحقيقية للقرصنة التي تسيطر عليها الحكومة، يرجى إيقافها! حسنًا، قم بتطبيقه لا تذكرني مرة أخرى - لا يمكن ترجمة InstantView مع مترجم الويب إزالة الرموز التعبيرية من العناوين خادم NekoX العام عامة diff --git a/TMessagesProj/src/main/res/values-de/strings_nekox.xml b/TMessagesProj/src/main/res/values-de/strings_nekox.xml index 6981a41a6..7d53617c5 100644 --- a/TMessagesProj/src/main/res/values-de/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-de/strings_nekox.xml @@ -51,7 +51,6 @@ Es wurde festgestellt, dass Du kein Passwort festgelegt hast, was dazu führen kann, dass staatlich kontrollierte Hacker Deine wahre Identität ermitteln können. Bitte setze eines! OK, anwenden Nicht mehr erinnern - InstantView kann nicht mit dem Web-Übersetzer übersetzt werden Emoji im Titel entfernen Öffentlicher NekoX-Proxy Öffentlich diff --git a/TMessagesProj/src/main/res/values-es/strings_nekox.xml b/TMessagesProj/src/main/res/values-es/strings_nekox.xml index e9e72226d..c542f9a28 100644 --- a/TMessagesProj/src/main/res/values-es/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-es/strings_nekox.xml @@ -51,7 +51,6 @@ Se detecta que no ha establecido una contraseña, lo que puede causar que los hackers controlados por el gobierno encuentren su verdadera identidad, ¡por favor configure una! OK, aplícalo No volver a recordar - No se puede traducir InstantView con el traductor web Eliminar emoji en el título Proxy público de NekoX Público diff --git a/TMessagesProj/src/main/res/values-fa/strings_nekox.xml b/TMessagesProj/src/main/res/values-fa/strings_nekox.xml index f487e21d8..04a1bb9d7 100644 --- a/TMessagesProj/src/main/res/values-fa/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-fa/strings_nekox.xml @@ -51,7 +51,6 @@ تشخیص داده می شود که رمز عبوری تنظیم نکرده اید ، و این ممکن است باعث شود هکرهای تحت کنترل دولت هویت واقعی شما را پیدا کنند ، لطفاً آنرا تعیین کنید قبول،اعمال کن دیگر یادآوری نشود - ترجمه InstantView با مترجم وب امکان پذیر نیست حذف ایموجی کنار اسم Nekogram x پروکسی عمومی NekoX عمومی diff --git a/TMessagesProj/src/main/res/values-he/strings_nekox.xml b/TMessagesProj/src/main/res/values-he/strings_nekox.xml index bcf964277..bf62971d6 100644 --- a/TMessagesProj/src/main/res/values-he/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-he/strings_nekox.xml @@ -51,7 +51,6 @@ מתגלה שלא הגדרת סיסמה, מה שעלול לגרום להאקרים שבשליטת הממשלה למצוא את זהותך האמיתית, אנא הגדר סיסמה! אוקיי, החל אותו אל תזכיר שוב - לא ניתן לתרגם את InstantView באמצעות מתרגם לאינטרנט הסר אמוג\'י בכותרת פרוקסי ציבור NekoX ציבורי diff --git a/TMessagesProj/src/main/res/values-hu/strings_nekox.xml b/TMessagesProj/src/main/res/values-hu/strings_nekox.xml index 0d4f1556f..3ea04e700 100644 --- a/TMessagesProj/src/main/res/values-hu/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-hu/strings_nekox.xml @@ -1,170 +1,2 @@ - - Egyéni API - Jelentkezzen be az egyéni alkalmazás segítségével, ha nem tud regisztrálni vagy bejelentkezni, ez segíthet.\n\nMegjegyzés: Az fcm nem fog működni, ha a kiadási verziót használja. - Ne használjon egyedi API-t - Android távirat - Telegram Android X - Kézi bevitel - Frissítés ellenőrzése - Váltás a verzióra - Nem található frissítés - Új frissítés elérhető - frissítés - Majd később - Sikertelen letöltés - Telepítés - Figyelmen kívül hagyni - Nemrég letöltött egy frissítést. - Kapcsolt csoport - Linked Channel - ** Távszámláját betilthatjuk ** - Nem vagyunk felelősek a fejlesztői szolgáltatások nem megfelelő használatáért. - Érintse meg a letiltáshoz. Nem kell ezekre. - Helyőrző - kérjük, tiltsa le - Egyéni háttér - Ezt a funkciót csak szakértő felhasználók számára biztosítják, ha nem tudják, hogy mit jelentenek a következő lehetőségek, akkor hagyja figyelmen kívül. - Hivatalos Gyártási DataCenter - Hivatalos teszt-adatközpont - IPv4 cím - IPv6 cím - Réteg - Nyilvános kulcs - Kulcs ujjlenyomata - Gyorsítótár könyvtár - Flash hívás engedélyezése - Cserélje ki a szolgáltatót - Yandex.Translate - Google Cloud Translate kulcs - Ha beállít egy Google Cloud Trans kulcsot, akkor a felhő fordítási API-t hívja meg, és nem fordít hamis űrlapot a webes verzióhoz, amikor fordítja (gyorsabb, stabil és forgalmat takarít meg). - Fordítási célnyelv - Fordítási beviteli célnyelv - Több - A NekoX frissíti a csatornát - ID / DC megjelenítése a profilban - Alapértelmezett téma használata * - Éjszakai mód - Adatvédelmi figyelmeztetés - Megállapítottuk, hogy mobiltelefonszámát bárki láthatja, ami miatt a kormány által ellenőrzött hackerek megtalálhatják az Ön igazi személyazonosságát, kérjük kapcsolja ki! - Megállapítást nyert, hogy nem van kikapcsolva az \"Engedélyezzen, hogy telefonszámon keressek\" beállítást, amely miatt a kormány által ellenőrzött hackerek megtalálhatják az Ön igazi személyazonosságát, kérjük, kapcsolja ki! - Megállapította, hogy nem kapcsolta ki az \"Engedélyezi a P2p hívásokat\" beállítást, amely miatt a kormány által ellenőrzött hackerek megtalálhatják az Ön igazi személyazonosságát, kérjük kapcsolja ki! - Megállapította, hogy még nem állított be jelszót, ami miatt a kormány által ellenőrzött hackerek megtalálhatják az Ön valódi személyazonosságát, kérjük, állítsa be! - OK, alkalmazza - Ne emlékeztesse újra - Az InstantView nem fordítható le webes fordítóval - Távolítsa el a hangulatjeleket a címből - NekoX nyilvános proxy - Nyilvános - Ne küldje el a bemeneti állapotomat - Képzeld el a képernyőképet - import - felhasználók - Csak a privát csevegőktől származó üzenetek - Kapcsolatok - Csak a mentett felhasználók üzenetei - csoportok - Csak a csoportbeszélgetések üzenetei - Csatornák - Csak a csatornáktól érkező üzenetek - Botok - Csak a robotok üzenetei - újra megszólal - Csak a némítás nélküli beszélgetések üzenetei - Nem olvasott - Csak olvasatlan üzenetek - Némítva & Olvasatlan - Csak olvasatlan üzenetek a némítás nélküli csevegésekből - Figyelmen kívül hagyja a néma olvasatlan számot a mappák lapon - A párbeszédablakok beállításai - Párbeszédrendezési beállítások - Rendezés olvasatlanul - Rendezés némítás nélkül - Rendezés felhasználó szerint - Rendezés névjegyek szerint - NekoX push szolgáltatás - Kérjük, engedélyezze a \"NekoX Push Service\" szolgáltatást - Kérjük, tiltsa le a \"NekoX Push Service\" szolgáltatást - Kapcsolja ki a Visszavonást - A rendszerfiók letiltása - A párbeszédablakok szűrőmenüje - Proxy letiltása, ha a VPN engedélyezve van - Használja az oldalsáv proxy elemét a gomb helyett - Proxybeállítások elrejtése alapértelmezés szerint - Ugrás a nyitott link megerősítéséhez - Az összes törlése a csevegésben - Figyelem! Ez ** a chat összes üzenetét ** törli ** az összes ** résztvevő számára. - Összes feloldása - Biztos benne, hogy feloldja ** az összes felhasználót és a robotot **? - Nem blokkoltál senkit :) - Vmess Proxy - Adja hozzá a Socks5 Proxy alkalmazást - Adja hozzá az MTProto Proxy alkalmazást - Adja hozzá a Vmess Proxy-t - Adjon hozzá Shadowsocks Proxy-t - Adjon hozzá ShadowsocksR Proxy-t - Adja hozzá a RelayBaton Proxy alkalmazást - Több bővítmény használja ezt az azonosítót: %s. - Proxy szerkesztése - Proxy megosztása - Proxy törlése - Vmess proxybeállítások - Felhasználói azonosító - Alter Id - Biztonság - Hálózat - Fej típusa - Host / QUIC biztonság kérése - Útvonal / QUIC kulcs - Használja a TLS-t - Shadowsocks proxybeállítások - Jelszó - Titkosítási módszer - Csatlakoztat - Beépülő modul konfigurációja - ShadowsocksR proxybeállítások - Jegyzőkönyv - Protokollparaméterek - Obfs - Obfs Param - RelayBaton proxybeállítások - Titkosított SNI - Megjegyzések - Vizsgálja meg újra az összes kiszolgálót - Szerverek átrendezése ping segítségével - Kiszolgálók exportálása fájlba - Kiszolgálók importálása a fájlból - Proxykiszolgálók importálása - Proxy előfizetés - Előfizetés részletei - urls - Az előfizetés frissítése - Az előfizetés törlése - Export matricák - Matricák importálása a fájlból - Import matricák - Matricakészletek - Érvénytelen matricafájl: - Érvénytelen proxy listafájl: - Importált proxyszerverek: - Importálási hibák: - Még nem adott meg proxykiszolgálót. - Törölje az összes kiszolgálót - Törölje a nem elérhető kiszolgálókat - Biztosan törli ** az összes kiszolgálót **? - Biztosan törli a nem elérhető kiszolgálókat **? - Sajnálom, de legalább Android 5-re (API21) van szükséged. - Sajnos a mini verzió nem támogatja az ilyen típusú proxyt, kérjük, váltson a verzióra a beállításokban. - Importálás a vágólapra - Ismeretlen / megszakadt link - QR-kód - QR kód beolvasása - Nem található QR-kód - Fejlesztői mód engedélyezése - A fejlesztői mód letiltása - Fejlesztői beállítások - Bejelentkezés beállítások - NekoX GYIK - Fordítóplatform - Nekogram fordítása - Fordítás NekoX - + diff --git a/TMessagesProj/src/main/res/values-id/strings_nekox.xml b/TMessagesProj/src/main/res/values-id/strings_nekox.xml index 340e777d8..a1748b92f 100644 --- a/TMessagesProj/src/main/res/values-id/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-id/strings_nekox.xml @@ -51,7 +51,6 @@ Terdeteksi bahwa anda belum menetapkan kata sandi, yang dapat menyebabkan peretas yang dimiliki pemerintah menemukan identitas anda yang sebenarnya, harap setel! Oke, Terapkan Jangan Ingatkan lagi - Tidak dapat menerjemahkan InstantView menggunakan penerjemah web Hapus emoji dari judul Nekogram X NekoX Publik Proxy Publik diff --git a/TMessagesProj/src/main/res/values-ja/strings_nekox.xml b/TMessagesProj/src/main/res/values-ja/strings_nekox.xml index 5ae0ce61e..d64121bbe 100644 --- a/TMessagesProj/src/main/res/values-ja/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-ja/strings_nekox.xml @@ -51,7 +51,6 @@ パスワードが設定されていないことが検出されました。これにより、政府の管理下にあるハッカーがあなたの本当の身元を見つける可能性があります。パスワードを設定してください。 わかりました。 適用します 今後表示しない - ウェブ翻訳者でInstantViewを翻訳できません タイトルの絵文字を削除 NekoXパブリックプロキシ パブリック diff --git a/TMessagesProj/src/main/res/values-ko/strings_nekox.xml b/TMessagesProj/src/main/res/values-ko/strings_nekox.xml index 515d3ba08..e55af4653 100644 --- a/TMessagesProj/src/main/res/values-ko/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-ko/strings_nekox.xml @@ -51,7 +51,6 @@ 비밀번호 설정을 하지 않았습니다. 정부에서 관리하는 해커가 신원을 확인 할 수 있습니다. 비밀번호를 설정하십시오! 예. 등록합니다. 다시 표시하지 않기 - 웹 번역기로 InstantView를 번역 할 수 없습니다 제목에서 이모티콘 제거 NekoX 공개 프록시 공개 diff --git a/TMessagesProj/src/main/res/values-pt-rBR/strings_nekox.xml b/TMessagesProj/src/main/res/values-pt-rBR/strings_nekox.xml index 9b55037c6..956895f29 100644 --- a/TMessagesProj/src/main/res/values-pt-rBR/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-pt-rBR/strings_nekox.xml @@ -51,7 +51,6 @@ Foi detectado que você não definiu uma senha, o que pode fazer com que os hackers controlados pelo governo encontrem sua verdadeira identidade, por favor, defina uma! OK, Aplicar Não lembre novamente - Não é possível traduzir InstantView com o tradutor web Remover emoji no título Proxy Público do NekoX Público diff --git a/TMessagesProj/src/main/res/values-ru/strings_nekox.xml b/TMessagesProj/src/main/res/values-ru/strings_nekox.xml index 93f4165ba..65e9f3a8b 100644 --- a/TMessagesProj/src/main/res/values-ru/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-ru/strings_nekox.xml @@ -51,7 +51,6 @@ Для повышения конфиденциальности рекомендуем включить двухфакторную аутентификацию. Ок, сделаем это! Больше не напоминать - Невозможно перевести InstantView с веб-переводчиком Убрать эмодзи из шапки Список прокси от NekoX Из списка diff --git a/TMessagesProj/src/main/res/values-tr/strings_nekox.xml b/TMessagesProj/src/main/res/values-tr/strings_nekox.xml index 0e2735702..26a9b3db5 100644 --- a/TMessagesProj/src/main/res/values-tr/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-tr/strings_nekox.xml @@ -51,7 +51,6 @@ Devlet kontrolündeki bilgisayar korsanlarının gerçek kimliğinizi bulmasına neden olabilecek bir şifre ayarlamadığınız tespit edildi, lütfen bir tane belirleyin! Tamam, uygula Bir daha hatırlatma - InstantView web çevirmeni ile çevrilemiyor Başlıktaki emojiyi (😶) kaldırın NekoX Genel Proxy Genel diff --git a/TMessagesProj/src/main/res/values-uk/strings_nekox.xml b/TMessagesProj/src/main/res/values-uk/strings_nekox.xml index a2ed50886..52e0072f4 100644 --- a/TMessagesProj/src/main/res/values-uk/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-uk/strings_nekox.xml @@ -51,7 +51,6 @@ Виявлено, що ви не встановили пароль, через що хакери під контролем уряду можуть знайти справжню особу, будь ласка, встановіть його! Добре, застосувати Не нагадувати більше - Неможливо перекласти InstantView з web translator Видаляти смайли в назві Публічний проксі NekoX Загальнодоступна diff --git a/TMessagesProj/src/main/res/values-zh-rCN/strings_nekox.xml b/TMessagesProj/src/main/res/values-zh-rCN/strings_nekox.xml index b61dc57ce..ae4c50294 100644 --- a/TMessagesProj/src/main/res/values-zh-rCN/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-zh-rCN/strings_nekox.xml @@ -16,6 +16,7 @@ 安装 忽略 一个更新刚刚下载完成. + 代理自动切换 链接的群组 链接的频道 **您的电报账号可能被封禁** @@ -51,7 +52,6 @@ 检测到您没有设置密码,这可能会导致政府控制的黑客找到您的真实身份,请设置一个! 应用 不再提醒 - 无法使用网页翻译器翻译 InstantView 移除标题中的表情 NekoX 公共代理 公共 diff --git a/TMessagesProj/src/main/res/values-zh-rHK/strings_nekox.xml b/TMessagesProj/src/main/res/values-zh-rHK/strings_nekox.xml index e40f3d2bd..654688f30 100644 --- a/TMessagesProj/src/main/res/values-zh-rHK/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-zh-rHK/strings_nekox.xml @@ -51,7 +51,6 @@ 檢測到您尚未設置密碼,這可能導致政府控制的黑客找到您的真實身份,請設置一個! 應用 不再提醒 - 無法使用網絡翻譯器翻譯InstantView 移除標題中的表情 NekoX 公共代理 公共 diff --git a/TMessagesProj/src/main/res/values-zh-rTW/strings_nekox.xml b/TMessagesProj/src/main/res/values-zh-rTW/strings_nekox.xml index d13065c69..171624848 100644 --- a/TMessagesProj/src/main/res/values-zh-rTW/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values-zh-rTW/strings_nekox.xml @@ -51,7 +51,6 @@ 檢測到您尚未設置密碼,這可能導致政府控制的黑客找到您的真實身份,請設置一個! 套用 不再提醒 - 無法使用網絡翻譯器翻譯InstantView 移除標題中的表情 NekoX 公共代理 公共 diff --git a/TMessagesProj/src/main/res/values/strings_nekox.xml b/TMessagesProj/src/main/res/values/strings_nekox.xml index bb6fcf16f..48e4b63e5 100644 --- a/TMessagesProj/src/main/res/values/strings_nekox.xml +++ b/TMessagesProj/src/main/res/values/strings_nekox.xml @@ -20,6 +20,7 @@ Install Ignore An update has just been downloaded. + Proxy Auto Switch Linked Group Linked Channel diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 622ab64a3..186b71557 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists