Merge branch 'master' into 1.x

# Conflicts:
#	plugins/battery/kdeconnect_battery.json
#	plugins/clipboard/kdeconnect_clipboard.json
#	plugins/findmyphone/kdeconnect_findmyphone.json
#	plugins/kdeconnect.notifyrc
#	plugins/lockdevice/kdeconnect_lockdevice.json
#	plugins/mousepad/kdeconnect_mousepad.json
#	plugins/mpriscontrol/kdeconnect_mpriscontrol.json
#	plugins/mprisremote/kdeconnect_mprisremote.json
#	plugins/notifications/kdeconnect_notifications.json
#	plugins/pausemusic/kdeconnect_pausemusic.json
#	plugins/ping/kdeconnect_ping.json
#	plugins/remotecommands/kdeconnect_remotecommands.json
#	plugins/remotecontrol/kdeconnect_remotecontrol.json
#	plugins/runcommand/kdeconnect_runcommand.json
#	plugins/screensaver-inhibit/kdeconnect_screensaver_inhibit.json
#	plugins/sendnotifications/kdeconnect_sendnotifications.json
#	plugins/sendnotifications/kdeconnect_sendnotifications_config.desktop
#	plugins/sftp/kdeconnect_sftp.json
#	plugins/share/kdeconnect_share.json
#	plugins/telephony/kdeconnect_telephony.json
This commit is contained in:
Albert Vaca 2016-09-29 10:53:29 +02:00
commit 0dbaceafa3
61 changed files with 872 additions and 194 deletions

View file

@ -1,16 +1,20 @@
[Desktop Entry]
Name=KDE Connect Application
Name[ar]=تطبيق كدي المتّصل
Name[ast]=Aplicación KDE Connect
Name[ca]=Aplicació KDE Connect
Name[ca@valencia]=Aplicació KDE Connect
Name[cs]=Aplikace KDE Connect
Name[da]=Programmet KDE Connect
Name[de]=KDE-Connect-Anwendung
Name[el]=Εφαρμογή KDE Connect
Name[en_GB]=KDE Connect Application
Name[es]=Aplicación KDE Connect
Name[et]=KDE Connecti rakendus
Name[fi]=KDE Connect -sovellus
Name[fr]=Application KDE Connect
Name[gl]=Programa de KDE Connect
Name[he]=היישום KDE Connect
Name[hu]=KDE Connect alkalmazás
Name[it]=Applicazione KDE Connect
Name[ko]=KDE Connect
@ -27,17 +31,21 @@ Name[uk]=Програма KDE Connect
Name[x-test]=xxKDE Connect Applicationxx
Name[zh_CN]=KDE Connect
GenericName=Device Synchronization
GenericName[ar]=مزامنة الأجهزة
GenericName[ast]=Sincronización de preseos
GenericName[ca]=Sincronització de dispositius
GenericName[ca@valencia]=Sincronització de dispositius
GenericName[cs]=Synchronizace zařízení
GenericName[da]=Enhedssynkronisering
GenericName[de]=Geräteabgleich
GenericName[el]=Συγχρονισμός συσκευών
GenericName[en_GB]=Device Synchronisation
GenericName[es]=Sincronización de dispositivos
GenericName[et]=Seadmete sünkroonimine
GenericName[fi]=Laitteiden synkronointi
GenericName[fr]=Synchronisation de périphériques
GenericName[gl]=Sincronización de dispositivos
GenericName[he]=סנכרון התקן
GenericName[hu]=Eszközszinkronizáció
GenericName[it]=Sincronizzazione dispositivo
GenericName[ko]=
@ -55,17 +63,21 @@ GenericName[uk]=Синхронізація із пристроями
GenericName[x-test]=xxDevice Synchronizationxx
GenericName[zh_CN]=
Comment=Make all your devices one
Comment[ar]=اجعل أجهزتك كلّها واحدًا
Comment[ast]=Fai tolos tos preseos ún mesmu
Comment[ca]=Fa que tots els vostres dispositius siguin un
Comment[ca@valencia]=Fa que tots els vostres dispositius siguen un
Comment[cs]=Sjednoťte svá zařízení
Comment[da]=Gør alle dine enheder til en
Comment[de]=Gleichen Sie alle Ihre Geräte ab
Comment[el]=Όλες οι συσκευές σας σε μία
Comment[en_GB]=Make all your devices one
Comment[es]=Convertir todos sus dispositivos en uno
Comment[et]=Kõigi seadmete ühendamine
Comment[fi]=Yhdistä kaikki laitteesi toisiinsa
Comment[fr]=Unifiez vos périphériques
Comment[gl]=Unifique os seus dispositivos.
Comment[he]=הפוך את כך ההתקנים שלך לאחד
Comment[hu]=Egyesítse eszközeit
Comment[it]=Fai di tutti i tuoi dispositivi un solo dispositivo
Comment[ko]=

View file

