Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b571e2a94 | ||
|
|
ba30697309 | ||
|
|
17c858d24c | ||
|
|
71a6531835 | ||
|
|
5d760382d7 | ||
|
|
4dda36673a | ||
|
|
5aca55cb8f | ||
|
|
82f14f0d07 |
@@ -55,8 +55,7 @@ class V2RayVpnService : VpnService() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val v2rayPoint = Libv2ray.newV2RayPoint()
|
private val v2rayPoint = Libv2ray.newV2RayPoint(V2RayCallback())
|
||||||
private val v2rayCallback = V2RayCallback()
|
|
||||||
private lateinit var configContent: String
|
private lateinit var configContent: String
|
||||||
private lateinit var mInterface: ParcelFileDescriptor
|
private lateinit var mInterface: ParcelFileDescriptor
|
||||||
val fd: Int get() = mInterface.fd
|
val fd: Int get() = mInterface.fd
|
||||||
@@ -110,9 +109,13 @@ class V2RayVpnService : VpnService() {
|
|||||||
stopV2Ray()
|
stopV2Ray()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onLowMemory() {
|
||||||
|
stopV2Ray()
|
||||||
|
super.onLowMemory()
|
||||||
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
|
|
||||||
cancelNotification()
|
cancelNotification()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,22 +183,11 @@ class V2RayVpnService : VpnService() {
|
|||||||
// Create a new interface using the builder and save the parameters.
|
// Create a new interface using the builder and save the parameters.
|
||||||
mInterface = builder.establish()
|
mInterface = builder.establish()
|
||||||
sendFd()
|
sendFd()
|
||||||
|
startSpeedNotification()
|
||||||
if (defaultDPreference.getPrefBoolean(SettingsActivity.PREF_SPEED_ENABLED, false)) {
|
|
||||||
mSubscription = Observable.interval(3, java.util.concurrent.TimeUnit.SECONDS)
|
|
||||||
.subscribe {
|
|
||||||
val uplink = v2rayPoint.queryStats("socks", "uplink")
|
|
||||||
val downlink = v2rayPoint.queryStats("socks", "downlink")
|
|
||||||
updateNotification("${(uplink / 3).toSpeedString()} ↑ ${(downlink / 3).toSpeedString()} ↓")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun shutdown() {
|
fun shutdown() {
|
||||||
try {
|
stopV2Ray(true)
|
||||||
mInterface.close()
|
|
||||||
} catch (ignored: Exception) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun sendFd() {
|
fun sendFd() {
|
||||||
@@ -231,12 +223,15 @@ class V2RayVpnService : VpnService() {
|
|||||||
if (!v2rayPoint.isRunning) {
|
if (!v2rayPoint.isRunning) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
registerReceiver(mMsgReceive, IntentFilter(AppConfig.BROADCAST_ACTION_SERVICE))
|
val mFilter = IntentFilter(AppConfig.BROADCAST_ACTION_SERVICE)
|
||||||
|
mFilter.addAction(Intent.ACTION_SCREEN_ON)
|
||||||
|
mFilter.addAction(Intent.ACTION_SCREEN_OFF)
|
||||||
|
mFilter.addAction(Intent.ACTION_USER_PRESENT)
|
||||||
|
registerReceiver(mMsgReceive, mFilter)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
}
|
}
|
||||||
|
|
||||||
configContent = defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG, "")
|
configContent = defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG, "")
|
||||||
v2rayPoint.supportSet = v2rayCallback
|
|
||||||
v2rayPoint.configureFileContent = configContent
|
v2rayPoint.configureFileContent = configContent
|
||||||
v2rayPoint.enableLocalDNS = defaultDPreference.getPrefBoolean(SettingsActivity.PREF_LOCAL_DNS_ENABLED, false)
|
v2rayPoint.enableLocalDNS = defaultDPreference.getPrefBoolean(SettingsActivity.PREF_LOCAL_DNS_ENABLED, false)
|
||||||
v2rayPoint.forwardIpv6 = defaultDPreference.getPrefBoolean(SettingsActivity.PREF_FORWARD_IPV6, false)
|
v2rayPoint.forwardIpv6 = defaultDPreference.getPrefBoolean(SettingsActivity.PREF_FORWARD_IPV6, false)
|
||||||
@@ -321,7 +316,6 @@ class V2RayVpnService : VpnService() {
|
|||||||
mBuilder = NotificationCompat.Builder(applicationContext, channelId)
|
mBuilder = NotificationCompat.Builder(applicationContext, channelId)
|
||||||
.setSmallIcon(R.drawable.ic_v)
|
.setSmallIcon(R.drawable.ic_v)
|
||||||
.setContentTitle(defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_NAME, ""))
|
.setContentTitle(defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_NAME, ""))
|
||||||
.setContentText(getString(R.string.notification_action_more))
|
|
||||||
.setPriority(NotificationCompat.PRIORITY_MIN)
|
.setPriority(NotificationCompat.PRIORITY_MIN)
|
||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
.setShowWhen(false)
|
.setShowWhen(false)
|
||||||
@@ -359,7 +353,7 @@ class V2RayVpnService : VpnService() {
|
|||||||
|
|
||||||
private fun updateNotification(contentText: String) {
|
private fun updateNotification(contentText: String) {
|
||||||
if (mBuilder != null) {
|
if (mBuilder != null) {
|
||||||
mBuilder?.setContentText(contentText)
|
mBuilder?.setContentTitle(contentText)
|
||||||
getNotificationManager().notify(NOTIFICATION_ID, mBuilder?.build())
|
getNotificationManager().notify(NOTIFICATION_ID, mBuilder?.build())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -371,8 +365,41 @@ class V2RayVpnService : VpnService() {
|
|||||||
return mNotificationManager!!
|
return mNotificationManager!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun startSpeedNotification() {
|
||||||
|
if (mSubscription == null &&
|
||||||
|
v2rayPoint.isRunning &&
|
||||||
|
defaultDPreference.getPrefBoolean(SettingsActivity.PREF_SPEED_ENABLED, false)) {
|
||||||
|
val cf_name = defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_NAME, "")
|
||||||
|
var last_zero_speed = false
|
||||||
|
|
||||||
|
mSubscription = Observable.interval(3, java.util.concurrent.TimeUnit.SECONDS)
|
||||||
|
.subscribe {
|
||||||
|
val uplink = v2rayPoint.queryStats("socks", "uplink")
|
||||||
|
val downlink = v2rayPoint.queryStats("socks", "downlink")
|
||||||
|
val zero_speed = (uplink == 0L && downlink == 0L)
|
||||||
|
if (!zero_speed || !last_zero_speed) {
|
||||||
|
updateNotification("${cf_name} • ${(uplink / 3).toSpeedString()}↑ ${(downlink / 3).toSpeedString()}↓")
|
||||||
|
}
|
||||||
|
last_zero_speed = zero_speed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun stopSpeedNotification() {
|
||||||
|
if (mSubscription != null) {
|
||||||
|
mSubscription?.unsubscribe() //stop queryStats
|
||||||
|
mSubscription = null
|
||||||
|
|
||||||
|
val cf_name = defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_NAME, "")
|
||||||
|
updateNotification(cf_name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private inner class V2RayCallback : V2RayVPNServiceSupportsSet {
|
private inner class V2RayCallback : V2RayVPNServiceSupportsSet {
|
||||||
override fun shutdown(): Long {
|
override fun shutdown(): Long {
|
||||||
|
// called by go
|
||||||
|
// shutdown the whole vpn service
|
||||||
try {
|
try {
|
||||||
this@V2RayVpnService.shutdown()
|
this@V2RayVpnService.shutdown()
|
||||||
return 0
|
return 0
|
||||||
@@ -447,6 +474,17 @@ class V2RayVpnService : VpnService() {
|
|||||||
vpnService?.startV2ray()
|
vpnService?.startV2ray()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
when (intent?.action) {
|
||||||
|
Intent.ACTION_SCREEN_OFF -> {
|
||||||
|
Log.d(AppConfig.ANG_PACKAGE, "SCREEN_OFF, stop querying stats")
|
||||||
|
vpnService?.stopSpeedNotification()
|
||||||
|
}
|
||||||
|
Intent.ACTION_SCREEN_ON -> {
|
||||||
|
Log.d(AppConfig.ANG_PACKAGE, "SCREEN_ON, start querying stats")
|
||||||
|
vpnService?.startSpeedNotification()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user