Compare commits
6 Commits
1.4.13-xra
...
1.5.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4a1c62a67c | ||
|
|
c9a6a459d4 | ||
|
|
21fdcf4ccf | ||
|
|
7c7a623ae5 | ||
|
|
b3074e9697 | ||
|
|
513ebcfa23 |
@@ -15,6 +15,10 @@ import java.net.URLConnection
|
|||||||
val Context.v2RayApplication: AngApplication
|
val Context.v2RayApplication: AngApplication
|
||||||
get() = applicationContext as AngApplication
|
get() = applicationContext as AngApplication
|
||||||
|
|
||||||
|
// Usage note: DPreference use Android ContentProvider to redirect multi process access to main process.
|
||||||
|
// Currently, RunSoLibV2RayDaemon process will run proxy core, keep minimum configuration and long running
|
||||||
|
// in the background, support toggle on/off. That means it should NOT use DPreference after the initial
|
||||||
|
// creation and setup of the service
|
||||||
val Context.defaultDPreference: DPreference
|
val Context.defaultDPreference: DPreference
|
||||||
get() = v2RayApplication.defaultDPreference
|
get() = v2RayApplication.defaultDPreference
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class TaskerReceiver : BroadcastReceiver() {
|
|||||||
return
|
return
|
||||||
} else if (switch) {
|
} else if (switch) {
|
||||||
if (guid == AppConfig.TASKER_DEFAULT_GUID) {
|
if (guid == AppConfig.TASKER_DEFAULT_GUID) {
|
||||||
Utils.startVService(context)
|
Utils.startVServiceFromToggle(context)
|
||||||
} else {
|
} else {
|
||||||
Utils.startVService(context, guid)
|
Utils.startVService(context, guid)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,12 +11,10 @@ import android.service.quicksettings.Tile
|
|||||||
import android.service.quicksettings.TileService
|
import android.service.quicksettings.TileService
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.extension.defaultDPreference
|
|
||||||
import com.v2ray.ang.util.MessageUtil
|
import com.v2ray.ang.util.MessageUtil
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
import java.lang.ref.SoftReference
|
import java.lang.ref.SoftReference
|
||||||
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.N)
|
@TargetApi(Build.VERSION_CODES.N)
|
||||||
class QSTileService : TileService() {
|
class QSTileService : TileService() {
|
||||||
|
|
||||||
@@ -27,7 +25,7 @@ class QSTileService : TileService() {
|
|||||||
qsTile?.icon = Icon.createWithResource(applicationContext, R.drawable.ic_v_idle)
|
qsTile?.icon = Icon.createWithResource(applicationContext, R.drawable.ic_v_idle)
|
||||||
} else if (state == Tile.STATE_ACTIVE) {
|
} else if (state == Tile.STATE_ACTIVE) {
|
||||||
qsTile?.state = Tile.STATE_ACTIVE
|
qsTile?.state = Tile.STATE_ACTIVE
|
||||||
qsTile?.label = defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_NAME, "NG")
|
qsTile?.label = V2RayServiceManager.currentConfigName
|
||||||
qsTile?.icon = Icon.createWithResource(applicationContext, R.drawable.ic_v)
|
qsTile?.icon = Icon.createWithResource(applicationContext, R.drawable.ic_v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ import com.v2ray.ang.AppConfig.TAG_DIRECT
|
|||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.extension.defaultDPreference
|
import com.v2ray.ang.extension.defaultDPreference
|
||||||
import com.v2ray.ang.extension.toSpeedString
|
import com.v2ray.ang.extension.toSpeedString
|
||||||
|
import com.v2ray.ang.extension.toast
|
||||||
|
import com.v2ray.ang.extension.v2RayApplication
|
||||||
import com.v2ray.ang.ui.MainActivity
|
import com.v2ray.ang.ui.MainActivity
|
||||||
import com.v2ray.ang.ui.SettingsActivity
|
import com.v2ray.ang.ui.SettingsActivity
|
||||||
import com.v2ray.ang.util.MessageUtil
|
import com.v2ray.ang.util.MessageUtil
|
||||||
@@ -50,14 +52,20 @@ object V2RayServiceManager {
|
|||||||
Seq.setContext(context)
|
Seq.setContext(context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var currentConfigName = "NG"
|
||||||
|
|
||||||
private var lastQueryTime = 0L
|
private var lastQueryTime = 0L
|
||||||
private var mBuilder: NotificationCompat.Builder? = null
|
private var mBuilder: NotificationCompat.Builder? = null
|
||||||
private var mSubscription: Subscription? = null
|
private var mSubscription: Subscription? = null
|
||||||
private var mNotificationManager: NotificationManager? = null
|
private var mNotificationManager: NotificationManager? = null
|
||||||
|
|
||||||
fun startV2Ray(context: Context, mode: String) {
|
fun startV2Ray(context: Context) {
|
||||||
val intent = if (mode == "VPN") {
|
if (context.v2RayApplication.defaultDPreference.getPrefBoolean(SettingsActivity.PREF_PROXY_SHARING, false)) {
|
||||||
|
context.toast(R.string.toast_warning_pref_proxysharing_short)
|
||||||
|
}else{
|
||||||
|
context.toast(R.string.toast_services_start)
|
||||||
|
}
|
||||||
|
val intent = if (context.v2RayApplication.defaultDPreference.getPrefString(AppConfig.PREF_MODE, "VPN") == "VPN") {
|
||||||
Intent(context.applicationContext, V2RayVpnService::class.java)
|
Intent(context.applicationContext, V2RayVpnService::class.java)
|
||||||
} else {
|
} else {
|
||||||
Intent(context.applicationContext, V2RayProxyOnlyService::class.java)
|
Intent(context.applicationContext, V2RayProxyOnlyService::class.java)
|
||||||
@@ -132,6 +140,7 @@ object V2RayServiceManager {
|
|||||||
v2rayPoint.forwardIpv6 = service.defaultDPreference.getPrefBoolean(SettingsActivity.PREF_FORWARD_IPV6, false)
|
v2rayPoint.forwardIpv6 = service.defaultDPreference.getPrefBoolean(SettingsActivity.PREF_FORWARD_IPV6, false)
|
||||||
v2rayPoint.domainName = service.defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_DOMAIN, "")
|
v2rayPoint.domainName = service.defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_DOMAIN, "")
|
||||||
v2rayPoint.proxyOnly = service.defaultDPreference.getPrefString(AppConfig.PREF_MODE, "VPN") != "VPN"
|
v2rayPoint.proxyOnly = service.defaultDPreference.getPrefString(AppConfig.PREF_MODE, "VPN") != "VPN"
|
||||||
|
currentConfigName = service.defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_NAME, "NG")
|
||||||
|
|
||||||
try {
|
try {
|
||||||
v2rayPoint.runLoop()
|
v2rayPoint.runLoop()
|
||||||
@@ -235,7 +244,7 @@ object V2RayServiceManager {
|
|||||||
|
|
||||||
mBuilder = NotificationCompat.Builder(service, channelId)
|
mBuilder = NotificationCompat.Builder(service, channelId)
|
||||||
.setSmallIcon(R.drawable.ic_v)
|
.setSmallIcon(R.drawable.ic_v)
|
||||||
.setContentTitle(service.defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_NAME, ""))
|
.setContentTitle(currentConfigName)
|
||||||
.setPriority(NotificationCompat.PRIORITY_MIN)
|
.setPriority(NotificationCompat.PRIORITY_MIN)
|
||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
.setShowWhen(false)
|
.setShowWhen(false)
|
||||||
@@ -346,13 +355,10 @@ object V2RayServiceManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun stopSpeedNotification() {
|
fun stopSpeedNotification() {
|
||||||
val service = serviceControl?.get()?.getService() ?: return
|
|
||||||
if (mSubscription != null) {
|
if (mSubscription != null) {
|
||||||
mSubscription?.unsubscribe() //stop queryStats
|
mSubscription?.unsubscribe() //stop queryStats
|
||||||
mSubscription = null
|
mSubscription = null
|
||||||
|
updateNotification(currentConfigName, 0, 0)
|
||||||
val cfName = service.defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_NAME, "")
|
|
||||||
updateNotification(cfName, 0, 0)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import android.os.ParcelFileDescriptor
|
|||||||
import android.os.StrictMode
|
import android.os.StrictMode
|
||||||
import android.support.annotation.RequiresApi
|
import android.support.annotation.RequiresApi
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.v2ray.ang.AppConfig
|
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.extension.defaultDPreference
|
import com.v2ray.ang.extension.defaultDPreference
|
||||||
import com.v2ray.ang.ui.PerAppProxyActivity
|
import com.v2ray.ang.ui.PerAppProxyActivity
|
||||||
@@ -127,7 +126,7 @@ class V2RayVpnService : VpnService(), ServiceControl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.setSession(defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG_NAME, ""))
|
builder.setSession(V2RayServiceManager.currentConfigName)
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP &&
|
||||||
defaultDPreference.getPrefBoolean(SettingsActivity.PREF_PER_APP_PROXY, false)) {
|
defaultDPreference.getPrefBoolean(SettingsActivity.PREF_PER_APP_PROXY, false)) {
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
|
|||||||
}
|
}
|
||||||
showCircle()
|
showCircle()
|
||||||
// toast(R.string.toast_services_start)
|
// toast(R.string.toast_services_start)
|
||||||
if (!Utils.startVService(this)) {
|
if (!Utils.startVService(this, AngConfigManager.configs.index)) {
|
||||||
hideCircle()
|
hideCircle()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,16 +143,14 @@ class MainRecyclerAdapter(val activity: MainActivity) : RecyclerView.Adapter<Mai
|
|||||||
} else {
|
} else {
|
||||||
mActivity.showCircle()
|
mActivity.showCircle()
|
||||||
Utils.stopVService(mActivity)
|
Utils.stopVService(mActivity)
|
||||||
AngConfigManager.setActiveServer(position)
|
|
||||||
Observable.timer(500, TimeUnit.MILLISECONDS)
|
Observable.timer(500, TimeUnit.MILLISECONDS)
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe {
|
.subscribe {
|
||||||
mActivity.showCircle()
|
mActivity.showCircle()
|
||||||
if (!Utils.startVService(mActivity)) {
|
if (!Utils.startVService(mActivity, position)) {
|
||||||
mActivity.hideCircle()
|
mActivity.hideCircle()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import android.os.Bundle
|
|||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
|
import android.util.Log
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
@@ -100,6 +101,11 @@ class Server2Activity : BaseActivity() {
|
|||||||
if (saveSuccess) {
|
if (saveSuccess) {
|
||||||
//update config
|
//update config
|
||||||
defaultDPreference.setPrefString(AppConfig.ANG_CONFIG + edit_guid, tv_content.text.toString())
|
defaultDPreference.setPrefString(AppConfig.ANG_CONFIG + edit_guid, tv_content.text.toString())
|
||||||
|
if (edit_index == configs.index) {
|
||||||
|
if (!AngConfigManager.genStoreV2rayConfig(edit_index)) {
|
||||||
|
Log.d(AppConfig.ANG_PACKAGE, "update custom config $edit_index but generate full configuration failed!")
|
||||||
|
}
|
||||||
|
}
|
||||||
finish()
|
finish()
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.v2ray.ang.ui
|
package com.v2ray.ang.ui
|
||||||
|
|
||||||
|
import android.arch.lifecycle.ViewModelProviders
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.support.v7.preference.*
|
import android.support.v7.preference.*
|
||||||
@@ -7,7 +8,9 @@ import android.view.View
|
|||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.extension.toast
|
import com.v2ray.ang.extension.toast
|
||||||
|
import com.v2ray.ang.util.AngConfigManager
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
|
import com.v2ray.ang.viewmodel.SettingsViewModel
|
||||||
|
|
||||||
class SettingsActivity : BaseActivity() {
|
class SettingsActivity : BaseActivity() {
|
||||||
companion object {
|
companion object {
|
||||||
@@ -36,6 +39,8 @@ class SettingsActivity : BaseActivity() {
|
|||||||
const val PREF_FORWARD_IPV6 = "pref_forward_ipv6"
|
const val PREF_FORWARD_IPV6 = "pref_forward_ipv6"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val settingsViewModel by lazy { ViewModelProviders.of(this).get(SettingsViewModel::class.java) }
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContentView(R.layout.activity_settings)
|
setContentView(R.layout.activity_settings)
|
||||||
@@ -43,6 +48,8 @@ class SettingsActivity : BaseActivity() {
|
|||||||
title = getString(R.string.title_settings)
|
title = getString(R.string.title_settings)
|
||||||
|
|
||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
|
|
||||||
|
settingsViewModel.startListenPreferenceChange()
|
||||||
}
|
}
|
||||||
|
|
||||||
class SettingsFragment : PreferenceFragmentCompat() {
|
class SettingsFragment : PreferenceFragmentCompat() {
|
||||||
@@ -74,7 +81,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
|
|
||||||
private fun restartProxy() {
|
private fun restartProxy() {
|
||||||
Utils.stopVService(requireContext())
|
Utils.stopVService(requireContext())
|
||||||
Utils.startVService(requireContext())
|
Utils.startVService(requireContext(), AngConfigManager.configs.index)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isRunning(): Boolean {
|
private fun isRunning(): Boolean {
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.v2ray.ang.util
|
|||||||
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
|
import android.util.Log
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.v2ray.ang.AngApplication
|
import com.v2ray.ang.AngApplication
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
@@ -154,6 +155,10 @@ object AngConfigManager {
|
|||||||
angConfig.index = index
|
angConfig.index = index
|
||||||
app.curIndex = index
|
app.curIndex = index
|
||||||
storeConfigFile()
|
storeConfigFile()
|
||||||
|
if (!genStoreV2rayConfig(index)) {
|
||||||
|
Log.d(AppConfig.ANG_PACKAGE, "set active index $index but generate full configuration failed!")
|
||||||
|
return -1
|
||||||
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
app.curIndex = -1
|
app.curIndex = -1
|
||||||
@@ -586,9 +591,9 @@ object AngConfigManager {
|
|||||||
*/
|
*/
|
||||||
fun shareFullContent2Clipboard(index: Int): Int {
|
fun shareFullContent2Clipboard(index: Int): Int {
|
||||||
try {
|
try {
|
||||||
if (AngConfigManager.genStoreV2rayConfig(index)) {
|
val result = V2rayConfigUtil.getV2rayConfig(app, angConfig.vmess[index])
|
||||||
val configContent = app.defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG, "")
|
if (result.status) {
|
||||||
Utils.setClipboard(app.applicationContext, configContent)
|
Utils.setClipboard(app.applicationContext, result.content)
|
||||||
} else {
|
} else {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import android.webkit.URLUtil
|
|||||||
import com.v2ray.ang.AngApplication
|
import com.v2ray.ang.AngApplication
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.R
|
import com.v2ray.ang.R
|
||||||
import com.v2ray.ang.dto.EConfigType
|
import com.v2ray.ang.extension.defaultDPreference
|
||||||
import com.v2ray.ang.extension.responseLength
|
import com.v2ray.ang.extension.responseLength
|
||||||
import com.v2ray.ang.extension.toast
|
import com.v2ray.ang.extension.toast
|
||||||
import com.v2ray.ang.extension.v2RayApplication
|
import com.v2ray.ang.extension.v2RayApplication
|
||||||
@@ -32,7 +32,6 @@ import kotlinx.coroutines.isActive
|
|||||||
import me.dozen.dpreference.DPreference
|
import me.dozen.dpreference.DPreference
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.net.*
|
import java.net.*
|
||||||
import libv2ray.Libv2ray
|
|
||||||
import kotlin.coroutines.coroutineContext
|
import kotlin.coroutines.coroutineContext
|
||||||
|
|
||||||
object Utils {
|
object Utils {
|
||||||
@@ -272,38 +271,13 @@ object Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun startVServiceFromToggle(context: Context): Boolean {
|
fun startVServiceFromToggle(context: Context): Boolean {
|
||||||
val result = startVService(context)
|
val result = context.defaultDPreference.getPrefString(AppConfig.PREF_CURR_CONFIG, "")
|
||||||
if (!result) {
|
if (result.isBlank()) {
|
||||||
context.toast(R.string.app_tile_first_use)
|
context.toast(R.string.app_tile_first_use)
|
||||||
}
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* startVService
|
|
||||||
*/
|
|
||||||
fun startVService(context: Context): Boolean {
|
|
||||||
if (context.v2RayApplication.defaultDPreference.getPrefBoolean(SettingsActivity.PREF_PROXY_SHARING, false)) {
|
|
||||||
context.toast(R.string.toast_warning_pref_proxysharing_short)
|
|
||||||
}else{
|
|
||||||
context.toast(R.string.toast_services_start)
|
|
||||||
}
|
|
||||||
if (AngConfigManager.genStoreV2rayConfig(-1)) {
|
|
||||||
val configContent = AngConfigManager.currGeneratedV2rayConfig()
|
|
||||||
val configType = AngConfigManager.currConfigType()
|
|
||||||
if (configType == EConfigType.CUSTOM) {
|
|
||||||
try {
|
|
||||||
Libv2ray.testConfig(configContent)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
context.toast(e.toString())
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
V2RayServiceManager.startV2Ray(context, context.v2RayApplication.defaultDPreference.getPrefString(AppConfig.PREF_MODE, "VPN"))
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
V2RayServiceManager.startV2Ray(context)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -319,8 +293,11 @@ object Utils {
|
|||||||
* startVService
|
* startVService
|
||||||
*/
|
*/
|
||||||
fun startVService(context: Context, index: Int): Boolean {
|
fun startVService(context: Context, index: Int): Boolean {
|
||||||
AngConfigManager.setActiveServer(index)
|
if (AngConfigManager.setActiveServer(index) < 0) {
|
||||||
return startVService(context)
|
return false
|
||||||
|
}
|
||||||
|
V2RayServiceManager.startV2Ray(context)
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package com.v2ray.ang.viewmodel
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import android.arch.lifecycle.AndroidViewModel
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.support.v7.preference.PreferenceManager
|
||||||
|
import android.util.Log
|
||||||
|
import com.v2ray.ang.AppConfig
|
||||||
|
import com.v2ray.ang.ui.SettingsActivity.Companion
|
||||||
|
import com.v2ray.ang.util.AngConfigManager
|
||||||
|
import kotlinx.coroutines.GlobalScope
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
class SettingsViewModel(application: Application) : AndroidViewModel(application), SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
fun startListenPreferenceChange() {
|
||||||
|
PreferenceManager.getDefaultSharedPreferences(getApplication()).registerOnSharedPreferenceChangeListener(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCleared() {
|
||||||
|
PreferenceManager.getDefaultSharedPreferences(getApplication()).unregisterOnSharedPreferenceChangeListener(this)
|
||||||
|
Log.i(AppConfig.ANG_PACKAGE, "Settings ViewModel is cleared")
|
||||||
|
super.onCleared()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
|
||||||
|
Log.d(AppConfig.ANG_PACKAGE, "Observe settings changed: $key")
|
||||||
|
when(key) {
|
||||||
|
Companion.PREF_SNIFFING_ENABLED,
|
||||||
|
Companion.PREF_PROXY_SHARING,
|
||||||
|
Companion.PREF_LOCAL_DNS_ENABLED,
|
||||||
|
Companion.PREF_REMOTE_DNS,
|
||||||
|
Companion.PREF_DOMESTIC_DNS,
|
||||||
|
Companion.PREF_ROUTING_DOMAIN_STRATEGY,
|
||||||
|
Companion.PREF_ROUTING_MODE,
|
||||||
|
AppConfig.PREF_V2RAY_ROUTING_AGENT,
|
||||||
|
AppConfig.PREF_V2RAY_ROUTING_BLOCKED,
|
||||||
|
AppConfig.PREF_V2RAY_ROUTING_DIRECT -> {
|
||||||
|
GlobalScope.launch {
|
||||||
|
if (!AngConfigManager.genStoreV2rayConfig(AngConfigManager.configs.index)) {
|
||||||
|
Log.d(AppConfig.ANG_PACKAGE, "$key changed but generate full configuration failed!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user