diff options
Diffstat (limited to 'examples/corelib')
22 files changed, 613 insertions, 1 deletions
diff --git a/examples/corelib/CMakeLists.txt b/examples/corelib/CMakeLists.txt index 9ec9dcb156..08b44649b7 100644 --- a/examples/corelib/CMakeLists.txt +++ b/examples/corelib/CMakeLists.txt @@ -4,6 +4,7 @@ add_subdirectory(ipc) add_subdirectory(mimetypes) add_subdirectory(serialization) add_subdirectory(tools) +add_subdirectory(platform) if(QT_FEATURE_thread) add_subdirectory(threads) endif() diff --git a/examples/corelib/corelib.pro b/examples/corelib/corelib.pro index 8caf2c16df..625957ca1a 100644 --- a/examples/corelib/corelib.pro +++ b/examples/corelib/corelib.pro @@ -5,6 +5,7 @@ SUBDIRS = \ ipc \ mimetypes \ serialization \ - tools + tools \ + platform qtConfig(thread): SUBDIRS += threads diff --git a/examples/corelib/platform/CMakeLists.txt b/examples/corelib/platform/CMakeLists.txt new file mode 100644 index 0000000000..1a10578a1f --- /dev/null +++ b/examples/corelib/platform/CMakeLists.txt @@ -0,0 +1,3 @@ +if(ANDROID) + add_subdirectory(androidnotifier) +endif() diff --git a/examples/corelib/platform/androidnotifier/CMakeLists.txt b/examples/corelib/platform/androidnotifier/CMakeLists.txt new file mode 100644 index 0000000000..1dca63faf2 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/CMakeLists.txt @@ -0,0 +1,55 @@ +cmake_minimum_required(VERSION 3.14) +project(androidnotifier LANGUAGES CXX) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED) + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/corelib/platform/androidnotifier") + +set(PROJECT_SOURCES + main.cpp + notificationclient.cpp + notificationclient.h +) + +if(ANDROID) + qt_add_executable(androidnotifier + MANUAL_FINALIZATION + ${PROJECT_SOURCES}) + target_link_libraries(androidnotifier PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) + + set_property(TARGET androidnotifier APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR + ${CMAKE_CURRENT_SOURCE_DIR}/android) + + if(QT_VERSION_MAJOR EQUAL 6) + qt_finalize_executable(androidnotifier) + endif() + + set(qml_resource_files + "images/happy.png" + "images/sad.png" + ) + + qt6_add_resources(androidnotifier "main" + PREFIX + "/" + FILES + ${qml_resource_files} + ) + + install(TARGETS androidnotifier + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" + ) +endif() diff --git a/examples/corelib/platform/androidnotifier/android/AndroidManifest.xml b/examples/corelib/platform/androidnotifier/android/AndroidManifest.xml new file mode 100644 index 0000000000..d53be9b3f3 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/android/AndroidManifest.xml @@ -0,0 +1,76 @@ +<?xml version="1.0"?> +<manifest package="org.qtproject.example.androidnotifier" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto"> + + <!-- 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.qt.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.qt.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="none"/> + <!-- extract android style --> + </activity> + <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices --> + </application> +</manifest> diff --git a/examples/corelib/platform/androidnotifier/android/res/drawable-hdpi/icon.png b/examples/corelib/platform/androidnotifier/android/res/drawable-hdpi/icon.png Binary files differnew file mode 100644 index 0000000000..d3ccebe1f2 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/android/res/drawable-hdpi/icon.png diff --git a/examples/corelib/platform/androidnotifier/android/res/drawable-ldpi/icon.png b/examples/corelib/platform/androidnotifier/android/res/drawable-ldpi/icon.png Binary files differnew file mode 100644 index 0000000000..2194be145e --- /dev/null +++ b/examples/corelib/platform/androidnotifier/android/res/drawable-ldpi/icon.png diff --git a/examples/corelib/platform/androidnotifier/android/res/drawable-mdpi/icon.png b/examples/corelib/platform/androidnotifier/android/res/drawable-mdpi/icon.png Binary files differnew file mode 100644 index 0000000000..31812ccdd9 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/android/res/drawable-mdpi/icon.png diff --git a/examples/corelib/platform/androidnotifier/android/res/drawable-xhdpi/icon.png b/examples/corelib/platform/androidnotifier/android/res/drawable-xhdpi/icon.png Binary files differnew file mode 100644 index 0000000000..3aeae642d9 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/android/res/drawable-xhdpi/icon.png diff --git a/examples/corelib/platform/androidnotifier/android/res/drawable-xxhdpi/icon.png b/examples/corelib/platform/androidnotifier/android/res/drawable-xxhdpi/icon.png Binary files differnew file mode 100644 index 0000000000..f754fd18ae --- /dev/null +++ b/examples/corelib/platform/androidnotifier/android/res/drawable-xxhdpi/icon.png diff --git a/examples/corelib/platform/androidnotifier/android/res/drawable-xxxhdpi/icon.png b/examples/corelib/platform/androidnotifier/android/res/drawable-xxxhdpi/icon.png Binary files differnew file mode 100644 index 0000000000..d0d043bf9c --- /dev/null +++ b/examples/corelib/platform/androidnotifier/android/res/drawable-xxxhdpi/icon.png diff --git a/examples/corelib/platform/androidnotifier/android/src/org/qtproject/example/androidnotifier/NotificationClient.java b/examples/corelib/platform/androidnotifier/android/src/org/qtproject/example/androidnotifier/NotificationClient.java new file mode 100644 index 0000000000..c43513b17a --- /dev/null +++ b/examples/corelib/platform/androidnotifier/android/src/org/qtproject/example/androidnotifier/NotificationClient.java @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +package org.qtproject.example.androidnotifier; + +import android.app.Notification; +import android.app.NotificationManager; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.BitmapFactory; +import android.app.NotificationChannel; + +public class NotificationClient +{ + public static void notify(Context context, String message) { + try { + NotificationManager m_notificationManager = (NotificationManager) + context.getSystemService(Context.NOTIFICATION_SERVICE); + + Notification.Builder m_builder; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + int importance = NotificationManager.IMPORTANCE_DEFAULT; + NotificationChannel 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); + } + + Bitmap icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon); + m_builder.setSmallIcon(R.drawable.icon) + .setLargeIcon(icon) + .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/corelib/platform/androidnotifier/androidnotifier.pro b/examples/corelib/platform/androidnotifier/androidnotifier.pro new file mode 100644 index 0000000000..f1650c1911 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/androidnotifier.pro @@ -0,0 +1,20 @@ +QT += core gui +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +SOURCES += \ + main.cpp \ + notificationclient.cpp + +HEADERS += \ + notificationclient.h + +RESOURCES += \ + main.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/corelib/platform/androidnotifier +INSTALLS += target + +ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android +OTHER_FILES += \ + android/src/org/qtproject/example/androidnotifier/NotificationClient.java \ + android/AndroidManifest.xml diff --git a/examples/corelib/platform/androidnotifier/doc/images/androidnotifier.png b/examples/corelib/platform/androidnotifier/doc/images/androidnotifier.png Binary files differnew file mode 100644 index 0000000000..36a4a50c47 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/doc/images/androidnotifier.png diff --git a/examples/corelib/platform/androidnotifier/doc/src/androidnotifier-example.qdoc b/examples/corelib/platform/androidnotifier/doc/src/androidnotifier-example.qdoc new file mode 100644 index 0000000000..b1e4243d56 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/doc/src/androidnotifier-example.qdoc @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \title Qt Android Notifier + \example platform/androidnotifier + \brief Demonstrates calling Java code from Qt in an Android application. + + \image androidnotifier.png + + This example demonstrates how to add a custom Java class to an Android + application, and how to call it using the JNI convenience APIs in Qt. + + Click on one of the smiley faces to send a notification in the status bar + of the Android screen. + + \include examples-run.qdocinc + + \section1 Calling Java Methods from C++ Code + + We define a custom Java class called \c NotificationClient in the + NotificationClient.java file: + + \quotefromfile platform/androidnotifier/android/src/org/qtproject/example/androidnotifier/NotificationClient.java + \skipto org.qtproject.example.androidnotifier + \printuntil /^\}/ + + In the NotificationClient C++ class header file, \c notificationclient.h, we + declare a simple C++ API to display notifications on an Android device. It + consists of a single string property, \c notification, and a slot, + \c updateAndroidNotification(), that calls the Java code: + + \snippet platform/androidnotifier/notificationclient.h Qt Notification Class + + We connect the \c notificationChanged() signal to the + \c updateAndroidNotification() slot to update the notification text when the + \c notification text changes: + + \snippet platform/androidnotifier/notificationclient.cpp notification changed signal + + The \c updateAndroidNotification() function calls the Java method responsible + for sending the notification from the Android platform APIs. First, we construct + a Java string \c jstring from the notification string, then pass the \c jstring + object as a parameter to the \c notify() method in Java: + + \snippet platform/androidnotifier/notificationclient.cpp Send notification message to Java + + The call to the Java meethod use \l QJniObject which relies on the Java Native + Interface (JNI) APIs to communicate with Java. Also, in the previous snippet, + we are passing the app's context object which the the static Java code can use + to tap into the app's specific properties and APIs. + + To make sure our smiley buttons do what they are supposed to, we add the + the following code to change the notification text if either of them are + clicked: + + \snippet platform/androidnotifier/main.cpp Connect button signals + + \sa {Qt for Android} +*/ diff --git a/examples/corelib/platform/androidnotifier/images/happy.png b/examples/corelib/platform/androidnotifier/images/happy.png Binary files differnew file mode 100644 index 0000000000..af9412c2fb --- /dev/null +++ b/examples/corelib/platform/androidnotifier/images/happy.png diff --git a/examples/corelib/platform/androidnotifier/images/sad.png b/examples/corelib/platform/androidnotifier/images/sad.png Binary files differnew file mode 100644 index 0000000000..928184b413 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/images/sad.png diff --git a/examples/corelib/platform/androidnotifier/main.cpp b/examples/corelib/platform/androidnotifier/main.cpp new file mode 100644 index 0000000000..8b2e937351 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/main.cpp @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "notificationclient.h" + +#include <QApplication> +#include <QWidget> +#include <QPushButton> +#include <QHBoxLayout> +#include <QLabel> +#include <QFont> + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + QWidget widget; + QPushButton happyButton; + happyButton.setIcon(QIcon(":/images/happy.png")); + happyButton.setIconSize(QSize(happyButton.width(), 120)); + + QPushButton sadButton; + sadButton.setIcon(QIcon(":/images/sad.png")); + sadButton.setIconSize(QSize(sadButton.width(), 120)); + + QVBoxLayout mainLayout; + QHBoxLayout labelLayout; + QLabel label = QLabel("Click a smiley to notify your mood"); + QFont font = label.font(); + font.setPointSize(20); + label.setFont(font); + labelLayout.addWidget(&label); + labelLayout.setAlignment(Qt::AlignHCenter); + mainLayout.addLayout(&labelLayout); + + QHBoxLayout smileysLayout; + smileysLayout.addWidget(&sadButton); + smileysLayout.addWidget(&happyButton); + smileysLayout.setAlignment(Qt::AlignCenter); + mainLayout.addLayout(&smileysLayout); + widget.setLayout(&mainLayout); + +//! [Connect button signals] + QObject::connect(&happyButton, &QPushButton::clicked, []() { + NotificationClient().setNotification("The user is happy!"); + }); + + QObject::connect(&sadButton, &QPushButton::clicked, []() { + NotificationClient().setNotification("The user is sad!"); + }); +//! [Connect button signals] + + widget.show(); + return a.exec(); +} + diff --git a/examples/corelib/platform/androidnotifier/main.qrc b/examples/corelib/platform/androidnotifier/main.qrc new file mode 100644 index 0000000000..e0bb052fd2 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/main.qrc @@ -0,0 +1,6 @@ +<RCC> + <qresource prefix="/"> + <file>images/happy.png</file> + <file>images/sad.png</file> + </qresource> +</RCC> diff --git a/examples/corelib/platform/androidnotifier/notificationclient.cpp b/examples/corelib/platform/androidnotifier/notificationclient.cpp new file mode 100644 index 0000000000..b2093234b9 --- /dev/null +++ b/examples/corelib/platform/androidnotifier/notificationclient.cpp @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "notificationclient.h" + +#include <QtCore/qjniobject.h> +#include <QtCore/qcoreapplication.h> + +NotificationClient::NotificationClient(QObject *parent) + : QObject(parent) +{ + connect(this, &NotificationClient::notificationChanged, + this, &NotificationClient::updateAndroidNotification); +} + +void NotificationClient::setNotification(const QString ¬ification) +{ + if (m_notification == notification) + return; + +//! [notification changed signal] + m_notification = notification; + emit notificationChanged(); +//! [notification changed signal] +} + +QString NotificationClient::notification() const +{ + return m_notification; +} + +//! [Send notification message to Java] +void NotificationClient::updateAndroidNotification() +{ + QJniObject javaNotification = QJniObject::fromString(m_notification); + QJniObject::callStaticMethod<void>( + "org/qtproject/example/androidnotifier/NotificationClient", + "notify", + "(Landroid/content/Context;Ljava/lang/String;)V", + QNativeInterface::QAndroidApplication::context(), + javaNotification.object<jstring>()); +} +//! [Send notification message to Java] diff --git a/examples/corelib/platform/androidnotifier/notificationclient.h b/examples/corelib/platform/androidnotifier/notificationclient.h new file mode 100644 index 0000000000..f821dbfc8d --- /dev/null +++ b/examples/corelib/platform/androidnotifier/notificationclient.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef NOTIFICATIONCLIENT_H +#define NOTIFICATIONCLIENT_H + +#include <QObject> + +//! [Qt Notification Class] +class NotificationClient : public QObject +{ + Q_OBJECT +public: + explicit NotificationClient(QObject *parent = 0); + + void setNotification(const QString ¬ification); + QString notification() const; + +signals: + void notificationChanged(); + +private slots: + void updateAndroidNotification(); + +private: + QString m_notification; +}; +//! [Qt Notification Class] +#endif // NOTIFICATIONCLIENT_H diff --git a/examples/corelib/platform/platform.pro b/examples/corelib/platform/platform.pro new file mode 100644 index 0000000000..b9e58c7c7e --- /dev/null +++ b/examples/corelib/platform/platform.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs +CONFIG += no_docs_target + +android: SUBDIRS += androidnotifier |