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