Warning, /graphics/krita/3rdparty/ext_qt/0023-Android-Workarounds-to-explicitly-handle-content-URI.patch is written in an unsupported language. File is not indexed.
0001 From 322a87d0da30456f7141de5d801561e9a30b3770 Mon Sep 17 00:00:00 2001 0002 From: Sharaf Zaman <sharafzaz121@gmail.com> 0003 Date: Mon, 21 Sep 2020 12:05:19 +0000 0004 Subject: [PATCH] Android: Workarounds to explicitly handle content URIs 0005 0006 On Android we can't reliably get fileName, suffix etc 0007 from the Uri of the path, so we need to use ContentResolver 0008 to handle them explicitly for such Uris 0009 --- 0010 src/corelib/io/qfileinfo.cpp | 31 +++++++++++++++++-- 0011 src/corelib/io/qurl.cpp | 22 +++++++++++++ 0012 .../android/androidcontentfileengine.cpp | 10 ++++++ 0013 .../android/androidcontentfileengine.h | 1 + 0014 .../qandroidplatformfiledialoghelper.cpp | 6 ++-- 0015 5 files changed, 63 insertions(+), 7 deletions(-) 0016 0017 diff --git a/src/corelib/io/qfileinfo.cpp b/src/corelib/io/qfileinfo.cpp 0018 index 189b704b51..cda09d7d36 100644 0019 --- a/src/corelib/io/qfileinfo.cpp 0020 +++ b/src/corelib/io/qfileinfo.cpp 0021 @@ -592,6 +592,11 @@ QString QFileInfo::absolutePath() const 0022 if (d->isDefaultConstructed) { 0023 return QLatin1String(""); 0024 } 0025 +#ifdef Q_OS_ANDROID 0026 + if (d->fileEntry.filePath().startsWith(QLatin1String("content://")) && d->fileEngine) { 0027 + return QLatin1String(""); 0028 + } 0029 +#endif 0030 return d->getFileName(QAbstractFileEngine::AbsolutePathName); 0031 } 0032 0033 @@ -758,7 +763,7 @@ QString QFileInfo::fileName() const 0034 if (d->isDefaultConstructed) 0035 return QLatin1String(""); 0036 #ifdef Q_OS_ANDROID 0037 - if (d->fileEntry.filePath().startsWith("content:") && d->fileEngine) { 0038 + if (d->fileEntry.filePath().startsWith(QLatin1String("content://")) && d->fileEngine) { 0039 QString fname = d->fileEngine->fileName(); 0040 return fname; 0041 } 0042 @@ -807,6 +812,12 @@ QString QFileInfo::baseName() const 0043 Q_D(const QFileInfo); 0044 if (d->isDefaultConstructed) 0045 return QLatin1String(""); 0046 +#ifdef Q_OS_ANDROID 0047 + if (d->fileEntry.filePath().startsWith(QLatin1String("content://")) && d->fileEngine) { 0048 + QString fname = d->fileEngine->fileName(); 0049 + return QFileInfo(fname).baseName(); 0050 + } 0051 +#endif 0052 return d->fileEntry.baseName(); 0053 } 0054 0055 @@ -826,6 +837,12 @@ QString QFileInfo::completeBaseName() const 0056 Q_D(const QFileInfo); 0057 if (d->isDefaultConstructed) 0058 return QLatin1String(""); 0059 +#ifdef Q_OS_ANDROID 0060 + if (d->fileEntry.filePath().startsWith(QLatin1String("content://")) && d->fileEngine) { 0061 + QString fname = d->fileEngine->fileName(); 0062 + return QFileInfo(fname).completeBaseName(); 0063 + } 0064 +#endif 0065 return d->fileEntry.completeBaseName(); 0066 } 0067 0068 @@ -845,6 +862,12 @@ QString QFileInfo::completeSuffix() const 0069 Q_D(const QFileInfo); 0070 if (d->isDefaultConstructed) 0071 return QLatin1String(""); 0072 +#ifdef Q_OS_ANDROID 0073 + if (d->fileEntry.filePath().startsWith(QLatin1String("content://")) && d->fileEngine) { 0074 + QString fname = fileName(); 0075 + return QFileInfo(fname).completeSuffix(); 0076 + } 0077 +#endif 0078 return d->fileEntry.completeSuffix(); 0079 } 0080 0081 @@ -870,8 +893,10 @@ QString QFileInfo::suffix() const 0082 return QLatin1String(""); 0083 0084 #ifdef Q_OS_ANDROID 0085 - QString fname = fileName(); 0086 - return fname.split(".").last(); 0087 + if (d->fileEntry.filePath().startsWith(QLatin1String("content://")) && d->fileEngine) { 0088 + QString fname = fileName(); 0089 + return QFileInfo(fname).suffix(); 0090 + } 0091 #endif 0092 return d->fileEntry.suffix(); 0093 } 0094 diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp 0095 index 6d82981fd6..d834ffe225 100644 0096 --- a/src/corelib/io/qurl.cpp 0097 +++ b/src/corelib/io/qurl.cpp 0098 @@ -445,6 +445,11 @@ static inline QString webDavScheme() 0099 return QStringLiteral("webdavs"); 0100 } 0101 0102 +static inline QString contentScheme() 0103 +{ 0104 + return QStringLiteral("content"); 0105 +} 0106 + 0107 static inline QString webDavSslTag() 0108 { 0109 return QStringLiteral("@SSL"); 0110 @@ -1021,6 +1026,9 @@ inline bool QUrlPrivate::setScheme(const QString &value, int len, bool doSetErro 0111 if (scheme == fileScheme() 0112 #ifdef Q_OS_WIN 0113 || scheme == webDavScheme() 0114 +#endif 0115 +#ifdef Q_OS_ANDROID 0116 + || scheme == contentScheme() 0117 #endif 0118 ) { 0119 flags |= IsLocalFile; 0120 @@ -2641,6 +2649,11 @@ QString QUrl::path(ComponentFormattingOptions options) const 0121 */ 0122 QString QUrl::fileName(ComponentFormattingOptions options) const 0123 { 0124 +#ifdef Q_OS_ANDROID 0125 + if (scheme() == contentScheme()) { 0126 + return QFileInfo(toString()).fileName(); 0127 + } 0128 +#endif 0129 const QString ourPath = path(options); 0130 const int slash = ourPath.lastIndexOf(QLatin1Char('/')); 0131 if (slash == -1) 0132 @@ -3845,6 +3858,11 @@ QUrl QUrl::fromLocalFile(const QString &localFile) 0133 QUrl url; 0134 if (localFile.isEmpty()) 0135 return url; 0136 +#ifdef Q_OS_ANDROID 0137 + if (localFile.startsWith(QLatin1String("content://"))) { 0138 + return localFile; 0139 + } 0140 +#endif 0141 QString scheme = fileScheme(); 0142 QString deslashified = QDir::fromNativeSeparators(localFile); 0143 0144 @@ -3895,6 +3913,10 @@ QString QUrl::toLocalFile() const 0145 if (!isLocalFile()) 0146 return QString(); 0147 0148 +#ifdef Q_OS_ANDROID 0149 + if (scheme() == contentScheme()) 0150 + return toString(); 0151 +#endif 0152 return d->toLocalFile(QUrl::FullyDecoded); 0153 } 0154 0155 diff --git a/src/plugins/platforms/android/androidcontentfileengine.cpp b/src/plugins/platforms/android/androidcontentfileengine.cpp 0156 index 2c11f5f14a..c367a7e362 100644 0157 --- a/src/plugins/platforms/android/androidcontentfileengine.cpp 0158 +++ b/src/plugins/platforms/android/androidcontentfileengine.cpp 0159 @@ -133,6 +133,16 @@ QString AndroidContentFileEngine::fileName(FileName f) const 0160 } 0161 } 0162 0163 +bool AndroidContentFileEngine::isRelativePath() const 0164 +{ 0165 + if (m_file.startsWith(QLatin1String("content://"))) { 0166 + return false; 0167 + } else { 0168 + // well then it's just a Unix path 0169 + return m_file.length() ? m_file.at(0) != QLatin1Char('/') : true; 0170 + } 0171 +} 0172 + 0173 void AndroidContentFileEngine::setResolvedFileName(const QString& uri) 0174 { 0175 QJNIObjectPrivate resolvedName = QJNIObjectPrivate::callStaticObjectMethod( 0176 diff --git a/src/plugins/platforms/android/androidcontentfileengine.h b/src/plugins/platforms/android/androidcontentfileengine.h 0177 index abf969ba20..6769352ffd 100644 0178 --- a/src/plugins/platforms/android/androidcontentfileengine.h 0179 +++ b/src/plugins/platforms/android/androidcontentfileengine.h 0180 @@ -51,6 +51,7 @@ public: 0181 qint64 size() const override; 0182 FileFlags fileFlags(FileFlags type = FileInfoAll) const override; 0183 QString fileName(FileName file = DefaultName) const override; 0184 + bool isRelativePath() const override; 0185 0186 /// Resolves the URI to the actual filename 0187 void setResolvedFileName(const QString& uri); 0188 diff --git a/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp b/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp 0189 index 6bb3372380..05e4ccbbee 100644 0190 --- a/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp 0191 +++ b/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp 0192 @@ -107,10 +107,8 @@ void QAndroidPlatformFileDialogHelper::takePersistableUriPermission(const QJNIOb 0193 int modeFlags = QJNIObjectPrivate::getStaticField<jint>( 0194 JniIntentClass, "FLAG_GRANT_READ_URI_PERMISSION"); 0195 0196 - if (options()->acceptMode() == QFileDialogOptions::AcceptSave) { 0197 - modeFlags |= QJNIObjectPrivate::getStaticField<jint>( 0198 - JniIntentClass, "FLAG_GRANT_WRITE_URI_PERMISSION"); 0199 - } 0200 + modeFlags |= QJNIObjectPrivate::getStaticField<jint>( 0201 + JniIntentClass, "FLAG_GRANT_WRITE_URI_PERMISSION"); 0202 0203 QJNIObjectPrivate contentResolver = m_activity.callObjectMethod( 0204 "getContentResolver", "()Landroid/content/ContentResolver;"); 0205 -- 0206 2.34.1 0207