@ -45,7 +45,7 @@ Kirigami.Page
property list<QtObject> actions: [
Kirigami.Action {
onTriggered: deviceView.currentDevice.unpair()
text: i18n("UnPair")
text: i18n("Unpair")
},
Kirigami.Action {
text: i18n("Send Ping")
@ -59,42 +59,34 @@ Kirigami.Page
Layout.fillHeight: true
Layout.fillWidth: true
Kirigami.BasicListItem {
readonly property var fu: PluginChecker {
id: mprisChecker
pluginName: "mpriscontrol"
}
enabled: mprisChecker.available
PluginItem {
label: i18n("Multimedia control")
onClicked: pageStack.push(
"qrc:/qml/mpris.qml",
{ mprisInterface: MprisDbusInterfaceFactory.create(deviceView.currentDevice.id()) }
);
interfaceFactory: MprisDbusInterfaceFactory
component: "qrc:/qml/mpris.qml"
pluginName: "mprisremote"
}
Kirigami.BasicListItem {
readonly property var fu: PluginChecker {
id: mousepadChecker
pluginName: "mousepad"
}
enabled: mousepadChecker.available
PluginItem {
label: i18n("Remote input")
onClicked: pageStack.push(
"qrc:/qml/mousepad.qml",
{ remoteControlInterface: RemoteControlDbusInterfaceFactory.create(deviceView.currentDevice.id()) }
);
interfaceFactory: RemoteControlDbusInterfaceFactory
component: "qrc:/qml/mousepad.qml"
pluginName: "remotecontrol"
}
Kirigami.BasicListItem {
readonly property var fu: PluginChecker {
id: lockdeviceChecker
pluginName: "lockdevice"
}
enabled: lockdeviceChecker.available
property var lockIface: LockDeviceDbusInterfaceFactory.create(deviceView.currentDevice.id())
PluginItem {
readonly property var lockIface: LockDeviceDbusInterfaceFactory.create(deviceView.currentDevice.id())
pluginName: "lockdevice"
label: lockIface.isLocked ? i18n("Unlock") : i18n("Lock")
onClicked: {
lockIface.isLocked = !lockIface.isLocked;
}
}
PluginItem {
readonly property var findmyphoneIface: FindMyPhoneDbusInterfaceFactory.create(deviceView.currentDevice.id())
pluginName: "findmyphone"
label: i18n("Find Device")
onClicked: {
findmyphoneIface.ring()
}
}
Item { Layout.fillHeight: true }
}

View file

@ -26,6 +26,7 @@ import org.kde.kdeconnect 1.0
Kirigami.Page
{
objectName: "FindDevices"
title: i18n("Pair")
ScrollView {
anchors.fill: parent
@ -55,8 +56,8 @@ Kirigami.Page
label: display + "\n" + toolTip
enabled: !(status & DevicesModel.Paired)
onClicked: {
root.pageStack.clear()
root.pageStack.push(
pageStack.clear()
pageStack.push(
"qrc:/qml/DevicePage.qml",
{currentDevice: device}
);

49
app/qml/PluginItem.qml Normal file
View file

@ -0,0 +1,49 @@
/*
* 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.2
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import org.kde.kirigami 1.0 as Kirigami
import org.kde.kdeconnect 1.0
Kirigami.BasicListItem
{
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(checker.deviceId);
var page = pageStack.push(
component,
{ pluginInterface: obj }
);
obj.parent = page
}
}

View file

@ -31,32 +31,55 @@ Kirigami.ApplicationWindow
width: 400
height: 500
Kirigami.Action {
id: findDevicesAction
text: i18n ("Find devices...")
iconName: "list-add"
checkable: pageStack.currentItem && pageStack.currentItem.objectName == "FindDevices"
checked: true
onTriggered: {
root.pageStack.clear()
root.pageStack.push("qrc:/qml/FindDevicesPage.qml");
}
}
globalDrawer: Kirigami.GlobalDrawer {
id: drawer
title: i18n("KDE Connect")
titleIcon: "kdeconnect"
// bannerImageSource: "/home/apol/devel/kde5/share/wallpapers/Next/contents/images/1024x768.png"
content: ListView {
anchors.fill: parent
topContent: [
TextField {
Layout.fillWidth: true
DBusProperty {
id: announcedNameProperty
object: DaemonDbusInterface
read: "announcedName"
defaultValue: ""
}
text: announcedNameProperty.value
onAccepted: {
DaemonDbusInterface.setAnnouncedName(text)
text = Qt.binding(function() {return announcedNameProperty.value})
}
}
]
property var objects: [findDevicesAction]
Instantiator {
model: DevicesSortProxyModel {
sourceModel: DevicesModel { displayFilter: DevicesModel.Paired }
}
header: Kirigami.BasicListItem {
label: i18n ("Find devices...")
icon: "list-add"
onClicked: {
root.pageStack.clear()
root.pageStack.push("qrc:/qml/FindDevicesPage.qml");
}
}
delegate: Kirigami.BasicListItem {
width: ListView.view.width
icon: iconName
label: display + "\n" + toolTip
delegate: Kirigami.Action {
iconName: model.iconName
text: display + "\n" + toolTip
enabled: status & DevicesModel.Reachable
checked: root.pageStack.currentDevice == device
onClicked: {
checkable: pageStack.currentItem && pageStack.currentItem.currentDevice == device
checked: true
onTriggered: {
root.pageStack.clear()
root.pageStack.push(
"qrc:/qml/DevicePage.qml",
@ -64,7 +87,20 @@ Kirigami.ApplicationWindow
);
}
}
onObjectAdded: {
drawer.objects.push(object)
drawer.objects = drawer.objects
}
onObjectRemoved: {
var idx = drawer.objects.indexOf(object);
if (idx>=0) {
var removed = drawer.objects.splice(idx, 1)
drawer.objects = drawer.objects
}
}
}
actions: objects
}
contextDrawer: Kirigami.ContextDrawer {

View file

@ -27,7 +27,7 @@ Kirigami.Page
{
id: mousepad
title: i18n("Remote Control")
property QtObject remoteControlInterface
property QtObject pluginInterface
ColumnLayout
{
@ -39,14 +39,14 @@ Kirigami.Page
Layout.fillHeight: true
property var lastPos: Qt.point(-1, -1)
onClicked: mousepad.remoteControlInterface.sendCommand("singleclick", true);
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);
remoteControlInterface.moveCursor(delta);
pluginInterface.moveCursor(delta);
}
lastPos = Qt.point(mouse.x, mouse.y);
}
@ -59,15 +59,15 @@ Kirigami.Page
Button {
Layout.fillWidth: true
onClicked: mousepad.remoteControlInterface.sendCommand("singleclick", true);
onClicked: mousepad.pluginInterface.sendCommand("singleclick", true);
}
Button {
Layout.fillWidth: true
onClicked: mousepad.remoteControlInterface.sendCommand("middleclick", true);
onClicked: mousepad.pluginInterface.sendCommand("middleclick", true);
}
Button {
Layout.fillWidth: true
onClicked: mousepad.remoteControlInterface.sendCommand("rightclick", true);
onClicked: mousepad.pluginInterface.sendCommand("rightclick", true);
}
}
}

View file

@ -26,7 +26,7 @@ import org.kde.kirigami 1.0 as Kirigami
Kirigami.Page
{
id: root
property QtObject mprisInterface
property QtObject pluginInterface
title: i18n("Multimedia Controls")
ColumnLayout
@ -34,42 +34,42 @@ Kirigami.Page
anchors.fill: parent
Component.onCompleted: {
mprisInterface.requestPlayerList();
pluginInterface.requestPlayerList();
}
Item { Layout.fillHeight: true }
ComboBox {
Layout.fillWidth: true
model: root.mprisInterface.playerList
onCurrentTextChanged: root.mprisInterface.player = currentText
model: root.pluginInterface.playerList
onCurrentTextChanged: root.pluginInterface.player = currentText
}
Label {
Layout.fillWidth: true
text: root.mprisInterface.nowPlaying
text: root.pluginInterface.nowPlaying
}
RowLayout {
Layout.fillWidth: true
Button {
Layout.fillWidth: true
iconName: "media-skip-backward"
onClicked: root.mprisInterface.sendAction("Previous")
onClicked: root.pluginInterface.sendAction("Previous")
}
Button {
Layout.fillWidth: true
iconName: root.mprisInterface.isPlaying ? "media-playback-pause" : "media-playback-start"
onClicked: root.mprisInterface.sendAction("PlayPause");
iconName: root.pluginInterface.isPlaying ? "media-playback-pause" : "media-playback-start"
onClicked: root.pluginInterface.sendAction("PlayPause");
}
Button {
Layout.fillWidth: true
iconName: "media-skip-forward"
onClicked: root.mprisInterface.sendAction("Next")
onClicked: root.pluginInterface.sendAction("Next")
}
}
RowLayout {
Layout.fillWidth: true
Label { text: i18n("Volume:") }
Slider {
value: root.mprisInterface.volume
value: root.pluginInterface.volume
maximumValue: 100
Layout.fillWidth: true
}

View file

@ -3,6 +3,7 @@
<file>qml/main.qml</file>
<file>qml/mpris.qml</file>
<file>qml/mousepad.qml</file>
<file>qml/PluginItem.qml</file>
<file>qml/DevicePage.qml</file>
<file>qml/FindDevicesPage.qml</file>
</qresource>

View file

@ -214,6 +214,7 @@ void Daemon::setAnnouncedName(const QString &name)
qCDebug(KDECONNECT_CORE()) << "Announcing name";
KdeConnectConfig::instance()->setName(name);
forceOnNetworkChange();
Q_EMIT announcedNameChanged(name);
}
QString Daemon::announcedName()

View file

@ -73,6 +73,7 @@ Q_SIGNALS:
Q_SCRIPTABLE void deviceAdded(const QString& id);
Q_SCRIPTABLE void deviceRemoved(const QString& id); //Note that paired devices will never be removed
Q_SCRIPTABLE void deviceVisibilityChanged(const QString& id, bool isVisible);
Q_SCRIPTABLE void announcedNameChanged(const QString &announcedName);
private Q_SLOTS:
void onNewDeviceLink(const NetworkPackage& identityPackage, DeviceLink* dl);

View file

@ -97,7 +97,7 @@ QStringList Device::loadedPlugins() const
void Device::reloadPlugins()
{
QHash<QString, KdeConnectPlugin*> newPluginMap;
QHash<QString, KdeConnectPlugin*> newPluginMap, oldPluginMap = m_plugins;
QMultiMap<QString, KdeConnectPlugin*> newPluginsByIncomingCapability;
if (isTrusted() && isReachable()) { //Do not load any plugin for unpaired devices, nor useless loading them for unreachable devices
@ -127,7 +127,7 @@ void Device::reloadPlugins()
}
}
const bool differentPlugins = m_plugins != newPluginMap;
const bool differentPlugins = oldPluginMap != newPluginMap;
//Erase all left plugins in the original map (meaning that we don't want
//them anymore, otherwise they would have been moved to the newPluginMap)

View file

@ -39,8 +39,6 @@
#include "dbushelper.h"
#include "daemon.h"
static const QString TRUSTED_DEVICES = QStringLiteral("trusted_devices_ssl");
struct KdeConnectConfigPrivate {
// The Initializer object sets things up, and also does cleanup when it goes out of scope
@ -51,6 +49,7 @@ struct KdeConnectConfigPrivate {
QSslCertificate certificate; // Use QSslCertificate instead of QCA::Certificate due to compatibility with QSslSocket
QSettings* config;
QSettings* trusted_devices;
};
@ -78,9 +77,9 @@ KdeConnectConfig::KdeConnectConfig()
//.config/kdeconnect/config
d->config = new QSettings(baseConfigDir().absoluteFilePath("config"), QSettings::IniFormat);
d->trusted_devices = new QSettings(baseConfigDir().absoluteFilePath("trusted_devices"), QSettings::IniFormat);
//Register my own id if not there yet
d->config->beginGroup("myself");
if (!d->config->contains("id")) {
QString uuid = QUuid::createUuid().toString();
DbusHelper::filterNonExportableCharacters(uuid);
@ -88,7 +87,6 @@ KdeConnectConfig::KdeConnectConfig()
d->config->sync();
qCDebug(KDECONNECT_CORE) << "My id:" << uuid;
}
d->config->endGroup();
const QFile::Permissions strict = QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::WriteUser;
@ -153,17 +151,13 @@ KdeConnectConfig::KdeConnectConfig()
QString KdeConnectConfig::name()
{
QString defaultName = qgetenv("USER") + '@' + QHostInfo::localHostName();
d->config->beginGroup("myself");
QString name = d->config->value("name", defaultName).toString();
d->config->endGroup();
return name;
}
void KdeConnectConfig::setName(QString name)
{
d->config->beginGroup("myself");
d->config->setValue("name", name);
d->config->endGroup();
d->config->sync();
}
@ -174,9 +168,7 @@ QString KdeConnectConfig::deviceType()
QString KdeConnectConfig::deviceId()
{
d->config->beginGroup("myself");
QString id = d->config->value("id", "").toString();
d->config->endGroup();
return id;
}
@ -214,70 +206,56 @@ QDir KdeConnectConfig::baseConfigDir()
QStringList KdeConnectConfig::trustedDevices()
{
d->config->beginGroup(TRUSTED_DEVICES);
const QStringList& list = d->config->childGroups();
d->config->endGroup();
const QStringList& list = d->trusted_devices->childGroups();
return list;
}
void KdeConnectConfig::addTrustedDevice(const QString &id, const QString &name, const QString &type)
{
d->config->beginGroup(TRUSTED_DEVICES);
d->config->beginGroup(id);
d->config->setValue("name", name);
d->config->setValue("type", type);
d->config->endGroup();
d->config->endGroup();
d->config->sync();
d->trusted_devices->beginGroup(id);
d->trusted_devices->setValue("name", name);
d->trusted_devices->setValue("type", type);
d->trusted_devices->endGroup();
d->trusted_devices->sync();
QDir().mkpath(deviceConfigDir(id).path());
}
KdeConnectConfig::DeviceInfo KdeConnectConfig::getTrustedDevice(const QString &id)
{
d->config->beginGroup(TRUSTED_DEVICES);
d->config->beginGroup(id);
d->trusted_devices->beginGroup(id);
KdeConnectConfig::DeviceInfo info;
info.deviceName = d->config->value("name", QLatin1String("unnamed")).toString();
info.deviceType = d->config->value("type", QLatin1String("unknown")).toString();
info.deviceName = d->trusted_devices->value("name", QLatin1String("unnamed")).toString();
info.deviceType = d->trusted_devices->value("type", QLatin1String("unknown")).toString();
d->config->endGroup();
d->config->endGroup();
d->trusted_devices->endGroup();
return info;
}
void KdeConnectConfig::removeTrustedDevice(const QString &deviceId)
{
d->config->beginGroup(TRUSTED_DEVICES);
d->config->beginGroup(deviceId);
d->config->remove(QString());
d->config->endGroup();
d->config->endGroup();
d->config->sync();
d->trusted_devices->remove(deviceId);
d->trusted_devices->sync();
//We do not remove the config files.
}
// Utility functions to set and get a value
void KdeConnectConfig::setDeviceProperty(QString deviceId, QString key, QString value)
{
d->config->beginGroup(TRUSTED_DEVICES);
d->config->beginGroup(deviceId);
d->config->setValue(key, value);
d->config->endGroup();
d->config->endGroup();
d->config->sync();
d->trusted_devices->beginGroup(deviceId);
d->trusted_devices->setValue(key, value);
d->trusted_devices->endGroup();
d->trusted_devices->sync();
}
QString KdeConnectConfig::getDeviceProperty(QString deviceId, QString key, QString defaultValue)
{
QString value;
d->config->beginGroup(TRUSTED_DEVICES);
d->config->beginGroup(deviceId);
value = d->config->value(key, defaultValue).toString();
d->config->endGroup();
d->config->endGroup();
d->trusted_devices->beginGroup(deviceId);
value = d->trusted_devices->value(key, defaultValue).toString();
d->trusted_devices->endGroup();
return value;
}

View file

@ -10,6 +10,8 @@ X-KDE-Kded-load-on-demand=false
X-KDE-Kded-phase=1
Name=KDE Connect
Name[ar]=كدي المتّصل
Name[ast]=KDE Connect
Name[bg]=KDE Connect
Name[bs]=Konekcija KDE
Name[ca]=KDE Connect
@ -17,12 +19,14 @@ Name[ca@valencia]=KDE Connect
Name[cs]=KDE Connect
Name[da]=KDE Connect
Name[de]=KDE-Connect
Name[el]=KDE Connect
Name[en_GB]=KDE Connect
Name[es]=KDE Connect
Name[et]=KDE Connect
Name[fi]=KDE Connect
Name[fr]=KDE Connect
Name[gl]=KDE Connect
Name[he]=KDE Connect
Name[hu]=KDE csatlakozás
Name[it]=KDE Connect
Name[ko]=KDE Connect
@ -41,6 +45,8 @@ Name[x-test]=xxKDE Connectxx
Name[zh_CN]=KDE Connect
Comment=Connect KDE with your smartphone
Comment[ar]=أوصل كدي بهاتفك الذّكيّ
Comment[ast]=Coneuta KDE col to preséu
Comment[bg]=Свържете КДЕ с вашия смартфон
Comment[bs]=Konektujte se na KDE sa Vašim mobitelom
Comment[ca]=Connecta el KDE amb el vostre telèfon intel·ligent
@ -48,12 +54,14 @@ Comment[ca@valencia]=Connecta el KDE amb el vostre telèfon intel·ligent
Comment[cs]=Propojte KDE s vaším telefonem
Comment[da]=Forbind KDE med din smartphone
Comment[de]=KDE mit Ihren Smartphone verbinden
Comment[el]=Σύνδεση του KDE με το έξυπνο τηλέφωνό σας
Comment[en_GB]=Connect KDE with your smartphone
Comment[es]=Conecte KDE con su teléfono móvil
Comment[et]=KDE ühendamine oma nutitelefoniga
Comment[fi]=Yhdistä KDE älypuhelimeesi
Comment[fr]=Connectez KDE avec votre smartphone
Comment[gl]=Conectar KDE co seu teléfono móbil.
Comment[he]=חבר את KDE לפלאפון החכם שלך
Comment[hu]=A KDE csatlakoztatása az okostelefonnal
Comment[it]=Connetti KDE con il tuo smartphone
Comment[ko]=KDE

View file

@ -8,18 +8,22 @@ 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[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

View file

@ -1,6 +1,8 @@
[Desktop Entry]
Type=Service
Name=Send file via KDE Connect service
Name[ar]=أرسل ملفًّا عبر خدمة «كدي المتّصل»
Name[ast]=Unviar ficheru pente'l serviciu KDE Connect
Name[bg]=Изпращане на файл през услугата KDE Connect
Name[bs]=Pošalji datoteku putem KDE Connect servisa
Name[ca]=Envia un fitxer a través del servei KDE Connect
@ -8,12 +10,14 @@ Name[ca@valencia]=Envia un fitxer a través del servei KDE Connect
Name[cs]=Poslat soubor přes službu KDE Connect
Name[da]=Send fil via KDE Connect-tjeneste
Name[de]=Datei mit KDE-Connect -Dienst versenden
Name[el]=Αποστολή αρχείου μέσω της υπηρεσίας KDE Connect
Name[en_GB]=Send file via KDE Connect service
Name[es]=Enviar archivo usando el servicio KDE Connect
Name[et]=Faili saatmine KDE Connecti teenuse kaudu
Name[fi]=Lähetä tiedosto KDE Connect -palvelulla
Name[fr]=Envoyer un fichier via le service KDE Connect
Name[gl]=Enviar un ficheiro mediante o servizo de KDE Connect
Name[he]=שלח קובץ דרך שירות KDE Connect
Name[hu]=Fájl küldése a KDE csatlakozás szolgáltatáson keresztül
Name[it]=Invia un file tramite il servizio KDE Connect
Name[ko]=KDE Connect
@ -31,6 +35,8 @@ Name[x-test]=xxSend file via KDE Connect servicexx
Name[zh_CN]= KDE Connect
X-KDE-Library=kdeconnectfileitemaction
X-KDE-Submenu=Connect
X-KDE-Submenu[ar]=اتّصل,اتصل
X-KDE-Submenu[ast]=Coneutar
X-KDE-Submenu[bg]=Свързване
X-KDE-Submenu[bs]=Uspostavi vezu
X-KDE-Submenu[ca]=Connecta
@ -38,12 +44,14 @@ X-KDE-Submenu[ca@valencia]=Connecta
X-KDE-Submenu[cs]=Připojit
X-KDE-Submenu[da]=Forbind
X-KDE-Submenu[de]=Verbinden
X-KDE-Submenu[el]=Σύνδεση
X-KDE-Submenu[en_GB]=Connect
X-KDE-Submenu[es]=Conectar
X-KDE-Submenu[et]=Ühendus
X-KDE-Submenu[fi]=Yhdistä
X-KDE-Submenu[fr]=Connecter
X-KDE-Submenu[gl]=Conectar
X-KDE-Submenu[he]=חיבור
X-KDE-Submenu[hu]=Csatlakozás
X-KDE-Submenu[it]=Connetti
X-KDE-Submenu[ko]=

View file

@ -45,6 +45,7 @@ DeviceDbusInterface::DeviceDbusInterface(const QString& id, QObject* parent)
, m_id(id)
{
connect(this, &OrgKdeKdeconnectDeviceInterface::trustedChanged, this, &DeviceDbusInterface::trustedChangedProxy);
connect(this, &OrgKdeKdeconnectDeviceInterface::nameChanged, this, &DeviceDbusInterface::nameChangedProxy);
}
DeviceDbusInterface::~DeviceDbusInterface()

View file

@ -60,6 +60,7 @@ class KDECONNECTINTERFACES_EXPORT DeviceDbusInterface
// TODO: Workaround because OrgKdeKdeconnectDeviceInterface is not generating
// the signals for the properties
Q_PROPERTY(bool isTrusted READ isTrusted NOTIFY trustedChangedProxy)
Q_PROPERTY(QString name READ name NOTIFY nameChangedProxy)
public:
explicit DeviceDbusInterface(const QString& deviceId, QObject* parent = nullptr);
@ -69,6 +70,7 @@ public:
Q_SCRIPTABLE void pluginCall(const QString &plugin, const QString &method);
Q_SIGNALS:
void nameChangedProxy(const QString &name);
void trustedChangedProxy(bool paired);
private:

View file

@ -83,6 +83,10 @@ KdeConnectKcm::KdeConnectKcm(QWidget *parent, const QVariantList&)
kcmUi->rename_label->setText(daemon->announcedName());
kcmUi->rename_edit->setText(daemon->announcedName());
connect(daemon, SIGNAL(announcedNameChanged(QString)),
kcmUi->rename_edit, SLOT(setText(QString)));
connect(daemon, SIGNAL(announcedNameChanged(QString)),
kcmUi->rename_label, SLOT(setText(QString)));
setRenameMode(false);
setButtons(KCModule::Help | KCModule::NoAdditionalButton);

View file

@ -11,6 +11,8 @@ X-KDE-ParentApp=kcontrol
X-KDE-System-Settings-Parent-Category=hardware
Name=KDE Connect
Name[ar]=كدي المتّصل
Name[ast]=KDE Connect
Name[bg]=KDE Connect
Name[bs]=Konekcija KDE
Name[ca]=KDE Connect
@ -18,12 +20,14 @@ Name[ca@valencia]=KDE Connect
Name[cs]=KDE Connect
Name[da]=KDE Connect
Name[de]=KDE-Connect
Name[el]=KDE Connect
Name[en_GB]=KDE Connect
Name[es]=KDE Connect
Name[et]=KDE Connect
Name[fi]=KDE Connect
Name[fr]=KDE Connect
Name[gl]=KDE Connect
Name[he]=KDE Connect
Name[hu]=KDE csatlakozás
Name[it]=KDE Connect
Name[ko]=KDE Connect
@ -42,17 +46,21 @@ Name[x-test]=xxKDE Connectxx
Name[zh_CN]=KDE Connect
Comment=Connect and sync your devices
Comment[ar]=اتّصل وزامن أجهزتك
Comment[ast]=Coneuta y sincroniza los tos preseos
Comment[ca]=Connecta i sincronitza els vostres dispositius
Comment[ca@valencia]=Connecta i sincronitza els vostres dispositius
Comment[cs]=Připojte a synchronizujte svá zařízení
Comment[da]=Forbind og synkronisér dine enheder
Comment[de]=Verbinden und Abgleichen Ihrer Geräte
Comment[el]=Σύνδεση και συγχρονισμός των συσκευών σας
Comment[en_GB]=Connect and sync your devices
Comment[es]=Conectar y sincronizar sus dispositivos
Comment[et]=Oma seadmete ühendamine ja sünkroonimine
Comment[fi]=Yhdistä ja synkronoi laitteitasi
Comment[fr]=Connectez et synchronisez vos périphériques
Comment[gl]=Conecte e sincronice os seus dispositivos.
Comment[he]=חבר וסנכרן את ההתקנים שלך
Comment[hu]=Csatlakoztassa és szinkronizálja eszközeit
Comment[it]=Connetti e sincronizza i tuoi dispositivi
Comment[ko]=
@ -70,6 +78,8 @@ Comment[x-test]=xxConnect and sync your devicesxx
Comment[zh_CN]=
X-KDE-Keywords=Network,Android,Devices
X-KDE-Keywords[ar]=شبكة,أندرويد,اندرويد,جهاز,أجهزة
X-KDE-Keywords[ast]=Rede,Android,Preseos
X-KDE-Keywords[bg]=Мрежа,Андроид,Устройства
X-KDE-Keywords[bs]=Mreža,Android,Uređaji
X-KDE-Keywords[ca]=Xarxa,Android,Dispositius
@ -77,12 +87,14 @@ X-KDE-Keywords[ca@valencia]=Xarxa,Android,Dispositius
X-KDE-Keywords[cs]=Síť,Android,Zařízení
X-KDE-Keywords[da]=Netværk,Android,Enheder
X-KDE-Keywords[de]=Netzwerk,Android,Geräte
X-KDE-Keywords[el]=Δίκτυο,Android,Συσκευές
X-KDE-Keywords[en_GB]=Network,Android,Devices
X-KDE-Keywords[es]=Red,Android,Dispositivos
X-KDE-Keywords[et]=Võrk,Android,Seadmed
X-KDE-Keywords[fi]=Verkko,Android,Laitteet
X-KDE-Keywords[fr]=Réseau,Android,Périphériques
X-KDE-Keywords[gl]=rede,Android,dispositivos
X-KDE-Keywords[he]=Network,Android,Devices,רשתות,אנדרואיד,התקנים,מכשירים
X-KDE-Keywords[hu]=Hálózat,Android,Eszközök
X-KDE-Keywords[it]=Rete,Android,Dispositivi
X-KDE-Keywords[ko]=Network,Android,Devices,,,

View file

@ -4,16 +4,20 @@ Icon=kdeconnect
Terminal=false
Exec=kcmshell5 kcm_kdeconnect
Name=KDE Connect Settings
Name[ar]=إعدادات كدي المتّصل
Name[ast]=Axustes KDE Connect
Name[ca]=Arranjament del KDE Connect
Name[ca@valencia]=Arranjament del KDE Connect
Name[cs]=Nastavení KDE Connect
Name[da]=Indstilling af KDE Connect
Name[de]=KDE-Connect-Einstellungen
Name[el]=Ρυθμίσεις KDE Connect
Name[en_GB]=KDE Connect Settings
Name[es]=Ajustes de KDE Connect
Name[et]=KDE Connecti seadistused
Name[fi]=KDE Connectin asetukset
Name[gl]=Configuración de KDE Connect
Name[he]=הגדרות KDE Connect
Name[hu]=A KDE Connect beállításai
Name[it]=Impostazioni di KDE Connect
Name[ko]=KDE Connect
@ -29,17 +33,21 @@ Name[uk]=Параметри KDE Connect
Name[x-test]=xxKDE Connect Settingsxx
Name[zh_CN]=KDE Connect
GenericName=Connect and sync your devices
GenericName[ar]=اتّصل وزامن أجهزتك
GenericName[ast]=Coneuta y sincroniza los tos preseos
GenericName[ca]=Connecta i sincronitza els vostres dispositius
GenericName[ca@valencia]=Connecta i sincronitza els vostres dispositius
GenericName[cs]=Připojte a synchronizujte svá zařízení
GenericName[da]=Forbind og synkronisér dine enheder
GenericName[de]=Verbinden und Abgleichen Ihrer Geräte
GenericName[el]=Σύνδεση και συγχρονισμός των συσκευών σας
GenericName[en_GB]=Connect and sync your devices
GenericName[es]=Conectar y sincronizar sus dispositivos
GenericName[et]=Oma seadmete ühendamine ja sünkroonimine
GenericName[fi]=Yhdistä ja synkronoi laitteitasi
GenericName[fr]=Connectez et synchronisez vos périphériques
GenericName[gl]=Conecte e sincronice os seus dispositivos
GenericName[he]=Connect and sync your devices
GenericName[hu]=Csatlakoztassa és szinkronizálja eszközeit
GenericName[it]=Connetti e sincronizza i tuoi dispositivi
GenericName[ko]=

View file

@ -86,16 +86,13 @@ void KioKdeconnect::listAllDevices()
//TODO: Change to all devices and show different icons for connected and disconnected?
QStringList devices = m_dbusInterface->devices(true, true);
totalSize(devices.length());
int i = 0;
Q_FOREACH(const QString& deviceId, devices) {
DeviceDbusInterface interface(deviceId);
if (!interface.hasPlugin("kdeconnect_sftp")) continue;
const QString target = QString("kdeconnect://").append(deviceId).append("/");
const QString path = QString("kdeconnect://").append(deviceId).append("/");
const QString name = interface.name();
const QString icon = "kdeconnect";
@ -103,15 +100,20 @@ void KioKdeconnect::listAllDevices()
entry.insert(KIO::UDSEntry::UDS_NAME, name);
entry.insert(KIO::UDSEntry::UDS_ICON_NAME, icon);
entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IRGRP | S_IROTH);
entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "");
entry.insert(KIO::UDSEntry::UDS_URL, target);
entry.insert(KIO::UDSEntry::UDS_URL, path);
listEntry(entry);
processedSize(i++);
}
// We also need a non-null and writable UDSentry for "."
KIO::UDSEntry entry;
entry.insert(KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
entry.insert(KIO::UDSEntry::UDS_SIZE, 0);
entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH);
listEntry(entry);
infoMessage("");
finished();
}
@ -145,20 +147,29 @@ void KioKdeconnect::listDevice()
for (QVariantMap::iterator it = urls.begin(); it != urls.end(); ++it) {
QString path = it.key();
QString name = it.value().toString();
const QString path = it.key();
const QString name = it.value().toString();
const QString icon = QLatin1Literal("folder");
KIO::UDSEntry entry;
entry.insert(KIO::UDSEntry::UDS_NAME, "files");
entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, name);
entry.insert(KIO::UDSEntry::UDS_ICON_NAME, "folder");
entry.insert(KIO::UDSEntry::UDS_ICON_NAME, icon);
entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IRGRP | S_IROTH);
entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "");
entry.insert(KIO::UDSEntry::UDS_URL, QUrl::fromLocalFile(path).toString());
listEntry(entry);
}
// We also need a non-null and writable UDSentry for "."
KIO::UDSEntry entry;
entry.insert(KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
entry.insert(KIO::UDSEntry::UDS_SIZE, 0);
entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH);
listEntry(entry);
infoMessage("");
finished();

View file

@ -4,17 +4,21 @@
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-2.0+</project_license>
<name>KDE Connect</name>
<name xml:lang="ar">كدي المتّصل</name>
<name xml:lang="ast">KDE Connect</name>
<name xml:lang="ca">KDE Connect</name>
<name xml:lang="ca-valencia">KDE Connect</name>
<name xml:lang="cs">KDE Connect</name>
<name xml:lang="da">KDE Connect</name>
<name xml:lang="de">KDE-Connect</name>
<name xml:lang="el">KDE Connect</name>
<name xml:lang="en-GB">KDE Connect</name>
<name xml:lang="es">KDE Connect</name>
<name xml:lang="et">KDE Connect</name>
<name xml:lang="fi">KDE Connect</name>
<name xml:lang="fr">KDE Connect</name>
<name xml:lang="gl">KDE Connect</name>
<name xml:lang="he">KDE Connect</name>
<name xml:lang="it">KDE Connect</name>
<name xml:lang="ko">KDE Connect</name>
<name xml:lang="nl">KDE Connect</name>
@ -28,17 +32,21 @@
<name xml:lang="x-test">xxKDE Connectxx</name>
<name xml:lang="zh-CN">KDE Connect</name>
<summary>Seamless connection of your devices</summary>
<summary xml:lang="ar">اتّصال سلس بين أجهزتك</summary>
<summary xml:lang="ast">Conexón de los tos preseos ensin esfuerciu</summary>
<summary xml:lang="ca">Connexió transparent amb els vostres dispositius</summary>
<summary xml:lang="ca-valencia">Connexió transparent amb els vostres dispositius</summary>
<summary xml:lang="cs">Snadné propojení vašich zařízení</summary>
<summary xml:lang="da">Supernem forbindelse mellem dine enheder</summary>
<summary xml:lang="da">Umærkbar forbindelse mellem dine enheder</summary>
<summary xml:lang="de">Nahtlose Verbindung zu Ihren Geräten</summary>
<summary xml:lang="el">Απρόσκοπτη σύνδεση των συσκευών σας</summary>
<summary xml:lang="en-GB">Seamless connection of your devices</summary>
<summary xml:lang="es">Conexión sin interrupciones de sus dispositivos</summary>
<summary xml:lang="et">Sujuv ühendus oma seadmetega</summary>
<summary xml:lang="fi">Saumaton yhteys laitteisiisi</summary>
<summary xml:lang="fr">Connecter vos périphériques avec facilité</summary>
<summary xml:lang="gl">Conexión constante entre dispositivos</summary>
<summary xml:lang="he">חיבור מהיר בין ההתקנים שלך</summary>
<summary xml:lang="it">Connessione trasparente dei tuoi dispositivi</summary>
<summary xml:lang="ko">장치와 항상 연결하기</summary>
<summary xml:lang="nl">Naadloze verbinding met uw apparaten</summary>
@ -53,17 +61,21 @@
<summary xml:lang="zh-CN">无缝连接您的设备</summary>
<description>
<p>KDE Connect provides integration between your Android phone and your desktop.</p>
<p xml:lang="ar">يوفّر «كدي المتصّل» التّكامل بين هاتف أندرويد وسطح المكتب.</p>
<p xml:lang="ast">KDE Connect forne integración ente'l to preséu Android y el to escritoriu.</p>
<p xml:lang="ca">El KDE Connect proporciona la integració entre el telèfon Android i el vostre escriptori.</p>
<p xml:lang="ca-valencia">El KDE Connect proporciona la integració entre el telèfon Android i el vostre escriptori.</p>
<p xml:lang="cs">KDE Connect poskytuje integraci mezi vaším telefonem s Androidem a vaší pracovní plochou.</p>
<p xml:lang="da">KDE Connect giver integration mellem din Android-telefon og din desktop.</p>
<p xml:lang="de">KDE Connect bietet Integrationsdienste zwischen Ihrem Android-Telefon und Ihrem Desktop-Computer.</p>
<p xml:lang="el">Το KDE Connect παρέχει ενοποίηση μεταξύ του Android κινητού σας και του γραφικού περιβάλλοντος του υπολογιστή σας.</p>
<p xml:lang="en-GB">KDE Connect provides integration between your Android phone and your desktop.</p>
<p xml:lang="es">KDE Connect proporciona integración entre su teléfono Android y su escritorio.</p>
<p xml:lang="et">KDE Connect võimaldab kokku siduda oma Androidi telefoni ja arvuti töölaua.</p>
<p xml:lang="fi">KDE Connect tarjoaa integraation Android-puhelimesi ja työpöytäsi välillä.</p>
<p xml:lang="fr">KDE Connect permet d'intégrer votre téléphone Android avec votre bureau.</p>
<p xml:lang="gl">KDE Connect fornece integración entre os seus teléfonos con Android e o seu computador de escritorio.</p>
<p xml:lang="he">KDE Connect מספק שילוב בין מכשירי אנדרואיד לשולחן העבודה</p>
<p xml:lang="it">KDE Connect fornisce integrazione tra il tuo telefono Android e il tuo desktop.</p>
<p xml:lang="ko">KDE Connect는 안드로이드 휴대폰과 데스크톱을 연결합니다.</p>
<p xml:lang="nl">KDE Connect biedt integratie tussen uw Android telefoon en uw bureaublad.</p>

View file

@ -1,15 +1,19 @@
[Desktop Entry]
Name=KDE Connect Monitor
Name[ar]=مرقاب «كدي المتّصل»
Name[ast]=Monitor de KDE Connect
Name[ca]=Controlador del KDE Connect
Name[ca@valencia]=Controlador del KDE Connect
Name[cs]=Monitor KDE Connect
Name[da]=KDE Connect-overvåger
Name[de]=KDE-Connect-Monitor
Name[el]=Εφαρμογή εποπτείας του KDE Connect
Name[en_GB]=KDE Connect Monitor
Name[es]=Monitor de KDE Connect
Name[et]=KDE Connecti monitor
Name[fi]=KDE Connect -valvonta
Name[gl]=Monitor de KDE Connect
Name[he]=מנטר KDE Connect
Name[hu]=KDE Connect monitor
Name[it]=Monitor di KDE Connect
Name[ko]=KDE Connect
@ -25,16 +29,20 @@ Name[uk]=Монітор KDE Connect
Name[x-test]=xxKDE Connect Monitorxx
Name[zh_CN]=KDE Connect
Comment=Display information about your devices
Comment[ar]=اعرض معلومات عن أجهزتك
Comment[ast]=Amuesa información tocante a los tos preseos
Comment[ca]=Mostra la informació dels vostres dispositius
Comment[ca@valencia]=Mostra la informació dels vostres dispositius
Comment[cs]=Zobrazit informace o vašich zařízeních
Comment[da]=Vis information om dine enheder
Comment[de]=Anzeige von Informationen über Ihre Geräte
Comment[el]=Προβολή πληροφοριών σχετικά με τις συσκευές σας
Comment[en_GB]=Display information about your devices
Comment[es]=Mostrar información sobre sus dispositivos
Comment[et]=Teabe kuvamine seadmete kohta
Comment[fi]=Näyttää tietoa laitteistasi
Comment[gl]=Mostrar información sobre os dispositivos
Comment[he]=הצג מידע עך ההתקנים שלך
Comment[hu]=Információk megjelenítése az eszközeiről
Comment[it]=Visualizza informazioni sui tuoi dispositivi
Comment[ko]=

View file

@ -21,4 +21,4 @@ target_link_libraries(kdeconnectdeclarativeplugin
kdeconnectinterfaces
)
install(TARGETS kdeconnectdeclarativeplugin DESTINATION ${QML_INSTALL_DIR}/org/kde/kdeconnect)
install(FILES qmldir qml/PluginChecker.qml DESTINATION ${QML_INSTALL_DIR}/org/kde/kdeconnect)
install(FILES qmldir qml/PluginChecker.qml qml/DBusProperty.qml DESTINATION ${QML_INSTALL_DIR}/org/kde/kdeconnect)

View file

@ -86,6 +86,11 @@ void KdeConnectDeclarativePlugin::registerTypes(const char* uri)
qmlRegisterUncreatableType<LockDeviceDbusInterface>(uri, 1, 0, "LockDeviceDbusInterface", QStringLiteral("You're not supposed to instantiate interfacess"));
qmlRegisterUncreatableType<FindMyPhoneDeviceDbusInterface>(uri, 1, 0, "FindMyPhoneDbusInterface", QStringLiteral("You're not supposed to instantiate interfacess"));
qmlRegisterUncreatableType<DeviceDbusInterface>(uri, 1, 0, "DeviceDbusInterface", QStringLiteral("You're not supposed to instantiate interfacess"));
qmlRegisterSingletonType<DaemonDbusInterface>(uri, 1, 0, "DaemonDbusInterface",
[](QQmlEngine*, QJSEngine*) -> QObject* {
return new DaemonDbusInterface;
}
);
}
void KdeConnectDeclarativePlugin::initializeEngine(QQmlEngine* engine, const char* uri)

View file

@ -0,0 +1,69 @@
/**
* Copyright 2016 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 QtQml 2.2
import org.kde.kdeconnect 1.0
QtObject {
id: prop
property QtObject object: null
property string read
property string change: read+"Changed"
Component.onCompleted: get();
onChangeChanged: {
if (object) {
var theSignal = object[change];
if (theSignal) {
theSignal.connect(valueReceived);
} else {
console.warn("couldn't find signal", change, "for", object)
}
}
}
function valueReceived(val) {
if (!val) {
get();
} else {
_value = val;
}
}
property var defaultValue
property var _value: defaultValue
readonly property var value: _value
readonly property var v: DBusAsyncResponse {
id: response
autoDelete: false
onSuccess: {
prop._value = result;
}
onError: {
console.warn("failed call", object, read, write, change)
}
}
function get() {
response.setPendingCall(object[read]());
}
}

View file

@ -26,13 +26,12 @@ QtObject {
id: root
property string deviceId: ""
property alias device: conn.target
property string pluginName: ""
readonly property variant device: DeviceDbusInterfaceFactory.create(deviceId)
property bool available: false
property Connections connection: Connections {
target: device
readonly property Connections connection: Connections {
id: conn
onPluginsChanged: pluginsChanged()
}

View file

@ -2,3 +2,4 @@ module org.kde.kdeconnect
plugin kdeconnectdeclarativeplugin
PluginChecker 1.0 PluginChecker.qml
DBusProperty 1.0 DBusProperty.qml

View file

@ -27,8 +27,7 @@ QtObject {
id: root
property alias deviceId: checker.deviceId
readonly property alias device: checker.device
property alias device: checker.device
readonly property alias available: checker.available
readonly property PluginChecker pluginChecker: PluginChecker {
@ -55,7 +54,7 @@ QtObject {
onAvailableChanged: {
if (available) {
battery = DeviceBatteryDbusInterfaceFactory.create(deviceId)
battery = DeviceBatteryDbusInterfaceFactory.create(device.id())
battery.stateChanged.connect(function(c) {charging = c})
battery.chargeChanged.connect(function(c) {charge = c})

View file

@ -27,10 +27,8 @@ import org.kde.kdeconnect 1.0
PlasmaComponents.ListItem
{
id: root
property string deviceId: model.deviceId
readonly property QtObject device: DeviceDbusInterfaceFactory.create(model.deviceId)
Column {
width: parent.width
@ -53,7 +51,7 @@ PlasmaComponents.ListItem
{
FindMyPhone {
id: findmyphone
deviceId: root.deviceId
device: root.device
}
id: ring
@ -71,7 +69,7 @@ PlasmaComponents.ListItem
{
Sftp {
id: sftp
deviceId: root.deviceId
device: root.device
}
id: browse
@ -93,7 +91,7 @@ PlasmaComponents.ListItem
Battery {
id: battery
deviceId: root.deviceId
device: root.device
}
sectionDelegate: true
@ -129,7 +127,7 @@ PlasmaComponents.ListItem
id: notificationsView
model: NotificationsModel {
id: notificationsModel
deviceId: root.deviceId
deviceId: root.device.id()
}
delegate: PlasmaComponents.ListItem {
PlasmaComponents.Label {

View file

@ -27,8 +27,7 @@ QtObject {
id: root
property alias deviceId: checker.deviceId
readonly property alias device: checker.device
property alias device: checker.device
readonly property alias available: checker.available
readonly property PluginChecker pluginChecker: PluginChecker {
@ -46,7 +45,7 @@ QtObject {
onAvailableChanged: {
if (available) {
findMyPhone = FindMyPhoneDbusInterfaceFactory.create(deviceId)
findMyPhone = FindMyPhoneDbusInterfaceFactory.create(device.id())
} else {
findMyPhone = null
}

View file

@ -27,8 +27,7 @@ QtObject {
id: root
property alias deviceId: checker.deviceId
readonly property alias device: checker.device
property alias device: checker.device
readonly property alias available: checker.available
readonly property PluginChecker pluginChecker: PluginChecker {
@ -45,7 +44,7 @@ QtObject {
onAvailableChanged: {
if (available) {
sftp = SftpDbusInterfaceFactory.create(deviceId)
sftp = SftpDbusInterfaceFactory.create(device.id())
} else {
sftp = null
}

View file

@ -1,5 +1,7 @@
[Desktop Entry]
Name=KDE Connect
Name[ar]=كدي المتّصل
Name[ast]=KDE Connect
Name[bg]=KDE Connect
Name[bs]=Konekcija KDE
Name[ca]=KDE Connect
@ -7,12 +9,14 @@ Name[ca@valencia]=KDE Connect
Name[cs]=KDE Connect
Name[da]=KDE Connect
Name[de]=KDE-Connect
Name[el]=KDE Connect
Name[en_GB]=KDE Connect
Name[es]=KDE Connect
Name[et]=KDE Connect
Name[fi]=KDE Connect
Name[fr]=KDE Connect
Name[gl]=KDE Connect
Name[he]=KDE Connect
Name[hu]=KDE csatlakozás
Name[it]=KDE Connect
Name[ko]=KDE Connect
@ -30,6 +34,8 @@ Name[uk]=З’єднання KDE
Name[x-test]=xxKDE Connectxx
Name[zh_CN]=KDE Connect
Comment=Show notifications from your devices using KDE Connect
Comment[ar]=أظهر الإخطارات من أجهزتك باستخدام «كدي المتّصل»
Comment[ast]=Amuesa avisos de los tos preseos usando KDE Connect
Comment[bg]=Показване на уведомления от вашите устройства чрез KDE Connect
Comment[bs]=Prikaži obavlještenja sa uređaja koji koriste KDE konekciju
Comment[ca]=Mostra les notificacions dels vostres dispositius emprant el KDE Connect
@ -37,12 +43,14 @@ Comment[ca@valencia]=Mostra les notificacions dels vostres dispositius emprant e
Comment[cs]=Zobrazit upozornění z vašich zařízení pomocí KDE Connect
Comment[da]=Vis bekendtgørelser fra dine enheder med KDE Connect
Comment[de]=Zeigt Benachrichtigungen von Ihren Geräten mit KDE-Connect
Comment[el]=Προβολή ειδοποιήσεων από τις συσκευές σας με το KDE Connect
Comment[en_GB]=Show notifications from your devices using KDE Connect
Comment[es]=Mostrar notificaciones de sus dispositivos usando KDE Connect
Comment[et]=Seadmete märguannete näitamine KDE Connecti vahendusel
Comment[fi]=Näytä laitteidesi ilmoitukset KDE Connectilla
Comment[fr]=Afficher les notifications provenant de vos périphériques à l'aide de KDE Connect
Comment[gl]=Mostrar notificacións de dispositivos usando KDE Connect.
Comment[he]=הראה התראות מההתקן שלך באמצעות KDE Connect
Comment[hu]=Az eszközökről származó értesítések megjelenítése a KDE csatlakozás használatával
Comment[it]=Mostra le notifiche dei tuoi dispositivi tramite KDE Connect
Comment[ko]=KDE Connect

View file

@ -9,11 +9,14 @@
}
],
"Description": "Show your phone battery next to your computer battery",
"Description[ar]": "أظهر بطّاريّة الهاتف بجانب بطّاريّة الحاسوب",
"Description[ast]": "Amuesa la batería del teléfonu cabo la del ordenador",
"Description[ca@valencia]": "Mostra la bateria del telèfon al costat de la bateria de l'ordinador",
"Description[ca]": "Mostra la bateria del telèfon al costat de la bateria de l'ordinador",
"Description[cs]": "Zobrazit baterii vedle baterie počítače",
"Description[da]": "Vis dit telefonbatteri ved siden af dit computerbatteri",
"Description[de]": "Zeigt den Akku Ihres Telefons neben dem Akku des Rechners",
"Description[el]": "Εμφάνιση μπαταρίας συσκευής δίπλα στη μπαταρία του υπολογιστή",
"Description[es]": "Mostrar la batería del teléfono junto a la batería del equipo",
"Description[et]": "Telefoniaku näitamine otse arvutiaku kõrval",
"Description[fi]": "Näytä puhelimesi akku tietokoneen akun rinnalla",
@ -38,11 +41,14 @@
"Id": "kdeconnect_battery",
"License": "GPL",
"Name": "Battery monitor",
"Name[ar]": "مرقاب البطّاريّة",
"Name[ast]": "Monitor de batería",
"Name[ca@valencia]": "Monitor de la bateria",
"Name[ca]": "Monitor de la bateria",
"Name[cs]": "Monitor baterie",
"Name[da]": "Batteriovervågning",
"Name[de]": "Akkuüberwachung",
"Name[el]": "Παρακολούθηση μπαταρίας",
"Name[es]": "Monitor de batería",
"Name[et]": "Aku jälgija",
"Name[fi]": "Akkuvalvonta",
@ -74,4 +80,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.battery"
]
}
}

View file

@ -9,11 +9,14 @@
}
],
"Description": "Share the clipboard between devices",
"Description[ar]": "شارك الحافظة بين الجهازين",
"Description[ast]": "Comparte'l cartafueyu ente los preseos",
"Description[ca@valencia]": "Comparteix el porta-retalls entre dispositius",
"Description[ca]": "Comparteix el porta-retalls entre dispositius",
"Description[cs]": "Sdílet obsah schránky mezi zařízeními",
"Description[da]": "Del udklipsholderen mellem enheder",
"Description[de]": "Die Zwischenablage mit Geräten teilen",
"Description[el]": "Διαμοιρασμός του προχείρου μεταξύ συσκευών",
"Description[es]": "Compartir portapapeles entre dispositivos",
"Description[et]": "Lõikepuhvri jagamine seadmete vahel",
"Description[fi]": "Jaa leikepöytä laitteiden välillä",
@ -38,11 +41,14 @@
"Id": "kdeconnect_clipboard",
"License": "GPL",
"Name": "Clipboard",
"Name[ar]": "الحافظة",
"Name[ast]": "Cartafueyu",
"Name[ca@valencia]": "Porta-retalls",
"Name[ca]": "Porta-retalls",
"Name[cs]": "Schránka",
"Name[da]": "Udklipsholder",
"Name[de]": "Zwischenablage",
"Name[el]": "Πρόχειρο",
"Name[es]": "Portapapeles",
"Name[et]": "Lõikepuhver",
"Name[fi]": "Leikepöytä",
@ -74,4 +80,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.clipboard"
]
}
}

View file

@ -13,14 +13,18 @@
}
],
"Description": "Find your lost phone by making it play an alarm sound",
"Description[ar]": "جِد هاتفك الضّائع بتشغيل صوت المنبّه",
"Description[ast]": "Alcuentra'l to preséu perdíu faciéndolu sonar ",
"Description[ca@valencia]": "Troba el vostre telèfon perdut fent que reproduïsca un so d'alarma",
"Description[ca]": "Troba el vostre telèfon perdut fent que reprodueixi un so d'alarma",
"Description[cs]": "Najděte dsvůj telefon tím, že jej necháte přehrát zvuk upomínky",
"Description[da]": "Find din forsvundne telefon ved at få den til at afspille en alarm",
"Description[de]": "Finden Sie Ihr verlegtes Telefon, indem Sie mit ihm eine Warnton abspielen",
"Description[el]": "Βρείτε το χαμένο σας τηλέφωνο με ηχητική ειδοποίηση",
"Description[es]": "Encuentre su teléfono perdido haciéndole reproducir un sonido de alarma",
"Description[et]": "Kaotsi läinud telefoni leidmine sellel häireheli esitamisega",
"Description[fi]": "Löydä hukkaamasi puhelin laittamalla se soittamaan hälytysääntä",
"Description[gl]": "Reproducir un son de alarma nun teléfono móbil perdido para atopalo.",
"Description[it]": "Trova il tuo telefono smarrito facendogli suonare un allarme sonoro",
"Description[nl]": "Zoek uw verloren telefoon door het een wekkersignaal te laten spelen",
"Description[pl]": "Znajdź twój zgubiony telefon odgrywając na nim dźwięk",
@ -36,13 +40,17 @@
"Id": "kdeconnect_findmyphone",
"License": "GPL",
"Name": "Ring my phone",
"Name[ar]": "رنّ هاتفي",
"Name[ast]": "Alcontrar el mio teléfonu",
"Name[ca@valencia]": "Fes sonar el meu telèfon",
"Name[ca]": "Fes sonar el meu telèfon",
"Name[cs]": "Prozvonit můj telefon",
"Name[da]": "Ring min telefon op",
"Name[de]": "Mein Telefon anklingeln",
"Name[el]": "Κουδούνισμα του τηλεφώνου μου",
"Name[es]": "Hacer sonar mi teléfono",
"Name[et]": "Helista minu telefonile",
"Name[gl]": "Facer soar o meu móbil",
"Name[it]": "Fai squillare il mio telefono",
"Name[nl]": "Bel mijn telefoon",
"Name[pl]": "Dzwoń z mojego telefonu",
@ -61,4 +69,4 @@
"X-KdeConnect-OutgoingPackageType": [
"kdeconnect.findmyphone.request"
]
}
}

View file

@ -1,6 +1,8 @@
[Global]
IconName=kdeconnect
Name=KDE Connect
Name[ar]=كدي المتّصل
Name[ast]=KDE Connect
Name[bg]=KDE Connect
Name[bs]=Konekcija KDE
Name[ca]=KDE Connect
@ -8,12 +10,14 @@ Name[ca@valencia]=KDE Connect
Name[cs]=KDE Connect
Name[da]=KDE Connect
Name[de]=KDE-Connect
Name[el]=KDE Connect
Name[en_GB]=KDE Connect
Name[es]=KDE Connect
Name[et]=KDE Connect
Name[fi]=KDE Connect
Name[fr]=KDE Connect
Name[gl]=KDE Connect
Name[he]=KDE Connect
Name[hu]=KDE csatlakozás
Name[it]=KDE Connect
Name[ko]=KDE Connect
@ -31,6 +35,8 @@ Name[uk]=З’єднання KDE
Name[x-test]=xxKDE Connectxx
Name[zh_CN]=KDE Connect
Comment=Notifications from your devices
Comment[ar]=الإخطارات من أجهزتك
Comment[ast]=Avisos de los tos preseos
Comment[bg]=Уведомления от устройствата ви
Comment[bs]=Notifikacija sa Vašeg uređaja
Comment[ca]=Notificacions dels vostres dispositius
@ -38,12 +44,14 @@ Comment[ca@valencia]=Notificacions dels vostres dispositius
Comment[cs]=Oznamování z vašich zařízení
Comment[da]=Bekendtgørelser fra dine enheder
Comment[de]=Benachrichtigungen von Ihren Geräten
Comment[el]=Ειδοποιήσεις από τις συσκευές σας
Comment[en_GB]=Notifications from your devices
Comment[es]=Notificaciones de sus dispositivos
Comment[et]=Seadmete märguanded
Comment[fi]=Laitteesi ilmoitukset
Comment[fr]=Notifications provenant de vos périphériques
Comment[gl]=Notificacións de dispositivos.
Comment[he]=התראות מההתקן שלך
Comment[hu]=Az eszközökről származó értesítések
Comment[it]=Notifiche dai tuoi dispositivi
Comment[ko]=장치에 표시된 알림
@ -63,6 +71,8 @@ Comment[zh_CN]=来自你设备的通知
[Event/pairingRequest]
Name=Pairing Request
Name[ar]=طلب اقتران
Name[ast]=Solicitú d'empareyamientu
Name[bg]=Заявка за сдвояване
Name[bs]=Zahtjev za uparivanje
Name[ca]=Sol·licitud d'aparellament
@ -70,12 +80,14 @@ Name[ca@valencia]=Sol·licitud d'aparellament
Name[cs]=Požadavek na párování
Name[da]=Parringsanmodning
Name[de]=Verbindungsanfrage
Name[el]=Αίτημα σύζευξης
Name[en_GB]=Pairing Request
Name[es]=Petición de vinculación
Name[et]=Paardumissoov
Name[fi]=Paripyyntö
Name[fr]=Demande d'appariement
Name[gl]=Solicitude de emparellamento
Name[he]=בקשת התאמה
Name[hu]=Párosítási kérés
Name[it]=Richiesta di associazione
Name[ko]=연결 요청
@ -92,17 +104,22 @@ Name[uk]=Запит щодо пов’язування
Name[x-test]=xxPairing Requestxx
Name[zh_CN]=配对请求
Comment=Pairing request received from a device
Comment[ar]=استُلم طلب اقتران من جهاز
Comment[ast]=Solicitú d'empareyamientu recibida d'un preséu
Comment[ca]=Les sol·licituds d'aparellament rebudes des d'un dispositiu
Comment[ca@valencia]=Les sol·licituds d'aparellament rebudes des d'un dispositiu
Comment[cs]=Požadavek na párování přijat ze zařízení
Comment[da]=Parringsanmodning modtaget fra en enhed
Comment[de]=Verbindungsanfrage von einem Gerät erhalten
Comment[el]=Λήφθηκε αίτημα σύζευξης από μια συσκευή
Comment[en_GB]=Pairing request received from a device
Comment[es]=Petición de vinculación recibida desde un dispositivo
Comment[et]=Seadmelt saadi paardumissoov
Comment[fi]=Saatiin paripyyntö laitteelta
Comment[gl]=Recibiuse unha solicitude de emparellamento dun dispositivo.
Comment[he]=התקבלה בקשת התאמה מהתקן
Comment[it]=Richiesta di associazione ricevuta da un dispositivo
Comment[nl]=Verzoek om een paar te maken ontvangen van een apparaat
Comment[nl]=Verzoek om een paar te maken ontvangen van apparaten
Comment[pl]=Otrzymano żądanie parowania z urządzenia
Comment[pt]=Pedido de emparelhamento recebido de um dispositivo
Comment[pt_BR]=Solicitação de emparelhamento recebida de um dispositivo
@ -114,18 +131,22 @@ Action=Popup
[Event/callReceived]
Name=Incoming Call
Name[ar]=مكالمة واردة
Name[ast]=Llamada entrante
Name[bg]=Входящо обаждане
Name[ca]=Trucada entrant
Name[ca@valencia]=Trucada entrant
Name[cs]=Příchozí hovor
Name[da]=Indkommende opkald
Name[de]=Eingehender Anruf
Name[el]=Εισερχόμενη κλήση
Name[en_GB]=Incoming Call
Name[es]=Llamada entrante
Name[et]=Sisenev kõne
Name[fi]=Saapuva puhelu
Name[fr]=Appel entrant
Name[gl]=Chamada entrante
Name[he]=שיחה נכנסת
Name[hu]=Bejövő hívás
Name[it]=Chiamata in ingresso
Name[ko]=수신 전화
@ -142,6 +163,8 @@ Name[uk]=Вхідний дзвінок
Name[x-test]=xxIncoming Callxx
Name[zh_CN]=收到呼叫
Comment=Someone is calling you
Comment[ar]=ثمّة من يتّصل بك
Comment[ast]=Daquién ta llamándote
Comment[bg]=Някой ви се обажда
Comment[bs]=Neko Vas zove
Comment[ca]=Algú us està trucant
@ -149,12 +172,14 @@ Comment[ca@valencia]=Algú vos està trucant
Comment[cs]=Někdo vám volá
Comment[da]=Nogen ringer til dig
Comment[de]=Sie werden angerufen
Comment[el]=Κάποιος σας καλεί
Comment[en_GB]=Someone is calling you
Comment[es]=Alguien le está llamando
Comment[et]=Keegi helistab sulle
Comment[fi]=Sinulle soitetaan
Comment[fr]=Quelqu'un vous appelle
Comment[gl]=Está a recibir unha chamada de alguén.
Comment[he]=מישהו מתקשר אילך
Comment[hu]=Valaki hívja önt
Comment[it]=Chiamata in arrivo
Comment[ko]=누군가가 전화를 걸었음
@ -175,18 +200,22 @@ Action=Popup
[Event/missedCall]
Name=Missed Call
Name[ar]=مكالمة فائتة
Name[ast]=Llamada perdida
Name[bg]=Пропуснато обаждане
Name[ca]=Trucada perduda
Name[ca@valencia]=Trucada perduda
Name[cs]=Zmeškaný hovor
Name[da]=Ubesvaret opkald
Name[de]=Verpasster Anruf
Name[el]=Αναπάντητη κλήση
Name[en_GB]=Missed Call
Name[es]=Llamada perdida
Name[et]=Vastamata kõne
Name[fi]=Vastaamaton puhelu
Name[fr]=Appel manqué
Name[gl]=Chamada perdida
Name[he]=שיחה שלא נענתה
Name[hu]=Nem fogadott hívás
Name[it]=Chiamate perse
Name[ko]=부재 중 전화
@ -203,6 +232,8 @@ Name[uk]=Пропущений дзвінок
Name[x-test]=xxMissed Callxx
Name[zh_CN]=未接来电
Comment=You have a missed call
Comment[ar]=لقد فاتتك مكالمة
Comment[ast]=Tienes una llamada perdida
Comment[bg]=Имате неприето обаждане
Comment[bs]=Imate propušten poziv
Comment[ca]=Teniu una trucada perduda
@ -210,12 +241,14 @@ Comment[ca@valencia]=Teniu una trucada perduda
Comment[cs]=Máte zmeškaný hovor
Comment[da]=Du har et ubesvaret opkald
Comment[de]=Sie haben einen Anruf verpasst
Comment[el]=Έχετε μια αναπάντητη κλήση
Comment[en_GB]=You have a missed call
Comment[es]=Tiene una llamada perdida
Comment[et]=Kõnele jäi vastamata
Comment[fi]=Sinulla on vastaamaton puhelu
Comment[fr]=Vous avez un appel manqué
Comment[gl]=Ten unha chamada perdida.
Comment[he]=יש לך שיחה שלא נענטה
Comment[hu]=Nem fogadott hívása van
Comment[it]=Hai una chiamata persa
Comment[ko]=부재 중 전화가 있음
@ -236,18 +269,22 @@ Action=Popup
[Event/smsReceived]
Name=SMS Received
Name[ar]=استُلمت رسالة
Name[ast]=SMS recibíu
Name[bg]=Получен SMS
Name[ca]=S'ha rebut un SMS
Name[ca@valencia]=S'ha rebut un SMS
Name[cs]=SMS přijata
Name[da]=SMS-modtaget
Name[de]=SMS empfangen
Name[el]=Λήφθηκε SMS
Name[en_GB]=SMS Received
Name[es]=SMS recibido
Name[et]=SMS-i saamine
Name[fi]=Saatiin tekstiviesti
Name[fr]=SMS reçu
Name[gl]=Recibiuse un SMS
Name[he]=התקבלה הודעת SMS
Name[hu]=SMS érkezett
Name[it]=SMS ricevuto
Name[ko]=SMS 받음
@ -264,6 +301,8 @@ Name[uk]=Отримано SMS
Name[x-test]=xxSMS Receivedxx
Name[zh_CN]=收到短信
Comment=Someone sent you an SMS
Comment[ar]=ثمّة من أرسل رسالة إليك
Comment[ast]=Daquién unvióte un SMS
Comment[bg]=Някой ви изпрати текстово съобщение
Comment[bs]=Neko Vam je poslao SMS poruku
Comment[ca]=Algú us ha enviat un SMS
@ -271,12 +310,14 @@ Comment[ca@valencia]=Algú vos ha enviat un SMS
Comment[cs]=Někdo vám poslal SMS
Comment[da]=Nogen sendte dig en SMS
Comment[de]=Jemand hat Ihnen eine SMS gesendet
Comment[el]=Κάποιος σας έστειλε SMS
Comment[en_GB]=Someone sent you an SMS
Comment[es]=Alguien le ha enviado un SMS
Comment[et]=Keegi saatis sulle SMS-i
Comment[fi]=Sinulle lähetettiin tekstiviesti
Comment[fr]=Quelqu'un vous a envoyé un SMS
Comment[gl]=Recibiu unha mensaxe SMS de alguén.
Comment[he]=מישהו שלח לך SMS
Comment[hu]=Valaki SMS-t küldött önnek
Comment[it]=Hai ricevuto un SMS
Comment[ko]=누군가가 문자 메시지를 보냄
@ -297,12 +338,15 @@ Action=Popup
[Event/batteryLow]
Name=Battery Low
Name[ar]=البطّاريّة ضعيفة
Name[ast]=Batería baxa
Name[bg]=Изтощена батерия
Name[ca]=Bateria baixa
Name[ca@valencia]=Bateria baixa
Name[cs]=Baterie je téměř vybitá
Name[da]=Lavt batteri
Name[de]=Akku-Ladestand niedrig
Name[el]=Μπαταρία χαμηλή
Name[en_GB]=Battery Low
Name[es]=Batería baja
Name[et]=Aku laetus on madal
@ -325,6 +369,8 @@ Name[uk]=Низький рівень заряду
Name[x-test]=xxBattery Lowxx
Name[zh_CN]=电池电量低
Comment=Your battery is in low state
Comment[ar]=بطّاريّتك في الحالة الضعيفة
Comment[ast]=La to batería ta nun estáu baxu
Comment[bg]=Батерията ви е с нисък заряд
Comment[bs]=Vaša baterija je gotovo prazna
Comment[ca]=La bateria està baixa
@ -332,12 +378,14 @@ Comment[ca@valencia]=La bateria està baixa
Comment[cs]=Máte slabou baterii
Comment[da]=Dit batteri er på lavt niveau
Comment[de]=Der Ladestand Ihres Akkus ist niedrig
Comment[el]=Η μπαταρία σας είναι σε χαμηλό επίπεδο
Comment[en_GB]=Your battery is in low state
Comment[es]=La batería está en nivel bajo
Comment[et]=Aku täituvus on madal
Comment[fi]=Akkusi virta on vähissä
Comment[fr]=Votre batterie est faible
Comment[gl]=A batería está esgotándose.
Comment[he]=הבטריה שלך הולכת להגמר
Comment[hu]=Az akkumulátora feszültsége alacsony
Comment[it]=La tua batteria è al livello basso
Comment[ko]=배터리가 부족함
@ -358,18 +406,22 @@ Action=Popup
[Event/pingReceived]
Name=Ping Received
Name[ar]=استُلمت وكزة
Name[ast]=Ping recibíu
Name[bg]=Пингът е приет
Name[ca]=S'ha rebut un ping
Name[ca@valencia]=S'ha rebut un ping
Name[cs]=Ping přijat
Name[da]=Ping modtaget
Name[de]=Ping empfangen
Name[el]=Λήφθηκε ping
Name[en_GB]=Ping Received
Name[es]=Ping recibido
Name[et]=Pingi saamine
Name[fi]=Saatiin tiedustelupaketti
Name[fr]=Ping reçu
Name[gl]=Recibiuse un ping
Name[he]=התקבל פינג
Name[hu]=Ping érkezett
Name[it]=Ping ricevuto
Name[ko]=핑 받음
@ -386,6 +438,8 @@ Name[uk]=Отримано сигнал підтримки зв’язку
Name[x-test]=xxPing Receivedxx
Name[zh_CN]=收到 Ping
Comment=Ping received
Comment[ar]=استُلمت وكزة
Comment[ast]=Recibióse un ping
Comment[bg]=Пингът е приет
Comment[bs]=Primili ste ping
Comment[ca]=S'ha rebut un ping
@ -393,12 +447,14 @@ Comment[ca@valencia]=S'ha rebut un ping
Comment[cs]=Ping přijat
Comment[da]=Ping modtaget
Comment[de]=Ping empfangen
Comment[el]=Λήφθηκε ping
Comment[en_GB]=Ping received
Comment[es]=Ping recibido
Comment[et]=Pingi saamine
Comment[fi]=Saatiin tiedustelupaketti
Comment[fr]=Ping reçu
Comment[gl]=Recibiuse un “ping”.
Comment[he]=התקבל פינג
Comment[hu]=Ping érkezett
Comment[it]=Hai ricevuto un ping
Comment[ko]=핑 받음
@ -419,18 +475,22 @@ Action=Popup
[Event/notification]
Name=Generic Notification
Name[ar]=إخطار عموميّ
Name[ast]=Avisu xenéricu
Name[bg]=Общо уведомление
Name[ca]=Notificació genèrica
Name[ca@valencia]=Notificació genèrica
Name[cs]=Obecná hlášení
Name[da]=Generisk bekendtgørelse
Name[de]=Allgemeine Benachrichtigung
Name[el]=Γενική ειδοποίηση
Name[en_GB]=Generic Notification
Name[es]=Notificación genérica
Name[et]=Üldine märguanne
Name[fi]=Yleinen ilmoitus
Name[fr]=Notification
Name[gl]=Notificación xenérica
Name[he]=התראה כללית
Name[hu]=Általános értesítés
Name[it]=Notifica generica
Name[ko]=일반 알림
@ -447,6 +507,8 @@ Name[uk]=Загальне сповіщення
Name[x-test]=xxGeneric Notificationxx
Name[zh_CN]=一般通知
Comment=Notification received
Comment[ar]=استُلم إخطار
Comment[ast]=Avisu recibíu
Comment[bg]=Уведомлението е прието
Comment[bs]=Primjeno obavještenje
Comment[ca]=Notificació rebuda
@ -454,12 +516,14 @@ Comment[ca@valencia]=Notificació rebuda
Comment[cs]=Bylo přijato upozornění
Comment[da]=Bekendtgørelse modtaget
Comment[de]=Benachrichtigung eingegangen
Comment[el]=Λήφθηκε ειδοποίηση
Comment[en_GB]=Notification received
Comment[es]=Notificación recibida
Comment[et]=Saadi märguanne
Comment[fi]=Saatiin ilmoitus
Comment[fr]=Notification reçue
Comment[gl]=Recibiuse unha notificación.
Comment[he]=התראה התקבלה
Comment[hu]=Értesítés érkezett
Comment[it]=Hai ricevuto una notifica
Comment[ko]=알림 받음
@ -480,18 +544,22 @@ Action=Popup
[Event/transferReceived]
Name=File Transfer
Name[ar]=نقل الملفّات
Name[ast]=Tresferencia de ficheros
Name[bg]=Прехвърляне на файл
Name[ca]=Transferència de fitxers
Name[ca@valencia]=Transferència de fitxers
Name[cs]=Přenos souboru
Name[da]=Filoverførsel
Name[de]=Dateiübertragung
Name[el]=Μεταφορά αρχείου
Name[en_GB]=File Transfer
Name[es]=Transferencia de archivo
Name[et]=Failiedastus
Name[fi]=Tiedostonsiirto
Name[fr]=Transfert de fichiers
Name[gl]=Transferencia dun ficheiro
Name[he]=העברת קובץ
Name[hu]=Fájlátvitel
Name[it]=Trasferimento file
Name[ko]=파일 전송
@ -508,18 +576,22 @@ Name[uk]=Перенесення файлів
Name[x-test]=xxFile Transferxx
Name[zh_CN]=文件传送
Comment=Incoming file
Comment[ar]=ملفّ قادم
Comment[ast]=Ficheru entrante
Comment[bg]=Входящ файл
Comment[ca]=Fitxer entrant
Comment[ca@valencia]=Fitxer entrant
Comment[cs]=Příchozí soubor
Comment[da]=Indkommende fil
Comment[de]=Eingehende Datei
Comment[el]=Εισερχόμενο αρχείο
Comment[en_GB]=Incoming file
Comment[es]=Archivo entrante
Comment[et]=Sisenev fail
Comment[fi]=Saapuva tiedosto
Comment[fr]=Fichier entrant
Comment[gl]=Ficheiro entrante
Comment[he]=קובץ מגיע
Comment[hu]=Bejövő fájl
Comment[it]=File in ingresso
Comment[ko]=파일 수신

View file

@ -3,6 +3,8 @@ Type=ServiceType
X-KDE-ServiceType=KdeConnect/Plugin
X-KDE-Derived=KPluginInfo
Name=KDEConnect Plugin
Name[ar]=ملحقة KDEConnect
Name[ast]=Complementu KDEConnect
Name[bg]=Приставка на KDEConnect
Name[bs]=Priključak za KDE konekciju
Name[ca]=Connector del KDE Connect
@ -10,12 +12,14 @@ Name[ca@valencia]=Connector del KDE Connect
Name[cs]=Modul KDEConnect
Name[da]=KDEConnect-plugin
Name[de]=KDEConnect-Modul
Name[el]=Πρόσθετο του KDEConnect
Name[en_GB]=KDEConnect Plugin
Name[es]=Complemento de KDEConnect
Name[et]=KDEConnecti plugin
Name[fi]=KDE Connect -liitännäinen
Name[fr]=Module externe KDEConnect
Name[gl]=Complemento de KDE Connect
Name[he]=תוספי KDEConnect
Name[hu]=KDEConnect bővítmény
Name[it]=Estensione KDEConnect
Name[ko]=KDEConnect

View file

@ -9,11 +9,14 @@
}
],
"Description": "Locks your systems",
"Description[ar]": "أوصد الأنظمة",
"Description[ast]": "Bloquia los tos sistemes",
"Description[ca@valencia]": "Bloqueja els vostres sistemes",
"Description[ca]": "Bloqueja els vostres sistemes",
"Description[cs]": "Zamkne vaše systémy",
"Description[da]": "Låser dine systemer",
"Description[de]": "Sperrt Ihre Systeme",
"Description[el]": "Κλειδώνει τα συστήματά σας",
"Description[es]": "Bloquear sus sistemas",
"Description[et]": "Oma süsteemide lukustamine",
"Description[fi]": "Lukitsee järjestelmäsi",
@ -37,6 +40,8 @@
"Id": "kdeconnect_lockdevice",
"License": "GPL",
"Name": "LockDevice",
"Name[ar]": "أوصد الجهاز",
"Name[ast]": "Bloquiar preséu",
"Name[ca@valencia]": "Bloqueja el dispositiu",
"Name[ca]": "Bloqueja el dispositiu",
"Name[cs]": "Uzamknout zařízení",
@ -73,4 +78,4 @@
"kdeconnect.lock.request",
"kdeconnect.lock"
]
}
}

View file

@ -5,15 +5,19 @@
{
"Email": "ahmedibrahimkhali@gmail.com",
"Name": "Ahmed I. Khalil",
"Name[ar]": "أحمد إبراهيم خليل",
"Name[x-test]": "xxAhmed I. Khalilxx"
}
],
"Description": "Use your phone as a touchpad and keyboard",
"Description[ar]": "استخدم الهاتف كفأرة ولوحة مفاتيح",
"Description[ast]": "Usa'l to preséu como un panel táutil y tecláu",
"Description[ca@valencia]": "Empra el telèfon com un ratolí tàctil i teclat",
"Description[ca]": "Empra el telèfon com un ratolí tàctil i teclat",
"Description[cs]": "Používejte svůj telefon jako touchpad a klávesnici",
"Description[da]": "Brug din telefon som touchpad og tastatur",
"Description[de]": "Verwendet Ihr Handy als Touchpad und Tastatur",
"Description[el]": "Χρήση του τηλεφώνου σας ως οθόνη αφής και πληκτρολογίου",
"Description[es]": "Usar teléfono como panel táctil y teclado",
"Description[et]": "Telefoni kasutamine puutepadja ja klaviatuurina",
"Description[fi]": "Käytä puhelintasi kosketuslevynä ja näppäimistönä",
@ -38,11 +42,14 @@
"Id": "kdeconnect_mousepad",
"License": "GPL",
"Name": "Virtual input",
"Name[ar]": "دخل وهميّ",
"Name[ast]": "Entrada virtual",
"Name[ca@valencia]": "Entrada virtual",
"Name[ca]": "Entrada virtual",
"Name[cs]": "Virtuální vstup",
"Name[da]": "Virtuelt input",
"Name[de]": "Virtuelle Eingabe",
"Name[el]": "Εικονικά στοιχεία εισόδου",
"Name[es]": "Entrada virtual",
"Name[et]": "Virtuaalsisestus",
"Name[fi]": "Virtuaalinen syöttö",
@ -71,4 +78,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.mousepad.request"
]
}
}

View file

@ -9,11 +9,14 @@
}
],
"Description": "Remote control your music and videos",
"Description[ar]": "تحكّم بالموسيقى والفيديو عن بعد",
"Description[ast]": "Control remotu de la to música y videos",
"Description[ca@valencia]": "Comandament a distància per a la vostra música i vídeos",
"Description[ca]": "Comandament a distància per a la vostra música i vídeos",
"Description[cs]": "Ovládejte vzdáleně vaši hudbu a videa",
"Description[da]": "Fjernbetjen din musik og videoer",
"Description[de]": "Fernbedienung für Musik und Videos",
"Description[el]": "Απομακρυσμένος έλεγχος της μουσικής σας και των βίντεο",
"Description[es]": "Controlar remotamente vídeos y música",
"Description[et]": "Oma muusika ja videote kaugjuhtimine",
"Description[fi]": "Kauko-ohjain musiikkiisi ja videoihisi",
@ -38,11 +41,14 @@
"Id": "kdeconnect_mpriscontrol",
"License": "GPL",
"Name": "Multimedia control receiver",
"Name[ar]": "مستقبل تحكّمات الوسائط المتعدّدة",
"Name[ast]": "Mandu de control multimedia",
"Name[ca@valencia]": "Receptor del comandament multimèdia",
"Name[ca]": "Receptor del comandament multimèdia",
"Name[cs]": "Dálkový ovladač multimédií",
"Name[da]": "Multimediekontrol-modtager",
"Name[de]": "Steuerung für Multimedia-Empfänger",
"Name[el]": "Δέκτης ελέγχου πολυμέσων",
"Name[es]": "Receptor de control multimedia",
"Name[et]": "Multimeedia juhtimine",
"Name[fi]": "Multimediakauko-ohjain",
@ -74,4 +80,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.mpris.request"
]
}
}

View file

@ -175,6 +175,26 @@ void MprisControlPlugin::propertiesChanged(const QString& propertyInterface, con
np.set("isPlaying", playing);
somethingToSend = true;
}
if (properties.contains("CanPause")) {
np.set("canPause", properties["CanPause"].toBool());
somethingToSend = true;
}
if (properties.contains("CanPlay")) {
np.set("canPlay", properties["CanPlay"].toBool());
somethingToSend = true;
}
if (properties.contains("CanGoNext")) {
np.set("canGoNext", properties["CanGoNext"].toBool());
somethingToSend = true;
}
if (properties.contains("CanGoPrevious")) {
np.set("canGoPrevious", properties["CanGoPrevious"].toBool());
somethingToSend = true;
}
if (properties.contains("CanSeek")) {
np.set("canSeek", properties["CanSeek"].toBool());
somethingToSend = true;
}
if (somethingToSend) {
OrgFreedesktopDBusPropertiesInterface* interface = (OrgFreedesktopDBusPropertiesInterface*)sender();
@ -264,6 +284,12 @@ bool MprisControlPlugin::receivePackage (const NetworkPackage& np)
bool playing = (mprisInterface.playbackStatus() == QLatin1String("Playing"));
answer.set("isPlaying", playing);
answer.set("canPause", mprisInterface.canPause());
answer.set("canPlay", mprisInterface.canPlay());
answer.set("canGoNext", mprisInterface.canGoNext());
answer.set("canGoPrevious", mprisInterface.canGoPrevious());
answer.set("canSeek", mprisInterface.canSeek());
somethingToSend = true;
}
if (np.get<bool>("requestVolume")) {

View file

@ -9,11 +9,14 @@
}
],
"Description": "Control MPRIS services",
"Description[ar]": "تحكّم بخدمات MPRIS",
"Description[ast]": "Controla servicios MPRIS",
"Description[ca@valencia]": "Serveis de control del MPRIS",
"Description[ca]": "Serveis de control del MPRIS",
"Description[cs]": "Ovládejte služby MPRIS",
"Description[da]": "Kontrollér MPRIS-tjenester",
"Description[de]": "Steuerung von MPRIS-Diensten",
"Description[el]": "Έλεγχος υπηρεσιών MPRIS",
"Description[es]": "Controlar los servicios MPRIS",
"Description[et]": "MPRIS-teenuste juhtimine",
"Description[fi]": "Ohjaa MPRIS-palveluita",
@ -37,6 +40,7 @@
"Id": "kdeconnect_mprisremote",
"License": "GPL",
"Name": "MprisRemote",
"Name[ar]": "Mpris عن بعد",
"Name[et]": "Kaug-Mpris",
"Name[fi]": "MPRIS-kauko-ohjain",
"Name[nn]": "MPRIS-fjernkontroll",
@ -58,4 +62,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.mpris"
]
}
}

View file

@ -9,13 +9,17 @@
}
],
"Description": "Show device's notifications on this computer and keep them in sync",
"Description[ar]": "أظهر إخطارات الجهاز على هذا الحاسوب وأبقها متزامنة",
"Description[ast]": "Amuesa los avisos del preséu nesti ordenador y caltiénlos sincronizaos",
"Description[ca@valencia]": "Mostra les notificacions del dispositiu a l'ordinador i les manté sincronitzades",
"Description[ca]": "Mostra les notificacions del dispositiu a l'ordinador i les manté sincronitzades",
"Description[cs]": "Zobrazit upozornění telefonu v počítači a udržovat je synchronizovaná",
"Description[da]": "Vis enhedens bekendtgørelser på denne computer og hold dem synkroniseret",
"Description[de]": "Benachrichtigungen des Geräts auf diesem Rechner anzeigen und abgleichen",
"Description[el]": "Εμφάνιση ειδοποιήσεων συσκευής στον υπολογιστή αυτόν και συγχρονισμός τους",
"Description[es]": "Mostrar notificaciones del dispositivo en este equipo y mantenerlas en sincronía",
"Description[et]": "Seadme märguannete näitamine arvutis ja nende sünkroonis hoidmine",
"Description[gl]": "Mostrar as notificacións do dispositivo neste computador e mantelas sincronizadas.",
"Description[it]": "Mostra le notifiche del telefono sul tuo computer e tienile sincronizzate",
"Description[nl]": "Apparaatmeldingen op deze computer tonen en ze gesynchroniseerd houden",
"Description[pl]": "Pokaż powiadomienia urządzenia na swoim komputerze i synchronizuj je",
@ -30,13 +34,17 @@
"Id": "kdeconnect_notifications",
"License": "GPL",
"Name": "Receive notifications",
"Name[ar]": "استقبل الإخطارات",
"Name[ast]": "Recibimientu d'avisos",
"Name[ca@valencia]": "Recepció de les notificacions",
"Name[ca]": "Recepció de les notificacions",
"Name[cs]": "Přijímat oznámení",
"Name[da]": "Modtag bekendtgørelser",
"Name[de]": "Benachrichtigungen empfangen",
"Name[el]": "Λήψη ειδοποιήσεων",
"Name[es]": "Recibir notificaciones",
"Name[et]": "Märguannete vastuvõtmine",
"Name[gl]": "Recibir notificacións",
"Name[it]": "Ricevi notifiche",
"Name[nl]": "Meldingen ontvangen",
"Name[pl]": "Otrzymuj powiadomienia",
@ -58,4 +66,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.notification"
]
}
}

View file

@ -9,11 +9,14 @@
}
],
"Description": "Pause music/videos during a phone call",
"Description[ar]": "ألبث الموسيقى/الفيديو أثناء المكالمات الهاتفيّة",
"Description[ast]": "Posa la música/videos nuna llamada telefónica",
"Description[ca@valencia]": "Pausa la música/vídeos durant una trucada telefònica",
"Description[ca]": "Pausa la música/vídeos durant una trucada telefònica",
"Description[cs]": "Pozastavit hudbu/video během telefonátu",
"Description[da]": "Sæt musik/video på pause under telefonsamtaler",
"Description[de]": "Hält Musik oder Videos währen eines Anrufs an",
"Description[el]": "Παύση μουσικής/βίντεο κατά τη διάρκεια κλήσης",
"Description[es]": "Pausar música/video durante las llamadas telefónicas",
"Description[et]": "Muusika või video peatamine telefonikõne ajal",
"Description[fi]": "Keskeytä musiikki ja videot puhelun aikana",
@ -38,11 +41,14 @@
"Id": "kdeconnect_pausemusic",
"License": "GPL",
"Name": "Pause media during calls",
"Name[ar]": "ألبث الوسائط أثناء المكالمات",
"Name[ast]": "Pausa de multimedia nes llamaes",
"Name[ca@valencia]": "Pausa els suports durant les trucades",
"Name[ca]": "Pausa els suports durant les trucades",
"Name[cs]": "Pozastavit média během telefonátu",
"Name[da]": "Sæt medier på pause under opkald",
"Name[de]": "Medium bei Anrufen anhalten",
"Name[el]": "Παύση πολυμέσων στη διάρκεια κλήσεων",
"Name[es]": "Pausar medios durante las llamadas",
"Name[et]": "Meedia peatamine kõne ajal",
"Name[fi]": "Keskeytä toisto puhelujen aikana",
@ -71,4 +77,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.telephony"
]
}
}

View file

@ -6,6 +6,8 @@ X-KDE-Library=kdeconnect_pausemusic_config
X-KDE-ParentComponents=kdeconnect_pausemusic
Name=Pause Music plugin settings
Name[ar]=إعدادات ملحقة إلباث الموسيقى
Name[ast]=Axustes del complementu de posar música
Name[bg]=Настройки на приставката за поставяне на пауза
Name[bs]=Zaustavi Muziku postavke dodatka
Name[ca]=Ajustaments del connector Pausa la música
@ -13,12 +15,14 @@ Name[ca@valencia]=Ajustaments del connector Pausa la música
Name[cs]=Nastavení modulu Pozastavení hudby
Name[da]=Indstilling af plugin til at sætte musik på pause
Name[de]=Modul-Einstellungen für das Anhalten der Musikwiedergabe
Name[el]=Ρυθμίσεις προσθέτου παύσης μουσικής
Name[en_GB]=Pause Music plugin settings
Name[es]=Ajustes del complemento PauseMusic
Name[et]=Muusika peatamise plugina seadistused
Name[fi]=Keskeytä musiikki -liitännäisen asetukset
Name[fr]=Paramètres du module de mise en pause
Name[gl]=Configuración do complemento para deter a música
Name[he]=הגדרות התוספת השהיית המוזיקה
Name[hu]=Zene szüneteltetése bővítmény beállításai
Name[it]=Impostazioni estensione Sospendi musica
Name[ko]=

View file

@ -9,11 +9,14 @@
}
],
"Description": "Send and receive pings",
"Description[ar]": "أرسل الوخزات واستقبلها",
"Description[ast]": "Unvia y recibe pings",
"Description[ca@valencia]": "Envia i rep pings",
"Description[ca]": "Envia i rep pings",
"Description[cs]": "Posílat a přijímat ping",
"Description[da]": "Send og modtag ping",
"Description[de]": "Senden und Empfangen von Pings",
"Description[el]": "Αποστολή και λήψη pings",
"Description[es]": "Enviar y recibir pings",
"Description[et]": "Pingide saatmine ja vastuvõtmine",
"Description[fi]": "Lähetä ja vastaanota tiedustelupaketteja",
@ -38,6 +41,7 @@
"Id": "kdeconnect_ping",
"License": "GPL",
"Name": "Ping",
"Name[ar]": "وخزة",
"Name[fi]": "Tiedustelupaketti",
"Name[ko]": "핑",
"Name[pt]": "Contacto",
@ -57,4 +61,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.ping"
]
}
}

View file

@ -8,12 +8,15 @@
"Name[x-test]": "xxAleix Polxx"
}
],
"Description": "Executes commands from remote devices among a locally defined set",
"Description": "Trigger commands predefined on the remote device",
"Description[ar]": "نفّذ أوامر معرّفة مسبقًا في الجهاز البعيد",
"Description[ast]": "Aiciona comandos predefiníos nel preséu remotu",
"Description[ca@valencia]": "Activa ordes predefinides en el dispositiu remot",
"Description[ca]": "Activa ordres predefinides en el dispositiu remot",
"Description[cs]": "Spouštět příkazy předpřipravené na vzdáleném zařízení",
"Description[da]": "Udløs kommandoer som er prædefinerede på den eksterne enhed",
"Description[de]": "Vordefinierte Befehle auf dem entfernten Gerät ausführen",
"Description[el]": "Ενεργοποίηση προκαθορισμένων εντολών στην απομακρυσμένη συσκευή",
"Description[es]": "Desencadenar órdenes predefinidas en el dispositivo remoto",
"Description[et]": "Kaugseadmes määratud käskude käivitamine",
"Description[it]": "Innesca comandi predefiniti sul dispositivo remoto",
@ -29,6 +32,8 @@
"Id": "kdeconnect_remotecommands",
"License": "GPL",
"Name": "Host remote commands",
"Name[ar]": "نفّذ أوامر بعيدة",
"Name[ast]": "Execución de comandos remotos",
"Name[ca@valencia]": "Executa ordes remotes",
"Name[ca]": "Executa ordres remotes",
"Name[cs]": "Spouštět příkazy vzdáleně",

View file

@ -9,11 +9,14 @@
}
],
"Description": "Control Remote systems",
"Description[ar]": "تحكّم بالأنظمة البعيدة",
"Description[ast]": "Controla sistemes remotos",
"Description[ca@valencia]": "Sistemes de control remot",
"Description[ca]": "Sistemes de control remot",
"Description[cs]": "Ovládejte vzdálené systémy",
"Description[da]": "Fjernbetjen systemer",
"Description[de]": "Entfernte Systeme steuern",
"Description[el]": "Έλεγχος ανταπόκρισης απομακρυσμένων συστημάτων",
"Description[es]": "Controlar sistemas remotos",
"Description[et]": "Kaugjuhtimissüsteemid",
"Description[fi]": "Ohjaa järjestelmiä etänä",
@ -37,6 +40,8 @@
"Id": "kdeconnect_remotecontrol",
"License": "GPL",
"Name": "RemoteControl",
"Name[ar]": "التّحكّم عن بعد",
"Name[ast]": "Control remotu",
"Name[ca@valencia]": "Control remot",
"Name[ca]": "Control remot",
"Name[cs]": "Dálkové ovládání",
@ -69,4 +74,4 @@
"kdeconnect.mousepad.request"
],
"X-KdeConnect-SupportedPackageType": []
}
}

View file

@ -14,11 +14,14 @@
}
],
"Description": "Execute console commands remotely",
"Description[ar]": "نفّذ أوامر طرفيّة عن بعد",
"Description[ast]": "Executa los comandos de consola de mou remotu",
"Description[ca@valencia]": "Executa ordes de la consola de forma remota",
"Description[ca]": "Executa ordres de la consola de forma remota",
"Description[cs]": "Spouštět konzolové příkazy vzdáleně",
"Description[da]": "Kør konsolkommandoer udefra",
"Description[de]": "Entfernte Konsolenbefehle ausführen",
"Description[el]": "Απομακρυσμένη εκτέλεση εντολών του τερματικού",
"Description[es]": "Ejecute órdenes de consola remotamente",
"Description[et]": "Konsoolikäskude kaugkäivitamine",
"Description[fi]": "Suorita konsolikomentoja etänä",
@ -38,11 +41,14 @@
"Id": "kdeconnect_runcommand",
"License": "GPL",
"Name": "Run commands",
"Name[ar]": "شغّل أوامر",
"Name[ast]": "Executar comandos",
"Name[ca@valencia]": "Executa ordes",
"Name[ca]": "Executa ordres",
"Name[cs]": "Spustit příkazy",
"Name[da]": "Kør kommandoer",
"Name[de]": "Befehle ausführen",
"Name[el]": "Εκτέλεση εντολών",
"Name[es]": "Ejecutar órdenes",
"Name[et]": "Käskude käivitamine",
"Name[fi]": "Suorita komentoja",
@ -69,4 +75,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.runcommand.request"
]
}
}

View file

@ -6,16 +6,22 @@ X-KDE-Library=kdeconnect_runcommand_config
X-KDE-ParentComponents=kdeconnect_runcommand
Name=Run Command plugin settings
Name[ar]=إعدادات ملحقة تشغيل الأوامر
Name[ast]=Axustes del complementu d'executar comandos
Name[ca]=Ajustaments del connector Executa ordres
Name[ca@valencia]=Ajustaments del connector Executa ordes
Name[cs]=Nastavení modulu Spustit příkaz
Name[da]=Indstilling af kør kommando-plugin
Name[de]=Modul-Einstellungen für Befehlsausführung
Name[el]=Ρυθμίσεις προσθέτου εκτέλεσης εντολής
Name[en_GB]=Run Command plugin settings
Name[es]=Ejecutar preferencias del complemento Orden
Name[es]=Ajustes del complemento de ejecución de órdenes
Name[et]=Käsu käivitamise plugina seadistused
Name[fi]=Suorita komento -liitännäisen asetukset
Name[gl]=Configuración do complemento de orde de executar
Name[he]=הגדרת התוסף הרץ פקודה
Name[it]=Impostazioni estensione Esegui comando
Name[ko]=
Name[nl]=Plug-in-instellingen van commando Uitvoeren
Name[pl]=Ustawienia wtyczki wykonywania polecenia
Name[pt]=Configuração do 'plugin' de execução de comandos
@ -26,5 +32,6 @@ Name[sv]=Inställningar av insticksprogram för kör kommando
Name[tr]=Komut Çalıştır eklenti ayarları
Name[uk]=Параметри додатка запуску команд
Name[x-test]=xxRun Command plugin settingsxx
Name[zh_CN]=
Categories=Qt;KDE;X-KDE-settings-kdeconnect;

View file

@ -9,11 +9,14 @@
}
],
"Description": "Inhibit the screensaver when the device is connected",
"Description[ar]": "امنع حافظة الشّاشة إن كان الجهاز متّصلًا",
"Description[ast]": "Inhibe'l curiapantalles cuando ta coneutáu'l preséu",
"Description[ca@valencia]": "Inhibeix l'estalvi de pantalla quan es connecta el dispositiu",
"Description[ca]": "Inhibeix l'estalvi de pantalla quan es connecta el dispositiu",
"Description[cs]": "Potlačit spořič pokud je zařízení připojeno",
"Description[da]": "Forhindr pauseskærm når enheden er forbundet",
"Description[de]": "Bildschirmschoner unterbinden wenn ein Gerät angeschlossen ist",
"Description[el]": "Απαγόρευση προστασίας οθόνης όταν η συσκευή είναι σε σύνδεση",
"Description[es]": "Inhibir el salvapantallas cuando el dispositivo está conectado",
"Description[et]": "Ekraanisäästja keelamine, kui seade on ühendatud",
"Description[fi]": "Estä näytönsäästäjän käynnistyminen, kun laite on yhteydessä",
@ -38,11 +41,14 @@
"Id": "kdeconnect_screensaver_inhibit",
"License": "GPL",
"Name": "Inhibit screensaver",
"Name[ar]": "امنع حافظة الشّاشة",
"Name[ast]": "Inhibir curiapantalles",
"Name[ca@valencia]": "Inhibeix l'estalvi de pantalla",
"Name[ca]": "Inhibeix l'estalvi de pantalla",
"Name[cs]": "Potlačit spořič obrazovky",
"Name[da]": "Forhindr pauseskærm",
"Name[de]": "Bildschirmschoner unterbinden",
"Name[el]": "Απαγόρευση προστασίας οθόνης",
"Name[es]": "Inhibir salvapantallas",
"Name[et]": "Ekraanisäästja keelamine",
"Name[fi]": "Estä näytönsäästäjän käynnistyminen",
@ -68,4 +74,4 @@
"Version": "0.1",
"Website": "http://albertvaka.wordpress.com"
}
}
}

View file

@ -5,17 +5,17 @@
{
"Email": "holger.k@elberer.de",
"Name": "Holger Kaelberer",
"Name[da]": "Holger Freyther",
"Name[it]": "Holger Freyther",
"Name[x-test]": "xxHolger Kaelbererxx"
}
],
"Description": "Broadcast this computer's notifications, so they can be shown on other devices.",
"Description[ar]": "بُثّ إخطارات هذا الحاسوب، لتظهر على الأجهزة الأخرى.",
"Description[ast]": "Tresmite los avisos d'esti ordenador, pa qu'asina puean amosase n'otros preseos.",
"Description[ca@valencia]": "Transmet les notificacions d'este ordinador, perquè puguen mostrar-se en altres dispositius.",
"Description[ca]": "Transmet les notificacions d'aquest ordinador, perquè puguin mostrar-se en altres dispositius.",
"Description[cs]": "Posílat upozornění tohoto počítače, takže mohou být zobrazena na jiných zařízeních.",
"Description[da]": "Udsend denne computers bekendtgørelser, så de kan vises på andre enheder.",
"Description[de]": "Die Benachrichtigungen dieses Rechners aussenden, sodass sie auf anderen Geräten angezeigt werden können.",
"Description[el]": "Μεταδώστε την ειδοποίηση αυτού του υπολογιστή, ώστε να εμφανιστεί σε άλλες συσκευές.",
"Description[es]": "Difundir las notificaciones de este equipo, para que puedan mostrarse en otros dispositivos.",
"Description[et]": "Arvuti märguannete levitamine, et neid oleks näha ka teistes seadmetes",
"Description[it]": "Trasmetti le notifiche di questo computer, affinché possano essere mostrate su altri dispositivi.",
@ -31,13 +31,17 @@
"Id": "kdeconnect_sendnotifications",
"License": "GPL",
"Name": "Send notifications",
"Name[ar]": "أرسل إخطارات",
"Name[ast]": "Unviu d'avisos",
"Name[ca@valencia]": "Envia les notificacions",
"Name[ca]": "Envia les notificacions",
"Name[cs]": "Poslat oznámení",
"Name[da]": "Send bekendtgørelser",
"Name[de]": "Benachrichtigungen senden",
"Name[el]": "Αποστολή ειδοποιήσεων",
"Name[es]": "Enviar notificaciones",
"Name[et]": "Märguannete saatmine",
"Name[gl]": "Enviar notificacións",
"Name[it]": "Invia notifiche",
"Name[nl]": "Stuur meldingen",
"Name[pl]": "Wysyłaj powiadomienia",
@ -59,4 +63,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.notification.request"
]
}
}

View file

@ -6,17 +6,22 @@ X-KDE-Library=kdeconnect_sendnotifications_config
X-KDE-ParentComponents=kdeconnect_sendnotifications
Name=Notification synchronization plugin settings
Name[ar]=إعدادات ملحقة مزامنة الإخطارات
Name[ast]=Axustes del complementu de sincronización d'avisos
Name[ca]=Ajustament del connector Sincronitza les notificacions
Name[ca@valencia]=Ajustament del connector Sincronitza les notificacions
Name[cs]=Nastavení modulu synchronizace upozornění
Name[da]=Indstilling af plugin til synkronisering af bekendtgørelser
Name[de]=Einstellungen für Benachrichtigungsabgleich-Modul
Name[el]=Ρυθμίσεις πρόσθετου συγχρονισμού ειδοποιήσεων
Name[en_GB]=Notification synchronisation plugin settings
Name[es]=Preferencias del complemento de sincronización de notificaciones
Name[et]=Märguande sünkroonimise plugina seaditused
Name[fi]=Ilmoitusten synkronointiliitännäisen asetukset
Name[gl]=Configuración do complemento de sincronización de notificacións
Name[he]=הגדרת התוסף סנכרון התראות
Name[it]=Impostazioni dell'estensione di sincronizzazione delle notifiche
Name[nl]=Instellingen voor meldingen van synchronisatie plug-in
Name[nl]=Instellingen van plug-in voor synchronisatie van meldingen
Name[pl]=Ustawienia wtyczki synchronizującej powiadomienia
Name[pt]=Configuração do 'plugin' de sincronização das notificações
Name[pt_BR]=Configuração do plugin de sincronização das notificações

View file

@ -20,9 +20,11 @@
#include <QtDBus/QDBusConnection>
#include <QtDBus/QDBusInterface>
#include <QtDBus/QDBusArgument>
#include <QtDebug>
#include <QLoggingCategory>
#include <QStandardPaths>
#include <QImage>
#include <KConfig>
#include <KConfigGroup>
@ -104,6 +106,79 @@ void NotificationsListener::loadApplications()
//qCDebug(KDECONNECT_PLUGIN_SENDNOTIFICATION) << "Loaded" << applications.size() << " applications";
}
bool NotificationsListener::parseImageDataArgument(const QVariant& argument,
int& width, int& height,
int& rowStride, int& bitsPerSample,
int& channels, bool& hasAlpha,
QByteArray& imageData) const
{
if (!argument.canConvert<QDBusArgument>())
return false;
const QDBusArgument dbusArg = argument.value<QDBusArgument>();
dbusArg.beginStructure();
dbusArg >> width >> height >> rowStride >> hasAlpha >> bitsPerSample
>> channels >> imageData;
dbusArg.endStructure();
return true;
}
QSharedPointer<QIODevice> NotificationsListener::iconForImageData(const QVariant& argument) const
{
int width, height, rowStride, bitsPerSample, channels;
bool hasAlpha;
QByteArray imageData;
if (!parseImageDataArgument(argument, width, height, rowStride, bitsPerSample,
channels, hasAlpha, imageData))
return QSharedPointer<QIODevice>();
if (bitsPerSample != 8) {
qCWarning(KDECONNECT_PLUGIN_SENDNOTIFICATION) << "Unsupported image format:"
<< "width=" << width
<< "height=" << height
<< "rowStride=" << rowStride
<< "bitsPerSample=" << bitsPerSample
<< "channels=" << channels
<< "hasAlpha=" << hasAlpha;
return QSharedPointer<QIODevice>();
}
QImage image(reinterpret_cast<uchar*>(imageData.data()), width, height, rowStride,
hasAlpha ? QImage::Format_ARGB32 : QImage::Format_RGB32);
if (hasAlpha)
image = image.rgbSwapped(); // RGBA --> ARGB
QSharedPointer<QBuffer> buffer = QSharedPointer<QBuffer>(new QBuffer);
if (!buffer || !buffer->open(QIODevice::WriteOnly) ||
!image.save(buffer.data(), "PNG")) {
qCWarning(KDECONNECT_PLUGIN_SENDNOTIFICATION) << "Could not initialize image buffer";
return QSharedPointer<QIODevice>();
}
return buffer;
}
QSharedPointer<QIODevice> NotificationsListener::iconForIconName(const QString &iconName) const
{
int size = KIconLoader::SizeEnormous; // use big size to allow for good
// quality on high-DPI mobile devices
QString iconPath = KIconLoader::global()->iconPath(iconName, -size, true);
if (!iconPath.isEmpty()) {
if (!iconPath.endsWith(QLatin1String(".png")) &&
KIconLoader::global()->theme()->name() != QLatin1String("hicolor")) {
// try falling back to hicolor theme:
KIconTheme hicolor(QStringLiteral("hicolor"));
if (hicolor.isValid()) {
iconPath = hicolor.iconPath(iconName + ".png", size, KIconLoader::MatchBest);
//qCDebug(KDECONNECT_PLUGIN_SENDNOTIFICATION) << "Found non-png icon in default theme trying fallback to hicolor:" << iconPath;
}
}
}
if (iconPath.endsWith(QLatin1String(".png")))
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,
@ -171,26 +246,26 @@ uint NotificationsListener::Notify(const QString &appName, uint replacesId,
// timeout == 0, for other notifications
// clearability is pointless
if (!appIcon.isEmpty() && mPlugin->config()->get("generalSynchronizeIcons", true)) {
int size = KIconLoader::SizeEnormous; // use big size to allow for good
// quality on High-DPI mobile devices
QString iconPath = KIconLoader::global()->iconPath(appIcon, -size, true);
if (!iconPath.isEmpty()) {
if (!iconPath.endsWith(QLatin1String(".png")) &&
KIconLoader::global()->theme()->name() != QLatin1String("hicolor")) {
// try falling back to hicolor theme:
KIconTheme hicolor(QStringLiteral("hicolor"));
if (hicolor.isValid()) {
iconPath = hicolor.iconPath(appIcon + ".png", size, KIconLoader::MatchBest);
//qCDebug(KDECONNECT_PLUGIN_SENDNOTIFICATION) << "Found non-png icon in default theme trying fallback to hicolor:" << iconPath;
}
}
if (iconPath.endsWith(QLatin1String(".png"))) {
//qCDebug(KDECONNECT_PLUGIN_SENDNOTIFICATION) << "Appending icon " << iconPath;
QSharedPointer<QIODevice> iconFile(new QFile(iconPath));
np.setPayload(iconFile, iconFile->size());
}
}
// sync any icon data?
if (mPlugin->config()->get("generalSynchronizeIcons", true)) {
QSharedPointer<QIODevice> iconSource;
// try different image sources according to priorities in notifications-
// spec version 1.2:
if (hints.contains("image-data"))
iconSource = iconForImageData(hints["image-data"]);
else if (hints.contains("image_data")) // 1.1 backward compatibility
iconSource = iconForImageData(hints["image_data"]);
else if (hints.contains("image-path"))
iconSource = iconForIconName(hints["image-path"].toString());
else if (hints.contains("image_path")) // 1.1 backward compatibility
iconSource = iconForIconName(hints["image_path"].toString());
else if (!appIcon.isEmpty())
iconSource = iconForIconName(appIcon);
else if (hints.contains("icon_data")) // < 1.1 backward compatibility
iconSource = iconForImageData(hints["icon_data"]);
if (iconSource)
np.setPayload(iconSource, iconSource->size());
}
mPlugin->sendPackage(np);

View file

@ -19,7 +19,10 @@
*/
#include <QtDBus/QDBusAbstractAdaptor>
#include <QtDBus/QDBusArgument>
#include <core/device.h>
#include <QBuffer>
#include <QFile>
class KdeConnectPlugin;
class Notification;
@ -38,6 +41,15 @@ protected:
KdeConnectPlugin* mPlugin;
QHash<QString, NotifyingApplication> applications;
// virtual helper function to make testing possible (QDBusArgument can not
// be injected without making a DBUS-call):
virtual bool parseImageDataArgument(const QVariant& argument, int& width,
int& height, int& rowStride, int& bitsPerSample,
int& channels, bool& hasAlpha,
QByteArray& imageData) const;
QSharedPointer<QIODevice> iconForImageData(const QVariant& argument) const;
QSharedPointer<QIODevice> iconForIconName(const QString& iconName) const;
public Q_SLOTS:
Q_SCRIPTABLE uint Notify(const QString&, uint, const QString&,
const QString&, const QString&,

View file

@ -10,11 +10,14 @@
}
],
"Description": "Browse the remote device filesystem using SFTP",
"Description[ar]": "تصفّح نظام ملفّات الجهاز البعيد باستخدام SFTP",
"Description[ast]": "Restola'l sistema de ficheros del preséu remotu usando SFTP",
"Description[ca@valencia]": "Navega pel sistema de fitxers del dispositiu remot emprant SFTP",
"Description[ca]": "Navega pel sistema de fitxers del dispositiu remot emprant SFTP",
"Description[cs]": "Prohlížejte souborový systém zařízení pomocí SFTP",
"Description[da]": "Gennemse filsystemet på eksterne enheder med SFTP",
"Description[da]": "Gennemse filsystemet på eksterne enheder med SFTP",
"Description[de]": "Browsen im Dateisystem des entfernten Geräts mit SFTP",
"Description[el]": "Περιήγηση του απομακρυσμένου συστήματος αρχείων με χρήση SFTP",
"Description[es]": "Navegar por el sistema de archivos del dispositivo remoto usando SFTP",
"Description[et]": "Oma seadme failisüsteemi sirvimine SFTP vahendusel",
"Description[fi]": "Selaa etälaitteiden tiedostojärjestelmiä SFTP:llä",
@ -29,7 +32,7 @@
"Description[pt_BR]": "Navegue pelo sistema de arquivos do dispositivo usando SFTP",
"Description[ru]": "Просмотр файловой системы удалённого устройства с помощью SFTP",
"Description[sk]": "Prehliadať súborový systém vzdialeného zariadenia pomocou SFTP",
"Description[sv]": "Bläddra i fjärrenhetens filsystem med SFTP",
"Description[sv]": "Bläddra i den andra apparatens filsystem med SFTP",
"Description[tr]": "Uzak aygıt dosya sistemine SFTP kullanarak göz atın",
"Description[uk]": "Перегляд файлових систем на сторонніх пристроях за допомогою SFTP",
"Description[x-test]": "xxBrowse the remote device filesystem using SFTPxx",
@ -39,11 +42,14 @@
"Id": "kdeconnect_sftp",
"License": "GPL",
"Name": "Remote filesystem browser",
"Name[ar]": "متصفّح نظام الملفّات البعيد",
"Name[ast]": "Restolador de sistema de ficheros remotu",
"Name[ca@valencia]": "Navegador del sistema de fitxers remot",
"Name[ca]": "Navegador del sistema de fitxers remot",
"Name[cs]": "Vzdálený prohlížeč souborového systému",
"Name[da]": "Filbrowser til eksternt filsystem",
"Name[de]": "Datei-Browser für entferne Systeme",
"Name[el]": "Περιηγητής απομακρυσμένου συστήματος αρχείων",
"Name[es]": "Navegador de sistema de archivos remoto",
"Name[et]": "Kaug-failisüsteemi sirvija",
"Name[fi]": "Etätiedostojärjestelmäselain",
@ -75,4 +81,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.sftp"
]
}
}

View file

@ -9,11 +9,14 @@
}
],
"Description": "Receive and send files, URLs or plain text easily",
"Description[ar]": "استقبل الملفّات أو العناوين أو النّصوص الصّرفة وأرسلها بسهولة",
"Description[ast]": "Recibi y unvia ficheros, URLs o testu planu cenciellamente",
"Description[ca@valencia]": "Rep i envia fitxers, URL o text pla amb facilitat",
"Description[ca]": "Rep i envia fitxers, URL o text pla amb facilitat",
"Description[cs]": "Snadno přijímejte a posílejte soubory, URL nebo čistý text",
"Description[da]": "Modtag og send nemt filer, URL'er eller klartekst",
"Description[de]": "Empfang und Senden von Dateien, URLs oder einfachem Text",
"Description[el]": "Εύκολη λήψη και αποστολή αρχείων, URL ή απλού κειμένου",
"Description[es]": "Recibir y enviar archivos, URL o texto sin formato fácilmente",
"Description[et]": "Failide, URL-ide või lihtteksti hõlpus vastuvõtmine ja saatmine",
"Description[fi]": "Vastaanota ja lähetä tiedostoja, verkko-osoitteita tai tekstiä helposti",
@ -38,11 +41,14 @@
"Id": "kdeconnect_share",
"License": "GPL",
"Name": "Share and receive",
"Name[ar]": "شارك واستقبل",
"Name[ast]": "Compartir y recibir",
"Name[ca@valencia]": "Comparteix i rep",
"Name[ca]": "Comparteix i rep",
"Name[cs]": "Sdílet a přijímat",
"Name[da]": "Del og modtag",
"Name[de]": "Senden und Empfangen",
"Name[el]": "Διαμοιρασμός και λήψη",
"Name[es]": "Compartir y recibir",
"Name[et]": "Jagamine ja vastuvõtmine",
"Name[fi]": "Jaa ja vastaanota",
@ -74,4 +80,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.share.request"
]
}
}

