mirror of
https://github.com/MatsuriDayo/NekoBoxForAndroid.git
synced 2025-12-19 14:40:06 +08:00
update
This commit is contained in:
parent
dfb81814d1
commit
24ecd8c1a9
@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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())
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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>
|
||||||
@ -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>
|
||||||
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user