From b3f9fcecdcf5f73ac902d76b95739b76e6bfcba1 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Wed, 10 Feb 2016 00:15:20 +0100 Subject: V3 firmware support improvements Proper timeline notifications for the v3 firmware. Added telegram, whatapp and hangouts notification types. Removed mitakuuluu. --- app/pebble.desktop | 2 +- app/pebblefirmware.cpp | 18 +- app/qml/pages/ManagerPage.qml | 622 ++++++++++++++++++++++-------------------- 3 files changed, 337 insertions(+), 305 deletions(-) (limited to 'app') diff --git a/app/pebble.desktop b/app/pebble.desktop index c7dd6c3..881941b 100644 --- a/app/pebble.desktop +++ b/app/pebble.desktop @@ -4,4 +4,4 @@ X-Nemo-Application-Type=silica-qt5 Name=Pebble Icon=pebble Exec=pebble %U -MimeType=application/zip; +MimeType=application/x-pebble-pkg; diff --git a/app/pebblefirmware.cpp b/app/pebblefirmware.cpp index 33460e5..e3bbc5a 100644 --- a/app/pebblefirmware.cpp +++ b/app/pebblefirmware.cpp @@ -16,16 +16,28 @@ PebbleFirmware::PebbleFirmware(QObject *parent) : void PebbleFirmware::updateLatest(QString hw) { QNetworkRequest req; - req.setUrl(firmwareURL.arg(hw).arg(hw.startsWith("snowy_") ? "release-v3" : "release-v2")); + req.setUrl(firmwareURL.arg(hw).arg("release-v3.8")); req.setRawHeader("Cache-Control", "no-cache"); qDebug() << "Getting latest firmware" << req.url(); nm->get(req); } -void PebbleFirmware::fetchFirmware(QString type) +void PebbleFirmware::fetchFirmware(QString currVer) { + QJsonObject targetFirmware; + if (_latest.contains("3.x-migration") && currVer < "v3.0.0") { + targetFirmware = _latest.value("3.x-migration").toObject(); + } else if (currVer >= "v3.0.0" && + _latest.value("normal").toObject().value("friendlyVersion").toString() > currVer){ + targetFirmware = _latest.value("normal").toObject(); + } + + if (targetFirmware.isEmpty()) { + qDebug() << "Watch firmware is up to date"; + return; + } QNetworkRequest req; - req.setUrl(_latest.value(type).toObject().value("url").toString()); + req.setUrl(targetFirmware.value("url").toString()); req.setRawHeader("Cache-Control", "no-cache"); qDebug() << "Fetching firmware" << req.url(); nm->get(req); diff --git a/app/qml/pages/ManagerPage.qml b/app/qml/pages/ManagerPage.qml index 8ff0db2..af5a6b2 100644 --- a/app/qml/pages/ManagerPage.qml +++ b/app/qml/pages/ManagerPage.qml @@ -1,301 +1,321 @@ -import QtQuick 2.0 -import QtQml 2.1 -import Sailfish.Silica 1.0 -import org.nemomobile.configuration 1.0 -import org.nemomobile.dbus 2.0 - -Page { - id: page - - ConfigurationGroup { - id: settings - path: "/org/pebbled/settings" - property string profileWhenConnected: "" - property string profileWhenDisconnected: "" - property bool transliterateMessage - property bool useSystemVolume - property bool incomingCallNotification - property bool notificationsCommhistoryd - property bool notificationsMissedCall - property bool notificationsEmails - property bool notificationsMitakuuluu - property bool notificationsTwitter - property bool notificationsFacebook - property bool notificationsOther - property bool notificationsAll - } - - DBusInterface { - id: profiled - - service: 'com.nokia.profiled' - iface: 'com.nokia.profiled' - path: '/com/nokia/profiled' - - property var profiles - } - - Component.onCompleted: { - profiled.typedCall('get_profiles', [], function (result) { - console.log('Got profiles: ' + result); - profiled.profiles = result; - }); - } - - - - SilicaFlickable { - id: flickable - anchors.fill: parent - contentHeight: column.height - - VerticalScrollDecorator { flickable: flickable } - - PullDownMenu { - MenuItem { - text: qsTr("Pebble Appstore") - onClicked: pageStack.push(Qt.resolvedUrl("AppStorePage.qml")) - } - MenuItem { - text: qsTr("About") - onClicked: pageStack.push(Qt.resolvedUrl("AboutPage.qml")) - } - } - - Column { - id: column - - width: page.width - spacing: Theme.paddingLarge - PageHeader { - title: qsTr("Pebble Manager") - } - - Label { - color: Theme.highlightColor - font.pixelSize: Theme.fontSizeSmall - visible: pebbled.active && !pebbled.connected - text: qsTr("Waiting for watch...\nIf it can't be found please check it's available and paired in Bluetooth settings.") - wrapMode: Text.Wrap - anchors { - left: parent.left - right: parent.right - margins: Theme.paddingLarge - } - - } - Button { - visible: pebbled.connected - text: pebbled.name - anchors { - left: parent.left - right: parent.right - margins: Theme.paddingLarge - } - onClicked: pageStack.push(Qt.resolvedUrl("WatchPage.qml")) - } - - Label { - text: qsTr("Service") - font.family: Theme.fontFamilyHeading - color: Theme.highlightColor - anchors.right: parent.right - anchors.rightMargin: Theme.paddingMedium - } - TextSwitch { - text: qsTr("Enabled") - description: pebbled.enabled ? qsTr("Automatic startup") : qsTr("Manual startup") - checked: pebbled.enabled - automaticCheck: false - onClicked: pebbled.setEnabled(!checked) - } - TextSwitch { - text: qsTr("Active") - description: pebbled.active ? qsTr("Running") : qsTr("Dead") - checked: pebbled.active - automaticCheck: false - onClicked: pebbled.setActive(!checked) - } - TextSwitch { - text: qsTr("Connection") - description: pebbled.connected ? qsTr("Connected"): qsTr("Disconnected") - checked: pebbled.connected - automaticCheck: false - onClicked: { - if (pebbled.connected) { - pebbled.disconnect(); - } else { - pebbled.reconnect(); - } - } - } - - Label { - text: qsTr("Settings") - font.family: Theme.fontFamilyHeading - color: Theme.highlightColor - anchors.right: parent.right - anchors.rightMargin: Theme.paddingMedium - } - TextSwitch { - text: qsTr("Forward phone calls") - checked: settings.incomingCallNotification - automaticCheck: false - onClicked: { - settings.incomingCallNotification = !settings.incomingCallNotification; - } - } - TextSwitch { - text: qsTr("Control main volume") - description: qsTr("Pebble music volume buttons change the main phone volume directly instead of through the music player") - checked: settings.useSystemVolume - automaticCheck: true - onClicked: { - settings.useSystemVolume = !settings.useSystemVolume; - } - } - TextSwitch { - text: qsTr("Transliterate messages") - description: qsTr("Messages are transliterated to ASCII before sending to Pebble") - checked: settings.transliterateMessage - automaticCheck: false - onClicked: { - settings.transliterateMessage = !settings.transliterateMessage; - } - } - - Label { - text: qsTr("Notifications") - font.family: Theme.fontFamilyHeading - color: Theme.highlightColor - anchors.right: parent.right - anchors.rightMargin: Theme.paddingMedium - } - - TextSwitch { - text: qsTr("Messaging") - description: qsTr("SMS and IM") - checked: settings.notificationsCommhistoryd - automaticCheck: false - onClicked: { - settings.notificationsCommhistoryd = !settings.notificationsCommhistoryd; - } - } - - TextSwitch { - text: qsTr("Missed call") - checked: settings.notificationsMissedCall - automaticCheck: false - onClicked: { - settings.notificationsMissedCall = !settings.notificationsMissedCall; - } - } - - TextSwitch { - text: qsTr("Emails") - checked: settings.notificationsEmails - automaticCheck: false - onClicked: { - settings.notificationsEmails = !settings.notificationsEmails; - } - } - - TextSwitch { - text: qsTr("Mitakuuluu") - checked: settings.notificationsMitakuuluu - automaticCheck: false - onClicked: { - settings.notificationsMitakuuluu = !settings.notificationsMitakuuluu; - } - } - - TextSwitch { - text: qsTr("Twitter") - checked: settings.notificationsTwitter - automaticCheck: false - onClicked: { - settings.notificationsTwitter = !settings.notificationsTwitter; - } - } - - TextSwitch { - visible: false //not yet supported - text: qsTr("Facebook") - checked: settings.notificationsFacebook - automaticCheck: false - onClicked: { - settings.notificationsFacebook = !settings.notificationsFacebook; - } - } - - TextSwitch { - text: qsTr("Other notifications") - checked: settings.notificationsOther - automaticCheck: false - onClicked: { - settings.notificationsOther = !settings.notificationsOther; - } - } - - TextSwitch { - text: qsTr("All notifications") - checked: settings.notificationsAll - automaticCheck: false - enabled: settings.notificationsOther - onClicked: { - settings.notificationsAll = !settings.notificationsAll; - } - } - - Label { - text: qsTr("Profiles") - font.family: Theme.fontFamilyHeading - color: Theme.highlightColor - anchors.right: parent.right - anchors.rightMargin: Theme.paddingMedium - } - - ComboBox { - label: qsTr("Connected") - menu: ContextMenu { - MenuItem { - text: qsTr("no change") - font.capitalization: Font.SmallCaps - } - Repeater { - model: profiled.profiles - delegate: MenuItem { - text: modelData - down: modelData === settings.profileWhenConnected - } - } - } - value: settings.profileWhenConnected || qsTr("no change") - onCurrentIndexChanged: { - settings.profileWhenConnected = currentIndex ? currentItem.text : "" - } - } - - ComboBox { - label: qsTr("Disconnected") - menu: ContextMenu { - MenuItem { - text: qsTr("no change") - font.capitalization: Font.SmallCaps - } - Repeater { - model: profiled.profiles - delegate: MenuItem { - text: modelData - down: modelData === settings.profileWhenDisconnected - } - } - } - value: settings.profileWhenDisconnected || qsTr("no change") - onCurrentIndexChanged: { - settings.profileWhenDisconnected = currentIndex ? currentItem.text : "" - } - } - } - } -} +import QtQuick 2.0 +import QtQml 2.1 +import Sailfish.Silica 1.0 +import org.nemomobile.configuration 1.0 +import org.nemomobile.dbus 2.0 + +Page { + id: page + + ConfigurationGroup { + id: settings + path: "/org/pebbled/settings" + property string profileWhenConnected: "" + property string profileWhenDisconnected: "" + property bool transliterateMessage + property bool useSystemVolume + property bool incomingCallNotification + property bool notificationsCommhistoryd + property bool notificationsMissedCall + property bool notificationsEmails + property bool notificationsTwitter + property bool notificationsFacebook + property bool notificationsTelegram + property bool notificationsHangouts + property bool notificationsWhatsapp + property bool notificationsOther + property bool notificationsAll + } + + DBusInterface { + id: profiled + + service: 'com.nokia.profiled' + iface: 'com.nokia.profiled' + path: '/com/nokia/profiled' + + property var profiles + } + + Component.onCompleted: { + profiled.typedCall('get_profiles', [], function (result) { + console.log('Got profiles: ' + result); + profiled.profiles = result; + }); + } + + + + SilicaFlickable { + id: flickable + anchors.fill: parent + contentHeight: column.height + + VerticalScrollDecorator { flickable: flickable } + + PullDownMenu { + MenuItem { + text: qsTr("Pebble Appstore") + onClicked: pageStack.push(Qt.resolvedUrl("AppStorePage.qml")) + } + MenuItem { + text: qsTr("About") + onClicked: pageStack.push(Qt.resolvedUrl("AboutPage.qml")) + } + } + + Column { + id: column + + width: page.width + spacing: Theme.paddingLarge + PageHeader { + title: qsTr("Pebble Manager") + } + + Label { + color: Theme.highlightColor + font.pixelSize: Theme.fontSizeSmall + visible: pebbled.active && !pebbled.connected + text: qsTr("Waiting for watch...\nIf it can't be found please check it's available and paired in Bluetooth settings.") + wrapMode: Text.Wrap + anchors { + left: parent.left + right: parent.right + margins: Theme.paddingLarge + } + + } + Button { + visible: pebbled.connected + text: pebbled.name + anchors { + left: parent.left + right: parent.right + margins: Theme.paddingLarge + } + onClicked: pageStack.push(Qt.resolvedUrl("WatchPage.qml")) + } + + Label { + text: qsTr("Service") + font.family: Theme.fontFamilyHeading + color: Theme.highlightColor + anchors.right: parent.right + anchors.rightMargin: Theme.paddingMedium + } + TextSwitch { + text: qsTr("Enabled") + description: pebbled.enabled ? qsTr("Automatic startup") : qsTr("Manual startup") + checked: pebbled.enabled + automaticCheck: false + onClicked: pebbled.setEnabled(!checked) + } + TextSwitch { + text: qsTr("Active") + description: pebbled.active ? qsTr("Running") : qsTr("Dead") + checked: pebbled.active + automaticCheck: false + onClicked: pebbled.setActive(!checked) + } + TextSwitch { + text: qsTr("Connection") + description: pebbled.connected ? qsTr("Connected"): qsTr("Disconnected") + checked: pebbled.connected + automaticCheck: false + onClicked: { + if (pebbled.connected) { + pebbled.disconnect(); + } else { + pebbled.reconnect(); + } + } + } + + Label { + text: qsTr("Settings") + font.family: Theme.fontFamilyHeading + color: Theme.highlightColor + anchors.right: parent.right + anchors.rightMargin: Theme.paddingMedium + } + TextSwitch { + text: qsTr("Forward phone calls") + checked: settings.incomingCallNotification + automaticCheck: false + onClicked: { + settings.incomingCallNotification = !settings.incomingCallNotification; + } + } + TextSwitch { + text: qsTr("Control main volume") + description: qsTr("Pebble music volume buttons change the main phone volume directly instead of through the music player") + checked: settings.useSystemVolume + automaticCheck: true + onClicked: { + settings.useSystemVolume = !settings.useSystemVolume; + } + } + TextSwitch { + text: qsTr("Transliterate messages") + description: qsTr("Messages are transliterated to ASCII before sending to Pebble") + checked: settings.transliterateMessage + automaticCheck: false + onClicked: { + settings.transliterateMessage = !settings.transliterateMessage; + } + } + + Label { + text: qsTr("Notifications") + font.family: Theme.fontFamilyHeading + color: Theme.highlightColor + anchors.right: parent.right + anchors.rightMargin: Theme.paddingMedium + } + + TextSwitch { + text: qsTr("Messaging") + description: qsTr("SMS and IM") + checked: settings.notificationsCommhistoryd + automaticCheck: false + onClicked: { + settings.notificationsCommhistoryd = !settings.notificationsCommhistoryd; + } + } + + TextSwitch { + text: qsTr("Missed call") + checked: settings.notificationsMissedCall + automaticCheck: false + onClicked: { + settings.notificationsMissedCall = !settings.notificationsMissedCall; + } + } + + TextSwitch { + text: qsTr("Emails") + checked: settings.notificationsEmails + automaticCheck: false + onClicked: { + settings.notificationsEmails = !settings.notificationsEmails; + } + } + + TextSwitch { + text: qsTr("Telegram") + checked: settings.notificationsTelegram + automaticCheck: false + onClicked: { + settings.notificationsTelegram = !settings.notificationsTelegram; + } + } + + TextSwitch { + text: qsTr("Whatsapp") + checked: settings.notificationsWhatsapp + automaticCheck: false + onClicked: { + settings.notificationsWhatsapp = !settings.notificationsWhatsapp; + } + } + + TextSwitch { + text: qsTr("Hangouts") + checked: settings.notificationsHangouts + automaticCheck: false + onClicked: { + settings.notificationsHangouts = !settings.notificationsHangouts; + } + } + + TextSwitch { + text: qsTr("Twitter") + checked: settings.notificationsTwitter + automaticCheck: false + onClicked: { + settings.notificationsTwitter = !settings.notificationsTwitter; + } + } + + TextSwitch { + visible: false //not yet supported + text: qsTr("Facebook") + checked: settings.notificationsFacebook + automaticCheck: false + onClicked: { + settings.notificationsFacebook = !settings.notificationsFacebook; + } + } + + TextSwitch { + text: qsTr("Other notifications") + checked: settings.notificationsOther + automaticCheck: false + onClicked: { + settings.notificationsOther = !settings.notificationsOther; + } + } + + TextSwitch { + text: qsTr("All notifications") + checked: settings.notificationsAll + automaticCheck: false + enabled: settings.notificationsOther + onClicked: { + settings.notificationsAll = !settings.notificationsAll; + } + } + + Label { + text: qsTr("Profiles") + font.family: Theme.fontFamilyHeading + color: Theme.highlightColor + anchors.right: parent.right + anchors.rightMargin: Theme.paddingMedium + } + + ComboBox { + label: qsTr("Connected") + menu: ContextMenu { + MenuItem { + text: qsTr("no change") + font.capitalization: Font.SmallCaps + } + Repeater { + model: profiled.profiles + delegate: MenuItem { + text: modelData + down: modelData === settings.profileWhenConnected + } + } + } + value: settings.profileWhenConnected || qsTr("no change") + onCurrentIndexChanged: { + settings.profileWhenConnected = currentIndex ? currentItem.text : "" + } + } + + ComboBox { + label: qsTr("Disconnected") + menu: ContextMenu { + MenuItem { + text: qsTr("no change") + font.capitalization: Font.SmallCaps + } + Repeater { + model: profiled.profiles + delegate: MenuItem { + text: modelData + down: modelData === settings.profileWhenDisconnected + } + } + } + value: settings.profileWhenDisconnected || qsTr("no change") + onCurrentIndexChanged: { + settings.profileWhenDisconnected = currentIndex ? currentItem.text : "" + } + } + } + } +} -- cgit v1.2.3