Allow building without firebase

pull/455/head
Michael Zanetti 2020-10-24 00:12:46 +02:00
parent a1550d6bf7
commit 0b5b689101
11 changed files with 83 additions and 121 deletions

2
.gitignore vendored
View File

@ -9,3 +9,5 @@ Thumbs.db
/.qmake.stash /.qmake.stash
*.pro.user* *.pro.user*
packaging/android/nymeaapp.properties

View File

@ -54,10 +54,3 @@ DISTFILES += \
java/io/guh/nymeaapp/State.java \ java/io/guh/nymeaapp/State.java \
java/io/guh/nymeaapp/NymeaHost.java \ java/io/guh/nymeaapp/NymeaHost.java \
controlviews/Main.qml controlviews/Main.qml
QMAKE_COPY_DIR=cp -f -R -v
javafiles.commands = $(MKDIR) $${ANDROID_PACKAGE_SOURCE_DIR}/src;
javafiles.commands += $(COPY_DIR) $${PWD}/java/io $${ANDROID_PACKAGE_SOURCE_DIR}/src/
QMAKE_EXTRA_TARGETS += javafiles
POST_TARGETDEPS += javafiles

View File

@ -19,6 +19,7 @@ android: {
} else { } else {
ANDROID_PACKAGE_SOURCE_DIR = $${top_srcdir}/packaging/android ANDROID_PACKAGE_SOURCE_DIR = $${top_srcdir}/packaging/android
} }
message("Andorid package source dir $${ANDROID_PACKAGE_SOURCE_DIR}")
!no-firebase:DEFINES+=WITH_FIREBASE
} }

View File

@ -82,10 +82,16 @@ icons.path = /usr/share/
INSTALLS += desktopfile icons INSTALLS += desktopfile icons
} }
# Android service
android: { android: {
SUBDIRS += androidservice message("Android package source dir $${ANDROID_PACKAGE_SOURCE_DIR}")
androidservice.depends = libnymea-app SUBDIRS += androidservice
androidservice.depends = libnymea-app
NYMEA_APP_ROOT_PROPERTY="nymeaAppRoot=$${top_srcdir}"
no-firebase: FIREBASE_PROPERTY="useFirebase=false"
else: FIREBASE_PROPERTY="useFirebase=true"
write_file($${ANDROID_PACKAGE_SOURCE_DIR}/nymeaapp.properties, NYMEA_APP_ROOT_PROPERTY)
write_file($${ANDROID_PACKAGE_SOURCE_DIR}/nymeaapp.properties, FIREBASE_PROPERTY, append)
} }
# Linux desktop (snap package) # Linux desktop (snap package)

View File

@ -128,7 +128,6 @@ int main(int argc, char *argv[])
qmlRegisterSingletonType<NfcHelper>("Nymea", 1, 0, "NfcHelper", NfcHelper::nfcHelperProvider); qmlRegisterSingletonType<NfcHelper>("Nymea", 1, 0, "NfcHelper", NfcHelper::nfcHelperProvider);
qmlRegisterType<NfcThingActionWriter>("Nymea", 1, 0, "NfcThingActionWriter"); qmlRegisterType<NfcThingActionWriter>("Nymea", 1, 0, "NfcThingActionWriter");
PushNotifications::instance()->connectClient();
qmlRegisterSingletonType<PushNotifications>("Nymea", 1, 0, "PushNotifications", PushNotifications::pushNotificationsProvider); qmlRegisterSingletonType<PushNotifications>("Nymea", 1, 0, "PushNotifications", PushNotifications::pushNotificationsProvider);
qmlRegisterSingletonType<AppLogController>("Nymea", 1, 0, "AppLogController", AppLogController::appLogControllerProvider); qmlRegisterSingletonType<AppLogController>("Nymea", 1, 0, "AppLogController", AppLogController::appLogControllerProvider);
qmlRegisterSingletonType(QUrl("qrc:///ui/utils/NymeaUtils.qml"), "Nymea", 1, 0, "NymeaUtils" ); qmlRegisterSingletonType(QUrl("qrc:///ui/utils/NymeaUtils.qml"), "Nymea", 1, 0, "NymeaUtils" );

View File

