Browse Source

working on file upload on webview

Khubaib 1 year ago
parent
commit
cf8feffa91

+ 21 - 0
app/src/main/java/com/vpn/fastestvpnservice/MainActivity.kt

@@ -1,6 +1,8 @@
 package com.vpn.fastestvpnservice
 
+import android.content.Intent
 import android.content.pm.PackageManager
+import android.net.Uri
 import android.os.Build
 import android.os.Bundle
 import android.util.Log
@@ -37,6 +39,8 @@ import com.vpn.fastestvpnservice.beans.themesList
 import com.vpn.fastestvpnservice.helpers.BasePreferenceHelper
 import com.vpn.fastestvpnservice.interfaces.VPNConnectionCallBacks
 import com.vpn.fastestvpnservice.navigation.SetUpNavGraph
+import com.vpn.fastestvpnservice.screens.helpScreensAll.fileChooserCallback
+import com.vpn.fastestvpnservice.sealedClass.Screen
 import com.vpn.fastestvpnservice.ui.theme.FastestVPNTheme
 import com.vpn.fastestvpnservice.viewmodels.BillingViewModel
 import com.vpn.fastestvpnservice.viewmodels.LoginViewModel
@@ -104,6 +108,23 @@ class MainActivity : ComponentActivity() {
         }
     }
 
+    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+        super.onActivityResult(requestCode, resultCode, data)
+
+        Log.d("test_file_chat", "onActivityResult: $requestCode $resultCode $data")
+        if (requestCode == 0) {
+            Log.d("test_file_chat", "onActivityResult: ${fileChooserCallback.toString()}")
+
+            if (fileChooserCallback == null) {
+                Log.d("test_file_chat", "onActivityResult: fileChooserCallback is null")
+            }
+            fileChooserCallback?.onReceiveValue(null)
+        } else {
+            fileChooserCallback?.onReceiveValue(arrayOf(Uri.parse(data?.dataString)))
+        }
+        fileChooserCallback = null
+    }
+
     override fun onDestroy() {
         super.onDestroy()
 

+ 1 - 1
app/src/main/java/com/vpn/fastestvpnservice/navigation/BottomBarNavGraph.kt

@@ -104,7 +104,7 @@ fun BottomBarNavGraph(navHostController: NavHostController,
                 SubscriptionScreen(navHostController, activity)
             }
             composable(route = Screen.CustomerSupport.route) {
-                CustomerSupport(navHostController = navHostController)
+                CustomerSupport(navHostController = navHostController, activity)
             }
             composable(route = Screen.EmailUs.route) {
                 EmailUsScreen(navHostController = navHostController)

+ 88 - 1
app/src/main/java/com/vpn/fastestvpnservice/screens/bottomNavBarScreens/HelpScreen.kt

@@ -19,6 +19,8 @@ import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.filled.Message
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Surface
 import androidx.compose.material3.Text
@@ -29,6 +31,7 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.draw.alpha
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.input.pointer.pointerInput
 import androidx.compose.ui.res.painterResource
 import androidx.compose.ui.tooling.preview.Preview
@@ -92,7 +95,7 @@ fun Help(navHostController: NavHostController) {
                         Screen.About.route
                     )
                 }
-                AddRow(icon = R.drawable.customer_support3x,
+                AddRowIcon(icon = Icons.AutoMirrored.Filled.Message,
                     text = "Customer Support",
                     navHostController = navHostController) {
                     navHostController.navigate(
@@ -196,6 +199,90 @@ fun ColumnScope.AddRow(
 }
 
 @Composable
+fun ColumnScope.AddRowIcon(
+    icon: ImageVector,
+    text: String,
+    navHostController: NavHostController,
+    onClick: () -> Unit
+) {
+    Row(
+        modifier = Modifier
+            .fillMaxWidth()
+            .padding(top = 33.dp)
+            .background(Color.Transparent)
+            .height(30.dp)
+            .pointerInput(Unit) {
+                detectTapGestures {
+                    Log.d("test_row", "Clicked Row ${onClick().toString()}")
+                    onClick()
+                }
+            }
+//            .clickable {
+//                Log.d("test_row", "Clicked Row ${onClick.toString()}")
+//                onClick()
+//            }
+        ,
+        horizontalArrangement = Arrangement.Start,
+        verticalAlignment = Alignment.CenterVertically
+    ) {
+
+        Surface(
+            modifier = Modifier.padding(start = 0.dp),
+            color = Color.Transparent
+        ) {
+            Image(
+                imageVector = icon,
+                contentDescription = "World",
+                modifier = Modifier
+                    .padding(start = 0.dp)
+                    .size(24.dp)
+                    .weight(1f),
+                colorFilter = ColorFilter.tint(
+                    MaterialTheme.colorScheme.primary)
+            )
+        }
+
+        Surface(
+            modifier = Modifier.padding(start = 0.dp),
+            color = Color.Transparent
+        ) {
+            Text(text = text,
+                color = MaterialTheme.colorScheme.primary,
+                style = MaterialTheme.typography.titleSmall,
+                maxLines = 2,
+                modifier = Modifier
+                    .padding(start = 20.dp, end = 0.dp)
+                    .weight(1f)
+            )
+        }
+        Spacer(modifier = Modifier.weight(1f))
+
+        Surface(
+            modifier = Modifier
+                .padding(start = 15.dp)
+                .align(Alignment.CenterVertically),
+            color = Color.Transparent
+
+        ) {
+            Image(
+                painter = painterResource(
+                    id = R.drawable.frontarrow3x),
+                contentDescription = "Front_Arrow",
+                modifier = Modifier
+                    .padding(start = 0.dp, end = 5.dp)
+                    .size(10.dp, 18.dp)
+                    .weight(1f)
+                    .alpha(1F),
+                colorFilter = ColorFilter.tint(
+                    MaterialTheme.colorScheme.primary)
+            )
+        }
+
+
+    }
+}
+
+@Composable
 fun ColumnScope.AddTextHelp(text: String, size: TextUnit, color: Color) {
     Text(
         text = text,

+ 105 - 49
app/src/main/java/com/vpn/fastestvpnservice/screens/helpScreensAll/CustomerSupportScreen.kt

@@ -1,11 +1,20 @@
 package com.vpn.fastestvpnservice.screens.helpScreensAll
 
 import android.annotation.SuppressLint
+import android.content.Intent
 import android.graphics.Bitmap
+import android.net.Uri
 import android.util.Log
+import android.view.View
 import android.view.ViewGroup
+import android.webkit.PermissionRequest
+import android.webkit.ValueCallback
+import android.webkit.WebChromeClient
+import android.webkit.WebResourceError
+import android.webkit.WebResourceRequest
 import android.webkit.WebView
 import android.webkit.WebViewClient
+import androidx.activity.ComponentActivity
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.BoxScope
@@ -30,24 +39,23 @@ import androidx.compose.runtime.remember
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.text.TextStyle
-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
 import androidx.compose.ui.viewinterop.AndroidView
 import androidx.navigation.NavHostController
 import androidx.navigation.compose.rememberNavController
 import com.vpn.fastestvpnservice.R
 import kotlinx.coroutines.delay
 
+lateinit var activity1: ComponentActivity
+var fileChooserCallback: ValueCallback<Array<Uri>>? = null
+
 @SuppressLint("SetJavaScriptEnabled")
 @Composable
-fun CustomerSupport(navHostController: NavHostController) {
+fun CustomerSupport(navHostController: NavHostController, activity: ComponentActivity) {
+    activity1 = activity
     Box(
         modifier = Modifier
             .fillMaxWidth()
@@ -58,10 +66,11 @@ fun CustomerSupport(navHostController: NavHostController) {
 
         ShowHeaderCS(navHostController = navHostController)
 
-        Box(modifier = Modifier
-            .padding(top = 60.dp, bottom = 0.dp)
-            .fillMaxSize()
-            .background(MaterialTheme.colorScheme.onPrimary)
+        Box(
+            modifier = Modifier
+                .padding(top = 60.dp, bottom = 0.dp)
+                .fillMaxSize()
+                .background(MaterialTheme.colorScheme.onPrimary)
         ) {
 
             val email = "sagartestaccount@gmail.com"
@@ -84,10 +93,17 @@ fun CustomerSupport(navHostController: NavHostController) {
                     settings.loadsImagesAutomatically = true
                     settings.builtInZoomControls = true
                     settings.displayZoomControls = true
-                    settings.mediaPlaybackRequiresUserGesture = true
+                    settings.mediaPlaybackRequiresUserGesture = false
+                    settings.supportZoom()
+                    settings.loadWithOverviewMode = true
+                    setLayerType(View.LAYER_TYPE_NONE, null)
 
                     webViewClient = object : WebViewClient() {
-                        override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
+                        override fun onPageStarted(
+                            view: WebView?,
+                            url: String?,
+                            favicon: Bitmap?
+                        ) {
                             super.onPageStarted(view, url, favicon)
                             Log.d("test_webview", "onPageStarted")
                             showLoader = true
@@ -98,6 +114,53 @@ fun CustomerSupport(navHostController: NavHostController) {
                             Log.d("test_webview", "onPageFinished")
                             showLoader = false
                         }
+
+                        override fun onReceivedError(
+                            view: WebView?,
+                            request: WebResourceRequest?,
+                            error: WebResourceError?
+                        ) {
+                            super.onReceivedError(view, request, error)
+                            Log.d("test_webview", "onReceivedError")
+                            showLoader = false
+                        }
+                    }
+
+                    webChromeClient = object : WebChromeClient() {
+                        override fun onPermissionRequest(request: PermissionRequest?) {
+                            super.onPermissionRequest(request)
+                            Log.d("test_file_chat", "onActivityResult: onPermissionRequest")
+                            request?.grant(request.resources)
+                        }
+
+                        override fun onShowFileChooser(
+                            webView: WebView?,
+                            filePathCallback: ValueCallback<Array<Uri>>?,
+                            fileChooserParams: FileChooserParams?
+                        ): Boolean {
+                            Log.d("test_file_chat", "onActivityResult: onShowFileChooser")
+                            fileChooserCallback?.onReceiveValue(null)
+                            fileChooserCallback = filePathCallback
+                            val selectionIntent = Intent(Intent.ACTION_GET_CONTENT)
+                            selectionIntent.addCategory(Intent.CATEGORY_OPENABLE)
+                            selectionIntent.type = "*/*"
+                            val chooserIntent = Intent(Intent.ACTION_CHOOSER)
+                            chooserIntent.putExtra(Intent.EXTRA_INTENT, selectionIntent)
+                            activity.startActivityForResult(chooserIntent, 0)
+
+                            return true
+                        }
+
+                    }
+
+                    setDownloadListener { uri, userAgent, contentDisposition, mimetype, contentLength ->
+                        handleURI(
+                            uri
+                        )
+                    }
+                    setOnLongClickListener { v ->
+                        handleURI((v as WebView).hitTestResult.extra)
+                        true
                     }
 
 //                        loadUrl(supportUrl)
@@ -108,32 +171,43 @@ fun CustomerSupport(navHostController: NavHostController) {
                     it.loadUrl(supportUrl)
                 }
             )
-        }
-        if (showLoader) {
 
-            var progress by remember { mutableFloatStateOf(0.1F) }
+            if (showLoader) {
 
-            LaunchedEffect(key1 = Unit) {
-                for (i in 1..100) {
-                    progress = i.toFloat()/100F
-                    delay(50)
+                var progress by remember { mutableFloatStateOf(0.1F) }
+
+                LaunchedEffect(key1 = Unit) {
+                    for (i in 1..100) {
+                        progress = i.toFloat() / 100F
+                        delay(50)
+                    }
                 }
-            }
 
-            Box(modifier = Modifier
-                .fillMaxSize()
-                .background(MaterialTheme.colorScheme.onPrimary)) {
-                CircularProgressIndicator(
-                    progress = progress,
+                Box(
                     modifier = Modifier
-                        .align(Alignment.Center)
-                        .size(50.dp),
-                    colorResource(id = R.color.appYellow),
-                    strokeWidth = 5.dp,
-                )
+                        .fillMaxSize()
+                        .background(MaterialTheme.colorScheme.onPrimary)
+                ) {
+                    CircularProgressIndicator(
+                        progress = progress,
+                        modifier = Modifier
+                            .align(Alignment.Center)
+                            .size(50.dp),
+                        colorResource(id = R.color.appYellow),
+                        strokeWidth = 5.dp,
+                    )
+                }
             }
+
         }
+    }
+}
 
+fun handleURI(uri: String?) {
+    if (uri != null) {
+        val i = Intent(Intent.ACTION_VIEW)
+        i.data = Uri.parse(uri.replaceFirst("^blob:".toRegex(), ""))
+        activity1.startActivity(i)
     }
 }
 
@@ -173,28 +247,10 @@ fun BoxScope.ShowHeaderCS(navHostController: NavHostController) {
 
         )
     }
-
-//    Column(
-//        modifier = Modifier
-//            .fillMaxWidth()
-//            .fillMaxHeight()
-//            .padding(top = 100.dp)
-//            .padding(16.dp)
-//            .background(Color.Transparent)
-//            .verticalScroll(rememberScrollState())
-//    ) {
-//        Text(text = TermsAndConditionsDesc,
-//            style = TextStyle(
-//                fontSize = 14.sp,
-//                lineHeight = 26.sp,
-//                color = MaterialTheme.colorScheme.primary
-//            )
-//        )
-//    }
 }
 
 @Preview
 @Composable
 fun CustomerSupportPreview() {
-    CustomerSupport(navHostController = rememberNavController())
+//    CustomerSupport(navHostController = rememberNavController())
 }