From 7bcd8352819de0538198a0e41e4a451eae0d85ea Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Tue, 15 Apr 2025 19:05:14 -0700 Subject: [PATCH 1/6] Parse Intent.EXTRA_TEXT and Use requireArguments() for URI --- app/src/main/java/org/cssnr/zipline/MainActivity.kt | 3 +++ app/src/main/java/org/cssnr/zipline/PreviewFragment.kt | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index 9333d38..36b1afc 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -192,6 +192,9 @@ class MainActivity : AppCompatActivity() { Log.d("handleIntent", "intent.type: ${intent.type}") Log.d("handleIntent", "intent.action: ${intent.action}") + val extraText = intent.getStringExtra(Intent.EXTRA_TEXT) + Log.d("handleIntent", "extraText: $extraText") + val sharedPreferences = getSharedPreferences("default_preferences", MODE_PRIVATE) val ziplineUrl = sharedPreferences.getString("ziplineUrl", null) val ziplineToken = sharedPreferences.getString("ziplineToken", null) diff --git a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt index 5b71604..06a4377 100644 --- a/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/PreviewFragment.kt @@ -50,16 +50,22 @@ class PreviewFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { Log.d("onViewCreated", "savedInstanceState: $savedInstanceState") + Log.d("onViewCreated", "arguments: $arguments") - val uri = arguments?.getString("uri")?.toUri() + //val uri = arguments?.getString("uri")?.toUri() + val uri = requireArguments().getString("uri")?.toUri() Log.d("onViewCreated", "uri: $uri") + val type = arguments?.getString("type") Log.d("onViewCreated", "type: $type") + //val text = arguments?.getString("text") + //Log.d("onViewCreated", "text: $text") + if (uri == null) { // TODO: Better Handle this Error Log.e("onViewCreated", "URI is null") - Toast.makeText(requireContext(), "Error Parsing URI!", Toast.LENGTH_LONG).show() + Toast.makeText(requireContext(), "No URI to Process!", Toast.LENGTH_LONG).show() return } From 5fb607139b6dba66f7d87580dc4cbfe6e7e42198 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Tue, 15 Apr 2025 23:10:48 -0700 Subject: [PATCH 2/6] Remove Permissions Request --- app/src/main/AndroidManifest.xml | 4 -- .../java/org/cssnr/zipline/MainActivity.kt | 63 ++++++------------- 2 files changed, 20 insertions(+), 47 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bd02030..fdfc053 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,10 +3,6 @@ xmlns:tools="http://schemas.android.com/tools"> - - - - > private lateinit var filePickerLauncher: ActivityResultLauncher> @@ -51,18 +49,6 @@ class MainActivity : AppCompatActivity() { insets } - permissionLauncher = - registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions -> - val allGranted = permissions.all { it.value } - Log.d("permissionLauncher", "allGranted: $allGranted") - if (allGranted) { - filePickerLauncher.launch(arrayOf("*/*")) - } else { - Log.w("permissionLauncher", "Permission Denied!") - Toast.makeText(this, "Permission Denied!", Toast.LENGTH_LONG).show() - } - } - filePickerLauncher = registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri -> Log.d("filePickerLauncher", "uri: $uri") @@ -72,35 +58,32 @@ class MainActivity : AppCompatActivity() { showPreview(uri, mimeType) } else { Log.w("filePickerLauncher", "No File Selected!") - Toast.makeText(this, "No File Selected!", Toast.LENGTH_LONG).show() + Toast.makeText(this, "No File Selected!", Toast.LENGTH_SHORT).show() } } // Navigation - On Click binding.navigationView.setNavigationItemSelectedListener { menuItem -> - Log.d("setNavigationItemSelectedListener", "menuItem: $menuItem") + Log.d("NavigationDrawer", "menuItem: $menuItem") val currentFragment = supportFragmentManager.findFragmentById(R.id.main) - Log.d("setNavigationItemSelectedListener", "currentFragment: $currentFragment") + Log.d("NavigationDrawer", "currentFragment: $currentFragment") when (menuItem.itemId) { - R.id.nav_item_home -> { - Log.d("setNavigationItemSelectedListener", "nav_item_home") + Log.d("NavigationDrawer", "nav_item_home") val currentFragment = supportFragmentManager.findFragmentById(R.id.main) - Log.d("setNavigationItemSelectedListener", "currentFragment: $currentFragment") + Log.d("NavigationDrawer", "currentFragment: $currentFragment") if (currentFragment !is HomeFragment) { - Log.d("setNavigationItemSelectedListener", "NOT HomeFragment") - + Log.d("NavigationDrawer", "NOT HomeFragment") if (supportFragmentManager.backStackEntryCount > 0) { - Log.i("setNavigationItemSelectedListener", "popBackStack()") + Log.i("NavigationDrawer", "popBackStack()") supportFragmentManager.popBackStack() } else { - Log.i("setNavigationItemSelectedListener", "beginTransaction()") + Log.i("NavigationDrawer", "beginTransaction()") supportFragmentManager.beginTransaction() .replace(R.id.main, HomeFragment()) .commitNow() } - //supportFragmentManager.popBackStack( // null, // FragmentManager.POP_BACK_STACK_INCLUSIVE @@ -115,24 +98,14 @@ class MainActivity : AppCompatActivity() { } R.id.nav_item_upload -> { - Log.d("setNavigationItemSelectedListener", "nav_item_upload") - val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - arrayOf( - Manifest.permission.READ_MEDIA_IMAGES, - Manifest.permission.READ_MEDIA_VIDEO, - Manifest.permission.READ_MEDIA_AUDIO - ) - } else { - arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE) - } - Log.d("setNavigationItemSelectedListener", "permissions: $permissions") - permissionLauncher.launch(permissions) + Log.d("NavigationDrawer", "nav_item_upload") + filePickerLauncher.launch(arrayOf("*/*")) binding.drawerLayout.closeDrawers() false } R.id.nav_item_settings -> { - Log.d("setNavigationItemSelectedListener", "nav_item_settings") + Log.d("NavigationDrawer", "nav_item_settings") supportFragmentManager.beginTransaction() .replace(R.id.main, SettingsFragment()) .addToBackStack(null) @@ -142,26 +115,30 @@ class MainActivity : AppCompatActivity() { true } - else -> false + else -> { + Log.w("NavigationDrawer", "UNKNOWN") + Toast.makeText(this, "Unknown Menu Item!", Toast.LENGTH_LONG).show() + false + } } } // Navigation - Back Button supportFragmentManager.addOnBackStackChangedListener { val currentFragment = supportFragmentManager.findFragmentById(R.id.main) - Log.d("addOnBackStackChangedListener", "currentFragment: $currentFragment") + Log.d("BackStackChanged", "currentFragment: $currentFragment") val itemId = when (currentFragment) { is SettingsFragment -> R.id.nav_item_settings is HomeFragment -> R.id.nav_item_home is PreviewFragment -> View.NO_ID else -> View.NO_ID } - Log.d("addOnBackStackChangedListener", "itemId: $itemId") + Log.d("BackStackChanged", "itemId: $itemId") if (itemId != View.NO_ID) { - Log.d("addOnBackStackChangedListener", "SET isChecked") + Log.d("BackStackChanged", "SET isChecked") binding.navigationView.menu.findItem(itemId)?.isChecked = true } else { - Log.d("addOnBackStackChangedListener", "NOT Checkable") + Log.d("BackStackChanged", "NOT Checkable") //binding.navigationView.menu.setGroupCheckable(0, false, true) binding.navigationView.menu.setGroupCheckable(0, true, true) for (i in 0 until binding.navigationView.menu.size) { From 85417f6f5284c229294c8298cffa649399cb636c Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Tue, 15 Apr 2025 23:16:30 -0700 Subject: [PATCH 3/6] Add WebChromeClient --- .../java/org/cssnr/zipline/HomeFragment.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index f4a88d4..a3559ab 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -3,16 +3,20 @@ package org.cssnr.zipline import android.annotation.SuppressLint import android.content.Context.MODE_PRIVATE import android.content.Intent +import android.net.Uri import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.webkit.ValueCallback +import android.webkit.WebChromeClient import android.webkit.WebResourceError import android.webkit.WebResourceRequest import android.webkit.WebResourceResponse import android.webkit.WebView import android.webkit.WebViewClient +import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.edit import androidx.core.net.toUri import androidx.fragment.app.Fragment @@ -74,6 +78,7 @@ class HomeFragment : Fragment() { binding.webView.apply { webViewClient = MyWebViewClient() + webChromeClient = MyWebChromeClient() settings.domStorageEnabled = true settings.javaScriptEnabled = true settings.allowFileAccess = true @@ -177,4 +182,40 @@ class HomeFragment : Fragment() { Log.d("onReceivedHttpError", "ERROR: " + errorResponse.statusCode) } } + + inner class MyWebChromeClient : WebChromeClient() { + private var filePathCallback: ValueCallback>? = null + + private val fileChooserLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + val clipData = result.data?.clipData + val dataUri = result.data?.data + val uris = when { + clipData != null -> Array(clipData.itemCount) { i -> clipData.getItemAt(i).uri } + dataUri != null -> arrayOf(dataUri) + else -> null + } + Log.d("fileChooserLauncher", "uris: ${uris?.contentToString()}") + filePathCallback?.onReceiveValue(uris) + filePathCallback = null + } + + override fun onShowFileChooser( + view: WebView, + callback: ValueCallback>, + params: FileChooserParams + ): Boolean { + filePathCallback?.onReceiveValue(null) + filePathCallback = callback + return try { + Log.d("onShowFileChooser", "fileChooserLauncher.launch") + fileChooserLauncher.launch(params.createIntent()) + true + } catch (e: Exception) { + Log.w("onShowFileChooser", "Exception: $e") + filePathCallback = null + false + } + } + } } From 034af4c4c9f190a0f649dee4a5414147d984caa6 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Tue, 15 Apr 2025 23:57:27 -0700 Subject: [PATCH 4/6] Add WELCOME HOME BABY Hack --- .../java/org/cssnr/zipline/HomeFragment.kt | 3 +++ .../java/org/cssnr/zipline/MainActivity.kt | 25 +++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt index a3559ab..055e755 100644 --- a/app/src/main/java/org/cssnr/zipline/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/zipline/HomeFragment.kt @@ -24,6 +24,8 @@ import org.cssnr.zipline.databinding.FragmentHomeBinding class HomeFragment : Fragment() { + var currentUrl: String = "" + private var _binding: FragmentHomeBinding? = null private val binding get() = _binding!! @@ -147,6 +149,7 @@ class HomeFragment : Fragment() { override fun doUpdateVisitedHistory(view: WebView, url: String, isReload: Boolean) { Log.d("doUpdateVisitedHistory", "url: $url") + currentUrl = url if (url.endsWith("/auth/login") == true) { Log.d("doUpdateVisitedHistory", "LOGOUT: $url") diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index eed2068..4f89553 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -13,6 +13,7 @@ import androidx.activity.enableEdgeToEdge import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity +import androidx.core.os.bundleOf import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.get @@ -71,8 +72,6 @@ class MainActivity : AppCompatActivity() { when (menuItem.itemId) { R.id.nav_item_home -> { Log.d("NavigationDrawer", "nav_item_home") - val currentFragment = supportFragmentManager.findFragmentById(R.id.main) - Log.d("NavigationDrawer", "currentFragment: $currentFragment") if (currentFragment !is HomeFragment) { Log.d("NavigationDrawer", "NOT HomeFragment") if (supportFragmentManager.backStackEntryCount > 0) { @@ -91,6 +90,28 @@ class MainActivity : AppCompatActivity() { //supportFragmentManager.beginTransaction() // .replace(R.id.main, HomeFragment()) // .commit() + } else { + Log.d("NavigationDrawer", "WELCOME HOME BABY") + //val fragment = supportFragmentManager.findFragmentByTag("HomeFragment") + val fragment = supportFragmentManager.findFragmentById(R.id.main) as? HomeFragment + Log.d("NavigationDrawer", "fragment: $fragment") + val url = fragment?.currentUrl + Log.d("NavigationDrawer", "url: $url") + val sharedPreferences = getSharedPreferences("default_preferences", MODE_PRIVATE) + val ziplineUrl = sharedPreferences.getString("ziplineUrl", null) + Log.d("handleIntent", "ziplineUrl: $ziplineUrl") + if (url != null && ziplineUrl != null){ + val path = url.removePrefix(ziplineUrl) + if (path.startsWith("/u/") || path.startsWith("/view/")) { + val home = HomeFragment() + home.arguments = bundleOf("url" to ziplineUrl) + Log.d("processUpload", "arguments.url: $ziplineUrl") + supportFragmentManager.beginTransaction() + .replace(R.id.main, home) + .commit() + } + } + } binding.navigationView.setCheckedItem(R.id.nav_item_home) binding.drawerLayout.closeDrawers() From 392827ee10043cd4b42730c4ce6efde545f5dbe8 Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Wed, 16 Apr 2025 00:13:13 -0700 Subject: [PATCH 5/6] Cleanup Hack --- .../java/org/cssnr/zipline/MainActivity.kt | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index 4f89553..8dc9ad9 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -73,7 +73,7 @@ class MainActivity : AppCompatActivity() { R.id.nav_item_home -> { Log.d("NavigationDrawer", "nav_item_home") if (currentFragment !is HomeFragment) { - Log.d("NavigationDrawer", "NOT HomeFragment") + Log.d("NavigationDrawer", "NOT ON HomeFragment") if (supportFragmentManager.backStackEntryCount > 0) { Log.i("NavigationDrawer", "popBackStack()") supportFragmentManager.popBackStack() @@ -91,27 +91,23 @@ class MainActivity : AppCompatActivity() { // .replace(R.id.main, HomeFragment()) // .commit() } else { - Log.d("NavigationDrawer", "WELCOME HOME BABY") - //val fragment = supportFragmentManager.findFragmentByTag("HomeFragment") - val fragment = supportFragmentManager.findFragmentById(R.id.main) as? HomeFragment - Log.d("NavigationDrawer", "fragment: $fragment") - val url = fragment?.currentUrl - Log.d("NavigationDrawer", "url: $url") - val sharedPreferences = getSharedPreferences("default_preferences", MODE_PRIVATE) - val ziplineUrl = sharedPreferences.getString("ziplineUrl", null) - Log.d("handleIntent", "ziplineUrl: $ziplineUrl") - if (url != null && ziplineUrl != null){ - val path = url.removePrefix(ziplineUrl) - if (path.startsWith("/u/") || path.startsWith("/view/")) { - val home = HomeFragment() - home.arguments = bundleOf("url" to ziplineUrl) - Log.d("processUpload", "arguments.url: $ziplineUrl") - supportFragmentManager.beginTransaction() - .replace(R.id.main, home) - .commit() - } + Log.d("NavigationDrawer", "ALREADY ON HomeFragment") + val url = currentFragment.currentUrl + Log.d("NavigationDrawer", "currentFragment.currentUrl: $url") + val preferences = getSharedPreferences("default_preferences", MODE_PRIVATE) + val ziplineUrl = preferences.getString("ziplineUrl", null) + Log.d("NavigationDrawer", "ziplineUrl: $ziplineUrl") + val path = url.removePrefix(ziplineUrl!!) + Log.d("NavigationDrawer", "path: $path") + if (path.startsWith("/u/") || path.startsWith("/view/")) { + Log.i("NavigationDrawer", "Reloading HomeFragment!") + val home = HomeFragment() + home.arguments = bundleOf("url" to ziplineUrl) + Log.d("NavigationDrawer", "arguments.url: $ziplineUrl") + supportFragmentManager.beginTransaction() + .replace(R.id.main, home) + .commit() } - } binding.navigationView.setCheckedItem(R.id.nav_item_home) binding.drawerLayout.closeDrawers() From ca786528bd744c3d20d6c6e101e0776594c0d09d Mon Sep 17 00:00:00 2001 From: Shane <6071159+smashedr@users.noreply.github.com> Date: Wed, 16 Apr 2025 00:14:56 -0700 Subject: [PATCH 6/6] Little Water --- app/src/main/java/org/cssnr/zipline/MainActivity.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/cssnr/zipline/MainActivity.kt b/app/src/main/java/org/cssnr/zipline/MainActivity.kt index 8dc9ad9..62f74f8 100644 --- a/app/src/main/java/org/cssnr/zipline/MainActivity.kt +++ b/app/src/main/java/org/cssnr/zipline/MainActivity.kt @@ -94,15 +94,16 @@ class MainActivity : AppCompatActivity() { Log.d("NavigationDrawer", "ALREADY ON HomeFragment") val url = currentFragment.currentUrl Log.d("NavigationDrawer", "currentFragment.currentUrl: $url") - val preferences = getSharedPreferences("default_preferences", MODE_PRIVATE) - val ziplineUrl = preferences.getString("ziplineUrl", null) + val ziplineUrl = getSharedPreferences("default_preferences", MODE_PRIVATE) + .getString("ziplineUrl", null) Log.d("NavigationDrawer", "ziplineUrl: $ziplineUrl") val path = url.removePrefix(ziplineUrl!!) Log.d("NavigationDrawer", "path: $path") if (path.startsWith("/u/") || path.startsWith("/view/")) { Log.i("NavigationDrawer", "Reloading HomeFragment!") - val home = HomeFragment() - home.arguments = bundleOf("url" to ziplineUrl) + val home = HomeFragment().apply { + arguments = bundleOf("url" to ziplineUrl) + } Log.d("NavigationDrawer", "arguments.url: $ziplineUrl") supportFragmentManager.beginTransaction() .replace(R.id.main, home)