Android: fix mimetype/namefilters handling for FileDialog
Android file dialog uses setType() to set the main mimetype for the dialog if no mimetype or multiple (+1) mimetypes are provided, then the additional mimetypes can be provided via EXTRA_MIME_TYPES flag. The problem was that the mimetypes deduction from the namefilters was: * the namefilter used was empty, now we take the first item nameFilters(), because mimetypes cannot be changed once the dialog is open anyway. * The regex extraction was getting a namefilter ending with an empty char and that was giving a mimetype of any format thus making it show all possible files. Fixes: QTBUG-83089 Change-Id: Ifaef40c2186732ad3a604d28e086409c35dafacf Reviewed-by: Rami Potinkara <rami.potinkara@qt.io> Reviewed-by: Andy Shaw <andy.shaw@qt.io> (cherry picked from commit ed431caa27672427d28f8ecde667a3a064ddda7e) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
078559a6ea
commit
6b136c7781
@ -148,10 +148,10 @@ QStringList nameFilterExtensions(const QString nameFilters)
|
||||
{
|
||||
QStringList ret;
|
||||
#if QT_CONFIG(regularexpression)
|
||||
QRegularExpression re("(\\*\\.?\\w*)");
|
||||
QRegularExpression re("(\\*\\.[a-z .]+)");
|
||||
QRegularExpressionMatchIterator i = re.globalMatch(nameFilters);
|
||||
while (i.hasNext())
|
||||
ret << i.next().captured(1);
|
||||
ret << i.next().captured(1).trimmed();
|
||||
#endif // QT_CONFIG(regularexpression)
|
||||
ret.removeAll("*");
|
||||
return ret;
|
||||
@ -160,23 +160,24 @@ QStringList nameFilterExtensions(const QString nameFilters)
|
||||
void QAndroidPlatformFileDialogHelper::setMimeTypes()
|
||||
{
|
||||
QStringList mimeTypes = options()->mimeTypeFilters();
|
||||
const QString nameFilter = options()->initiallySelectedNameFilter();
|
||||
const QStringList nameFilters = options()->nameFilters();
|
||||
const QString nameFilter = nameFilters.isEmpty() ? QString() : nameFilters.first();
|
||||
|
||||
if (mimeTypes.isEmpty() && !nameFilter.isEmpty()) {
|
||||
if (!nameFilter.isEmpty()) {
|
||||
QMimeDatabase db;
|
||||
for (const QString &filter : nameFilterExtensions(nameFilter))
|
||||
mimeTypes.append(db.mimeTypeForFile(filter).name());
|
||||
mimeTypes.append(db.mimeTypeForFile(filter, QMimeDatabase::MatchExtension).name());
|
||||
}
|
||||
|
||||
QString type = !mimeTypes.isEmpty() ? mimeTypes.at(0) : QLatin1String("*/*");
|
||||
const QString initialType = mimeTypes.size() == 1 ? mimeTypes.at(0) : QLatin1String("*/*");
|
||||
m_intent.callObjectMethod("setType", "(Ljava/lang/String;)Landroid/content/Intent;",
|
||||
QJniObject::fromString(type).object());
|
||||
QJniObject::fromString(initialType).object());
|
||||
|
||||
if (!mimeTypes.isEmpty()) {
|
||||
const QJniObject extraMimeType = QJniObject::getStaticObjectField(
|
||||
JniIntentClass, "EXTRA_MIME_TYPES", "Ljava/lang/String;");
|
||||
|
||||
QJniObject mimeTypesArray = QJniObject::callStaticObjectMethod(
|
||||
const QJniObject mimeTypesArray = QJniObject::callStaticObjectMethod(
|
||||
"org/qtproject/qt/android/QtNative",
|
||||
"getStringArray",
|
||||
"(Ljava/lang/String;)[Ljava/lang/String;",
|
||||
|
Loading…
x
Reference in New Issue
Block a user