Add android power manager

This commit is contained in:
problematicconsumer
2023-09-05 19:03:47 +03:30
parent ee627779bc
commit 182a153955
3 changed files with 46 additions and 5 deletions

View File

@@ -5,9 +5,12 @@ import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.os.Build
import android.os.IBinder import android.os.IBinder
import android.os.ParcelFileDescriptor import android.os.ParcelFileDescriptor
import android.os.PowerManager
import android.util.Log import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.hiddify.hiddify.Application import com.hiddify.hiddify.Application
@@ -22,6 +25,7 @@ import io.nekohasekai.libbox.CommandServerHandler
import io.nekohasekai.libbox.Libbox import io.nekohasekai.libbox.Libbox
import io.nekohasekai.libbox.PProfServer import io.nekohasekai.libbox.PProfServer
import io.nekohasekai.libbox.PlatformInterface import io.nekohasekai.libbox.PlatformInterface
import io.nekohasekai.libbox.SystemProxyStatus
import io.nekohasekai.mobile.Mobile import io.nekohasekai.mobile.Mobile
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
@@ -111,6 +115,12 @@ class BoxService(
Action.SERVICE_RELOAD -> { Action.SERVICE_RELOAD -> {
serviceReload() serviceReload()
} }
PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED -> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
serviceUpdateIdleMode()
}
}
} }
} }
} }
@@ -174,6 +184,7 @@ class BoxService(
} }
override fun serviceReload() { override fun serviceReload() {
status.postValue(Status.Starting)
GlobalScope.launch(Dispatchers.IO) { GlobalScope.launch(Dispatchers.IO) {
val pfd = fileDescriptor val pfd = fileDescriptor
if (pfd != null) { if (pfd != null) {
@@ -194,6 +205,28 @@ class BoxService(
} }
} }
override fun getSystemProxyStatus(): SystemProxyStatus {
val status = SystemProxyStatus()
if (service is VPNService) {
status.available = service.systemProxyAvailable
status.enabled = service.systemProxyEnabled
}
return status
}
override fun setSystemProxyEnabled(isEnabled: Boolean) {
serviceReload()
}
@RequiresApi(Build.VERSION_CODES.M)
private fun serviceUpdateIdleMode() {
if (Application.powerManager.isDeviceIdleMode) {
boxService?.sleep()
} else {
boxService?.wake()
}
}
private fun stopService() { private fun stopService() {
if (status.value != Status.Started) return if (status.value != Status.Started) return
status.value = Status.Stopping status.value = Status.Stopping
@@ -257,6 +290,9 @@ class BoxService(
ContextCompat.registerReceiver(service, receiver, IntentFilter().apply { ContextCompat.registerReceiver(service, receiver, IntentFilter().apply {
addAction(Action.SERVICE_CLOSE) addAction(Action.SERVICE_CLOSE)
addAction(Action.SERVICE_RELOAD) addAction(Action.SERVICE_RELOAD)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED)
}
}, ContextCompat.RECEIVER_NOT_EXPORTED) }, ContextCompat.RECEIVER_NOT_EXPORTED)
receiverRegistered = true receiverRegistered = true
} }

View File

@@ -24,10 +24,7 @@ class ServiceNotification(private val service: Service) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
return true return true
} }
if (Application.notification.areNotificationsEnabled()) { return Application.notification.areNotificationsEnabled()
return true
}
return false
} }
} }

View File

@@ -32,6 +32,9 @@ class VPNService : VpnService(), PlatformInterfaceWrapper {
protect(fd) protect(fd)
} }
var systemProxyAvailable = false
var systemProxyEnabled = true
override fun openTun(options: TunOptions): Int { override fun openTun(options: TunOptions): Int {
if (prepare(this) != null) error("android: missing vpn permission") if (prepare(this) != null) error("android: missing vpn permission")
@@ -124,8 +127,10 @@ class VPNService : VpnService(), PlatformInterfaceWrapper {
} }
if (options.isHTTPProxyEnabled) { if (options.isHTTPProxyEnabled) {
systemProxyAvailable = true
// systemProxyEnabled = Settings.systemProxyEnabled
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
builder.setHttpProxy( if (systemProxyEnabled) builder.setHttpProxy(
ProxyInfo.buildDirectProxy( ProxyInfo.buildDirectProxy(
options.httpProxyServer, options.httpProxyServer,
options.httpProxyServerPort options.httpProxyServerPort
@@ -134,6 +139,9 @@ class VPNService : VpnService(), PlatformInterfaceWrapper {
} else { } else {
error("android: tun.platform.http_proxy requires android 10 or higher") error("android: tun.platform.http_proxy requires android 10 or higher")
} }
} else {
systemProxyAvailable = false
systemProxyEnabled = false
} }
val pfd = val pfd =