Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| df3f1ca3ef | |||
| c54d8fa43a | |||
| 5bbbdcf6f2 | |||
| 4abf20fa32 | |||
| 723727feb9 | |||
| 2efd4b741c | |||
| 83aab0f880 | |||
| 66ea17877e | |||
| 26bc985368 | |||
| 5bbf40c784 | |||
| 6d5c23245c | |||
| b148290211 |
@@ -1,5 +1,25 @@
|
|||||||
# v2rayNG
|
# v2rayNG
|
||||||
|
|
||||||
|
A V2Ray client for Android
|
||||||
|
|
||||||
|
[](https://developer.android.com/about/versions/jelly-bean#android-4.2)
|
||||||
|
[](https://kotlinlang.org)
|
||||||
|
[](https://github.com/2dust/v2rayNG/commits/master)
|
||||||
|
[](https://www.codefactor.io/repository/github/2dust/v2rayng)
|
||||||
|
[](https://github.com/2dust/v2rayNG/releases)
|
||||||
|
|
||||||
<a href="https://play.google.com/store/apps/details?id=com.v2ray.ang">
|
<a href="https://play.google.com/store/apps/details?id=com.v2ray.ang">
|
||||||
<img alt="Get it on Google Play" src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png" width="165" height="64" />
|
<img alt="Get it on Google Play" src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png" width="165" height="64" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
See our [wiki](https://github.com/2dust/v2rayNG/wiki)
|
||||||
|
|
||||||
|
### Development guide
|
||||||
|
|
||||||
|
Android project under V2rayNG folder can be compiled directly in Android Studio, or using Gradle wrapper. But the v2ray core inside the aar is (probably) outdated.
|
||||||
|
The aar can be compiled from the Golang project under AndroidLibV2rayLite folder. For a quick start, read guide for [Go Mobile](https://github.com/golang/go/wiki/Mobile)
|
||||||
|
and [Makefiles for Go Developers](https://tutorialedge.net/golang/makefiles-for-go-developers/)
|
||||||
|
|
||||||
|
v2rayNG can run on Android Emulators, with minimum Android 5.0
|
||||||
|
|||||||
@@ -62,14 +62,13 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||||
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
testImplementation 'junit:junit:4.13'
|
||||||
testImplementation 'junit:junit:4.12'
|
|
||||||
implementation project(':dpreference')
|
implementation project(':dpreference')
|
||||||
|
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
|
||||||
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
|
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.2"
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9"
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.2" // 1.3.x has compile error:
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9"
|
||||||
// More than one file was found with OS independent path 'META-INF/proguard/coroutines.pro'
|
|
||||||
|
|
||||||
// Android support library
|
// Android support library
|
||||||
implementation "com.android.support:support-v4:$supportLibVersion"
|
implementation "com.android.support:support-v4:$supportLibVersion"
|
||||||
@@ -79,12 +78,14 @@ dependencies {
|
|||||||
implementation "com.android.support:preference-v7:$supportLibVersion"
|
implementation "com.android.support:preference-v7:$supportLibVersion"
|
||||||
implementation "com.android.support:recyclerview-v7:$supportLibVersion"
|
implementation "com.android.support:recyclerview-v7:$supportLibVersion"
|
||||||
implementation "com.android.support:multidex:1.0.3"
|
implementation "com.android.support:multidex:1.0.3"
|
||||||
|
implementation 'com.android.support.constraint:constraint-layout:2.0.1'
|
||||||
|
|
||||||
// DSL
|
// DSL
|
||||||
implementation "org.jetbrains.anko:anko-sdk15:$ankoVersion"
|
implementation "org.jetbrains.anko:anko-sdk15:$ankoVersion"
|
||||||
implementation "org.jetbrains.anko:anko-support-v4:$ankoVersion"
|
implementation "org.jetbrains.anko:anko-support-v4:$ankoVersion"
|
||||||
implementation "org.jetbrains.anko:anko-appcompat-v7:$ankoVersion"
|
implementation "org.jetbrains.anko:anko-appcompat-v7:$ankoVersion"
|
||||||
implementation "org.jetbrains.anko:anko-design:$ankoVersion"
|
implementation "org.jetbrains.anko:anko-design:$ankoVersion"
|
||||||
implementation 'com.google.code.gson:gson:2.8.5'
|
implementation 'com.google.code.gson:gson:2.8.6'
|
||||||
implementation 'io.reactivex:rxjava:1.3.4'
|
implementation 'io.reactivex:rxjava:1.3.4'
|
||||||
implementation 'io.reactivex:rxandroid:1.2.1'
|
implementation 'io.reactivex:rxandroid:1.2.1'
|
||||||
implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
|
implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
|
||||||
@@ -94,7 +95,6 @@ dependencies {
|
|||||||
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
|
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
|
||||||
implementation 'com.github.jorgecastilloprz:fabprogresscircle:1.01@aar'
|
implementation 'com.github.jorgecastilloprz:fabprogresscircle:1.01@aar'
|
||||||
implementation 'com.beust:klaxon:3.0.1'
|
implementation 'com.beust:klaxon:3.0.1'
|
||||||
implementation 'com.android.support:multidex:1.0.3'
|
|
||||||
|
|
||||||
implementation(name: 'libv2ray', ext: 'aar')
|
implementation(name: 'libv2ray', ext: 'aar')
|
||||||
//implementation(name: 'tun2socks', ext: 'aar')
|
//implementation(name: 'tun2socks', ext: 'aar')
|
||||||
|
|||||||
@@ -79,6 +79,7 @@
|
|||||||
<activity
|
<activity
|
||||||
android:name=".ui.ScSwitchActivity"
|
android:name=".ui.ScSwitchActivity"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
|
android:process=":RunSoLibV2RayDaemon"
|
||||||
android:theme="@style/AppTheme.NoActionBar.Translucent" />
|
android:theme="@style/AppTheme.NoActionBar.Translucent" />
|
||||||
|
|
||||||
<service
|
<service
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ object AppConfig {
|
|||||||
const val androidpackagenamelistUrl = "https://raw.githubusercontent.com/2dust/androidpackagenamelist/master/proxy.txt"
|
const val androidpackagenamelistUrl = "https://raw.githubusercontent.com/2dust/androidpackagenamelist/master/proxy.txt"
|
||||||
const val v2rayCustomRoutingListUrl = "https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/"
|
const val v2rayCustomRoutingListUrl = "https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/"
|
||||||
const val v2rayNGIssues = "https://github.com/2dust/v2rayNG/issues"
|
const val v2rayNGIssues = "https://github.com/2dust/v2rayNG/issues"
|
||||||
|
const val v2rayNGWikiMode = "https://github.com/2dust/v2rayNG/wiki/Mode"
|
||||||
const val promotionUrl = "https://1.2345345.xyz/ads.html"
|
const val promotionUrl = "https://1.2345345.xyz/ads.html"
|
||||||
|
|
||||||
const val DNS_AGENT = "1.1.1.1"
|
const val DNS_AGENT = "1.1.1.1"
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ object V2RayServiceManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun protect(l: Long): Long {
|
override fun protect(l: Long): Long {
|
||||||
val serviceControl = serviceControl?.get() ?: return 1
|
val serviceControl = serviceControl?.get() ?: return 0
|
||||||
return if (serviceControl.vpnProtect(l.toInt())) 0 else 1
|
return if (serviceControl.vpnProtect(l.toInt())) 0 else 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ class V2RayVpnService : VpnService(), ServiceControl {
|
|||||||
*
|
*
|
||||||
* Source: https://android.googlesource.com/platform/frameworks/base/+/2df4c7d/services/core/java/com/android/server/ConnectivityService.java#887
|
* Source: https://android.googlesource.com/platform/frameworks/base/+/2df4c7d/services/core/java/com/android/server/ConnectivityService.java#887
|
||||||
*/
|
*/
|
||||||
private val defaultNetworkRequest by lazy @RequiresApi(Build.VERSION_CODES.P) {
|
@delegate:RequiresApi(Build.VERSION_CODES.P)
|
||||||
|
private val defaultNetworkRequest by lazy {
|
||||||
NetworkRequest.Builder()
|
NetworkRequest.Builder()
|
||||||
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||||
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
||||||
@@ -41,7 +42,8 @@ class V2RayVpnService : VpnService(), ServiceControl {
|
|||||||
|
|
||||||
private val connectivity by lazy { getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager }
|
private val connectivity by lazy { getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager }
|
||||||
|
|
||||||
private val defaultNetworkCallback by lazy @RequiresApi(Build.VERSION_CODES.P) {
|
@delegate:RequiresApi(Build.VERSION_CODES.P)
|
||||||
|
private val defaultNetworkCallback by lazy {
|
||||||
object : ConnectivityManager.NetworkCallback() {
|
object : ConnectivityManager.NetworkCallback() {
|
||||||
override fun onAvailable(network: Network) {
|
override fun onAvailable(network: Network) {
|
||||||
setUnderlyingNetworks(arrayOf(network))
|
setUnderlyingNetworks(arrayOf(network))
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import android.support.v4.view.GravityCompat
|
|||||||
import android.support.v7.app.ActionBarDrawerToggle
|
import android.support.v7.app.ActionBarDrawerToggle
|
||||||
import android.support.v7.widget.helper.ItemTouchHelper
|
import android.support.v7.widget.helper.ItemTouchHelper
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import com.v2ray.ang.BuildConfig
|
||||||
import com.v2ray.ang.dto.EConfigType
|
import com.v2ray.ang.dto.EConfigType
|
||||||
import com.v2ray.ang.extension.defaultDPreference
|
import com.v2ray.ang.extension.defaultDPreference
|
||||||
//import com.v2ray.ang.InappBuyActivity
|
//import com.v2ray.ang.InappBuyActivity
|
||||||
@@ -36,6 +37,7 @@ import java.util.concurrent.TimeUnit
|
|||||||
import com.v2ray.ang.helper.SimpleItemTouchHelperCallback
|
import com.v2ray.ang.helper.SimpleItemTouchHelperCallback
|
||||||
import com.v2ray.ang.util.AngConfigManager.configs
|
import com.v2ray.ang.util.AngConfigManager.configs
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
|
import libv2ray.Libv2ray
|
||||||
|
|
||||||
class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener {
|
class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener {
|
||||||
companion object {
|
companion object {
|
||||||
@@ -113,6 +115,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
|
|||||||
drawer_layout.addDrawerListener(toggle)
|
drawer_layout.addDrawerListener(toggle)
|
||||||
toggle.syncState()
|
toggle.syncState()
|
||||||
nav_view.setNavigationItemSelectedListener(this)
|
nav_view.setNavigationItemSelectedListener(this)
|
||||||
|
version.text = "v${BuildConfig.VERSION_NAME} (${Libv2ray.checkVersionX()})"
|
||||||
}
|
}
|
||||||
|
|
||||||
fun startV2Ray() {
|
fun startV2Ray() {
|
||||||
|
|||||||
@@ -1,23 +1,14 @@
|
|||||||
package com.v2ray.ang.ui
|
package com.v2ray.ang.ui
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import android.content.SharedPreferences
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.preference.*
|
import android.support.v7.preference.*
|
||||||
import com.v2ray.ang.AngApplication
|
import android.view.View
|
||||||
import com.v2ray.ang.BuildConfig
|
|
||||||
//import com.v2ray.ang.InappBuyActivity
|
|
||||||
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.defaultDPreference
|
|
||||||
import com.v2ray.ang.extension.onClick
|
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
import org.jetbrains.anko.act
|
|
||||||
import org.jetbrains.anko.defaultSharedPreferences
|
import org.jetbrains.anko.defaultSharedPreferences
|
||||||
import org.jetbrains.anko.startActivity
|
import org.jetbrains.anko.startActivity
|
||||||
import org.jetbrains.anko.toast
|
import org.jetbrains.anko.toast
|
||||||
import libv2ray.Libv2ray
|
|
||||||
|
|
||||||
class SettingsActivity : BaseActivity() {
|
class SettingsActivity : BaseActivity() {
|
||||||
companion object {
|
companion object {
|
||||||
@@ -42,7 +33,6 @@ class SettingsActivity : BaseActivity() {
|
|||||||
// const val PREF_LICENSES = "pref_licenses"
|
// const val PREF_LICENSES = "pref_licenses"
|
||||||
// const val PREF_FEEDBACK = "pref_feedback"
|
// const val PREF_FEEDBACK = "pref_feedback"
|
||||||
// const val PREF_TG_GROUP = "pref_tg_group"
|
// const val PREF_TG_GROUP = "pref_tg_group"
|
||||||
const val PREF_VERSION = "pref_version"
|
|
||||||
// const val PREF_AUTO_RESTART = "pref_auto_restart"
|
// const val PREF_AUTO_RESTART = "pref_auto_restart"
|
||||||
const val PREF_FORWARD_IPV6 = "pref_forward_ipv6"
|
const val PREF_FORWARD_IPV6 = "pref_forward_ipv6"
|
||||||
}
|
}
|
||||||
@@ -56,18 +46,18 @@ class SettingsActivity : BaseActivity() {
|
|||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
class SettingsFragment : PreferenceFragment(), SharedPreferences.OnSharedPreferenceChangeListener {
|
class SettingsFragment : PreferenceFragmentCompat() {
|
||||||
val perAppProxy by lazy { findPreference(PREF_PER_APP_PROXY) as CheckBoxPreference }
|
private val perAppProxy by lazy { findPreference(PREF_PER_APP_PROXY) as CheckBoxPreference }
|
||||||
val sppedEnabled by lazy { findPreference(PREF_SPEED_ENABLED) as CheckBoxPreference }
|
private val sppedEnabled by lazy { findPreference(PREF_SPEED_ENABLED) as CheckBoxPreference }
|
||||||
val sniffingEnabled by lazy { findPreference(PREF_SNIFFING_ENABLED) as CheckBoxPreference }
|
private val sniffingEnabled by lazy { findPreference(PREF_SNIFFING_ENABLED) as CheckBoxPreference }
|
||||||
val proxySharing by lazy { findPreference(PREF_PROXY_SHARING) as CheckBoxPreference }
|
private val proxySharing by lazy { findPreference(PREF_PROXY_SHARING) as CheckBoxPreference }
|
||||||
val domainStrategy by lazy { findPreference(PREF_ROUTING_DOMAIN_STRATEGY) as ListPreference }
|
private val domainStrategy by lazy { findPreference(PREF_ROUTING_DOMAIN_STRATEGY) as ListPreference }
|
||||||
val routingMode by lazy { findPreference(PREF_ROUTING_MODE) as ListPreference }
|
private val routingMode by lazy { findPreference(PREF_ROUTING_MODE) as ListPreference }
|
||||||
|
|
||||||
val forwardIpv6 by lazy { findPreference(PREF_FORWARD_IPV6) as CheckBoxPreference }
|
private val forwardIpv6 by lazy { findPreference(PREF_FORWARD_IPV6) as CheckBoxPreference }
|
||||||
val enableLocalDns by lazy { findPreference(PREF_LOCAL_DNS_ENABLED) as CheckBoxPreference }
|
private val enableLocalDns by lazy { findPreference(PREF_LOCAL_DNS_ENABLED) as CheckBoxPreference }
|
||||||
val domesticDns by lazy { findPreference(PREF_DOMESTIC_DNS) as EditTextPreference }
|
private val domesticDns by lazy { findPreference(PREF_DOMESTIC_DNS) as EditTextPreference }
|
||||||
val remoteDns by lazy { findPreference(PREF_REMOTE_DNS) as EditTextPreference }
|
private val remoteDns by lazy { findPreference(PREF_REMOTE_DNS) as EditTextPreference }
|
||||||
|
|
||||||
// val autoRestart by lazy { findPreference(PREF_AUTO_RESTART) as CheckBoxPreference }
|
// val autoRestart by lazy { findPreference(PREF_AUTO_RESTART) as CheckBoxPreference }
|
||||||
|
|
||||||
@@ -75,32 +65,31 @@ class SettingsActivity : BaseActivity() {
|
|||||||
// val socksPort by lazy { findPreference(PREF_SOCKS_PORT) as EditTextPreference }
|
// val socksPort by lazy { findPreference(PREF_SOCKS_PORT) as EditTextPreference }
|
||||||
// val httpPort by lazy { findPreference(PREF_HTTP_PORT) as EditTextPreference }
|
// val httpPort by lazy { findPreference(PREF_HTTP_PORT) as EditTextPreference }
|
||||||
|
|
||||||
val routingCustom: Preference by lazy { findPreference(PREF_ROUTING_CUSTOM) }
|
private val routingCustom: Preference by lazy { findPreference(PREF_ROUTING_CUSTOM) }
|
||||||
// val donate: Preference by lazy { findPreference(PREF_DONATE) }
|
// val donate: Preference by lazy { findPreference(PREF_DONATE) }
|
||||||
// val licenses: Preference by lazy { findPreference(PREF_LICENSES) }
|
// val licenses: Preference by lazy { findPreference(PREF_LICENSES) }
|
||||||
// val feedback: Preference by lazy { findPreference(PREF_FEEDBACK) }
|
// val feedback: Preference by lazy { findPreference(PREF_FEEDBACK) }
|
||||||
// val tgGroup: Preference by lazy { findPreference(PREF_TG_GROUP) }
|
// val tgGroup: Preference by lazy { findPreference(PREF_TG_GROUP) }
|
||||||
val version: Preference by lazy { findPreference(PREF_VERSION) }
|
|
||||||
|
private val mode by lazy { findPreference(AppConfig.PREF_MODE) as ListPreference }
|
||||||
|
|
||||||
private fun restartProxy() {
|
private fun restartProxy() {
|
||||||
Utils.stopVService(activity)
|
Utils.stopVService(requireContext())
|
||||||
Utils.startVService(activity)
|
Utils.startVService(requireContext())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isRunning(): Boolean {
|
private fun isRunning(): Boolean {
|
||||||
return false //TODO no point of adding logic now since Settings will be changed soon
|
return false //TODO no point of adding logic now since Settings will be changed soon
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreatePreferences(bundle: Bundle?, s: String?) {
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
addPreferencesFromResource(R.xml.pref_settings)
|
addPreferencesFromResource(R.xml.pref_settings)
|
||||||
var app = activity.application as AngApplication
|
|
||||||
|
|
||||||
perAppProxy.setOnPreferenceClickListener {
|
perAppProxy.setOnPreferenceClickListener {
|
||||||
if (isRunning()) {
|
if (isRunning()) {
|
||||||
Utils.stopVService(activity)
|
Utils.stopVService(requireContext())
|
||||||
}
|
}
|
||||||
startActivity<PerAppProxyActivity>()
|
activity?.startActivity<PerAppProxyActivity>()
|
||||||
perAppProxy.isChecked = true
|
perAppProxy.isChecked = true
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
@@ -117,7 +106,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
|
|
||||||
proxySharing.setOnPreferenceClickListener {
|
proxySharing.setOnPreferenceClickListener {
|
||||||
if (proxySharing.isChecked)
|
if (proxySharing.isChecked)
|
||||||
toast(R.string.toast_warning_pref_proxysharing)
|
activity?.toast(R.string.toast_warning_pref_proxysharing)
|
||||||
if (isRunning())
|
if (isRunning())
|
||||||
restartProxy()
|
restartProxy()
|
||||||
true
|
true
|
||||||
@@ -134,10 +123,11 @@ class SettingsActivity : BaseActivity() {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
routingCustom.onClick {
|
routingCustom.setOnPreferenceClickListener {
|
||||||
if (isRunning())
|
if (isRunning())
|
||||||
Utils.stopVService(activity)
|
Utils.stopVService(requireContext())
|
||||||
startActivity<RoutingSettingsActivity>()
|
activity?.startActivity<RoutingSettingsActivity>()
|
||||||
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
forwardIpv6.setOnPreferenceClickListener {
|
forwardIpv6.setOnPreferenceClickListener {
|
||||||
@@ -153,7 +143,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
domesticDns.setOnPreferenceChangeListener { preference, any ->
|
domesticDns.setOnPreferenceChangeListener { _, any ->
|
||||||
// domesticDns.summary = any as String
|
// domesticDns.summary = any as String
|
||||||
val nval = any as String
|
val nval = any as String
|
||||||
domesticDns.summary = if (nval == "") AppConfig.DNS_DIRECT else nval
|
domesticDns.summary = if (nval == "") AppConfig.DNS_DIRECT else nval
|
||||||
@@ -162,7 +152,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
remoteDns.setOnPreferenceChangeListener { preference, any ->
|
remoteDns.setOnPreferenceChangeListener { _, any ->
|
||||||
// remoteDns.summary = any as String
|
// remoteDns.summary = any as String
|
||||||
val nval = any as String
|
val nval = any as String
|
||||||
remoteDns.summary = if (nval == "") AppConfig.DNS_AGENT else nval
|
remoteDns.summary = if (nval == "") AppConfig.DNS_AGENT else nval
|
||||||
@@ -171,6 +161,12 @@ class SettingsActivity : BaseActivity() {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mode.setOnPreferenceChangeListener { _, newValue ->
|
||||||
|
updatePerAppProxy(newValue.toString())
|
||||||
|
true
|
||||||
|
}
|
||||||
|
mode.dialogLayoutResource = R.layout.preference_with_help_link
|
||||||
|
|
||||||
// donate.onClick {
|
// donate.onClick {
|
||||||
// startActivity<InappBuyActivity>()
|
// startActivity<InappBuyActivity>()
|
||||||
// }
|
// }
|
||||||
@@ -206,16 +202,13 @@ class SettingsActivity : BaseActivity() {
|
|||||||
// httpPort.summary = any as String
|
// httpPort.summary = any as String
|
||||||
// true
|
// true
|
||||||
// }
|
// }
|
||||||
|
|
||||||
version.summary = "${BuildConfig.VERSION_NAME} (${Libv2ray.checkVersionX()})"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
super.onStart()
|
super.onStart()
|
||||||
|
updatePerAppProxy(activity?.defaultSharedPreferences?.getString(AppConfig.PREF_MODE, "VPN"))
|
||||||
perAppProxy.isChecked = defaultSharedPreferences.getBoolean(PREF_PER_APP_PROXY, false)
|
remoteDns.summary = activity?.defaultSharedPreferences?.getString(PREF_REMOTE_DNS, "")
|
||||||
remoteDns.summary = defaultSharedPreferences.getString(PREF_REMOTE_DNS, "")
|
domesticDns.summary = activity?.defaultSharedPreferences?.getString(PREF_DOMESTIC_DNS, "")
|
||||||
domesticDns.summary = defaultSharedPreferences.getString(PREF_DOMESTIC_DNS, "")
|
|
||||||
|
|
||||||
if (remoteDns.summary == "") {
|
if (remoteDns.summary == "") {
|
||||||
remoteDns.summary = AppConfig.DNS_AGENT
|
remoteDns.summary = AppConfig.DNS_AGENT
|
||||||
@@ -227,24 +220,21 @@ class SettingsActivity : BaseActivity() {
|
|||||||
|
|
||||||
// socksPort.summary = defaultSharedPreferences.getString(PREF_SOCKS_PORT, "10808")
|
// socksPort.summary = defaultSharedPreferences.getString(PREF_SOCKS_PORT, "10808")
|
||||||
// lanconnPort.summary = defaultSharedPreferences.getString(PREF_HTTP_PORT, "")
|
// lanconnPort.summary = defaultSharedPreferences.getString(PREF_HTTP_PORT, "")
|
||||||
|
|
||||||
defaultSharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStop() {
|
private fun updatePerAppProxy(mode: String?) {
|
||||||
super.onStop()
|
val preference = activity?.defaultSharedPreferences ?: return
|
||||||
defaultSharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
|
if (mode == "VPN") {
|
||||||
}
|
perAppProxy.isEnabled = true
|
||||||
|
perAppProxy.isChecked = preference.getBoolean(PREF_PER_APP_PROXY, false)
|
||||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
|
} else {
|
||||||
when (key) {
|
perAppProxy.isEnabled = false
|
||||||
// PREF_AUTO_RESTART ->
|
perAppProxy.isChecked = false
|
||||||
// act.defaultDPreference.setPrefBoolean(key, sharedPreferences.getBoolean(key, false))
|
|
||||||
|
|
||||||
PREF_PER_APP_PROXY ->
|
|
||||||
act.defaultDPreference.setPrefBoolean(key, sharedPreferences.getBoolean(key, false))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun onModeHelpClicked(view: View) {
|
||||||
|
Utils.openUri(this, AppConfig.v2rayNGWikiMode)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,7 +111,23 @@
|
|||||||
app:headerLayout="@layout/nav_header"
|
app:headerLayout="@layout/nav_header"
|
||||||
app:itemIconTint="@color/colorPrimary_dark"
|
app:itemIconTint="@color/colorPrimary_dark"
|
||||||
app:itemTextColor="@color/colorPrimary"
|
app:itemTextColor="@color/colorPrimary"
|
||||||
app:menu="@menu/menu_drawer" />
|
app:menu="@menu/menu_drawer" >
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="bottom"
|
||||||
|
android:background="@color/white"
|
||||||
|
android:padding="14dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/version"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:textColor="@color/accent" />
|
||||||
|
</LinearLayout>
|
||||||
|
</android.support.design.widget.NavigationView>
|
||||||
|
|
||||||
</android.support.v4.widget.DrawerLayout>
|
</android.support.v4.widget.DrawerLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Button xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
style="@style/Widget.AppCompat.Button.Borderless"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:onClick="onModeHelpClicked"
|
||||||
|
android:text="@string/title_mode_help"
|
||||||
|
android:textAlignment="textStart"
|
||||||
|
android:textStyle="italic" />
|
||||||
@@ -16,25 +16,27 @@
|
|||||||
|
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
<item android:title="@string/title_about">
|
<group android:id="@+id/group_id2">
|
||||||
<menu>
|
<item
|
||||||
<item
|
|
||||||
android:id="@+id/promotion"
|
android:id="@+id/promotion"
|
||||||
android:icon="@drawable/ic_whatshot_white_24dp"
|
android:icon="@drawable/ic_whatshot_white_24dp"
|
||||||
android:title="@string/title_pref_promotion" />
|
android:title="@string/title_pref_promotion" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/donate"
|
android:id="@+id/donate"
|
||||||
android:icon="@drawable/ic_attach_money_white_24dp"
|
android:icon="@drawable/ic_attach_money_white_24dp"
|
||||||
android:title="@string/title_pref_donate" />
|
android:title="@string/title_pref_donate" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/logcat"
|
android:id="@+id/logcat"
|
||||||
android:icon="@drawable/ic_logcat_white_24dp"
|
android:icon="@drawable/ic_logcat_white_24dp"
|
||||||
android:title="@string/title_logcat" />
|
android:title="@string/title_logcat" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/feedback"
|
android:id="@+id/feedback"
|
||||||
android:icon="@drawable/ic_feedback_white_24dp"
|
android:icon="@drawable/ic_feedback_white_24dp"
|
||||||
android:title="@string/title_pref_feedback" />
|
android:title="@string/title_pref_feedback" />
|
||||||
</menu>
|
<!-- place holder for version text at the bottom -->
|
||||||
</item>
|
<item
|
||||||
|
android:id="@+id/placeholder"
|
||||||
|
android:enabled="false"
|
||||||
|
android:title="" />
|
||||||
|
</group>
|
||||||
</menu>
|
</menu>
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- https://stackoverflow.com/a/52960668/5495739 -->
|
||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<bool name="config_materialPreferenceIconSpaceReserved" tools:ignore="MissingDefaultResource,PrivateResource">false</bool>
|
||||||
|
<dimen name="preference_category_padding_start" tools:ignore="MissingDefaultResource,PrivateResource">0dp</dimen>
|
||||||
|
</resources>
|
||||||
@@ -73,7 +73,6 @@
|
|||||||
|
|
||||||
<!-- Preferences -->
|
<!-- Preferences -->
|
||||||
<string name="title_settings">设置</string>
|
<string name="title_settings">设置</string>
|
||||||
<string name="title_about">关于</string>
|
|
||||||
<string name="title_advanced">进阶设置</string>
|
<string name="title_advanced">进阶设置</string>
|
||||||
|
|
||||||
<string name="title_pref_per_app_proxy">分应用代理</string>
|
<string name="title_pref_per_app_proxy">分应用代理</string>
|
||||||
@@ -124,7 +123,7 @@
|
|||||||
<string name="summary_pref_promotion">一些推广,点击查看详情(捐赠可去除)</string>
|
<string name="summary_pref_promotion">一些推广,点击查看详情(捐赠可去除)</string>
|
||||||
|
|
||||||
<string name="title_mode">模式</string>
|
<string name="title_mode">模式</string>
|
||||||
<string name="title_pref_version">版本</string>
|
<string name="title_mode_help">点此查看更多帮助</string>
|
||||||
|
|
||||||
<string name="donate_error_setup">初始化错误:</string>
|
<string name="donate_error_setup">初始化错误:</string>
|
||||||
<string name="donate_error_inventory">无法查询到项目</string>
|
<string name="donate_error_inventory">无法查询到项目</string>
|
||||||
@@ -188,4 +187,9 @@
|
|||||||
<string name="toast_warning_pref_proxysharing_short">代理共享已启用,请确保处于受信网络</string>
|
<string name="toast_warning_pref_proxysharing_short">代理共享已启用,请确保处于受信网络</string>
|
||||||
<string name="toast_malformed_josn">配置格式错误</string>
|
<string name="toast_malformed_josn">配置格式错误</string>
|
||||||
|
|
||||||
|
<string-array name="mode_entries">
|
||||||
|
<item>VPN</item>
|
||||||
|
<item>仅代理</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -74,7 +74,6 @@
|
|||||||
|
|
||||||
<!-- Preferences -->
|
<!-- Preferences -->
|
||||||
<string name="title_settings">設定</string>
|
<string name="title_settings">設定</string>
|
||||||
<string name="title_about">關於</string>
|
|
||||||
<string name="title_advanced">進階設定</string>
|
<string name="title_advanced">進階設定</string>
|
||||||
|
|
||||||
<string name="title_pref_per_app_proxy">Proxy 個別應用程式</string>
|
<string name="title_pref_per_app_proxy">Proxy 個別應用程式</string>
|
||||||
@@ -126,7 +125,7 @@
|
|||||||
<string name="summary_pref_promotion">一些推廣,點擊查看詳情(捐款可去除)</string>
|
<string name="summary_pref_promotion">一些推廣,點擊查看詳情(捐款可去除)</string>
|
||||||
|
|
||||||
<string name="title_mode">模式</string>
|
<string name="title_mode">模式</string>
|
||||||
<string name="title_pref_version">版本</string>
|
<string name="title_mode_help">點此查看更多幫助</string>
|
||||||
|
|
||||||
<string name="donate_error_setup">錯誤設定:</string>
|
<string name="donate_error_setup">錯誤設定:</string>
|
||||||
<string name="donate_error_inventory">Error querying inventory</string>
|
<string name="donate_error_inventory">Error querying inventory</string>
|
||||||
@@ -189,4 +188,10 @@
|
|||||||
<string name="toast_warning_pref_proxysharing">其他設備可以使用socks/http協定通過您的IP地址連接到代理\nHttp 代理: http://您的ip:10809\nSocks 代理: socks(4/5)://您的ip:10808\n僅在受信任的網路中啟用以避免未經授權的連接</string>
|
<string name="toast_warning_pref_proxysharing">其他設備可以使用socks/http協定通過您的IP地址連接到代理\nHttp 代理: http://您的ip:10809\nSocks 代理: socks(4/5)://您的ip:10808\n僅在受信任的網路中啟用以避免未經授權的連接</string>
|
||||||
<string name="toast_warning_pref_proxysharing_short">代理共享已啟用,請確保處於受信網路</string>
|
<string name="toast_warning_pref_proxysharing_short">代理共享已啟用,請確保處於受信網路</string>
|
||||||
<string name="toast_malformed_josn">配置格式錯誤</string>
|
<string name="toast_malformed_josn">配置格式錯誤</string>
|
||||||
|
|
||||||
|
<string-array name="mode_entries">
|
||||||
|
<item>VPN</item>
|
||||||
|
<item>僅代理</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -74,7 +74,6 @@
|
|||||||
|
|
||||||
<!-- Preferences -->
|
<!-- Preferences -->
|
||||||
<string name="title_settings">Settings</string>
|
<string name="title_settings">Settings</string>
|
||||||
<string name="title_about">About</string>
|
|
||||||
<string name="title_advanced">Advanced Settings</string>
|
<string name="title_advanced">Advanced Settings</string>
|
||||||
|
|
||||||
<string name="title_pref_per_app_proxy">Per-app proxy</string>
|
<string name="title_pref_per_app_proxy">Per-app proxy</string>
|
||||||
@@ -126,7 +125,7 @@
|
|||||||
<string name="summary_pref_promotion">Promotion,click for details(Donation can be removed)</string>
|
<string name="summary_pref_promotion">Promotion,click for details(Donation can be removed)</string>
|
||||||
|
|
||||||
<string name="title_mode">Mode</string>
|
<string name="title_mode">Mode</string>
|
||||||
<string name="title_pref_version">Version</string>
|
<string name="title_mode_help">Click me for more help</string>
|
||||||
|
|
||||||
<string name="donate_error_setup">Error Setup:</string>
|
<string name="donate_error_setup">Error Setup:</string>
|
||||||
<string name="donate_error_inventory">Error querying inventory</string>
|
<string name="donate_error_inventory">Error querying inventory</string>
|
||||||
@@ -190,4 +189,9 @@
|
|||||||
<string name="toast_warning_pref_proxysharing_short">Proxy sharing enabled\nMake sure you are in a trusted network</string>
|
<string name="toast_warning_pref_proxysharing_short">Proxy sharing enabled\nMake sure you are in a trusted network</string>
|
||||||
<string name="toast_malformed_josn">Config malformed</string>
|
<string name="toast_malformed_josn">Config malformed</string>
|
||||||
|
|
||||||
|
<string-array name="mode_entries">
|
||||||
|
<item>VPN</item>
|
||||||
|
<item>Proxy only</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -88,34 +88,10 @@
|
|||||||
|
|
||||||
<ListPreference
|
<ListPreference
|
||||||
android:defaultValue="VPN"
|
android:defaultValue="VPN"
|
||||||
android:entries="@array/mode_value"
|
android:entries="@array/mode_entries"
|
||||||
android:entryValues="@array/mode_value"
|
android:entryValues="@array/mode_value"
|
||||||
android:key="pref_mode"
|
android:key="pref_mode"
|
||||||
android:summary="%s"
|
android:summary="%s"
|
||||||
android:title="@string/title_mode" />
|
android:title="@string/title_mode" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
<PreferenceCategory android:title="@string/title_about">
|
|
||||||
<!--<Preference-->
|
|
||||||
<!--android:key="pref_donate"-->
|
|
||||||
<!--android:summary="@string/summary_pref_donate"-->
|
|
||||||
<!--android:title="@string/title_pref_donate" />-->
|
|
||||||
|
|
||||||
<!--<Preference-->
|
|
||||||
<!--android:key="pref_licenses"-->
|
|
||||||
<!--android:title="@string/notices_title" />-->
|
|
||||||
|
|
||||||
<!--<Preference-->
|
|
||||||
<!--android:key="pref_feedback"-->
|
|
||||||
<!--android:summary="@string/summary_pref_feedback"-->
|
|
||||||
<!--android:title="@string/title_pref_feedback" />-->
|
|
||||||
|
|
||||||
<!--<Preference-->
|
|
||||||
<!--android:key="pref_tg_group"-->
|
|
||||||
<!--android:title="@string/summary_pref_tg_group" />-->
|
|
||||||
|
|
||||||
<Preference
|
|
||||||
android:key="pref_version"
|
|
||||||
android:title="@string/title_pref_version" />
|
|
||||||
</PreferenceCategory>
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ buildscript {
|
|||||||
maven { url 'https://maven.google.com' }
|
maven { url 'https://maven.google.com' }
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.1.3'
|
classpath 'com.android.tools.build:gradle:4.0.1'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.13'
|
||||||
implementation "com.android.support:support-annotations:$supportLibVersion"
|
implementation "com.android.support:support-annotations:$supportLibVersion"
|
||||||
implementation 'com.google.code.gson:gson:2.7'
|
implementation 'com.google.code.gson:gson:2.8.6'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryErro
|
|||||||
# org.gradle.parallel=true
|
# org.gradle.parallel=true
|
||||||
#Fri Jun 02 14:08:42 CST 2017
|
#Fri Jun 02 14:08:42 CST 2017
|
||||||
ankoVersion=0.10.8
|
ankoVersion=0.10.8
|
||||||
kotlinVersion=1.3.40
|
kotlinVersion=1.4.0
|
||||||
supportLibVersion=28.0.0
|
supportLibVersion=28.0.0
|
||||||
buildToolsVer=29.0.3
|
buildToolsVer=29.0.3
|
||||||
compileSdkVer=29
|
compileSdkVer=29
|
||||||
|
|||||||
Reference in New Issue
Block a user