瀏覽代碼

Fixed NoClassDefFoundError ConcurrentMap.computeIfAbsent for Android API 23

Vadik Sirekanyan 2 年之前
父節點
當前提交
945cc436d0
共有 2 個文件被更改,包括 18 次插入4 次删除
  1. 1 1
      app/build.gradle.kts
  2. 17 3
      app/src/main/java/org/sirekanyan/outline/api/OutlineApi.kt

+ 1 - 1
app/build.gradle.kts

@@ -80,7 +80,7 @@ dependencies {
 
     // ktor
     // noinspection GradleDependency todo: https://youtrack.jetbrains.com/issue/KTOR-6396
-    implementation("io.ktor:ktor-client-cio:2.3.4")
+    implementation("io.ktor:ktor-client-okhttp:2.3.4")
     // noinspection GradleDependency todo: https://youtrack.jetbrains.com/issue/KTOR-6396
     implementation("io.ktor:ktor-client-content-negotiation:2.3.4")
     // noinspection GradleDependency todo: https://youtrack.jetbrains.com/issue/KTOR-6396

+ 17 - 3
app/src/main/java/org/sirekanyan/outline/api/OutlineApi.kt

@@ -2,7 +2,7 @@ package org.sirekanyan.outline.api
 
 import io.ktor.client.HttpClient
 import io.ktor.client.call.body
-import io.ktor.client.engine.cio.CIO
+import io.ktor.client.engine.okhttp.OkHttp
 import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
 import io.ktor.client.request.delete
 import io.ktor.client.request.get
@@ -13,6 +13,7 @@ import io.ktor.http.ContentType
 import io.ktor.http.contentType
 import io.ktor.serialization.kotlinx.json.json
 import kotlinx.serialization.json.Json
+import okhttp3.OkHttpClient
 import org.sirekanyan.outline.api.model.AccessKeysResponse
 import org.sirekanyan.outline.api.model.Key
 import org.sirekanyan.outline.api.model.RenameRequest
@@ -20,14 +21,27 @@ import org.sirekanyan.outline.api.model.Server
 import org.sirekanyan.outline.api.model.ServerNameResponse
 import org.sirekanyan.outline.api.model.TransferMetricsResponse
 import org.sirekanyan.outline.ext.logDebug
+import java.security.SecureRandom
+import javax.net.ssl.SSLContext
+
+private fun setInsecureHttp(builder: OkHttpClient.Builder) {
+    val sslContext = SSLContext.getInstance("SSL")
+    sslContext.init(null, arrayOf(InsecureTrustManager), SecureRandom())
+    builder.sslSocketFactory(sslContext.socketFactory, InsecureTrustManager)
+    builder.hostnameVerifier { _, _ -> true }
+}
 
 class OutlineApi {
 
-    private val httpClient = HttpClient(CIO) {
+    private val httpClient = HttpClient(OkHttp) {
         install(ContentNegotiation) {
             json(Json { ignoreUnknownKeys = true })
         }
-        engine { https.trustManager = InsecureTrustManager } // TODO: remove insecure http
+        engine {
+            config {
+                setInsecureHttp(this) // TODO: remove insecure http
+            }
+        }
     }
 
     suspend fun getServer(apiUrl: String): Server {