mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-28 00:49:28 -05:00
Implement notifications on Android
Notify when there are unread messages
This commit is contained in:
parent
d540900df5
commit
5be6094214
@ -27,6 +27,8 @@
|
||||
#endif
|
||||
|
||||
#include "libresapilocalclient.h"
|
||||
#include "notificationsbridge.h"
|
||||
|
||||
#include "retroshare/rsinit.h"
|
||||
|
||||
|
||||
@ -42,9 +44,13 @@ int main(int argc, char *argv[])
|
||||
sockPath.append("/libresapi.sock");
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
qmlRegisterType<LibresapiLocalClient>(
|
||||
"org.retroshare.qml_components.LibresapiLocalClient", 1, 0,
|
||||
"LibresapiLocalClient");
|
||||
|
||||
qmlRegisterType<NotificationsBridge>(
|
||||
"org.retroshare.qml_components.NotificationsBridge", 1, 0,
|
||||
"NotificationsBridge");
|
||||
NotificationsBridge notificationsBridge;
|
||||
engine.rootContext()->setContextProperty("notificationsBridge",
|
||||
¬ificationsBridge);
|
||||
|
||||
#ifdef QT_DEBUG
|
||||
engine.rootContext()->setContextProperty("QT_DEBUG", true);
|
||||
@ -66,8 +72,12 @@ int main(int argc, char *argv[])
|
||||
|
||||
rsApi.openConnection(sockPath);
|
||||
|
||||
qmlRegisterType<LibresapiLocalClient>(
|
||||
"org.retroshare.qml_components.LibresapiLocalClient", 1, 0,
|
||||
"LibresapiLocalClient");
|
||||
engine.rootContext()->setContextProperty("rsApi", &rsApi);
|
||||
engine.load(QUrl(QLatin1String("qrc:/notify.qml")));
|
||||
|
||||
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
|
||||
|
||||
return app.exec();
|
||||
}
|
@ -25,21 +25,24 @@ QtObject
|
||||
id: notifyRoot
|
||||
|
||||
property alias coreReady: coreWatcher.coreReady
|
||||
|
||||
property AutologinManager _aM: AutologinManager { id: coreWatcher }
|
||||
|
||||
onCoreReadyChanged: if(coreReady) refreshUnread()
|
||||
|
||||
property AutologinManager coreWatcher: AutologinManager { id: coreWatcher }
|
||||
|
||||
function refreshUnreadCallback(par)
|
||||
{
|
||||
console.log("notifyRoot.refreshUnreadCB()")
|
||||
var json = JSON.parse(par.response)
|
||||
TokensManager.registerToken(json.statetoken, refreshUnread)
|
||||
if(json.data.length > 0)
|
||||
var convCnt = json.data.length
|
||||
if(convCnt > 0)
|
||||
{
|
||||
console.log("notifyRoot.refreshUnreadCB() got", json.data.length,
|
||||
"unread messages")
|
||||
//TODO: display android notification
|
||||
"unread conversations")
|
||||
notificationsBridge.notify(
|
||||
qsTr("New message!"),
|
||||
qsTr("Unread messages in %1 conversations").arg(convCnt)
|
||||
)
|
||||
}
|
||||
}
|
||||
function refreshUnread()
|
44
retroshare-android-notify-service/src/notificationsbridge.h
Normal file
44
retroshare-android-notify-service/src/notificationsbridge.h
Normal file
@ -0,0 +1,44 @@
|
||||
#pragma once
|
||||
/*
|
||||
* RetroShare Android Service
|
||||
* Copyright (C) 2017 Gioacchino Mazzurco <gio@eigenlab.org>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <QtAndroidExtras/QAndroidJniObject>
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QtAndroid>
|
||||
#include <QDebug>
|
||||
|
||||
struct NotificationsBridge : QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public slots:
|
||||
static void notify(const QString& title, const QString& text = "",
|
||||
const QString& uri = "")
|
||||
{
|
||||
qDebug() << __PRETTY_FUNCTION__ << title << text << uri;
|
||||
|
||||
QtAndroid::androidService().callMethod<void>(
|
||||
"notify",
|
||||
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
|
||||
QAndroidJniObject::fromString(title).object(),
|
||||
QAndroidJniObject::fromString(text).object(),
|
||||
QAndroidJniObject::fromString(uri).object()
|
||||
);
|
||||
}
|
||||
};
|
@ -1,6 +1,6 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>notify.qml</file>
|
||||
<file>main.qml</file>
|
||||
<file>TokensManager.qml</file>
|
||||
<file>AutologinManager.qml</file>
|
||||
<file>qmldir</file>
|
||||
|
@ -10,11 +10,17 @@ CONFIG += dll
|
||||
|
||||
RESOURCES += qml.qrc
|
||||
|
||||
android-g++:TEMPLATE = lib
|
||||
!android-g++:TEMPLATE = app
|
||||
TEMPLATE = app
|
||||
|
||||
android-g++
|
||||
{
|
||||
TEMPLATE = lib
|
||||
QT += androidextras
|
||||
HEADERS += notificationsbridge.h
|
||||
}
|
||||
|
||||
HEADERS += libresapilocalclient.h
|
||||
SOURCES += libresapilocalclient.cpp notify.cpp
|
||||
SOURCES += libresapilocalclient.cpp main.cpp
|
||||
|
||||
DEPENDPATH *= ../../libretroshare/src
|
||||
INCLUDEPATH *= ../../libretroshare/src
|
||||
|
@ -5,9 +5,10 @@
|
||||
android:installLocation="auto">
|
||||
<application android:name="org.qtproject.qt5.android.bindings.QtApplication"
|
||||
android:hardwareAccelerated="true"
|
||||
android:label="RetroShare">
|
||||
android:label="RetroShare"
|
||||
android:icon="@drawable/retroshare06_128x128">
|
||||
<activity android:name=".RetroShareQmlActivity"
|
||||
android:label="RetroShare QML"
|
||||
android:label="RetroShare"
|
||||
android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation"
|
||||
android:screenOrientation="unspecified"
|
||||
android:launchMode="singleTask">
|
||||
|
@ -0,0 +1 @@
|
||||
../../../../../data/128x128/apps/retroshare06.png
|
@ -0,0 +1 @@
|
||||
../../../../../data/48x48/apps/retroshare06.png
|
@ -18,6 +18,40 @@
|
||||
|
||||
package org.retroshare.android.qml_app;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.app.TaskStackBuilder;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
|
||||
import org.qtproject.qt5.android.bindings.QtService;
|
||||
|
||||
public class RetroShareAndroidNotifyService extends QtService {}
|
||||
public class RetroShareAndroidNotifyService extends QtService
|
||||
{
|
||||
@UsedByNativeCode @SuppressWarnings("unused")
|
||||
public void notify(String title, String text, String uri)
|
||||
{
|
||||
Notification.Builder mBuilder = new Notification.Builder(this);
|
||||
mBuilder.setSmallIcon(R.drawable.retroshare06_48x48)
|
||||
.setContentTitle(title)
|
||||
.setContentText(text)
|
||||
.setAutoCancel(true);
|
||||
|
||||
Intent resultIntent = new Intent(this, RetroShareQmlActivity.class);
|
||||
if(!uri.isEmpty()) resultIntent.setData(Uri.parse(uri));
|
||||
|
||||
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
|
||||
stackBuilder.addParentStack(RetroShareQmlActivity.class);
|
||||
stackBuilder.addNextIntent(resultIntent);
|
||||
PendingIntent resultPendingIntent =
|
||||
stackBuilder.getPendingIntent( 0,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT );
|
||||
|
||||
mBuilder.setContentIntent(resultPendingIntent);
|
||||
NotificationManager mNotificationManager =
|
||||
(NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
mNotificationManager.notify(0, mBuilder.build());
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,3 @@
|
||||
package org.retroshare.android.qml_app;
|
||||
|
||||
public @interface UsedByNativeCode {}
|
Loading…
Reference in New Issue
Block a user