Compare commits

..

4 Commits

Author SHA1 Message Date
2dust
76f52e7aa7 Merge pull request #287 from yuhan6665/multidex
Fix multidex for Android devices below L
2020-03-03 14:52:19 +08:00
2dust
caa25ce424 Merge pull request #278 from yuhan6665/master
Add delete log button in logcat
2020-03-03 14:52:08 +08:00
yuhan6665
e33d7e9bcf Fix multidex for Android devices below L 2020-02-29 10:51:58 -05:00
yuhan6665
e120fce0b7 Add delete log button in logcat
Also, automatically scroll to bottom of the log if it is too long
2020-02-22 12:01:16 -05:00
8 changed files with 57 additions and 28 deletions

View File

@@ -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"

View File

@@ -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"
} }

View File

@@ -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

View File

@@ -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)
} }
} }

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>