Merge lp:~boiko/messaging-app/uri_handler into lp:messaging-app

Proposed by Gustavo Pichorim Boiko
Status: Merged
Approved by: Tiago Salem Herrmann
Approved revision: 48
Merged at revision: 46
Proposed branch: lp:~boiko/messaging-app/uri_handler
Merge into: lp:messaging-app
Diff against target: 509 lines (+26/-276)
11 files modified
CMakeLists.txt (+0/-7)
debian/messaging-app.install (+0/-1)
src/CMakeLists.txt (+3/-8)
src/MessagingApp.xml (+0/-43)
src/com.canonical.MessagingApp.service.in (+0/-3)
src/messagingappdbus.cpp (+0/-76)
src/messagingappdbus.h (+0/-53)
src/messagingapplication.cpp (+8/-70)
src/messagingapplication.h (+0/-7)
src/qml/Messages.qml (+5/-7)
src/qml/messaging-app.qml (+10/-1)
To merge this branch: bzr merge lp:~boiko/messaging-app/uri_handler
Reviewer Review Type Date Requested Status
Bill Filler (community) Approve
Tiago Salem Herrmann (community) Approve
Michael Terry Approve
PS Jenkins bot continuous-integration Approve
Review via email: mp+189428@code.launchpad.net

Commit message

Change the messaging-app to use the new URL dispatcher mechanism.

Description of the change

Change the messaging-app to use the new URL dispatcher mechanism.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Michael Terry (mterry) wrote :

Looks like we remove some functionality ("go to a specific message" and "start a new message"). Do we know those aren't used?

review: Needs Information
Revision history for this message
Michael Terry (mterry) wrote :

On IRC, boiko cleared up that we don't use those functions anymore.

This works fine in testing (both receiving and launching requests). Code seems fine too.

review: Approve
Revision history for this message
Tiago Salem Herrmann (tiagosh) wrote :

looks good.

review: Approve
Revision history for this message
Bill Filler (bfiller) wrote :

