Browse Source

Worked on webviews for older version than API level 27 on android

Khubaib 6 months ago
parent
commit
d410706490

+ 2 - 2
.idea/deploymentTargetSelector.xml

@@ -4,10 +4,10 @@
     <selectionStates>
       <SelectionState runConfigName="app">
         <option name="selectionMode" value="DROPDOWN" />
-        <DropdownSelection timestamp="2024-10-28T12:29:03.849593541Z">
+        <DropdownSelection timestamp="2024-10-28T19:14:15.094015062Z">
           <Target type="DEFAULT_BOOT">
             <handle>
-              <DeviceId pluginId="LocalEmulator" identifier="path=/home/ubuntu/.android/avd/Medium_Phone_API_26.avd" />
+              <DeviceId pluginId="PhysicalDevice" identifier="serial=1C051FDF60048Z" />
             </handle>
           </Target>
         </DropdownSelection>

+ 1 - 4
app/src/main/java/com/vpn/fastestvpnservice/retrofit/WebServiceFactory.java

@@ -50,12 +50,9 @@ public class WebServiceFactory {
         httpClient.connectTimeout(120, TimeUnit.SECONDS);
         httpClient.readTimeout(120, TimeUnit.SECONDS);
 
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
-            Log.d("build_api", "VERSION = " + Build.VERSION.RELEASE + ", " + Build.VERSION.SDK_INT + ", " + Build.VERSION_CODES.O);
+        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) {
             httpClient.sslSocketFactory(getUnsafeSslContext().getSocketFactory(), getTrustManager());
             httpClient.hostnameVerifier((hostname, session) -> true);
-        } else {
-            Log.d("build_api", "else");
         }
 
         boolean isTV = StaticMethods.isTV(App.getContext().getApplicationContext());

+ 5 - 0
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/HelpScreen.kt

@@ -49,6 +49,7 @@ import androidx.navigation.compose.rememberNavController
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.isDarkTheme
 import com.vpn.fastestvpnservice.firebase.DatabaseUtils
+import com.vpn.fastestvpnservice.screens.helpScreensAll.showLoader
 import com.vpn.fastestvpnservice.sealedClass.Screen
 
 @OptIn(ExperimentalFoundationApi::class)
