39 changes: 22 additions & 17 deletions plugins/CMakeLists.txt
Expand Up @@ -3,25 +3,30 @@ add_definitions(-DTRANSLATION_DOMAIN=\"kdeconnect-plugins\")
install(FILES kdeconnect_plugin.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR})

add_subdirectory(ping)
add_subdirectory(clipboard)
add_subdirectory(telephony)
add_subdirectory(share)
add_subdirectory(notifications)
add_subdirectory(battery)
add_subdirectory(findmyphone)
add_subdirectory(remotekeyboard)
if(WIN32)
add_subdirectory(mousepad_windows)
else()
add_subdirectory(runcommand)
add_subdirectory(sendnotifications)
add_subdirectory(pausemusic)
add_subdirectory(mpriscontrol)
add_subdirectory(mousepad)
add_subdirectory(screensaver-inhibit)
add_subdirectory(sftp)
add_subdirectory(sendnotifications)

if(NOT SAILFISHOS)
add_subdirectory(clipboard)
add_subdirectory(share)
add_subdirectory(remotekeyboard)
add_subdirectory(notifications)
add_subdirectory(findmyphone)
add_subdirectory(telephony)

if(WIN32)
add_subdirectory(mousepad_windows)
else()
add_subdirectory(runcommand)
add_subdirectory(pausemusic)
add_subdirectory(mpriscontrol)
add_subdirectory(mousepad)
add_subdirectory(screensaver-inhibit)
add_subdirectory(sftp)
endif()
endif()
if(EXPERIMENTALAPP_ENABLED)

if(SAILFISHOS OR EXPERIMENTALAPP_ENABLED)
add_subdirectory(remotecommands)
add_subdirectory(mprisremote)
add_subdirectory(remotecontrol)
Expand Down
2 changes: 1 addition & 1 deletion plugins/battery/batteryplugin.cpp
Expand Up @@ -21,6 +21,7 @@
#include "batteryplugin.h"

#include <QIcon>

#include <KLocalizedString>
#include <KPluginFactory>

Expand Down Expand Up @@ -73,7 +74,6 @@ bool BatteryPlugin::receivePacket(const NetworkPacket& np)

if ( thresholdEvent == ThresholdBatteryLow && !isCharging ) {
Daemon::instance()->sendSimpleNotification(QStringLiteral("batteryLow"), i18nc("device name: low battery", "%1: Low Battery", device()->name()), i18n("Battery at %1%", currentCharge), QStringLiteral("battery-040"));

}

return true;
Expand Down
9 changes: 6 additions & 3 deletions plugins/notifications/notificationsdbusinterface.cpp
Expand Up @@ -30,6 +30,9 @@
#include "notificationsplugin.h"
#include "sendreplydialog.h"

//In older Qt released, qAsConst isnt available
#include "qtcompat_p.h"

NotificationsDbusInterface::NotificationsDbusInterface(KdeConnectPlugin* plugin)
: QDBusAbstractAdaptor(const_cast<Device*>(plugin->device()))
, m_device(plugin->device())
Expand Down Expand Up @@ -109,9 +112,9 @@ void NotificationsDbusInterface::addNotification(Notification* noti)