approved

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CMakeLists.txt'
--- CMakeLists.txt 2013-07-15 20:33:33 +0000
+++ CMakeLists.txt 2013-10-07 19:24:17 +0000
@@ -31,13 +31,6 @@
31# Instruct CMake to run moc automatically when needed.31# Instruct CMake to run moc automatically when needed.
32set(CMAKE_AUTOMOC ON)32set(CMAKE_AUTOMOC ON)
3333
34# Check if should build using ubuntu platform api
35check_include_file_cxx("ubuntu/ui/ubuntu_ui_session_service.h" USE_UBUNTU_PLATFORM_API)
36
37if (USE_UBUNTU_PLATFORM_API)
38 add_definitions(-DUSE_UBUNTU_PLATFORM_API)
39endif (USE_UBUNTU_PLATFORM_API)
40
41configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY)34configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY)
4235
43find_package(Qt5Core)36find_package(Qt5Core)
4437
=== modified file 'debian/messaging-app.install'
--- debian/messaging-app.install 2013-08-12 20:50:13 +0000
+++ debian/messaging-app.install 2013-10-07 19:24:17 +0000
@@ -1,5 +1,4 @@
1usr/share/applications/messaging-app*.desktop1usr/share/applications/messaging-app*.desktop
2usr/share/dbus-1/services/*MessagingApp*.service
3usr/share/locale/*/LC_MESSAGES/messaging-app.mo2usr/share/locale/*/LC_MESSAGES/messaging-app.mo
4usr/share/messaging-app/*.qml3usr/share/messaging-app/*.qml
5usr/share/messaging-app/*.js4usr/share/messaging-app/*.js
65
=== modified file 'src/CMakeLists.txt'
--- src/CMakeLists.txt 2013-07-15 20:33:33 +0000
+++ src/CMakeLists.txt 2013-10-07 19:24:17 +0000
@@ -2,14 +2,13 @@
22
3set(messaging_app_HDRS3set(messaging_app_HDRS
4 messagingapplication.h4 messagingapplication.h
5 messagingappdbus.h)5 )
66
7set(messaging_app_SRCS7set(messaging_app_SRCS
8 messagingapplication.cpp8 messagingapplication.cpp
9 messagingappdbus.cpp9 main.cpp
10 main.cpp)10 )
1111
12qt5_add_dbus_adaptor(messaging_app_SRCS MessagingApp.xml messagingappdbus.h MessagingAppDBus)
13add_executable(${MESSAGING_APP}12add_executable(${MESSAGING_APP}
14 ${messaging_app_SRCS}13 ${messaging_app_SRCS}
15 )14 )
@@ -24,10 +23,6 @@
24 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}23 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
25 )24 )
2625
27
28configure_file(com.canonical.MessagingApp.service.in com.canonical.MessagingApp.service)
29install(FILES ${CMAKE_CURRENT_BINARY_DIR}/com.canonical.MessagingApp.service DESTINATION share/dbus-1/services)
30
31# Handle i18n in the desktop file26# Handle i18n in the desktop file
32set(DESKTOP_FILE ${MESSAGING_APP}.desktop)27set(DESKTOP_FILE ${MESSAGING_APP}.desktop)
33file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE})28file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/${DESKTOP_FILE})
3429
=== removed file 'src/MessagingApp.xml'
--- src/MessagingApp.xml 2013-07-15 20:33:33 +0000
+++ src/MessagingApp.xml 1970-01-01 00:00:00 +0000
@@ -1,43 +0,0 @@
1<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
2<node xmlns:dox="http://www.ayatana.org/dbus/dox.dtd">
3 <dox:d><![CDATA[
4 @mainpage
5
6 An interface to the messaging application.
7 ]]></dox:d>
8 <interface name="com.canonical.MessagingApp" xmlns:dox="http://www.ayatana.org/dbus/dox.dtd">
9 <dox:d>
10 An interface to the messaging application.
11 </dox:d>
12 <method name="ShowMessages">
13 <dox:d><![CDATA[
14 Request to open the messages tab.
15 ]]></dox:d>
16 <arg name="number" type="s" direction="in"/>
17 </method>
18 <method name="ShowMessage">
19 <dox:d><![CDATA[
20 Request to open the messages tab and show the given message.
21 ]]></dox:d>
22 <arg name="messageId" type="s" direction="in"/>
23 </method>
24 <method name="NewMessage">
25 <dox:d><![CDATA[
26 Request to open the messages tab to send a new message.
27 ]]></dox:d>
28 </method>
29 <method name="SendMessage">
30 <dox:d><![CDATA[
31 Request to send a message to a contact.
32 ]]></dox:d>
33 <arg name="number" type="s" direction="in"/>
34 <arg name="message" type="s" direction="in"/>
35 </method>
36 <method name="SendAppMessage">
37 <dox:d><![CDATA[
38 Send a message to the running application.
39 ]]></dox:d>
40 <arg name="message" type="s" direction="in"/>
41 </method>
42 </interface>
43</node>
440
=== removed file 'src/com.canonical.MessagingApp.service.in'
--- src/com.canonical.MessagingApp.service.in 2013-07-15 20:33:33 +0000
+++ src/com.canonical.MessagingApp.service.in 1970-01-01 00:00:00 +0000
@@ -1,3 +0,0 @@
1[D-BUS Service]
2Name=com.canonical.MessagingApp
3Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/messaging-app
40
=== removed file 'src/messagingappdbus.cpp'
--- src/messagingappdbus.cpp 2013-07-31 03:29:25 +0000
+++ src/messagingappdbus.cpp 1970-01-01 00:00:00 +0000
@@ -1,76 +0,0 @@
1/*
2 * Copyright (C) 2012-2013 Canonical, Ltd.
3 *
4 * Authors:
5 * Ugo Riboni <ugo.riboni@canonical.com>
6 *
7 * This file is part of messaging-app.
8 *
9 * messaging-app is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 3.
12 *
13 * messaging-app is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#include "messagingappdbus.h"
23#include "messagingappadaptor.h"
24
25// Qt
26#include <QtDBus/QDBusConnection>
27
28static const char* DBUS_SERVICE = "com.canonical.MessagingApp";
29static const char* DBUS_OBJECT_PATH = "/com/canonical/MessagingApp";
30
31MessagingAppDBus::MessagingAppDBus(QObject* parent) : QObject(parent)
32{
33}
34
35MessagingAppDBus::~MessagingAppDBus()
36{
37}
38
39bool
40MessagingAppDBus::connectToBus()
41{
42 bool ok = QDBusConnection::sessionBus().registerService(DBUS_SERVICE);
43 if (!ok) {
44 return false;
45 }
46 new MessagingAppAdaptor(this);
47 QDBusConnection::sessionBus().registerObject(DBUS_OBJECT_PATH, this);
48
49 return true;
50}
51
52void
53MessagingAppDBus::ShowMessages(const QString &number)
54{
55 Q_EMIT request(QString("messages://%1").arg(number));
56}
57
58void MessagingAppDBus::ShowMessage(const QString &messageId)
59{
60 Q_EMIT request(QString("messageId://%1").arg(messageId));
61}
62
63void MessagingAppDBus::NewMessage()
64{
65 Q_EMIT request(QString("messages://"));
66}
67
68void MessagingAppDBus::SendMessage(const QString &number, const QString &message)
69{
70 Q_EMIT messageSendRequested(number, message);
71}
72
73void MessagingAppDBus::SendAppMessage(const QString &message)
74{
75 Q_EMIT request(message);
76}
770
=== removed file 'src/messagingappdbus.h'
--- src/messagingappdbus.h 2013-07-15 20:33:33 +0000
+++ src/messagingappdbus.h 1970-01-01 00:00:00 +0000
@@ -1,53 +0,0 @@
1/*
2 * Copyright (C) 2012-2013 Canonical, Ltd.
3 *
4 * Authors:
5 * Ugo Riboni <ugo.riboni@canonical.com>
6 *
7 * This file is part of messaging-app.
8 *
9 * messaging-app is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 3.
12 *
13 * messaging-app is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#ifndef MESSAGINGAPPDBUS_H
23#define MESSAGINGAPPDBUS_H
24
25#include <QtCore/QObject>
26#include <QtDBus/QDBusContext>
27
28/**
29 * DBus interface for the messaging app
30 */
31class MessagingAppDBus : public QObject, protected QDBusContext
32{
33 Q_OBJECT
34
35public:
36 MessagingAppDBus(QObject* parent=0);
37 ~MessagingAppDBus();
38
39 bool connectToBus();
40
41public Q_SLOTS:
42 Q_NOREPLY void ShowMessages(const QString &number);
43 Q_NOREPLY void ShowMessage(const QString &messageId);
44 Q_NOREPLY void NewMessage();
45 Q_NOREPLY void SendMessage(const QString &number, const QString &message);
46 Q_NOREPLY void SendAppMessage(const QString &message);
47
48Q_SIGNALS:
49 void request(const QString &message);
50 void messageSendRequested(const QString &phoneNumber, const QString &message);
51};
52
53#endif // MESSAGINGAPPDBUS_H
540
=== modified file 'src/messagingapplication.cpp'
--- src/messagingapplication.cpp 2013-07-31 03:49:02 +0000
+++ src/messagingapplication.cpp 2013-10-07 19:24:17 +0000
@@ -31,15 +31,13 @@
31#include <QDBusConnectionInterface>31#include <QDBusConnectionInterface>
32#include <QLibrary>32#include <QLibrary>
33#include "config.h"33#include "config.h"
34#include "messagingappdbus.h"
35#include <QQmlEngine>34#include <QQmlEngine>
3635
37static void printUsage(const QStringList& arguments)36static void printUsage(const QStringList& arguments)
38{37{
39 qDebug() << "usage:"38 qDebug() << "usage:"
40 << arguments.at(0).toUtf8().constData()39 << arguments.at(0).toUtf8().constData()
41 << "[messages://PHONE_NUMBER]"40 << "[message:///PHONE_NUMBER]"
42 << "[messageId://MESSAGE_ID]"
43 << "[--fullscreen]"41 << "[--fullscreen]"
44 << "[--help]"42 << "[--help]"
45 << "[-testability]";43 << "[-testability]";
@@ -49,7 +47,6 @@
49 : QGuiApplication(argc, argv), m_view(0), m_applicationIsReady(false)47 : QGuiApplication(argc, argv), m_view(0), m_applicationIsReady(false)
50{48{
51 setApplicationName("MessagingApp");49 setApplicationName("MessagingApp");
52 m_dbus = new MessagingAppDBus(this);
53}50}
5451
55bool MessagingApplication::setup()52bool MessagingApplication::setup()
@@ -58,8 +55,7 @@
58 bool fullScreen = false;55 bool fullScreen = false;
5956
60 if (validSchemes.isEmpty()) {57 if (validSchemes.isEmpty()) {
61 validSchemes << "messages";58 validSchemes << "message";
62 validSchemes << "messageId";
63 }59 }
6460
65 QStringList arguments = this->arguments();61 QStringList arguments = this->arguments();
@@ -114,27 +110,12 @@
114 }110 }
115 }111 }
116112
117 // check if the app is already running, if it is, send the message to the running instance
118 QDBusReply<bool> reply = QDBusConnection::sessionBus().interface()->isServiceRegistered("com.canonical.MessagingApp");
119 if (reply.isValid() && reply.value()) {
120 QDBusInterface appInterface("com.canonical.MessagingApp",
121 "/com/canonical/MessagingApp",
122 "com.canonical.MessagingApp");
123 appInterface.call("SendAppMessage", m_arg);
124 return false;
125 }
126
127 if (!m_dbus->connectToBus()) {
128 qWarning() << "Failed to expose com.canonical.MessagingApp on DBUS.";
129 }
130
131 m_view = new QQuickView();113 m_view = new QQuickView();
132 QObject::connect(m_view, SIGNAL(statusChanged(QQuickView::Status)), this, SLOT(onViewStatusChanged(QQuickView::Status)));114 QObject::connect(m_view, SIGNAL(statusChanged(QQuickView::Status)), this, SLOT(onViewStatusChanged(QQuickView::Status)));
133 QObject::connect(m_view->engine(), SIGNAL(quit()), SLOT(quit()));115 QObject::connect(m_view->engine(), SIGNAL(quit()), SLOT(quit()));
134 m_view->setResizeMode(QQuickView::SizeRootObjectToView);116 m_view->setResizeMode(QQuickView::SizeRootObjectToView);
135 m_view->setTitle("Messaging");117 m_view->setTitle("Messaging");
136 m_view->rootContext()->setContextProperty("application", this);118 m_view->rootContext()->setContextProperty("application", this);
137 m_view->rootContext()->setContextProperty("dbus", m_dbus);
138 m_view->engine()->setBaseUrl(QUrl::fromLocalFile(messagingAppDirectory()));119 m_view->engine()->setBaseUrl(QUrl::fromLocalFile(messagingAppDirectory()));
139120
140 QString pluginPath = ubuntuPhonePluginPath();121 QString pluginPath = ubuntuPhonePluginPath();
@@ -149,13 +130,6 @@
149 m_view->show();130 m_view->show();
150 }131 }
151132
152 connect(m_dbus,
153 SIGNAL(request(QString)),
154 SLOT(onMessageReceived(QString)));
155 connect(m_dbus,
156 SIGNAL(messageSendRequested(QString,QString)),
157 SLOT(onMessageSendRequested(QString,QString)));
158
159 return true;133 return true;
160}134}
161135
@@ -186,60 +160,24 @@
186 m_arg.clear();160 m_arg.clear();
187}161}
188162
189void MessagingApplication::onMessageSendRequested(const QString &phoneNumber, const QString &message)
190{
191 QQuickItem *mainView = m_view->rootObject();
192 if (!mainView) {
193 return;
194 }
195 const QMetaObject *mo = mainView->metaObject();
196 int index = mo->indexOfMethod("sendMessage(QVariant,QVariant)");
197 if (index != -1) {
198 QMetaMethod method = mo->method(index);
199 method.invoke(mainView,
200 Q_ARG(QVariant, QVariant(phoneNumber)),
201 Q_ARG(QVariant, QVariant(message)));
202 }
203}
204
205void MessagingApplication::parseArgument(const QString &arg)163void MessagingApplication::parseArgument(const QString &arg)
206{164{
207 if (arg.isEmpty()) {165 if (arg.isEmpty()) {
208 return;166 return;
209 }167 }
210168
211 QStringList args = arg.split("://");169 QUrl url(arg);
212 if (args.size() != 2) {170 QString scheme = url.scheme();
213 return;171 // Remove the first "/"
214 }172 QString value = url.path().right(url.path().length() -1);
215
216 QString scheme = args[0];
217 QString value = args[1];
218173
219 QQuickItem *mainView = m_view->rootObject();174 QQuickItem *mainView = m_view->rootObject();
220 if (!mainView) {175 if (!mainView) {
221 return;176 return;
222 }177 }
223178
224 if (scheme == "messages") {179 if (scheme == "message") {
225 if (value.isEmpty()) {180 QMetaObject::invokeMethod(mainView, "startChat", Q_ARG(QVariant, value));
226 QMetaObject::invokeMethod(mainView, "startNewMessage");
227 } else {
228 QMetaObject::invokeMethod(mainView, "startChat", Q_ARG(QVariant, value));
229 }
230 } else if (scheme == "messageId") {
231 QMetaObject::invokeMethod(mainView, "showMessage", Q_ARG(QVariant, value));
232 }
233}
234
235void MessagingApplication::onMessageReceived(const QString &message)
236{
237 if (m_applicationIsReady) {
238 parseArgument(message);
239 m_arg.clear();
240 activateWindow();
241 } else {
242 m_arg = message;
243 }181 }
244}182}
245183
246184
=== modified file 'src/messagingapplication.h'
--- src/messagingapplication.h 2013-07-15 20:33:33 +0000
+++ src/messagingapplication.h 2013-10-07 19:24:17 +0000
@@ -23,8 +23,6 @@
23#include <QQuickView>23#include <QQuickView>
24#include <QGuiApplication>24#include <QGuiApplication>
2525
26class MessagingAppDBus;
27
28class MessagingApplication : public QGuiApplication26class MessagingApplication : public QGuiApplication
29{27{
30 Q_OBJECT28 Q_OBJECT
@@ -37,19 +35,14 @@
3735
38public Q_SLOTS:36public Q_SLOTS:
39 void activateWindow();37 void activateWindow();
40
41private:
42 void parseArgument(const QString &arg);38 void parseArgument(const QString &arg);
4339
44private Q_SLOTS:40private Q_SLOTS:
45 void onMessageReceived(const QString &message);
46 void onViewStatusChanged(QQuickView::Status status);41 void onViewStatusChanged(QQuickView::Status status);
47 void onApplicationReady();42 void onApplicationReady();
48 void onMessageSendRequested(const QString &phoneNumber, const QString &message);
4943
50private:44private:
51 QQuickView *m_view;45 QQuickView *m_view;
52 MessagingAppDBus *m_dbus;
53 QString m_arg;46 QString m_arg;
54 bool m_applicationIsReady;47 bool m_applicationIsReady;
55};48};
5649
=== modified file 'src/qml/Messages.qml'
--- src/qml/Messages.qml 2013-09-27 17:22:42 +0000
+++ src/qml/Messages.qml 2013-10-07 19:24:17 +0000
@@ -69,8 +69,7 @@
69 text: i18n.tr("Create new contact")69 text: i18n.tr("Create new contact")
70 color: UbuntuColors.warmGrey70 color: UbuntuColors.warmGrey
71 onClicked: {71 onClicked: {
72 applicationUtils.switchToAddressbookApp("addressbook://create" +72 Qt.openUrlExternally("addressbook:///create?phone=" + encodeURIComponent(contactWatcher.phoneNumber));
73 "?phone=" + encodeURIComponent(contactWatcher.phoneNumber))
74 PopupUtils.close(dialogue)73 PopupUtils.close(dialogue)
75 }74 }
76 }75 }
@@ -104,9 +103,8 @@
104 ContactListView {103 ContactListView {
105 anchors.fill: parent104 anchors.fill: parent
106 onContactClicked: {105 onContactClicked: {
107 applicationUtils.switchToAddressbookApp("addressbook://addphone" +106 Qt.openUrlExternally("addressbook:///addphone?id=" + encodeURIComponent(contact.contactId) +
108 "?id=" + encodeURIComponent(contact.contactId) +107 "&phone=" + encodeURIComponent(contactWatcher.phoneNumber))
109 "&phone=" + encodeURIComponent(contactWatcher.phoneNumber))
110 PopupUtils.close(sheet)108 PopupUtils.close(sheet)
111 }109 }
112 }110 }
@@ -179,7 +177,7 @@
179 iconSource: Qt.resolvedUrl("assets/contact.svg")177 iconSource: Qt.resolvedUrl("assets/contact.svg")
180 text: i18n.tr("Contact")178 text: i18n.tr("Contact")
181 onTriggered: {179 onTriggered: {
182 applicationUtils.switchToAddressbookApp("addressbook://contact?id=" + encodeURIComponent(contactWatcher.contactId))180 Qt.openUrlExternally("addressbook:///contact?id=" + encodeURIComponent(contactWatcher.contactId))
183 messagesToolbar.opened = false181 messagesToolbar.opened = false
184 }182 }
185 }183 }
@@ -191,7 +189,7 @@
191 iconSource: Qt.resolvedUrl("assets/call-start.svg")189 iconSource: Qt.resolvedUrl("assets/call-start.svg")
192 text: i18n.tr("Call")190 text: i18n.tr("Call")
193 onTriggered: {191 onTriggered: {
194 applicationUtils.switchToDialerApp("call://" + contactWatcher.phoneNumber)192 Qt.openUrlExternally("tel:///" + encodeURIComponent(contactWatcher.phoneNumber))
195 messagesToolbar.opened = false193 messagesToolbar.opened = false
196 }194 }
197 }195 }
198196
=== modified file 'src/qml/messaging-app.qml'
--- src/qml/messaging-app.qml 2013-09-13 16:53:30 +0000
+++ src/qml/messaging-app.qml 2013-10-07 19:24:17 +0000
@@ -56,6 +56,15 @@
56 mainStack.push(Qt.resolvedUrl("Messages.qml"), properties)56 mainStack.push(Qt.resolvedUrl("Messages.qml"), properties)
57 }57 }
5858
59 Connections {
60 target: UriHandler
61 onOpened: {
62 for (var i = 0; i < uris.length; ++i) {
63 application.parseArgument(uris[i])
64 }
65 }
66 }
67
59 Component {68 Component {
60 id: newcontactPopover69 id: newcontactPopover
6170
@@ -72,7 +81,7 @@
72 ListItem.Standard {81 ListItem.Standard {
73 text: i18n.tr("Create new contact")82 text: i18n.tr("Create new contact")
74 onClicked: {83 onClicked: {
75 applicationUtils.switchToAddressbookApp("create://" + newPhoneNumber)84 Qt.openUrlExternally("addressbook:///create?phone=" + encodeURIComponent(newPhoneNumber))
76 popover.hide()85 popover.hide()
77 }86 }
78 }87 }

Subscribers

People subscribed via source and target branches