@@ -92,23 +93,27 @@ fun Help(navHostController: NavHostController) {
                     text = context.getString(R.string.faq), navHostController = navHostController,
                     topPadding = 33.dp)
                 {
+                    showLoader.value = true
                     navHostController.navigate(
                         Screen.FAQ.route
                     )}
                 AddRow(icon = R.drawable.privacy3x,
                     text = context.getString(R.string.privacy_policy), navHostController = navHostController) {
+                    showLoader.value = true
                     navHostController.navigate(
                         Screen.PrivacyPolicy.route
                     )
                 }
                 AddRow(icon = R.drawable.terms3x,
                     text = context.getString(R.string.terms_conditions), navHostController = navHostController) {
+                    showLoader.value = true
                     navHostController.navigate(
                         Screen.TermsAndConditions.route
                     )
                 }
                 AddRow(icon = R.drawable.about3x,
                     text = context.getString(R.string.about_fastest_vpn), navHostController = navHostController) {
+                    showLoader.value = true
                     navHostController.navigate(
                         Screen.About.route
                     )

+ 43 - 34
app/src/main/java/com/vpn/fastestvpnservice/screens/helpScreensAll/AboutScreen.kt

@@ -2,6 +2,7 @@ package com.vpn.fastestvpnservice.screens.helpScreensAll
 
 import android.app.Activity
 import android.graphics.Bitmap
+import android.os.Build
 import android.util.Log
 import android.view.ViewGroup
 import android.webkit.WebView
@@ -52,7 +53,7 @@ fun About(navHostController: NavHostController) {
     val configuration = LocalConfiguration.current
     val screenHeight = configuration.screenHeightDp.dp
     val screenWidth = configuration.screenWidthDp.dp
-    var showLoader by remember { mutableStateOf(true) }
+//    var showLoader by remember { mutableStateOf(true) }
 
     Box(
         modifier = Modifier
@@ -78,42 +79,50 @@ fun About(navHostController: NavHostController) {
             val aboutUrl = if (isDarkTheme.value) "${AppConstant.BASE_WEBVIEW_URL}${languageIdentifier}/about?skin=dark"
             else "${AppConstant.BASE_WEBVIEW_URL}${languageIdentifier}/about?device=ios"
 
-            AndroidView(factory = {
-                WebView(it).apply {
-                    layoutParams = ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.MATCH_PARENT
-                    )
-                    webViewClient = WebViewClient()
-
-                    settings.javaScriptEnabled = true
-
-                    webViewClient = object : WebViewClient() {
-                        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
-                            super.onPageStarted(view, url, favicon)
-                            Log.d("test_webview", "onPageStarted")
-                            showLoader = true
-                        }
-
-                        override fun onPageFinished(view: WebView?, url: String?) {
-                            super.onPageFinished(view, url)
-                            Log.d("test_webview", "onPageFinished")
-                            showLoader = false
-                        }
-                    }
-
-//                        loadUrl(aboutUrl)
-                }
-            },
-                update = {
-                    Log.d("test_webview", "update")
-                    it.loadUrl(aboutUrl)
-                }
-            )
+            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) {
+                Log.d("test_webview", "CustomWebView()")
+                CustomWebView(url = aboutUrl)
+            } else {
+                Log.d("test_webview", "WebView()")
+                WebView(url = aboutUrl)
+            }
+
+//            AndroidView(factory = {
+//                WebView(it).apply {
+//                    layoutParams = ViewGroup.LayoutParams(
+//                        ViewGroup.LayoutParams.MATCH_PARENT,
+//                        ViewGroup.LayoutParams.MATCH_PARENT
+//                    )
+//                    webViewClient = WebViewClient()
+//
+//                    settings.javaScriptEnabled = true
+//
+//                    webViewClient = object : WebViewClient() {
+//                        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
+//                            super.onPageStarted(view, url, favicon)
+//                            Log.d("test_webview", "onPageStarted")
+//                            showLoader = true
+//                        }
+//
+//                        override fun onPageFinished(view: WebView?, url: String?) {
+//                            super.onPageFinished(view, url)
+//                            Log.d("test_webview", "onPageFinished")
+//                            showLoader = false
+//                        }
+//                    }
+//
+////                        loadUrl(aboutUrl)
+//                }
+//            },
+//                update = {
+//                    Log.d("test_webview", "update")
+//                    it.loadUrl(aboutUrl)
+//                }
+//            )
 
         }
 
