Warning, /graphics/krita/3rdparty/ext_qt/0018-Android-fix-mimeTypes-handling-for-file-dialog.patch is written in an unsupported language. File is not indexed.

0001 From 8c9c84aadc8ce613c537e15cd3205b6c78639575 Mon Sep 17 00:00:00 2001
0002 From: Assam Boudjelthia <assam.boudjelthia@qt.io>
0003 Date: Tue, 21 Apr 2020 16:42:44 +0300
0004 Subject: [PATCH 18/46] Android: fix mimeTypes handling for file dialog
0005 
0006 Since Android native file manager supports mimeTypes, I use
0007 QMimeDatabase to get the correct mime type for the nameFilter
0008 used with the file dialog.
0009 
0010 [ChangeLog][Android] Support setting mimetypes and and namefilters for
0011 Android native file dialog.
0012 
0013 Task-number: QTBUG-83089
0014 Change-Id: I46545576dc9b51aa872bb37dbf4fe12b2533bdd9
0015 Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
0016 ---
0017  .../org/qtproject/qt5/android/QtNative.java   |  5 ++
0018  .../qandroidplatformfiledialoghelper.cpp      | 46 ++++++++++++++++---
0019  2 files changed, 45 insertions(+), 6 deletions(-)
0020 
0021 diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
0022 index be089c515d..b838720213 100644
0023 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
0024 +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java
0025 @@ -159,6 +159,11 @@ public class QtNative
0026          }
0027      }
0028  
0029 +    public static String[] getStringArray(String joinedString)
0030 +    {
0031 +        return joinedString.split(",");
0032 +    }
0033 +
0034      private static Uri getUriWithValidPermission(Context context, String uri, String openMode)
0035      {
0036          try {
0037 diff --git a/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp b/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp
0038 index 7b5f2f16f8..2e29a22cf7 100644
0039 --- a/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp
0040 +++ b/src/plugins/platforms/android/qandroidplatformfiledialoghelper.cpp
0041 @@ -42,6 +42,10 @@
0042  #include <androidjnimain.h>
0043  #include <jni.h>
0044  
0045 +#include <QMimeType>
0046 +#include <QMimeDatabase>
0047 +#include <QRegularExpression>
0048 +
0049  QT_BEGIN_NAMESPACE
0050  
0051  namespace QtAndroidFileDialogHelper {
0052 @@ -147,17 +151,47 @@ void QAndroidPlatformFileDialogHelper::setAllowMultipleSelections(bool allowMult
0053                                allowMultipleSelections.object(), allowMultiple);
0054  }
0055  
0056 +QStringList nameFilterExtensions(const QString nameFilters)
0057 +{
0058 +    QStringList ret;
0059 +#if QT_CONFIG(regularexpression)
0060 +    QRegularExpression re("(\\*\\.?\\w*)");
0061 +    QRegularExpressionMatchIterator i = re.globalMatch(nameFilters);
0062 +    while (i.hasNext())
0063 +        ret << i.next().captured(1);
0064 +#endif // QT_CONFIG(regularexpression)
0065 +    ret.removeAll("*");
0066 +    return ret;
0067 +}
0068 +
0069  void QAndroidPlatformFileDialogHelper::setMimeTypes()
0070  {
0071 +    QStringList mimeTypes = options()->mimeTypeFilters();
0072 +    const QString nameFilter = options()->initiallySelectedNameFilter();
0073 +
0074 +    if (mimeTypes.isEmpty() && !nameFilter.isEmpty()) {
0075 +        QMimeDatabase db;
0076 +        for (const QString &filter : nameFilterExtensions(nameFilter))
0077 +            mimeTypes.append(db.mimeTypeForFile(filter).name());
0078 +    }
0079 +
0080 +    QString type = !mimeTypes.isEmpty() ? mimeTypes.at(0) : QLatin1String("*/*");
0081      m_intent.callObjectMethod("setType", "(Ljava/lang/String;)Landroid/content/Intent;",
0082 -                              QJNIObjectPrivate::fromString("*/*").object());
0083 +                              QJNIObjectPrivate::fromString(type).object());
0084 +
0085 +    if (!mimeTypes.isEmpty()) {
0086 +        const QJNIObjectPrivate extraMimeType = QJNIObjectPrivate::getStaticObjectField(
0087 +                JniIntentClass, "EXTRA_MIME_TYPES", "Ljava/lang/String;");
0088 +
0089 +        QJNIObjectPrivate mimeTypesArray = QJNIObjectPrivate::callStaticObjectMethod(
0090 +                "org/qtproject/qt5/android/QtNative",
0091 +                "getStringArray",
0092 +                "(Ljava/lang/String;)[Ljava/lang/String;",
0093 +                QJNIObjectPrivate::fromString(mimeTypes.join(",")).object());
0094  
0095 -    const QJNIObjectPrivate extraMimeType = QJNIObjectPrivate::getStaticObjectField(
0096 -            JniIntentClass, "EXTRA_MIME_TYPES", "Ljava/lang/String;");
0097 -    for (const QString &type : options()->mimeTypeFilters()) {
0098          m_intent.callObjectMethod(
0099 -                "putExtra", "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",
0100 -                extraMimeType.object(), QJNIObjectPrivate::fromString(type).object());
0101 +                "putExtra", "(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/Intent;",
0102 +                extraMimeType.object(), mimeTypesArray.object());
0103      }
0104  }
0105  
0106 -- 
0107 2.33.0
0108