Compare commits

...

10 Commits

Author SHA1 Message Date
2dust c105d84b35 Merge pull request #300 from yuhan6665/master
Fix UI touch issues for Android TV
2020-04-12 10:04:52 +08:00
2dust 3ea04c076c Merge pull request #314 from yuhan6665/chrome-os
Add tags in AndroidManifest to support PlayStore filtering
2020-03-16 16:24:58 +08:00
2dust 98475460bf Merge pull request #313 from yuhan6665/lint-fix
Use annotation to fix lint error
2020-03-16 16:24:08 +08:00
yuhan6665 68ee61a753 Add tags in AndroidManifest to support PlayStore filtering
Google Playstore is using uses-feature and supports-screens
to filter devices.
By setting all screens to true and specifing features as
"not required" should make app compatible with more devices
Particularly it includes Chrome OS devices.
2020-03-14 14:07:31 -04:00
yuhan6665 90ba9ef2b7 Use annotation to fix lint error 2020-03-14 13:03:51 -04:00
yuhan6665 0ec114322e Fix UI touch issues for Android TV 2020-03-08 12:06:44 -04:00
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
15 changed files with 117 additions and 48 deletions
+1
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"
+10
View File
@@ -2,6 +2,16 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.v2ray.ang"> package="com.v2ray.ang">
<supports-screens
android:anyDensity="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"/>
<uses-feature android:name="android.hardware.camera" android:required="false"/>
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
@@ -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,28 @@ 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 @RequiresApi(Build.VERSION_CODES.P) {
private val defaultNetworkRequest = 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)
.build() .build()
}
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 @RequiresApi(Build.VERSION_CODES.P) {
override fun onAvailable(network: Network) { object : ConnectivityManager.NetworkCallback() {
setUnderlyingNetworks(arrayOf(network)) override fun onAvailable(network: Network) {
} setUnderlyingNetworks(arrayOf(network))
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities?) { }
// it's a good idea to refresh capabilities override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities?) {
setUnderlyingNetworks(arrayOf(network)) // it's a good idea to refresh capabilities
} setUnderlyingNetworks(arrayOf(network))
override fun onLost(network: Network) { }
setUnderlyingNetworks(null) override fun onLost(network: Network) {
setUnderlyingNetworks(null)
}
} }
} }
private var listeningForDefaultNetwork = false private var listeningForDefaultNetwork = false
@@ -176,7 +174,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 +258,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)
} }
} }
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@color/secondary_text" />
<item android:state_focused="true"
android:drawable="@color/secondary_text" />
<item android:state_hovered="true"
android:drawable="@color/secondary_text" />
<item android:drawable="@color/colorPrimary_text" />
</selector>
@@ -54,8 +54,10 @@
android:id="@+id/layout_test" android:id="@+id/layout_test"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/connection_test_height" android:layout_height="@dimen/connection_test_height"
android:background="@color/colorPrimary_text" android:background="@drawable/background_test_button"
android:gravity="center|left"> android:gravity="center|left"
android:clickable="true"
android:focusable="true">
<TextView <TextView
android:id="@+id/tv_test_state" android:id="@+id/tv_test_state"
@@ -92,6 +94,8 @@
android:layout_marginLeft="16dp" android:layout_marginLeft="16dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:src="@drawable/ic_v_idle" android:src="@drawable/ic_v_idle"
android:clickable="true"
android:focusable="true"
app:layout_anchorGravity="bottom|right|end" /> app:layout_anchorGravity="bottom|right|end" />
</com.github.jorgecastilloprz.FABProgressCircle> </com.github.jorgecastilloprz.FABProgressCircle>
@@ -2,7 +2,10 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center_vertical"> android:gravity="center_vertical"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">
<android.support.v7.widget.AppCompatImageView <android.support.v7.widget.AppCompatImageView
android:id="@+id/icon" android:id="@+id/icon"
@@ -40,6 +43,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clickable="false" android:clickable="false"
android:focusable="false"
android:paddingStart="2dp" android:paddingStart="2dp"
android:paddingLeft="2dp" android:paddingLeft="2dp"
android:paddingEnd="6dp" android:paddingEnd="6dp"
@@ -9,10 +9,6 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="3dp" android:layout_margin="3dp"
android:clickable="true"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"
android:orientation="horizontal"
card_view:cardCornerRadius="5dp"> card_view:cardCornerRadius="5dp">
<LinearLayout <LinearLayout
@@ -21,7 +17,11 @@
android:layout_height="@dimen/server_height" android:layout_height="@dimen/server_height"
android:layout_gravity="center" android:layout_gravity="center"
android:gravity="center" android:gravity="center"
android:orientation="horizontal"> android:orientation="horizontal"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:nextFocusRight="@+id/layout_share">
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -111,10 +111,14 @@
<LinearLayout <LinearLayout
android:id="@+id/layout_share" android:id="@+id/layout_share"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/server_height" android:layout_height="match_parent"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:paddingEnd="@dimen/layout_margin_right_height"> android:padding="@dimen/layout_margin_spacing"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:nextFocusLeft="@+id/info_container">
<ImageView <ImageView
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -126,10 +130,13 @@
<LinearLayout <LinearLayout
android:id="@+id/layout_edit" android:id="@+id/layout_edit"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/server_height" android:layout_height="match_parent"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:paddingEnd="@dimen/layout_margin_right_height"> android:padding="@dimen/layout_margin_spacing"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">
<ImageView <ImageView
android:layout_width="@dimen/png_height" android:layout_width="@dimen/png_height"
@@ -141,10 +148,13 @@
<LinearLayout <LinearLayout
android:id="@+id/layout_remove" android:id="@+id/layout_remove"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/server_height" android:layout_height="match_parent"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:paddingEnd="@dimen/layout_margin_right_height"> android:padding="@dimen/layout_margin_spacing"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">
<ImageView <ImageView
android:layout_width="@dimen/png_height" android:layout_width="@dimen/png_height"
@@ -6,6 +6,7 @@
android:gravity="center_vertical"> android:gravity="center_vertical">
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" <android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/item_cardview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="3dp" android:layout_margin="3dp"
@@ -13,7 +14,8 @@
android:focusable="true" android:focusable="true"
android:foreground="?android:attr/selectableItemBackground" android:foreground="?android:attr/selectableItemBackground"
android:orientation="horizontal" android:orientation="horizontal"
card_view:cardCornerRadius="5dp"> card_view:cardCornerRadius="5dp"
android:nextFocusRight="@+id/layout_edit">
<LinearLayout <LinearLayout
android:id="@+id/info_container" android:id="@+id/info_container"
@@ -62,11 +64,14 @@
<LinearLayout <LinearLayout
android:id="@+id/layout_share" android:id="@+id/layout_share"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/server_height" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:paddingEnd="@dimen/layout_margin_right_height" android:padding="@dimen/layout_margin_spacing"
android:visibility="invisible"> android:visibility="invisible"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">
<ImageView <ImageView
android:layout_width="@dimen/png_height" android:layout_width="@dimen/png_height"
@@ -78,10 +83,14 @@
<LinearLayout <LinearLayout
android:id="@+id/layout_edit" android:id="@+id/layout_edit"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/server_height" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:paddingEnd="@dimen/layout_margin_right_height"> android:padding="@dimen/layout_margin_spacing"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:nextFocusLeft="@+id/item_cardview">
<ImageView <ImageView
android:layout_width="@dimen/png_height" android:layout_width="@dimen/png_height"
@@ -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>
@@ -3,6 +3,7 @@
<dimen name="bypass_list_header_height">50dp</dimen> <dimen name="bypass_list_header_height">50dp</dimen>
<dimen name="layout_margin_top_height">16dp</dimen> <dimen name="layout_margin_top_height">16dp</dimen>
<dimen name="layout_margin_right_height">16dp</dimen> <dimen name="layout_margin_right_height">16dp</dimen>
<dimen name="layout_margin_spacing">8dp</dimen>
<dimen name="edit_height">50dp</dimen> <dimen name="edit_height">50dp</dimen>
<dimen name="png_height">24dp</dimen> <dimen name="png_height">24dp</dimen>
<dimen name="server_height">72dp</dimen> <dimen name="server_height">72dp</dimen>
@@ -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>