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