diff options
| author | Tomasz Sterna <tomek@xiaoka.com> | 2014-06-21 22:23:07 +0200 |
|---|---|---|
| committer | Tomasz Sterna <tomek@xiaoka.com> | 2014-06-21 22:23:07 +0200 |
| commit | 1f0cde7cfd31c180eaceeab4ee0ad24613eaf34c (patch) | |
| tree | 7b78f4bb6ecbe04ae165cb00a47989e7ad81e387 /app | |
| parent | 1c908650c9086f9b1714da14acdcb18f85e3d4fb (diff) | |
Restructured for lib and daemon
Diffstat (limited to 'app')
| -rw-r--r-- | app/app.pro | 16 | ||||
| -rw-r--r-- | app/qml/cover/CoverPage.qml | 47 | ||||
| -rw-r--r-- | app/qml/pages/WatchPage.qml | 282 | ||||
| -rw-r--r-- | app/qml/waterwatch.qml | 42 | ||||
| -rw-r--r-- | app/waterwatch.cpp | 46 | ||||
| -rw-r--r-- | app/waterwatch.desktop | 7 | ||||
| -rw-r--r-- | app/waterwatch.png | bin | 0 -> 1725 bytes |
7 files changed, 440 insertions, 0 deletions
diff --git a/app/app.pro b/app/app.pro new file mode 100644 index 0000000..c7e6928 --- /dev/null +++ b/app/app.pro @@ -0,0 +1,16 @@ +TARGET = waterwatch + +CONFIG += sailfishapp + +SOURCES += waterwatch.cpp + +INCLUDEPATH += ../lib +LIBS += -L$$OUT_PWD/../lib -lpebble + +QT += bluetooth +QMAKE_CXXFLAGS += -std=c++0x + +OTHER_FILES += qml/waterwatch.qml \ + qml/cover/CoverPage.qml \ + waterwatch.desktop \ + qml/pages/WatchPage.qml diff --git a/app/qml/cover/CoverPage.qml b/app/qml/cover/CoverPage.qml new file mode 100644 index 0000000..aaa33c6 --- /dev/null +++ b/app/qml/cover/CoverPage.qml @@ -0,0 +1,47 @@ +/* + Copyright (C) 2014 Jouni Roivas + Copyright (C) 2013 Jolla Ltd. + Contact: Thomas Perl <thomas.perl@jollamobile.com> + All rights reserved. + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the authors nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +import QtQuick 2.0 +import Sailfish.Silica 1.0 + +CoverBackground { + Label { + id: label + anchors.centerIn: parent + text: "WaterWatch" + } + Label { + anchors.top: label.bottom + anchors.horizontalCenter: parent.horizontalCenter + text: watchPage.watchConnector.name + font.pointSize: Theme.fontSizeSmall + } +} diff --git a/app/qml/pages/WatchPage.qml b/app/qml/pages/WatchPage.qml new file mode 100644 index 0000000..623c47e --- /dev/null +++ b/app/qml/pages/WatchPage.qml @@ -0,0 +1,282 @@ +/* + Copyright (C) 2014 Jouni Roivas + Copyright (C) 2013 Jolla Ltd. + Contact: Thomas Perl <thomas.perl@jollamobile.com> + All rights reserved. + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the authors nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +import QtQuick 2.0 +import QtQml 2.1 +import Sailfish.Silica 1.0 +import QtBluetooth 5.0 +import Sailfish.Bluetooth 1.0 +import Bluetooth 0.0 +import org.nemomobile.voicecall 1.0 +import org.nemomobile.notifications 1.0 +import org.nemomobile.messages.internal 1.0 +import org.nemomobile.commhistory 1.0 +import watch 0.1 + +Page { + id: page + property alias watchConnector: watchConnector + WatchConnector { + id: watchConnector + + onHangup: { + // Watch instantiated hangup, follow the orders + manager.hangupAll(); + } + } + property var callerDetails: new Object + + // This actually handles the voice call in SailfisOS + VoiceCallManager { + id:manager + + function hangupAll() { + for (var index = 0; index < voiceCalls.count; index++) { + voiceCalls.instance(index).hangup(); + } + } + + onError: { + console.log("Error: "+message) + watchConnector.endPhoneCall(); + } + + function updateState() { + //This needs cleaning up... + var statusPriority = [ + VoiceCall.STATUS_ALERTING, + VoiceCall.STATUS_DIALING, + VoiceCall.STATUS_DISCONNECTED, + VoiceCall.STATUS_ACTIVE, + VoiceCall.STATUS_HELD, + VoiceCall.STATUS_NULL + ] + + var newPrimaryCall = null + for (var p = 0; p < statusPriority.length; p++) { + for (var i = 0; i < voiceCalls.count; i++) { + if (voiceCalls.instance(i).status === statusPriority[p]) { + newPrimaryCall = voiceCalls.instance(i) + break + } + } + if (newPrimaryCall) { + break + } + } + var person = ""; + if (newPrimaryCall && callerDetails[newPrimaryCall.handlerId]) { + person = callerDetails[newPrimaryCall.handlerId].person + } + + for (var ic = 0; ic < voiceCalls.count; ic++) { + var call = voiceCalls.instance(ic) + console.log("call: " + call.lineId + " state: " + call.statusText + " " + call.status + " " + call.handlerId + "\n") + if (call.status === VoiceCall.STATUS_ALERTING || call.status === VoiceCall.STATUS_DIALING) { + console.log("Tell outgoing: " + call.lineId); + //FIXME: Not working? + watchConnector.ring(call.lineId, person, 0); + } else if (call.status === VoiceCall.STATUS_INCOMING || call.status === VoiceCall.STATUS_WAITING) { + console.log("Tell incoming: " + call.lineId); + watchConnector.ring(call.lineId, person); + } else if (call.status === VoiceCall.STATUS_DISCONNECTED || call.status === VoiceCall.STATUS_NULL) { + console.log("Endphone"); + watchConnector.endPhoneCall(); + } else if (call.status === VoiceCall.ACTIVE) { + console.log("Startphone"); + watchConnector.startPhoneCall(); + } + } + } + } + Timer { + id: updateStateTimer + interval: 50 + onTriggered: manager.updateState() + } + + // Receive the calls + Instantiator { + id: callMonitor + model: manager.voiceCalls + + delegate: QtObject { + property string callStatus: instance.status + property string remoteUid + property string person: "" + onCallStatusChanged: { + console.log("Status changed: " + callStatus); + if (callStatus === VoiceCall.STATUS_DISCONNECTED || callStatus === VoiceCall.STATUS_NULL) { + watchConnector.endPhoneCall(); + manager.updateState(); + } else { + updateStateTimer.start(); + } + } + Component.onCompleted: { + remoteUid = instance.lineId + person = remoteUid !== "" ? people.personByPhoneNumber(remoteUid) : "" + manager.updateState() + } + } + onObjectAdded: { + callerDetails[object.handlerId] = object + } + onObjectRemoved: { + delete callerDetails[object.handlerId] + manager.updateState() + } + } + + // Handle SMS (and other messages) via groups + CommGroupManager { + id: groupManager + useBackgroundThread: true + } + CommContactGroupModel { + id: groupModel + manager: groupManager + + property var unreadGroups: [ ] + + onContactGroupCreated: { + if (group.unreadMessages > 0) { + unreadGroups.push(group) + unreadSignalTimer.start() + } + } + + onContactGroupChanged: { + var index = unreadGroups.indexOf(group) + if (group.unreadMessages > 0 && index < 0) { + unreadGroups.push(group) + unreadSignalTimer.start() + } else if (group.unreadMessages === 0 && index >= 0) { + unreadGroups.splice(index, 1) + unreadSignalTimer.start() + } + } + + onContactGroupRemoved: { + var index = unreadGroups.indexOf(group) + if (index >= 0) { + unreadGroups.splice(index, 1) + unreadSignalTimer.start() + } + } + + onUnreadGroupsChanged: { + var group = groupModel.unreadGroups[0]; + if (group != undefined) { + var name = group.contactNames.length ? group.contactNames[0] : group.groups[0].remoteUids[0]; + console.log("Msg: " + group.lastMessageText); + console.log("From: " + name); + watchConnector.sendSMSNotification(name?name:"Unknown", group.lastMessageText) + } + } + } + Timer { + id: unreadSignalTimer + interval: 1 + onTriggered: groupModel.unreadGroupsChanged() + } + + + SilicaFlickable { + anchors.fill: parent + + contentHeight: column.height + + Column { + id: column + + width: page.width + spacing: Theme.paddingLarge + PageHeader { + title: "WaterWatch" + } + Label { + visible: !watchConnector.isConnected + text: "Waiting for watch...\nIf it can't be found plase\ncheck it's available and\npaired in Bluetooth settings." + width: column.width + } + // Select the device + Repeater { + model: KnownDevicesModel { id: knownDevicesModel } + delegate: ListItem { + id: pairedItem + visible: (model.paired && watchConnector.isConnected) + Label { + text: model.alias.length ? model.alias : model.address + } + onVisibleChanged: { + if (pairedItem.visible) { + // Connect with the device + watchConnector.deviceConnect(model.alias, model.address); + } + } + } + } + Button { + text: "Ping" + onClicked: { + watchConnector.ping(66) + } + } + Button { + text: "Send SMS" + onClicked: { + watchConnector.sendSMSNotification("Dummy", "Hello world!") + } + } + Button { + text: "Ring" + onClicked: { + watchConnector.ring("+1234567890", "Test user") + } + } + Button { + text: "Start call" + onClicked: { + watchConnector.startPhoneCall() + } + } + Button { + text: "End call" + onClicked: { + watchConnector.endPhoneCall() + } + } + } + } +} + + diff --git a/app/qml/waterwatch.qml b/app/qml/waterwatch.qml new file mode 100644 index 0000000..cf65076 --- /dev/null +++ b/app/qml/waterwatch.qml @@ -0,0 +1,42 @@ +/* + Copyright (C) 2014 Jouni Roivas + Copyright (C) 2013 Jolla Ltd. + Contact: Thomas Perl <thomas.perl@jollamobile.com> + All rights reserved. + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the authors nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +import QtQuick 2.0 +import Sailfish.Silica 1.0 +import "pages" + +ApplicationWindow +{ + initialPage: WatchPage { id: watchPage } + cover: Qt.resolvedUrl("cover/CoverPage.qml") +} + + diff --git a/app/waterwatch.cpp b/app/waterwatch.cpp new file mode 100644 index 0000000..46e6298 --- /dev/null +++ b/app/waterwatch.cpp @@ -0,0 +1,46 @@ +/* + Copyright (C) 2014 Jouni Roivas + Copyright (C) 2013 Jolla Ltd. + Contact: Thomas Perl <thomas.perl@jollamobile.com> + All rights reserved. + + You may use this file under the terms of BSD license as follows: + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the authors nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include <QtQuick> + +#include <sailfishapp.h> +#include "watchconnector.h" + +using namespace watch; + +int main(int argc, char *argv[]) +{ + // Registert WatchController object on QML side + qmlRegisterType<WatchConnector>("watch", 0, 1, "WatchConnector"); + + return SailfishApp::main(argc, argv); +} + diff --git a/app/waterwatch.desktop b/app/waterwatch.desktop new file mode 100644 index 0000000..4ddba76 --- /dev/null +++ b/app/waterwatch.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Type=Application +X-Nemo-Application-Type=silica-qt5 +Name=waterwatch +Icon=waterwatch +Exec=waterwatch + diff --git a/app/waterwatch.png b/app/waterwatch.png Binary files differnew file mode 100644 index 0000000..f4aaeeb --- /dev/null +++ b/app/waterwatch.png |
