Warning, /graphics/krita/3rdparty/ext_qt/0011-Android-return-the-actual-file-name-the-URI-is-point.patch is written in an unsupported language. File is not indexed.
0001 From 10081871475da0a3888c5b71341a0934d5b4d314 Mon Sep 17 00:00:00 2001 0002 From: Sharaf Zaman <sharafzaz121@gmail.com> 0003 Date: Mon, 1 Jun 2020 00:05:25 +0530 0004 Subject: [PATCH 11/46] Android: return the actual file name the URI is 0005 pointing to 0006 0007 This only manages QFileInfo::filename() and QFileInfo::suffix(). 0008 0009 Change-Id: Iec527e2a6808f04dca25fd17e82e8d2aa7e45cfc 0010 --- 0011 .../org/qtproject/qt5/android/QtNative.java | 26 ++++++++++++ 0012 src/corelib/io/qfileinfo.cpp | 11 +++++ 0013 .../android/androidcontentfileengine.cpp | 42 ++++++++++++++----- 0014 .../android/androidcontentfileengine.h | 5 ++- 0015 4 files changed, 72 insertions(+), 12 deletions(-) 0016 0017 diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java 0018 index d443b3fbc8..be089c515d 100644 0019 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java 0020 +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java 0021 @@ -295,6 +295,32 @@ public class QtNative 0022 } 0023 } 0024 0025 + public static String getFileNameFromUri(Context context, String contentUrl) 0026 + { 0027 + Uri uri = getUriWithValidPermission(context, contentUrl, "r"); 0028 + if (uri == null) { 0029 + Log.e(QtTAG, "getFileNameFromUri(): No permissions to open Uri"); 0030 + return null; 0031 + } 0032 + 0033 + String filename = null; 0034 + try { 0035 + Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); 0036 + if (cursor != null) { 0037 + if (cursor.moveToFirst()) { 0038 + filename = cursor.getString(cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME)); 0039 + } 0040 + cursor.close(); 0041 + } 0042 + } catch (IllegalArgumentException e) { 0043 + Log.e(QtTAG, "getFileNameFromUri(): Couldn't get filename: " + e.getMessage()); 0044 + } catch (UnsupportedOperationException e) { 0045 + Log.e(QtTAG, "getFileNameFromUri(): UnsupportedOperation on the Uri: " + e.getMessage()); 0046 + } 0047 + 0048 + return filename; 0049 + } 0050 + 0051 // this method loads full path libs 0052 public static void loadQtLibraries(final ArrayList<String> libraries) 0053 { 0054 diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp 0055 index 185e061d8f..189b704b51 100644 0056 --- a/src/corelib/io/qfileinfo.cpp 0057 +++ b/src/corelib/io/qfileinfo.cpp 0058 @@ -757,6 +757,12 @@ QString QFileInfo::fileName() const 0059 Q_D(const QFileInfo); 0060 if (d->isDefaultConstructed) 0061 return QLatin1String(""); 0062 +#ifdef Q_OS_ANDROID 0063 + if (d->fileEntry.filePath().startsWith("content:") && d->fileEngine) { 0064 + QString fname = d->fileEngine->fileName(); 0065 + return fname; 0066 + } 0067 +#endif 0068 return d->fileEntry.fileName(); 0069 } 0070 0071 @@ -862,6 +868,11 @@ QString QFileInfo::suffix() const 0072 Q_D(const QFileInfo); 0073 if (d->isDefaultConstructed) 0074 return QLatin1String(""); 0075 + 0076 +#ifdef Q_OS_ANDROID 0077 + QString fname = fileName(); 0078 + return fname.split(".").last(); 0079 +#endif 0080 return d->fileEntry.suffix(); 0081 } 0082 0083 diff --git a/src/plugins/platforms/android/androidcontentfileengine.cpp b/src/plugins/platforms/android/androidcontentfileengine.cpp 0084 index 3e3bdc2592..c15352d60e 100644 0085 --- a/src/plugins/platforms/android/androidcontentfileengine.cpp 0086 +++ b/src/plugins/platforms/android/androidcontentfileengine.cpp 0087 @@ -45,9 +45,10 @@ 0088 #include <QDebug> 0089 0090 AndroidContentFileEngine::AndroidContentFileEngine(const QString &f) 0091 - : m_file(f) 0092 + : m_file(f), m_resolvedName(QString()) 0093 { 0094 setFileName(f); 0095 + setResolvedFileName(f); 0096 } 0097 0098 bool AndroidContentFileEngine::open(QIODevice::OpenMode openMode) 0099 @@ -69,7 +70,7 @@ bool AndroidContentFileEngine::open(QIODevice::OpenMode openMode) 0100 "openFdForContentUrl", 0101 "(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)I", 0102 QtAndroidPrivate::context(), 0103 - QJNIObjectPrivate::fromString(fileName(DefaultName)).object(), 0104 + QJNIObjectPrivate::fromString(m_file).object(), 0105 QJNIObjectPrivate::fromString(openModeStr).object()); 0106 0107 if (fd < 0) { 0108 @@ -84,7 +85,7 @@ qint64 AndroidContentFileEngine::size() const 0109 const jlong size = QJNIObjectPrivate::callStaticMethod<jlong>( 0110 "org/qtproject/qt5/android/QtNative", "getSize", 0111 "(Landroid/content/Context;Ljava/lang/String;)J", QtAndroidPrivate::context(), 0112 - QJNIObjectPrivate::fromString(fileName(DefaultName)).object()); 0113 + QJNIObjectPrivate::fromString(m_file).object()); 0114 return (qint64)size; 0115 } 0116 0117 @@ -95,7 +96,7 @@ AndroidContentFileEngine::FileFlags AndroidContentFileEngine::fileFlags(FileFlag 0118 const bool exists = QJNIObjectPrivate::callStaticMethod<jboolean>( 0119 "org/qtproject/qt5/android/QtNative", "checkFileExists", 0120 "(Landroid/content/Context;Ljava/lang/String;)Z", QtAndroidPrivate::context(), 0121 - QJNIObjectPrivate::fromString(fileName(DefaultName)).object()); 0122 + QJNIObjectPrivate::fromString(m_file).object()); 0123 if (!exists) 0124 return flags; 0125 flags = FileType | commonFlags; 0126 @@ -105,23 +106,42 @@ AndroidContentFileEngine::FileFlags AndroidContentFileEngine::fileFlags(FileFlag 0127 QString AndroidContentFileEngine::fileName(FileName f) const 0128 { 0129 switch (f) { 0130 + case DefaultName: { 0131 + return m_resolvedName; 0132 + } 0133 case PathName: 0134 - case AbsolutePathName: 0135 - case CanonicalPathName: 0136 - case DefaultName: 0137 case AbsoluteName: 0138 + case AbsolutePathName: 0139 case CanonicalName: 0140 + case CanonicalPathName: 0141 return m_file; 0142 - case BaseName: 0143 - { 0144 - const int pos = m_file.lastIndexOf(QChar(QLatin1Char('/'))); 0145 - return m_file.mid(pos); 0146 + 0147 + case BaseName: { 0148 + const int pos = m_resolvedName.lastIndexOf(QChar(QLatin1Char('/'))); 0149 + return m_resolvedName.mid(pos); 0150 } 0151 default: 0152 return QString(); 0153 } 0154 } 0155 0156 +void AndroidContentFileEngine::setResolvedFileName(const QString& uri) 0157 +{ 0158 + QJNIObjectPrivate resolvedName = QJNIObjectPrivate::callStaticObjectMethod( 0159 + "org/qtproject/qt5/android/QtNative", 0160 + "getFileNameFromUri", 0161 + "(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String;", 0162 + QtAndroidPrivate::context(), 0163 + QJNIObjectPrivate::fromString(uri).object()); 0164 + 0165 + if (resolvedName.isValid()) { 0166 + m_resolvedName = resolvedName.toString(); 0167 + } else { 0168 + qWarning("setResolvedFileName: Couldn't resolve the URI"); 0169 + } 0170 +} 0171 + 0172 + 0173 AndroidContentFileEngineHandler::AndroidContentFileEngineHandler() = default; 0174 AndroidContentFileEngineHandler::~AndroidContentFileEngineHandler() = default; 0175 0176 diff --git a/src/plugins/platforms/android/androidcontentfileengine.h b/src/plugins/platforms/android/androidcontentfileengine.h 0177 index 09e5d77553..bb97bd6975 100644 0178 --- a/src/plugins/platforms/android/androidcontentfileengine.h 0179 +++ b/src/plugins/platforms/android/androidcontentfileengine.h 0180 @@ -50,9 +50,12 @@ public: 0181 qint64 size() const override; 0182 FileFlags fileFlags(FileFlags type = FileInfoAll) const override; 0183 QString fileName(FileName file = DefaultName) const override; 0184 + 0185 + /// Resolves the URI to the actual filename 0186 + void setResolvedFileName(const QString& uri); 0187 private: 0188 QString m_file; 0189 - 0190 + QString m_resolvedName; 0191 }; 0192 0193 class AndroidContentFileEngineHandler : public QAbstractFileEngineHandler 0194 -- 0195 2.33.0 0196