summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2014-12-01 04:13:06 +0100
committerJavier <dev.git@javispedro.com>2014-12-01 04:13:06 +0100
commit81f91639969de0f3852a3fe73db13b4cb0ecf3b4 (patch)
treeac5f3146707e0b46723bfdf13b7ced5cdf16633d
parentbe139d8ff95160782b424134a025b30c82083e28 (diff)
hackily implement openURL by signalling the URLs via D-Bus to the
settings app, which pops a webview
-rw-r--r--app/app.pro3
-rw-r--r--app/pebbledinterface.cpp16
-rw-r--r--app/pebbledinterface.h4
-rw-r--r--app/qml/pages/WebViewPage.qml29
-rw-r--r--app/qml/pebble.qml5
-rw-r--r--daemon/dbusadaptor.cpp5
-rw-r--r--daemon/dbusadaptor.h8
-rw-r--r--daemon/jskitmanager.cpp10
-rw-r--r--daemon/jskitmanager.h2
-rw-r--r--daemon/jskitobjects.cpp10
-rw-r--r--daemon/jskitobjects.h12
-rw-r--r--daemon/manager.cpp6
-rw-r--r--daemon/manager.h3
13 files changed, 103 insertions, 10 deletions
diff --git a/app/app.pro b/app/app.pro
index cb4c33b..e08fa87 100644
--- a/app/app.pro
+++ b/app/app.pro
@@ -22,4 +22,5 @@ OTHER_FILES += \
qml/pebble.qml \
qml/images/* \
pebble.desktop \
- pebble.png
+ pebble.png \
+ qml/pages/WebViewPage.qml
diff --git a/app/pebbledinterface.cpp b/app/pebbledinterface.cpp
index c6f5674..8759863 100644
--- a/app/pebbledinterface.cpp
+++ b/app/pebbledinterface.cpp
@@ -19,6 +19,10 @@ PebbledInterface::PebbledInterface(QObject *parent) :
PEBBLED_DBUS_SERVICE, PEBBLED_DBUS_PATH, PEBBLED_DBUS_IFACE,
"pebbleChanged", this, SLOT(onPebbleChanged()));
+ QDBusConnection::sessionBus().connect(
+ PEBBLED_DBUS_SERVICE, PEBBLED_DBUS_PATH, PEBBLED_DBUS_IFACE,
+ "openUrl", this, SIGNAL(openUrl(QString)));
+
// simulate connected change on active changed
// as the daemon might not had a chance to send 'connectedChanged'
// when going down
@@ -163,3 +167,15 @@ void PebbledInterface::reconnect()
qDebug() << __FUNCTION__;
PebbledDbusInterface.call("reconnect");
}
+
+void PebbledInterface::test()
+{
+ qDebug() << __FUNCTION__;
+ PebbledDbusInterface.call("test");
+}
+
+void PebbledInterface::webviewClosed(const QString &result)
+{
+ qDebug() << __FUNCTION__;
+ PebbledDbusInterface.call("webviewClosed", QVariant::fromValue(result));
+}
diff --git a/app/pebbledinterface.h b/app/pebbledinterface.h
index 0a6f15d..7d00110 100644
--- a/app/pebbledinterface.h
+++ b/app/pebbledinterface.h
@@ -45,6 +45,8 @@ signals:
void nameChanged();
void addressChanged();
+ void openUrl(const QString &url);
+
public slots:
void setEnabled(bool);
void setActive(bool);
@@ -52,6 +54,8 @@ public slots:
void time();
void disconnect();
void reconnect();
+ void test();
+ void webviewClosed(const QString &result);
private slots:
void getUnitProperties();
diff --git a/app/qml/pages/WebViewPage.qml b/app/qml/pages/WebViewPage.qml
new file mode 100644
index 0000000..2c6fcf0
--- /dev/null
+++ b/app/qml/pages/WebViewPage.qml
@@ -0,0 +1,29 @@
+import QtQuick 2.0
+import QtQml 2.1
+import QtWebKit 3.0
+import Sailfish.Silica 1.0
+
+Page {
+ id: webviewPage
+
+ property alias url: webview.url
+
+ SilicaWebView {
+ id: webview
+ anchors.fill: parent
+
+ onNavigationRequested: {
+ console.log("navigation requested to " + request.url);
+ var url = request.url.toString()
+ if (/^pebblejs:\/\/close/.exec(url)) {
+ var data = decodeURI(url.substring(17));
+ console.log("match with pebble close regexp. data: " + data);
+ pebbled.webviewClosed(data);
+ pageStack.pop();
+ request.action = WebView.IgnoreRequest;
+ } else {
+ request.action = WebView.AcceptRequest;
+ }
+ }
+ }
+}
diff --git a/app/qml/pebble.qml b/app/qml/pebble.qml
index da3bfb5..2ff0839 100644
--- a/app/qml/pebble.qml
+++ b/app/qml/pebble.qml
@@ -41,5 +41,10 @@ ApplicationWindow
PebbledInterface {
id: pebbled
+
+ onOpenUrl: {
+ console.log("got open url: " + url);
+ pageStack.push(Qt.resolvedUrl("pages/WebViewPage.qml"), {url: url});
+ }
}
}
diff --git a/daemon/dbusadaptor.cpp b/daemon/dbusadaptor.cpp
index 7bbf623..25e2508 100644
--- a/daemon/dbusadaptor.cpp
+++ b/daemon/dbusadaptor.cpp
@@ -85,3 +85,8 @@ void PebbledAdaptor::test()
{
QMetaObject::invokeMethod(parent(), "test");
}
+
+void PebbledAdaptor::webviewClosed(const QString &result)
+{
+ QMetaObject::invokeMethod(parent(), "webviewClosed", Q_ARG(QString, result));
+}
diff --git a/daemon/dbusadaptor.h b/daemon/dbusadaptor.h
index 54a0963..f347f92 100644
--- a/daemon/dbusadaptor.h
+++ b/daemon/dbusadaptor.h
@@ -47,6 +47,12 @@ class PebbledAdaptor: public QDBusAbstractAdaptor
" <method name=\"disconnect\"/>\n"
" <method name=\"reconnect\"/>\n"
" <method name=\"test\"/>\n"
+" <signal name=\"openUrl\">\n"
+" <arg type=\"s\" name=\"url\"/>\n"
+" </signal>\n"
+" <method name=\"webviewClosed\">\n"
+" <arg direction=\"in\" type=\"s\" name=\"result\"/>\n"
+" </method>\n"
" </interface>\n"
"")
public:
@@ -72,9 +78,11 @@ public Q_SLOTS: // METHODS
void time();
void reconnect();
void test();
+ void webviewClosed(const QString &result);
Q_SIGNALS: // SIGNALS
void connectedChanged();
void pebbleChanged();
+ void openUrl(const QString &s);
};
#endif
diff --git a/daemon/jskitmanager.cpp b/daemon/jskitmanager.cpp
index 6023a9a..cfd860e 100644
--- a/daemon/jskitmanager.cpp
+++ b/daemon/jskitmanager.cpp
@@ -31,6 +31,16 @@ void JSKitManager::showConfiguration()
}
}
+void JSKitManager::handleWebviewClosed(const QString &result)
+{
+ if (_engine) {
+ QJSValue eventObj = _engine->newObject();
+ eventObj.setProperty("response", _engine->toScriptValue(result));
+
+ _jspebble->invokeCallbacks("webviewclosed", QJSValueList({eventObj}));
+ }
+}
+
void JSKitManager::handleAppStarted(const QUuid &uuid)
{
AppInfo info = _apps->info(uuid);
diff --git a/daemon/jskitmanager.h b/daemon/jskitmanager.h
index 73d7853..fd6040d 100644
--- a/daemon/jskitmanager.h
+++ b/daemon/jskitmanager.h
@@ -22,9 +22,11 @@ public:
signals:
void appNotification(const QUuid &uuid, const QString &title, const QString &body);
+ void appOpenUrl(const QString &url);
public slots:
void showConfiguration();
+ void handleWebviewClosed(const QString &result);
private slots:
void handleAppStarted(const QUuid &uuid);
diff --git a/daemon/jskitobjects.cpp b/daemon/jskitobjects.cpp
index f745233..9e4cfde 100644
--- a/daemon/jskitobjects.cpp
+++ b/daemon/jskitobjects.cpp
@@ -54,12 +54,15 @@ void JSKitPebble::showSimpleNotificationOnPebble(const QString &title, const QSt
emit _mgr->appNotification(_appInfo.uuid(), title, body);
}
-void JSKitPebble::openUrl(const QUrl &url)
+void JSKitPebble::openURL(const QUrl &url)
{
logger()->debug() << "opening url" << url.toString();
+ emit _mgr->appOpenUrl(url.toString());
+#if 0 /* Until we figure out how to do this. Maybe signal the daemon? */
if (!QDesktopServices::openUrl(url)) {
logger()->warn() << "Failed to open URL:" << url;
}
+#endif
}
QJSValue JSKitPebble::createXMLHttpRequest()
@@ -253,7 +256,10 @@ void JSKitXMLHttpRequest::handleReplyFinished()
if (_onload.isCallable()) {
logger()->debug() << "going to call onload handler:" << _onload.toString();
- _onload.callWithInstance(_mgr->engine()->toScriptValue(this));
+ QJSValue result = _onload.callWithInstance(_mgr->engine()->newQObject(this));
+ if (result.isError()) {
+ logger()->warn() << "JS error on onload handler:" << result.toString();
+ }
} else {
logger()->debug() << "No onload set";
}
diff --git a/daemon/jskitobjects.h b/daemon/jskitobjects.h
index 1962e01..4f000f1 100644
--- a/daemon/jskitobjects.h
+++ b/daemon/jskitobjects.h
@@ -21,7 +21,7 @@ public:
Q_INVOKABLE void showSimpleNotificationOnPebble(const QString &title, const QString &body);
- Q_INVOKABLE void openUrl(const QUrl &url);
+ Q_INVOKABLE void openURL(const QUrl &url);
Q_INVOKABLE QJSValue createXMLHttpRequest();
@@ -88,11 +88,11 @@ public:
~JSKitXMLHttpRequest();
enum ReadyStates {
- UNSENT,
- OPENED,
- HEADERS_RECEIVED,
- LOADING,
- DONE
+ UNSENT = 0,
+ OPENED = 1,
+ HEADERS_RECEIVED = 2,
+ LOADING = 3,
+ DONE = 4
};
Q_INVOKABLE void open(const QString &method, const QString &url, bool async);
diff --git a/daemon/manager.cpp b/daemon/manager.cpp
index 9db4c70..e732d38 100644
--- a/daemon/manager.cpp
+++ b/daemon/manager.cpp
@@ -61,6 +61,7 @@ Manager::Manager(Settings *settings, QObject *parent) :
session.registerService("org.pebbled");
connect(dbus, SIGNAL(pebbleChanged()), adaptor, SIGNAL(pebbleChanged()));
connect(watch, SIGNAL(connectedChanged()), adaptor, SIGNAL(connectedChanged()));
+ connect(js, SIGNAL(appOpenUrl(QString)), adaptor, SIGNAL(openUrl(QString)));
QString currentProfile = getCurrentProfile();
defaultProfile = currentProfile.isEmpty() ? "ambience" : currentProfile;
@@ -397,3 +398,8 @@ void Manager::test()
js->showConfiguration();
}
+
+void Manager::onWebviewClosed(const QString &result)
+{
+ js->handleWebviewClosed(result);
+}
diff --git a/daemon/manager.h b/daemon/manager.h
index f1dd53e..b0e15fb 100644
--- a/daemon/manager.h
+++ b/daemon/manager.h
@@ -84,6 +84,7 @@ public slots:
private slots:
void test();
+ void onWebviewClosed(const QString &result);
void onSettingChanged(const QString &key);
void onSettingsChanged();
void onPebbleChanged();
@@ -123,7 +124,7 @@ public slots:
void disconnect() { static_cast<Manager*>(parent())->watch->disconnect(); }
void reconnect() { static_cast<Manager*>(parent())->watch->reconnect(); }
void test() { static_cast<Manager*>(parent())->test(); }
-
+ void webviewClosed(const QString &result) { static_cast<Manager*>(parent())->onWebviewClosed(result); }
};
#endif // MANAGER_H