From 73684040207ce0cbb782dda5dc27cb8ac71243b3 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Thu, 7 May 2020 12:49:24 +0300 Subject: Add example to demonstrate working with custom Java objects/ArrayList An example that retrieves music data from Java APIs, and store that in a Java ArrayList of objects. Then, how to pass that data to Qt via C++ and QML. Task-number: QTBUG-83038 Change-Id: I5201572b997973388c688ca0d3f2f30240da12f6 Reviewed-by: Ville Voutilainen (cherry picked from commit 8ebbdcc7c4a0c2c6f863060500136b9399eccf98) Reviewed-by: Qt Cherry-pick Bot --- examples/androidextras/androidextras.pro | 6 +- .../musiclist/android/AndroidManifest.xml | 84 ++++++++++++++ .../org/qtproject/example/musiclist/MusicList.java | 113 ++++++++++++++++++ .../doc/src/qtandroidextras-example-musiclist.qdoc | 128 +++++++++++++++++++++ examples/androidextras/musiclist/main.cpp | 93 +++++++++++++++ examples/androidextras/musiclist/main.qml | 122 ++++++++++++++++++++ examples/androidextras/musiclist/musiclist.cpp | 75 ++++++++++++ examples/androidextras/musiclist/musiclist.h | 88 ++++++++++++++ examples/androidextras/musiclist/musiclist.pro | 23 ++++ examples/androidextras/musiclist/qml.qrc | 5 + src/androidextras/doc/images/musiclist.png | Bin 0 -> 15406 bytes src/androidextras/doc/qtandroidextras.qdocconf | 2 +- 12 files changed, 736 insertions(+), 3 deletions(-) create mode 100644 examples/androidextras/musiclist/android/AndroidManifest.xml create mode 100644 examples/androidextras/musiclist/android/src/org/qtproject/example/musiclist/MusicList.java create mode 100644 examples/androidextras/musiclist/doc/src/qtandroidextras-example-musiclist.qdoc create mode 100644 examples/androidextras/musiclist/main.cpp create mode 100644 examples/androidextras/musiclist/main.qml create mode 100644 examples/androidextras/musiclist/musiclist.cpp create mode 100644 examples/androidextras/musiclist/musiclist.h create mode 100644 examples/androidextras/musiclist/musiclist.pro create mode 100644 examples/androidextras/musiclist/qml.qrc create mode 100644 src/androidextras/doc/images/musiclist.png diff --git a/examples/androidextras/androidextras.pro b/examples/androidextras/androidextras.pro index 4ac3b2d..169797a 100644 --- a/examples/androidextras/androidextras.pro +++ b/examples/androidextras/androidextras.pro @@ -6,12 +6,14 @@ android { notification \ jnimessenger \ services \ - customactivity + customactivity \ + musiclist EXAMPLE_FILES += \ notification \ jnimessenger \ services \ - customactivity + customactivity \ + musiclist } } diff --git a/examples/androidextras/musiclist/android/AndroidManifest.xml b/examples/androidextras/musiclist/android/AndroidManifest.xml new file mode 100644 index 0000000..051fbaa --- /dev/null +++ b/examples/androidextras/musiclist/android/AndroidManifest.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/androidextras/musiclist/android/src/org/qtproject/example/musiclist/MusicList.java b/examples/androidextras/musiclist/android/src/org/qtproject/example/musiclist/MusicList.java new file mode 100644 index 0000000..d4dc840 --- /dev/null +++ b/examples/androidextras/musiclist/android/src/org/qtproject/example/musiclist/MusicList.java @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAndroidExtras module 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.musiclist; + +import android.content.ContentResolver; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.provider.MediaStore; +import java.util.ArrayList; + +public class MusicList { + + static ArrayList fetchMusicList(Context context) { + ArrayList musicList = new ArrayList(); + Cursor songCursor; + + try { + ContentResolver contentResolver = context.getContentResolver(); + Uri songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + songCursor = contentResolver.query(songUri, null, null, null, null); + } catch (SecurityException e) { + e.printStackTrace(); + return musicList; + } + + if (songCursor != null && songCursor.moveToFirst()) + { + int title = songCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE); + int artist = songCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST); + int duration = duration = songCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION); + + do { + String currentTitle = songCursor.getString(title); + String currentArtist = songCursor.getString(artist); + long currentDuration = songCursor.getLong(duration); + musicList.add(new MusicTrack(currentTitle, currentArtist, currentDuration)); + } while (songCursor.moveToNext()); + } + + if (songCursor != null) + songCursor.close(); + + return musicList; + } +} + +class MusicTrack { + + private String title; + private String artist; + private long duration; + + MusicTrack (String title, String artist, long duration) { + this.title = title; + this.artist = artist; + this.duration = duration; + } + + public String getTitle() { return title; } + + public String getArtist() { return artist; } + + public long getDuration() { return duration; } +} diff --git a/examples/androidextras/musiclist/doc/src/qtandroidextras-example-musiclist.qdoc b/examples/androidextras/musiclist/doc/src/qtandroidextras-example-musiclist.qdoc new file mode 100644 index 0000000..39efb6a --- /dev/null +++ b/examples/androidextras/musiclist/doc/src/qtandroidextras-example-musiclist.qdoc @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAndroidExtras module 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$ +** +****************************************************************************/ + +/*! +\title Qt JNI Music List + \ingroup examples-qtandroidextras + \example musiclist + \brief Demonstrates how to exchange data from complex Java objects. + + \image musiclist.png + + This example demonstrates how to move around data from a Java ArrayList of + objects over to Qt. The example uses Android APIs to retrieve a list of music + tracks, and displays some information about them with QML. + + When the application starts, it displays a list of music tracks, showing the + track name, artist, and duration. + + \include examples-run.qdocinc + + \section1 Create the Music Classes + + Let's create a Java class, \c MusicTrack, that defines some of the basic + information about a track. In the Java side, create the following: + + \quotefromfile musiclist/android/src/org/qtproject/example/musiclist/MusicList.java + \skipto class MusicTrack + \printuntil /^\}/ + + Create another class with the same variables or information on the C++ side. + The definition for \c MusicTrack class is the following: + + \quotefromfile musiclist/musiclist.h + \skipto class MusicTrack + \printuntil }; + + \note The \c MusicTrack class must be a \l{QObject}-derived class to be used + with as a QML context property. For more information, see + \l{Overview - QML and C++ Integration}{QML and C++ Integration}. + + \section1 Fetch the Music List + + To retrieve the music list, the Android APIs are used. Add the following method + to find music tracks that are available on the system. This method returns + an ArrayList of \c MusicTrack. + + \quotefromfile musiclist/android/src/org/qtproject/example/musiclist/MusicList.java + \skipto package + \printuntil /^\ {4}\}/ + \printline } + + Using the JNI helpers provided with Qt, call the previous method to + first get an \l{QAndroidJniObject} containing an ArrayList of objects. In the + C++ code, you need to go through the Java ArrayList and create a parallel list + on C++. Add the following lines to do that: + + \quotefromfile musiclist/musiclist.cpp + \skipto QAndroidJniObject + \printuntil /^\ {4}\}/ + + Then, add a function to return the resulted \l{QList}: + + \quotefromfile musiclist/musiclist.cpp + \skipto MusicList::assembledMusicList + \printuntil } + + To display the music list, create a \l{ListView} that uses the \l{QList} + as a property. Register the property as follows: + + \quotefromfile musiclist/main.cpp + \skipto MusicList + \printuntil assembledMusicList + + In the QML code, define the model of the \l{ListView} as follows: + + \quotefromfile musiclist/main.qml + \skipto model + \printline model + + \sa {Qt for Android}, {Qt Android Extras} +*/ diff --git a/examples/androidextras/musiclist/main.cpp b/examples/androidextras/musiclist/main.cpp new file mode 100644 index 0000000..0c76cc2 --- /dev/null +++ b/examples/androidextras/musiclist/main.cpp @@ -0,0 +1,93 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAndroidExtras module 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 "musiclist.h" + +#include + +#include +#include +#include + +bool requestStoragePermission() { + using namespace QtAndroid; + + QString permission = QStringLiteral("android.permission.WRITE_EXTERNAL_STORAGE"); + const QHash results = requestPermissionsSync(QStringList({permission})); + if (!results.contains(permission) || results[permission] == PermissionResult::Denied) { + qWarning() << "Couldn't get permission: " << permission; + return false; + } + + return true; +} + +int main(int argc, char *argv[]) +{ + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QGuiApplication app(argc, argv); + QQmlApplicationEngine engine; + const QUrl url(QStringLiteral("qrc:/main.qml")); + + if (!requestStoragePermission()) + qDebug() << "Storage permissions denied. This example might not work as intended"; + + MusicList *musicList = new MusicList(&app); + engine.rootContext()->setContextProperty(QLatin1String("musiclist"), + QVariant::fromValue(musicList->assembledMusicList())); + + QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, + &app, [url](QObject *obj, const QUrl &objUrl) { + if (!obj && url == objUrl) + QCoreApplication::exit(-1); + }, Qt::QueuedConnection); + engine.load(url); + + return app.exec(); +} diff --git a/examples/androidextras/musiclist/main.qml b/examples/androidextras/musiclist/main.qml new file mode 100644 index 0000000..6a04bef --- /dev/null +++ b/examples/androidextras/musiclist/main.qml @@ -0,0 +1,122 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAndroidExtras module 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$ +** +****************************************************************************/ +import QtQuick 2.14 +import QtQuick.Window 2.14 +import QtQuick.Controls 2.14 + +Window { + id: window + visible: true + width: 640 + height: 480 + title: qsTr("Qt Android Music List") + + Text { + id: resultText + height: 40 + text: "Music library list:" + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.top: parent.top + anchors.topMargin: 10 + font.pointSize: 20 + verticalAlignment: Text.AlignTop + } + + ToolSeparator { + id: toolSeparator + width: parent.width + anchors.bottom: listView.top + anchors.bottomMargin: 10 + anchors.top: resultText.bottom + anchors.topMargin: 6 + anchors.horizontalCenter: parent.horizontalCenter + orientation: Qt.Horizontal + } + + ListView { + id: listView + width: parent.width + clip: true + flickableDirection: Flickable.HorizontalAndVerticalFlick + anchors.bottomMargin: 10 + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.top: resultText.bottom + anchors.topMargin: 30 + anchors.bottom: parent.bottom + + model: musiclist + delegate: Rectangle { + height: 25 + width: ListView.view.width + color: index % 2 == 0 ? "#EDEDED" : "#FFFFFF" + + function toTimeFormat(sec_num) { + sec_num = Math.floor(sec_num / 1000); + var hours = Math.floor(sec_num / 3600); + var minutes = Math.floor((sec_num - (hours * 3600)) / 60); + var seconds = sec_num - (hours * 3600) - (minutes * 60); + + if (hours < 10) { hours = "0" + hours; } + if (minutes < 10) { minutes = "0" + minutes; } + if (seconds < 10) { seconds = "0" + seconds; } + + return hours+':'+minutes+':'+seconds; + } + + Text { text: model.modelData.title + " | " + model.modelData.artist + " | " + toTimeFormat(model.modelData.duration) } + } + } +} diff --git a/examples/androidextras/musiclist/musiclist.cpp b/examples/androidextras/musiclist/musiclist.cpp new file mode 100644 index 0000000..97d5cdb --- /dev/null +++ b/examples/androidextras/musiclist/musiclist.cpp @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAndroidExtras module 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 "musiclist.h" + +#include +#include + +MusicList::MusicList(QObject *parent) : QObject(parent) +{ + QAndroidJniObject musicList = QAndroidJniObject::callStaticObjectMethod( + "org/qtproject/example/musiclist/MusicList", + "fetchMusicList", + "(Landroid/content/Context;)Ljava/util/ArrayList;", + QtAndroid::androidContext().object()); + + for (int i = 0; i < musicList.callMethod("size"); ++i) { + QAndroidJniObject track = musicList.callObjectMethod("get", "(I)Ljava/lang/Object;", i); + const QString title = track.callObjectMethod("getTitle", "()Ljava/lang/String;").toString(); + const QString artist = track.callObjectMethod("getArtist", "()Ljava/lang/String;").toString(); + const long duration = track.callMethod("getDuration"); + m_assembledMusicList.append(new MusicTrack(title, artist, duration, this)); + } +} + +QList MusicList::assembledMusicList() const +{ + return m_assembledMusicList; +} diff --git a/examples/androidextras/musiclist/musiclist.h b/examples/androidextras/musiclist/musiclist.h new file mode 100644 index 0000000..14d487f --- /dev/null +++ b/examples/androidextras/musiclist/musiclist.h @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtAndroidExtras module 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 MUSICLIST_H +#define MUSICLIST_H + +#include + +class MusicTrack : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString title READ title CONSTANT) + Q_PROPERTY(QString artist READ artist CONSTANT) + Q_PROPERTY(long duration READ duration CONSTANT) + +public: + MusicTrack(const QString title, const QString artist, const long duration, QObject *parent = nullptr) + : QObject(parent), m_title(title), m_artist(artist), m_duration(duration) {} + + QString title() const { return m_title; } + QString artist() const { return m_artist; } + long duration() const { return m_duration; } + +private: + QString m_title; + QString m_artist; + long m_duration; +}; + +class MusicList : public QObject +{ + Q_OBJECT + +public: + MusicList(QObject *parent = nullptr); + QList assembledMusicList() const; + +private: + QList m_assembledMusicList; +}; + +#endif diff --git a/examples/androidextras/musiclist/musiclist.pro b/examples/androidextras/musiclist/musiclist.pro new file mode 100644 index 0000000..0d20de8 --- /dev/null +++ b/examples/androidextras/musiclist/musiclist.pro @@ -0,0 +1,23 @@ +QT += quick androidextras + +CONFIG += c++11 + +DEFINES += QT_DEPRECATED_WARNINGS + +HEADERS += \ + musiclist.h + +SOURCES += \ + main.cpp \ + musiclist.cpp + +RESOURCES += qml.qrc + +target.path = $$[QT_INSTALL_EXAMPLES]/androidextras/musiclist +INSTALLS += target + +ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android + +DISTFILES += \ + android/AndroidManifest.xml \ + android/src/org/qtproject/example/musiclist/MusicList.java diff --git a/examples/androidextras/musiclist/qml.qrc b/examples/androidextras/musiclist/qml.qrc new file mode 100644 index 0000000..5f6483a --- /dev/null +++ b/examples/androidextras/musiclist/qml.qrc @@ -0,0 +1,5 @@ + + + main.qml + + diff --git a/src/androidextras/doc/images/musiclist.png b/src/androidextras/doc/images/musiclist.png new file mode 100644 index 0000000..cc37613 Binary files /dev/null and b/src/androidextras/doc/images/musiclist.png differ diff --git a/src/androidextras/doc/qtandroidextras.qdocconf b/src/androidextras/doc/qtandroidextras.qdocconf index afeb5da..0f1ce43 100644 --- a/src/androidextras/doc/qtandroidextras.qdocconf +++ b/src/androidextras/doc/qtandroidextras.qdocconf @@ -37,7 +37,7 @@ qhp.QtAndroidExtras.subprojects.examples.title = Examples qhp.QtAndroidExtras.subprojects.examples.indexTitle = Qt Android Extras Examples qhp.QtAndroidExtras.subprojects.examples.selectors = fake:example -depends += qtcore qtdoc qtqml +depends += qtcore qtdoc qtqml qtquick headerdirs += .. sourcedirs += .. exampledirs += ../../../examples/androidextras \ -- cgit v1.2.3