connect(noti, &Notification::dismissRequested,
this, &NotificationsDbusInterface::dismissRequested);
connect(noti, &Notification::replyRequested, this, [this,noti]{
replyRequested(noti);

connect(noti, &Notification::replyRequested, this, [this,noti]{
replyRequested(noti);
});

const QString& publicId = newId();
Expand Down
3 changes: 3 additions & 0 deletions plugins/pausemusic/pausemusicplugin.cpp
Expand Up @@ -30,6 +30,9 @@

#include <KPluginFactory>

//In older Qt released, qAsConst isnt available
#include "qtcompat_p.h"

K_PLUGIN_FACTORY_WITH_JSON( KdeConnectPluginFactory, "kdeconnect_pausemusic.json", registerPlugin< PauseMusicPlugin >(); )

Q_LOGGING_CATEGORY(KDECONNECT_PLUGIN_PAUSEMUSIC, "kdeconnect.plugin.pausemusic")
Expand Down
17 changes: 14 additions & 3 deletions plugins/sendnotifications/CMakeLists.txt
@@ -1,23 +1,33 @@
if (SAILFISHOS)
set(SN_PLUGIN_ENABLED_BY_DEFAULT "true")
else()
set(SN_PLUGIN_ENABLED_BY_DEFAULT "false")
endif()

configure_file(kdeconnect_sendnotifications.json.in kdeconnect_sendnotifications.json)

set(kdeconnect_sendnotifications_SRCS
sendnotificationsplugin.cpp
notificationslistener.cpp
notifyingapplication.cpp
kdeconnect_sendnotifications.json
)

kdeconnect_add_plugin(kdeconnect_sendnotifications JSON kdeconnect_sendnotifications.json SOURCES ${kdeconnect_sendnotifications_SRCS})
kdeconnect_add_plugin(kdeconnect_sendnotifications JSON "${CMAKE_CURRENT_BINARY_DIR}/kdeconnect_sendnotifications.json" SOURCES ${kdeconnect_sendnotifications_SRCS})

target_link_libraries(kdeconnect_sendnotifications
kdeconnectcore
Qt5::DBus
KF5::Notifications
${NOTIFICATION_LIB}
KF5::I18n
Qt5::Gui
KF5::IconThemes
KF5::ConfigCore
)

#######################################
# Config

if (NOT SAILFISHOS)
set( kdeconnect_sendnotifications_config_SRCS
sendnotifications_config.cpp
notifyingapplication.cpp
Expand All @@ -35,3 +45,4 @@ target_link_libraries( kdeconnect_sendnotifications_config

install( TARGETS kdeconnect_sendnotifications_config DESTINATION ${PLUGIN_INSTALL_DIR} )
install( FILES kdeconnect_sendnotifications_config.desktop DESTINATION ${SERVICES_INSTALL_DIR} )
endif()
Expand Up @@ -43,7 +43,7 @@
"Description[x-test]": "xxBroadcast this computer's notifications, so they can be shown on other devices.xx",
"Description[zh_CN]": "广播此计算机的通知,以被其他设备显示。",
"Description[zh_TW]": "廣播此電腦的通知,這樣可以顯示在其他裝置上。",
"EnabledByDefault": false,
"EnabledByDefault": ${SN_PLUGIN_ENABLED_BY_DEFAULT},
"Icon": "preferences-desktop-notification",
"Id": "kdeconnect_sendnotifications",
"License": "GPL",
Expand Down
5 changes: 4 additions & 1 deletion plugins/sendnotifications/notificationslistener.cpp
Expand Up @@ -27,7 +27,6 @@
#include <QImage>
#include <KConfig>
#include <KConfigGroup>

#include <kiconloader.h>
#include <kicontheme.h>

Expand All @@ -39,6 +38,9 @@
#include "sendnotification_debug.h"
#include "notifyingapplication.h"

//In older Qt released, qAsConst isnt available
#include "qtcompat_p.h"

NotificationsListener::NotificationsListener(KdeConnectPlugin* aPlugin)
: QDBusAbstractAdaptor(aPlugin),
m_plugin(aPlugin)
Expand Down Expand Up @@ -179,6 +181,7 @@ QSharedPointer<QIODevice> NotificationsListener::iconForIconName(const QString&
return QSharedPointer<QIODevice>(new QFile(iconPath));
return QSharedPointer<QIODevice>();
}

uint NotificationsListener::Notify(const QString& appName, uint replacesId,
const QString& appIcon,
const QString& summary, const QString& body,
Expand Down
26 changes: 26 additions & 0 deletions sfos/CMakeLists.txt
@@ -0,0 +1,26 @@
find_package(Qt5 5.2 REQUIRED COMPONENTS DBus)

pkg_check_modules(NNQT5 REQUIRED nemonotifications-qt5)
include_directories(${NNQT5_INCLUDE_DIRS})

set(kdeconnectsfos_SRCS
kdeconnect-sfos.cpp
)

add_executable(kdeconnect-sfos ${kdeconnectsfos_SRCS})
target_link_libraries(kdeconnect-sfos Qt5::Quick sailfishapp)

install(TARGETS kdeconnect-sfos ${INSTALL_TARGETS_DEFAULT_ARGS})
install(PROGRAMS kdeconnect-sfos.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
INSTALL( DIRECTORY qml DESTINATION ${SHARE_INSTALL_PREFIX}/kdeconnect-sfos/ )

#Daemon
add_executable(kdeconnectd sailfishdaemon.cpp)
target_link_libraries(kdeconnectd kdeconnectcore KF5::DBusAddons ${NNQT5_LIBRARIES} KF5::I18n)

configure_file(kdeconnectd.desktop.cmake ${CMAKE_CURRENT_BINARY_DIR}/kdeconnectd.desktop)
configure_file(org.kde.kdeconnect.service.in ${CMAKE_CURRENT_BINARY_DIR}/org.kde.kdeconnect.service)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/kdeconnectd.desktop DESTINATION ${AUTOSTART_INSTALL_DIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.kde.kdeconnect.service DESTINATION ${DBUS_SERVICES_INSTALL_DIR})
install(TARGETS kdeconnectd DESTINATION ${LIBEXEC_INSTALL_DIR})
60 changes: 60 additions & 0 deletions sfos/kdeconnect-sfos.cpp
@@ -0,0 +1,60 @@
/*
Copyright (C) 2013 Jolla Ltd.
Contact: Thomas Perl <thomas.perl@jollamobile.com>
All rights reserved.
You may use this file under the terms of BSD license as follows:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Jolla Ltd nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifdef QT_QML_DEBUG
#include <QtQuick>
#endif

#include <sailfishapp/sailfishapp.h>
#include <QGuiApplication>
#include <QQuickView>

int main(int argc, char *argv[])
{
// SailfishApp::main() will display "qml/kdeconnect-sfos.qml", if you need more
// control over initialization, you can use:
//
// - SailfishApp::application(int, char *[]) to get the QGuiApplication *
// - SailfishApp::createView() to get a new QQuickView * instance
// - SailfishApp::pathTo(QString) to get a QUrl to a resource file
// - SailfishApp::pathToMainQml() to get a QUrl to the main QML file
//
// To display the view, call "show()" (will show fullscreen on device).

//return SailfishApp::main(argc, argv);
QGuiApplication *app = SailfishApp::application(argc, argv);
QScopedPointer<QQuickView> view(SailfishApp::createView());

view->setSource(SailfishApp::pathTo("qml/kdeconnect-sfos.qml"));
view->showFullScreen();

return app->exec();
}

12 changes: 12 additions & 0 deletions sfos/kdeconnect-sfos.desktop
@@ -0,0 +1,12 @@
[Desktop Entry]
Type=Application
X-Nemo-Application-Type=generic
Icon=kdeconnect
Exec=kdeconnect-sfos
Name=KDE Connect
# translation example:
# your app name in German locale (de)
#
# Remember to comment out the following line, if you do not want to use
# a different app name in German locale (de).
#Name[de]=kdeconnect-sfos
47 changes: 47 additions & 0 deletions sfos/kdeconnectd.desktop.cmake
@@ -0,0 +1,47 @@
[Desktop Entry]
Type=Application
Exec=${KDE_INSTALL_FULL_LIBEXECDIR}/kdeconnectd
X-KDE-StartupNotify=false
X-KDE-autostart-phase=1
X-GNOME-Autostart-enabled=true
OnlyShowIn=KDE;GNOME;Unity;XFCE;
NoDisplay=true

Name=KDEConnect daemon
Name[ar]=عفريت KDEConnect
Name[ast]=Degorriu KDEConnect
Name[bg]=Услуга KDE Connect
Name[ca]=Dimoni del KDEConnect
Name[ca@valencia]=Dimoni del KDEConnect
Name[cs]=Démon KDE Connect
Name[da]=KDEConnect-dæmon
Name[de]=KDE-Connect-Dienst
Name[el]=Δαίμονας του KDEConnect
Name[en_GB]=KDEConnect daemon
Name[es]=Demonio de KDE Connect
Name[et]=KDEConnecti deemon
Name[eu]=KDEConnect daimona
Name[fi]=KDEConnect-taustapalvelu
Name[fr]=Démon KDE Connect
Name[gl]=Servizo de KDE Connect
Name[he]=דמון KDEConnect
Name[hu]=KDEConnect szolgáltatás
Name[it]=Demone KDE Connect
Name[ko]=KDE Connect 데몬
Name[nl]=KDEConnect-daemon
Name[nn]=KDEConnect-teneste
Name[pl]=Usługa KDEConnect
Name[pt]=Serviço do KDE Connect
Name[pt_BR]=Serviço do KDE Connect
Name[ru]=Служба KDE Connect
Name[sk]=KDEConnect démon
Name[sr]=КДЕ‑конекцијин демон
Name[sr@ijekavian]=КДЕ‑конекцијин демон
Name[sr@ijekavianlatin]=KDE‑konekcijin demon
Name[sr@latin]=KDE‑konekcijin demon
Name[sv]=Demon för KDE-anslut
Name[tr]=KDEConnect süreci
Name[uk]=Фонова служба KDEConnect
Name[x-test]=xxKDEConnect daemonxx
Name[zh_CN]=KDEConnect 守护进程
Name[zh_TW]=KDE連線作業
3 changes: 3 additions & 0 deletions sfos/org.kde.kdeconnect.service.in
@@ -0,0 +1,3 @@
[D-BUS Service]
Name=org.kde.kdeconnect
Exec=@KDE_INSTALL_FULL_LIBEXECDIR@/kdeconnectd
74 changes: 74 additions & 0 deletions sfos/qml/cover/CoverPage.qml
@@ -0,0 +1,74 @@
/*
Copyright (C) 2013 Jolla Ltd.
Contact: Thomas Perl <thomas.perl@jollamobile.com>
All rights reserved.
You may use this file under the terms of BSD license as follows:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Jolla Ltd nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

import QtQuick 2.0
import Sailfish.Silica 1.0
import org.kde.kdeconnect 1.0

CoverBackground {
Label {
id: label
anchors.top: parent.top
anchors.topMargin: Theme.paddingMedium
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("KDE Connect")
}

SilicaListView {
id: devices
anchors.top: label.bottom
anchors.margins: Theme.paddingSmall
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
visible: count > 0

model: DevicesSortProxyModel {
sourceModel: DevicesModel { displayFilter: DevicesModel.Reachable | DevicesModel.Paired }
}

width: parent.width
spacing: Theme.paddingLarge

delegate: ListItem {
width: ListView.view.width
height: Theme.itemSizeMedium

Label { text: display }
}
}
Label {
text: qsTr("No paired \ndevices in range")
anchors.centerIn: parent
visible: devices.count == 0
}

}

48 changes: 48 additions & 0 deletions sfos/qml/kdeconnect-sfos.qml
@@ -0,0 +1,48 @@
/*
Copyright (C) 2013 Jolla Ltd.
Contact: Thomas Perl <thomas.perl@jollamobile.com>
All rights reserved.
You may use this file under the terms of BSD license as follows:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Jolla Ltd nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

import QtQuick 2.0
import Sailfish.Silica 1.0
import "pages"

ApplicationWindow
{
initialPage: Component { FirstPage { } }
cover: Qt.resolvedUrl("cover/CoverPage.qml")
allowedOrientations: defaultAllowedOrientations

Keys.onPressed: {
if (event.key == Qt.Key_Back) {
console.log("back");
pageStack.pop();
}
}
}

105 changes: 105 additions & 0 deletions sfos/qml/pages/DevicePage.qml
@@ -0,0 +1,105 @@
/*
Copyright (C) 2013 Jolla Ltd.
Contact: Thomas Perl <thomas.perl@jollamobile.com>
All rights reserved.
You may use this file under the terms of BSD license as follows:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Jolla Ltd nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

import QtQuick 2.0
import Sailfish.Silica 1.0
import org.kde.kdeconnect 1.0

Page {
id: deviceView
property QtObject currentDevice

// The effective value will be restricted by ApplicationWindow.allowedOrientations
allowedOrientations: Orientation.Portrait

Column {
id: column
anchors.fill: parent
spacing: Theme.paddingMedium

PageHeader {
title: currentDevice.name
}

Label {
anchors.horizontalCenter: parent.horizontalCenter
text: "Device is " + (currentDevice.isTrusted ? "trusted" : "not trusted")
}

Button {
id: text
anchors.horizontalCenter: parent.horizontalCenter
text: currentDevice.isTrusted ? "Un-Pair" : "Pair"

onClicked: {
if (currentDevice.isTrusted) {
currentDevice.unpair()
} else {
currentDevice.requestPair()
}
}
}

Button {
anchors.horizontalCenter: parent.horizontalCenter
visible: currentDevice.isTrusted
text: qsTr("Ping")
onClicked: {
currentDevice.pluginCall("ping", "sendPing");
}
}

PluginItem {
anchors.horizontalCenter: parent.horizontalCenter
text: ("Multimedia control")
interfaceFactory: MprisDbusInterfaceFactory
component: "mpris.qml"
pluginName: "mprisremote"
}
PluginItem {
anchors.horizontalCenter: parent.horizontalCenter
text: ("Remote input")
interfaceFactory: RemoteControlDbusInterfaceFactory
component: "mousepad.qml"
pluginName: "remotecontrol"
}
PluginItem {
anchors.horizontalCenter: parent.horizontalCenter
readonly property var lockIface: LockDeviceDbusInterfaceFactory.create(deviceView.currentDevice.id())
pluginName: "lockdevice"
text: lockIface.isLocked ? ("Unlock") : ("Lock")
onClicked: {
lockIface.isLocked = !lockIface.isLocked;
}
}
}
}


77 changes: 77 additions & 0 deletions sfos/qml/pages/FindDevices.qml
@@ -0,0 +1,77 @@
/*
Copyright (C) 2013 Jolla Ltd.
Contact: Thomas Perl <thomas.perl@jollamobile.com>
All rights reserved.
You may use this file under the terms of BSD license as follows:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Jolla Ltd nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

import QtQuick 2.0
import Sailfish.Silica 1.0
import org.kde.kdeconnect 1.0

Page {
id: page

// The effective value will be restricted by ApplicationWindow.allowedOrientations
allowedOrientations: Orientation.Portrait

// To enable PullDownMenu, place our content in a SilicaFlickable
SilicaListView {
anchors.fill: parent

header: PageHeader {
title: qsTr("Devices")
}

// Place our content in a Column. The PageHeader is always placed at the top
// of the page, followed by our content.

id: devices
model: DevicesModel {
id: devicesModel
}

width: page.width
spacing: Theme.paddingLarge


delegate: ListItem {
width: ListView.view.width
height: Theme.itemSizeMedium

Label { text: display + "\n" + toolTip }

onClicked: {
var devicePage = pageStack.push(Qt.resolvedUrl("DevicePage.qml"),
{currentDevice: device}
);
}


}
}
}

61 changes: 61 additions & 0 deletions sfos/qml/pages/FirstPage.qml
@@ -0,0 +1,61 @@
/*
Copyright (C) 2013 Jolla Ltd.
Contact: Thomas Perl <thomas.perl@jollamobile.com>
All rights reserved.
You may use this file under the terms of BSD license as follows:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Jolla Ltd nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

import QtQuick 2.0
import Sailfish.Silica 1.0
import org.kde.kdeconnect 1.0
import Nemo.Notifications 1.0

Page {
allowedOrientations: Orientation.Portrait

SilicaFlickable {
anchors.fill: parent
contentHeight: column.height

// PullDownMenu and PushUpMenu must be declared in SilicaFlickable, SilicaListView or SilicaGridView
PullDownMenu {
MenuItem {
text: qsTr("Find Devices")
onClicked: pageStack.push(Qt.resolvedUrl("FindDevices.qml"))
}
}

Column {
id: column
width: parent.width
spacing: 20

PageHeader { title: "KDE Connect" }

}
}
}

47 changes: 47 additions & 0 deletions sfos/qml/pages/PluginItem.qml
@@ -0,0 +1,47 @@
/*
* Copyright 2015 Aleix Pol Gonzalez <aleixpol@kde.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

import QtQuick 2.0
import Sailfish.Silica 1.0
import org.kde.kdeconnect 1.0

Button
{
property alias pluginName: checker.pluginName
property var interfaceFactory
property string component

readonly property var checker: PluginChecker {
id: checker
device: deviceView.currentDevice
}
visible: checker.available
onClicked: {
if (component === "")
return;

var obj = interfaceFactory.create(deviceView.currentDevice.id());
var page = pageStack.push(
component,
{ pluginInterface: obj }
);
obj.parent = page
}
}
104 changes: 104 additions & 0 deletions sfos/qml/pages/mousepad.qml
@@ -0,0 +1,104 @@
/*
* Copyright 2015 Aleix Pol Gonzalez <aleixpol@kde.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

import QtQuick 2.0
import Sailfish.Silica 1.0
import org.kde.kdeconnect 1.0

Page
{
id: mousepad
property QtObject pluginInterface
backNavigation: false

Column
{
anchors.fill: parent
PageHeader {
id: header
title: "Remote Control"
}
MouseArea {
id: area
width: parent.width
height: parent.height - buttons.height - header.height - 20
property var lastPos: Qt.point(-1, -1)

//onClicked: mousepad.pluginInterface.sendCommand("singleclick", true);

onPositionChanged: {
if (lastPos.x > -1) {
//console.log("move", mouse.x, mouse.y, lastPos)
var delta = Qt.point(mouse.x-lastPos.x, mouse.y-lastPos.y);

pluginInterface.moveCursor(delta);
}
lastPos = Qt.point(mouse.x, mouse.y);
}
onReleased: {
lastPos = Qt.point(-1, -1)
}
}
Row {
id: buttons
height: childrenRect.height
width: parent.width

Button {
width: parent.width / 3
text: "Single"
onClicked: mousepad.pluginInterface.sendCommand("singleclick", true);
}
Button {
width: parent.width / 3
text: "Middle"
onClicked: mousepad.pluginInterface.sendCommand("middleclick", true);
}
Button {
width: parent.width / 3
text: "Right"
onClicked: mousepad.pluginInterface.sendCommand("rightclick", true);
}
}
}

function myPop() {
pageStack._pageStackIndicator._backPageIndicator().data[0].clicked.disconnect(myPop)
pageStack.pop()
}

onStatusChanged: {
if (status == PageStatus.Active) {
pageStack._createPageIndicator()
pageStack._pageStackIndicator.clickablePageIndicators = true
pageStack._pageStackIndicator._backPageIndicator().backNavigation = true
pageStack._pageStackIndicator._backPageIndicator().data[0].clicked.connect(myPop)
} else if (status == PageStatus.Deactivating) {
pageStack._pageStackIndicator.clickablePageIndicators = Qt.binding(function() {
return pageStack.currentPage ? pageStack.currentPage._clickablePageIndicators : true
})
pageStack._pageStackIndicator._backPageIndicator().backNavigation = Qt.binding(function() {
return pageStack._currentContainer && pageStack._currentContainer.page
&& pageStack._currentContainer.page.backNavigation && pageStack._currentContainer.pageStackIndex !== 0
})
}
}

}
82 changes: 82 additions & 0 deletions sfos/qml/pages/mpris.qml
@@ -0,0 +1,82 @@
/*
* Copyright 2015 Aleix Pol Gonzalez <aleixpol@kde.org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

import QtQuick 2.0
import Sailfish.Silica 1.0
import org.kde.kdeconnect 1.0

Page
{
id: root
property QtObject pluginInterface

Column
{
anchors.fill: parent
PageHeader { title: "Multimedia Controls" }

Component.onCompleted: {
pluginInterface.requestPlayerList();
}

Item { height: parent.height }
ComboBox {
label: "Player"
width: parent.width
onCurrentIndexChanged: root.pluginInterface.player = value

menu: ContextMenu {
Repeater {
model: root.pluginInterface.playerList
MenuItem { text: modelData }
}
}
}
Label {
width: parent.width
text: root.pluginInterface.nowPlaying
}
Row {
width: parent.width
IconButton {
icon.source: "image://theme/icon-m-previous"
onClicked: root.pluginInterface.sendAction("Previous")
}
IconButton {
icon.source: root.pluginInterface.isPlaying ? "icon-m-image://theme/pause" : "image://theme/icon-m-play"
onClicked: root.pluginInterface.sendAction("PlayPause");
}
IconButton {
icon.source: "image://theme/icon-m-next"
onClicked: root.pluginInterface.sendAction("Next")
}
}
Row {
width: parent.width
Label { text: ("Volume:") }
Slider {
value: root.pluginInterface.volume
maximumValue: 100
width: parent.width
}
}
Item { height: parent.height }
}
}
18 changes: 18 additions & 0 deletions sfos/rpm/kdeconnect-sfos.changes.in
@@ -0,0 +1,18 @@
# Rename this file as kdeconnect-sfos.changes to include changelog
# entries in your RPM file.
#
# Add new changelog entries following the format below.
# Add newest entries to the top of the list.
# Separate entries from eachother with a blank line.
#
# Alternatively, if your changelog is automatically generated (e.g. with
# the git-change-log command provided with Sailfish OS SDK), create a
# kdeconnect-sfos.changes.run script to let mb2 run the required commands for you.

# * date Author's Name <author's email> version-release
# - Summary of changes

* Sun Apr 13 2014 Jack Tar <jack.tar@example.com> 0.0.1-1
- Scrubbed the deck
- Hoisted the sails

25 changes: 25 additions & 0 deletions sfos/rpm/kdeconnect-sfos.changes.run.in
@@ -0,0 +1,25 @@
#!/bin/bash
#
# Rename this file as kdeconnect-sfos.changes.run to let mb2 automatically
# generate changelog from well formatted Git commit messages and tag
# annotations.

git-change-log

# Here are some basic examples how to change from the default behavior. Run
# git-change-log --help inside the Sailfish OS SDK chroot or build engine to
# learn all the options git-change-log accepts.

# Use a subset of tags
#git-change-log --tags refs/tags/my-prefix/*

# Group entries by minor revision, suppress headlines for patch-level revisions
#git-change-log --dense '/[0-9]\+\.[0-9\+$'

# Trim very old changes
#git-change-log --since 2014-04-01
#echo '[ Some changelog entries trimmed for brevity ]'

# Use the subjects (first lines) of tag annotations when no entry would be
# included for a revision otherwise
#git-change-log --auto-add-annotations
85 changes: 85 additions & 0 deletions sfos/rpm/kdeconnect-sfos.spec
@@ -0,0 +1,85 @@
#
# Do NOT Edit the Auto-generated Part!
# Generated by: spectacle version 0.27
#

Name: kdeconnect-sfos

# >> macros
# << macros

Summary: KDEConnect client for Sailfish
Version: 0.1
Release: 1
Group: Qt/Qt
License: LICENSE
URL: http://example.org/
Source0: %{name}-%{version}.tar.bz2
Source100: kdeconnect-sfos.yaml
Requires: sailfishsilica-qt5 >= 0.10.9
BuildRequires: pkgconfig(sailfishapp) >= 1.0.2
BuildRequires: pkgconfig(Qt5Core)
BuildRequires: pkgconfig(Qt5Qml)
BuildRequires: pkgconfig(Qt5Quick)
BuildRequires: pkgconfig(nemonotifications-qt5)
BuildRequires: pkgconfig(qca2-qt5) >= 2.0.0
BuildRequires: desktop-file-utils
BuildRequires: cmake >= 3.0
BuildRequires: extra-cmake-modules >= 5.31.0
BuildRequires: kcoreaddons-devel >= 5.31.0
BuildRequires: kdbusaddons-devel >= 5.31.0
BuildRequires: ki18n-devel >= 5.31.0
BuildRequires: kconfig-devel >= 5.31.0
BuildRequires: kiconthemes-devel >= 5.31.0

%description
Short description of my Sailfish OS Application


%prep
%setup -q

# >> setup
# << setup

%build
# >> build pre
# << build pre
mkdir -p build
cd build
%cmake .. -DSAILFISHOS=YES
make %{?jobs:-j%jobs}

# >> build post
# << build post

%install
rm -rf %{buildroot}
# >> install pre
# << install pre
pushd build
%make_install
popd


# >> install post
# << install post

desktop-file-install --delete-original \
--dir %{buildroot}%{_datadir}/applications \
%{buildroot}%{_datadir}/applications/*.desktop

%files
%defattr(-,root,root,-)
%{_bindir}
%{_libdir}
%{_datadir}/%{name}
%{_datadir}/applications/%{name}.desktop
/etc/xdg/autostart/kdeconnectd.desktop
/usr/share/dbus-1/services/org.kde.kdeconnect.service
/usr/share/knotifications5/kdeconnect.notifyrc
/usr/share/kservicetypes5/kdeconnect_plugin.desktop
#%{_datadir}/icons/hicolor/*/apps/%{name}.png
/usr/share/icons/
# >> files
# << files
116 changes: 116 additions & 0 deletions sfos/sailfishdaemon.cpp
@@ -0,0 +1,116 @@
/**
* Copyright 2018 Adam Pigg <adam@piggz.co.uk>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
* accepted by the membership of KDE e.V. (or its successor approved
* by the membership of KDE e.V.), which shall act as a proxy
* defined in Section 14 of version 3 of the license.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include <QCoreApplication>
#include <QNetworkAccessManager>

#include <KDBusService>
#include <KLocalizedString>

#include "core/daemon.h"
#include "core/device.h"
#include "core/backends/pairinghandler.h"
#include "kdeconnect-version.h"

#include <notification.h>

class SailfishDaemon : public Daemon
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.kde.kdeconnect.daemon")
public:
SailfishDaemon(QObject* parent = Q_NULLPTR)
: Daemon(parent)
, m_nam(Q_NULLPTR)
{}

void askPairingConfirmation(Device* device) override
{
qDebug() << "Pairing request from " << device->name().toHtmlEscaped();

Notification *notification = new Notification(this);

notification->setAppName(QCoreApplication::applicationName());
notification->setPreviewSummary(i18n("Pairing request from %1", device->name().toHtmlEscaped()));
notification->setPreviewBody(i18n("Click here to pair"));
notification->setIcon("icon-s-sync");
notification->setExpireTimeout(10000);

connect(notification, &Notification::closed,
[=]( uint reason ) {
qDebug() << "Notification closed" << reason;
if (reason == 2) { //clicked
device->acceptPairing();
} else {
device->rejectPairing();
}
});

notification->publish();
}

void reportError(const QString & title, const QString & description) override
{
qDebug() << "Error: " << title << ":" << description;
}

QNetworkAccessManager* networkAccessManager() override
{
if (!m_nam) {
m_nam = new QNetworkAccessManager(this);
}
return m_nam;
}

void sendSimpleNotification(const QString &eventId, const QString &title, const QString &text, const QString &iconName) override
{
Q_UNUSED(eventId);
Notification *notification = new Notification(this);

notification->setAppName(QCoreApplication::applicationName());
notification->setPreviewSummary(title);
notification->setPreviewBody(text);
notification->setIcon(iconName);
notification->publish();
}


private:
QNetworkAccessManager* m_nam;
};

int main(int argc, char* argv[])
{
QCoreApplication app(argc, argv);

app.setApplicationName(QStringLiteral("kdeconnectd"));
app.setApplicationVersion(QStringLiteral(KDECONNECT_VERSION_STRING));
app.setOrganizationDomain(QStringLiteral("kde.org"));

KDBusService dbusService(KDBusService::Unique);

Daemon* daemon = new SailfishDaemon;

QObject::connect(daemon, SIGNAL(destroyed(QObject*)), &app, SLOT(quit()));

return app.exec();
}

#include "sailfishdaemon.moc"