From 5c141bb37b9c18403cf44111f1f77634dc412c74 Mon Sep 17 00:00:00 2001 From: Anish Kumar Date: Sun, 15 Feb 2026 18:32:20 +0530 Subject: [PATCH] Fix Android Native File dialog and remove permissions --- export_presets.cfg | 12 ++++++------ src/config_classes/TabData.gd | 2 +- src/ui_parts/editor_scene.tscn | 4 ++-- src/ui_parts/good_file_dialog.gd | 2 +- src/utils/FileUtils.gd | 22 ++++++++-------------- src/utils/Utils.gd | 9 +++++++-- 6 files changed, 25 insertions(+), 26 deletions(-) diff --git a/export_presets.cfg b/export_presets.cfg index 8169a48..e9ca463 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -161,13 +161,13 @@ permissions/process_outgoing_calls=false permissions/read_calendar=false permissions/read_call_log=false permissions/read_contacts=false -permissions/read_external_storage=true +permissions/read_external_storage=false permissions/read_frame_buffer=false permissions/read_history_bookmarks=false permissions/read_input_state=false permissions/read_logs=false permissions/read_media_audio=false -permissions/read_media_images=true +permissions/read_media_images=false permissions/read_media_video=false permissions/read_media_visual_user_selected=false permissions/read_phone_state=false @@ -216,7 +216,7 @@ permissions/write_apn_settings=false permissions/write_calendar=false permissions/write_call_log=false permissions/write_contacts=false -permissions/write_external_storage=true +permissions/write_external_storage=false permissions/write_gservices=false permissions/write_history_bookmarks=false permissions/write_profile=false @@ -391,13 +391,13 @@ permissions/process_outgoing_calls=false permissions/read_calendar=false permissions/read_call_log=false permissions/read_contacts=false -permissions/read_external_storage=true +permissions/read_external_storage=false permissions/read_frame_buffer=false permissions/read_history_bookmarks=false permissions/read_input_state=false permissions/read_logs=false permissions/read_media_audio=false -permissions/read_media_images=true +permissions/read_media_images=false permissions/read_media_video=false permissions/read_media_visual_user_selected=false permissions/read_phone_state=false @@ -446,7 +446,7 @@ permissions/write_apn_settings=false permissions/write_calendar=false permissions/write_call_log=false permissions/write_contacts=false -permissions/write_external_storage=true +permissions/write_external_storage=false permissions/write_gservices=false permissions/write_history_bookmarks=false permissions/write_profile=false diff --git a/src/config_classes/TabData.gd b/src/config_classes/TabData.gd index 498fa5f..a5cec3b 100644 --- a/src/config_classes/TabData.gd +++ b/src/config_classes/TabData.gd @@ -145,7 +145,7 @@ func _sync() -> void: if is_saved(): # The extension is included in the presented name because it's always in the end and can't hide useless info. - presented_name = svg_file_path.get_file() + presented_name = Utils.get_file_name(svg_file_path, false) empty_unsaved = false if OS.has_feature("web"): diff --git a/src/ui_parts/editor_scene.tscn b/src/ui_parts/editor_scene.tscn index 6dcd19e..7e83f17 100644 --- a/src/ui_parts/editor_scene.tscn +++ b/src/ui_parts/editor_scene.tscn @@ -1,8 +1,8 @@ -[gd_scene load_steps=2 format=3 uid="uid://bihwwoedqcyo8"] +[gd_scene format=3 uid="uid://bihwwoedqcyo8"] [ext_resource type="Script" uid="uid://dunoppeuubgd1" path="res://src/ui_parts/editor_scene.gd" id="1_o7lif"] -[node name="EditorScene" type="PanelContainer"] +[node name="EditorScene" type="PanelContainer" unique_id=1706058386] anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 diff --git a/src/ui_parts/good_file_dialog.gd b/src/ui_parts/good_file_dialog.gd index c6167bd..c7bd76f 100644 --- a/src/ui_parts/good_file_dialog.gd +++ b/src/ui_parts/good_file_dialog.gd @@ -292,7 +292,7 @@ func get_save_name() -> String: if selected_file_paths.is_empty() or selected_file_paths[0].get_extension().is_empty(): return default_saved_file else: - return selected_file_paths[0].get_file() + return Utils.get_file_name(selected_file_paths[0], false) # For optimization, only generate the visible files' images. func _setup_file_images() -> void: diff --git a/src/utils/FileUtils.gd b/src/utils/FileUtils.gd index 4c1de58..2c8351f 100644 --- a/src/utils/FileUtils.gd +++ b/src/utils/FileUtils.gd @@ -126,9 +126,6 @@ static func open_xml_export_dialog(xml: String, file_name: String) -> void: ) static func _finish_export(file_path: String, export_data: ImageExportData) -> void: - if not (file_path.contains("/Documents/") or file_path.contains("/Download/")): - OS.alert("Saving is only allowed in the Documents or Download directories.", "Save Failed") - return if file_path.get_extension().is_empty(): file_path += "." + export_data.format @@ -184,13 +181,6 @@ static func open_xml_import_dialog(completion_callback: Callable) -> void: # On web, the completion callback can't use the full file path. static func open_custom_import_dialog(extensions: PackedStringArray, completion_callback: Callable, multi_select := false) -> void: - var permission := "android.permission.READ_MEDIA_IMAGES" - if Configs.current_sdk < 33: - permission = "android.permission.READ_EXTERNAL_STORAGE" - - if not OS.request_permission(permission): - return - var extensions_with_dots := PackedStringArray() for extension in extensions: extensions_with_dots.append("." + extension) @@ -223,9 +213,13 @@ static func open_custom_import_dialog(extensions: PackedStringArray, completion_ # Preprocessing step where all files with wrong extensions are discarded. static func _start_file_import_process(file_paths: PackedStringArray, completion_callback: Callable, allowed_extensions: PackedStringArray, show_incorrect_extension_errors := true) -> void: - if not show_incorrect_extension_errors: + if not file_paths.is_empty() and file_paths[0].begins_with("content://"): + _file_import_proceed(file_paths, completion_callback) + return + + if (not show_incorrect_extension_errors): for i in range(file_paths.size() - 1, -1, -1): - if not Utils.get_lowercase_extension(file_paths[i]) in allowed_extensions: + if (not Utils.get_lowercase_extension(file_paths[i]) in allowed_extensions): file_paths.remove_at(i) if not file_paths.is_empty(): _file_import_proceed(file_paths, completion_callback) @@ -251,7 +245,7 @@ allowed_extensions: PackedStringArray, show_incorrect_extension_errors := true) passed_list = incorrect_extension_file_paths else: error_text += Translator.translate("{file_name} was discarded.").format( - {"file_name": incorrect_extension_file_paths[0].get_file()}) + {"file_name": Utils.get_file_name(incorrect_extension_file_paths[0], false)}) var options_dialog := OptionsDialogScene.instantiate() HandlerGUI.add_dialog(options_dialog) @@ -284,7 +278,7 @@ static func _file_import_proceed(file_paths: PackedStringArray, completion_callb var options_dialog := OptionsDialogScene.instantiate() HandlerGUI.add_dialog(options_dialog) var error := Translator.translate("{file_name} couldn't be opened.").format( - {"file_name": Utils.simplify_file_path(file_path).get_file()}) + {"file_name": Utils.get_file_name(Utils.simplify_file_path(file_path), false)}) if not FileAccess.file_exists(file_path): error += "\n" + Translator.translate("Check if the file still exists in the selected file path.") if not file_paths.is_empty(): diff --git a/src/utils/Utils.gd b/src/utils/Utils.gd index b1d1948..40c7b45 100644 --- a/src/utils/Utils.gd +++ b/src/utils/Utils.gd @@ -30,8 +30,13 @@ static func is_string_upper(string: String) -> bool: static func is_string_lower(string: String) -> bool: return string.to_lower() == string -static func get_file_name(string: String) -> String: - return string.get_file().trim_suffix("." + string.get_extension()) +static func get_file_name(string: String, trim_extension := true) -> String: + if string.begins_with("content://"): + string = string.uri_file_decode() + if trim_extension: + return string.get_file().trim_suffix("." + string.get_extension()) + else: + return string.get_file() static func get_lowercase_extension(string: String) -> String: return string.get_extension().to_lower()