From 1a3ffcc08bc8605bb91ee3029ba187c4c03c321f Mon Sep 17 00:00:00 2001 From: Jan Guegel Date: Thu, 25 Sep 2025 21:43:44 +0200 Subject: [PATCH 01/15] Fix "Replace characters on save as function, FileNotFoundException" #250 --- .../org/fossify/filemanager/activities/SaveAsActivity.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt index 0ee0afb8..cec47f95 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt @@ -36,8 +36,9 @@ class SaveAsActivity : SimpleActivity() { } val source = intent.getParcelableExtra(Intent.EXTRA_STREAM)!! - val filename = getFilenameFromContentUri(source) + val originalFilename = getFilenameFromContentUri(source) ?: source.toString().getFilenameFromPath() + val filename = sanitizeFilename(originalFilename) val mimeType = contentResolver.getType(source) ?: intent.type?.takeIf { it != "*/*" } ?: filename.getMimeType() @@ -66,4 +67,9 @@ class SaveAsActivity : SimpleActivity() { super.onResume() setupToolbar(binding.activitySaveAsToolbar, NavigationIcon.Arrow) } + + fun sanitizeFilename(filename: String): String { + return filename.replace("[/\\\\<>:\"|?*\u0000-\u001F]".toRegex(), "_") + .takeIf { it.isNotBlank() } ?: "unnamed_file" + } } From 0b63f8323a8bb8ddb9dcde818af9a3b72b659be8 Mon Sep 17 00:00:00 2001 From: Jan <4600407+jguegel@users.noreply.github.com> Date: Thu, 25 Sep 2025 21:51:40 +0200 Subject: [PATCH 02/15] Update CHANGELOG.md update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a069d62..600e84f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Fixed - Fixed folders showing up incorrectly as files in copy/move dialog ([#267]) +- Fixed filename error in Save As-Dialog ([#50]) ## [1.2.3] - 2025-09-15 ### Fixed @@ -74,6 +75,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#176]: https://github.com/FossifyOrg/File-Manager/issues/176 [#251]: https://github.com/FossifyOrg/File-Manager/issues/251 [#267]: https://github.com/FossifyOrg/File-Manager/issues/267 +[#250]: https://github.com/FossifyOrg/File-Manager/issues/250 + [Unreleased]: https://github.com/FossifyOrg/File-Manager/compare/1.2.3...HEAD [1.2.3]: https://github.com/FossifyOrg/File-Manager/compare/1.2.2...1.2.3 From 41d05cfdd10617e2ea7eda87e0423fb4fb12b213 Mon Sep 17 00:00:00 2001 From: Jan <4600407+jguegel@users.noreply.github.com> Date: Fri, 26 Sep 2025 08:27:05 +0200 Subject: [PATCH 03/15] Update app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com> --- .../kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt index cec47f95..cd08f527 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt @@ -68,7 +68,7 @@ class SaveAsActivity : SimpleActivity() { setupToolbar(binding.activitySaveAsToolbar, NavigationIcon.Arrow) } - fun sanitizeFilename(filename: String): String { + private fun sanitizeFilename(filename: String): String { return filename.replace("[/\\\\<>:\"|?*\u0000-\u001F]".toRegex(), "_") .takeIf { it.isNotBlank() } ?: "unnamed_file" } From c7f6bf96254d775fee2e637f963b72569d32be84 Mon Sep 17 00:00:00 2001 From: Jan <4600407+jguegel@users.noreply.github.com> Date: Fri, 26 Sep 2025 08:27:21 +0200 Subject: [PATCH 04/15] Update CHANGELOG.md Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 600e84f0..1df68cb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Fixed - Fixed folders showing up incorrectly as files in copy/move dialog ([#267]) -- Fixed filename error in Save As-Dialog ([#50]) +- Fixed error when saving files with unsupported characters ([#250]) ## [1.2.3] - 2025-09-15 ### Fixed From 01a2dbd863af1a0c9da8af2d019dd676020753fd Mon Sep 17 00:00:00 2001 From: Jan <4600407+jguegel@users.noreply.github.com> Date: Fri, 26 Sep 2025 08:27:33 +0200 Subject: [PATCH 05/15] Update CHANGELOG.md Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com> --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1df68cb4..32d11b9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -77,7 +77,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#267]: https://github.com/FossifyOrg/File-Manager/issues/267 [#250]: https://github.com/FossifyOrg/File-Manager/issues/250 - [Unreleased]: https://github.com/FossifyOrg/File-Manager/compare/1.2.3...HEAD [1.2.3]: https://github.com/FossifyOrg/File-Manager/compare/1.2.2...1.2.3 [1.2.2]: https://github.com/FossifyOrg/File-Manager/compare/1.2.0...1.2.2 From 24e156c9f6949a987bc10d7d5146b8b5c5bdf1bf Mon Sep 17 00:00:00 2001 From: Jan Guegel Date: Fri, 26 Sep 2025 13:44:10 +0200 Subject: [PATCH 06/15] Merge branch 'FossifyOrg:main' into main Signed-off-by: Jan Guegel --- .../filemanager/activities/SaveAsActivity.kt | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt index cd08f527..2f1e58e3 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt @@ -1,12 +1,16 @@ package org.fossify.filemanager.activities +import android.annotation.SuppressLint import android.content.Intent import android.net.Uri import android.os.Bundle +import android.os.Environment +import androidx.core.net.toUri import org.fossify.commons.dialogs.FilePickerDialog import org.fossify.commons.extensions.* import org.fossify.commons.helpers.NavigationIcon import org.fossify.commons.helpers.ensureBackgroundThread +import org.fossify.commons.helpers.isRPlus import org.fossify.filemanager.R import org.fossify.filemanager.databinding.ActivitySaveAsBinding import org.fossify.filemanager.extensions.config @@ -15,9 +19,18 @@ import java.io.File class SaveAsActivity : SimpleActivity() { private val binding by viewBinding(ActivitySaveAsBinding::inflate) + companion object { + private const val MANAGE_STORAGE_RC = 201 + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(binding.root) + if (isRPlus() && !Environment.isExternalStorageManager()) { + val intent = Intent(android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) + intent.data = "package:$packageName".toUri() + startActivityForResult(intent, MANAGE_STORAGE_RC) + return + } if (intent.action == Intent.ACTION_SEND && intent.extras?.containsKey(Intent.EXTRA_STREAM) == true) { FilePickerDialog(this, pickFile = false, showHidden = config.shouldShowHidden(), showFAB = true, showFavoritesButton = true) { @@ -72,4 +85,18 @@ class SaveAsActivity : SimpleActivity() { return filename.replace("[/\\\\<>:\"|?*\u0000-\u001F]".toRegex(), "_") .takeIf { it.isNotBlank() } ?: "unnamed_file" } + + @SuppressLint("NewApi") + override fun onActivityResult(requestCode: Int, resultCode: Int, dataIntent: Intent?) { + super.onActivityResult(requestCode, resultCode, dataIntent) + + if (requestCode == MANAGE_STORAGE_RC && isRPlus()) { + if (Environment.isExternalStorageManager()) { + recreate() + } else { + toast(R.string.no_storage_permissions) + finish() + } + } + } } From 21b2aaa0447f50d055c2848369cbba4b85be7355 Mon Sep 17 00:00:00 2001 From: Jan <4600407+jguegel@users.noreply.github.com> Date: Fri, 26 Sep 2025 13:46:30 +0200 Subject: [PATCH 07/15] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32d11b9f..6e350ba5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed folders showing up incorrectly as files in copy/move dialog ([#267]) - Fixed error when saving files with unsupported characters ([#250]) +- Fixed File manager does not ask for file access permission if opened for the first time via "share" dialog ([#85]) ## [1.2.3] - 2025-09-15 ### Fixed @@ -76,6 +77,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#251]: https://github.com/FossifyOrg/File-Manager/issues/251 [#267]: https://github.com/FossifyOrg/File-Manager/issues/267 [#250]: https://github.com/FossifyOrg/File-Manager/issues/250 +[#85]: https://github.com/FossifyOrg/File-Manager/issues/85 [Unreleased]: https://github.com/FossifyOrg/File-Manager/compare/1.2.3...HEAD [1.2.3]: https://github.com/FossifyOrg/File-Manager/compare/1.2.2...1.2.3 From 204c8794ec6f48739ff8abc2f6f36eeb4265dda6 Mon Sep 17 00:00:00 2001 From: Jan Guegel Date: Fri, 26 Sep 2025 15:18:12 +0200 Subject: [PATCH 08/15] fix PR Feedback Signed-off-by: Jan Guegel --- .../org/fossify/filemanager/activities/SaveAsActivity.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt index 2f1e58e3..17237ace 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt @@ -3,8 +3,10 @@ package org.fossify.filemanager.activities import android.annotation.SuppressLint import android.content.Intent import android.net.Uri +import android.os.Build import android.os.Bundle import android.os.Environment +import androidx.annotation.RequiresApi import androidx.core.net.toUri import org.fossify.commons.dialogs.FilePickerDialog import org.fossify.commons.extensions.* @@ -23,14 +25,16 @@ class SaveAsActivity : SimpleActivity() { private const val MANAGE_STORAGE_RC = 201 } + @RequiresApi(Build.VERSION_CODES.R) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - if (isRPlus() && !Environment.isExternalStorageManager()) { + if (!isExternalStorageManager()) { val intent = Intent(android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.data = "package:$packageName".toUri() startActivityForResult(intent, MANAGE_STORAGE_RC) return } + setContentView(binding.root) if (intent.action == Intent.ACTION_SEND && intent.extras?.containsKey(Intent.EXTRA_STREAM) == true) { FilePickerDialog(this, pickFile = false, showHidden = config.shouldShowHidden(), showFAB = true, showFavoritesButton = true) { From 1b67e6111457d04ac7ee46dd054f73794d5b7b23 Mon Sep 17 00:00:00 2001 From: Jan Guegel Date: Fri, 26 Sep 2025 15:31:54 +0200 Subject: [PATCH 09/15] fix duplicated code by moving it to SimpleActivity.kt Signed-off-by: Jan Guegel --- .../filemanager/activities/MainActivity.kt | 10 ---------- .../filemanager/activities/SaveAsActivity.kt | 17 ---------------- .../filemanager/activities/SimpleActivity.kt | 20 +++++++++++++++++++ 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt index 960444ed..3b2617b1 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt @@ -8,7 +8,6 @@ import android.graphics.drawable.Drawable import android.media.RingtoneManager import android.net.Uri import android.os.Bundle -import android.os.Environment import android.os.Handler import android.provider.Settings import android.widget.ImageView @@ -281,15 +280,6 @@ class MainActivity : SimpleActivity() { } } - @SuppressLint("NewApi") - override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { - super.onActivityResult(requestCode, resultCode, resultData) - isAskingPermissions = false - if (requestCode == MANAGE_STORAGE_RC && isRPlus()) { - actionOnPermission?.invoke(Environment.isExternalStorageManager()) - } - } - private fun updateMenuColors() { updateStatusbarColor(getProperBackgroundColor()) binding.mainMenu.updateColors() diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt index 17237ace..97591079 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt @@ -1,18 +1,15 @@ package org.fossify.filemanager.activities -import android.annotation.SuppressLint import android.content.Intent import android.net.Uri import android.os.Build import android.os.Bundle -import android.os.Environment import androidx.annotation.RequiresApi import androidx.core.net.toUri import org.fossify.commons.dialogs.FilePickerDialog import org.fossify.commons.extensions.* import org.fossify.commons.helpers.NavigationIcon import org.fossify.commons.helpers.ensureBackgroundThread -import org.fossify.commons.helpers.isRPlus import org.fossify.filemanager.R import org.fossify.filemanager.databinding.ActivitySaveAsBinding import org.fossify.filemanager.extensions.config @@ -89,18 +86,4 @@ class SaveAsActivity : SimpleActivity() { return filename.replace("[/\\\\<>:\"|?*\u0000-\u001F]".toRegex(), "_") .takeIf { it.isNotBlank() } ?: "unnamed_file" } - - @SuppressLint("NewApi") - override fun onActivityResult(requestCode: Int, resultCode: Int, dataIntent: Intent?) { - super.onActivityResult(requestCode, resultCode, dataIntent) - - if (requestCode == MANAGE_STORAGE_RC && isRPlus()) { - if (Environment.isExternalStorageManager()) { - recreate() - } else { - toast(R.string.no_storage_permissions) - finish() - } - } - } } diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt index a9ff0cba..4543d7df 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt @@ -1,9 +1,11 @@ package org.fossify.filemanager.activities import android.annotation.SuppressLint +import android.content.Intent import android.os.Environment import org.fossify.commons.activities.BaseSimpleActivity import org.fossify.commons.extensions.hasPermission +import org.fossify.commons.extensions.toast import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE import org.fossify.commons.helpers.isRPlus import org.fossify.filemanager.R @@ -31,10 +33,28 @@ open class SimpleActivity : BaseSimpleActivity() { R.mipmap.ic_launcher_grey_black ) + companion object { + private const val MANAGE_STORAGE_RC = 201 + } + override fun getAppLauncherName() = getString(R.string.app_launcher_name) override fun getRepositoryName() = "File-Manager" + @SuppressLint("NewApi") + override fun onActivityResult(requestCode: Int, resultCode: Int, dataIntent: Intent?) { + super.onActivityResult(requestCode, resultCode, dataIntent) + + if (requestCode == MANAGE_STORAGE_RC && isRPlus()) { + if (Environment.isExternalStorageManager()) { + recreate() + } else { + toast(R.string.no_storage_permissions) + finish() + } + } + } + @SuppressLint("NewApi") fun hasStoragePermission(): Boolean { return if (isRPlus()) { From 2a5026e905bde5826f567fb566b5293a0adcfa56 Mon Sep 17 00:00:00 2001 From: Jan Guegel Date: Fri, 26 Sep 2025 16:21:37 +0200 Subject: [PATCH 10/15] moved handleStoragePermissions() to SimpleActivity.kt from MainActivity.kt introduced tryInitFileManager() to SaveAsActivity.kt removed const MANAGE_STORAGE_RC from MainActivity.kt Signed-off-by: Jan Guegel --- .../filemanager/activities/MainActivity.kt | 41 +------------------ .../filemanager/activities/SaveAsActivity.kt | 28 ++++++------- .../filemanager/activities/SimpleActivity.kt | 36 ++++++++++++++++ 3 files changed, 51 insertions(+), 54 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt index 3b2617b1..f9db69fe 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt @@ -1,21 +1,17 @@ package org.fossify.filemanager.activities -import android.annotation.SuppressLint import android.app.Activity import android.content.ClipData import android.content.Intent import android.graphics.drawable.Drawable import android.media.RingtoneManager -import android.net.Uri import android.os.Bundle import android.os.Handler -import android.provider.Settings import android.widget.ImageView import android.widget.TextView import androidx.viewpager.widget.ViewPager import com.stericson.RootTools.RootTools import me.grantland.widget.AutofitHelper -import org.fossify.commons.dialogs.ConfirmationAdvancedDialog import org.fossify.commons.dialogs.RadioGroupDialog import org.fossify.commons.extensions.appLaunched import org.fossify.commons.extensions.appLockManager @@ -42,7 +38,6 @@ import org.fossify.commons.extensions.launchMoreAppsFromUsIntent import org.fossify.commons.extensions.onGlobalLayout import org.fossify.commons.extensions.onTabSelectionChanged import org.fossify.commons.extensions.sdCardPath -import org.fossify.commons.extensions.showErrorToast import org.fossify.commons.extensions.toast import org.fossify.commons.extensions.updateBottomTabItemColors import org.fossify.commons.extensions.viewBinding @@ -58,7 +53,6 @@ import org.fossify.commons.helpers.TAB_RECENT_FILES import org.fossify.commons.helpers.TAB_STORAGE_ANALYSIS import org.fossify.commons.helpers.VIEW_TYPE_GRID import org.fossify.commons.helpers.ensureBackgroundThread -import org.fossify.commons.helpers.isRPlus import org.fossify.commons.models.FAQItem import org.fossify.commons.models.RadioItem import org.fossify.commons.models.Release @@ -83,7 +77,6 @@ import java.io.File class MainActivity : SimpleActivity() { companion object { private const val BACK_PRESS_TIMEOUT = 5000 - private const val MANAGE_STORAGE_RC = 201 private const val PICKED_PATH = "picked_path" } @@ -313,39 +306,7 @@ class MainActivity : SimpleActivity() { } } - @SuppressLint("InlinedApi") - private fun handleStoragePermission(callback: (granted: Boolean) -> Unit) { - actionOnPermission = null - if (hasStoragePermission()) { - callback(true) - } else { - if (isRPlus()) { - ConfirmationAdvancedDialog(this, "", R.string.access_storage_prompt, R.string.ok, 0, false) { success -> - if (success) { - isAskingPermissions = true - actionOnPermission = callback - try { - val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) - intent.addCategory("android.intent.category.DEFAULT") - intent.data = Uri.parse("package:$packageName") - startActivityForResult(intent, MANAGE_STORAGE_RC) - } catch (e: Exception) { - showErrorToast(e) - val intent = Intent() - intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION - startActivityForResult(intent, MANAGE_STORAGE_RC) - } - } else { - finish() - } - } - } else { - handlePermission(PERMISSION_WRITE_STORAGE, callback) - } - } - } - - private fun initFileManager(refreshRecents: Boolean) { + private fun initFileManager(refreshRecents: Boolean) { if (intent.action == Intent.ACTION_VIEW && intent.data != null) { val data = intent.data if (data?.scheme == "file") { diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt index 97591079..520cd5c7 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt @@ -2,10 +2,7 @@ package org.fossify.filemanager.activities import android.content.Intent import android.net.Uri -import android.os.Build import android.os.Bundle -import androidx.annotation.RequiresApi -import androidx.core.net.toUri import org.fossify.commons.dialogs.FilePickerDialog import org.fossify.commons.extensions.* import org.fossify.commons.helpers.NavigationIcon @@ -18,21 +15,24 @@ import java.io.File class SaveAsActivity : SimpleActivity() { private val binding by viewBinding(ActivitySaveAsBinding::inflate) - companion object { - private const val MANAGE_STORAGE_RC = 201 - } - @RequiresApi(Build.VERSION_CODES.R) - override fun onCreate(savedInstanceState: Bundle?) { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - if (!isExternalStorageManager()) { - val intent = Intent(android.provider.Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) - intent.data = "package:$packageName".toUri() - startActivityForResult(intent, MANAGE_STORAGE_RC) - return - } setContentView(binding.root) + tryInitFileManager() + } + private fun tryInitFileManager() { + handleStoragePermission { granted -> + if (granted) { + saveAsDialog() + } else { + toast(R.string.no_storage_permissions) + finish() + } + } + } + private fun saveAsDialog() { if (intent.action == Intent.ACTION_SEND && intent.extras?.containsKey(Intent.EXTRA_STREAM) == true) { FilePickerDialog(this, pickFile = false, showHidden = config.shouldShowHidden(), showFAB = true, showFavoritesButton = true) { val destination = it diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt index 4543d7df..0877feda 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt @@ -2,9 +2,13 @@ package org.fossify.filemanager.activities import android.annotation.SuppressLint import android.content.Intent +import android.net.Uri import android.os.Environment +import android.provider.Settings import org.fossify.commons.activities.BaseSimpleActivity +import org.fossify.commons.dialogs.ConfirmationAdvancedDialog import org.fossify.commons.extensions.hasPermission +import org.fossify.commons.extensions.showErrorToast import org.fossify.commons.extensions.toast import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE import org.fossify.commons.helpers.isRPlus @@ -63,4 +67,36 @@ open class SimpleActivity : BaseSimpleActivity() { hasPermission(PERMISSION_WRITE_STORAGE) } } + + @SuppressLint("InlinedApi") + fun handleStoragePermission(callback: (granted: Boolean) -> Unit) { + actionOnPermission = null + if (hasStoragePermission()) { + callback(true) + } else { + if (isRPlus()) { + ConfirmationAdvancedDialog(this, "", R.string.access_storage_prompt, R.string.ok, 0, false) { success -> + if (success) { + isAskingPermissions = true + actionOnPermission = callback + try { + val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) + intent.addCategory("android.intent.category.DEFAULT") + intent.data = Uri.parse("package:$packageName") + startActivityForResult(intent, MANAGE_STORAGE_RC) + } catch (e: Exception) { + showErrorToast(e) + val intent = Intent() + intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION + startActivityForResult(intent, MANAGE_STORAGE_RC) + } + } else { + finish() + } + } + } else { + handlePermission(PERMISSION_WRITE_STORAGE, callback) + } + } + } } From 588a0464b3bc163941e6aba728415297193d2df4 Mon Sep 17 00:00:00 2001 From: Jan Guegel Date: Fri, 26 Sep 2025 16:37:44 +0200 Subject: [PATCH 11/15] adjusted toast in try catch in storage permission action Signed-off-by: Jan Guegel --- .../org/fossify/filemanager/activities/SimpleActivity.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt index 0877feda..bad686d6 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt @@ -2,7 +2,6 @@ package org.fossify.filemanager.activities import android.annotation.SuppressLint import android.content.Intent -import android.net.Uri import android.os.Environment import android.provider.Settings import org.fossify.commons.activities.BaseSimpleActivity @@ -13,6 +12,7 @@ import org.fossify.commons.extensions.toast import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE import org.fossify.commons.helpers.isRPlus import org.fossify.filemanager.R +import androidx.core.net.toUri open class SimpleActivity : BaseSimpleActivity() { override fun getAppIconIDs() = arrayListOf( @@ -82,10 +82,10 @@ open class SimpleActivity : BaseSimpleActivity() { try { val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.addCategory("android.intent.category.DEFAULT") - intent.data = Uri.parse("package:$packageName") + "package:$packageName".toUri().also { intent.data = it } startActivityForResult(intent, MANAGE_STORAGE_RC) } catch (e: Exception) { - showErrorToast(e) + toast(R.string.no_storage_permissions) val intent = Intent() intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION startActivityForResult(intent, MANAGE_STORAGE_RC) From 0dcf18c01db2a7a8e681346c0c9b90f0d6985fa4 Mon Sep 17 00:00:00 2001 From: Jan Guegel Date: Fri, 26 Sep 2025 16:59:58 +0200 Subject: [PATCH 12/15] catch ActivityNotFoundException with fallback of SecurityException Signed-off-by: Jan Guegel --- .../fossify/filemanager/activities/SimpleActivity.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt index bad686d6..ab6838cb 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt @@ -7,12 +7,12 @@ import android.provider.Settings import org.fossify.commons.activities.BaseSimpleActivity import org.fossify.commons.dialogs.ConfirmationAdvancedDialog import org.fossify.commons.extensions.hasPermission +import android.net.Uri import org.fossify.commons.extensions.showErrorToast import org.fossify.commons.extensions.toast import org.fossify.commons.helpers.PERMISSION_WRITE_STORAGE import org.fossify.commons.helpers.isRPlus import org.fossify.filemanager.R -import androidx.core.net.toUri open class SimpleActivity : BaseSimpleActivity() { override fun getAppIconIDs() = arrayListOf( @@ -82,13 +82,16 @@ open class SimpleActivity : BaseSimpleActivity() { try { val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.addCategory("android.intent.category.DEFAULT") - "package:$packageName".toUri().also { intent.data = it } + intent.data = Uri.parse("package:$packageName") startActivityForResult(intent, MANAGE_STORAGE_RC) - } catch (e: Exception) { - toast(R.string.no_storage_permissions) + } catch (e: android.content.ActivityNotFoundException) { + showErrorToast(e) val intent = Intent() intent.action = Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION startActivityForResult(intent, MANAGE_STORAGE_RC) + } catch (e: SecurityException) { + showErrorToast(e) + finish() } } else { finish() From e76565d9bcfad5da71ce2cac25543e174c1ef81a Mon Sep 17 00:00:00 2001 From: Jan <4600407+jguegel@users.noreply.github.com> Date: Sat, 27 Sep 2025 07:49:37 +0200 Subject: [PATCH 13/15] Apply suggestions from code review thanks for the feedback! Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com> --- .../filemanager/activities/SaveAsActivity.kt | 4 ++-- .../filemanager/activities/SimpleActivity.kt | 15 +++++---------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt index 520cd5c7..0681f30c 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SaveAsActivity.kt @@ -15,8 +15,7 @@ import java.io.File class SaveAsActivity : SimpleActivity() { private val binding by viewBinding(ActivitySaveAsBinding::inflate) - - override fun onCreate(savedInstanceState: Bundle?) { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) tryInitFileManager() @@ -32,6 +31,7 @@ class SaveAsActivity : SimpleActivity() { } } } + private fun saveAsDialog() { if (intent.action == Intent.ACTION_SEND && intent.extras?.containsKey(Intent.EXTRA_STREAM) == true) { FilePickerDialog(this, pickFile = false, showHidden = config.shouldShowHidden(), showFAB = true, showFavoritesButton = true) { diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt index ab6838cb..e98b7a9a 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/SimpleActivity.kt @@ -45,17 +45,12 @@ open class SimpleActivity : BaseSimpleActivity() { override fun getRepositoryName() = "File-Manager" - @SuppressLint("NewApi") - override fun onActivityResult(requestCode: Int, resultCode: Int, dataIntent: Intent?) { - super.onActivityResult(requestCode, resultCode, dataIntent) - + @SuppressLint("NewApi") + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + isAskingPermissions = false if (requestCode == MANAGE_STORAGE_RC && isRPlus()) { - if (Environment.isExternalStorageManager()) { - recreate() - } else { - toast(R.string.no_storage_permissions) - finish() - } + actionOnPermission?.invoke(Environment.isExternalStorageManager()) } } From d6b7efb45f07f88e0393ed747fb01d84c96e99f3 Mon Sep 17 00:00:00 2001 From: Jan Guegel Date: Sat, 27 Sep 2025 07:53:43 +0200 Subject: [PATCH 14/15] remove indent Signed-off-by: Jan Guegel --- .../kotlin/org/fossify/filemanager/activities/MainActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt b/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt index f9db69fe..5331f571 100644 --- a/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt +++ b/app/src/main/kotlin/org/fossify/filemanager/activities/MainActivity.kt @@ -306,7 +306,7 @@ class MainActivity : SimpleActivity() { } } - private fun initFileManager(refreshRecents: Boolean) { + private fun initFileManager(refreshRecents: Boolean) { if (intent.action == Intent.ACTION_VIEW && intent.data != null) { val data = intent.data if (data?.scheme == "file") { From c50e8356e494e7f9f6e87df266ca501f885ccbb7 Mon Sep 17 00:00:00 2001 From: Jan <4600407+jguegel@users.noreply.github.com> Date: Sat, 27 Sep 2025 09:42:41 +0200 Subject: [PATCH 15/15] adjust changelog Co-authored-by: Naveen Singh <36371707+naveensingh@users.noreply.github.com> --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e350ba5..6d48133b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed folders showing up incorrectly as files in copy/move dialog ([#267]) - Fixed error when saving files with unsupported characters ([#250]) -- Fixed File manager does not ask for file access permission if opened for the first time via "share" dialog ([#85]) +- Fixed missing permission prompt on initial "Save as" launch ([#85]) ## [1.2.3] - 2025-09-15 ### Fixed