View file

@ -6,6 +6,8 @@ X-KDE-Library=kdeconnect_share_config
X-KDE-ParentComponents=kdeconnect_share
Name=Share plugin settings
Name[ar]=إعدادات ملحقة المشاركة
Name[ast]=Axustes del complementu de compartir
Name[bg]=Настройки на приставката за споделяне
Name[bs]=Podijeli postavke dodatka
Name[ca]=Ajustaments del connector Compartició
@ -13,12 +15,14 @@ Name[ca@valencia]=Ajustaments del connector Compartició
Name[cs]=Nastavení modulu sdílení
Name[da]=Indstilling af deling-plugin
Name[de]=Modul-Einstellungen für Veröffentlichung
Name[el]=Ρυθμίσεις προσθέτου κοινής χρήσης
Name[en_GB]=Share plugin settings
Name[es]=Ajustes del complemento para compartir
Name[et]=Jagamisplugina seadistused
Name[fi]=Jakoliitännäisen asetukset
Name[fr]=Paramètres du module de partage
Name[gl]=Configuración do complemento de compartir
Name[he]=שתף את הגדרות התוספים
Name[hu]=Megosztás bővítmény beállításai
Name[it]=Impostazioni estensione Condivisione
Name[ko]=

View file

@ -24,11 +24,14 @@
"Id": "kdeconnect_telephony",
"License": "GPL",
"Name": "Telephony integration",
"Name[ar]": "تكامل الهاتف",
"Name[ast]": "Integración telefónica",
"Name[ca@valencia]": "Integració amb la telefonia",
"Name[ca]": "Integració amb la telefonia",
"Name[cs]": "Integrace telefonu",
"Name[da]": "Telefoniintegration",
"Name[de]": "Telefon-Integration",
"Name[el]": "Ενσωμάτωση τηλεφωνίας",
"Name[es]": "Integración con el teléfono",
"Name[et]": "Telefoniga lõimimine",
"Name[fi]": "Puhelinintegrointi",
@ -61,4 +64,4 @@
"X-KdeConnect-SupportedPackageType": [
"kdeconnect.telephony"
]
}
}

