Skip to content

Commit e84f161

Browse files
committed
Add proxy option to demo app
1 parent 310aadf commit e84f161

2 files changed

Lines changed: 46 additions & 14 deletions

File tree

  • demo-shared/src/commonMain/kotlin/io/github/kdroidfilter/webview/demo
  • webview-compose/src/commonMain/kotlin/io/github/kdroidfilter/webview/setting

demo-shared/src/commonMain/kotlin/io/github/kdroidfilter/webview/demo/DemoToolsPanel.kt

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,9 @@
11
package io.github.kdroidfilter.webview.demo
22

3-
import androidx.compose.foundation.layout.Arrangement
4-
import androidx.compose.foundation.layout.Column
5-
import androidx.compose.foundation.layout.ColumnScope
6-
import androidx.compose.foundation.layout.ExperimentalLayoutApi
7-
import androidx.compose.foundation.layout.FlowRow
8-
import androidx.compose.foundation.layout.Row
9-
import androidx.compose.foundation.layout.Spacer
10-
import androidx.compose.foundation.layout.fillMaxSize
11-
import androidx.compose.foundation.layout.fillMaxWidth
12-
import androidx.compose.foundation.layout.height
13-
import androidx.compose.foundation.layout.heightIn
14-
import androidx.compose.foundation.layout.padding
15-
import androidx.compose.foundation.layout.width
16-
import androidx.compose.foundation.rememberScrollState
3+
import androidx.compose.foundation.layout.*
174
import androidx.compose.foundation.lazy.LazyColumn
185
import androidx.compose.foundation.lazy.items
6+
import androidx.compose.foundation.rememberScrollState
197
import androidx.compose.foundation.verticalScroll
208
import androidx.compose.material3.Button
219
import androidx.compose.material3.Card
@@ -31,12 +19,17 @@ import androidx.compose.material3.Switch
3119
import androidx.compose.material3.Text
3220
import androidx.compose.material3.TextButton
3321
import androidx.compose.runtime.Composable
22+
import androidx.compose.runtime.getValue
23+
import androidx.compose.runtime.mutableStateOf
24+
import androidx.compose.runtime.remember
3425
import androidx.compose.runtime.rememberCoroutineScope
26+
import androidx.compose.runtime.setValue
3527
import androidx.compose.ui.Alignment
3628
import androidx.compose.ui.Modifier
3729
import androidx.compose.ui.unit.dp
3830
import composewebview.demo_shared.generated.resources.Res
3931
import io.github.kdroidfilter.webview.cookie.Cookie
32+
import io.github.kdroidfilter.webview.setting.ProxyConfig
4033
import io.github.kdroidfilter.webview.util.KLogSeverity
4134
import io.github.kdroidfilter.webview.web.WebViewNavigator
4235
import io.github.kdroidfilter.webview.web.WebViewState
@@ -87,6 +80,9 @@ internal fun DemoToolsPanel(
8780
onSetLogSeverity: (KLogSeverity) -> Unit,
8881
) {
8982
val scope = rememberCoroutineScope()
83+
val desktopWebSettings = webViewState.webSettings.desktopWebSettings
84+
var proxyType by remember { mutableStateOf("None") }
85+
var proxyText by remember { mutableStateOf(desktopWebSettings.proxyConfig?.toString() ?: "") }
9086
Surface(modifier = modifier, color = MaterialTheme.colorScheme.surface) {
9187
Column(
9288
modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(12.dp),
@@ -375,6 +371,29 @@ internal fun DemoToolsPanel(
375371
singleLine = true,
376372
label = { Text("Custom User-Agent") },
377373
)
374+
Spacer(Modifier.height(8.dp))
375+
OutlinedTextField(
376+
value = proxyText,
377+
onValueChange = { proxyText = it },
378+
singleLine = true,
379+
label = { Text("Proxy (desktop only)") },
380+
)
381+
FlowRow(horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
382+
listOf("None", "HTTP", "SOCKS5").forEach { type ->
383+
FilterChip(
384+
selected = proxyType == type,
385+
onClick = { proxyType = type },
386+
label = { Text(type) },
387+
)
388+
}
389+
}
390+
Button(
391+
onClick = {
392+
desktopWebSettings.proxyConfig = proxyText.ifBlank { null }?.parseProxyConfig(proxyType)
393+
}
394+
){
395+
Text("Set proxy")
396+
}
378397
}
379398

380399
SectionCard(title = "Logs") {
@@ -454,3 +473,14 @@ private fun inlineHtml(): String =
454473
</body>
455474
</html>
456475
""".trimIndent()
476+
477+
private fun String.parseProxyConfig(proxyType: String): ProxyConfig? {
478+
val host = substringBefore(":").ifBlank { null } ?: return null
479+
val port = substringAfter(":").toIntOrNull() ?: return null
480+
return when (proxyType) {
481+
"None" -> null
482+
"HTTP" -> ProxyConfig.Http(host, port)
483+
"SOCKS5" -> ProxyConfig.Socks5(host, port)
484+
else -> error("Invalid proxy type: $proxyType")
485+
}
486+
}

webview-compose/src/commonMain/kotlin/io/github/kdroidfilter/webview/setting/ProxyConfig.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@ sealed class ProxyConfig {
1313
override val host: String,
1414
override val port: Int
1515
) : ProxyConfig()
16+
17+
override fun toString() = "$host:$port"
1618
}

0 commit comments

Comments
 (0)