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