forked from WHC/Hermit
android: read the activity's own arguments, since Qt does not deliver them
`am start -n <pkg>/org.qtproject.qt.android.bindings.QtActivity --esa applicationArguments "--workspace,/sdcard/x"` left the window on its default workspace on the NX789J (the plain-string extra too), so the extra is read from the intent directly. That is what makes `cst-agent-app --uitest --workspace DIR` reachable on a device with no keyboard -- and adb cannot inject touch into this window either (tap, touchscreen tap, mouse tap and motionevent all do nothing; key events do work), so it is the only way in. Everything degrades to "no arguments": an invalid object, a missing method or a context that is not an activity all come back empty.
This commit is contained in:
@@ -97,6 +97,12 @@ bool hasAllFilesAccess();
|
|||||||
* dialog for it). A desktop, a phone that already has it or one too old to
|
* dialog for it). A desktop, a phone that already has it or one too old to
|
||||||
* know about it returns "" and nothing opens. */
|
* know about it returns "" and nothing opens. */
|
||||||
QString requestAllFilesAccess();
|
QString requestAllFilesAccess();
|
||||||
|
/* The arguments the Android activity was started with (the
|
||||||
|
* "applicationArguments" intent extra): the way
|
||||||
|
* `cst-agent-app --uitest --workspace DIR` is reachable on a device, since
|
||||||
|
* Qt's own plumbing for that extra does not reach this build. Empty
|
||||||
|
* everywhere else, and empty on a device that was not started with any. */
|
||||||
|
QStringList activityArguments();
|
||||||
|
|
||||||
} // namespace app
|
} // namespace app
|
||||||
|
|
||||||
|
|||||||
+10
-1
@@ -199,7 +199,16 @@ int main(int argc, char **argv) {
|
|||||||
parser.addOption(planOpt);
|
parser.addOption(planOpt);
|
||||||
parser.addOption(uitestOpt);
|
parser.addOption(uitestOpt);
|
||||||
parser.addOption(sizeOpt);
|
parser.addOption(sizeOpt);
|
||||||
parser.process(app);
|
/* What the process was started with, plus -- on a phone -- what the
|
||||||
|
* activity was started with: Qt's own applicationArguments plumbing does
|
||||||
|
* not deliver the extra on the NX789J (see activityArguments()), and
|
||||||
|
* without it there is no way to hand this window a workspace or a --uitest
|
||||||
|
* run on a device that has no keyboard. */
|
||||||
|
QStringList args = QCoreApplication::arguments();
|
||||||
|
#if defined(Q_OS_ANDROID)
|
||||||
|
args += app::activityArguments();
|
||||||
|
#endif
|
||||||
|
parser.process(args);
|
||||||
|
|
||||||
QString ws = parser.value(wsOpt);
|
QString ws = parser.value(wsOpt);
|
||||||
if (ws.isEmpty()) {
|
if (ws.isEmpty()) {
|
||||||
|
|||||||
@@ -101,6 +101,41 @@ QJniObject appContext() {
|
|||||||
return QNativeInterface::QAndroidApplication::context();
|
return QNativeInterface::QAndroidApplication::context();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The strings the activity was started with. Qt is meant to hand the
|
||||||
|
* "applicationArguments" extra to QCoreApplication::arguments() by itself; on
|
||||||
|
* the NX789J it does not -- `am start ... --esa applicationArguments
|
||||||
|
* "--workspace,/sdcard/x"` left the window on its default workspace, and so
|
||||||
|
* did the same extra as a plain string. So the intent is asked directly, which
|
||||||
|
* is what makes `cst-agent-app --uitest --workspace DIR` (or any other
|
||||||
|
* argument) reachable on a device with no keyboard attached.
|
||||||
|
*
|
||||||
|
* Everything here degrades to "no arguments": an invalid object, a missing
|
||||||
|
* method, or a context that is not an activity all come back empty. */
|
||||||
|
QStringList intentArguments() {
|
||||||
|
QStringList out;
|
||||||
|
QJniObject activity = appContext();
|
||||||
|
if (!activity.isValid())
|
||||||
|
return out;
|
||||||
|
QJniObject intent =
|
||||||
|
activity.callObjectMethod("getIntent", "()Landroid/content/Intent;");
|
||||||
|
if (!intent.isValid())
|
||||||
|
return out;
|
||||||
|
QJniObject list = intent.callObjectMethod(
|
||||||
|
"getStringArrayListExtra", "(Ljava/lang/String;)Ljava/util/ArrayList;",
|
||||||
|
QJniObject::fromString(QStringLiteral("applicationArguments"))
|
||||||
|
.object<jstring>());
|
||||||
|
if (!list.isValid())
|
||||||
|
return out;
|
||||||
|
const jint n = list.callMethod<jint>("size", "()I");
|
||||||
|
for (jint i = 0; i < n; i++) {
|
||||||
|
QJniObject item =
|
||||||
|
list.callObjectMethod("get", "(I)Ljava/lang/Object;", i);
|
||||||
|
if (item.isValid())
|
||||||
|
out << item.toString();
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
/* --- notification_send --------------------------------------------------- */
|
/* --- notification_send --------------------------------------------------- */
|
||||||
|
|
||||||
/* Android 13 (API 33) put notifications behind a runtime permission; before
|
/* Android 13 (API 33) put notifications behind a runtime permission; before
|
||||||
@@ -516,6 +551,11 @@ cst_tool_def_t g_share;
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
/* What main() asks for (ToolProvider.h): the reading itself is the JNI helper
|
||||||
|
* above, next to the Android context it needs. It sits outside the anonymous
|
||||||
|
* namespace so main.cpp can link to it. */
|
||||||
|
QStringList activityArguments() { return intentArguments(); }
|
||||||
|
|
||||||
/* A file card's "open": whatever app the phone has for the type, with the read
|
/* A file card's "open": whatever app the phone has for the type, with the read
|
||||||
* permission granted to the app that picks it up. */
|
* permission granted to the app that picks it up. */
|
||||||
QString openLocalFile(const QString &path, const QString &title,
|
QString openLocalFile(const QString &path, const QString &title,
|
||||||
|
|||||||
Reference in New Issue
Block a user