@@ -13,6 +13,9 @@ import android.provider.OpenableColumns
13
13
import android.util.Log
14
14
import android.view.Gravity
15
15
import android.view.KeyEvent
16
+ import android.webkit.PermissionRequest
17
+ import android.webkit.ValueCallback
18
+ import android.webkit.WebChromeClient
16
19
import android.webkit.WebResourceError
17
20
import android.webkit.WebResourceRequest
18
21
import android.webkit.WebResourceResponse
@@ -23,6 +26,8 @@ import android.widget.LinearLayout
23
26
import android.widget.TextView
24
27
import android.widget.Toast
25
28
import androidx.activity.enableEdgeToEdge
29
+ import androidx.activity.result.ActivityResultLauncher
30
+ import androidx.activity.result.contract.ActivityResultContracts
26
31
import androidx.appcompat.app.AlertDialog
27
32
import androidx.appcompat.app.AppCompatActivity
28
33
import androidx.core.content.edit
@@ -71,6 +76,8 @@ class MainActivity : AppCompatActivity() {
71
76
private lateinit var navigationView: NavigationView
72
77
private lateinit var sharedPreferences: SharedPreferences
73
78
79
+ private lateinit var filePickerLauncher: ActivityResultLauncher <Array <String >>
80
+
74
81
@SuppressLint(" SetJavaScriptEnabled" , " SetTextI18n" )
75
82
override fun onCreate (savedInstanceState : Bundle ? ) {
76
83
super .onCreate(savedInstanceState)
@@ -87,10 +94,12 @@ class MainActivity : AppCompatActivity() {
87
94
88
95
binding.webview.apply {
89
96
webViewClient = MyWebViewClient ()
97
+ webChromeClient = MyWebChromeClient ()
90
98
settings.domStorageEnabled = true
91
99
settings.javaScriptEnabled = true
92
100
settings.allowFileAccess = true // not sure if this is needed
93
101
settings.allowContentAccess = true // not sure if this is needed
102
+ settings.mediaPlaybackRequiresUserGesture = true // not sure if this is needed
94
103
// settings.loadWithOverviewMode = true // prevent loading images zoomed in
95
104
// settings.useWideViewPort = true // prevent loading images zoomed in
96
105
addJavascriptInterface(WebAppInterface (this @MainActivity), " Android" )
@@ -116,13 +125,25 @@ class MainActivity : AppCompatActivity() {
116
125
val versionTextView = headerView.findViewById<TextView >(R .id.header_version)
117
126
versionTextView.text = " v${versionName} "
118
127
128
+ filePickerLauncher =
129
+ registerForActivityResult(ActivityResultContracts .OpenDocument ()) { uri ->
130
+ Log .d(" filePickerLauncher" , " uri: $uri " )
131
+ if (uri != null ) {
132
+ val mimeType = contentResolver.getType(uri)
133
+ Log .d(" filePickerLauncher" , " mimeType: $mimeType " )
134
+ processSharedFile(uri)
135
+ } else {
136
+ Log .w(" filePickerLauncher" , " No File Selected!" )
137
+ Toast .makeText(this , " No File Selected!" , Toast .LENGTH_SHORT ).show()
138
+ }
139
+ }
140
+
119
141
val itemPathMap = mapOf (
120
142
R .id.nav_item_home to " " ,
121
143
R .id.nav_item_files to " files/" ,
122
144
R .id.nav_item_gallery to " gallery/" ,
123
145
R .id.nav_item_albums to " albums/" ,
124
146
R .id.nav_item_shorts to " shorts/" ,
125
- R .id.nav_item_stats to " stats/" ,
126
147
R .id.nav_item_settings_user to " settings/user/" ,
127
148
R .id.nav_item_settings_site to " settings/site/" ,
128
149
R .id.nav_item_server_list to " server_list" ,
@@ -136,10 +157,18 @@ class MainActivity : AppCompatActivity() {
136
157
val path = itemPathMap[menuItem.itemId]
137
158
Log .d(" Drawer" , " path: $path " )
138
159
139
- if (path == null ) {
140
- Toast .makeText(this , " Unknown Menu Item!" , Toast .LENGTH_SHORT ).show()
141
- } else if (path == " server_list" ) {
160
+ if (menuItem.itemId == R .id.nav_item_upload) {
161
+ Log .d(" Drawer" , " nav_item_upload" )
162
+ filePickerLauncher.launch(arrayOf(" */*" ))
163
+
164
+ } else if (menuItem.itemId == R .id.nav_item_server_list) {
165
+ Log .d(" Drawer" , " nav_item_server_list" )
142
166
startActivity(Intent (this , SettingsActivity ::class .java))
167
+
168
+ } else if (path == null ) {
169
+ Log .e(" Drawer" , " Unknown Menu Item!" )
170
+ Toast .makeText(this , " Unknown Menu Item!" , Toast .LENGTH_LONG ).show()
171
+
143
172
} else {
144
173
Log .d(" Drawer" , " currentUrl: $currentUrl " )
145
174
val url = " ${currentUrl} /${path} "
@@ -151,7 +180,7 @@ class MainActivity : AppCompatActivity() {
151
180
}
152
181
}
153
182
drawerLayout.closeDrawers()
154
- true
183
+ false
155
184
}
156
185
157
186
// Handle Intent
@@ -261,7 +290,6 @@ class MainActivity : AppCompatActivity() {
261
290
if (webViewUrl == null ) {
262
291
Log .d(" handleIntent" , " binding.webview.url: ${binding.webview.url} " )
263
292
Log .d(" handleIntent" , " binding.webview.apply" )
264
- // binding.webview.loadUrl(savedUrl)
265
293
if (savedInstanceState != null ) {
266
294
Log .d(" handleIntent" , " ----- restoreState: ${savedInstanceState.size()} " )
267
295
binding.webview.restoreState(savedInstanceState)
@@ -690,4 +718,49 @@ class MainActivity : AppCompatActivity() {
690
718
}
691
719
}
692
720
}
721
+
722
+ inner class MyWebChromeClient : WebChromeClient () {
723
+ private var filePathCallback: ValueCallback <Array <Uri >>? = null
724
+
725
+ private val fileChooserLauncher =
726
+ registerForActivityResult(ActivityResultContracts .StartActivityForResult ()) { result ->
727
+ val clipData = result.data?.clipData
728
+ val dataUri = result.data?.data
729
+ val uris = when {
730
+ clipData != null -> Array (clipData.itemCount) { i -> clipData.getItemAt(i).uri }
731
+ dataUri != null -> arrayOf(dataUri)
732
+ else -> null
733
+ }
734
+ Log .d(" fileChooserLauncher" , " uris: ${uris?.contentToString()} " )
735
+ filePathCallback?.onReceiveValue(uris)
736
+ filePathCallback = null
737
+ }
738
+
739
+ override fun onShowFileChooser (
740
+ view : WebView ,
741
+ callback : ValueCallback <Array <Uri >>,
742
+ params : FileChooserParams
743
+ ): Boolean {
744
+ filePathCallback?.onReceiveValue(null )
745
+ filePathCallback = callback
746
+ return try {
747
+ Log .d(" onShowFileChooser" , " fileChooserLauncher.launch" )
748
+ fileChooserLauncher.launch(params.createIntent())
749
+ true
750
+ } catch (e: Exception ) {
751
+ Log .w(" onShowFileChooser" , " Exception: $e " )
752
+ filePathCallback = null
753
+ false
754
+ }
755
+ }
756
+
757
+ override fun onPermissionRequest (request : PermissionRequest ) {
758
+ Log .d(" onPermissionRequest" , " request: $request " )
759
+ // runOnUiThread {
760
+ // val resources = request.resources
761
+ // Log.d("onPermissionRequest", "resources: $resources")
762
+ // request.grant(resources)
763
+ // }
764
+ }
765
+ }
693
766
}
0 commit comments