From d53bbecf4c2565f2e5fd834b20ff90b073a25189 Mon Sep 17 00:00:00 2001 From: Volker Krause Date: Fri, 16 Oct 2020 16:40:49 +0200 Subject: [PATCH] Fix QSaveFile always failing on content: URLs QSaveFile needs QFileInfo::isWritable() to work, which 7e5f38aec667 caused to always return false for content: URLs. Change-Id: If839331e4bd176765ed242791cb253c2064f5f6d Reviewed-by: Assam Boudjelthia --- .../jar/src/org/qtproject/qt/android/QtNative.java | 5 +++++ .../platforms/android/androidcontentfileengine.cpp | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt/android/QtNative.java b/src/android/jar/src/org/qtproject/qt/android/QtNative.java index 40b3a79bf0a..fc4bcddaedf 100644 --- a/src/android/jar/src/org/qtproject/qt/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt/android/QtNative.java @@ -329,6 +329,11 @@ public class QtNative } } + public static boolean checkIfWritable(Context context, String contentUrl) + { + return getUriWithValidPermission(context, contentUrl, "w") != null; + } + public static boolean checkIfDir(Context context, String contentUrl) { boolean isDir = false; diff --git a/src/plugins/platforms/android/androidcontentfileengine.cpp b/src/plugins/platforms/android/androidcontentfileengine.cpp index bdbf2186baa..749ce136b67 100644 --- a/src/plugins/platforms/android/androidcontentfileengine.cpp +++ b/src/plugins/platforms/android/androidcontentfileengine.cpp @@ -103,10 +103,17 @@ AndroidContentFileEngine::FileFlags AndroidContentFileEngine::fileFlags(FileFlag QJNIObjectPrivate::fromString(fileName(DefaultName)).object()); if (!exists && !isDir) return flags; - if (isDir) + if (isDir) { flags = DirectoryType | commonFlags; - else + } else { flags = FileType | commonFlags; + const bool writable = QJNIObjectPrivate::callStaticMethod( + "org/qtproject/qt/android/QtNative", "checkIfWritable", + "(Landroid/content/Context;Ljava/lang/String;)Z", QtAndroidPrivate::context(), + QJNIObjectPrivate::fromString(fileName(DefaultName)).object()); + if (writable) + flags |= WriteOwnerPerm|WriteUserPerm|WriteGroupPerm|WriteOtherPerm; + } return type & flags; }