This commit is contained in:
arm64v8a 2023-03-31 16:51:38 +09:00
parent dfb81814d1
commit 24ecd8c1a9
11 changed files with 46 additions and 29 deletions

View File

@ -180,5 +180,6 @@ object Action {
const val SERVICE = "io.nekohasekai.sagernet.SERVICE" const val SERVICE = "io.nekohasekai.sagernet.SERVICE"
const val CLOSE = "io.nekohasekai.sagernet.CLOSE" const val CLOSE = "io.nekohasekai.sagernet.CLOSE"
const val RELOAD = "io.nekohasekai.sagernet.RELOAD" 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"
} }

View File

@ -44,11 +44,18 @@ class BaseService {
var proxy: ProxyInstance? = null var proxy: ProxyInstance? = null
var notification: ServiceNotification? = null var notification: ServiceNotification? = null
val receiver = broadcastReceiver { _, intent -> val receiver = broadcastReceiver { ctx, intent ->
when (intent.action) { when (intent.action) {
Intent.ACTION_SHUTDOWN -> service.persistStats() Intent.ACTION_SHUTDOWN -> service.persistStats()
Action.RELOAD -> service.reload() 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() else -> service.stopRunner()
} }
} }
@ -311,7 +318,8 @@ class BaseService {
addAction(Action.RELOAD) addAction(Action.RELOAD)
addAction(Intent.ACTION_SHUTDOWN) addAction(Intent.ACTION_SHUTDOWN)
addAction(Action.CLOSE) addAction(Action.CLOSE)
addAction(Action.SWITCH_WAKE_LOCK) // addAction(Action.SWITCH_WAKE_LOCK)
addAction(Action.RESET_UPSTREAM_CONNECTIONS)
}, "$packageName.SERVICE", null) }, "$packageName.SERVICE", null)
data.closeReceiverRegistered = true data.closeReceiverRegistered = true
} }

View File

