// (c) 2017 Ekkehard Gentz (ekke) @ekkescorner // my blog about Qt for mobile: http://j.mp/qt-x // see also /COPYRIGHT and /LICENSE #import "headers/shareUtils/ios/iosshareutils.h" #import #import #import #import #import #import #import #import "headers/shareUtils/ios/docviewcontroller.h" IosShareUtils::IosShareUtils(QObject *parent) : PlatformShareUtils(parent) { // Sharing Files from other iOS Apps I got the ideas and some code contribution from: // Thomas K. Fischer (@taskfabric) - http://taskfabric.com - thx QDesktopServices::setUrlHandler("file", this, "handleFileUrlReceived"); QDesktopServices::setUrlHandler("https", this, "handleHttpsUrlReceived"); } bool IosShareUtils::checkMimeTypeView(const QString &mimeType) { #pragma unused (mimeType) // dummi implementation on iOS // MimeType not used yet return true; } bool IosShareUtils::checkMimeTypeEdit(const QString &mimeType) { #pragma unused (mimeType) // dummi implementation on iOS // MimeType not used yet return true; } void IosShareUtils::shareText(const QString &text, const QUrl &url) { NSMutableArray *sharingItems = [NSMutableArray new]; if (!text.isEmpty()) { [sharingItems addObject:text.toNSString()]; } if (url.isValid()) { [sharingItems addObject:url.toNSURL()]; } // get the main window rootViewController UIViewController *qtUIViewController = [[UIApplication sharedApplication].keyWindow rootViewController]; UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil]; if ( [activityController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8 activityController.popoverPresentationController.sourceView = qtUIViewController.view; } [qtUIViewController presentViewController:activityController animated:YES completion:nil]; } // altImpl not used yet on iOS, on Android twi ways to use JNI void IosShareUtils::sendFile(const QString &filePath, const QString &title, const QString &mimeType, const int &requestId) { #pragma unused (title, mimeType) NSString* nsFilePath = filePath.toNSString(); NSURL *nsFileUrl = [NSURL fileURLWithPath:nsFilePath]; static DocViewController* docViewController = nil; if(docViewController!=nil) { [docViewController removeFromParentViewController]; [docViewController release]; } UIDocumentInteractionController* documentInteractionController = nil; documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:nsFileUrl]; UIViewController* qtUIViewController = [[[[UIApplication sharedApplication]windows] firstObject]rootViewController]; if(qtUIViewController!=nil) { docViewController = [[DocViewController alloc] init]; docViewController.requestId = requestId; // we need this to be able to execute handleDocumentPreviewDone() method, // when preview was finished docViewController.mIosShareUtils = this; [qtUIViewController addChildViewController:docViewController]; documentInteractionController.delegate = docViewController; // [documentInteractionController presentPreviewAnimated:YES]; if(![documentInteractionController presentPreviewAnimated:YES]) { emit shareError(0, tr("No App found to open: %1").arg(filePath)); } } } void IosShareUtils::viewFile(const QString &filePath, const QString &title, const QString &mimeType, const int &requestId) { #pragma unused (title, mimeType) sendFile(filePath, title, mimeType, requestId); } void IosShareUtils::editFile(const QString &filePath, const QString &title, const QString &mimeType, const int &requestId) { #pragma unused (title, mimeType) sendFile(filePath, title, mimeType, requestId); } void IosShareUtils::handleDocumentPreviewDone(const int &requestId) { // documentInteractionControllerDidEndPreview qDebug() << "handleShareDone: " << requestId; emit shareFinished(requestId); } void IosShareUtils::handleFileUrlReceived(const QUrl &url) { QString incomingUrl = url.toString(); if(incomingUrl.isEmpty()) { qWarning() << "setFileUrlReceived: we got an empty URL"; emit shareError(0, tr("Empty URL received")); return; } qDebug() << "IosShareUtils setFileUrlReceived: we got the File URL from iOS: " << incomingUrl; QString myUrl; if(incomingUrl.startsWith("file://")) { myUrl= incomingUrl.right(incomingUrl.length()-7); qDebug() << "QFile needs this URL: " << myUrl; } else { myUrl= incomingUrl; } // check if File exists QFileInfo fileInfo = QFileInfo(myUrl); if(fileInfo.exists()) { emit fileUrlReceived(myUrl); } else { qDebug() << "setFileUrlReceived: FILE does NOT exist "; emit shareError(0, tr("File does not exist: %1").arg(myUrl)); } } void IosShareUtils::handleHttpsUrlReceived(const QUrl &url) { if(url.isEmpty()) { qWarning() << "handleHttpsUrlReceived: we got an empty URL"; emit shareError(0, tr("Empty URL received")); return; } qDebug() << "IosShareUtils handleHttpsUrlReceived: we got the Other URL from IOS: " << url; emit otherUrlReceived(url.toString(), "https"); }