-        if (showLoader) {
+        if (showLoader.value) {
             var progress by remember { mutableFloatStateOf(0.1F) }
 
             LaunchedEffect(key1 = Unit) {

+ 169 - 53
app/src/main/java/com/vpn/fastestvpnservice/screens/helpScreensAll/FAQScreen.kt

@@ -3,8 +3,10 @@ package com.vpn.fastestvpnservice.screens.helpScreensAll
 import android.annotation.SuppressLint
 import android.app.Activity
 import android.graphics.Bitmap
+import android.os.Build
 import android.util.Log
 import android.view.ViewGroup
+import android.webkit.WebSettings
 import android.webkit.WebView
 import android.webkit.WebViewClient
 import androidx.compose.animation.animateContentSize
@@ -20,47 +22,32 @@ import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxScope
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
-import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.height
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.layout.width
-import androidx.compose.foundation.layout.wrapContentSize
-import androidx.compose.foundation.layout.wrapContentWidth
-import androidx.compose.foundation.rememberScrollState
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.foundation.verticalScroll
 import androidx.compose.material.Card
-import androidx.compose.material.ContentAlpha
 import androidx.compose.material.Icon
 import androidx.compose.material.IconButton
-import androidx.compose.material.Shapes
 import androidx.compose.material.Surface
 import androidx.compose.material.Text
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.automirrored.filled.ArrowBack
-import androidx.compose.material.icons.filled.ArrowBack
-import androidx.compose.material.icons.filled.ArrowDropDown
 import androidx.compose.material3.CircularProgressIndicator
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.mutableFloatStateOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
-import androidx.compose.ui.AbsoluteAlignment
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.alpha
-import androidx.compose.ui.draw.drawBehind
 import androidx.compose.ui.draw.rotate
 import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.drawscope.Stroke
 import androidx.compose.ui.graphics.toArgb
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.platform.LocalConfiguration
@@ -69,9 +56,7 @@ import androidx.compose.ui.platform.LocalView
 import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.FontStyle
 import androidx.compose.ui.text.font.FontWeight
-import androidx.compose.ui.text.style.TextAlign
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
@@ -82,10 +67,21 @@ import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.isDarkTheme
 import com.vpn.fastestvpnservice.constants.AppConstant
 import com.vpn.fastestvpnservice.constants.HelpDesc
-import com.vpn.fastestvpnservice.constants.HelpTitles
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
-import com.vpn.fastestvpnservice.sealedClass.BottomBarScreen
+import com.vpn.fastestvpnservice.retrofit.WebServiceFactory
 import kotlinx.coroutines.delay
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import java.io.IOException
+import java.security.SecureRandom
+import java.security.cert.X509Certificate
+import javax.net.ssl.HostnameVerifier
+import javax.net.ssl.SSLContext
+import javax.net.ssl.SSLSession
+import javax.net.ssl.TrustManager
+import javax.net.ssl.X509TrustManager
+
+var showLoader: MutableState<Boolean> = mutableStateOf(true)
 
 @Composable
 @SuppressLint("SetJavaScriptEnabled")
@@ -105,7 +101,6 @@ fun FAQ(navHostController: NavHostController) {
         window.statusBarColor = MaterialTheme.colorScheme.onPrimary.toArgb()
         window.navigationBarColor = MaterialTheme.colorScheme.onPrimary.toArgb()
 
-        var showLoader by remember { mutableStateOf(true) }
         ShowExpandList(navHostController = navHostController)
 
         Box(modifier = Modifier
@@ -118,41 +113,17 @@ fun FAQ(navHostController: NavHostController) {
             val languageIdentifier = basePreferenceHelper.getLanguage()
             val faqUrl = if (isDarkTheme.value) "${AppConstant.BASE_WEBVIEW_URL}${languageIdentifier}/faq?skin=dark"
             else "${AppConstant.BASE_WEBVIEW_URL}${languageIdentifier}/faq?device=ios"
-            AndroidView(factory = {
-                WebView(it).apply {
-                    layoutParams = ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.MATCH_PARENT
-                    )
-                    webViewClient = WebViewClient()
-
-                    settings.javaScriptEnabled = true
-
-                    webViewClient = object : WebViewClient() {
-                        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
-                            super.onPageStarted(view, url, favicon)
-                            Log.d("test_webview", "onPageStarted")
-                            showLoader = true
-                        }
-
-                        override fun onPageFinished(view: WebView?, url: String?) {
-                            super.onPageFinished(view, url)
-                            Log.d("test_webview", "onPageFinished")
-                            showLoader = false
-                        }
-                    }
-
-//                    loadUrl(faqUrl)
-                }
-            },
-                update = {
-                    it.loadUrl(faqUrl)
-                }
-            )
 
+            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) {
+                Log.d("test_webview", "CustomWebView()")
+                CustomWebView(url = faqUrl)
+            } else {
+                Log.d("test_webview", "WebView()")
+                WebView(url = faqUrl)
+            }
         }
 
-        if (showLoader) {
+        if (showLoader.value) {
             var progress by remember { mutableFloatStateOf(0.1F) }
 
             LaunchedEffect(key1 = Unit) {
@@ -177,9 +148,154 @@ fun FAQ(navHostController: NavHostController) {
         }
 
     }
+}
+
+@Composable
+fun BoxScope.CustomWebView(url: String) {
+    AndroidView(factory = { context ->
+        val webView = WebView(context).apply {
+            layoutParams = ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT
+            )
+
+            settings.apply {
+                javaScriptEnabled = true
+                domStorageEnabled = true
+                loadsImagesAutomatically = true
+                mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
+            }
+
+            webViewClient = object : WebViewClient() {
+                override fun onReceivedSslError(
+                    view: WebView?,
+                    handler: android.webkit.SslErrorHandler?,
+                    error: android.net.http.SslError?
+                ) {
+                    handler?.proceed() // Bypass SSL certificate issues (for debugging)
+                }
+            }
+        }
+
+        // Make the OkHttp request
+        loadContentWithOkHttp(webView, url)
+        webView
+    })
+}
+
+@Composable
+fun BoxScope.WebView(url: String) {
+    AndroidView(factory = {
+        WebView(it).apply {
+            layoutParams = ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT
+            )
+            webViewClient = WebViewClient()
+
+            settings.javaScriptEnabled = true
+
+            webViewClient = object : WebViewClient() {
+                override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
+                    super.onPageStarted(view, url, favicon)
+                    Log.d("test_webview", "onPageStarted")
+                    showLoader.value = true
+                }
+
+                override fun onPageFinished(view: WebView?, url: String?) {
+                    super.onPageFinished(view, url)
+                    Log.d("test_webview", "onPageFinished")
+                    showLoader.value = false
+                }
+
+            }
+
+//            loadUrl(url)
+        }
+    },
+        update = {
+            Log.d("test_webview", "update")
+            it.loadUrl(url)
+        }
+    )
+}
+
+fun loadContentWithOkHttp(webView: WebView, url: String) {
+    val client = createUnsafeOkHttpClient()
+    val request = Request.Builder().url(url).build()
+
+    Log.d("test_webview", "loadContentWithOkHttp")
+
+    client.newCall(request).enqueue(object : okhttp3.Callback {
+        override fun onFailure(call: okhttp3.Call, e: IOException) {
+            showLoader.value = false
+            Log.d("test_webview", "onFailure")
+            Log.e("CustomWebView", "Failed to load URL with OkHttp: ${e.message}")
+        }
+
+        override fun onResponse(call: okhttp3.Call, response: okhttp3.Response) {
+            showLoader.value = false
+            Log.d("test_webview", "onResponse")
+
+            val htmlContent = response.body?.string() ?: ""
+            // Load the HTML content into the WebView on the main thread
+
+            webView.post {
+                showLoader.value = false
+                Log.d("test_webview", "webView.post")
+                webView.loadDataWithBaseURL(url, htmlContent, "text/html", "UTF-8", null)
+            }
+        }
+    })
+}
+
+
+fun WebView.trustAllCertificates() {
+    try {
+        Log.d("test_webview", "try")
+        val trustAllCerts = arrayOf<TrustManager>(
+            object : X509TrustManager {
+                override fun checkClientTrusted(
+                    chain: Array<out X509Certificate>?,
+                    authType: String?
+                ) {}
+
+                override fun checkServerTrusted(
+                    chain: Array<out X509Certificate>?,
+                    authType: String?
+                ) {}
+
+                override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
+            }
+        )
+
+        val sslContext = SSLContext.getInstance("TLS")
+        sslContext.init(null, trustAllCerts, SecureRandom())
+        this.settings.javaScriptEnabled = true
+        // Set the SSL factory to the custom context that trusts all certificates
+        sslContext.socketFactory
+    } catch (e: Exception) {
+        Log.d("test_webview", "catch")
+    }
+}
 
