20QOhosOptional<QNapi::Object> tryMakeShareKitSharedDataRecordObject(
23 auto optUtdType = record.mimeType != mimeTextUriList
24 ? tryMapMimeTypeToUtdTypeId(record.mimeType)
25 : QOhosOptional<std::string>(QOhosUdsMeta<::OH_UdsHyperlink>::udmfMetaId);
27 if (!optUtdType.hasValue()) {
29 "%s: Cannot convert mime type: %s to utd type.", Q_FUNC_INFO, record
.mimeType.c_str());
33 std::vector<std::pair<std::string, QNapi::ValueWrapper>> objectProperties = {
34 {
"utd", optUtdType.value()},
37 if (record.content.hasValue()) {
38 objectProperties.emplace_back(
"content", record.content.value());
39 }
else if (record.filePath.hasValue()) {
40 objectProperties.emplace_back(
44 qOhosPrintfWarning(
"%s: Record doesn't have content nor uri.", Q_FUNC_INFO);
48 if (record.title.hasValue())
49 objectProperties.emplace_back(
"title", record.title.value());
51 if (record.label.hasValue())
52 objectProperties.emplace_back(
"label", record.label.value());
54 if (record.description.hasValue())
55 objectProperties.emplace_back(
"description", record.description.value());
57 if (record.thumbnail.hasValue()) {
58 auto thumbnail = record.thumbnail.value();
59 auto napiThumbnail = QNapi::TypedArrayOf<std::uint8_t>::New(jsState.env(), thumbnail.length());
60 std::memcpy(napiThumbnail.Data(), thumbnail.data(), thumbnail.length());
62 objectProperties.emplace_back(
"thumbnail", napiThumbnail);
65 if (record.thumbnailFilePath.hasValue()) {
66 objectProperties.emplace_back(
71 if (record.extraData.hasValue()) {
72 objectProperties.emplace_back(
74 QOhosJsEnv::toNapiValue(jsState.env(), QJsonObject::fromVariantMap(record.extraData.value())));
77 return makeQOhosOptional(QNapi::makeObject(jsState.env(), objectProperties));
80QOhosOptional<QNapi::Object> tryMakeShareKitShareControllerAnchorObject(
83 if (anchor.windowOffset.isNull())
86 auto shareControllerAnchorObject = QNapi::makeObject(
94 {
"x", anchor.windowOffset.x()},
95 {
"y", anchor.windowOffset.y()},
100 if (anchor.size.hasValue() && anchor.size.value().isValid()) {
101 shareControllerAnchorObject.set(
106 {
"width", anchor.size.value().width()},
107 {
"height", anchor.size.value().height()},
111 return makeQOhosOptional(shareControllerAnchorObject);
114QNapi::Object makeShareKitControllerOptionsObject(
117 auto controllerOptionsObject = QNapi::makeObject(jsState.env());
119 if (controllerOptions.selectionMode.hasValue()) {
120 controllerOptionsObject.set(
121 "selectionMode", jsState.mapOhosEnumToJs(controllerOptions.selectionMode.value()));
124 if (controllerOptions.anchor.hasValue()) {
125 auto controllerAnchorObject = tryMakeShareKitShareControllerAnchorObject(
126 jsState, controllerOptions.anchor.value());
127 if (controllerAnchorObject.hasValue())
128 controllerOptionsObject.set(
"anchor", controllerAnchorObject.value());
131 if (controllerOptions.previewMode.hasValue()) {
132 controllerOptionsObject.set(
133 "previewMode", jsState.mapOhosEnumToJs(controllerOptions.previewMode.value()));
136 if (controllerOptions.excludedAbilities.hasValue()) {
137 std::vector<QNapi::ValueWrapper> jsExcludedAbilities;
138 for (
auto excludedAbilityType : controllerOptions.excludedAbilities.value())
139 jsExcludedAbilities.push_back(jsState.mapOhosEnumToJs(excludedAbilityType));
140 controllerOptionsObject.set(
141 "excludedAbilities", QNapi::makeArray(jsState.env(), jsExcludedAbilities));
144 return controllerOptionsObject;
149 const std::vector<SharedRecord> &recordsToShare,
ControllerOptions controllerOptions,
150 std::function<
void()> panelClosedCallback, QOhosConsumer<std::shared_ptr<
void>> resultConsumer)
152 qOhosPrintfDebug(
"%s: sharing %lu records through ShareKit", Q_FUNC_INFO, recordsToShare.size());
154 if (recordsToShare.empty()) {
155 qOhosPrintfWarning(
"%s: No records to share. Skipping...", Q_FUNC_INFO);
156 resultConsumer(
nullptr);
160 auto firstRecord = tryMakeShareKitSharedDataRecordObject(jsState, recordsToShare.front());
161 if (!firstRecord.hasValue()) {
162 qOhosPrintfWarning(
"%s: Failed to create the very first record, skip sharing", Q_FUNC_INFO);
163 resultConsumer(
nullptr);
167 "%s: record #0 to be shared: %s",
168 Q_FUNC_INFO, QNapi::toJsonString(firstRecord.value()).c_str());
170 auto sharedDataObject = jsState.eval<QNapi::Object>(
171 "@kit.ShareKit.systemShare.SharedData<new>(*)", {firstRecord.value()});
173 for (
std::size_t i = 1; i < recordsToShare.size(); i++) {
174 auto record = tryMakeShareKitSharedDataRecordObject(jsState, recordsToShare.at(i));
175 if (record.hasValue()) {
177 "%s: record #%zu to be shared: %s",
178 Q_FUNC_INFO, i, QNapi::toJsonString(record.value()).c_str());
179 sharedDataObject.call(
"addRecord", {record.value()});
181 qOhosPrintfWarning(
"%s: Failed to create record", Q_FUNC_INFO);
185 auto controller = jsState.eval<QNapi::Object>(
186 "@kit.ShareKit.systemShare.ShareController<new>(*)", {sharedDataObject});
188 auto dissmissCallbackHandle = QtOhos::registerOnOffMethodsBasedEventHandler(
189 controller,
"dismiss",
std::move(panelClosedCallback));
191 controller.call<QNapi::Promise>(
194 uiAbilityPeer->qAbility().get<QNapi::Object>(
"context"),
195 makeShareKitControllerOptionsObject(jsState, controllerOptions),
197 .withContext(std::move(resultConsumer))
199 [dissmissCallbackHandle](
auto &resultConsumer) {
200 resultConsumer(dissmissCallbackHandle);
203 [](
const QtOhos::CallbackInfo &cbInfo,
auto &resultConsumer) {
204 QtOhos::logJsCallbackError(cbInfo,
"ShareController.show()");
205 resultConsumer(
nullptr);
209template<
typename ...Ts>
210QOhosConsumer<Ts...> makeAsyncConsumer(
211 QOhosConsumer<Ts...> baseConsumer, QOhosConsumer<std::function<
void()>> asyncExecutor)
213 auto sharedBaseConsumer = QtOhos::moveToSharedPtr(std::move(baseConsumer));
214 return [sharedBaseConsumer, asyncExecutor = std::move(asyncExecutor)](
const Ts &...args) {
216 [sharedBaseConsumer, args...]()
mutable {
217 (*sharedBaseConsumer)(
std::move(args)...);
225 QWindow *optInstanceMainWindow,
const std::vector<SharedRecord> &recordsToShare,
228 auto optMainWindowInstanceObjectRef =
229 optInstanceMainWindow !=
nullptr
230 ? makeQOhosOptional(QtOhos::QObjectThreadSafeRef(optInstanceMainWindow))
233 auto panelClosedJsCallback = makeAsyncConsumer(
234 std::move(panelClosedCallback), &QtOhos::invokeInQtThread);
236 return QtOhos::evalInJsThreadWithConsumer<
std::shared_ptr<
void>>(
237 [&](
QtOhos::
JsState &jsState, QOhosConsumer<std::shared_ptr<
void>> resultConsumer) {
239 optMainWindowInstanceObjectRef.hasValue()
240 ? jsState.tryGetQAbilityPeerByQWindow(optMainWindowInstanceObjectRef.value())
242 if (!uiAbilityPeer) {
243 qOhosPrintfWarning(
"%s only UIAbilities can share data with ShareKit", Q_FUNC_INFO);
244 resultConsumer(
nullptr);
249 jsState, uiAbilityPeer, recordsToShare, controllerOptions,
std::move(panelClosedJsCallback),
250 std::move(resultConsumer));