8#include <QtCore/QJniObject>
10#include <QMimeDatabase>
12#include <QRegularExpression>
22#define REQUEST_CODE 1305
44 const QJniObject uri = intent.callObjectMethod(
"getData",
"()Landroid/net/Uri;");
46 takePersistableUriPermission(uri);
56 intent.callObjectMethod(
"getClipData",
"()Landroid/content/ClipData;");
57 if (uriClipData.isValid()) {
58 const int size = uriClipData.callMethod<jint>(
"getItemCount");
59 for (
int i = 0;
i <
size; ++
i) {
61 "getItemAt",
"(I)Landroid/content/ClipData$Item;",
i);
63 QJniObject itemUri =
item.callObjectMethod(
"getUri",
"()Landroid/net/Uri;");
64 takePersistableUriPermission(itemUri);
65 m_selectedFile.
append(itemUri.toString());
75void QAndroidPlatformFileDialogHelper::takePersistableUriPermission(
const QJniObject &uri)
77 int modeFlags = QJniObject::getStaticField<jint>(
81 modeFlags |= QJniObject::getStaticField<jint>(
85 QJniObject contentResolver = m_activity.callObjectMethod(
86 "getContentResolver",
"()Landroid/content/ContentResolver;");
87 contentResolver.callMethod<
void>(
"takePersistableUriPermission",
"(Landroid/net/Uri;I)V",
88 uri.object(), modeFlags);
91void QAndroidPlatformFileDialogHelper::setInitialFileName(
const QString &
title)
93 const QJniObject extraTitle = QJniObject::getStaticObjectField(
95 m_intent.callObjectMethod(
"putExtra",
96 "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",
97 extraTitle.object(), QJniObject::fromString(
title).object());
100void QAndroidPlatformFileDialogHelper::setInitialDirectoryUri(
const QString &
directory)
105 if (QNativeInterface::QAndroidApplication::sdkVersion() < 26)
108 const auto extraInitialUri = QJniObject::getStaticObjectField(
109 "android/provider/DocumentsContract",
"EXTRA_INITIAL_URI",
"Ljava/lang/String;");
110 m_intent.callObjectMethod(
"putExtra",
111 "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;",
112 extraInitialUri.object(),
113 QJniObject::fromString(
directory).object());
116void QAndroidPlatformFileDialogHelper::setOpenableCategory()
118 const QJniObject CATEGORY_OPENABLE = QJniObject::getStaticObjectField(
120 m_intent.callObjectMethod(
"addCategory",
"(Ljava/lang/String;)Landroid/content/Intent;",
121 CATEGORY_OPENABLE.object());
124void QAndroidPlatformFileDialogHelper::setAllowMultipleSelections(
bool allowMultiple)
126 const QJniObject allowMultipleSelections = QJniObject::getStaticObjectField(
128 m_intent.callObjectMethod(
"putExtra",
"(Ljava/lang/String;Z)Landroid/content/Intent;",
129 allowMultipleSelections.object(), allowMultiple);
135#if QT_CONFIG(regularexpression)
139 ret <<
i.next().captured(1).trimmed();
145void QAndroidPlatformFileDialogHelper::setMimeTypes()
157 const QString initialType = mimeTypes.size() == 1 ? mimeTypes.at(0) :
"*/*"_L1;
158 m_intent.callObjectMethod(
"setType",
"(Ljava/lang/String;)Landroid/content/Intent;",
159 QJniObject::fromString(initialType).
object());
161 if (!mimeTypes.isEmpty()) {
162 const QJniObject extraMimeType = QJniObject::getStaticObjectField(
165 const QJniObject mimeTypesArray = QJniObject::callStaticObjectMethod(
166 "org/qtproject/qt/android/QtNative",
168 "(Ljava/lang/String;)[Ljava/lang/String;",
169 QJniObject::fromString(mimeTypes.join(
",")).object());
171 m_intent.callObjectMethod(
172 "putExtra",
"(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/Intent;",
173 extraMimeType.object(), mimeTypesArray.object());
177QJniObject QAndroidPlatformFileDialogHelper::getFileDialogIntent(
const QString &intentType)
179 const QJniObject ACTION_OPEN_DOCUMENT = QJniObject::getStaticObjectField(
182 ACTION_OPEN_DOCUMENT.object());
191 bool isDirDialog =
false;
193 m_selectedFile.
clear();
196 m_intent = getFileDialogIntent(
"ACTION_CREATE_DOCUMENT");
201 switch (
options()->fileMode()) {
204 m_intent = getFileDialogIntent(
"ACTION_OPEN_DOCUMENT_TREE");
208 m_intent = getFileDialogIntent(
"ACTION_OPEN_DOCUMENT");
209 setAllowMultipleSelections(
true);
213 m_intent = getFileDialogIntent(
"ACTION_OPEN_DOCUMENT");
219 setOpenableCategory();
223 setInitialDirectoryUri(m_directory.
toString());
226 m_activity.callMethod<
void>(
"startActivityForResult",
"(Landroid/content/Intent;I)V",
int exec(ProcessEventsFlags flags=AllEvents)
Enters the main event loop and waits until exit() is called.
void exit(int returnCode=0)
Tells the event loop to exit with a return code.
bool isRunning() const
Returns true if the event loop is running; otherwise returns false.
QStringList mimeTypeFilters() const
QList< QUrl > initiallySelectedFiles() const
QStringList nameFilters() const
qsizetype size() const noexcept
void append(parameter_type t)
QObject * parent() const
Returns a pointer to the parent object.
\inmodule QtCore \reentrant
\inmodule QtCore \reentrant
QRegularExpressionMatchIterator globalMatch(const QString &subject, qsizetype offset=0, MatchType matchType=NormalMatch, MatchOptions matchOptions=NoMatchOption) const
Attempts to perform a global match of the regular expression against the given subject string,...
\macro QT_RESTRICTED_CAST_FROM_ASCII
QByteArray toLatin1() const &
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
QString fileName(ComponentFormattingOptions options=FullyDecoded) const
bool isEmpty() const
Returns true if the URL has no data; otherwise returns false.
QString toString(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
list append(new Employee("Blackpool", "Stephen"))
Combined button and popup list for selecting options.
QStringList nameFilterExtensions(const QString nameFilters)
const char JniIntentClass[]
Q_CORE_EXPORT void unregisterActivityResultListener(ActivityResultListener *listener)
Q_CORE_EXPORT void registerActivityResultListener(ActivityResultListener *listener)
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent