4#include <QtCore/private/qnapi_p.h>
5#include <QtCore/private/qohoscommon_p.h>
6#include <qohosjsenv_p.h>
7#include <QtCore/qobject.h>
8#include <QtCore/qscopeguard.h>
9#include <QtGui/private/qguiapplication_p.h>
10#include <QtGui/qcolor.h>
11#include <QtGui/qimage.h>
12#include <QtGui/qscreen.h>
13#include <QtGui/qwindow.h>
16#include <filemanagement/file_uri/oh_file_uri.h>
17#include <filemanagement/fileshare/oh_file_share.h>
19#include <info/application_target_sdk_version.h>
21#include <qohosapppermissions_p.h>
22#include <qohosenums.h>
23#include <qohosjsmain.h>
24#include <qohosjsutils.h>
25#include <qohospixelmapconversions.h>
26#include <qohosplatformclipboard.h>
27#include <qohosplatformintegration.h>
28#include <qohosplatformservices.h>
29#include <qohosplatformwindow.h>
30#include <qohosplugincore.h>
31#include <qohosqpafunctions_p.h>
32#include <qohossettings.h>
33#include <qohossharekit.h>
34#include <qohosudmfconversions.h>
35#include <qohosutils.h>
36#include <qohoswindowmanager.h>
37#include <qohoswindowproperty.h>
38#include <render/qwindowproxyregistry.h>
42#include <unordered_map>
45using namespace std::chrono_literals;
53const QOhosPropertyDescriptor<QOhosQpaFunctions::AudioStreamUsage> audioStreamUsageProperty{};
55QOhosOptional<QOhosQpaFunctions::WantInfo::LaunchReason> tryMapOhosLaunchReasonToWantInfoEnum(
61 switch (ohosLaunchReason) {
71 case OhosLaunchReason
::CALL:
85 auto optLaunchReasonJsEnum =
86 jsState.tryMapOhosEnumFromJs<enums::ohos::app::ability::AbilityConstant::LaunchReason>(jsLaunchReason);
87 auto optLaunchReason =
88 optLaunchReasonJsEnum.has_value()
89 ? tryMapOhosLaunchReasonToWantInfoEnum(optLaunchReasonJsEnum.value())
90 : makeEmptyQOhosOptional();
94Q_NORETURN
void killCurrentProcess()
96 ::kill(getpid(), SIGKILL);
100QOhosOptional<QOhosAbilityOnContinueResult> tryMapAbilityOnContinueResponseStatusToOhos(
106 case AbilityOnContinueResponseStatus
::Agree:
108 case AbilityOnContinueResponseStatus
::Reject:
110 case AbilityOnContinueResponseStatus
::Mismatch:
116QOhosOptional<enums::ohos::app::ability::AbilityConstant::WindowMode> tryMapWindowModeToOhosOrLogWarning(
122 switch (windowMode) {
131 qCWarning(QtForOhos,
"%s: got illegal WindowMode: %d", Q_FUNC_INFO,
static_cast<
int>(windowMode));
136QOhosOptional<enums::ohos::app::ability::contextConstant::ProcessMode> tryMapProcessModeToOhosOrLogWarning(
142 switch (processMode) {
149 qCWarning(QtForOhos,
"%s: got illegal ProcessMode: %d", Q_FUNC_INFO,
static_cast<
int>(processMode));
154QOhosOptional<enums::ohos::app::ability::contextConstant::StartupVisibility> tryMapStartupVisibilityToOhosOrLogWarning(
160 switch (startupVisibility) {
167 qCWarning(QtForOhos,
"%s: got illegal StartupVisibility: %d", Q_FUNC_INFO,
static_cast<
int>(startupVisibility));
172QOhosOptional<enums::ohos::bundle::bundleManager::SupportWindowMode> tryMapSupportWindowModeToOhosOrLogWarning(
178 switch (supportWindowMode) {
187 qCWarning(QtForOhos,
"%s: got illegal SupportWindowMode: %d", Q_FUNC_INFO,
static_cast<
int>(supportWindowMode));
192QNapi::Array mapSupportWindowModesToJsEnumsArray(
193 QtOhos::
JsState &jsState,
const QList<QOhosQpaFunctions::StartOptions::SupportWindowMode> &supportWindowModes)
195 std::vector<QNapi::ValueWrapper> jsSupportWindowModes;
196 for (
auto supportWindowMode : supportWindowModes) {
197 auto optOhosSupportWindowMode = tryMapSupportWindowModeToOhosOrLogWarning(supportWindowMode);
198 if (optOhosSupportWindowMode.has_value())
199 jsSupportWindowModes.push_back(jsState.mapOhosEnumToJs(optOhosSupportWindowMode.value()));
202 return QNapi::makeArray(jsState.env(), jsSupportWindowModes);
205QNapi::Object makeJsCompletionHandler(
206 QtOhos::
JsState &jsState, std::shared_ptr<QOhosConsumer<
bool, QJsonObject, QString>> qtThreadCompletionHandler)
208 auto makeCompletionCallback = [qtThreadCompletionHandler](
bool requestSuccess) {
209 return [qtThreadCompletionHandler, requestSuccess](
const QNapi::CallbackInfo &cbInfo) {
210 QNapi::Object elementNameObj;
211 QNapi::String messageValue;
212 cbInfo.getLeadingArgs(Q_FUNC_INFO, elementNameObj, messageValue);
214 const QJsonObject elementName = QOhosJsEnv::fromNapiValue<QJsonObject>(elementNameObj);
215 const QString message = QString::fromStdString(messageValue);
217 QtOhos::invokeInQtThread(
218 [qtThreadCompletionHandler, requestSuccess, elementName, message]() {
219 (*qtThreadCompletionHandler)(requestSuccess, elementName, message);
224 return QNapi::makeObject(
227 {
"onRequestSuccess", makeCompletionCallback(
true)},
228 {
"onRequestFailure", makeCompletionCallback(
false)},
234QNapi::Object convertStartOptionsToNapiObject(
237 auto *env = jsState.env();
238 auto napiOptions = QNapi::Object::New(env);
240 auto optOhosWindowMode = qAndThen(opts.windowMode, &tryMapWindowModeToOhosOrLogWarning);
241 if (optOhosWindowMode.has_value())
242 napiOptions.set(
"windowMode", jsState.mapOhosEnumToJs(optOhosWindowMode.value()));
243 if (opts.displayId.has_value())
244 napiOptions.set(
"displayId", opts.displayId.value());
245 if (opts.withAnimation.has_value())
246 napiOptions.set(
"withAnimation", opts.withAnimation.value());
247 if (opts.windowLeft.has_value())
248 napiOptions.set(
"windowLeft", opts.windowLeft.value());
249 if (opts.windowTop.has_value())
250 napiOptions.set(
"windowTop", opts.windowTop.value());
251 if (opts.windowWidth.has_value())
252 napiOptions.set(
"windowWidth", opts.windowWidth.value());
253 if (opts.windowHeight.has_value())
254 napiOptions.set(
"windowHeight", opts.windowHeight.value());
255 auto optOhosProcessMode = qAndThen(opts.processMode, &tryMapProcessModeToOhosOrLogWarning);
256 if (optOhosProcessMode.has_value())
257 napiOptions.set(
"processMode", jsState.mapOhosEnumToJs(optOhosProcessMode.value()));
258 auto optOhosStartupVisibility = qAndThen(opts.startupVisibility, &tryMapStartupVisibilityToOhosOrLogWarning);
259 if (optOhosStartupVisibility.has_value())
260 napiOptions.set(
"startupVisibility", jsState.mapOhosEnumToJs(optOhosStartupVisibility.value()));
261 if (opts.windowIcon.has_value()) {
262 auto windowIcon = opts.windowIcon.value().value<QImage>();
263 if (!windowIcon.isNull())
264 napiOptions.set(
"startWindowIcon", createNapiPixelMapFromQImage(jsState, windowIcon));
266 if (opts.windowBackgroundColorHex.has_value())
267 napiOptions.set(
"startWindowBackgroundColor", opts.windowBackgroundColorHex.value().toStdString());
268 if (opts.supportWindowModes.has_value()) {
269 auto jsSupportWindowModes = mapSupportWindowModesToJsEnumsArray(jsState, opts.supportWindowModes.value());
270 if (jsSupportWindowModes.Length() != 0)
271 napiOptions.set(
"supportWindowModes", jsSupportWindowModes);
273 qCWarning(QtForOhos,
"%s: OHOS doesn't support empty supportWindowModes, skipping", Q_FUNC_INFO);
275 if (opts.minWindowWidth.has_value())
276 napiOptions.set(
"minWindowWidth", opts.minWindowWidth.value());
277 if (opts.minWindowHeight.has_value())
278 napiOptions.set(
"minWindowHeight", opts.minWindowHeight.value());
279 if (opts.maxWindowWidth.has_value())
280 napiOptions.set(
"maxWindowWidth", opts.maxWindowWidth.value());
281 if (opts.maxWindowHeight.has_value())
282 napiOptions.set(
"maxWindowHeight", opts.maxWindowHeight.value());
283 if (opts.optCompletionHandler)
284 napiOptions.set(
"completionHandler", makeJsCompletionHandler(jsState, opts.optCompletionHandler));
285 if (opts.hideStartWindow.has_value())
286 napiOptions.set(
"hideStartWindow", opts.hideStartWindow.value());
287 if (opts.windowCreateParams.has_value()) {
288 const auto &windowCreateParams = opts.windowCreateParams.value();
289 std::vector<std::pair<std::string, QNapi::ValueWrapper>> windowCreateParamsProps;
290 if (windowCreateParams.setWindowFadeInOutAnimation) {
291 windowCreateParamsProps.emplace_back(
298 jsState.mapOhosEnumToJs(
299 enums::ohos::window::AnimationType::FADE_IN_OUT),
303 napiOptions.set(
"windowCreateParams", QNapi::makeObject(env, windowCreateParamsProps));
309std::shared_ptr<
void> registerAppContextEnvironmentCallback(
312 auto appContextRefPtr = QtOhos::moveToSharedPtr(
313 QNapi::Reference<>::makePersistentFrom(
314 jsState.defaultQAbilityPeer()->qAbility().eval<QNapi::Object>(
315 "context.getApplicationContext()")));
317 double environmentCallbackId = appContextRefPtr->call<QNapi::Number>(
319 {
"environment", environmentCallback});
321 return std::shared_ptr<
void>(
323 [environmentCallbackId, appContextRefPtr](
auto) {
326 auto appContextRef =
std::move(*appContextRefPtr);
329 {
"environment", environmentCallbackId});
335std::shared_ptr<
void> registerAppConfigurationUpdateListener(
338 return registerAppContextEnvironmentCallback(
344 "onConfigurationUpdated",
345 [updateListener = std::move(updateListener)](
const QtOhos::CallbackInfo &cbInfo) {
346 auto config = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
347 updateListener(cbInfo.jsState(), config);
353OhosConfigurationColorMode mapOhosConfigurationColorModeFromJs(
QtOhos::
JsState &jsState, QNapi::Number colorModeJsEnum)
356 auto optColorMode = jsState.tryMapOhosEnumFromJs<OhosConfigurationColorMode>(colorModeJsEnum);
357 return optColorMode.value_or(fallbackColorMode);
360void setOhosConfigColorMode(OhosConfigurationColorMode colorMode)
363 qCWarning(QtForOhos,
"%s: cannot set a color mode in 'no UI child mode'", Q_FUNC_INFO);
369 auto qAbility = jsState.defaultQAbilityPeer()->qAbility();
370 const auto jsColorMode = jsState.mapOhosEnumToJs(colorMode);
371 qAbility.call(
"context.getApplicationContext().setColorMode", {jsColorMode});
376template<
typename ConfigValue>
377QOhosSupplier<ConfigValue> makeOhosConfigValueDataSource(
379 std::function<ConfigValue(
QtOhos::
JsState &,
const QNapi::Object &)> valueFetcher,
380 QOhosConsumer<ConfigValue> valueChangedHandler)
382 return QtOhos::makeDataSource<ConfigValue>(
383 std::move(initValueSupplier),
384 [valueFetcher = std::move(valueFetcher)](QtOhos::JsState &jsState, QOhosConsumer<ConfigValue> valueUpdatesConsumer)
mutable {
385 return registerAppConfigurationUpdateListener(
387 [valueFetcher = std::move(valueFetcher), valueUpdatesConsumer = std::move(valueUpdatesConsumer)](QtOhos::JsState &jsState, QNapi::Object config) {
388 valueUpdatesConsumer(valueFetcher(jsState, config));
391 std::move(valueChangedHandler),
395QOhosSupplier<OhosConfigurationColorMode> makeOhosConfigColorModeDataSource(
396 QOhosConsumer<OhosConfigurationColorMode> valueChangedHandler)
398 return makeOhosConfigValueDataSource<OhosConfigurationColorMode>(
400 return mapOhosConfigurationColorModeFromJs(
401 jsState, jsState.defaultQAbilityPeer()->qAbility().eval<QNapi::Number>(
"context.config.colorMode"));
404 return mapOhosConfigurationColorModeFromJs(jsState, config.get<QNapi::Number>(
"colorMode"));
406 std::move(valueChangedHandler));
409QOhosOptional<
bool> mapOhosConfigurationColorModeToDarkModeFlag(OhosConfigurationColorMode colorMode)
415 return makeQOhosOptional(
false);
417 return makeQOhosOptional(
true);
423std::shared_ptr<
char> makeSharedNullTerminatedString(
std::string str)
425 auto sharedStrData = QtOhos::moveToSharedPtr(std::move(str) +
'\0');
426 return std::shared_ptr<
char>(sharedStrData, &sharedStrData->front());
429std::shared_ptr<
char> makeSharedNullTerminatedString(
const char *str)
431 return makeSharedNullTerminatedString(std::string(str !=
nullptr ? str :
""));
434template<
typename ConvFunc>
435std::string callOhFileUriConversionFunc(
436 ConvFunc convFunc,
const std::string &input)
438 char *outputPtr =
nullptr;
439 auto outputPtrGuard = qScopeGuard(
std::bind(::free, outputPtr));
440 auto convFuncRetVal = convFunc(input.c_str(), input.size(), &outputPtr);
442 std::string outputString;
443 if (convFuncRetVal == ::FileManagement_ErrCode::ERR_OK && outputPtr !=
nullptr) {
444 outputString = outputPtr;
447 "OH FileUri conversion function '%s' failed for input '%s', retval: %d",
448 convFunc.name(), input.c_str(),
static_cast<
int>(convFuncRetVal));
454std::string mapPathToOhosUriInJsThread(
const std::string &path)
456 return callOhFileUriConversionFunc(Q_OHOS_NAMED_FUNC(::OH_FileUri_GetUriFromPath), path);
459std::string mapOhosFileUriToPathInJsThread(
const std::string &ohosFileUri)
461 return callOhFileUriConversionFunc(Q_OHOS_NAMED_FUNC(::OH_FileUri_GetPathFromUri), ohosFileUri);
464std::shared_ptr<::FileShare_PolicyInfo> makeFileSharePolicyInfo(
465 std::string uri,
unsigned operationMode)
467 auto sharedUri = makeSharedNullTerminatedString(std::move(uri));
469 auto policyInfo = QtOhos::moveToSharedPtr(
470 ::FileShare_PolicyInfo{
471 .uri = sharedUri.get(),
472 .length =
static_cast<
unsigned>(std::strlen(sharedUri.get())),
473 .operationMode = operationMode,
476 return QtOhos::makeSharedPtrWithAttachedExtraData(
477 policyInfo, sharedUri);
480std::vector<std::shared_ptr<::FileShare_PolicyInfo>> convertToFileSharePolicyInfos(
481 const QList<QOhosQpaFunctions::FileShare::PolicyInfo> &policyInfos)
483 std::vector<std::shared_ptr<::FileShare_PolicyInfo>> fileSharePolicies;
485 for (
const auto &policyInfo : policyInfos) {
486 unsigned ohosOperationModes = 0;
487 for (
auto operationMode : policyInfo.operationModes)
488 ohosOperationModes |=
static_cast<
unsigned>(operationMode);
489 fileSharePolicies.push_back(
490 makeFileSharePolicyInfo(
491 mapPathToOhosUriInJsThread(policyInfo.path.toStdString()),
492 ohosOperationModes));
495 return fileSharePolicies;
498std::shared_ptr<::FileShare_PolicyErrorResult> makeFileSharePolicyErrorResultFromRawStruct(
499 const ::FileShare_PolicyErrorResult &inputStruct)
501 auto sharedUri = makeSharedNullTerminatedString(inputStruct.uri);
502 auto sharedMessage = makeSharedNullTerminatedString(inputStruct.message);
504 auto policyErrorResult = QtOhos::moveToSharedPtr(
505 ::FileShare_PolicyErrorResult{
506 .uri = sharedUri.get(),
507 .code = inputStruct.code,
508 .message = sharedMessage.get(),
511 return QtOhos::makeSharedPtrWithAttachedExtraData(
513 QtOhos::moveToSharedPtr(std::make_tuple(sharedUri, sharedMessage)));
516std::vector<::FileShare_PolicyInfo> makePoliciesRawVectorView(
517 const std::vector<std::shared_ptr<::FileShare_PolicyInfo>> &policies)
519 std::vector<::FileShare_PolicyInfo> rawVectorView;
520 for (
const auto &policyPtr : policies)
521 rawVectorView.push_back(*policyPtr);
523 return rawVectorView;
526template<
typename PermissionActionFunc>
527::FileManagement_ErrCode callFileSharePermissionActionFunc(
528 PermissionActionFunc permissionActionFunc,
529 const std::vector<std::shared_ptr<::FileShare_PolicyInfo>> &policies,
530 std::vector<std::shared_ptr<::FileShare_PolicyErrorResult>> &outResult)
532 auto policiesRawVectorView = makePoliciesRawVectorView(policies);
533 ::FileShare_PolicyErrorResult *resultParam =
nullptr;
534 unsigned resultNumParam = 0;
535 auto resultParamReleaseGuard = qScopeGuard(
537 if (resultParam !=
nullptr && resultNumParam != 0)
538 ::OH_FileShare_ReleasePolicyErrorResult(resultParam, resultNumParam);
541 auto errCode = permissionActionFunc(
542 policiesRawVectorView.data(), policiesRawVectorView.size(),
543 &resultParam, &resultNumParam);
546 if (resultParam !=
nullptr) {
547 for (
unsigned i = 0; i < resultNumParam; ++i) {
549 makeFileSharePolicyErrorResultFromRawStruct(resultParam[i]));
556::FileManagement_ErrCode fileShareCheckPersistentPermission(
557 const std::vector<std::shared_ptr<::FileShare_PolicyInfo>> &policies,
558 std::vector<
bool> &outResult)
560 auto policiesRawVectorView = makePoliciesRawVectorView(policies);
561 bool *resultParam =
nullptr;
562 auto resultParamReleaseGuard = qScopeGuard(
566 unsigned resultNumParam = 0;
568 auto errCode = ::OH_FileShare_CheckPersistentPermission(
569 policiesRawVectorView.data(), policiesRawVectorView.size(),
570 &resultParam, &resultNumParam);
573 if (resultParam !=
nullptr) {
574 for (
unsigned i = 0; i < resultNumParam; ++i)
575 outResult.push_back(resultParam[i]);
581::FileManagement_ErrCode fileSharePersistPermission(
582 const std::vector<std::shared_ptr<::FileShare_PolicyInfo>> &policies,
583 std::vector<std::shared_ptr<::FileShare_PolicyErrorResult>> &outResult)
585 return callFileSharePermissionActionFunc(
586 Q_OHOS_NAMED_FUNC(::OH_FileShare_PersistPermission),
587 policies, outResult);
590::FileManagement_ErrCode fileShareRevokePermission(
591 const std::vector<std::shared_ptr<::FileShare_PolicyInfo>> &policies,
592 std::vector<std::shared_ptr<::FileShare_PolicyErrorResult>> &outResult)
594 return callFileSharePermissionActionFunc(
595 Q_OHOS_NAMED_FUNC(::OH_FileShare_RevokePermission),
596 policies, outResult);
599::FileManagement_ErrCode fileShareActivatePermission(
600 const std::vector<std::shared_ptr<::FileShare_PolicyInfo>> &policies,
601 std::vector<std::shared_ptr<::FileShare_PolicyErrorResult>> &outResult)
603 return callFileSharePermissionActionFunc(
604 Q_OHOS_NAMED_FUNC(::OH_FileShare_ActivatePermission),
605 policies, outResult);
608::FileManagement_ErrCode fileShareDeactivatePermission(
609 const std::vector<std::shared_ptr<::FileShare_PolicyInfo>> &policies,
610 std::vector<std::shared_ptr<::FileShare_PolicyErrorResult>> &outResult)
612 return callFileSharePermissionActionFunc(
613 Q_OHOS_NAMED_FUNC(::OH_FileShare_DeactivatePermission),
614 policies, outResult);
617QOhosOptional<QOhosQpaFunctions::FileShare::PolicyErrorCode> tryMapFileSharePolicyErrorCode(
618 ::FileShare_PolicyErrorCode errorCode)
622 case ::FileShare_PolicyErrorCode::PERSISTENCE_FORBIDDEN:
624 case ::FileShare_PolicyErrorCode::INVALID_MODE:
626 case ::FileShare_PolicyErrorCode::INVALID_PATH:
628 case ::FileShare_PolicyErrorCode::PERMISSION_NOT_PERSISTED:
634QList<QOhosQpaFunctions::FileShare::PolicyErrorResult> convertToPolicyErrorResults(
635 const std::vector<std::shared_ptr<::FileShare_PolicyErrorResult>> &policyErrorResults)
637 QList<QOhosQpaFunctions::FileShare::PolicyErrorResult> result;
638 for (
const auto &policyErrorResult : policyErrorResults) {
640 .path = policyErrorResult->uri !=
nullptr
641 ? QString::fromStdString(mapOhosFileUriToPathInJsThread(policyErrorResult->uri))
644 tryMapFileSharePolicyErrorCode(policyErrorResult->code),
645 .errorMessage = QLatin1String(
646 policyErrorResult->message !=
nullptr ? policyErrorResult->message :
""),
653bool isSuccessErrorCode(::FileManagement_ErrCode errorCode)
655 return errorCode == ::FileManagement_ErrCode::ERR_OK;
658QOhosOptional<QOhosQpaFunctions::ShareKit::SharedRecord> tryConvertNapiObjectToSharedRecord(QNapi::Object record)
660 auto tryGetOptionalStringProp = [](
const QNapi::Object &object,
const std::string &propName) {
661 return qTransform(getOptionalProperty<QNapi::String>(object, propName), &QString::fromStdString);
664 auto tryGetOptionalByteArrayProp = [](
const QNapi::Object &object,
const std::string &propName) {
666 getOptionalProperty<QNapi::TypedArrayOf<std::uint8_t>>(object, propName),
667 [](
const auto &napiArray) {
669 reinterpret_cast<
const char *>(napiArray.Data()),
670 napiArray.ByteLength());
674 auto tryGetOptionalJsonObjectProp = [](
const QNapi::Object &object,
const std::string &propName) {
676 getOptionalProperty<QNapi::Object>(object, propName),
677 [](
const auto &napiObject) {
678 return QOhosJsEnv::fromNapiValue<QJsonObject>(napiObject);
682 std::string utd = record.get<QNapi::String>(
"utd");
683 auto optMimeType = utd != QOhosUdsMeta<::OH_UdsHyperlink>::udmfMetaId
684 ? tryMapUtdTypeIdToMimeType(utd)
685 : QOhosOptional<std::string>(QOhosShareKit::mimeTextUriList);
686 if (!optMimeType.has_value()) {
688 "%s: can't map utd '%s' to mimetype, not mapping the record",
689 Q_FUNC_INFO, utd.c_str());
693 auto content = tryGetOptionalStringProp(record,
"content");
694 auto uri = tryGetOptionalStringProp(record,
"uri");
695 if (!content.has_value() && !uri.has_value()) {
697 "%s: cannot create Shared Record, content and uri properties are empty", Q_FUNC_INFO);
701 return makeQOhosOptional(
702 QOhosQpaFunctions::ShareKit::SharedRecord{
703 .mimeType = QString::fromStdString(optMimeType.value()),
706 .title = tryGetOptionalStringProp(record,
"title"),
707 .label = tryGetOptionalStringProp(record,
"label"),
708 .description = tryGetOptionalStringProp(record,
"description"),
709 .thumbnail = tryGetOptionalByteArrayProp(record,
"thumbnail"),
710 .thumbnailFilePath = tryGetOptionalStringProp(record,
"thumbnailUri"),
711 .extraData = qTransform(tryGetOptionalJsonObjectProp(record,
"extraData"), std::mem_fn(&QJsonObject::toVariantMap)),
718 switch (abilityType) {
731 qOhosReportFatalErrorAndAbort(
732 "%s: unsupported ShareAbilityType value: %d",
733 Q_FUNC_INFO,
static_cast<
int>(abilityType));
736QOhosOptional<std::uint32_t> tryConvertPortNameToSystemPortId(
const QString &portName)
738 constexpr const char *serialPortPrefix =
"COM";
739 const QString prefix = QLatin1String(serialPortPrefix);
741 if (!portName.startsWith(prefix))
744 return QtOhos::tryParseStringAsUnsignedInteger<
std::uint32_t>(portName.mid(prefix.length()).toStdString());
747bool hasSerialPortAccessRightJsImpl(
QtOhos::
JsState &jsState,
std::uint32_t serialPortId)
750 return jsState.eval<QNapi::Boolean>(
"@ohos.usbManager.serial.hasSerialRight(*)", {serialPortId});
751 }
catch (
const Napi::Error &error) {
753 "%s: hasSerialRight for port %d failed with error: %s",
754 Q_FUNC_INFO, serialPortId, error.what());
759void requestSerialPortAccessRightJsImpl(
760 QtOhos::
JsState &jsState,
std::uint32_t serialPortId, QOhosConsumer<
bool> resultConsumer)
762 jsState.evalToPromiseOrRejectOnThrow(
763 "@ohos.usbManager.serial.requestSerialRight(*)", {serialPortId})
764 .withContext(
std::move(resultConsumer))
767 bool granted = cbInfo.getFirstArg<QNapi::Boolean>(Q_FUNC_INFO);
768 resultConsumer(granted);
772 QtOhos::logJsCallbackError(
773 cbInfo,
"@ohos.usbManager.serial.requestSerialRight() failed");
774 resultConsumer(
false);
778void cancelSerialPortAccessRightJsImpl(
QtOhos::
JsState &jsState,
std::uint32_t serialPortId)
780 if (!hasSerialPortAccessRightJsImpl(jsState, serialPortId))
784 jsState.eval(
"@ohos.usbManager.serial.cancelSerialRight(*)", {serialPortId});
785 }
catch (
const Napi::Error &error) {
787 "%s: cancelSerialRight(%u) failed with error (ignoring): %s",
788 Q_FUNC_INFO, serialPortId, error.what());
795 WantInfoImpl(QNapi::Object want,
LaunchReason launchReason);
797 QJsonObject jsonObject()
const override;
799 QOhosOptional<QList<QOhosQpaFunctions::ShareKit::SharedRecord>> tryGetSharedDataRecords()
const override;
801 QOhosOptional<ContactInfo> tryGetContactInfo()
const override;
808 QNapi::Reference<QNapi::Object> want;
811 std::shared_ptr<JsScopeData> m_jsScopeData;
812 QJsonObject m_jsonObject;
816WantInfoImpl::WantInfoImpl(QNapi::Object want,
LaunchReason launchReason)
819 QtOhos::makeProxyWithJsThreadDeleter(
820 QtOhos::moveToSharedPtr(
822 .want = QNapi::Reference<>::makePersistentFrom(want),
824 , m_jsonObject(QOhosJsEnv::fromNapiValue<QJsonObject>(want))
825 , m_launchReason(launchReason)
829QJsonObject WantInfoImpl::jsonObject()
const
834QOhosOptional<QList<QOhosQpaFunctions::ShareKit::SharedRecord>> WantInfoImpl::tryGetSharedDataRecords()
const
838 return QtOhos::evalInJsThreadWithPromise<QOhosOptional<QList<SharedRecord>>>(
839 [&](QtOhos::JsState &jsState, QOhosTaskPromise<QOhosOptional<QList<SharedRecord>>> evalPromise) {
840 auto thenCatchPromises = std::move(evalPromise).makeThenCatchBranches(Q_FUNC_INFO);
841 jsState.evalToPromiseOrRejectOnThrow(
842 "@kit.ShareKit.systemShare.getSharedData(*)", {m_jsScopeData->want.Value()})
844 [thenPromise = std::move(thenCatchPromises.first)](
const QtOhos::CallbackInfo &cbInfo) {
845 QNapi::Object sharedData = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
847 auto optRecords = QNapi::getArrayElements<QList<QOhosOptional<SharedRecord>>, QNapi::Object>(
848 sharedData.call<QNapi::Array>(
"getRecords"), &tryConvertNapiObjectToSharedRecord);
850 QList<SharedRecord> records;
851 for (
const auto &optRecord : optRecords) {
852 if (optRecord.has_value())
853 records.append(optRecord.value());
856 std::size_t unconvertedRecordsCount = optRecords.size() - records.size();
857 if (unconvertedRecordsCount != 0) {
859 "%s: can't convert %zu Shared Records, ignoring them",
860 Q_FUNC_INFO, unconvertedRecordsCount);
863 thenPromise(makeQOhosOptional(records));
866 [catchPromise = std::move(thenCatchPromises.second)](
const QtOhos::CallbackInfo &cbInfo) {
867 QtOhos::logJsCallbackError(cbInfo,
"@kit.ShareKit.systemShare.getSharedData() failed");
868 catchPromise(makeEmptyQOhosOptional());
874QOhosOptional<QOhosQpaFunctions::WantInfo::ContactInfo> WantInfoImpl::tryGetContactInfo()
const
878 return QtOhos::evalInJsThreadWithPromise<QOhosOptional<ContactInfo>>(
879 [&](QtOhos::JsState &jsState, QOhosTaskPromise<QOhosOptional<ContactInfo>> evalPromise) {
880 auto thenCatchPromises = std::move(evalPromise).makeThenCatchBranches(Q_FUNC_INFO);
881 jsState.evalToPromiseOrRejectOnThrow(
882 "@kit.ShareKit.systemShare.getContactInfo(*)", {m_jsScopeData->want.Value()})
884 [thenPromise = std::move(thenCatchPromises.first)](
const QtOhos::CallbackInfo &cbInfo) {
885 auto contactInfoObj = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
886 ContactInfo contactInfo = {
887 .contactType = QString::fromStdString(
888 contactInfoObj.get<QNapi::String>(
"contactType")),
889 .contactId = QString::fromStdString(
890 contactInfoObj.get<QNapi::String>(
"contactId")),
892 thenPromise(makeQOhosOptional(contactInfo));
895 [catchPromise = std::move(thenCatchPromises.second)](
const QtOhos::CallbackInfo &cbInfo) {
896 QtOhos::logJsCallbackError(cbInfo,
"@kit.ShareKit.systemShare.getContactInfo() failed");
897 catchPromise(makeEmptyQOhosOptional());
905 return m_launchReason;
908class QOhosQpaFunctionsImpl :
public QOhosQpaFunctions,
public std::enable_shared_from_this<QOhosQpaFunctionsImpl>
911 void setWindowPrivacyMode(QObject *window,
bool privacyModeEnabled)
override;
912 void setWindowCornerRadius(QObject *window,
double radius)
override;
913 void tagWindowOrWidgetAsFloatWindow(QObject *windowOrWidget,
bool floatWindow)
override;
915 void setInAppOnlyPasteboardShareOption(
bool shareInAppOnly)
override;
916 QVariant getImageDataFromPasteboard()
const override;
917 QString getTextDataFromPasteboard()
const override;
919 void setWindowOrWidgetNativeNodeRenderFitPolicyHint(QObject *windowOrWidget,
NativeNodeRenderFitPolicy renderFitPolicy)
override;
921 void setSurfaceBackgroundColor(QObject *windowOrWidget,
const QColor &color)
override;
925 void setWindowKeepScreenOn(QObject *windowOrWidget,
bool keepScreenOn)
override;
927 void setWindowDragResizable(QObject *windowOrWidget,
bool dragResizable)
override;
929 QOhosOptional<
double> tryGetNativeWindowId(QObject *window)
override;
930 QOhosOptional<
double> tryGetScreenDisplayId(QObject *screenObject)
override;
932 void setOnContinueRequestsHandlerForAbilityInstanceWindow(
933 QObject *windowObject,
std::function<
void(
AbilityOnContinueRequest, QOhosConsumer<AbilityOnContinueResponse>)> requestsHandler)
override;
935 void setAbilityContinuationActive(
936 QObject *optInstanceMainWindow,
bool continuationActive)
override;
938 Q_NORETURN
void restartApp(QOhosOptional<QJsonObject> want)
override;
940 QJsonObject getAppLaunchWant()
override;
941 QSharedPointer<WantInfo> getAppLaunchWantInfo()
const override;
943 void addNewWantConsumer(QObject *context, QOhosConsumer<QJsonObject> wantConsumer)
override;
944 void addNewWantConsumer(
945 QObject *context, QOhosConsumer<QSharedPointer<WantInfo>> wantConsumer)
override;
947 void startAppProcess(
948 const QString &processId,
const QJsonObject &requestWant,
949 const QOhosOptional<StartOptions> &optStartOptions)
override;
951 bool startAbility(
const QJsonObject &want,
const QOhosOptional<StartOptions> &options)
override;
953 bool startAbilityByType(
const QString &appType,
const QJsonObject &wantParameters)
override;
955 void startAbilityForResult(
956 const QJsonObject &want,
const QOhosOptional<StartOptions> &options,
957 QObject *optInstanceMainWindow, QObject *resultConsumerQtContext,
958 QOhosConsumer<QOhosOptional<AbilityResult>> resultConsumer)
override;
960 void setDestroyAllowedFlagForAbilityInstances(
961 std::vector<QObject *> instancesMainWindows,
bool destroyEnabled)
override;
963 void setOhosConfigDarkModeFlag(QOhosOptional<
bool> darkModeFlag)
override;
965 QOhosSupplier<QOhosOptional<
bool>> makeOhosConfigDarkModeFlagDataSource(
966 QOhosConsumer<QOhosOptional<
bool>> darkModeFlagChangedHandler)
override;
968 QOhosSupplier<
double> makeOhosConfigFontSizeScaleDataSource(
969 QOhosConsumer<
double> valueChangedHandler)
override;
971 int getCurrentApplicationVersionCode()
override;
973 bool readOhosNoUiChildMode()
override;
975 void startNoUiChildProcess(QString libraryName, QStringList args)
override;
977 bool hasSerialPortAccessRight(
const QString &portName)
override;
979 void requestSerialPortAccessRight(
980 const QString &portName, QObject *resultConsumerQtContext,
981 QOhosConsumer<std::shared_ptr<
void>> resultConsumer)
override;
983 std::pair<
bool, QList<FileShare::PolicyErrorResult>> persistPermission(
984 const QList<FileShare::PolicyInfo> &policyInfos)
override;
986 std::pair<
bool, QList<FileShare::PolicyErrorResult>> revokePermission(
987 const QList<FileShare::PolicyInfo> &policyInfos)
override;
989 std::pair<
bool, QList<FileShare::PolicyErrorResult>> activatePermission(
990 const QList<FileShare::PolicyInfo> &policyInfos)
override;
992 std::pair<
bool, QList<FileShare::PolicyErrorResult>> deactivatePermission(
993 const QList<FileShare::PolicyInfo> &policyInfos)
override;
995 std::pair<
bool, std::vector<
bool>> checkPersistent(
const QList<FileShare::PolicyInfo> &policyInfos)
override;
997 bool showFileDialogToAuthorizeFilePath(QObject *parentWindow,
const QString &filePath)
override;
999 void setWindowBrightness(QObject *window,
int brightness)
override;
1000 void setWindowContrast(QObject *window,
int contrast)
override;
1001 void setWindowSaturation(QObject *window,
int saturation)
override;
1003 std::shared_ptr<
void> shareDataUsingShareKit(
1004 QObject *optWindowObject,
const QList<ShareKit::SharedRecord> &recordsToShare,
1006 std::function<
void()> panelClosedCallback,
1007 QOhosConsumer<ShareKit::ShareOperationResult> optShareCompletedCallback)
override;
1009 bool tryOpenLink(QObject *optInstanceMainWindow,
const QString &link, QOhosOptional<
bool> appLinkingOnly)
override;
1011 void setAudioStreamUsageHintProperty(QObject *qObject,
AudioStreamUsage usage)
override;
1012 QOhosOptional<AudioStreamUsage> tryGetAudioStreamUsageHintProperty(QObject *qObject)
override;
1015 void processSerialPortPermissionResponse(
std::uint32_t serialPortId,
bool granted);
1017 std::unordered_map<std::uint32_t, std::vector<QOhosConsumer<std::shared_ptr<
void>>>> m_pendingSerialPortsPermissionRequestsConsumers;
1018 std::unordered_map<std::uint32_t, std::weak_ptr<
void>> m_grantedSerialPortsPermissionContexts;
1021void QOhosQpaFunctionsImpl::setWindowPrivacyMode(QObject *window,
bool privacyModeEnabled)
1023 QOhosPlatformWindow::setWindowPrivacyMode(window, privacyModeEnabled);
1026void QOhosQpaFunctionsImpl::setInAppOnlyPasteboardShareOption(
bool shareInAppOnly)
1031QVariant QOhosQpaFunctionsImpl::getImageDataFromPasteboard()
const
1033 return QOhosPlatformIntegration::instance()->clipboard()->getPasteboardDataWithLazyFetchOrLocalIfOwner()->imageData();
1036QString QOhosQpaFunctionsImpl::getTextDataFromPasteboard()
const
1038 return QOhosPlatformIntegration::instance()->clipboard()->getPasteboardDataWithLazyFetchOrLocalIfOwner()->text();
1041void QOhosQpaFunctionsImpl::setWindowCornerRadius(QObject *windowOrWidget,
double radius)
1043 QOhosPlatformWindow::setWindowCornerRadius(windowOrWidget, radius);
1046void QOhosQpaFunctionsImpl::tagWindowOrWidgetAsFloatWindow(
1047 QObject *windowOrWidget,
bool floatWindow)
1049 QOhosPlatformWindow::tagWindowOrWidgetAsFloatWindow(windowOrWidget, floatWindow);
1052void QOhosQpaFunctionsImpl::setWindowOrWidgetNativeNodeRenderFitPolicyHint(
1055 QOhosOptional<QOhosPlatformWindow::NativeNodeRenderFitPolicy> policy;
1056 switch (renderFitPolicyHint) {
1065 if (policy.has_value()) {
1066 QOhosPlatformWindow::setWindowOrWidgetNativeNodeRenderFitPolicyHint(windowOrWidget, policy.value());
1068 qOhosReportFatalErrorAndAbort(
1069 "%s: Failed to convert render fit policy hint to QOhosPlatformWindow enum",
1074void QOhosQpaFunctionsImpl::setSurfaceBackgroundColor(QObject *windowOrWidget,
const QColor &color)
1076 QOhosPlatformWindow::setSurfaceBackgroundColor(windowOrWidget, color);
1079void QOhosQpaFunctionsImpl::setMainWindowGeometryPersistencePolicy(
1082 QOhosOptional<QOhosPlatformIntegration::WindowGeometryPersistencePolicy> policy;
1083 switch (geometryPolicyHint) {
1095 if (policy.has_value()) {
1098 qOhosReportFatalErrorAndAbort(
1099 "%s: Failed to convert persistence geometry policy hint to QOhosPlatformIntegration enum",
1104void QOhosQpaFunctionsImpl::setWindowKeepScreenOn(QObject *windowOrWidget,
bool keepScreenOn)
1106 QOhosPlatformWindow::setWindowKeepScreenOn(windowOrWidget, keepScreenOn);
1109void QOhosQpaFunctionsImpl::setWindowDragResizable(QObject *windowOrWidget,
bool dragResizable)
1111 QOhosPlatformWindow::setWindowDragResizable(windowOrWidget, dragResizable);
1114QOhosOptional<
double> QOhosQpaFunctionsImpl::tryGetNativeWindowId(QObject *window)
1116 auto *qWindow = qobject_cast<QWindow *>(window);
1117 if (qWindow ==
nullptr)
1120 auto *platformWindow = QOhosPlatformWindow::fromQWindowOrNull(qWindow);
1121 if (platformWindow ==
nullptr)
1124 auto internalId = platformWindow->internalWindowId();
1126 if (!jsWinId.has_value())
1130 "PlatformWindow WIID: %s is returning JsWindowId: %f to the user",
1131 qPrintable(internalId.toString()), jsWinId.value().value());
1133 return makeQOhosOptional(jsWinId.value().value());
1136QOhosOptional<
double> QOhosQpaFunctionsImpl::tryGetScreenDisplayId(QObject *screenObject)
1138 auto *qScreen = qobject_cast<QScreen *>(screenObject);
1139 if (qScreen ==
nullptr) {
1140 qOhosPrintfWarning(
"%s: screenObject argument is not a QScreen", Q_FUNC_INFO);
1145 return ohosPlatformScreen !=
nullptr
1146 ? makeQOhosOptional(ohosPlatformScreen->displayInfo().id.value())
1150void QOhosQpaFunctionsImpl::setOnContinueRequestsHandlerForAbilityInstanceWindow(
1153 auto *qWindow = qobject_cast<QWindow *>(windowObject);
1154 if (qWindow ==
nullptr)
1155 qOhosReportFatalErrorAndAbort(
"%s: windowObject argument is null or not a QWindow", Q_FUNC_INFO);
1157 auto qWindowRef = QObjectThreadSafeRef(qWindow);
1158 auto sharedRequestsHandler = moveToSharedPtr(
std::move(requestsHandler));
1160 struct JsResultContext
1162 QNapi::Reference<QNapi::Object> wantParamsReference;
1163 QOhosConsumer<JsState &, QOhosAbilityOnContinueResult> resultConsumer;
1169 jsState.tryGetQAbilityPeerByQWindow(qWindowRef)
);
1170 if (!uiAbilityPeer) {
1172 "%s: no QUiAbilityPeer for window %s, handler not set",
1173 Q_FUNC_INFO, qWindowRef.refName().c_str());
1177 uiAbilityPeer->setOnContinueRequestsHandler(
1178 [sharedRequestsHandler](
JsState &, QNapi::Object wantParamsObj,
auto resultConsumer) {
1179 int sourceVersionCode = wantParamsObj.get<QNapi::Number>(
"version");
1180 auto jsResultContext = makeProxyWithJsThreadDeleter(
std::make_shared<JsResultContext>());
1181 jsResultContext->wantParamsReference = QNapi::Reference<>::makePersistentFrom(wantParamsObj);
1182 jsResultContext->resultConsumer =
std::move(resultConsumer);
1183 QtOhos::invokeInQtThread(
1184 [sharedRequestsHandler, sourceVersionCode, jsResultContext]() {
1185 (*sharedRequestsHandler)(
1186 AbilityOnContinueRequest{
1187 .sourceApplicationVersionCode = sourceVersionCode,
1189 [jsResultContext](AbilityOnContinueResponse qtResponse) {
1190 QtOhos::invokeInJsThread(
1191 [jsResultContext, qtResponse](JsState &jsState) {
1192 if (qtResponse.status == AbilityOnContinueResponseStatus::Agree) {
1193 auto wantParamsObj = jsResultContext->wantParamsReference.Value();
1194 auto newWantParamsIter = qtResponse.wantObjectParams.constKeyValueBegin();
1195 while (newWantParamsIter != qtResponse.wantObjectParams.constKeyValueEnd()) {
1197 newWantParamsIter->first.toStdString(),
1198 newWantParamsIter->second.toStdString());
1199 ++newWantParamsIter;
1201 if (qtResponse.exitAppOnSourceDeviceAfterMigration.has_value()) {
1203 jsState.eval<QNapi::String>(
1204 "@ohos.app.ability.wantConstant.Params.SUPPORT_CONTINUE_SOURCE_EXIT_KEY"),
1205 qtResponse.exitAppOnSourceDeviceAfterMigration.value());
1208 auto ohosResult = tryMapAbilityOnContinueResponseStatusToOhos(qtResponse.status);
1209 if (!ohosResult.has_value()) {
1211 "%s: got illegal status (%d) from request handler, rejecting",
1212 Q_FUNC_INFO,
static_cast<
int>(qtResponse.status));
1214 jsResultContext->resultConsumer(
1215 jsState, ohosResult.value_or(QOhosAbilityOnContinueResult::REJECT));
1224void QOhosQpaFunctionsImpl::setAbilityContinuationActive(
1225 QObject *optInstanceMainWindow,
bool continuationActive)
1229 auto optInstanceMainWindowRef =
1230 optInstanceMainWindow !=
nullptr
1231 ? makeQOhosOptional(QtOhos::QObjectThreadSafeRef(optInstanceMainWindow))
1235 [&](
JsState &jsState, QOhosTaskPromise<> taskPromise) {
1236 auto optAbilityPeer = tryMapOptMainWindowToAbilityPeer(jsState, optInstanceMainWindowRef);
1237 if (!optAbilityPeer) {
1242 auto continueState = continuationActive ? ContinueState
::ACTIVE : ContinueState
::INACTIVE;
1243 optAbilityPeer->qAbility().evalToPromiseOrRejectOnThrow(
1244 "context.setMissionContinueState(*)", {jsState.mapOhosEnumToJs(continueState)})
1245 .onCatch(QtOhos::makeErrorLoggingJsCallback(
"setMissionContinueState()"))
1246 .onFinally(
std::move(taskPromise).makeChained(Q_FUNC_INFO));
1251Q_NORETURN
void QOhosQpaFunctionsImpl::restartApp(QOhosOptional<QJsonObject> want)
1255 auto napiWant = want.has_value()
1256 ? QNapi::checkedCast<QNapi::Object>(QOhosJsEnv::toNapiValue(jsState.env(), want.value()))
1257 : jsState.appLaunchWant();
1259 constexpr auto sleepTimeBeforeRetry = 3s;
1261 unsigned remainingTries = 3;
1267 "%s: calling restartApp() using Want: %s",
1268 Q_FUNC_INFO, QNapi::toJsonString(napiWant).c_str());
1271 jsState.defaultQAbilityPeer()->qAbility().call(
1272 "context.getApplicationContext().restartApp", {napiWant});
1274 qOhosPrintfWarning(
"%s: restartApp() call unexpectedly returned, killing self", Q_FUNC_INFO);
1275 killCurrentProcess();
1276 }
catch (
const Napi::Error &error) {
1277 constexpr std::uint32_t restartTooFrequentlyErrorCode = 16000064;
1279 auto errorCode = QtOhos::tryGetCodeFromJsBusinessError(error);
1281 if (errorCode == restartTooFrequentlyErrorCode && remainingTries != 0) {
1283 "%s: restartApp() returned with error %u, sleeping before retry",
1284 Q_FUNC_INFO, restartTooFrequentlyErrorCode);
1286 std::this_thread::sleep_for(sleepTimeBeforeRetry);
1288 auto errorCodeStr = errorCode.has_value()
1289 ?
std::to_string(errorCode.value())
1292 "%s: restartApp() returned with error %s, killing self",
1293 Q_FUNC_INFO, errorCodeStr.c_str());
1295 killCurrentProcess();
1302 qOhosReportFatalErrorAndAbort(
"%s: unexpected return from the JS thread call", Q_FUNC_INFO);
1305QJsonObject QOhosQpaFunctionsImpl::getAppLaunchWant()
1307 return getAppLaunchWantInfo()->jsonObject();
1310QSharedPointer<QOhosQpaFunctions::WantInfo> QOhosQpaFunctionsImpl::getAppLaunchWantInfo()
const
1312 return QtOhos::evalInJsThread(
1314 auto optAppLaunchReason = qTransform(
1315 jsState.optAppLaunchParam(),
1316 [&](QNapi::Object appLaunchParam) {
1317 return mapJsLaunchReasonToWantInfoEnumWithFallback(
1318 jsState, appLaunchParam.get<QNapi::Number>(
"launchReason"));
1321 return QSharedPointer<WantInfoImpl>::create(jsState.appLaunchWant(), appLaunchReason);
1326void QOhosQpaFunctionsImpl::addNewWantConsumer(QObject *context, QOhosConsumer<QJsonObject> wantConsumer)
1328 auto sharedWantConsumer = QtOhos::moveToSharedPtr(std::move(wantConsumer));
1331 [sharedWantConsumer](QSharedPointer<WantInfo> wantInfo) {
1332 (*sharedWantConsumer)(wantInfo->jsonObject());
1336void QOhosQpaFunctionsImpl::addNewWantConsumer(
1337 QObject *context, QOhosConsumer<QSharedPointer<WantInfo>> wantConsumer)
1339 auto contextRef = QtOhos::makeQThreadSafeRef(context);
1340 auto sharedWantConsumer = QtOhos::moveToSharedPtr(std::move(wantConsumer));
1342 [&](
auto &jsState) {
1343 jsState.addNewWantConsumer(
1344 [contextRef, sharedWantConsumer](
QtOhos::
JsState &jsState, QNapi::Object napiWant, QNapi::Object launchParam) {
1345 auto launchReason = mapJsLaunchReasonToWantInfoEnumWithFallback(
1346 jsState, launchParam.get<QNapi::Number>(
"launchReason"));
1347 auto wantInfo = QSharedPointer<WantInfoImpl>::create(napiWant, launchReason);
1348 contextRef.visitInQtThreadIfAlive(
1349 [sharedWantConsumer, wantInfo](
auto &) {
1350 (*sharedWantConsumer)(wantInfo);
1357void QOhosQpaFunctionsImpl::startAppProcess(
1358 const QString &processId,
const QJsonObject &requestWant,
1359 const QOhosOptional<StartOptions> &optStartOptions)
1362 [&](
auto &jsState, QOhosTaskPromise<> taskPromise) {
1363 auto startOptions = optStartOptions.has_value()
1364 ? convertStartOptionsToNapiObject(jsState, optStartOptions.value())
1367 auto sharedTaskPromise = QtOhos::moveToSharedPtr(std::move(taskPromise).makeChained(Q_FUNC_INFO));
1368 jsState.startAppProcess(
1369 processId.toStdString(),
1370 QNapi::checkedCast<QNapi::Object>(
1371 QOhosJsEnv::toNapiValue(jsState.env(), requestWant)),
1374 (*sharedTaskPromise)();
1380bool QOhosQpaFunctionsImpl::startAbility(
const QJsonObject &want,
const QOhosOptional<QOhosQpaFunctions::StartOptions> &options)
1382 return QtOhos::evalInJsThread(
1383 [&](
auto &jsState) {
1384 auto mainUiAbility = jsState.defaultQAbilityPeer()->qAbility();
1385 if (mainUiAbility.IsEmpty())
1388 auto arguments = std::vector<QNapi::ValueWrapper>{QOhosJsEnv::toNapiValue(jsState.env(), want)};
1389 if (options.has_value())
1390 arguments.push_back(convertStartOptionsToNapiObject(jsState, options.value()));
1392 mainUiAbility.call(
"context.startAbility", arguments);
1402bool QOhosQpaFunctionsImpl::startAbilityByType(
const QString &appType,
const QJsonObject &wantParameters)
1406 return QtOhos::evalInJsThreadWithPromise<
bool>(
1407 [&](
QtOhos::
JsState &jsState, QOhosTaskPromise<
bool> evalPromise) {
1408 auto qAbility = jsState.defaultQAbilityPeer()->qAbility();
1409 if (qAbility.IsEmpty()) {
1414 auto thenCatchPromises =
std::move(evalPromise).makeThenCatchBranches(Q_FUNC_INFO);
1415 qAbility.evalToPromiseOrRejectOnThrow(
1416 "context.startAbilityByType(*)",
1418 appType.toStdString(),
1419 QOhosJsEnv::toNapiValue(jsState.env(), wantParameters),
1425 [](
const QtOhos::CallbackInfo&) {
1426 qOhosPrintfDebug(
"startAbilityByType: onResult called");
1431 [](
const QtOhos::CallbackInfo &cbInfo) {
1432 QtOhos::logJsCallbackError(cbInfo,
"startAbilityByType: onError called");
1442 [catchPromise = std::move(thenCatchPromises.second)](
const QtOhos::
CallbackInfo &cbInfo) {
1443 QtOhos::logJsCallbackError(cbInfo,
"startAbilityByType: failed");
1444 catchPromise(
false);
1450void QOhosQpaFunctionsImpl::startAbilityForResult(
1451 const QJsonObject &want,
const QOhosOptional<StartOptions> &options,
1452 QObject *optInstanceMainWindow, QObject *resultConsumerQtContext,
1453 QOhosConsumer<QOhosOptional<AbilityResult>> resultConsumer)
1457 QtOhos::QObjectThreadSafeRef resultConsumerQtContextRef;
1458 QOhosConsumer<QOhosOptional<AbilityResult>> resultConsumer;
1461 auto context = QtOhos::moveToSharedPtr(
1463 .resultConsumerQtContextRef = QtOhos::QObjectThreadSafeRef(resultConsumerQtContext),
1464 .resultConsumer = std::move(resultConsumer),
1467 auto optInstanceMainWindowRef =
1468 optInstanceMainWindow !=
nullptr
1469 ? makeQOhosOptional(QtOhos::QObjectThreadSafeRef(optInstanceMainWindow))
1473 [context, want, options, optInstanceMainWindowRef](
QtOhos::
JsState &jsState) {
1474 auto optAbilityPeer = tryMapOptMainWindowToAbilityPeer(jsState, optInstanceMainWindowRef);
1475 if (!optAbilityPeer) {
1476 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
1478 context->resultConsumer({});
1483 auto arguments = std::vector<QNapi::ValueWrapper>{QOhosJsEnv::toNapiValue(jsState.env(), want)};
1484 if (options.has_value())
1485 arguments.push_back(convertStartOptionsToNapiObject(jsState, options.value()));
1487 optAbilityPeer->qAbility().evalToPromiseOrRejectOnThrow(
"context.startAbilityForResult(*)", arguments)
1490 QNapi::Object abilityResult = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
1491 int resultCode = abilityResult.get<QNapi::Number>(
"resultCode");
1493 auto wantOrEmpty = QNapi::getOptionalPropOrEmpty<QNapi::Object>(abilityResult,
"want");
1494 auto jsonWant = !wantOrEmpty.IsEmpty()
1495 ? QOhosOptional<QJsonObject>(QOhosJsEnv::fromNapiValue<QJsonObject>(wantOrEmpty))
1496 : makeEmptyQOhosOptional();
1498 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
1499 [context, resultCode, jsonWant](
auto &) {
1500 constexpr int startedAbilityErrorResultCode = -1;
1501 context->resultConsumer(
1502 resultCode != startedAbilityErrorResultCode
1503 ? QOhosOptional<AbilityResult>({resultCode, jsonWant})
1504 : makeEmptyQOhosOptional());
1509 QtOhos::logJsCallbackError(cbInfo,
"Got error from startAbilityForResult()");
1510 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
1512 context->resultConsumer({});
1518void QOhosQpaFunctionsImpl::setDestroyAllowedFlagForAbilityInstances(
1519 std::vector<QObject *> instancesMainWindows,
bool destroyEnabled)
1521 std::vector<QtOhos::QObjectThreadSafeRef> instancesMainWindowsRefs;
1522 for (
auto *instanceMainWindow : instancesMainWindows)
1523 instancesMainWindowsRefs.emplace_back(instanceMainWindow);
1526 [&](
auto &jsState) {
1527 for (
const auto &instanceMainWindowRef : instancesMainWindowsRefs) {
1528 auto abilityPeer = jsState.tryGetQAbilityPeerByQWindow(instanceMainWindowRef);
1530 abilityPeer->destroyAllowedFlag()->store(destroyEnabled);
1536void QOhosQpaFunctionsImpl::setOhosConfigDarkModeFlag(QOhosOptional<
bool> darkModeFlag)
1538 setOhosConfigColorMode(
1539 darkModeFlag.has_value()
1540 ? darkModeFlag.value()
1546QOhosSupplier<QOhosOptional<
bool>> QOhosQpaFunctionsImpl::makeOhosConfigDarkModeFlagDataSource(
1547 QOhosConsumer<QOhosOptional<
bool>> darkModeFlagChangedHandler)
1549 auto colorModeDataSource = makeOhosConfigColorModeDataSource(
1550 [darkModeFlagChangedHandler = std::move(darkModeFlagChangedHandler)](OhosConfigurationColorMode newColorMode) {
1551 darkModeFlagChangedHandler(
1552 mapOhosConfigurationColorModeToDarkModeFlag(newColorMode));
1554 return [colorModeDataSource = std::move(colorModeDataSource)]() {
1555 return mapOhosConfigurationColorModeToDarkModeFlag(colorModeDataSource());
1559QOhosSupplier<
double> QOhosQpaFunctionsImpl::makeOhosConfigFontSizeScaleDataSource(
1560 QOhosConsumer<
double> valueChangedHandler)
1563 return makeOhosConfigValueDataSource<
double>(
1565 return initFontSizeScale;
1568 return config.get<QNapi::Number>(
"fontSizeScale").DoubleValue();
1570 std::move(valueChangedHandler));
1573int QOhosQpaFunctionsImpl::getCurrentApplicationVersionCode()
1575 return QtOhos::evalInJsThread(
1577 auto applicationInfoFlag = jsState.eval<QNapi::Number>(
1578 "@ohos.bundle.bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION");
1579 auto bundleInfo = jsState.eval<QNapi::Object>(
1580 "@ohos.bundle.bundleManager.getBundleInfoForSelfSync(*)", {applicationInfoFlag});
1581 int versionCode = bundleInfo.get<QNapi::Number>(
"versionCode");
1588bool QOhosQpaFunctionsImpl::readOhosNoUiChildMode()
1590 return QtOhos::evalInJsThread(
1591 [&](
auto &jsState) {
1592 return jsState.defaultQAbilityPeer()->instanceId().empty();
1597void QOhosQpaFunctionsImpl::startNoUiChildProcess(QString libraryName, QStringList args)
1600 [&](
auto &jsState) {
1601 std::vector<std::string> argsVector;
1603 args.begin(), args.end(),
std::back_inserter(argsVector),
1604 std::mem_fn(&QString::toStdString));
1605 jsState.startNoUiChildProcess(libraryName.toStdString(), argsVector);
1610bool QOhosQpaFunctionsImpl::hasSerialPortAccessRight(
const QString &portName)
1612 const auto optSerialPortId = tryConvertPortNameToSystemPortId(portName);
1613 if (!optSerialPortId.has_value()) {
1615 "%s: cannot convert serial port name '%s' to port id.",
1616 Q_FUNC_INFO, portName.toStdString().c_str());
1620 return QtOhos::evalInJsThread(
1622 return hasSerialPortAccessRightJsImpl(jsState, optSerialPortId.value());
1627void QOhosQpaFunctionsImpl::requestSerialPortAccessRight(
1628 const QString &portName, QObject *resultConsumerQtContext,
1629 QOhosConsumer<std::shared_ptr<
void>> resultConsumer)
1631 auto resultConsumerQtContextRef = QtOhos::makeQThreadSafeRef(resultConsumerQtContext);
1632 auto asyncResultConsumer = [resultConsumerQtContextRef, resultConsumer = std::move(resultConsumer)](
std::shared_ptr<
void> permissionContext) {
1633 resultConsumerQtContextRef.visitInQtThreadIfAlive(
1634 [resultConsumer = std::move(resultConsumer), permissionContext](
auto &resultConsumerQtContext) {
1635 QMetaObject::invokeMethod(
1636 &resultConsumerQtContext,
1637 [resultConsumer = std::move(resultConsumer), permissionContext]() {
1638 resultConsumer(permissionContext);
1640 Qt::QueuedConnection);
1644 const auto optSerialPortId = tryConvertPortNameToSystemPortId(portName);
1645 if (!optSerialPortId.has_value()) {
1647 "%s: cannot convert serial port name '%s' to port id.",
1648 Q_FUNC_INFO, portName.toStdString().c_str());
1650 asyncResultConsumer(
nullptr);
1654 QtOhos::invokeInQtThread(
1655 [serialPortId = optSerialPortId.value(), weakSelf = QtOhos::makeWeakPtr(shared_from_this()), asyncResultConsumer = std::move(asyncResultConsumer)]() {
1656 auto self = weakSelf.lock();
1660 auto alreadyGrantedPermissionContextIt =
1661 self->m_grantedSerialPortsPermissionContexts.find(serialPortId);
1662 auto optAlreadyGrantedPermissionContext =
1663 alreadyGrantedPermissionContextIt != self->m_grantedSerialPortsPermissionContexts.end()
1664 ? alreadyGrantedPermissionContextIt->second.lock()
1667 if (optAlreadyGrantedPermissionContext) {
1668 asyncResultConsumer(optAlreadyGrantedPermissionContext);
1672 self->m_pendingSerialPortsPermissionRequestsConsumers[serialPortId].push_back(
1673 std::move(asyncResultConsumer));
1675 if (self->m_pendingSerialPortsPermissionRequestsConsumers[serialPortId].size() == 1) {
1676 QtOhos::invokeInJsThread(
1677 [serialPortId, weakSelf](QtOhos::JsState &jsState) {
1678 requestSerialPortAccessRightJsImpl(
1681 [serialPortId, weakSelf](
bool granted) {
1682 QtOhos::invokeInQtThread(
1683 [serialPortId, weakSelf, granted]() {
1684 auto self = weakSelf.lock();
1686 self->processSerialPortPermissionResponse(serialPortId, granted);
1694std::pair<
bool, QList<QOhosQpaFunctions::FileShare::PolicyErrorResult>> QOhosQpaFunctionsImpl::persistPermission(
1695 const QList<FileShare::PolicyInfo> &policyInfos)
1697 return QtOhos::evalInJsThread(
1699 std::vector<std::shared_ptr<::FileShare_PolicyErrorResult>> outResults;
1700 auto retCode = fileSharePersistPermission(
1701 convertToFileSharePolicyInfos(policyInfos), outResults);
1703 return std::make_pair(isSuccessErrorCode(retCode), convertToPolicyErrorResults(outResults));
1708std::pair<
bool, QList<QOhosQpaFunctions::FileShare::PolicyErrorResult>> QOhosQpaFunctionsImpl::revokePermission(
1709 const QList<FileShare::PolicyInfo> &policyInfos)
1711 return QtOhos::evalInJsThread(
1713 std::vector<std::shared_ptr<::FileShare_PolicyErrorResult>> outResults;
1714 auto retCode = fileShareRevokePermission(
1715 convertToFileSharePolicyInfos(policyInfos), outResults);
1717 return std::make_pair(isSuccessErrorCode(retCode), convertToPolicyErrorResults(outResults));
1722std::pair<
bool, QList<QOhosQpaFunctions::FileShare::PolicyErrorResult>> QOhosQpaFunctionsImpl::activatePermission(
1723 const QList<FileShare::PolicyInfo> &policyInfos)
1725 return QtOhos::evalInJsThread(
1727 std::vector<std::shared_ptr<::FileShare_PolicyErrorResult>> outResults;
1728 auto retCode = fileShareActivatePermission(
1729 convertToFileSharePolicyInfos(policyInfos), outResults);
1731 return std::make_pair(isSuccessErrorCode(retCode), convertToPolicyErrorResults(outResults));
1736std::pair<
bool, QList<QOhosQpaFunctions::FileShare::PolicyErrorResult>> QOhosQpaFunctionsImpl::deactivatePermission(
1737 const QList<FileShare::PolicyInfo> &policyInfos)
1739 return QtOhos::evalInJsThread(
1741 std::vector<std::shared_ptr<::FileShare_PolicyErrorResult>> outResults;
1742 auto retCode = fileShareDeactivatePermission(
1743 convertToFileSharePolicyInfos(policyInfos), outResults);
1745 return std::make_pair(isSuccessErrorCode(retCode), convertToPolicyErrorResults(outResults));
1750std::pair<
bool, std::vector<
bool>> QOhosQpaFunctionsImpl::checkPersistent(
1751 const QList<FileShare::PolicyInfo> &policyInfos)
1753 return QtOhos::evalInJsThread(
1755 std::vector<
bool> outResults;
1756 auto retCode = fileShareCheckPersistentPermission(
1757 convertToFileSharePolicyInfos(policyInfos), outResults);
1759 return std::make_pair(isSuccessErrorCode(retCode), outResults);
1764bool QOhosQpaFunctionsImpl::showFileDialogToAuthorizeFilePath(QObject *parentWindow,
const QString &filePath)
1766 auto *qWindow = qobject_cast<QWindow *>(parentWindow);
1767 if (qWindow ==
nullptr)
1768 qOhosReportFatalErrorAndAbort(
"%s: window argument is null or not a QWindow", Q_FUNC_INFO);
1770 auto *platformWindow = QOhosPlatformWindow::fromQWindowOrNull(qWindow);
1771 if (platformWindow ==
nullptr)
1772 qOhosReportFatalErrorAndAbort(
"%s: failed to get platform window", Q_FUNC_INFO);
1774 auto eventLoop = std::make_shared<QEventLoop>();
1775 auto filePathAuthorized =
std::make_shared<
bool>(
false);
1778 platformWindow->internalWindowId(), filePath,
1779 [filePathAuthorized, eventLoop](
bool result) {
1780 *filePathAuthorized = result;
1786 return *filePathAuthorized;
1789void QOhosQpaFunctionsImpl::setWindowBrightness(QObject *window,
int brightness)
1791 auto *qWindow = qobject_cast<QWindow *>(window);
1792 if (qWindow ==
nullptr)
1793 qOhosReportFatalErrorAndAbort(
"%s: window argument is null or not a QWindow", Q_FUNC_INFO);
1795 QOhosPlatformWindow::setBrightness(qWindow, brightness);
1798void QOhosQpaFunctionsImpl::setWindowContrast(QObject *window,
int contrast)
1800 auto *qWindow = qobject_cast<QWindow *>(window);
1801 if (qWindow ==
nullptr)
1802 qOhosReportFatalErrorAndAbort(
"%s: window argument is null or not a QWindow", Q_FUNC_INFO);
1804 QOhosPlatformWindow::setContrast(qWindow, contrast);
1807void QOhosQpaFunctionsImpl::setWindowSaturation(QObject *window,
int saturation)
1809 auto *qWindow = qobject_cast<QWindow *>(window);
1810 if (qWindow ==
nullptr)
1811 qOhosReportFatalErrorAndAbort(
"%s: window argument is null or not a QWindow", Q_FUNC_INFO);
1813 QOhosPlatformWindow::setSaturation(qWindow, saturation);
1816std::shared_ptr<
void> QOhosQpaFunctionsImpl::shareDataUsingShareKit(
1817 QObject *optWindowObject,
const QList<ShareKit::SharedRecord> &recordsToShare,
1819 std::function<
void()> panelClosedCallback,
1820 QOhosConsumer<ShareKit::ShareOperationResult> optShareCompletedCallback)
1822 auto *optQWindow = qobject_cast<QWindow *>(optWindowObject);
1823 if (optWindowObject !=
nullptr && optQWindow ==
nullptr)
1824 qOhosReportFatalErrorAndAbort(
"%s: window argument is not a QWindow", Q_FUNC_INFO);
1826 std::vector<QOhosShareKit::SharedRecord> shareKitRecords;
1827 for (
const auto &record : recordsToShare) {
1828 shareKitRecords.push_back(
1829 QOhosShareKit::SharedRecord{
1830 .mimeType = record.mimeType.toStdString(),
1831 .content = qTransform(record.content, std::mem_fn(&QString::toStdString)),
1832 .filePath = qTransform(record.filePath, std::mem_fn(&QString::toStdString)),
1833 .title = qTransform(record.title, std::mem_fn(&QString::toStdString)),
1834 .label = qTransform(record.label, std::mem_fn(&QString::toStdString)),
1835 .description = qTransform(record.description, std::mem_fn(&QString::toStdString)),
1836 .thumbnail = record.thumbnail,
1837 .thumbnailFilePath = qTransform(record.thumbnailFilePath, std::mem_fn(&QString::toStdString)),
1838 .extraData = record.extraData,
1843 .anchor = qTransform(
1844 controllerOptions.anchorOffset,
1845 [&](
auto anchorOffset) {
1847 .windowOffset = anchorOffset,
1848 .size = controllerOptions.anchorSize,
1851 .selectionMode = qTransform(
1852 controllerOptions.useSingleSelectionMode,
1853 [](
auto singleSelectionMode) {
1854 return singleSelectionMode
1858 .previewMode = qTransform(
1859 controllerOptions.useDefaultPreviewMode,
1860 [](
auto defaultPreviewMode) {
1861 return defaultPreviewMode
1865 .excludedAbilities = qTransform(
1866 controllerOptions.excludedAbilities,
1867 [](
const auto &excludedAbilities) {
1868 std::vector<QOhosShareKit::ShareAbilityType> outExcludedAbilities;
1869 for (
auto excludedAbilityType : excludedAbilities) {
1870 outExcludedAbilities.push_back(
1871 mapShareAbilityTypeFromQpaFunctionsEnum(excludedAbilityType));
1873 return outExcludedAbilities;
1877 auto shareCompletedCallback = optShareCompletedCallback
1878 ?
std::move(optShareCompletedCallback)
1879 : makeQOhosNoOpConsumer();
1881 return QOhosShareKit::shareData(
1882 optQWindow, shareKitRecords, shareKitControllerOptions,
std::move(panelClosedCallback),
1883 [shareCompletedCallback = std::move(shareCompletedCallback)](
auto shareOperationResult) {
1884 shareCompletedCallback(
1885 ShareKit::ShareOperationResult{
1886 .targetAbilityName = QString::fromStdString(shareOperationResult.targetAbilityName),
1891bool QOhosQpaFunctionsImpl::tryOpenLink(QObject *optInstanceMainWindow,
const QString &link, QOhosOptional<
bool> appLinkingOnly)
1893 if (optInstanceMainWindow !=
nullptr && qobject_cast<QWindow *>(optInstanceMainWindow) ==
nullptr)
1894 qOhosReportFatalErrorAndAbort(
"%s: the main window argument is not a QWindow", Q_FUNC_INFO);
1896 auto optInstanceMainWindowRef = optInstanceMainWindow !=
nullptr
1897 ? makeQOhosOptional(QtOhos::QObjectThreadSafeRef(optInstanceMainWindow))
1900 return QtOhos::evalInJsThreadWithPromise<
bool>(
1901 [&](
QtOhos::
JsState &jsState, QOhosTaskPromise<
bool> evalPromise) {
1902 auto optAbilityPeer = tryMapOptMainWindowToAbilityPeer(jsState, optInstanceMainWindowRef);
1903 if (!optAbilityPeer) {
1908 std::vector<std::pair<std::string, QNapi::ValueWrapper>> openLinkOptions;
1909 if (appLinkingOnly.has_value())
1910 openLinkOptions.emplace_back(
"appLinkingOnly", appLinkingOnly.value());
1912 auto thenCatchPromises =
std::move(evalPromise).makeThenCatchBranches(Q_FUNC_INFO);
1913 optAbilityPeer->qAbility().evalToPromiseOrRejectOnThrow(
1914 "context.openLink(*)",
1917 QNapi::makeObject(jsState.env(), openLinkOptions),
1924 [catchPromise = std::move(thenCatchPromises.second)](
const QtOhos::
CallbackInfo &cbInfo) {
1925 QtOhos::logJsCallbackError(cbInfo,
"Got error from openLink()");
1926 catchPromise(
false);
1932void QOhosQpaFunctionsImpl::setAudioStreamUsageHintProperty(QObject *qObject,
AudioStreamUsage usage)
1937QOhosOptional<QOhosQpaFunctions::AudioStreamUsage> QOhosQpaFunctionsImpl::tryGetAudioStreamUsageHintProperty(QObject *qObject)
1942void QOhosQpaFunctionsImpl::processSerialPortPermissionResponse(
std::uint32_t serialPortId,
bool granted)
1944 auto permissionContext = granted
1945 ? QtOhos::makeDestroyNotifier(
1946 [serialPortId, weakSelf = QtOhos::makeWeakPtr(shared_from_this())]() {
1947 QtOhos::invokeInQtThread(
1948 [serialPortId, weakSelf]() {
1949 QtOhos::runInJsThreadAndWait(
1950 [&](QtOhos::JsState &jsState) {
1951 cancelSerialPortAccessRightJsImpl(jsState, serialPortId);
1955 auto self = weakSelf.lock();
1957 self->m_grantedSerialPortsPermissionContexts.erase(serialPortId);
1962 if (permissionContext)
1963 m_grantedSerialPortsPermissionContexts[serialPortId] = permissionContext;
1965 for (
const auto &asyncPermissionRequestConsumer : m_pendingSerialPortsPermissionRequestsConsumers[serialPortId])
1966 asyncPermissionRequestConsumer(permissionContext);
1968 m_pendingSerialPortsPermissionRequestsConsumers.erase(serialPortId);
1983 static QOhosQpaFunctionsImpl qpaFunctions;
1984 return qpaFunctions;
double fontSizeScale() const
static QWindowProxyRegistry & instance()
NativeNodeRenderFitPolicy
AbilityOnContinueResponseStatus
WindowGeometryPersistencePolicy
virtual ~QOhosQpaFunctions()
static std::shared_ptr< QUiAbilityPeer > tryCastFromQAbilityPeerOrNull(std::shared_ptr< QAbilityPeer > qAbilityPeer)
QtOhos::enums::kit::ShareKit::systemShare::SelectionMode SelectionMode
QtOhos::enums::kit::ShareKit::systemShare::ShareAbilityType ShareAbilityType
QtOhos::enums::kit::ShareKit::systemShare::SharePreviewMode SharePreviewMode
void showFileDialogAuthorization(QtOhos::InternalWindowId contextWinId, QString filePath, QOhosConsumer< bool > resultCallback)
@ WINDOW_MODE_SPLIT_PRIMARY
@ WINDOW_MODE_SPLIT_SECONDARY
@ NEW_PROCESS_ATTACH_TO_PARENT
@ NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM
void invokeInJsThread(std::function< void(JsState &)> task)
void runInJsThreadAndWait(const std::function< void(JsState &)> &task, std::string callerContextName={})
QOhosQpaFunctions & getQOhosQpaFunctions()
bool isOhosNoUiChildMode()
void invokeInJsThreadAndWaitForContinue(std::function< void(JsState &, QOhosTaskPromise<>)> &&task, std::string callerContextName={})
enums::ohos::app::ability::AbilityConstant::OnContinueResult QOhosAbilityOnContinueResult
std::nullopt_t makeEmptyQOhosOptional()
@ PERMISSION_NOT_PERSISTED
@ NEW_PROCESS_ATTACH_TO_PARENT
@ NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM
@ WINDOW_MODE_SPLIT_PRIMARY
@ WINDOW_MODE_SPLIT_SECONDARY