Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df3f1ca3ef | ||
|
|
c54d8fa43a | ||
|
|
5bbbdcf6f2 | ||
|
|
4abf20fa32 | ||
|
|
723727feb9 | ||
|
|
2efd4b741c | ||
|
|
83aab0f880 | ||
|
|
66ea17877e | ||
|
|
26bc985368 | ||
|
|
5bbf40c784 | ||
|
|
6d5c23245c | ||
|
|
b148290211 |
20
README.md
20
README.md
@@ -1,5 +1,25 @@
|
||||
# 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">
|
||||
<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>
|
||||
|
||||
### 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 {
|
||||
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
||||
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
testImplementation 'junit:junit:4.13'
|
||||
implementation project(':dpreference')
|
||||
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
|
||||
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.2"
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.2" // 1.3.x has compile error:
|
||||
// More than one file was found with OS independent path 'META-INF/proguard/coroutines.pro'
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9"
|
||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9"
|
||||
|
||||
// Android support library
|
||||
implementation "com.android.support:support-v4:$supportLibVersion"
|
||||
@@ -79,12 +78,14 @@ dependencies {
|
||||
implementation "com.android.support:preference-v7:$supportLibVersion"
|
||||
implementation "com.android.support:recyclerview-v7:$supportLibVersion"
|
||||
implementation "com.android.support:multidex:1.0.3"
|
||||
implementation 'com.android.support.constraint:constraint-layout:2.0.1'
|
||||
|
||||
// DSL
|
||||
implementation "org.jetbrains.anko:anko-sdk15:$ankoVersion"
|
||||
implementation "org.jetbrains.anko:anko-support-v4:$ankoVersion"
|
||||
implementation "org.jetbrains.anko:anko-appcompat-v7:$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:rxandroid:1.2.1'
|
||||
implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar'
|
||||
@@ -94,7 +95,6 @@ dependencies {
|
||||
implementation 'me.dm7.barcodescanner:zxing:1.9.8'
|
||||
implementation 'com.github.jorgecastilloprz:fabprogresscircle:1.01@aar'
|
||||
implementation 'com.beust:klaxon:3.0.1'
|
||||
implementation 'com.android.support:multidex:1.0.3'
|
||||
|
||||
implementation(name: 'libv2ray', ext: 'aar')
|
||||
//implementation(name: 'tun2socks', ext: 'aar')
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
<activity
|
||||
android:name=".ui.ScSwitchActivity"
|
||||
android:excludeFromRecents="true"
|
||||
android:process=":RunSoLibV2RayDaemon"
|
||||
android:theme="@style/AppTheme.NoActionBar.Translucent" />
|
||||
|
||||
<service
|
||||
|
||||
@@ -38,6 +38,7 @@ object AppConfig {
|
||||
const val androidpackagenamelistUrl = "https://raw.githubusercontent.com/2dust/androidpackagenamelist/master/proxy.txt"
|
||||
const val v2rayCustomRoutingListUrl = "https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/"
|
||||
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 DNS_AGENT = "1.1.1.1"
|
||||
|
||||
@@ -88,7 +88,7 @@ object V2RayServiceManager {
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
private val defaultNetworkRequest by lazy @RequiresApi(Build.VERSION_CODES.P) {
|
||||
@delegate:RequiresApi(Build.VERSION_CODES.P)
|
||||
private val defaultNetworkRequest by lazy {
|
||||
NetworkRequest.Builder()
|
||||
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||
.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 defaultNetworkCallback by lazy @RequiresApi(Build.VERSION_CODES.P) {
|
||||
@delegate:RequiresApi(Build.VERSION_CODES.P)
|
||||
private val defaultNetworkCallback by lazy {
|
||||
object : ConnectivityManager.NetworkCallback() {
|
||||
override fun onAvailable(network: Network) {
|
||||
setUnderlyingNetworks(arrayOf(network))
|
||||
|
||||
@@ -27,6 +27,7 @@ import android.support.v4.view.GravityCompat
|
||||
import android.support.v7.app.ActionBarDrawerToggle
|
||||
import android.support.v7.widget.helper.ItemTouchHelper
|
||||
import android.util.Log
|
||||
import com.v2ray.ang.BuildConfig
|
||||
import com.v2ray.ang.dto.EConfigType
|
||||
import com.v2ray.ang.extension.defaultDPreference
|
||||
//import com.v2ray.ang.InappBuyActivity
|
||||
@@ -36,6 +37,7 @@ import java.util.concurrent.TimeUnit
|
||||
import com.v2ray.ang.helper.SimpleItemTouchHelperCallback
|
||||
import com.v2ray.ang.util.AngConfigManager.configs
|
||||
import kotlinx.coroutines.*
|
||||
import libv2ray.Libv2ray
|
||||
|
||||
class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener {
|
||||
companion object {
|
||||
@@ -113,6 +115,7 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList
|
||||
drawer_layout.addDrawerListener(toggle)
|
||||
toggle.syncState()
|
||||
nav_view.setNavigationItemSelectedListener(this)
|
||||
version.text = "v${BuildConfig.VERSION_NAME} (${Libv2ray.checkVersionX()})"
|
||||
}
|
||||
|
||||
fun startV2Ray() {
|
||||
|
||||
@@ -1,23 +1,14 @@
|
||||
package com.v2ray.ang.ui
|
||||
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.preference.*
|
||||
import com.v2ray.ang.AngApplication
|
||||
import com.v2ray.ang.BuildConfig
|
||||
//import com.v2ray.ang.InappBuyActivity
|
||||
import android.support.v7.preference.*
|
||||
import android.view.View
|
||||
import com.v2ray.ang.R
|
||||
import com.v2ray.ang.AppConfig
|
||||
import com.v2ray.ang.extension.defaultDPreference
|
||||
import com.v2ray.ang.extension.onClick
|
||||
import com.v2ray.ang.util.Utils
|
||||
import org.jetbrains.anko.act
|
||||
import org.jetbrains.anko.defaultSharedPreferences
|
||||
import org.jetbrains.anko.startActivity
|
||||
import org.jetbrains.anko.toast
|
||||
import libv2ray.Libv2ray
|
||||
|
||||
class SettingsActivity : BaseActivity() {
|
||||
companion object {
|
||||
@@ -42,7 +33,6 @@ class SettingsActivity : BaseActivity() {
|
||||
// const val PREF_LICENSES = "pref_licenses"
|
||||
// const val PREF_FEEDBACK = "pref_feedback"
|
||||
// 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_FORWARD_IPV6 = "pref_forward_ipv6"
|
||||
}
|
||||
@@ -56,18 +46,18 @@ class SettingsActivity : BaseActivity() {
|
||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||
}
|
||||
|
||||
class SettingsFragment : PreferenceFragment(), SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
val perAppProxy by lazy { findPreference(PREF_PER_APP_PROXY) as CheckBoxPreference }
|
||||
val sppedEnabled by lazy { findPreference(PREF_SPEED_ENABLED) as CheckBoxPreference }
|
||||
val sniffingEnabled by lazy { findPreference(PREF_SNIFFING_ENABLED) as CheckBoxPreference }
|
||||
val proxySharing by lazy { findPreference(PREF_PROXY_SHARING) as CheckBoxPreference }
|
||||
val domainStrategy by lazy { findPreference(PREF_ROUTING_DOMAIN_STRATEGY) as ListPreference }
|
||||
val routingMode by lazy { findPreference(PREF_ROUTING_MODE) as ListPreference }
|
||||
class SettingsFragment : PreferenceFragmentCompat() {
|
||||
private val perAppProxy by lazy { findPreference(PREF_PER_APP_PROXY) as CheckBoxPreference }
|
||||
private val sppedEnabled by lazy { findPreference(PREF_SPEED_ENABLED) as CheckBoxPreference }
|
||||
private val sniffingEnabled by lazy { findPreference(PREF_SNIFFING_ENABLED) as CheckBoxPreference }
|
||||
private val proxySharing by lazy { findPreference(PREF_PROXY_SHARING) as CheckBoxPreference }
|
||||
private val domainStrategy by lazy { findPreference(PREF_ROUTING_DOMAIN_STRATEGY) as ListPreference }
|
||||
private val routingMode by lazy { findPreference(PREF_ROUTING_MODE) as ListPreference }
|
||||
|
||||
val forwardIpv6 by lazy { findPreference(PREF_FORWARD_IPV6) as CheckBoxPreference }
|
||||
val enableLocalDns by lazy { findPreference(PREF_LOCAL_DNS_ENABLED) as CheckBoxPreference }
|
||||
val domesticDns by lazy { findPreference(PREF_DOMESTIC_DNS) as EditTextPreference }
|
||||
val remoteDns by lazy { findPreference(PREF_REMOTE_DNS) as EditTextPreference }
|
||||
private val forwardIpv6 by lazy { findPreference(PREF_FORWARD_IPV6) as CheckBoxPreference }
|
||||
private val enableLocalDns by lazy { findPreference(PREF_LOCAL_DNS_ENABLED) as CheckBoxPreference }
|
||||
private val domesticDns by lazy { findPreference(PREF_DOMESTIC_DNS) as EditTextPreference }
|
||||
private val remoteDns by lazy { findPreference(PREF_REMOTE_DNS) as EditTextPreference }
|
||||
|
||||
// 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 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 licenses: Preference by lazy { findPreference(PREF_LICENSES) }
|
||||
// val feedback: Preference by lazy { findPreference(PREF_FEEDBACK) }
|
||||
// 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() {
|
||||
Utils.stopVService(activity)
|
||||
Utils.startVService(activity)
|
||||
Utils.stopVService(requireContext())
|
||||
Utils.startVService(requireContext())
|
||||
}
|
||||
|
||||
private fun isRunning(): Boolean {
|
||||
return false //TODO no point of adding logic now since Settings will be changed soon
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
override fun onCreatePreferences(bundle: Bundle?, s: String?) {
|
||||
addPreferencesFromResource(R.xml.pref_settings)
|
||||
var app = activity.application as AngApplication
|
||||
|
||||
perAppProxy.setOnPreferenceClickListener {
|
||||
if (isRunning()) {
|
||||
Utils.stopVService(activity)
|
||||
Utils.stopVService(requireContext())
|
||||
}
|
||||
startActivity<PerAppProxyActivity>()
|
||||
activity?.startActivity<PerAppProxyActivity>()
|
||||
perAppProxy.isChecked = true
|
||||
true
|
||||
}
|
||||
@@ -117,7 +106,7 @@ class SettingsActivity : BaseActivity() {
|
||||
|
||||
proxySharing.setOnPreferenceClickListener {
|
||||
if (proxySharing.isChecked)
|
||||
toast(R.string.toast_warning_pref_proxysharing)
|
||||
activity?.toast(R.string.toast_warning_pref_proxysharing)
|
||||
if (isRunning())
|
||||
restartProxy()
|
||||
true
|
||||
@@ -134,10 +123,11 @@ class SettingsActivity : BaseActivity() {
|
||||
true
|
||||
}
|
||||
|
||||
routingCustom.onClick {
|
||||
routingCustom.setOnPreferenceClickListener {
|
||||
if (isRunning())
|
||||
Utils.stopVService(activity)
|
||||
startActivity<RoutingSettingsActivity>()
|
||||
Utils.stopVService(requireContext())
|
||||
activity?.startActivity<RoutingSettingsActivity>()
|
||||
false
|
||||
}
|
||||
|
||||
forwardIpv6.setOnPreferenceClickListener {
|
||||
@@ -153,7 +143,7 @@ class SettingsActivity : BaseActivity() {
|
||||
}
|
||||
|
||||
|
||||
domesticDns.setOnPreferenceChangeListener { preference, any ->
|
||||
domesticDns.setOnPreferenceChangeListener { _, any ->
|
||||
// domesticDns.summary = any as String
|
||||
val nval = any as String
|
||||
domesticDns.summary = if (nval == "") AppConfig.DNS_DIRECT else nval
|
||||
@@ -162,7 +152,7 @@ class SettingsActivity : BaseActivity() {
|
||||
true
|
||||
}
|
||||
|
||||
remoteDns.setOnPreferenceChangeListener { preference, any ->
|
||||
remoteDns.setOnPreferenceChangeListener { _, any ->
|
||||
// remoteDns.summary = any as String
|
||||
val nval = any as String
|
||||
remoteDns.summary = if (nval == "") AppConfig.DNS_AGENT else nval
|
||||
@@ -171,6 +161,12 @@ class SettingsActivity : BaseActivity() {
|
||||
true
|
||||
}
|
||||
|
||||
mode.setOnPreferenceChangeListener { _, newValue ->
|
||||
updatePerAppProxy(newValue.toString())
|
||||
true
|
||||
}
|
||||
mode.dialogLayoutResource = R.layout.preference_with_help_link
|
||||
|
||||
// donate.onClick {
|
||||
// startActivity<InappBuyActivity>()
|
||||
// }
|
||||
@@ -206,16 +202,13 @@ class SettingsActivity : BaseActivity() {
|
||||
// httpPort.summary = any as String
|
||||
// true
|
||||
// }
|
||||
|
||||
version.summary = "${BuildConfig.VERSION_NAME} (${Libv2ray.checkVersionX()})"
|
||||
}
|
||||
|
||||
override fun onStart() {
|
||||
super.onStart()
|
||||
|
||||
perAppProxy.isChecked = defaultSharedPreferences.getBoolean(PREF_PER_APP_PROXY, false)
|
||||
remoteDns.summary = defaultSharedPreferences.getString(PREF_REMOTE_DNS, "")
|
||||
domesticDns.summary = defaultSharedPreferences.getString(PREF_DOMESTIC_DNS, "")
|
||||
updatePerAppProxy(activity?.defaultSharedPreferences?.getString(AppConfig.PREF_MODE, "VPN"))
|
||||
remoteDns.summary = activity?.defaultSharedPreferences?.getString(PREF_REMOTE_DNS, "")
|
||||
domesticDns.summary = activity?.defaultSharedPreferences?.getString(PREF_DOMESTIC_DNS, "")
|
||||
|
||||
if (remoteDns.summary == "") {
|
||||
remoteDns.summary = AppConfig.DNS_AGENT
|
||||
@@ -227,24 +220,21 @@ class SettingsActivity : BaseActivity() {
|
||||
|
||||
// socksPort.summary = defaultSharedPreferences.getString(PREF_SOCKS_PORT, "10808")
|
||||
// lanconnPort.summary = defaultSharedPreferences.getString(PREF_HTTP_PORT, "")
|
||||
|
||||
defaultSharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
||||
}
|
||||
|
||||
override fun onStop() {
|
||||
super.onStop()
|
||||
defaultSharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
|
||||
}
|
||||
|
||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) {
|
||||
when (key) {
|
||||
// PREF_AUTO_RESTART ->
|
||||
// act.defaultDPreference.setPrefBoolean(key, sharedPreferences.getBoolean(key, false))
|
||||
|
||||
PREF_PER_APP_PROXY ->
|
||||
act.defaultDPreference.setPrefBoolean(key, sharedPreferences.getBoolean(key, false))
|
||||
private fun updatePerAppProxy(mode: String?) {
|
||||
val preference = activity?.defaultSharedPreferences ?: return
|
||||
if (mode == "VPN") {
|
||||
perAppProxy.isEnabled = true
|
||||
perAppProxy.isChecked = preference.getBoolean(PREF_PER_APP_PROXY, false)
|
||||
} else {
|
||||
perAppProxy.isEnabled = false
|
||||
perAppProxy.isChecked = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun onModeHelpClicked(view: View) {
|
||||
Utils.openUri(this, AppConfig.v2rayNGWikiMode)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,7 +111,23 @@
|
||||
app:headerLayout="@layout/nav_header"
|
||||
app:itemIconTint="@color/colorPrimary_dark"
|
||||
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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
<item android:title="@string/title_about">
|
||||
<menu>
|
||||
<item
|
||||
<group android:id="@+id/group_id2">
|
||||
<item
|
||||
android:id="@+id/promotion"
|
||||
android:icon="@drawable/ic_whatshot_white_24dp"
|
||||
android:title="@string/title_pref_promotion" />
|
||||
<item
|
||||
<item
|
||||
android:id="@+id/donate"
|
||||
android:icon="@drawable/ic_attach_money_white_24dp"
|
||||
android:title="@string/title_pref_donate" />
|
||||
<item
|
||||
<item
|
||||
android:id="@+id/logcat"
|
||||
android:icon="@drawable/ic_logcat_white_24dp"
|
||||
android:title="@string/title_logcat" />
|
||||
<item
|
||||
<item
|
||||
android:id="@+id/feedback"
|
||||
android:icon="@drawable/ic_feedback_white_24dp"
|
||||
android:title="@string/title_pref_feedback" />
|
||||
</menu>
|
||||
</item>
|
||||
|
||||
<!-- place holder for version text at the bottom -->
|
||||
<item
|
||||
android:id="@+id/placeholder"
|
||||
android:enabled="false"
|
||||
android:title="" />
|
||||
</group>
|
||||
</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 -->
|
||||
<string name="title_settings">设置</string>
|
||||
<string name="title_about">关于</string>
|
||||
<string name="title_advanced">进阶设置</string>
|
||||
|
||||
<string name="title_pref_per_app_proxy">分应用代理</string>
|
||||
@@ -124,7 +123,7 @@
|
||||
<string name="summary_pref_promotion">一些推广,点击查看详情(捐赠可去除)</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_inventory">无法查询到项目</string>
|
||||
@@ -188,4 +187,9 @@
|
||||
<string name="toast_warning_pref_proxysharing_short">代理共享已启用,请确保处于受信网络</string>
|
||||
<string name="toast_malformed_josn">配置格式错误</string>
|
||||
|
||||
<string-array name="mode_entries">
|
||||
<item>VPN</item>
|
||||
<item>仅代理</item>
|
||||
</string-array>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -74,7 +74,6 @@
|
||||
|
||||
<!-- Preferences -->
|
||||
<string name="title_settings">設定</string>
|
||||
<string name="title_about">關於</string>
|
||||
<string name="title_advanced">進階設定</string>
|
||||
|
||||
<string name="title_pref_per_app_proxy">Proxy 個別應用程式</string>
|
||||
@@ -126,7 +125,7 @@
|
||||
<string name="summary_pref_promotion">一些推廣,點擊查看詳情(捐款可去除)</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_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_short">代理共享已啟用,請確保處於受信網路</string>
|
||||
<string name="toast_malformed_josn">配置格式錯誤</string>
|
||||
|
||||
<string-array name="mode_entries">
|
||||
<item>VPN</item>
|
||||
<item>僅代理</item>
|
||||
</string-array>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -74,7 +74,6 @@
|
||||
|
||||
<!-- Preferences -->
|
||||
<string name="title_settings">Settings</string>
|
||||
<string name="title_about">About</string>
|
||||
<string name="title_advanced">Advanced Settings</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="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_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_malformed_josn">Config malformed</string>
|
||||
|
||||
<string-array name="mode_entries">
|
||||
<item>VPN</item>
|
||||
<item>Proxy only</item>
|
||||
</string-array>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -88,34 +88,10 @@
|
||||
|
||||
<ListPreference
|
||||
android:defaultValue="VPN"
|
||||
android:entries="@array/mode_value"
|
||||
android:entries="@array/mode_entries"
|
||||
android:entryValues="@array/mode_value"
|
||||
android:key="pref_mode"
|
||||
android:summary="%s"
|
||||
android:title="@string/title_mode" />
|
||||
</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>
|
||||
|
||||
@@ -7,7 +7,7 @@ buildscript {
|
||||
maven { url 'https://maven.google.com' }
|
||||
}
|
||||
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"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
|
||||
@@ -19,7 +19,7 @@ android {
|
||||
|
||||
dependencies {
|
||||
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.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
|
||||
#Fri Jun 02 14:08:42 CST 2017
|
||||
ankoVersion=0.10.8
|
||||
kotlinVersion=1.3.40
|
||||
kotlinVersion=1.4.0
|
||||
supportLibVersion=28.0.0
|
||||
buildToolsVer=29.0.3
|
||||
compileSdkVer=29
|
||||
|
||||
Reference in New Issue
Block a user