Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
76f52e7aa7 | ||
|
|
caa25ce424 | ||
|
|
e33d7e9bcf | ||
|
|
e120fce0b7 |
@@ -91,6 +91,7 @@ dependencies {
|
|||||||
implementation "com.android.support:cardview-v7:$supportLibVersion"
|
implementation "com.android.support:cardview-v7:$supportLibVersion"
|
||||||
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"
|
||||||
// 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"
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package com.v2ray.ang
|
package com.v2ray.ang
|
||||||
|
|
||||||
import android.app.Application
|
|
||||||
//import com.squareup.leakcanary.LeakCanary
|
//import com.squareup.leakcanary.LeakCanary
|
||||||
|
import android.support.multidex.MultiDexApplication
|
||||||
import com.v2ray.ang.util.AngConfigManager
|
import com.v2ray.ang.util.AngConfigManager
|
||||||
import me.dozen.dpreference.DPreference
|
import me.dozen.dpreference.DPreference
|
||||||
import org.jetbrains.anko.defaultSharedPreferences
|
import org.jetbrains.anko.defaultSharedPreferences
|
||||||
|
|
||||||
class AngApplication : Application() {
|
class AngApplication : MultiDexApplication() {
|
||||||
companion object {
|
companion object {
|
||||||
const val PREF_LAST_VERSION = "pref_last_version"
|
const val PREF_LAST_VERSION = "pref_last_version"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,14 +28,9 @@ import libv2ray.Libv2ray
|
|||||||
import libv2ray.V2RayVPNServiceSupportsSet
|
import libv2ray.V2RayVPNServiceSupportsSet
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import rx.Subscription
|
import rx.Subscription
|
||||||
import java.net.InetAddress
|
|
||||||
import java.io.IOException
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileDescriptor
|
|
||||||
import java.io.FileInputStream
|
|
||||||
import java.lang.ref.SoftReference
|
import java.lang.ref.SoftReference
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.annotation.TargetApi
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import go.Seq
|
import go.Seq
|
||||||
import org.jetbrains.anko.doAsync
|
import org.jetbrains.anko.doAsync
|
||||||
@@ -74,25 +69,36 @@ class V2RayVpnService : VpnService() {
|
|||||||
*
|
*
|
||||||
* 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
|
||||||
*/
|
*/
|
||||||
@TargetApi(28)
|
private val defaultNetworkRequest by lazy {
|
||||||
private val defaultNetworkRequest = NetworkRequest.Builder()
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
NetworkRequest.Builder()
|
||||||
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||||
.build()
|
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
||||||
|
.build()
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private val connectivity by lazy { getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager }
|
private val connectivity by lazy { getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager }
|
||||||
@TargetApi(28)
|
|
||||||
private val defaultNetworkCallback = object : ConnectivityManager.NetworkCallback() {
|
private val defaultNetworkCallback by lazy {
|
||||||
override fun onAvailable(network: Network) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
setUnderlyingNetworks(arrayOf(network))
|
object : ConnectivityManager.NetworkCallback() {
|
||||||
}
|
override fun onAvailable(network: Network) {
|
||||||
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities?) {
|
setUnderlyingNetworks(arrayOf(network))
|
||||||
// it's a good idea to refresh capabilities
|
}
|
||||||
setUnderlyingNetworks(arrayOf(network))
|
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities?) {
|
||||||
}
|
// it's a good idea to refresh capabilities
|
||||||
override fun onLost(network: Network) {
|
setUnderlyingNetworks(arrayOf(network))
|
||||||
setUnderlyingNetworks(null)
|
}
|
||||||
|
override fun onLost(network: Network) {
|
||||||
|
setUnderlyingNetworks(null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private var listeningForDefaultNetwork = false
|
private var listeningForDefaultNetwork = false
|
||||||
@@ -176,7 +182,7 @@ class V2RayVpnService : VpnService() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 28) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
connectivity.requestNetwork(defaultNetworkRequest, defaultNetworkCallback)
|
connectivity.requestNetwork(defaultNetworkRequest, defaultNetworkCallback)
|
||||||
listeningForDefaultNetwork = true
|
listeningForDefaultNetwork = true
|
||||||
}
|
}
|
||||||
@@ -260,7 +266,7 @@ class V2RayVpnService : VpnService() {
|
|||||||
// val emptyInfo = VpnNetworkInfo()
|
// val emptyInfo = VpnNetworkInfo()
|
||||||
// val info = loadVpnNetworkInfo(configName, emptyInfo)!! + (lastNetworkInfo ?: emptyInfo)
|
// val info = loadVpnNetworkInfo(configName, emptyInfo)!! + (lastNetworkInfo ?: emptyInfo)
|
||||||
// saveVpnNetworkInfo(configName, info)
|
// saveVpnNetworkInfo(configName, info)
|
||||||
if (Build.VERSION.SDK_INT >= 28) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
if (listeningForDefaultNetwork) {
|
if (listeningForDefaultNetwork) {
|
||||||
connectivity.unregisterNetworkCallback(defaultNetworkCallback)
|
connectivity.unregisterNetworkCallback(defaultNetworkCallback)
|
||||||
listeningForDefaultNetwork = false
|
listeningForDefaultNetwork = false
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.v2ray.ang.ui
|
package com.v2ray.ang.ui
|
||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
import android.text.method.ScrollingMovementMethod
|
import android.text.method.ScrollingMovementMethod
|
||||||
import android.view.Menu
|
import android.view.Menu
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
@@ -24,15 +26,22 @@ class LogcatActivity : BaseActivity() {
|
|||||||
title = getString(R.string.title_logcat)
|
title = getString(R.string.title_logcat)
|
||||||
|
|
||||||
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
supportActionBar?.setDisplayHomeAsUpEnabled(true)
|
||||||
logcat()
|
logcat(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun logcat() {
|
private fun logcat(shouldFlushLog: Boolean) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
pb_waiting.visibility = View.VISIBLE
|
pb_waiting.visibility = View.VISIBLE
|
||||||
|
|
||||||
doAsync {
|
doAsync {
|
||||||
|
if (shouldFlushLog) {
|
||||||
|
val lst = LinkedHashSet<String>()
|
||||||
|
lst.add("logcat")
|
||||||
|
lst.add("-c")
|
||||||
|
val process = Runtime.getRuntime().exec(lst.toTypedArray())
|
||||||
|
process.waitFor()
|
||||||
|
}
|
||||||
val lst = LinkedHashSet<String>()
|
val lst = LinkedHashSet<String>()
|
||||||
lst.add("logcat")
|
lst.add("logcat")
|
||||||
lst.add("-d")
|
lst.add("-d")
|
||||||
@@ -49,9 +58,11 @@ class LogcatActivity : BaseActivity() {
|
|||||||
tv_logcat.text = allText
|
tv_logcat.text = allText
|
||||||
tv_logcat.movementMethod = ScrollingMovementMethod()
|
tv_logcat.movementMethod = ScrollingMovementMethod()
|
||||||
pb_waiting.visibility = View.GONE
|
pb_waiting.visibility = View.GONE
|
||||||
|
Handler(Looper.getMainLooper()).post { sv_logcat.fullScroll(View.FOCUS_DOWN) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
|
e.printStackTrace()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +77,10 @@ class LogcatActivity : BaseActivity() {
|
|||||||
toast(R.string.toast_success)
|
toast(R.string.toast_success)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
R.id.delete -> {
|
||||||
|
logcat(true)
|
||||||
|
true
|
||||||
|
}
|
||||||
else -> super.onOptionsItemSelected(item)
|
else -> super.onOptionsItemSelected(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,4 +6,9 @@
|
|||||||
android:icon="@drawable/ic_copy_white"
|
android:icon="@drawable/ic_copy_white"
|
||||||
android:title="@string/logcat_copy"
|
android:title="@string/logcat_copy"
|
||||||
app:showAsAction="always" />
|
app:showAsAction="always" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/delete"
|
||||||
|
android:icon="@drawable/ic_delete_white_24dp"
|
||||||
|
android:title="@string/logcat_delete"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
</menu>
|
</menu>
|
||||||
@@ -135,6 +135,7 @@
|
|||||||
|
|
||||||
<string name="title_logcat">Logcat</string>
|
<string name="title_logcat">Logcat</string>
|
||||||
<string name="logcat_copy">复制</string>
|
<string name="logcat_copy">复制</string>
|
||||||
|
<string name="logcat_delete">删除</string>
|
||||||
<string name="title_export_all">导出全部配置至剪贴板</string>
|
<string name="title_export_all">导出全部配置至剪贴板</string>
|
||||||
<string name="title_sub_setting">订阅设置</string>
|
<string name="title_sub_setting">订阅设置</string>
|
||||||
<string name="sub_setting_remarks">备注</string>
|
<string name="sub_setting_remarks">备注</string>
|
||||||
|
|||||||
@@ -137,6 +137,7 @@
|
|||||||
|
|
||||||
<string name="title_logcat">Logcat</string>
|
<string name="title_logcat">Logcat</string>
|
||||||
<string name="logcat_copy">複製</string>
|
<string name="logcat_copy">複製</string>
|
||||||
|
<string name="logcat_delete">刪除</string>
|
||||||
<string name="title_export_all">匯出全部配置至剪貼簿</string>
|
<string name="title_export_all">匯出全部配置至剪貼簿</string>
|
||||||
<string name="title_sub_setting">訂閱設定</string>
|
<string name="title_sub_setting">訂閱設定</string>
|
||||||
<string name="sub_setting_remarks">備註</string>
|
<string name="sub_setting_remarks">備註</string>
|
||||||
|
|||||||
@@ -136,6 +136,7 @@
|
|||||||
|
|
||||||
<string name="title_logcat">Logcat</string>
|
<string name="title_logcat">Logcat</string>
|
||||||
<string name="logcat_copy">Copy</string>
|
<string name="logcat_copy">Copy</string>
|
||||||
|
<string name="logcat_delete">Delete</string>
|
||||||
<string name="title_export_all">Export all config to clipboard</string>
|
<string name="title_export_all">Export all config to clipboard</string>
|
||||||
<string name="title_sub_setting">Subscription setting</string>
|
<string name="title_sub_setting">Subscription setting</string>
|
||||||
<string name="sub_setting_remarks">remarks</string>
|
<string name="sub_setting_remarks">remarks</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user