diff --git a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt index cd85081..23db317 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt @@ -180,5 +180,6 @@ object Action { const val SERVICE = "io.nekohasekai.sagernet.SERVICE" const val CLOSE = "io.nekohasekai.sagernet.CLOSE" const val RELOAD = "io.nekohasekai.sagernet.RELOAD" - const val SWITCH_WAKE_LOCK = "io.nekohasekai.sagernet.SWITCH_WAKELOCK" + // const val SWITCH_WAKE_LOCK = "io.nekohasekai.sagernet.SWITCH_WAKELOCK" + const val RESET_UPSTREAM_CONNECTIONS = "moe.nb4a.RESET_UPSTREAM_CONNECTIONS" } diff --git a/app/src/main/java/io/nekohasekai/sagernet/bg/BaseService.kt b/app/src/main/java/io/nekohasekai/sagernet/bg/BaseService.kt index f1a3c26..179be0b 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/bg/BaseService.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/bg/BaseService.kt @@ -44,11 +44,18 @@ class BaseService { var proxy: ProxyInstance? = null var notification: ServiceNotification? = null - val receiver = broadcastReceiver { _, intent -> + val receiver = broadcastReceiver { ctx, intent -> when (intent.action) { Intent.ACTION_SHUTDOWN -> service.persistStats() Action.RELOAD -> service.reload() - Action.SWITCH_WAKE_LOCK -> runOnDefaultDispatcher { service.switchWakeLock() } + // Action.SWITCH_WAKE_LOCK -> runOnDefaultDispatcher { service.switchWakeLock() } + Action.RESET_UPSTREAM_CONNECTIONS -> runOnDefaultDispatcher { + Libcore.resetAllConnections(true) + runOnMainDispatcher { + Toast.makeText(ctx, "Reset upstream connections done", Toast.LENGTH_SHORT) + .show() + } + } else -> service.stopRunner() } } @@ -311,7 +318,8 @@ class BaseService { addAction(Action.RELOAD) addAction(Intent.ACTION_SHUTDOWN) addAction(Action.CLOSE) - addAction(Action.SWITCH_WAKE_LOCK) + // addAction(Action.SWITCH_WAKE_LOCK) + addAction(Action.RESET_UPSTREAM_CONNECTIONS) }, "$packageName.SERVICE", null) data.closeReceiverRegistered = true } diff --git a/app/src/main/java/io/nekohasekai/sagernet/bg/ServiceNotification.kt b/app/src/main/java/io/nekohasekai/sagernet/bg/ServiceNotification.kt index 432da51..dce4b21 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/bg/ServiceNotification.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/bg/ServiceNotification.kt @@ -93,7 +93,7 @@ class ServiceNotification( } fun postNotificationWakeLockStatus(acquired: Boolean) { - updateActions(acquired) + updateActions() builder.priority = if (acquired) NotificationCompat.PRIORITY_HIGH else NotificationCompat.PRIORITY_LOW update() @@ -113,7 +113,7 @@ class ServiceNotification( init { service as Context - updateActions(false) + updateActions() Theme.apply(app) Theme.apply(service) @@ -127,41 +127,43 @@ class ServiceNotification( show() } - private fun updateActions(wakeLockAcquired: Boolean) { + private fun updateActions() { service as Context - builder.clearActions() + val closeAction = NotificationCompat.Action.Builder( 0, service.getText(R.string.stop), PendingIntent.getBroadcast( service, 0, Intent(Action.CLOSE).setPackage(service.packageName), flags ) - ).apply { - setShowsUserInterface(false) - }.build() + ).setShowsUserInterface(false).build() builder.addAction(closeAction) val switchAction = NotificationCompat.Action.Builder( 0, service.getString(R.string.action_switch), PendingIntent.getActivity( service, 0, Intent(service, SwitchActivity::class.java), flags ) - ).apply { - setShowsUserInterface(false) - }.build() + ).setShowsUserInterface(false).build() builder.addAction(switchAction) - val wakeLockAction = NotificationCompat.Action.Builder( - 0, - service.getText(if (!wakeLockAcquired) R.string.acquire_wake_lock else R.string.release_wake_lock), + val resetUpstreamAction = NotificationCompat.Action.Builder( + 0, service.getString(R.string.reset_connections), PendingIntent.getBroadcast( - service, - 0, - Intent(Action.SWITCH_WAKE_LOCK).setPackage(service.packageName), - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) PendingIntent.FLAG_IMMUTABLE else 0 + service, 0, Intent(Action.RESET_UPSTREAM_CONNECTIONS), flags ) - ).apply { - setShowsUserInterface(false) - }.build() - builder.addAction(wakeLockAction) + ).setShowsUserInterface(false).build() + builder.addAction(resetUpstreamAction) + +// val wakeLockAction = NotificationCompat.Action.Builder( +// 0, +// service.getText(if (!wakeLockAcquired) R.string.acquire_wake_lock else R.string.release_wake_lock), +// PendingIntent.getBroadcast( +// service, +// 0, +// Intent(Action.SWITCH_WAKE_LOCK).setPackage(service.packageName), +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) PendingIntent.FLAG_IMMUTABLE else 0 +// ) +// ).setShowsUserInterface(false).build() +// builder.addAction(wakeLockAction) } override fun onReceive(context: Context, intent: Intent) { diff --git a/app/src/main/java/io/nekohasekai/sagernet/database/SagerDatabase.kt b/app/src/main/java/io/nekohasekai/sagernet/database/SagerDatabase.kt index b6fb8c4..4d57ed3 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/database/SagerDatabase.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/database/SagerDatabase.kt @@ -24,7 +24,7 @@ abstract class SagerDatabase : RoomDatabase() { companion object { @OptIn(DelicateCoroutinesApi::class) @Suppress("EXPERIMENTAL_API_USAGE") - private val instance by lazy { + val instance by lazy { SagerNet.application.getDatabasePath(Key.DB_PROFILE).parentFile?.mkdirs() Room.databaseBuilder(SagerNet.application, SagerDatabase::class.java, Key.DB_PROFILE) .addMigrations(*SagerDatabase_Migrations.build()) diff --git a/app/src/main/java/io/nekohasekai/sagernet/database/preference/PublicDatabase.kt b/app/src/main/java/io/nekohasekai/sagernet/database/preference/PublicDatabase.kt index 5c8a7bd..e9296de 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/database/preference/PublicDatabase.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/database/preference/PublicDatabase.kt @@ -13,7 +13,7 @@ import kotlinx.coroutines.launch @GenerateRoomMigrations abstract class PublicDatabase : RoomDatabase() { companion object { - private val instance by lazy { + val instance by lazy { SagerNet.application.getDatabasePath(Key.DB_PROFILE).parentFile?.mkdirs() Room.databaseBuilder(SagerNet.application, PublicDatabase::class.java, Key.DB_PUBLIC) .allowMainThreadQueries() diff --git a/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt b/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt index eb7d20d..d8d32d9 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt @@ -400,7 +400,7 @@ object RawUpdater : GroupUpdater() { // wireguard try { proxies.addAll(parseWireGuard(text).map { - if (fileName.isNotBlank()) it.name = fileName + if (fileName.isNotBlank()) it.name = fileName.removeSuffix(".conf") it }) return proxies diff --git a/app/src/main/java/io/nekohasekai/sagernet/ktx/Utils.kt b/app/src/main/java/io/nekohasekai/sagernet/ktx/Utils.kt index 769f7c0..d0ce4d8 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ktx/Utils.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ktx/Utils.kt @@ -29,6 +29,8 @@ import io.nekohasekai.sagernet.R import io.nekohasekai.sagernet.SagerNet import io.nekohasekai.sagernet.bg.Executable import io.nekohasekai.sagernet.database.DataStore +import io.nekohasekai.sagernet.database.SagerDatabase +import io.nekohasekai.sagernet.database.preference.PublicDatabase import io.nekohasekai.sagernet.ui.MainActivity import io.nekohasekai.sagernet.ui.ThemedActivity import kotlinx.coroutines.* @@ -242,6 +244,8 @@ fun Fragment.needRestart() { val ctx = requireContext() runOnDefaultDispatcher { delay(500) + SagerDatabase.instance.close() + PublicDatabase.instance.close() Executable.killAll(true) ProcessPhoenix.triggerRebirth(ctx, Intent(ctx, MainActivity::class.java)) } diff --git a/app/src/main/java/moe/matsuri/nb4a/TempDatabase.kt b/app/src/main/java/moe/matsuri/nb4a/TempDatabase.kt index 4070cdb..39517f1 100644 --- a/app/src/main/java/moe/matsuri/nb4a/TempDatabase.kt +++ b/app/src/main/java/moe/matsuri/nb4a/TempDatabase.kt @@ -16,7 +16,6 @@ abstract class TempDatabase : RoomDatabase() { private val instance by lazy { Room.inMemoryDatabaseBuilder(SagerNet.application, TempDatabase::class.java) .allowMainThreadQueries() - .enableMultiInstanceInvalidation() .fallbackToDestructiveMigration() .setQueryExecutor { GlobalScope.launch { it.run() } } .build() diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 12f125c..283ddf6 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -468,4 +468,5 @@ ShadowTLS 版本 分享订阅 在通知中显示组名 + 重置连接 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2977117..8f0e685 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -509,5 +509,6 @@ Anyone can write advanced plugins, which can control NekoBox. please download an ShadowTLS Version Share Subscription Show group name in in notification + Reset Connections \ No newline at end of file diff --git a/libcore/box.go b/libcore/box.go index f418e49..1e77465 100644 --- a/libcore/box.go +++ b/libcore/box.go @@ -66,6 +66,7 @@ func VersionBox() string { func ResetAllConnections(system bool) { if system { conntrack.Close() + log.Println("Reset system connections done") } }