+fun createUnsafeOkHttpClient(): OkHttpClient {
+    val trustAllCerts = arrayOf<TrustManager>(
+        object : X509TrustManager {
+            override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}
+            override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {}
+            override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
+        }
+    )
 
+    val sslContext = SSLContext.getInstance("TLS")
+    sslContext.init(null, trustAllCerts, SecureRandom())
+    val sslSocketFactory = sslContext.socketFactory
 
+    return OkHttpClient.Builder()
+        .sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager)
+        .hostnameVerifier(HostnameVerifier { _, _ -> true })
+        .build()
 }
 
 @Composable

+ 43 - 33
app/src/main/java/com/vpn/fastestvpnservice/screens/helpScreensAll/PrivacyPolicyScreen.kt

@@ -2,6 +2,7 @@ package com.vpn.fastestvpnservice.screens.helpScreensAll
 
 import android.app.Activity
 import android.graphics.Bitmap
+import android.os.Build
 import android.util.Log
 import android.view.ViewGroup
 import android.webkit.WebView
@@ -67,7 +68,7 @@ fun PrivacyPolicy(navHostController: NavHostController){
     val configuration = LocalConfiguration.current
     val screenHeight = configuration.screenHeightDp.dp
     val screenWidth = configuration.screenWidthDp.dp
-    var showLoader by remember { mutableStateOf(true) }
+//    var showLoader by remember { mutableStateOf(true) }
 
     Box(
         modifier = Modifier
@@ -92,42 +93,51 @@ fun PrivacyPolicy(navHostController: NavHostController){
             val languageIdentifier = basePreferenceHelper.getLanguage()
             val privacyUrl = if (isDarkTheme.value) "${AppConstant.BASE_WEBVIEW_URL}${languageIdentifier}/privacy-policy?skin=dark"
             else "${AppConstant.BASE_WEBVIEW_URL}${languageIdentifier}/privacy-policy?device=ios"
-            AndroidView(factory = {
-                WebView(it).apply {
-                    layoutParams = ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.MATCH_PARENT
-                    )
-                    webViewClient = WebViewClient()
-
-                    settings.javaScriptEnabled = true
-
-                    webViewClient = object : WebViewClient() {
-                        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
-                            super.onPageStarted(view, url, favicon)
-                            Log.d("test_webview", "onPageStarted")
-                            showLoader = true
-                        }
-
-                        override fun onPageFinished(view: WebView?, url: String?) {
-                            super.onPageFinished(view, url)
-                            Log.d("test_webview", "onPageFinished")
-                            showLoader = false
-                        }
-                    }
-
-//                    loadUrl(privacyUrl)
-                }
-            },
-                update = {
-                    it.loadUrl(privacyUrl)
-                }
-            )
+
+            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) {
+                Log.d("test_webview", "CustomWebView()")
+                CustomWebView(url = privacyUrl)
+            } else {
+                Log.d("test_webview", "WebView()")
+                WebView(url = privacyUrl)
+            }
+
+//            AndroidView(factory = {
+//                WebView(it).apply {
+//                    layoutParams = ViewGroup.LayoutParams(
+//                        ViewGroup.LayoutParams.MATCH_PARENT,
+//                        ViewGroup.LayoutParams.MATCH_PARENT
+//                    )
+//                    webViewClient = WebViewClient()
+//
+//                    settings.javaScriptEnabled = true
+//
+//                    webViewClient = object : WebViewClient() {
+//                        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
+//                            super.onPageStarted(view, url, favicon)
+//                            Log.d("test_webview", "onPageStarted")
+//                            showLoader = true
+//                        }
+//
+//                        override fun onPageFinished(view: WebView?, url: String?) {
+//                            super.onPageFinished(view, url)
+//                            Log.d("test_webview", "onPageFinished")
+//                            showLoader = false
+//                        }
+//                    }
+//
+////                    loadUrl(privacyUrl)
+//                }
+//            },
+//                update = {
+//                    it.loadUrl(privacyUrl)
+//                }
+//            )
 
 
         }
 
