6#include <QtHarmonyExtras/private/qohossharekitbackend_p.h>
8#include <QtGui/qwindow.h>
10#include <QtCore/qmimedatabase.h>
11#include <QtCore/private/qohoscommon_p.h>
12#include <QtCore/private/qohoslogger_p.h>
22
23
24
25
30constexpr const char *mimeTextUriList =
"text/uri-list";
32std::optional<QOhosShareKit::ShareAbilityType> tryMapShareAbilityTypeToShareKitEnum(
35 switch (abilityType) {
36 case ShareAbilityType::CopyToPasteboard:
37 return std::make_optional(QOhosShareKit::ShareAbilityType::COPY_TO_PASTEBOARD);
38 case ShareAbilityType::SaveToMediaAsset:
39 return std::make_optional(QOhosShareKit::ShareAbilityType::SAVE_TO_MEDIA_ASSET);
40 case ShareAbilityType::SaveAsFile:
41 return std::make_optional(QOhosShareKit::ShareAbilityType::SAVE_AS_FILE);
42 case ShareAbilityType::Print:
43 return std::make_optional(QOhosShareKit::ShareAbilityType::PRINT);
44 case ShareAbilityType::SaveToSuperHub:
45 return std::make_optional(QOhosShareKit::ShareAbilityType::SAVE_TO_SUPERHUB);
51std::vector<QOhosShareKit::ShareAbilityType> mapExcludedAbilitiesToShareKit(
52 const QList<ShareAbilityType> &excludedAbilities)
54 std::vector<QOhosShareKit::ShareAbilityType> shareKitExcludedAbilities;
55 for (
auto excludedAbilityType : excludedAbilities) {
56 auto optShareKitExcludedAbilityType = tryMapShareAbilityTypeToShareKitEnum(excludedAbilityType);
57 if (optShareKitExcludedAbilityType.has_value())
58 shareKitExcludedAbilities.push_back(optShareKitExcludedAbilityType.value());
60 return shareKitExcludedAbilities;
63class SharedRecordImpl :
public SharedRecord
66 SharedRecordImpl(
const QMimeType &mimeType,
const QString &content,
bool urlContent);
67 SharedRecordImpl(
const QFileInfo &fileInfo);
69 QMimeType mimeType()
const override;
70 QString content()
const override;
71 QString filePath()
const override;
72 bool isUrlContent()
const override;
74 void setTitle(
const QString &title)
override;
75 QString title()
const override;
77 void setLabel(
const QString &label)
override;
78 QString label()
const override;
80 void setDescription(
const QString &description)
override;
81 QString description()
const override;
83 void setThumbnail(
const QByteArray &thumbnail)
override;
84 QByteArray thumbnail()
const override;
86 void setThumbnailFilePath(
const QString &thumbnailFilePath)
override;
87 QString thumbnailFilePath()
const override;
89 void setExtraData(
const QVariantMap &extraData)
override;
90 QVariantMap extraData()
const override;
94 std::optional<QString> m_content;
95 std::optional<QString> m_filePath;
97 std::optional<QString> m_title;
98 std::optional<QString> m_label;
99 std::optional<QString> m_description;
100 std::optional<QByteArray> m_thumbnail;
101 std::optional<QString> m_thumbnailFilePath;
102 std::optional<QVariantMap> m_extraData;
105SharedRecordImpl::SharedRecordImpl(
const QMimeType &mimeType,
const QString &content,
bool urlContent)
107 , m_mimeType(mimeType)
109 , m_urlContent(urlContent)
113SharedRecordImpl::SharedRecordImpl(
const QFileInfo &fileInfo)
115 , m_mimeType(QMimeDatabase().mimeTypeForFile(fileInfo))
116 , m_filePath(fileInfo.absoluteFilePath())
117 , m_urlContent(
false)
121QMimeType SharedRecordImpl::mimeType()
const
126QString SharedRecordImpl::content()
const
128 return m_content.value_or(QString());
131QString SharedRecordImpl::filePath()
const
133 return m_filePath.value_or(QString());
136bool SharedRecordImpl::isUrlContent()
const
141void SharedRecordImpl::setTitle(
const QString &title)
146QString SharedRecordImpl::title()
const
148 return m_title.value_or(QString());
151void SharedRecordImpl::setLabel(
const QString &label)
156QString SharedRecordImpl::label()
const
158 return m_label.value_or(QString());
161void SharedRecordImpl::setDescription(
const QString &description)
163 m_description = description;
166QString SharedRecordImpl::description()
const
168 return m_description.value_or(QString());
171void SharedRecordImpl::setThumbnail(
const QByteArray &thumbnail)
173 m_thumbnail = thumbnail;
176QByteArray SharedRecordImpl::thumbnail()
const
178 return m_thumbnail.value_or(QByteArray());
181void SharedRecordImpl::setThumbnailFilePath(
const QString &thumbnailFilePath)
183 m_thumbnailFilePath = thumbnailFilePath;
186QString SharedRecordImpl::thumbnailFilePath()
const
188 return m_thumbnailFilePath.value_or(QString());
191void SharedRecordImpl::setExtraData(
const QVariantMap &extraData)
193 m_extraData = extraData;
196QVariantMap SharedRecordImpl::extraData()
const
198 return m_extraData.value_or(QVariantMap());
201class ShareControllerOptionsImpl :
public ShareControllerOptions
204 void setAnchorOffset(QPoint anchorOffset)
override;
205 void setAnchor(QRect anchor)
override;
206 std::optional<QPoint> anchorOffset()
const;
207 std::optional<QSize> anchorSize()
const;
209 void setSingleSelectionMode(
bool singleSelectionMode) override;
210 std::optional<
bool> isSingleSelection()
const;
212 void setDefaultPreviewMode(
bool defaultPreviewMode) override;
213 std::optional<
bool> isDefaultPreview()
const;
215 void setExcludedAbilities(
const QList<ShareAbilityType> &excludedAbilities)
override;
216 std::optional<QList<ShareAbilityType>> excludedAbilities()
const;
219 std::optional<QPoint> m_anchorOffset;
220 std::optional<QSize> m_anchorSize;
221 std::optional<
bool> m_singleSelectionMode;
222 std::optional<
bool> m_defaultPreviewMode;
223 std::optional<QList<ShareAbilityType>> m_excludedAbilities;
226void ShareControllerOptionsImpl::setAnchorOffset(QPoint anchorOffset)
228 m_anchorOffset = anchorOffset;
231void ShareControllerOptionsImpl::setAnchor(QRect anchor)
233 m_anchorOffset = anchor.topLeft();
234 m_anchorSize = anchor.size();
237std::optional<QPoint> ShareControllerOptionsImpl::anchorOffset()
const
239 return m_anchorOffset;
242std::optional<QSize> ShareControllerOptionsImpl::anchorSize()
const
247void ShareControllerOptionsImpl::setSingleSelectionMode(
bool singleSelectionMode)
249 m_singleSelectionMode = singleSelectionMode;
252std::optional<
bool> ShareControllerOptionsImpl::isSingleSelection()
const
254 return m_singleSelectionMode;
257void ShareControllerOptionsImpl::setDefaultPreviewMode(
bool defaultPreviewMode)
259 m_defaultPreviewMode = defaultPreviewMode;
262std::optional<
bool> ShareControllerOptionsImpl::isDefaultPreview()
const
264 return m_defaultPreviewMode;
267void ShareControllerOptionsImpl::setExcludedAbilities(
const QList<ShareAbilityType> &excludedAbilities)
269 m_excludedAbilities = excludedAbilities;
272std::optional<QList<ShareAbilityType>> ShareControllerOptionsImpl::excludedAbilities()
const
274 return m_excludedAbilities;
277class ShareOperationResultImpl :
public ShareOperationResult
280 ShareOperationResultImpl(
281 const QOhosShareKit::ShareOperationResult &shareOperationResult);
283 QString targetAbilityName()
const override;
286 QString m_targetAbilityName;
289ShareOperationResultImpl::ShareOperationResultImpl(
290 const QOhosShareKit::ShareOperationResult &shareOperationResult)
291 : ShareOperationResult()
292 , m_targetAbilityName(QString::fromStdString(shareOperationResult.targetAbilityName))
296QString ShareOperationResultImpl::targetAbilityName()
const
298 return m_targetAbilityName;
301std::vector<QOhosShareKit::SharedRecord> convertToShareKitSharedRecords(
302 const QList<std::shared_ptr<SharedRecord>> &dataToShare)
304 std::vector<QOhosShareKit::SharedRecord> records;
306 for (
const auto &sharedRecord : dataToShare) {
307 const auto *sharedRecordImpl =
static_cast<
const SharedRecordImpl *>(sharedRecord.get());
309 auto shareKitSharedRecord = QOhosShareKit::SharedRecord{};
310 shareKitSharedRecord.mimeType = !sharedRecordImpl->isUrlContent()
311 ? sharedRecordImpl->mimeType().name().toStdString()
312 : std::string(mimeTextUriList);
314 if (!sharedRecordImpl->content().isNull()) {
315 shareKitSharedRecord.content = sharedRecordImpl->content().toStdString();
316 }
else if (!sharedRecordImpl->filePath().isNull()) {
317 shareKitSharedRecord.filePath = sharedRecordImpl->filePath().toStdString();
319 qOhosPrintfWarning(
"%s: SharedRecord doesn't have content or uri, skipping...", Q_FUNC_INFO);
323 if (!sharedRecordImpl->title().isNull())
324 shareKitSharedRecord.title = sharedRecordImpl->title().toStdString();
325 if (!sharedRecordImpl->label().isNull())
326 shareKitSharedRecord.label = sharedRecordImpl->label().toStdString();
327 if (!sharedRecordImpl->description().isNull())
328 shareKitSharedRecord.description = sharedRecordImpl->description().toStdString();
329 if (!sharedRecordImpl->thumbnail().isNull())
330 shareKitSharedRecord.thumbnail = sharedRecordImpl->thumbnail();
331 if (!sharedRecordImpl->thumbnailFilePath().isNull())
332 shareKitSharedRecord.thumbnailFilePath = sharedRecordImpl->thumbnailFilePath().toStdString();
333 if (!sharedRecordImpl->extraData().isEmpty())
334 shareKitSharedRecord.extraData = sharedRecordImpl->extraData();
336 records.push_back(shareKitSharedRecord);
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
364
365
366
367
368
369
372
373
374
375
376
377
380
381
382
383
384
385
388
389
390
391
392
393
396
397
398
399
400
401
404
405
406
407
408
409
412
413
414
415
416
417
420
421
422
423
424
425
428
429
430
431
432
433
436
437
438
439
440
441
444
445
446
447
448
449
452
453
454
455
456
457
460
461
462
463
464
465
468
469
470
471
472
473
476
477
478
479
480
481
484
485
486
487
488
489
495
496
497
498
499
500
501
502
505
506
507
508
509
510
513
514
515
516
517
518
521
522
523
524
525
526
527
531
532
533
534
535
536
537
540
541
542
543
544
545
551
552
553
554
555
556
557
558
561
562
563
564
565
566
572
573
574
575
576
577
578
580 const QMimeType &mimeType,
const QString &content)
582 return std::make_shared<SharedRecordImpl>(mimeType, content,
false);
586
587
588
589
590
591
592
595 return std::make_shared<SharedRecordImpl>(fileInfo);
599
600
601
602
603
604
607 return std::make_shared<SharedRecordImpl>(QMimeType(), url.toString(),
true);
611
612
613
614
615
616
617
620 return std::make_shared<ShareControllerOptionsImpl>();
630 QWindow *optMainWindow,
const QList<std::shared_ptr<SharedRecord>> &records,
631 std::shared_ptr<ShareControllerOptions> controllerOptions,
632 std::function<
void()> panelClosedCallback,
633 std::function<
void(std::shared_ptr<ShareKit::ShareOperationResult>)> shareCompletedCallback)
635 QOhosShareKit::ControllerOptions shareKitControllerOptions;
636 if (controllerOptions) {
637 const auto *controllerOptionsImpl =
static_cast<
const ShareControllerOptionsImpl *>(controllerOptions.get());
639 const auto optAnchorOffset = controllerOptionsImpl->anchorOffset();
640 if (optAnchorOffset.has_value()) {
641 shareKitControllerOptions.anchor = QOhosShareKit::ShareControllerAnchor{
642 .windowOffset = optAnchorOffset.value(),
643 .size = controllerOptionsImpl->anchorSize(),
647 const auto optSingleSelection = controllerOptionsImpl->isSingleSelection();
648 if (optSingleSelection.has_value()) {
649 shareKitControllerOptions.selectionMode = optSingleSelection.value()
650 ? QOhosShareKit::SelectionMode::SINGLE
651 : QOhosShareKit::SelectionMode::BATCH;
654 const auto optDefaultPreview = controllerOptionsImpl->isDefaultPreview();
655 if (optDefaultPreview.has_value()) {
656 shareKitControllerOptions.previewMode = optDefaultPreview.value()
657 ? QOhosShareKit::SharePreviewMode::DEFAULT
658 : QOhosShareKit::SharePreviewMode::DETAIL;
661 const auto optExcludedAbilities = controllerOptionsImpl->excludedAbilities();
662 if (optExcludedAbilities.has_value())
663 shareKitControllerOptions.excludedAbilities =
664 mapExcludedAbilitiesToShareKit(optExcludedAbilities.value());
667 return QOhosShareKit::shareData(
668 optMainWindow, convertToShareKitSharedRecords(records), shareKitControllerOptions,
669 std::move(panelClosedCallback),
670 [shareCompletedCallback = std::move(shareCompletedCallback)](
auto shareOperationResult) {
671 shareCompletedCallback(std::make_shared<ShareOperationResultImpl>(shareOperationResult));
Combined button and popup list for selecting options.