summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorTomasz Sterna <tomek@xiaoka.com>2014-06-21 22:23:07 +0200
committerTomasz Sterna <tomek@xiaoka.com>2014-06-21 22:23:07 +0200
commit1f0cde7cfd31c180eaceeab4ee0ad24613eaf34c (patch)
tree7b78f4bb6ecbe04ae165cb00a47989e7ad81e387 /app
parent1c908650c9086f9b1714da14acdcb18f85e3d4fb (diff)
Restructured for lib and daemon
Diffstat (limited to 'app')
-rw-r--r--app/app.pro16
-rw-r--r--app/qml/cover/CoverPage.qml47
-rw-r--r--app/qml/pages/WatchPage.qml282
-rw-r--r--app/qml/waterwatch.qml42
-rw-r--r--app/waterwatch.cpp46
-rw-r--r--app/waterwatch.desktop7
-rw-r--r--app/waterwatch.pngbin0 -> 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
new file mode 100644
index 0000000..f4aaeeb
--- /dev/null
+++ b/app/waterwatch.png
Binary files differ