-        if (showLoader) {
+        if (showLoader.value) {
             var progress by remember { mutableFloatStateOf(0.1F) }
 
             LaunchedEffect(key1 = Unit) {

+ 42 - 33
app/src/main/java/com/vpn/fastestvpnservice/screens/helpScreensAll/TermsAndConditionsScreen.kt

@@ -2,6 +2,7 @@ package com.vpn.fastestvpnservice.screens.helpScreensAll
 
 import android.app.Activity
 import android.graphics.Bitmap
+import android.os.Build
 import android.util.Log
 import android.view.ViewGroup
 import android.webkit.WebView
@@ -73,7 +74,7 @@ fun TermsAndConditions(
     val configuration = LocalConfiguration.current
     val screenHeight = configuration.screenHeightDp.dp
     val screenWidth = configuration.screenWidthDp.dp
-    var showLoader by remember { mutableStateOf(true) }
+//    var showLoader by remember { mutableStateOf(true) }
 
     Box(
         modifier = Modifier
@@ -100,40 +101,48 @@ fun TermsAndConditions(
             val tncUrl = if (isDarkTheme.value) "${AppConstant.BASE_WEBVIEW_URL}${languageIdentifier}/terms-of-service?skin=dark"
             else "${AppConstant.BASE_WEBVIEW_URL}${languageIdentifier}/terms-of-service?device=ios"
 
-            AndroidView(factory = {
-                WebView(it).apply {
-                    layoutParams = ViewGroup.LayoutParams(
-                        ViewGroup.LayoutParams.MATCH_PARENT,
-                        ViewGroup.LayoutParams.MATCH_PARENT
-                    )
-                    webViewClient = WebViewClient()
-
-                    settings.javaScriptEnabled = true
-
-                    webViewClient = object : WebViewClient() {
-                        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
-                            super.onPageStarted(view, url, favicon)
-                            Log.d("test_webview", "onPageStarted")
-                            showLoader = true
-                        }
-
-                        override fun onPageFinished(view: WebView?, url: String?) {
-                            super.onPageFinished(view, url)
-                            Log.d("test_webview", "onPageFinished")
-                            showLoader = false
-                        }
-                    }
-
-//                    loadUrl(tncUrl)
-                }
-            },
-                update = {
-                    it.loadUrl(tncUrl)
-                }
-            )
+            if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) {
+                Log.d("test_webview", "CustomWebView()")
+                CustomWebView(url = tncUrl)
+            } else {
+                Log.d("test_webview", "WebView()")
+                WebView(url = tncUrl)
+            }
+
+//            AndroidView(factory = {
+//                WebView(it).apply {
+//                    layoutParams = ViewGroup.LayoutParams(
+//                        ViewGroup.LayoutParams.MATCH_PARENT,
+//                        ViewGroup.LayoutParams.MATCH_PARENT
+//                    )
+//                    webViewClient = WebViewClient()
+//
+//                    settings.javaScriptEnabled = true
+//
+//                    webViewClient = object : WebViewClient() {
+//                        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
+//                            super.onPageStarted(view, url, favicon)
+//                            Log.d("test_webview", "onPageStarted")
+//                            showLoader = true
+//                        }
+//
+//                        override fun onPageFinished(view: WebView?, url: String?) {
+//                            super.onPageFinished(view, url)
+//                            Log.d("test_webview", "onPageFinished")
+//                            showLoader = false
+//                        }
+//                    }
+//
+////                    loadUrl(tncUrl)
+//                }
+//            },
+//                update = {
+//                    it.loadUrl(tncUrl)
+//                }
+//            )
         }
 
-        if (showLoader) {
+        if (showLoader.value) {
             var progress by remember { mutableFloatStateOf(0.1F) }
 
             LaunchedEffect(key1 = Unit) {

+ 17 - 12
app/src/main/java/de/blinkt/openvpn/core/App.java

@@ -14,6 +14,9 @@ import android.content.pm.PackageManager;
 import android.os.Build;
 import android.util.Log;
 
+import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
+import com.google.android.gms.common.GooglePlayServicesRepairableException;
+import com.google.android.gms.security.ProviderInstaller;
 import com.google.firebase.FirebaseApp;
 import com.google.firebase.crashlytics.FirebaseCrashlytics;
 import com.vpn.fastestvpnservice.R;
@@ -26,10 +29,13 @@ import com.wireguard.config.Peer;
 import org.strongswan.android.logic.StrongSwanApplication;
 import org.strongswan.android.security.LocalCertificateKeyStoreProvider;
 
+import java.security.NoSuchAlgorithmException;
 import java.security.Security;
 import java.util.Calendar;
 import java.util.Random;
 
+import javax.net.ssl.SSLContext;
+
 import wireguard.WgTunnel;
 
 public class App extends /*com.orm.SugarApp*/ Application {
@@ -181,18 +187,17 @@ public class App extends /*com.orm.SugarApp*/ Application {
         StrongSwanApplication.mContext = getApplicationContext();
     }
 
-//    private void initializeSSLContext() {
-//        try {
-//            SSLContext.getInstance("TLSv1.2");
-//        } catch (NoSuchAlgorithmException e) {}
-//
-//        try {
-//            ProviderInstaller.installIfNeeded(getApplicationContext());
-//        } catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException e) {
-//            e.printStackTrace();
-//        }
-//
-//    }
+    private void initializeSSLContext() {
+        try {
+            SSLContext.getInstance("TLSv1.2");
+        } catch (NoSuchAlgorithmException e) {}
+
+        try {
+            ProviderInstaller.installIfNeeded(getApplicationContext());
+        } catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException e) {
+            e.printStackTrace();
+        }
+    }
 
     private void createNotificationChannel() {
         try {

+ 3 - 4
app/src/main/res/xml/network_security_config.xml

@@ -1,9 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
+
 <network-security-config>
     <domain-config cleartextTrafficPermitted="true">
-        <domain includeSubdomains="true">api.fastestvpn.com</domain>
-        <trust-anchors>
-            <certificates src="system"/>
-        </trust-anchors>
+        <domain includeSubdomains="true">fastestvpn.com</domain>
     </domain-config>
 </network-security-config>
+