set url test concurrency

This commit is contained in:
arm64v8a 2023-04-12 17:35:15 +09:00
parent 01a5e45237
commit 82557554b3
10 changed files with 85 additions and 95 deletions

View File

@ -155,6 +155,7 @@ object DataStore : OnPreferenceDataStoreChangeListener {
var requireTransproxy by configurationStore.boolean(Key.REQUIRE_TRANSPROXY)
var transproxyMode by configurationStore.stringToInt(Key.TRANSPROXY_MODE)
var connectionTestURL by configurationStore.string(Key.CONNECTION_TEST_URL) { CONNECTION_TEST_URL }
var connectionTestConcurrent by configurationStore.int("connectionTestConcurrent") { 5 }
var alwaysShowAddress by configurationStore.boolean(Key.ALWAYS_SHOW_ADDRESS)
var tunImplementation by configurationStore.stringToInt(Key.TUN_IMPLEMENTATION) { TunImplementation.SYSTEM }

View File

@ -517,9 +517,6 @@ class ConfigurationFragment @JvmOverloads constructor(
}
}
}
R.id.action_connection_icmp_ping -> {
pingTest(true)
}
R.id.action_connection_tcp_ping -> {
pingTest(false)
}
@ -611,6 +608,7 @@ class ConfigurationFragment @JvmOverloads constructor(
if (DataStore.serviceState.started) SagerNet.stopService()
}
@OptIn(DelicateCoroutinesApi::class)
@Suppress("EXPERIMENTAL_API_USAGE")
fun pingTest(icmpPing: Boolean) {
val test = TestDialog()
@ -625,8 +623,11 @@ class ConfigurationFragment @JvmOverloads constructor(
val profilesUnfiltered = SagerDatabase.proxyDao.getByGroup(group.id)
test.proxyN = profilesUnfiltered.size
val profiles = ConcurrentLinkedQueue(profilesUnfiltered)
val testPool = newFixedThreadPoolContext(5, "Connection test pool")
repeat(5) {
val testPool = newFixedThreadPoolContext(
DataStore.connectionTestConcurrent,
"Connection test pool"
)
repeat(DataStore.connectionTestConcurrent) {
testJobs.add(launch(testPool) {
while (isActive) {
val profile = profiles.poll() ?: break
@ -764,7 +765,7 @@ class ConfigurationFragment @JvmOverloads constructor(
val profiles = ConcurrentLinkedQueue(profilesUnfiltered)
val urlTest = UrlTest() // note: this is NOT in bg process
repeat(5) {
repeat(DataStore.connectionTestConcurrent) {
testJobs.add(launch {
while (isActive) {
val profile = profiles.poll() ?: break

View File

@ -25,7 +25,7 @@ constructor(
) : EditTextPreference(context, attrs, defStyleAttr, defStyleRes) {
init {
dialogLayoutResource = R.layout.layout_link_dialog
dialogLayoutResource = R.layout.layout_urltest_preference_dialog
setOnBindEditTextListener {
val linkLayout = it.rootView.findViewById<TextInputLayout>(R.id.input_layout)

View File

@ -1,71 +0,0 @@
package io.nekohasekai.sagernet.widget
import android.content.Context
import android.util.AttributeSet
import androidx.core.content.res.TypedArrayUtils
import androidx.core.widget.addTextChangedListener
import androidx.preference.EditTextPreference
import com.google.android.material.textfield.TextInputLayout
import io.nekohasekai.sagernet.R
import io.nekohasekai.sagernet.ktx.app
import io.nekohasekai.sagernet.ktx.readableMessage
import okhttp3.HttpUrl.Companion.toHttpUrl
class LinkPreference
@JvmOverloads
constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = TypedArrayUtils.getAttr(
context, R.attr.editTextPreferenceStyle,
android.R.attr.editTextPreferenceStyle
),
defStyleRes: Int = 0
) : EditTextPreference(context, attrs, defStyleAttr, defStyleRes) {
// var defaultValue: String? = null
init {
dialogLayoutResource = R.layout.layout_link_dialog
setOnBindEditTextListener {
val linkLayout = it.rootView.findViewById<TextInputLayout>(R.id.input_layout)
fun validate() {
val link = it.text
if (link.isBlank()) {
linkLayout.isErrorEnabled = false
return
}
try {
val url = link.toString().toHttpUrl()
if ("http".equals(url.scheme, true)) {
linkLayout.error = app.getString(R.string.cleartext_http_warning)
linkLayout.isErrorEnabled = true
} else {
linkLayout.isErrorEnabled = false
}
} catch (e: Exception) {
linkLayout.error = e.readableMessage
linkLayout.isErrorEnabled = true
}
}
validate()
it.addTextChangedListener {
validate()
}
}
setOnPreferenceChangeListener { _, newValue ->
if ((newValue as String).isBlank()) {
// text = defaultValue
false
} else try {
newValue.toHttpUrl()
true
} catch (ignored: Exception) {
false
}
}
}
}

View File

@ -0,0 +1,47 @@
package moe.matsuri.nb4a.ui
import android.content.Context
import android.util.AttributeSet
import android.widget.EditText
import androidx.core.content.res.TypedArrayUtils
import androidx.preference.EditTextPreference
import io.nekohasekai.sagernet.R
import io.nekohasekai.sagernet.database.DataStore
class UrlTestPreference
@JvmOverloads
constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = TypedArrayUtils.getAttr(
context, R.attr.editTextPreferenceStyle,
android.R.attr.editTextPreferenceStyle
),
defStyleRes: Int = 0
) : EditTextPreference(context, attrs, defStyleAttr, defStyleRes) {
var concurrent: EditText? = null
init {
dialogLayoutResource = R.layout.layout_urltest_preference_dialog
setOnBindEditTextListener {
concurrent = it.rootView.findViewById(R.id.edit_concurrent)
concurrent?.apply {
setText(DataStore.connectionTestConcurrent.toString())
}
}
setOnPreferenceChangeListener { _, _ ->
concurrent?.apply {
var newConcurrent = text?.toString()?.toIntOrNull()
if (newConcurrent == null || newConcurrent <= 0) {
newConcurrent = 5
}
DataStore.connectionTestConcurrent = newConcurrent
}
true
}
}
}

View File

@ -10,18 +10,6 @@
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@android:id/message"
style="?android:attr/textAppearanceSmall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:layout_marginEnd="24dp"
android:layout_marginRight="24dp"
android:layout_marginBottom="48dp"
android:textColor="?android:attr/textColorSecondary" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/input_layout"
android:layout_width="match_parent"
@ -41,6 +29,30 @@
android:paddingTop="12dp"
android:singleLine="true"
android:typeface="monospace" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
style="?android:attr/textAppearanceSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/test_concurrency"
android:textColor="?android:attr/textColorSecondary" />
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edit_concurrent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
android:minHeight="48dp"
android:paddingTop="12dp"
android:singleLine="true"
android:typeface="monospace" />
</LinearLayout>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
</ScrollView>

View File

@ -93,10 +93,6 @@
android:id="@+id/action_connection_test"
android:title="@string/connection_test">
<menu>
<item
android:id="@+id/action_connection_icmp_ping"
android:title="@string/connection_test_icmp_ping"
android:visible="false" />
<item
android:id="@+id/action_connection_tcp_ping"
android:title="@string/connection_test_tcp_ping" />

View File

@ -471,4 +471,7 @@
<string name="reset_connections">重置连接</string>
<string name="remove_duplicate">删除重复的服务器</string>
<string name="tls_camouflage_settings">TLS 伪装设置</string>
<string name="mtu_help">长按设置项以设置自定义 MTU。</string>
<string name="log_level_help">长按设置项以设置缓冲区大小。</string>
<string name="test_concurrency">测试并发</string>
</resources>

View File

@ -514,5 +514,6 @@ Anyone can write advanced plugins, which can control NekoBox. please download an
<string name="mtu_help">Long press the preference to set custom MTU.</string>
<string name="log_level_help">Long press the preference to set the buffer size.</string>
<string name="tls_camouflage_settings">TLS Camouflage Settings</string>
<string name="test_concurrency">Test concurrency</string>
</resources>

View File

@ -215,7 +215,7 @@
</PreferenceCategory>
<PreferenceCategory app:title="@string/cag_misc">
<EditTextPreference
<moe.matsuri.nb4a.ui.UrlTestPreference
app:defaultValue="http://cp.cloudflare.com/"
app:icon="@drawable/ic_baseline_cast_connected_24"
app:key="connectionTestURL"