@ -93,7 +93,7 @@ class ServiceNotification(
} }
fun postNotificationWakeLockStatus(acquired: Boolean) { fun postNotificationWakeLockStatus(acquired: Boolean) {
updateActions(acquired) updateActions()
builder.priority = builder.priority =
if (acquired) NotificationCompat.PRIORITY_HIGH else NotificationCompat.PRIORITY_LOW if (acquired) NotificationCompat.PRIORITY_HIGH else NotificationCompat.PRIORITY_LOW
update() update()
@ -113,7 +113,7 @@ class ServiceNotification(
init { init {
service as Context service as Context
updateActions(false) updateActions()
Theme.apply(app) Theme.apply(app)
Theme.apply(service) Theme.apply(service)
@ -127,41 +127,43 @@ class ServiceNotification(
show() show()
} }
private fun updateActions(wakeLockAcquired: Boolean) { private fun updateActions() {
service as Context service as Context
builder.clearActions() builder.clearActions()
val closeAction = NotificationCompat.Action.Builder( val closeAction = NotificationCompat.Action.Builder(
0, service.getText(R.string.stop), PendingIntent.getBroadcast( 0, service.getText(R.string.stop), PendingIntent.getBroadcast(
service, 0, Intent(Action.CLOSE).setPackage(service.packageName), flags service, 0, Intent(Action.CLOSE).setPackage(service.packageName), flags
) )
).apply { ).setShowsUserInterface(false).build()
setShowsUserInterface(false)
}.build()
builder.addAction(closeAction) builder.addAction(closeAction)
val switchAction = NotificationCompat.Action.Builder( val switchAction = NotificationCompat.Action.Builder(
0, service.getString(R.string.action_switch), PendingIntent.getActivity( 0, service.getString(R.string.action_switch), PendingIntent.getActivity(
service, 0, Intent(service, SwitchActivity::class.java), flags service, 0, Intent(service, SwitchActivity::class.java), flags
) )
).apply { ).setShowsUserInterface(false).build()
setShowsUserInterface(false)
}.build()
builder.addAction(switchAction) builder.addAction(switchAction)
val wakeLockAction = NotificationCompat.Action.Builder( val resetUpstreamAction = NotificationCompat.Action.Builder(
0, 0, service.getString(R.string.reset_connections),
service.getText(if (!wakeLockAcquired) R.string.acquire_wake_lock else R.string.release_wake_lock),
PendingIntent.getBroadcast( PendingIntent.getBroadcast(
service, service, 0, Intent(Action.RESET_UPSTREAM_CONNECTIONS), flags
0,
Intent(Action.SWITCH_WAKE_LOCK).setPackage(service.packageName),
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) PendingIntent.FLAG_IMMUTABLE else 0
) )
).apply { ).setShowsUserInterface(false).build()
setShowsUserInterface(false) builder.addAction(resetUpstreamAction)
}.build()
builder.addAction(wakeLockAction) // 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) { override fun onReceive(context: Context, intent: Intent) {

View File

@ -24,7 +24,7 @@ abstract class SagerDatabase : RoomDatabase() {
companion object { companion object {
@OptIn(DelicateCoroutinesApi::class) @OptIn(DelicateCoroutinesApi::class)
@Suppress("EXPERIMENTAL_API_USAGE") @Suppress("EXPERIMENTAL_API_USAGE")
private val instance by lazy { val instance by lazy {
SagerNet.application.getDatabasePath(Key.DB_PROFILE).parentFile?.mkdirs() SagerNet.application.getDatabasePath(Key.DB_PROFILE).parentFile?.mkdirs()
Room.databaseBuilder(SagerNet.application, SagerDatabase::class.java, Key.DB_PROFILE) Room.databaseBuilder(SagerNet.application, SagerDatabase::class.java, Key.DB_PROFILE)
.addMigrations(*SagerDatabase_Migrations.build()) .addMigrations(*SagerDatabase_Migrations.build())

View File

@ -13,7 +13,7 @@ import kotlinx.coroutines.launch
@GenerateRoomMigrations @GenerateRoomMigrations
abstract class PublicDatabase : RoomDatabase() { abstract class PublicDatabase : RoomDatabase() {
companion object { companion object {
private val instance by lazy { val instance by lazy {
SagerNet.application.getDatabasePath(Key.DB_PROFILE).parentFile?.mkdirs() SagerNet.application.getDatabasePath(Key.DB_PROFILE).parentFile?.mkdirs()
Room.databaseBuilder(SagerNet.application, PublicDatabase::class.java, Key.DB_PUBLIC) Room.databaseBuilder(SagerNet.application, PublicDatabase::class.java, Key.DB_PUBLIC)
.allowMainThreadQueries() .allowMainThreadQueries()

View File

@ -400,7 +400,7 @@ object RawUpdater : GroupUpdater() {
// wireguard // wireguard
try { try {
proxies.addAll(parseWireGuard(text).map { proxies.addAll(parseWireGuard(text).map {
if (fileName.isNotBlank()) it.name = fileName if (fileName.isNotBlank()) it.name = fileName.removeSuffix(".conf")
it it
}) })
return proxies return proxies

View File

@ -29,6 +29,8 @@ import io.nekohasekai.sagernet.R
import io.nekohasekai.sagernet.SagerNet import io.nekohasekai.sagernet.SagerNet
import io.nekohasekai.sagernet.bg.Executable import io.nekohasekai.sagernet.bg.Executable
import io.nekohasekai.sagernet.database.DataStore 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.MainActivity
import io.nekohasekai.sagernet.ui.ThemedActivity import io.nekohasekai.sagernet.ui.ThemedActivity
import kotlinx.coroutines.* import kotlinx.coroutines.*
@ -242,6 +244,8 @@ fun Fragment.needRestart() {
val ctx = requireContext() val ctx = requireContext()
runOnDefaultDispatcher { runOnDefaultDispatcher {
delay(500) delay(500)
SagerDatabase.instance.close()
PublicDatabase.instance.close()
Executable.killAll(true) Executable.killAll(true)
ProcessPhoenix.triggerRebirth(ctx, Intent(ctx, MainActivity::class.java)) ProcessPhoenix.triggerRebirth(ctx, Intent(ctx, MainActivity::class.java))
} }

View File

@ -16,7 +16,6 @@ abstract class TempDatabase : RoomDatabase() {
private val instance by lazy { private val instance by lazy {
Room.inMemoryDatabaseBuilder(SagerNet.application, TempDatabase::class.java) Room.inMemoryDatabaseBuilder(SagerNet.application, TempDatabase::class.java)
.allowMainThreadQueries() .allowMainThreadQueries()
.enableMultiInstanceInvalidation()
.fallbackToDestructiveMigration() .fallbackToDestructiveMigration()
.setQueryExecutor { GlobalScope.launch { it.run() } } .setQueryExecutor { GlobalScope.launch { it.run() } }
.build() .build()

View File

@ -468,4 +468,5 @@
<string name="shadowtls_version">ShadowTLS 版本</string> <string name="shadowtls_version">ShadowTLS 版本</string>
<string name="share_subscription">分享订阅</string> <string name="share_subscription">分享订阅</string>
<string name="show_group_in_notification">在通知中显示组名</string> <string name="show_group_in_notification">在通知中显示组名</string>
<string name="reset_connections">重置连接</string>
</resources> </resources>

View File

@ -509,5 +509,6 @@ Anyone can write advanced plugins, which can control NekoBox. please download an
<string name="shadowtls_version">ShadowTLS Version</string> <string name="shadowtls_version">ShadowTLS Version</string>
<string name="share_subscription">Share Subscription</string> <string name="share_subscription">Share Subscription</string>
<string name="show_group_in_notification">Show group name in in notification</string> <string name="show_group_in_notification">Show group name in in notification</string>
<string name="reset_connections">Reset Connections</string>
</resources> </resources>

View File

@ -66,6 +66,7 @@ func VersionBox() string {
func ResetAllConnections(system bool) { func ResetAllConnections(system bool) {
if system { if system {
conntrack.Close() conntrack.Close()
log.Println("Reset system connections done")
} }
} }