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