Skip to content

Commit cefc00e

Browse files
authored
Add Upload Option (#13)
- Add Upload Option - Enable Uppy File Uploads
1 parent 85f4297 commit cefc00e

File tree

2 files changed

+85
-9
lines changed

2 files changed

+85
-9
lines changed

app/src/main/java/com/djangofiles/djangofiles/MainActivity.kt

Lines changed: 79 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import android.provider.OpenableColumns
1313
import android.util.Log
1414
import android.view.Gravity
1515
import android.view.KeyEvent
16+
import android.webkit.PermissionRequest
17+
import android.webkit.ValueCallback
18+
import android.webkit.WebChromeClient
1619
import android.webkit.WebResourceError
1720
import android.webkit.WebResourceRequest
1821
import android.webkit.WebResourceResponse
@@ -23,6 +26,8 @@ import android.widget.LinearLayout
2326
import android.widget.TextView
2427
import android.widget.Toast
2528
import androidx.activity.enableEdgeToEdge
29+
import androidx.activity.result.ActivityResultLauncher
30+
import androidx.activity.result.contract.ActivityResultContracts
2631
import androidx.appcompat.app.AlertDialog
2732
import androidx.appcompat.app.AppCompatActivity
2833
import androidx.core.content.edit
@@ -71,6 +76,8 @@ class MainActivity : AppCompatActivity() {
7176
private lateinit var navigationView: NavigationView
7277
private lateinit var sharedPreferences: SharedPreferences
7378

79+
private lateinit var filePickerLauncher: ActivityResultLauncher<Array<String>>
80+
7481
@SuppressLint("SetJavaScriptEnabled", "SetTextI18n")
7582
override fun onCreate(savedInstanceState: Bundle?) {
7683
super.onCreate(savedInstanceState)
@@ -87,10 +94,12 @@ class MainActivity : AppCompatActivity() {
8794

8895
binding.webview.apply {
8996
webViewClient = MyWebViewClient()
97+
webChromeClient = MyWebChromeClient()
9098
settings.domStorageEnabled = true
9199
settings.javaScriptEnabled = true
92100
settings.allowFileAccess = true // not sure if this is needed
93101
settings.allowContentAccess = true // not sure if this is needed
102+
settings.mediaPlaybackRequiresUserGesture = true // not sure if this is needed
94103
//settings.loadWithOverviewMode = true // prevent loading images zoomed in
95104
//settings.useWideViewPort = true // prevent loading images zoomed in
96105
addJavascriptInterface(WebAppInterface(this@MainActivity), "Android")
@@ -116,13 +125,25 @@ class MainActivity : AppCompatActivity() {
116125
val versionTextView = headerView.findViewById<TextView>(R.id.header_version)
117126
versionTextView.text = "v${versionName}"
118127

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+
119141
val itemPathMap = mapOf(
120142
R.id.nav_item_home to "",
121143
R.id.nav_item_files to "files/",
122144
R.id.nav_item_gallery to "gallery/",
123145
R.id.nav_item_albums to "albums/",
124146
R.id.nav_item_shorts to "shorts/",
125-
R.id.nav_item_stats to "stats/",
126147
R.id.nav_item_settings_user to "settings/user/",
127148
R.id.nav_item_settings_site to "settings/site/",
128149
R.id.nav_item_server_list to "server_list",
@@ -136,10 +157,18 @@ class MainActivity : AppCompatActivity() {
136157
val path = itemPathMap[menuItem.itemId]
137158
Log.d("Drawer", "path: $path")
138159

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")
142166
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+
143172
} else {
144173
Log.d("Drawer", "currentUrl: $currentUrl")
145174
val url = "${currentUrl}/${path}"
@@ -151,7 +180,7 @@ class MainActivity : AppCompatActivity() {
151180
}
152181
}
153182
drawerLayout.closeDrawers()
154-
true
183+
false
155184
}
156185

157186
// Handle Intent
@@ -261,7 +290,6 @@ class MainActivity : AppCompatActivity() {
261290
if (webViewUrl == null) {
262291
Log.d("handleIntent", "binding.webview.url: ${binding.webview.url}")
263292
Log.d("handleIntent", "binding.webview.apply")
264-
//binding.webview.loadUrl(savedUrl)
265293
if (savedInstanceState != null) {
266294
Log.d("handleIntent", "----- restoreState: ${savedInstanceState.size()}")
267295
binding.webview.restoreState(savedInstanceState)
@@ -690,4 +718,49 @@ class MainActivity : AppCompatActivity() {
690718
}
691719
}
692720
}
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+
}
693766
}

app/src/main/res/menu/drawer_menu.xml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@
2222
android:id="@+id/nav_item_shorts"
2323
android:icon="@drawable/fa_link"
2424
android:title="Shorts" />
25+
</group>
26+
27+
<group android:id="@+id/nav_utilities">
2528
<item
26-
android:id="@+id/nav_item_stats"
27-
android:icon="@drawable/fa_chart_line"
28-
android:title="Stats" />
29+
android:id="@+id/nav_item_upload"
30+
android:icon="@drawable/fa_upload"
31+
android:title="Upload File" />
2932
</group>
3033

3134
<group android:id="@+id/nav_settings">

0 commit comments

Comments
 (0)