@ -52,19 +52,8 @@ win32 {
android { android {
android-clang {
FIREBASE_STL_VARIANT = c++
}
isEmpty(FIREBASE_STL_VARIANT){
FIREBASE_STL_VARIANT = gnustl
}
include(../android_openssl/openssl.pri) include(../android_openssl/openssl.pri)
INCLUDEPATH += /opt/firebase_cpp_sdk/include
LIBS += -L/opt/firebase_cpp_sdk/libs/android/$$ANDROID_TARGET_ARCH/$$FIREBASE_STL_VARIANT/ -lfirebase_messaging -lfirebase_app
QT += androidextras webview QT += androidextras webview
HEADERS += platformintegration/android/platformhelperandroid.h HEADERS += platformintegration/android/platformhelperandroid.h
SOURCES += platformintegration/android/platformhelperandroid.cpp SOURCES += platformintegration/android/platformhelperandroid.cpp
@ -83,14 +72,18 @@ android {
$$ANDROID_PACKAGE_SOURCE_DIR/gradlew.bat \ $$ANDROID_PACKAGE_SOURCE_DIR/gradlew.bat \
$$ANDROID_PACKAGE_SOURCE_DIR/LICENSE \ $$ANDROID_PACKAGE_SOURCE_DIR/LICENSE \
platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java \ platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java \
platformintegration/android/java/io/guh/nymeaapp/NymeaAppNotificationService.java \ platformintegration/android/java-firebase/io/guh/nymeaapp/NymeaAppNotificationService.java \
QMAKE_COPY_DIR=cp -f -R -v !no-firebase: {
QMAKE_MKDIR_COMMAND=echo tralala; mkdir android-clang {
javafiles.commands = $(MKDIR) $${ANDROID_PACKAGE_SOURCE_DIR}/src/; FIREBASE_STL_VARIANT = c++
javafiles.commands += $(COPY_DIR) $${PWD}/platformintegration/android/java/io $${ANDROID_PACKAGE_SOURCE_DIR}/src/; }
QMAKE_EXTRA_TARGETS += javafiles isEmpty(FIREBASE_STL_VARIANT){
POST_TARGETDEPS += javafiles FIREBASE_STL_VARIANT = gnustl
}
INCLUDEPATH += /opt/firebase_cpp_sdk/include
LIBS += -L/opt/firebase_cpp_sdk/libs/android/$$ANDROID_TARGET_ARCH/$$FIREBASE_STL_VARIANT/ -lfirebase_messaging -lfirebase_app
}
} }
@ -172,11 +165,3 @@ BR=$$BRANDING
target.path = /usr/bin target.path = /usr/bin
INSTALLS += target INSTALLS += target
contains(ANDROID_TARGET_ARCH,) {
ANDROID_ABIS = \
armeabi-v7a \
arm64-v8a
}
ANDROID_ABIS = armeabi-v7a arm64-v8a

View File

@ -25,28 +25,8 @@ public class NymeaAppNotificationService extends FirebaseMessagingService {
private static final String TAG = "nymea-app: NymeaAppNotificationService"; private static final String TAG = "nymea-app: NymeaAppNotificationService";
/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
// [START receive_message]
@Override @Override
public void onMessageReceived(RemoteMessage remoteMessage) { public void onMessageReceived(RemoteMessage remoteMessage) {
// If the application is in the foreground handle both data and notification messages here.
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
sendNotification(remoteMessage);
}
// [END receive_message]
/**
* Create and show a simple notification containing the received FCM message.
*
* @param remoteMessage FCM RemoteMessage received.
*/
private void sendNotification(RemoteMessage remoteMessage) {
Intent intent = new Intent(this, NymeaAppActivity.class); Intent intent = new Intent(this, NymeaAppActivity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); // PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT);

View File

@ -6,8 +6,6 @@ import android.os.Bundle;
import android.os.Build; import android.os.Build;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.provider.Settings.Secure; import android.provider.Settings.Secure;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.ConnectionResult;
import android.os.Vibrator; import android.os.Vibrator;
public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActivity public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActivity
@ -34,16 +32,6 @@ public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActiv
return Build.DEVICE; return Build.DEVICE;
} }
public boolean checkPlayServices() {
try {
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
return resultCode == ConnectionResult.SUCCESS;
} catch (Exception e) {
Log.d(TAG, e.toString());
}
return true;
}
public void vibrate(int duration) public void vibrate(int duration)
{ {
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

View File

@ -32,7 +32,7 @@
#include <QDebug> #include <QDebug>
#if defined(Q_OS_ANDROID) #if defined Q_OS_ANDROID
#include <QtAndroid> #include <QtAndroid>
#include <QtAndroidExtras> #include <QtAndroidExtras>
#include <QAndroidJniObject> #include <QAndroidJniObject>
@ -41,7 +41,15 @@ static PushNotifications *m_client_pointer;
PushNotifications::PushNotifications(QObject *parent) : QObject(parent) PushNotifications::PushNotifications(QObject *parent) : QObject(parent)
{ {
connectClient(); #if defined Q_OS_ANDROID && defined WITH_FIREBASE
qDebug() << "Setting up firebase";
m_client_pointer = this;
m_firebaseApp = ::firebase::App::Create(::firebase::AppOptions(), QAndroidJniEnvironment(), QtAndroid::androidActivity().object());
m_firebase_initializer.Initialize(m_firebaseApp, nullptr, [](::firebase::App * fapp, void *) {
return ::firebase::messaging::Initialize( *fapp, (::firebase::messaging::Listener *)m_client_pointer);
});
#endif
#ifdef UBPORTS #ifdef UBPORTS
m_pushClient = new PushClient(this); m_pushClient = new PushClient(this);
@ -53,6 +61,13 @@ PushNotifications::PushNotifications(QObject *parent) : QObject(parent)
#endif #endif
} }
PushNotifications::~PushNotifications()
{
#if defined Q_OS_ANDROID && defined WITH_FIREBASE
::firebase::messaging::Terminate();
#endif
}
QObject *PushNotifications::pushNotificationsProvider(QQmlEngine *engine, QJSEngine *scriptEngine) QObject *PushNotifications::pushNotificationsProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
{ {
Q_UNUSED(engine) Q_UNUSED(engine)
@ -66,34 +81,6 @@ PushNotifications *PushNotifications::instance()
return pushNotifications; return pushNotifications;
} }
void PushNotifications::connectClient()
{
#ifdef Q_OS_ANDROID
jboolean playServicesAvailable = QtAndroid::androidActivity().callMethod<jboolean>("checkPlayServices", "()Z");
if (!playServicesAvailable) {
qDebug() << "Google Play Services not available. Cannot connect to push client";
return;
}
m_firebaseApp = ::firebase::App::Create(::firebase::AppOptions(), QAndroidJniEnvironment(),
QtAndroid::androidActivity().object());
m_client_pointer = this;
m_firebase_initializer.Initialize(m_firebaseApp, nullptr, [](::firebase::App * fapp, void *) {
return ::firebase::messaging::Initialize( *fapp, (::firebase::messaging::Listener *)m_client_pointer);
});
#endif
}
void PushNotifications::disconnectClient()
{
#ifdef Q_OS_ANDROID
::firebase::messaging::Terminate();
#endif
}
QString PushNotifications::token() const QString PushNotifications::token() const
{ {
return m_token; return m_token;
@ -106,7 +93,7 @@ void PushNotifications::setAPNSRegistrationToken(const QString &apnsRegistration
emit tokenChanged(); emit tokenChanged();
} }
#ifdef Q_OS_ANDROID #if defined Q_OS_ANDROID && defined WITH_FIREBASE
void PushNotifications::OnMessage(const firebase::messaging::Message &message) void PushNotifications::OnMessage(const firebase::messaging::Message &message)
{ {
qDebug() << "Firebase message received:" << QString::fromStdString(message.from); qDebug() << "Firebase message received:" << QString::fromStdString(message.from);

View File

@ -34,18 +34,17 @@
#include <QObject> #include <QObject>
#include <QQmlEngine> #include <QQmlEngine>
#ifdef Q_OS_ANDROID #if defined Q_OS_ANDROID && defined WITH_FIREBASE
#include "firebase/app.h" #include "firebase/app.h"
#include "firebase/messaging.h" #include "firebase/messaging.h"
#include "firebase/util.h" #include "firebase/util.h"
#elif UBPORTS
#include "platformintegration/ubports/pushclient.h"
#endif #endif
#ifdef Q_OS_ANDROID #if defined UBPORTS
#include "platformintegration/ubports/pushclient.h"
#endif
#if defined Q_OS_ANDROID && defined WITH_FIREBASE
class PushNotifications : public QObject, firebase::messaging::Listener class PushNotifications : public QObject, firebase::messaging::Listener
#else #else
class PushNotifications : public QObject class PushNotifications : public QObject
@ -56,13 +55,11 @@ class PushNotifications : public QObject
public: public:
explicit PushNotifications(QObject *parent = nullptr); explicit PushNotifications(QObject *parent = nullptr);
~PushNotifications();
static QObject* pushNotificationsProvider(QQmlEngine *engine, QJSEngine *scriptEngine); static QObject* pushNotificationsProvider(QQmlEngine *engine, QJSEngine *scriptEngine);
static PushNotifications* instance(); static PushNotifications* instance();
void connectClient();
void disconnectClient();
QString token() const; QString token() const;
// Called by Objective-C++ // Called by Objective-C++
@ -72,18 +69,18 @@ signals:
void tokenChanged(); void tokenChanged();
protected: protected:
#ifdef Q_OS_ANDROID
#if defined Q_OS_ANDROID && defined WITH_FIREBASE
//! Firebase overrides //! Firebase overrides
virtual void OnMessage(const ::firebase::messaging::Message &message) override; virtual void OnMessage(const ::firebase::messaging::Message &message) override;
virtual void OnTokenReceived(const char *token) override; virtual void OnTokenReceived(const char *token) override;
private: private:
::firebase::App *m_firebaseApp = nullptr; ::firebase::App *m_firebaseApp = nullptr;
::firebase::ModuleInitializer m_firebase_initializer; ::firebase::ModuleInitializer m_firebase_initializer;
#endif
#elif UBPORTS #if defined UBPORTS
PushClient *m_pushClient = nullptr; PushClient *m_pushClient = nullptr;
#endif #endif
private: private:

View File

@ -1,3 +1,13 @@
// Loading nymeapp.properties. This file must be generated by the .pro file
Properties properties = new Properties()
properties.load(project.rootProject.file("nymeaapp.properties").newDataInputStream())
def nymeaAppRoot = properties.getProperty('nymeaAppRoot')
def useFirebase = properties.getProperty('useFirebase')
println "Building Android package"
println "Package source root ${nymeaAppRoot}"
buildscript { buildscript {
repositories { repositories {
jcenter() jcenter()
@ -26,15 +36,20 @@ allprojects {
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
dependencies { dependencies {
compile fileTree(dir: 'libs', include: ['*.jar']) implementation fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.gms:play-services-base:15.0.1'
compile 'com.google.firebase:firebase-messaging:18.0.0'
compile 'com.google.firebase.messaging.cpp:firebase_messaging_cpp@aar'
implementation 'org.reactivestreams:reactive-streams:1.0.3' implementation 'org.reactivestreams:reactive-streams:1.0.3'
implementation 'io.reactivex.rxjava2:rxjava:2.2.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
if ("${useFirebase}" == "true") {
implementation 'com.google.android.gms:play-services-base:15.0.1'
implementation 'com.google.firebase:firebase-messaging:18.0.0'
implementation 'com.google.firebase.messaging.cpp:firebase_messaging_cpp@aar'
}
} }
apply plugin: 'com.google.gms.google-services' if ("${useFirebase}" == "true") {
apply plugin: 'com.google.gms.google-services'
}
android { android {
/******************************************************* /*******************************************************
@ -57,7 +72,16 @@ android {
sourceSets { sourceSets {
main { main {
manifest.srcFile 'AndroidManifest.xml' manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java'] java.srcDirs = [
qt5AndroidDir + '/src',
nymeaAppRoot + '/androidservice/java',
nymeaAppRoot + '/nymea-app/platformintegration/android/java',
'src',
'java']
if ("${useFirebase}" == "true") {
java.srcDirs += [nymeaAppRoot + '/nymea-app/platformintegration/android/java-firebase']
}
aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl'] aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
res.srcDirs = [qt5AndroidDir + '/res', 'res'] res.srcDirs = [qt5AndroidDir + '/res', 'res']
resources.srcDirs = ['src'] resources.srcDirs = ['src']