View file

@ -22,8 +22,10 @@
#include <QApplication>
#include <QNetworkAccessManager>
#include <QTest>
#include <QTemporaryFile>
#include <QBuffer>
#include <QStandardPaths>
#include <QImage>
#include <QColor>
#include <kiconloader.h>
@ -85,17 +87,23 @@ public:
return sentPackages;
}
const NetworkPackage* getLastPackage() const
NetworkPackage* getLastPackage()
{
return lastPackage;
}
void deleteLastPackage()
{
delete lastPackage;
lastPackage = nullptr;
}
public Q_SLOTS:
bool sendPackage(NetworkPackage& np) override
{
++sentPackages;
// copy package manually to allow for inspection (can't use copy-constructor)
delete lastPackage;
deleteLastPackage();
lastPackage = new NetworkPackage(np.type());
Q_ASSERT(lastPackage);
for (QVariantMap::ConstIterator iter = np.body().constBegin();
@ -128,6 +136,22 @@ public:
applications = value;
}
protected:
bool parseImageDataArgument(const QVariant& argument, int& width,
int& height, int& rowStride, int& bitsPerSample,
int& channels, bool& hasAlpha,
QByteArray& imageData) const override
{
width = argument.toMap().value("width").toInt();
height = argument.toMap().value("height").toInt();
rowStride = argument.toMap().value("rowStride").toInt();
bitsPerSample = argument.toMap().value("bitsPerSample").toInt();
channels = argument.toMap().value("channels").toInt();
hasAlpha = argument.toMap().value("hasAlpha").toBool();
imageData = argument.toMap().value("imageData").toByteArray();
return true;
}
};
class TestNotificationListener : public QObject
@ -327,24 +351,37 @@ void TestNotificationListener::testNotify()
QCOMPARE(++proxiedNotifications, d->getSentPackages());
// icon synchronization:
QStringList iconPaths;
// appIcon
int count = 0;
Q_FOREACH (const auto& iconName, KIconLoader::global()->queryIcons(-KIconLoader::SizeEnormous, KIconLoader::Application)) {
if (!iconName.endsWith(".png"))
continue;
if (count++ > 3) // max 3 iterations
break;
iconPaths.append(iconName); // memorize some paths for later
// existing icons are sync-ed if requested
plugin->config()->set("generalSynchronizeIcons", true);
QFileInfo fi(iconName);
//qDebug() << "XXX" << iconName << fi.baseName() << fi.size();
retId = listener->Notify(appName, replacesId, fi.baseName(), summary, body, {}, {{}}, 0);
QCOMPARE(retId, replacesId);
QCOMPARE(++proxiedNotifications, d->getSentPackages());
QVERIFY(d->getLastPackage()->hasPayload());
QCOMPARE(d->getLastPackage()->payloadSize(), fi.size());
// works also with abolute paths
retId = listener->Notify(appName, replacesId, iconName, summary, body, {}, {{}}, 0);
QCOMPARE(retId, replacesId);
QCOMPARE(++proxiedNotifications, d->getSentPackages());
QVERIFY(d->getLastPackage()->hasPayload());
QCOMPARE(d->getLastPackage()->payloadSize(), fi.size());
// extensions other than png are not accepted:
retId = listener->Notify(appName, replacesId, iconName + ".svg", summary, body, {}, {{}}, 0);
QCOMPARE(retId, replacesId);
QCOMPARE(++proxiedNotifications, d->getSentPackages());
QVERIFY(!d->getLastPackage()->hasPayload());
// otherwise no payload:
// if sync not requested no payload:
plugin->config()->set("generalSynchronizeIcons", false);
retId = listener->Notify(appName, replacesId, fi.baseName(), summary, body, {}, {{}}, 0);
QCOMPARE(retId, replacesId);
@ -352,6 +389,111 @@ void TestNotificationListener::testNotify()
QVERIFY(!d->getLastPackage()->hasPayload());
QCOMPARE(d->getLastPackage()->payloadSize(), 0);
}
plugin->config()->set("generalSynchronizeIcons", true);
// image-path in hints
if (iconPaths.size() > 0) {
retId = listener->Notify(appName, replacesId, iconPaths.size() > 1 ? iconPaths[1] : icon, summary, body, {}, {{"image-path", iconPaths[0]}}, 0);
QCOMPARE(retId, replacesId);
QCOMPARE(++proxiedNotifications, d->getSentPackages());
QVERIFY(d->getLastPackage()->hasPayload());
QFileInfo hintsFi(iconPaths[0]);
// image-path has priority over appIcon parameter:
QCOMPARE(d->getLastPackage()->payloadSize(), hintsFi.size());
}
// image_path in hints
if (iconPaths.size() > 0) {
retId = listener->Notify(appName, replacesId, iconPaths.size() > 1 ? iconPaths[1] : icon, summary, body, {}, {{"image_path", iconPaths[0]}}, 0);
QCOMPARE(retId, replacesId);
QCOMPARE(++proxiedNotifications, d->getSentPackages());
QVERIFY(d->getLastPackage()->hasPayload());
QFileInfo hintsFi(iconPaths[0]);
// image_path has priority over appIcon parameter:
QCOMPARE(d->getLastPackage()->payloadSize(), hintsFi.size());
}
// image-data in hints
// set up:
QBuffer *buffer;
QImage image;
int width = 2, height = 2, rowStride = 4*width, bitsPerSample = 8,
channels = 4;
bool hasAlpha = 1;
char rawData[] = { 0x01, 0x02, 0x03, 0x04, // raw rgba data
0x11, 0x12, 0x13, 0x14,
0x21, 0x22, 0x23, 0x24,
0x31, 0x32, 0x33, 0x34 };
QByteArray byteData(rawData, rowStride*height);
QVariantMap imageData = {{"width", width}, {"height", height}, {"rowStride", rowStride},
{"bitsPerSample", bitsPerSample}, {"channels", channels},
{"hasAlpha", hasAlpha}, {"imageData", rawData}};
QVariantMap hints;
#define COMPARE_PIXEL(x, y) \
QCOMPARE(qRed(image.pixel(x,y)), (int)rawData[x*4 + y*rowStride + 0]); \
QCOMPARE(qGreen(image.pixel(x,y)), (int)rawData[x*4 + y*rowStride + 1]); \
QCOMPARE(qBlue(image.pixel(x,y)), (int)rawData[x*4 + y*rowStride + 2]); \
QCOMPARE(qAlpha(image.pixel(x,y)), (int)rawData[x*4 + y*rowStride + 3]);
hints.insert("image-data", imageData);
if (iconPaths.size() > 0)
hints.insert("image-path", iconPaths[0]);
retId = listener->Notify(appName, replacesId, icon, summary, body, {}, hints, 0);
QCOMPARE(retId, replacesId);
QCOMPARE(++proxiedNotifications, d->getSentPackages());
QVERIFY(d->getLastPackage()->hasPayload());
buffer = dynamic_cast<QBuffer*>(d->getLastPackage()->payload().data());
QCOMPARE(d->getLastPackage()->payloadSize(), buffer->size());
// image-data is attached as png data
QVERIFY(image.loadFromData(reinterpret_cast<const uchar*>(buffer->data().constData()), buffer->size(), "PNG"));
// image-data has priority over image-path:
QCOMPARE(image.byteCount(), rowStride*height);
// rgba -> argb conversion was done correctly:
COMPARE_PIXEL(0,0);
COMPARE_PIXEL(1,0);
COMPARE_PIXEL(0,1);
COMPARE_PIXEL(1,1);
// same for image_data in hints
hints.clear();
hints.insert("image-data", imageData);
if (iconPaths.size() > 0)
hints.insert("image_path", iconPaths[0]);
retId = listener->Notify(appName, replacesId, icon, summary, body, {}, hints, 0);
QCOMPARE(retId, replacesId);
QCOMPARE(++proxiedNotifications, d->getSentPackages());
QVERIFY(d->getLastPackage()->hasPayload());
buffer = dynamic_cast<QBuffer*>(d->getLastPackage()->payload().data());
QCOMPARE(d->getLastPackage()->payloadSize(), buffer->size());
// image-data is attached as png data
QVERIFY(image.loadFromData(reinterpret_cast<const uchar*>(buffer->data().constData()), buffer->size(), "PNG"));
// image_data has priority over image_path/image-path:
QCOMPARE(image.byteCount(), rowStride*height);
// rgba -> argb conversion was done correctly:
COMPARE_PIXEL(0,0);
COMPARE_PIXEL(1,0);
COMPARE_PIXEL(0,1);
COMPARE_PIXEL(1,1);
// same for icon_data, which has lowest priority
hints.clear();
hints.insert("icon_data", imageData);
retId = listener->Notify(appName, replacesId, "", summary, body, {}, hints, 0);
QCOMPARE(retId, replacesId);
QCOMPARE(++proxiedNotifications, d->getSentPackages());
QVERIFY(d->getLastPackage());
QVERIFY(d->getLastPackage()->hasPayload());
buffer = dynamic_cast<QBuffer*>(d->getLastPackage()->payload().data());
// image-data is attached as png data
QVERIFY(image.loadFromData(reinterpret_cast<const uchar*>(buffer->data().constData()), buffer->size(), "PNG"));
QCOMPARE(image.byteCount(), rowStride*height);
// rgba -> argb conversion was done correctly:
COMPARE_PIXEL(0,0);
COMPARE_PIXEL(1,0);
COMPARE_PIXEL(0,1);
COMPARE_PIXEL(1,1);
#undef COMPARE_PIXEL
}