diff options
author | Assam Boudjelthia <assam.boudjelthia@qt.io> | 2020-03-04 14:42:13 +0200 |
---|---|---|
committer | Assam Boudjelthia <assam.boudjelthia@qt.io> | 2020-03-12 19:06:57 +0200 |
commit | a55cae70165206bd2a04306291fb3442968b69c3 (patch) | |
tree | f7b43a7d0eff5efc7c2ad5236770b7df2829a1c8 | |
parent | f4d122b2912e7bc13c9e076a32a6b5c080aa4825 (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>
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 Binary files differdeleted file mode 100644 index 035c600..0000000 --- a/examples/androidextras/notification/android-sources/res/drawable/icon.png +++ /dev/null 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 Binary files differnew file mode 100644 index 0000000..d3ccebe --- /dev/null +++ b/examples/androidextras/notification/android/res/drawable-hdpi/icon.png diff --git a/examples/androidextras/notification/android/res/drawable-ldpi/icon.png b/examples/androidextras/notification/android/res/drawable-ldpi/icon.png Binary files differnew file mode 100644 index 0000000..2194be1 --- /dev/null +++ b/examples/androidextras/notification/android/res/drawable-ldpi/icon.png diff --git a/examples/androidextras/notification/android/res/drawable-mdpi/icon.png b/examples/androidextras/notification/android/res/drawable-mdpi/icon.png Binary files differnew file mode 100644 index 0000000..31812cc --- /dev/null +++ b/examples/androidextras/notification/android/res/drawable-mdpi/icon.png diff --git a/examples/androidextras/notification/android/res/drawable-xhdpi/icon.png b/examples/androidextras/notification/android/res/drawable-xhdpi/icon.png Binary files differnew file mode 100644 index 0000000..3aeae64 --- /dev/null +++ b/examples/androidextras/notification/android/res/drawable-xhdpi/icon.png diff --git a/examples/androidextras/notification/android/res/drawable-xxhdpi/icon.png b/examples/androidextras/notification/android/res/drawable-xxhdpi/icon.png Binary files differnew file mode 100644 index 0000000..f754fd1 --- /dev/null +++ b/examples/androidextras/notification/android/res/drawable-xxhdpi/icon.png diff --git a/examples/androidextras/notification/android/res/drawable-xxxhdpi/icon.png b/examples/androidextras/notification/android/res/drawable-xxxhdpi/icon.png Binary files differnew file mode 100644 index 0000000..d0d043b --- /dev/null +++ b/examples/androidextras/notification/android/res/drawable-xxxhdpi/icon.png 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 Binary files differindex 89784ea..6d7dba6 100644 --- a/src/androidextras/doc/images/notification.png +++ b/src/androidextras/doc/images/notification.png |