summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAssam Boudjelthia <assam.boudjelthia@qt.io>2020-03-04 14:42:13 +0200
committerAssam Boudjelthia <assam.boudjelthia@qt.io>2020-03-12 19:06:57 +0200
commita55cae70165206bd2a04306291fb3442968b69c3 (patch)
treef7b43a7d0eff5efc7c2ad5236770b7df2829a1c8
parentf4d122b2912e7bc13c9e076a32a6b5c080aa4825 (diff)
Fix notification example crashing
The notification example needed some fixing because it was crashing, now passing context from C++ side. There are some changes to the Android Notification API, so some changes has to be made to make sure the example works for different old and new Android API levels. + Updating the icons. Task-number: QTBUG-80717 Change-Id: I1560e31b73233895053b1a9a6a523a7b163c5d89 Reviewed-by: BogDan Vatra <bogdan@kdab.com>
-rw-r--r--examples/androidextras/notification/android-sources/AndroidManifest.xml40
-rw-r--r--examples/androidextras/notification/android-sources/res/drawable/icon.pngbin3264 -> 0 bytes
-rw-r--r--examples/androidextras/notification/android/AndroidManifest.xml87
-rw-r--r--examples/androidextras/notification/android/res/drawable-hdpi/icon.pngbin0 -> 3654 bytes
-rw-r--r--examples/androidextras/notification/android/res/drawable-ldpi/icon.pngbin0 -> 1432 bytes
-rw-r--r--examples/androidextras/notification/android/res/drawable-mdpi/icon.pngbin0 -> 1998 bytes
-rw-r--r--examples/androidextras/notification/android/res/drawable-xhdpi/icon.pngbin0 -> 4549 bytes
-rw-r--r--examples/androidextras/notification/android/res/drawable-xxhdpi/icon.pngbin0 -> 9275 bytes
-rw-r--r--examples/androidextras/notification/android/res/drawable-xxxhdpi/icon.pngbin0 -> 12866 bytes
-rw-r--r--examples/androidextras/notification/android/src/org/qtproject/example/notification/NotificationClient.java (renamed from examples/androidextras/notification/android-sources/src/org/qtproject/example/notification/NotificationClient.java)47
-rw-r--r--examples/androidextras/notification/doc/src/qtandroidextras-example-notification.qdoc13
-rw-r--r--examples/androidextras/notification/notification.pro12
-rw-r--r--examples/androidextras/notification/notificationclient.cpp12
-rw-r--r--src/androidextras/doc/images/notification.pngbin23282 -> 31483 bytes
14 files changed, 140 insertions, 71 deletions
diff --git a/examples/androidextras/notification/android-sources/AndroidManifest.xml b/examples/androidextras/notification/android-sources/AndroidManifest.xml
deleted file mode 100644
index 2434bbb..0000000
--- a/examples/androidextras/notification/android-sources/AndroidManifest.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0"?>
-<manifest package="org.qtproject.example.notification" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
- <application android:icon="@drawable/icon" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="@string/app_name" android:hardwareAccelerated="true" android:extractNativeLibs="true">
- <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="org.qtproject.example.notification.NotificationClient" android:label="Qt Notifier" android:screenOrientation="unspecified" android:launchMode="singleTop">
- <intent-filter>
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
- <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
- <meta-data android:name="android.app.repository" android:value="default"/>
- <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
- <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
- <!-- Deploy Qt libs as part of package -->
- <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
- <!-- Run with local libs -->
- <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
- <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
- <meta-data android:name="android.app.load_local_libs_resource_id" android:resource="@array/load_local_libs"/>
- <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
- <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
- <!-- Messages maps -->
- <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
- <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
- <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
- <!-- Messages maps -->
- <!-- Splash screen -->
- <!--
- <meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/>
- -->
- <!-- Splash screen -->
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="21"/>
- <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
- <!-- %%INSERT_PERMISSIONS -->
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
- <!-- %%INSERT_FEATURES -->
-</manifest>
diff --git a/examples/androidextras/notification/android-sources/res/drawable/icon.png b/examples/androidextras/notification/android-sources/res/drawable/icon.png
deleted file mode 100644
index 035c600..0000000
--- a/examples/androidextras/notification/android-sources/res/drawable/icon.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidextras/notification/android/AndroidManifest.xml b/examples/androidextras/notification/android/AndroidManifest.xml
new file mode 100644
index 0000000..903db5b
--- /dev/null
+++ b/examples/androidextras/notification/android/AndroidManifest.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>
+<manifest package="org.qtproject.example.notification" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
+ <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28"/>
+
+ <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
+ Remove the comment if you do not require these default permissions. -->
+ <!-- %%INSERT_PERMISSIONS -->
+
+ <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
+ Remove the comment if you do not require these default features. -->
+ <!-- %%INSERT_FEATURES -->
+
+ <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
+
+ <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="Qt Notifier" android:extractNativeLibs="true" android:icon="@drawable/icon">
+ <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="-- %%INSERT_APP_NAME%% --" android:screenOrientation="unspecified" android:launchMode="singleTop">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+
+ <!-- Application arguments -->
+ <!-- meta-data android:name="android.app.arguments" android:value="arg1 arg2 arg3"/ -->
+ <!-- Application arguments -->
+
+ <meta-data android:name="android.app.lib_name" android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
+ <meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
+ <meta-data android:name="android.app.repository" android:value="default"/>
+ <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
+ <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
+ <!-- Deploy Qt libs as part of package -->
+ <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
+
+ <!-- Run with local libs -->
+ <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
+ <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
+ <meta-data android:name="android.app.load_local_libs_resource_id" android:resource="@array/load_local_libs"/>
+ <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
+ <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
+ <!-- Used to specify custom system library path to run with local system libs -->
+ <!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> -->
+ <!-- Messages maps -->
+ <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
+ <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
+ <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
+ <meta-data android:value="@string/unsupported_android_version" android:name="android.app.unsupported_android_version"/>
+ <!-- Messages maps -->
+
+ <!-- Splash screen -->
+ <!-- Orientation-specific (portrait/landscape) data is checked first. If not available for current orientation,
+ then android.app.splash_screen_drawable. For best results, use together with splash_screen_sticky and
+ use hideSplashScreen() with a fade-out animation from Qt Android Extras to hide the splash screen when you
+ are done populating your window with content. -->
+ <!-- meta-data android:name="android.app.splash_screen_drawable_portrait" android:resource="@drawable/logo_portrait" / -->
+ <!-- meta-data android:name="android.app.splash_screen_drawable_landscape" android:resource="@drawable/logo_landscape" / -->
+ <!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
+ <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
+ <!-- Splash screen -->
+
+ <!-- Background running -->
+ <!-- Warning: changing this value to true may cause unexpected crashes if the
+ application still try to draw after
+ "applicationStateChanged(Qt::ApplicationSuspended)"
+ signal is sent! -->
+ <meta-data android:name="android.app.background_running" android:value="false"/>
+ <!-- Background running -->
+
+ <!-- auto screen scale factor -->
+ <meta-data android:name="android.app.auto_screen_scale_factor" android:value="false"/>
+ <!-- auto screen scale factor -->
+
+ <!-- extract android style -->
+ <!-- available android:values :
+ * default - In most cases this will be the same as "full", but it can also be something else if needed, e.g., for compatibility reasons
+ * full - useful QWidget & Quick Controls 1 apps
+ * minimal - useful for Quick Controls 2 apps, it is much faster than "full"
+ * none - useful for apps that don't use any of the above Qt modules
+ -->
+ <meta-data android:name="android.app.extract_android_style" android:value="default"/>
+ <!-- extract android style -->
+ </activity>
+
+ <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
+
+ </application>
+
+</manifest>
diff --git a/examples/androidextras/notification/android/res/drawable-hdpi/icon.png b/examples/androidextras/notification/android/res/drawable-hdpi/icon.png
new file mode 100644
index 0000000..d3ccebe
--- /dev/null
+++ b/examples/androidextras/notification/android/res/drawable-hdpi/icon.png
Binary files differ
diff --git a/examples/androidextras/notification/android/res/drawable-ldpi/icon.png b/examples/androidextras/notification/android/res/drawable-ldpi/icon.png
new file mode 100644
index 0000000..2194be1
--- /dev/null
+++ b/examples/androidextras/notification/android/res/drawable-ldpi/icon.png
Binary files differ
diff --git a/examples/androidextras/notification/android/res/drawable-mdpi/icon.png b/examples/androidextras/notification/android/res/drawable-mdpi/icon.png
new file mode 100644
index 0000000..31812cc
--- /dev/null
+++ b/examples/androidextras/notification/android/res/drawable-mdpi/icon.png
Binary files differ
diff --git a/examples/androidextras/notification/android/res/drawable-xhdpi/icon.png b/examples/androidextras/notification/android/res/drawable-xhdpi/icon.png
new file mode 100644
index 0000000..3aeae64
--- /dev/null
+++ b/examples/androidextras/notification/android/res/drawable-xhdpi/icon.png
Binary files differ
diff --git a/examples/androidextras/notification/android/res/drawable-xxhdpi/icon.png b/examples/androidextras/notification/android/res/drawable-xxhdpi/icon.png
new file mode 100644
index 0000000..f754fd1
--- /dev/null
+++ b/examples/androidextras/notification/android/res/drawable-xxhdpi/icon.png
Binary files differ
diff --git a/examples/androidextras/notification/android/res/drawable-xxxhdpi/icon.png b/examples/androidextras/notification/android/res/drawable-xxxhdpi/icon.png
new file mode 100644
index 0000000..d0d043b
--- /dev/null
+++ b/examples/androidextras/notification/android/res/drawable-xxxhdpi/icon.png
Binary files differ
diff --git a/examples/androidextras/notification/android-sources/src/org/qtproject/example/notification/NotificationClient.java b/examples/androidextras/notification/android/src/org/qtproject/example/notification/NotificationClient.java
index fd0ad5a..84adcf0 100644
--- a/examples/androidextras/notification/android-sources/src/org/qtproject/example/notification/NotificationClient.java
+++ b/examples/androidextras/notification/android/src/org/qtproject/example/notification/NotificationClient.java
@@ -53,28 +53,43 @@ package org.qtproject.example.notification;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
+import android.content.Intent;
+import android.app.PendingIntent;
+import android.graphics.Color;
+import android.graphics.BitmapFactory;
+import android.app.NotificationChannel;
-public class NotificationClient extends org.qtproject.qt5.android.bindings.QtActivity
+public class NotificationClient
{
private static NotificationManager m_notificationManager;
private static Notification.Builder m_builder;
- private static NotificationClient m_instance;
- public NotificationClient()
- {
- m_instance = this;
- }
+ public NotificationClient() {}
- public static void notify(String s)
- {
- if (m_notificationManager == null) {
- m_notificationManager = (NotificationManager)m_instance.getSystemService(Context.NOTIFICATION_SERVICE);
- m_builder = new Notification.Builder(m_instance);
- m_builder.setSmallIcon(R.drawable.icon);
- m_builder.setContentTitle("A message from Qt!");
- }
+ public static void notify(Context context, String message) {
+ try {
+ m_notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+
+ if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
+ int importance = NotificationManager.IMPORTANCE_DEFAULT;
+ NotificationChannel notificationChannel = new NotificationChannel("Qt", "Qt Notifier", importance);
+ m_notificationManager.createNotificationChannel(notificationChannel);
+ m_builder = new Notification.Builder(context, notificationChannel.getId());
+ } else {
+ m_builder = new Notification.Builder(context);
+ }
- m_builder.setContentText(s);
- m_notificationManager.notify(1, m_builder.build());
+ m_builder.setSmallIcon(R.drawable.ic_launcher)
+ .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher))
+ .setContentTitle("A message from Qt!")
+ .setContentText(message)
+ .setDefaults(Notification.DEFAULT_SOUND)
+ .setColor(Color.GREEN)
+ .setAutoCancel(true);
+
+ m_notificationManager.notify(0, m_builder.build());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
}
}
diff --git a/examples/androidextras/notification/doc/src/qtandroidextras-example-notification.qdoc b/examples/androidextras/notification/doc/src/qtandroidextras-example-notification.qdoc
index 0bc08c1..a042af5 100644
--- a/examples/androidextras/notification/doc/src/qtandroidextras-example-notification.qdoc
+++ b/examples/androidextras/notification/doc/src/qtandroidextras-example-notification.qdoc
@@ -47,7 +47,7 @@
We define a custom Java class called \c NotificationClient in the
NotificationClient.java file:
- \quotefromfile notification/android-sources/src/org/qtproject/example/notification/NotificationClient.java
+ \quotefromfile notification/android/src/org/qtproject/example/notification/NotificationClient.java
\skipto org.qtproject.example.notification
\printuntil /^\}/
@@ -71,12 +71,19 @@
\printuntil notificationClient);
In the NotificationClient C++ class source file, notificationclient.cpp, we
- import the QtAndroidJniObject class to be able to use its functions:
+ import the QtAndroid class:
\quotefromfile notification/notificationclient.cpp
- \skipto QAndroidJniObject
+ \skipto <QtAndroid
\printuntil >
+ This will allow us to use \c QAndroidJniObject for JNI calls, and also allow
+ us to pass our application's context to the Java methods as in:
+
+ \code
+ QtAndroid::androidContext().object()
+ \endcode
+
We connect the \c notificationChanged() signal to the
\c updateAndroidNotification() slot to update the notification text when the
\c notification property changes:
diff --git a/examples/androidextras/notification/notification.pro b/examples/androidextras/notification/notification.pro
index a3ce911..b2fdec8 100644
--- a/examples/androidextras/notification/notification.pro
+++ b/examples/androidextras/notification/notification.pro
@@ -1,16 +1,9 @@
QT += quick androidextras
-ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android-sources
-
SOURCES += \
main.cpp \
notificationclient.cpp
-OTHER_FILES += \
- qml/main.qml \
- android-sources/src/org/qtproject/example/notification/NotificationClient.java \
- android-sources/AndroidManifest.xml
-
RESOURCES += \
main.qrc
@@ -19,3 +12,8 @@ HEADERS += \
target.path = $$[QT_INSTALL_EXAMPLES]/androidextras/notification
INSTALLS += target
+
+ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
+OTHER_FILES += \
+ android/src/org/qtproject/example/notification/NotificationClient.java \
+ android/AndroidManifest.xml
diff --git a/examples/androidextras/notification/notificationclient.cpp b/examples/androidextras/notification/notificationclient.cpp
index 77b942c..871d889 100644
--- a/examples/androidextras/notification/notificationclient.cpp
+++ b/examples/androidextras/notification/notificationclient.cpp
@@ -50,7 +50,7 @@
#include "notificationclient.h"
-#include <QtAndroidExtras/QAndroidJniObject>
+#include <QtAndroid>
NotificationClient::NotificationClient(QObject *parent)
: QObject(parent)
@@ -75,8 +75,10 @@ QString NotificationClient::notification() const
void NotificationClient::updateAndroidNotification()
{
QAndroidJniObject javaNotification = QAndroidJniObject::fromString(m_notification);
- QAndroidJniObject::callStaticMethod<void>("org/qtproject/example/notification/NotificationClient",
- "notify",
- "(Ljava/lang/String;)V",
- javaNotification.object<jstring>());
+ QAndroidJniObject::callStaticMethod<void>(
+ "org/qtproject/example/notification/NotificationClient",
+ "notify",
+ "(Landroid/content/Context;Ljava/lang/String;)V",
+ QtAndroid::androidContext().object(),
+ javaNotification.object<jstring>());
}
diff --git a/src/androidextras/doc/images/notification.png b/src/androidextras/doc/images/notification.png
index 89784ea..6d7dba6 100644
--- a/src/androidextras/doc/images/notification.png
+++ b/src/androidextras/doc/images/notification.png
Binary files differ