mirror of
https://github.com/MatsuriDayo/NekoBoxForAndroid.git
synced 2025-12-19 14:40:06 +08:00
Compare commits
No commits in common. "main" and "1.4.0" have entirely different histories.
@ -22,9 +22,7 @@
|
|||||||
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.QUERY_ALL_PACKAGES"
|
android:name="android.permission.QUERY_ALL_PACKAGES"
|
||||||
tools:ignore="PackageVisibilityPolicy" />
|
tools:ignore="QueryAllPackagesPermission" />
|
||||||
<uses-permission android:name="com.android.permission.GET_INSTALLED_APPS" />
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||||
|
|
||||||
|
|||||||
@ -112,7 +112,7 @@ public abstract class StandardV2RayBean extends AbstractBean {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void serialize(ByteBufferOutput output) {
|
public void serialize(ByteBufferOutput output) {
|
||||||
output.writeInt(4);
|
output.writeInt(3);
|
||||||
super.serialize(output);
|
super.serialize(output);
|
||||||
output.writeString(uuid);
|
output.writeString(uuid);
|
||||||
output.writeString(encryption);
|
output.writeString(encryption);
|
||||||
@ -133,15 +133,18 @@ public abstract class StandardV2RayBean extends AbstractBean {
|
|||||||
output.writeString(earlyDataHeaderName);
|
output.writeString(earlyDataHeaderName);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "http":
|
case "http": {
|
||||||
case "httpupgrade": {
|
|
||||||
output.writeString(host);
|
output.writeString(host);
|
||||||
output.writeString(path);
|
output.writeString(path);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "grpc": {
|
case "grpc": {
|
||||||
output.writeString(path);
|
output.writeString(path);
|
||||||
break;
|
}
|
||||||
|
case "httpupgrade": {
|
||||||
|
output.writeString(host);
|
||||||
|
output.writeString(path);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,20 +193,17 @@ public abstract class StandardV2RayBean extends AbstractBean {
|
|||||||
earlyDataHeaderName = input.readString();
|
earlyDataHeaderName = input.readString();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "http":
|
case "http": {
|
||||||
case "httpupgrade": {
|
|
||||||
host = input.readString();
|
host = input.readString();
|
||||||
path = input.readString();
|
path = input.readString();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "grpc": {
|
case "grpc": {
|
||||||
path = input.readString();
|
path = input.readString();
|
||||||
if (version < 4) {
|
}
|
||||||
// 解决老版本数据的读取问题
|
case "httpupgrade": {
|
||||||
input.readString();
|
host = input.readString();
|
||||||
input.readString();
|
path = input.readString();
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package io.nekohasekai.sagernet.ui
|
|||||||
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.ApplicationInfo
|
import android.content.pm.ApplicationInfo
|
||||||
|
import android.content.pm.PackageInfo
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
@ -44,11 +45,6 @@ import kotlin.coroutines.coroutineContext
|
|||||||
class AppListActivity : ThemedActivity() {
|
class AppListActivity : ThemedActivity() {
|
||||||
companion object {
|
companion object {
|
||||||
private const val SWITCH = "switch"
|
private const val SWITCH = "switch"
|
||||||
|
|
||||||
private val cachedApps
|
|
||||||
get() = PackageCache.installedPackages.toMutableMap().apply {
|
|
||||||
remove(BuildConfig.APPLICATION_ID)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ProxiedApp(
|
private class ProxiedApp(
|
||||||
@ -100,8 +96,7 @@ class AppListActivity : ThemedActivity() {
|
|||||||
var filteredApps = apps
|
var filteredApps = apps
|
||||||
|
|
||||||
suspend fun reload() {
|
suspend fun reload() {
|
||||||
PackageCache.reload()
|
apps = getCachedApps().mapNotNull { (packageName, packageInfo) ->
|
||||||
apps = cachedApps.mapNotNull { (packageName, packageInfo) ->
|
|
||||||
coroutineContext[Job]!!.ensureActive()
|
coroutineContext[Job]!!.ensureActive()
|
||||||
packageInfo.applicationInfo?.let { ProxiedApp(packageManager, it, packageName) }
|
packageInfo.applicationInfo?.let { ProxiedApp(packageManager, it, packageName) }
|
||||||
}.sortedWith(compareBy({ !isProxiedApp(it) }, { it.name.toString() }))
|
}.sortedWith(compareBy({ !isProxiedApp(it) }, { it.name.toString() }))
|
||||||
@ -161,7 +156,7 @@ class AppListActivity : ThemedActivity() {
|
|||||||
|
|
||||||
private fun initProxiedUids(str: String = DataStore.routePackages) {
|
private fun initProxiedUids(str: String = DataStore.routePackages) {
|
||||||
proxiedUids.clear()
|
proxiedUids.clear()
|
||||||
val apps = cachedApps
|
val apps = getCachedApps()
|
||||||
for (line in str.lineSequence()) {
|
for (line in str.lineSequence()) {
|
||||||
val app = (apps[line] ?: continue)
|
val app = (apps[line] ?: continue)
|
||||||
val uid = app.applicationInfo?.uid ?: continue
|
val uid = app.applicationInfo?.uid ?: continue
|
||||||
@ -179,12 +174,14 @@ class AppListActivity : ThemedActivity() {
|
|||||||
val adapter = binding.list.adapter as AppsAdapter
|
val adapter = binding.list.adapter as AppsAdapter
|
||||||
withContext(Dispatchers.IO) { adapter.reload() }
|
withContext(Dispatchers.IO) { adapter.reload() }
|
||||||
adapter.filter.filter(binding.search.text?.toString() ?: "")
|
adapter.filter.filter(binding.search.text?.toString() ?: "")
|
||||||
if (apps.isEmpty()) {
|
binding.list.crossFadeFrom(loading)
|
||||||
binding.list.visibility = View.GONE
|
}
|
||||||
binding.appPlaceholder.root.crossFadeFrom(loading)
|
}
|
||||||
} else {
|
|
||||||
binding.list.crossFadeFrom(loading)
|
fun getCachedApps(): MutableMap<String, PackageInfo> {
|
||||||
}
|
val packages = PackageCache.installedPackages
|
||||||
|
return packages.toMutableMap().apply {
|
||||||
|
remove(BuildConfig.APPLICATION_ID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,14 +191,6 @@ class AppListActivity : ThemedActivity() {
|
|||||||
binding = LayoutAppListBinding.inflate(layoutInflater)
|
binding = LayoutAppListBinding.inflate(layoutInflater)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
binding.appPlaceholder.openSettings.setOnClickListener {
|
|
||||||
val intent =
|
|
||||||
Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
|
|
||||||
data = android.net.Uri.fromParts("package", packageName, null)
|
|
||||||
}
|
|
||||||
startActivity(intent)
|
|
||||||
}
|
|
||||||
|
|
||||||
setSupportActionBar(binding.toolbar)
|
setSupportActionBar(binding.toolbar)
|
||||||
supportActionBar?.apply {
|
supportActionBar?.apply {
|
||||||
setTitle(R.string.select_apps)
|
setTitle(R.string.select_apps)
|
||||||
|
|||||||
@ -106,7 +106,6 @@ class AppManagerActivity : ThemedActivity() {
|
|||||||
var filteredApps = apps
|
var filteredApps = apps
|
||||||
|
|
||||||
suspend fun reload() {
|
suspend fun reload() {
|
||||||
PackageCache.reload()
|
|
||||||
apps = cachedApps.mapNotNull { (packageName, packageInfo) ->
|
apps = cachedApps.mapNotNull { (packageName, packageInfo) ->
|
||||||
coroutineContext[Job]!!.ensureActive()
|
coroutineContext[Job]!!.ensureActive()
|
||||||
packageInfo.applicationInfo?.let { ProxiedApp(packageManager, it, packageName) }
|
packageInfo.applicationInfo?.let { ProxiedApp(packageManager, it, packageName) }
|
||||||
@ -185,12 +184,7 @@ class AppManagerActivity : ThemedActivity() {
|
|||||||
val adapter = binding.list.adapter as AppsAdapter
|
val adapter = binding.list.adapter as AppsAdapter
|
||||||
withContext(Dispatchers.IO) { adapter.reload() }
|
withContext(Dispatchers.IO) { adapter.reload() }
|
||||||
adapter.filter.filter(binding.search.text?.toString() ?: "")
|
adapter.filter.filter(binding.search.text?.toString() ?: "")
|
||||||
if (apps.isEmpty()) {
|
binding.list.crossFadeFrom(loading)
|
||||||
binding.list.visibility = View.GONE
|
|
||||||
binding.appPlaceholder.root.crossFadeFrom(loading)
|
|
||||||
} else {
|
|
||||||
binding.list.crossFadeFrom(loading)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,14 +194,6 @@ class AppManagerActivity : ThemedActivity() {
|
|||||||
binding = LayoutAppsBinding.inflate(layoutInflater)
|
binding = LayoutAppsBinding.inflate(layoutInflater)
|
||||||
setContentView(binding.root)
|
setContentView(binding.root)
|
||||||
|
|
||||||
binding.appPlaceholder.openSettings.setOnClickListener {
|
|
||||||
val intent =
|
|
||||||
Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
|
|
||||||
data = android.net.Uri.fromParts("package", packageName, null)
|
|
||||||
}
|
|
||||||
startActivity(intent)
|
|
||||||
}
|
|
||||||
|
|
||||||
setSupportActionBar(binding.toolbar)
|
setSupportActionBar(binding.toolbar)
|
||||||
supportActionBar?.apply {
|
supportActionBar?.apply {
|
||||||
setTitle(R.string.proxied_apps)
|
setTitle(R.string.proxied_apps)
|
||||||
|
|||||||
@ -67,6 +67,15 @@ object PackageCache {
|
|||||||
operator fun get(uid: Int) = uidMap[uid]
|
operator fun get(uid: Int) = uidMap[uid]
|
||||||
operator fun get(packageName: String) = packageMap[packageName]
|
operator fun get(packageName: String) = packageMap[packageName]
|
||||||
|
|
||||||
|
suspend fun awaitLoad() {
|
||||||
|
if (::packageMap.isInitialized) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
loaded.withLock {
|
||||||
|
// just await
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun awaitLoadSync() {
|
fun awaitLoadSync() {
|
||||||
if (::packageMap.isInitialized) {
|
if (::packageMap.isInitialized) {
|
||||||
return
|
return
|
||||||
|
|||||||
@ -128,11 +128,11 @@ object LocalResolverImpl : LocalDNSTransport {
|
|||||||
// 老版本系统,继续用阻塞的 InetAddress
|
// 老版本系统,继续用阻塞的 InetAddress
|
||||||
try {
|
try {
|
||||||
val u = SagerNet.underlyingNetwork
|
val u = SagerNet.underlyingNetwork
|
||||||
val answer = try {
|
val answer = if (u != null) {
|
||||||
u?.getAllByName(domain)
|
u.getAllByName(domain)
|
||||||
} catch (e: UnknownHostException) {
|
} else {
|
||||||
null
|
InetAddress.getAllByName(domain)
|
||||||
} ?: InetAddress.getAllByName(domain)
|
}
|
||||||
if (answer != null) {
|
if (answer != null) {
|
||||||
ctx.success(answer.mapNotNull { it.hostAddress }.joinToString("\n"))
|
ctx.success(answer.mapNotNull { it.hostAddress }.joinToString("\n"))
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -116,8 +116,4 @@
|
|||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
tools:listitem="@layout/layout_apps_item" />
|
tools:listitem="@layout/layout_apps_item" />
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/app_placeholder"
|
|
||||||
layout="@layout/layout_app_placeholder" />
|
|
||||||
|
|
||||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|||||||
@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="32dp"
|
|
||||||
android:visibility="gone">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/empty_message"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="center"
|
|
||||||
android:paddingBottom="16dp"
|
|
||||||
android:text="@string/app_list_permission_denied"
|
|
||||||
android:textColor="?attr/colorOnBackground"
|
|
||||||
android:textSize="16sp" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/open_settings"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/open_app_settings" />
|
|
||||||
</LinearLayout>
|
|
||||||
@ -153,8 +153,4 @@
|
|||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
tools:listitem="@layout/layout_apps_item" />
|
tools:listitem="@layout/layout_apps_item" />
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/app_placeholder"
|
|
||||||
layout="@layout/layout_app_placeholder" />
|
|
||||||
|
|
||||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
|||||||
@ -208,6 +208,7 @@
|
|||||||
<string name="action_trojan_go" translatable="false">Trojan Go</string>
|
<string name="action_trojan_go" translatable="false">Trojan Go</string>
|
||||||
<string name="action_mieru" translatable="false">Mieru</string>
|
<string name="action_mieru" translatable="false">Mieru</string>
|
||||||
<string name="action_naive" translatable="false">Naïve</string>
|
<string name="action_naive" translatable="false">Naïve</string>
|
||||||
|
<string name="action_ping_tunnel" translatable="false">Ping Tunnel</string>
|
||||||
<string name="action_hysteria" translatable="false">Hysteria</string>
|
<string name="action_hysteria" translatable="false">Hysteria</string>
|
||||||
<string name="action_ssh" translatable="false">SSH</string>
|
<string name="action_ssh" translatable="false">SSH</string>
|
||||||
<string name="action_wireguard" translatable="false">WireGuard</string>
|
<string name="action_wireguard" translatable="false">WireGuard</string>
|
||||||
@ -520,7 +521,10 @@
|
|||||||
<string name="enable_ech">فعال کردن ECH</string>
|
<string name="enable_ech">فعال کردن ECH</string>
|
||||||
<string name="enable_ech_sum">فعال کردن ECH</string>
|
<string name="enable_ech_sum">فعال کردن ECH</string>
|
||||||
<string name="ech_settings">تنظیمات ECH</string>
|
<string name="ech_settings">تنظیمات ECH</string>
|
||||||
|
<string name="pq_signature_schemes_enabled">فعال کردن پشتیبانی از امضای مجوز post-quantum همتا</string>
|
||||||
|
<string name="dynamic_record_sizing_disabled">اندازه تطبیقی رکوردهای TLS را غیرفعال میکند</string>
|
||||||
<string name="ech_config">پیکربندی ECH</string>
|
<string name="ech_config">پیکربندی ECH</string>
|
||||||
|
<string name="dynamic_record_sizing_sum">اگر فعال باشد، همیشه از بزرگترین اندازه رکورد TLS ممکن استفاده میشود. در صورت غیرفعال کردن، اندازه رکوردهای TLS ممکن است در تلاش برای بهبود تاخیر تنظیم شود.</string>
|
||||||
<string name="http_upgrade_host">میزبان HTTPUpgrade</string>
|
<string name="http_upgrade_host">میزبان HTTPUpgrade</string>
|
||||||
<string name="http_upgrade_path">مسیر HTTPUpgrade</string>
|
<string name="http_upgrade_path">مسیر HTTPUpgrade</string>
|
||||||
<string name="update_current_subscription">بهروزرسانی اشتراک این گروه</string>
|
<string name="update_current_subscription">بهروزرسانی اشتراک این گروه</string>
|
||||||
|
|||||||
@ -75,9 +75,6 @@
|
|||||||
<string name="chain_settings">Настройки цепочки</string>
|
<string name="chain_settings">Настройки цепочки</string>
|
||||||
<string name="character_counter_content_description">Введено символов: %1$d из %2$d</string>
|
<string name="character_counter_content_description">Введено символов: %1$d из %2$d</string>
|
||||||
<string name="character_counter_overflowed_content_description">Превышено ограничение на количество символов (%1$d из %2$d)</string>
|
<string name="character_counter_overflowed_content_description">Превышено ограничение на количество символов (%1$d из %2$d)</string>
|
||||||
<string name="check_update_no">Обновления не найдены.</string>
|
|
||||||
<string name="check_update_preview">Проверить наличие обновлений предварительной версии</string>
|
|
||||||
<string name="check_update_release">Проверить наличие обновлений релизнойной версии</string>
|
|
||||||
<string name="circular_reference">Циклическая ссылка</string>
|
<string name="circular_reference">Циклическая ссылка</string>
|
||||||
<string name="circular_reference_sum">Маршрут не может содержать сам себя.</string>
|
<string name="circular_reference_sum">Маршрут не может содержать сам себя.</string>
|
||||||
<string name="clear_logcat">Очистить журнал</string>
|
<string name="clear_logcat">Очистить журнал</string>
|
||||||
@ -253,7 +250,6 @@
|
|||||||
<string name="menu_traffic">Трафик</string>
|
<string name="menu_traffic">Трафик</string>
|
||||||
<string name="metered">Подсказка о соединении с лимитным тарифным планом</string>
|
<string name="metered">Подсказка о соединении с лимитным тарифным планом</string>
|
||||||
<string name="metered_summary">Подсказывать системе, что VPN следует рассматривать как сеть с лимитным тарифным планом</string>
|
<string name="metered_summary">Подсказывать системе, что VPN следует рассматривать как сеть с лимитным тарифным планом</string>
|
||||||
<string name="minimize">Свернуть</string>
|
|
||||||
<string name="missing_plugin">Отсутствующий плагин</string>
|
<string name="missing_plugin">Отсутствующий плагин</string>
|
||||||
<string name="move">Переместить</string>
|
<string name="move">Переместить</string>
|
||||||
<string name="mtrl_badge_numberless_content_description">Новое уведомление</string>
|
<string name="mtrl_badge_numberless_content_description">Новое уведомление</string>
|
||||||
@ -323,7 +319,6 @@
|
|||||||
<string name="port_transproxy">Транспрокси-порт</string>
|
<string name="port_transproxy">Транспрокси-порт</string>
|
||||||
<string name="prefer">Предпочитать</string>
|
<string name="prefer">Предпочитать</string>
|
||||||
<string name="preference_copied">Текст "%1$s" скопирован в буфер обмена</string>
|
<string name="preference_copied">Текст "%1$s" скопирован в буфер обмена</string>
|
||||||
<string name="preview_version_hint">Это приложение является предварительной версией и может содержать множество проблем. Если вы не хотите тестировать его, скачайте релизную версию с GitHub!</string>
|
|
||||||
<string name="profile_config">Конфигурация профиля</string>
|
<string name="profile_config">Конфигурация профиля</string>
|
||||||
<string name="profile_empty">Пожалуйста, выберите профиль</string>
|
<string name="profile_empty">Пожалуйста, выберите профиль</string>
|
||||||
<string name="profile_import">Импортировать профиль</string>
|
<string name="profile_import">Импортировать профиль</string>
|
||||||
@ -347,8 +342,6 @@
|
|||||||
<string name="remote_dns">Удаленный DNS</string>
|
<string name="remote_dns">Удаленный DNS</string>
|
||||||
<string name="remove_duplicate">Удалить дубликаты серверов</string>
|
<string name="remove_duplicate">Удалить дубликаты серверов</string>
|
||||||
<string name="reset_connections">Сбросить соединения</string>
|
<string name="reset_connections">Сбросить соединения</string>
|
||||||
<string name="reset_settings">Восстановить настройки по умолчанию</string>
|
|
||||||
<string name="reset_settings_message">Восстановить настройки по умолчанию, такие данные, как узлы и группы, будут сохранены. Для полной очистки данных, очистите данные приложения непосредственно в системных настройках.</string>
|
|
||||||
<string name="resolve_destination">Определить адрес назначения</string>
|
<string name="resolve_destination">Определить адрес назначения</string>
|
||||||
<string name="resolve_destination_summary">Если адрес назначения является доменом, то он передается в соответствии с правилом IPv6.</string>
|
<string name="resolve_destination_summary">Если адрес назначения является доменом, то он передается в соответствии с правилом IPv6.</string>
|
||||||
<string name="route_add">Создать маршрут</string>
|
<string name="route_add">Создать маршрут</string>
|
||||||
@ -411,7 +404,7 @@
|
|||||||
<string name="sniff_routing">Перехватывать результат для Маршрутизации</string>
|
<string name="sniff_routing">Перехватывать результат для Маршрутизации</string>
|
||||||
<string name="speed">%s/с</string>
|
<string name="speed">%s/с</string>
|
||||||
<string name="speed_detail">Прокси :%1$s↑ %2$s↓
|
<string name="speed_detail">Прокси :%1$s↑ %2$s↓
|
||||||
\nПрямой :%3$s↑%4$s↓</string>
|
Прямой :%3$s↑%4$s↓</string>
|
||||||
<string name="speed_interval">Интервал обновления уведомлений о скорости</string>
|
<string name="speed_interval">Интервал обновления уведомлений о скорости</string>
|
||||||
<string name="ss_cat">Настройки Shadowsocks</string>
|
<string name="ss_cat">Настройки Shadowsocks</string>
|
||||||
<string name="ssh_auth_type_none">Без аутентификации</string>
|
<string name="ssh_auth_type_none">Без аутентификации</string>
|
||||||
@ -460,8 +453,6 @@
|
|||||||
<string name="unsaved_changes_prompt">Есть несохраненные изменения. Сохранить?</string>
|
<string name="unsaved_changes_prompt">Есть несохраненные изменения. Сохранить?</string>
|
||||||
<string name="update_all_subscription">Обновить все подписки</string>
|
<string name="update_all_subscription">Обновить все подписки</string>
|
||||||
<string name="update_current_subscription">Обновить подписку текущей группы</string>
|
<string name="update_current_subscription">Обновить подписку текущей группы</string>
|
||||||
<string name="update_dialog_message">Текущая версия: %1$s\nДоступная версия: %2$s\nХотите загрузить её?</string>
|
|
||||||
<string name="update_dialog_title">Доступна новая версия</string>
|
|
||||||
<string name="update_settings">Обновить настройки</string>
|
<string name="update_settings">Обновить настройки</string>
|
||||||
<string name="update_subscription_warning">Прокси-сервер не подключен, вы уверены, что хотите продолжить обновление?</string>
|
<string name="update_subscription_warning">Прокси-сервер не подключен, вы уверены, что хотите продолжить обновление?</string>
|
||||||
<string name="update_when_connected_only">Обновлять только при подключении</string>
|
<string name="update_when_connected_only">Обновлять только при подключении</string>
|
||||||
|
|||||||
@ -495,6 +495,4 @@
|
|||||||
<string name="reset_settings">恢复默认设置</string>
|
<string name="reset_settings">恢复默认设置</string>
|
||||||
<string name="reset_settings_message">恢复默认设置,但节点、分组等数据将保留。如需完全清除数据,请在系统设置中直接清除应用数据。</string>
|
<string name="reset_settings_message">恢复默认设置,但节点、分组等数据将保留。如需完全清除数据,请在系统设置中直接清除应用数据。</string>
|
||||||
<string name="minimize">最小化</string>
|
<string name="minimize">最小化</string>
|
||||||
<string name="app_list_permission_denied">无法读取已安装的应用。\n这通常是由于系统限制了应用的读取权限(例如某些中国厂商系统)。\n请在系统设置中授予权限。</string>
|
|
||||||
<string name="open_app_settings">打开系统设置</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
@ -575,6 +575,4 @@
|
|||||||
<string name="reset_settings">Restore default settings</string>
|
<string name="reset_settings">Restore default settings</string>
|
||||||
<string name="reset_settings_message">Restore default settings, but data such as nodes and groups will be retained. To completely clear data, clear application data directly in the system settings.</string>
|
<string name="reset_settings_message">Restore default settings, but data such as nodes and groups will be retained. To completely clear data, clear application data directly in the system settings.</string>
|
||||||
<string name="minimize">Minimize</string>
|
<string name="minimize">Minimize</string>
|
||||||
<string name="app_list_permission_denied">Unable to read installed apps.\nThis is usually because the system has restricted app read permissions.\nPlease grant permissions in the system settings.</string>
|
|
||||||
<string name="open_app_settings">Open System Settings</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
@ -1,2 +1,2 @@
|
|||||||
export COMMIT_SING_BOX="9beb42f553ebdf575f497c01c33ffa7b6df17efb"
|
export COMMIT_SING_BOX="f39bce4d939a35749aab6ea598b7ff3faf740645"
|
||||||
export COMMIT_LIBNEKO="1c47a3af71990a7b2192e03292b4d246c308ef0b"
|
export COMMIT_LIBNEKO="1c47a3af71990a7b2192e03292b4d246c308ef0b"
|
||||||
|
|||||||
@ -8,11 +8,11 @@ require (
|
|||||||
github.com/matsuridayo/libneko v1.0.0 // replaced
|
github.com/matsuridayo/libneko v1.0.0 // replaced
|
||||||
github.com/miekg/dns v1.1.67
|
github.com/miekg/dns v1.1.67
|
||||||
github.com/oschwald/maxminddb-golang v1.13.1
|
github.com/oschwald/maxminddb-golang v1.13.1
|
||||||
github.com/sagernet/quic-go v0.52.0-sing-box-mod.3
|
github.com/sagernet/quic-go v0.52.0-beta.1
|
||||||
github.com/sagernet/sing v0.7.13
|
github.com/sagernet/sing v0.7.10
|
||||||
github.com/sagernet/sing-box v1.0.0 // replaced
|
github.com/sagernet/sing-box v1.0.0 // replaced
|
||||||
github.com/sagernet/sing-tun v0.7.3
|
github.com/sagernet/sing-tun v0.7.2
|
||||||
github.com/ulikunitz/xz v0.5.15
|
github.com/ulikunitz/xz v0.5.11
|
||||||
golang.org/x/mobile v0.0.0-20231108233038-35478a0c49da
|
golang.org/x/mobile v0.0.0-20231108233038-35478a0c49da
|
||||||
golang.org/x/sys v0.35.0
|
golang.org/x/sys v0.35.0
|
||||||
)
|
)
|
||||||
@ -20,7 +20,7 @@ require (
|
|||||||
require (
|
require (
|
||||||
github.com/ajg/form v1.5.1 // indirect
|
github.com/ajg/form v1.5.1 // indirect
|
||||||
github.com/andybalholm/brotli v1.1.0 // indirect
|
github.com/andybalholm/brotli v1.1.0 // indirect
|
||||||
github.com/anytls/sing-anytls v0.0.11 // indirect
|
github.com/anytls/sing-anytls v0.0.8 // indirect
|
||||||
github.com/caddyserver/certmagic v0.23.0 // indirect
|
github.com/caddyserver/certmagic v0.23.0 // indirect
|
||||||
github.com/caddyserver/zerossl v0.1.3 // indirect
|
github.com/caddyserver/zerossl v0.1.3 // indirect
|
||||||
github.com/cretz/bine v0.2.0 // indirect
|
github.com/cretz/bine v0.2.0 // indirect
|
||||||
@ -42,8 +42,8 @@ require (
|
|||||||
github.com/logrusorgru/aurora v2.0.3+incompatible // indirect
|
github.com/logrusorgru/aurora v2.0.3+incompatible // indirect
|
||||||
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 // indirect
|
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 // indirect
|
||||||
github.com/mdlayher/socket v0.5.1 // indirect
|
github.com/mdlayher/socket v0.5.1 // indirect
|
||||||
github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 // indirect
|
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 // indirect
|
||||||
github.com/metacubex/utls v1.8.3 // indirect
|
github.com/metacubex/utls v1.8.0 // indirect
|
||||||
github.com/mholt/acmez/v3 v3.1.2 // indirect
|
github.com/mholt/acmez/v3 v3.1.2 // indirect
|
||||||
github.com/quic-go/qpack v0.5.1 // indirect
|
github.com/quic-go/qpack v0.5.1 // indirect
|
||||||
github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a // indirect
|
github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a // indirect
|
||||||
@ -85,3 +85,7 @@ require (
|
|||||||
replace github.com/matsuridayo/libneko => ../../libneko
|
replace github.com/matsuridayo/libneko => ../../libneko
|
||||||
|
|
||||||
replace github.com/sagernet/sing-box => ../../sing-box
|
replace github.com/sagernet/sing-box => ../../sing-box
|
||||||
|
|
||||||
|
// replace github.com/sagernet/sing-quic => ../../sing-quic
|
||||||
|
|
||||||
|
// replace github.com/sagernet/sing => ../../sing
|
||||||
|
|||||||
@ -2,8 +2,8 @@ github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
|
|||||||
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
|
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
|
||||||
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
|
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
|
||||||
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
||||||
github.com/anytls/sing-anytls v0.0.11 h1:w8e9Uj1oP3m4zxkyZDewPk0EcQbvVxb7Nn+rapEx4fc=
|
github.com/anytls/sing-anytls v0.0.8 h1:1u/fnH1HoeeMV5mX7/eUOjLBvPdkd1UJRmXiRi6Vymc=
|
||||||
github.com/anytls/sing-anytls v0.0.11/go.mod h1:7rjN6IukwysmdusYsrV51Fgu1uW6vsrdd6ctjnEAln8=
|
github.com/anytls/sing-anytls v0.0.8/go.mod h1:7rjN6IukwysmdusYsrV51Fgu1uW6vsrdd6ctjnEAln8=
|
||||||
github.com/caddyserver/certmagic v0.23.0 h1:CfpZ/50jMfG4+1J/u2LV6piJq4HOfO6ppOnOf7DkFEU=
|
github.com/caddyserver/certmagic v0.23.0 h1:CfpZ/50jMfG4+1J/u2LV6piJq4HOfO6ppOnOf7DkFEU=
|
||||||
github.com/caddyserver/certmagic v0.23.0/go.mod h1:9mEZIWqqWoI+Gf+4Trh04MOVPD0tGSxtqsxg87hAIH4=
|
github.com/caddyserver/certmagic v0.23.0/go.mod h1:9mEZIWqqWoI+Gf+4Trh04MOVPD0tGSxtqsxg87hAIH4=
|
||||||
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
|
github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA=
|
||||||
@ -59,10 +59,10 @@ github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42 h1:A1Cq6Ysb0GM0
|
|||||||
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42/go.mod h1:BB4YCPDOzfy7FniQ/lxuYQ3dgmM2cZumHbK8RpTjN2o=
|
github.com/mdlayher/netlink v1.7.3-0.20250113171957-fbb4dce95f42/go.mod h1:BB4YCPDOzfy7FniQ/lxuYQ3dgmM2cZumHbK8RpTjN2o=
|
||||||
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
|
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
|
||||||
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
|
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 h1:Ui+/2s5Qz0lSnDUBmEL12M5Oi/PzvFxGTNohm8ZcsmE=
|
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 h1:j1VRTiC9JLR4nUbSikx9OGdu/3AgFDqgcLj4GoqyQkc=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
|
github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
|
||||||
github.com/metacubex/utls v1.8.3 h1:0m/yCxm3SK6kWve2lKiFb1pue1wHitJ8sQQD4Ikqde4=
|
github.com/metacubex/utls v1.8.0 h1:mSYi6FMnmc5riARl5UZDmWVy710z+P5b7xuGW0lV9ac=
|
||||||
github.com/metacubex/utls v1.8.3/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko=
|
github.com/metacubex/utls v1.8.0/go.mod h1:FdjYzVfCtgtna19hX0ER1Xsa5uJInwdQ4IcaaI98lEQ=
|
||||||
github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
|
github.com/mholt/acmez/v3 v3.1.2 h1:auob8J/0FhmdClQicvJvuDavgd5ezwLBfKuYmynhYzc=
|
||||||
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
|
github.com/mholt/acmez/v3 v3.1.2/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
|
||||||
github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
|
github.com/miekg/dns v1.1.67 h1:kg0EHj0G4bfT5/oOys6HhZw4vmMlnoZ+gDu8tJ/AlI0=
|
||||||
@ -86,11 +86,11 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN
|
|||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
|
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
|
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
|
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
|
||||||
github.com/sagernet/quic-go v0.52.0-sing-box-mod.3 h1:ySqffGm82rPqI1TUPqmtHIYd12pfEGScygnOxjTL56w=
|
github.com/sagernet/quic-go v0.52.0-beta.1 h1:hWkojLg64zjV+MJOvJU/kOeWndm3tiEfBLx5foisszs=
|
||||||
github.com/sagernet/quic-go v0.52.0-sing-box-mod.3/go.mod h1:OV+V5kEBb8kJS7k29MzDu6oj9GyMc7HA07sE1tedxz4=
|
github.com/sagernet/quic-go v0.52.0-beta.1/go.mod h1:OV+V5kEBb8kJS7k29MzDu6oj9GyMc7HA07sE1tedxz4=
|
||||||
github.com/sagernet/sing v0.6.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
github.com/sagernet/sing v0.6.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
||||||
github.com/sagernet/sing v0.7.13 h1:XNYgd8e3cxMULs/LLJspdn/deHrnPWyrrglNHeCUAYM=
|
github.com/sagernet/sing v0.7.10 h1:2yPhZFx+EkyHPH8hXNezgyRSHyGY12CboId7CtwLROw=
|
||||||
github.com/sagernet/sing v0.7.13/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
github.com/sagernet/sing v0.7.10/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
||||||
github.com/sagernet/sing-mux v0.3.3 h1:YFgt9plMWzH994BMZLmyKL37PdIVaIilwP0Jg+EcLfw=
|
github.com/sagernet/sing-mux v0.3.3 h1:YFgt9plMWzH994BMZLmyKL37PdIVaIilwP0Jg+EcLfw=
|
||||||
github.com/sagernet/sing-mux v0.3.3/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA=
|
github.com/sagernet/sing-mux v0.3.3/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA=
|
||||||
github.com/sagernet/sing-quic v0.5.2-0.20250909083218-00a55617c0fb h1:5Wx3XeTiKrrrcrAky7Hc1bO3CGxrvho2Vu5b/adlEIM=
|
github.com/sagernet/sing-quic v0.5.2-0.20250909083218-00a55617c0fb h1:5Wx3XeTiKrrrcrAky7Hc1bO3CGxrvho2Vu5b/adlEIM=
|
||||||
@ -101,8 +101,8 @@ github.com/sagernet/sing-shadowsocks2 v0.2.1 h1:dWV9OXCeFPuYGHb6IRqlSptVnSzOelnq
|
|||||||
github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
|
github.com/sagernet/sing-shadowsocks2 v0.2.1/go.mod h1:RnXS0lExcDAovvDeniJ4IKa2IuChrdipolPYWBv9hWQ=
|
||||||
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 h1:tK+75l64tm9WvEFrYRE1t0YxoFdWQqw/h7Uhzj0vJ+w=
|
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11 h1:tK+75l64tm9WvEFrYRE1t0YxoFdWQqw/h7Uhzj0vJ+w=
|
||||||
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA=
|
github.com/sagernet/sing-shadowtls v0.2.1-0.20250503051639-fcd445d33c11/go.mod h1:sWqKnGlMipCHaGsw1sTTlimyUpgzP4WP3pjhCsYt9oA=
|
||||||
github.com/sagernet/sing-tun v0.7.3 h1:MFnAir+l24ElEyxdfwtY8mqvUUL9nPnL9TDYLkOmVes=
|
github.com/sagernet/sing-tun v0.7.2 h1:uJkAZM0KBqIYzrq077QGqdvj/+4i/pMOx6Pnx0jYqAs=
|
||||||
github.com/sagernet/sing-tun v0.7.3/go.mod h1:pUEjh9YHQ2gJT6Lk0TYDklh3WJy7lz+848vleGM3JPM=
|
github.com/sagernet/sing-tun v0.7.2/go.mod h1:pUEjh9YHQ2gJT6Lk0TYDklh3WJy7lz+848vleGM3JPM=
|
||||||
github.com/sagernet/sing-vmess v0.2.7 h1:2ee+9kO0xW5P4mfe6TYVWf9VtY8k1JhNysBqsiYj0sk=
|
github.com/sagernet/sing-vmess v0.2.7 h1:2ee+9kO0xW5P4mfe6TYVWf9VtY8k1JhNysBqsiYj0sk=
|
||||||
github.com/sagernet/sing-vmess v0.2.7/go.mod h1:5aYoOtYksAyS0NXDm0qKeTYW1yoE1bJVcv+XLcVoyJs=
|
github.com/sagernet/sing-vmess v0.2.7/go.mod h1:5aYoOtYksAyS0NXDm0qKeTYW1yoE1bJVcv+XLcVoyJs=
|
||||||
github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4=
|
github.com/sagernet/smux v1.5.34-mod.2 h1:gkmBjIjlJ2zQKpLigOkFur5kBKdV6bNRoFu2WkltRQ4=
|
||||||
@ -122,8 +122,8 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl
|
|||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY=
|
github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8=
|
||||||
github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
||||||
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
|
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
|
||||||
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
||||||
github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=
|
github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY=
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
PACKAGE_NAME=moe.nb4a
|
PACKAGE_NAME=moe.nb4a
|
||||||
VERSION_NAME=1.4.1
|
VERSION_NAME=1.4.0
|
||||||
PRE_VERSION_NAME=pre-1.4.1-20251026-2
|
PRE_VERSION_NAME=pre-1.4.0-20250914-1
|
||||||
VERSION_CODE=45
|
VERSION_CODE=44
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user