Add open on remote device (Desktop)

Summary:
Add openFile to Share Plugin and extend handler to open local file urls

Future extension: Modify the desktop file to allow Open with > Open on connected device

Depends on D16605

Test Plan: Apply Android patch. Use kdeconnect-handler file:///somefile. Check phone for reaction

Reviewers: #kde_connect, albertvaka

Reviewed By: #kde_connect, albertvaka

Subscribers: sredman, kdeconnect

Tags: #kde_connect

Maniphest Tasks: T8637

Differential Revision: https://phabricator.kde.org/D15294
This commit is contained in:
Nicolas Fella 2018-11-04 19:52:51 +01:00
parent 8d831d018b
commit ccd476c150
3 changed files with 21 additions and 2 deletions

View file

@ -173,6 +173,18 @@ void SharePlugin::shareText(const QString& text)
sendPacket(packet); sendPacket(packet);
} }
void SharePlugin::openFile(const QUrl& url)
{
NetworkPacket packet(PACKET_TYPE_SHARE_REQUEST);
if(url.isLocalFile()) {
QSharedPointer<QIODevice> ioFile(new QFile(url.toLocalFile()));
packet.setPayload(ioFile, ioFile->size());
packet.set<QString>(QStringLiteral("filename"), QUrl(url).fileName());
packet.set<bool>(QStringLiteral("open"), true);
}
sendPacket(packet);
}
QString SharePlugin::dbusPath() const QString SharePlugin::dbusPath() const
{ {
return "/modules/kdeconnect/devices/" + device()->id() + "/share"; return "/modules/kdeconnect/devices/" + device()->id() + "/share";

View file

@ -39,6 +39,7 @@ public:
///Helper method, QDBus won't recognize QUrl ///Helper method, QDBus won't recognize QUrl
Q_SCRIPTABLE void shareUrl(const QString& url) { shareUrl(QUrl(url)); } Q_SCRIPTABLE void shareUrl(const QString& url) { shareUrl(QUrl(url)); }
Q_SCRIPTABLE void shareText(const QString& text); Q_SCRIPTABLE void shareText(const QString& text);
Q_SCRIPTABLE void openFile(const QString& file) { openFile(QUrl(file)); }
bool receivePacket(const NetworkPacket& np) override; bool receivePacket(const NetworkPacket& np) override;
void connected() override {} void connected() override {}
@ -53,6 +54,8 @@ Q_SIGNALS:
private: private:
void shareUrl(const QUrl& url); void shareUrl(const QUrl& url);
void openFile(const QUrl& url);
QUrl destinationDir() const; QUrl destinationDir() const;

View file

@ -64,9 +64,11 @@ int main(int argc, char** argv)
KAboutData::setApplicationData(about); KAboutData::setApplicationData(about);
QUrl urlToShare; QUrl urlToShare;
bool open;
{ {
QCommandLineParser parser; QCommandLineParser parser;
parser.addPositionalArgument(QStringLiteral("url"), i18n("URL to share")); parser.addPositionalArgument(QStringLiteral("url"), i18n("URL to share"));
parser.addOption(QCommandLineOption(QStringLiteral("open"), QStringLiteral("Open the file on the remote device")));
parser.addHelpOption(); parser.addHelpOption();
about.setupCommandLine(&parser); about.setupCommandLine(&parser);
parser.process(app); parser.process(app);
@ -77,6 +79,7 @@ int main(int argc, char** argv)
} }
urlToShare = QUrl::fromUserInput(parser.positionalArguments().constFirst()); urlToShare = QUrl::fromUserInput(parser.positionalArguments().constFirst());
open = parser.isSet(QStringLiteral("open"));
} }
DevicesModel model; DevicesModel model;
@ -95,7 +98,7 @@ int main(int argc, char** argv)
if (urlToShare.scheme() == QLatin1String("tel")) { if (urlToShare.scheme() == QLatin1String("tel")) {
displayUrl = urlToShare.toDisplayString(QUrl::RemoveScheme); displayUrl = urlToShare.toDisplayString(QUrl::RemoveScheme);
uidialog.label->setText(i18n("Device to call %1 with:", displayUrl)); uidialog.label->setText(i18n("Device to call %1 with:", displayUrl));
} else if (urlToShare.isLocalFile()) { } else if (urlToShare.isLocalFile() && open) {
displayUrl = urlToShare.toDisplayString(QUrl::PreferLocalFile); displayUrl = urlToShare.toDisplayString(QUrl::PreferLocalFile);
uidialog.label->setText(i18n("Device to send %1 to:", displayUrl)); uidialog.label->setText(i18n("Device to send %1 to:", displayUrl));
} else { } else {
@ -110,8 +113,9 @@ int main(int argc, char** argv)
const int currentDeviceIndex = uidialog.devicePicker->currentIndex(); const int currentDeviceIndex = uidialog.devicePicker->currentIndex();
if(!url.isEmpty() && currentDeviceIndex >= 0) { if(!url.isEmpty() && currentDeviceIndex >= 0) {
const QString device = proxyModel.index(currentDeviceIndex, 0).data(DevicesModel::IdModelRole).toString(); const QString device = proxyModel.index(currentDeviceIndex, 0).data(DevicesModel::IdModelRole).toString();
const QString action = open && url.isLocalFile() ? QStringLiteral("openFile") : QStringLiteral("shareUrl");
QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.kdeconnect"), "/modules/kdeconnect/devices/"+device+"/share", QStringLiteral("org.kde.kdeconnect.device.share"), QStringLiteral("shareUrl")); QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.kdeconnect"), "/modules/kdeconnect/devices/"+device+"/share", QStringLiteral("org.kde.kdeconnect.device.share"), action);
msg.setArguments({ url.toString() }); msg.setArguments({ url.toString() });
blockOnReply(QDBusConnection::sessionBus().asyncCall(msg)); blockOnReply(QDBusConnection::sessionBus().asyncCall(msg));
return 0; return 0;