From e76ea713e98a3734f0e63961e855d748096990e3 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Thu, 30 May 2013 16:52:15 +0200 Subject: Several changes to Qt 5 Android app Lots of minor stuff from collected feedback. Also added more generated files to avoid Creator overwriting them. Change-Id: I22e10ac19860d1e67f136d718557b2bc2bd04dff Reviewed-by: Eskil Abrahamsen-Blomfeldt --- experimental/qt5-intro-android/CanvasSlide.qml | 5 +- experimental/qt5-intro-android/ExamplesSlide.qml | 52 +- .../OpacityTransitionPresentation.qml | 8 +- experimental/qt5-intro-android/ParticleSlide.qml | 1 + experimental/qt5-intro-android/SlideDeck.qml | 38 +- experimental/qt5-intro-android/VideoSlide.qml | 1 + experimental/qt5-intro-android/android.pro | 7 +- .../qt5-intro-android/android/AndroidManifest.xml | 6 +- .../android/res/layout/splash.xml | 13 + .../android/res/values-de/strings.xml | 6 + .../android/res/values-el/strings.xml | 6 + .../android/res/values-es/strings.xml | 6 + .../android/res/values-et/strings.xml | 6 + .../android/res/values-fa/strings.xml | 6 + .../android/res/values-fr/strings.xml | 6 + .../android/res/values-id/strings.xml | 6 + .../android/res/values-it/strings.xml | 6 + .../android/res/values-ja/strings.xml | 6 + .../android/res/values-ms/strings.xml | 6 + .../android/res/values-nb/strings.xml | 6 + .../android/res/values-nl/strings.xml | 6 + .../android/res/values-pl/strings.xml | 6 + .../android/res/values-pt-rBR/strings.xml | 6 + .../android/res/values-ro/strings.xml | 6 + .../android/res/values-rs/strings.xml | 6 + .../android/res/values-ru/strings.xml | 6 + .../android/res/values-zh-rCN/strings.xml | 6 + .../android/res/values-zh-rTW/strings.xml | 6 + .../qt5-intro-android/android/res/values/libs.xml | 234 +++- .../src/org/kde/necessitas/ministro/IMinistro.aidl | 50 + .../kde/necessitas/ministro/IMinistroCallback.aidl | 55 + .../qtproject/qt5/android/bindings/QtActivity.java | 1404 ++++++++++++++++++++ .../qt5/android/bindings/QtApplication.java | 149 +++ experimental/qt5-intro-android/main.qml | 3 +- .../presentation/Presentation.qml | 30 +- .../qt5-intro-android/presentation/Slide.qml | 5 +- 36 files changed, 2133 insertions(+), 42 deletions(-) create mode 100644 experimental/qt5-intro-android/android/res/layout/splash.xml create mode 100644 experimental/qt5-intro-android/android/res/values-de/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-el/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-es/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-et/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-fa/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-fr/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-id/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-it/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-ja/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-ms/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-nb/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-nl/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-pl/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-pt-rBR/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-ro/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-rs/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-ru/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-zh-rCN/strings.xml create mode 100644 experimental/qt5-intro-android/android/res/values-zh-rTW/strings.xml create mode 100644 experimental/qt5-intro-android/android/src/org/kde/necessitas/ministro/IMinistro.aidl create mode 100644 experimental/qt5-intro-android/android/src/org/kde/necessitas/ministro/IMinistroCallback.aidl create mode 100644 experimental/qt5-intro-android/android/src/org/qtproject/qt5/android/bindings/QtActivity.java create mode 100644 experimental/qt5-intro-android/android/src/org/qtproject/qt5/android/bindings/QtApplication.java (limited to 'experimental') diff --git a/experimental/qt5-intro-android/CanvasSlide.qml b/experimental/qt5-intro-android/CanvasSlide.qml index d972b41..6bd97ff 100644 --- a/experimental/qt5-intro-android/CanvasSlide.qml +++ b/experimental/qt5-intro-android/CanvasSlide.qml @@ -47,7 +47,7 @@ Slide { title: "Qt Quick - Canvas" - + shouldTimeout: false Rectangle { height: parent.height @@ -154,8 +154,5 @@ ctx.restore(); } - - - } } diff --git a/experimental/qt5-intro-android/ExamplesSlide.qml b/experimental/qt5-intro-android/ExamplesSlide.qml index 373c564..dd70c21 100644 --- a/experimental/qt5-intro-android/ExamplesSlide.qml +++ b/experimental/qt5-intro-android/ExamplesSlide.qml @@ -45,10 +45,14 @@ Slide { id: slide - title: "Qt Quick 2" + title: "Qt Quick 2 Interactive Demos" + shouldTimeout: false Row { - anchors.fill: parent + id: exampleRow + anchors.centerIn: parent + height: parent.height + width: item1.width + spacing * 3 + (item2.visible ? item2.width : 0) + (item3.visible ? item3.width : 0) spacing: Math.max(10, (width - 320 * 3) / 2) @@ -57,26 +61,54 @@ Slide width: 320 height: 480 clip: true - Loader { - id: load1 + MouseArea { + anchors.fill: parent + + Loader { + id: load1 + } } + } Item { id: item2 width: 320 height: 480 - visible: item1.width + parent.spacing + width <= parent.width + visible: masterWidth > masterHeight clip: true; - Loader { - id: load2 + MouseArea { + anchors.fill: parent + Loader { + id: load2 + } } } - Loader { - id: load3 - visible: item1.width + item2.width + parent.spacing * 2 + width <= parent.width + Item { + id: item3 + width: 320 + height: 480 + visible: masterWidth > masterHeight + clip: true; + MouseArea { + Loader { + id: load3 + } + anchors.fill: parent + } } + } + + Text { + id: showMore + text: "Rotate the device for more" + color: textColor + anchors.top: exampleRow.bottom + font.family: slides[currentSlide].fontFamily + font.pixelSize: slides[currentSlide].fontSize * 0.6 + visible: masterWidth < masterHeight + anchors.horizontalCenter: parent.horizontalCenter } onVisibleChanged: { diff --git a/experimental/qt5-intro-android/OpacityTransitionPresentation.qml b/experimental/qt5-intro-android/OpacityTransitionPresentation.qml index dc7cc02..1573c66 100644 --- a/experimental/qt5-intro-android/OpacityTransitionPresentation.qml +++ b/experimental/qt5-intro-android/OpacityTransitionPresentation.qml @@ -76,10 +76,10 @@ Presentation { PropertyAction { target: deck; property: "inTransition"; value: true } PropertyAction { target: toSlide; property: "visible"; value: true } ParallelAnimation { - NumberAnimation { target: fromSlide; property: "opacity"; from: 1; to: 0; duration: deck.transitionTime; easing.type: Easing.OutQuart } - NumberAnimation { target: fromSlide; property: "scale"; from: 1; to: 0.7; duration: deck.transitionTime; easing.type: Easing.InOutQuart } - NumberAnimation { target: toSlide; property: "opacity"; from: 0; to: 1; duration: deck.transitionTime; easing.type: Easing.InQuart } - NumberAnimation { target: toSlide; property: "scale"; from: 1.1; to: 1; duration: deck.transitionTime; easing.type: Easing.InOutQuart } + NumberAnimation { target: fromSlide; property: "opacity"; from: 1; to: 0; duration: 1; easing.type: Easing.OutQuart } + NumberAnimation { target: fromSlide; property: "scale"; from: 1; to: 0.7; duration: 1; easing.type: Easing.InOutQuart } + NumberAnimation { target: toSlide; property: "opacity"; from: 0; to: 1; duration: 1; easing.type: Easing.InQuart } + NumberAnimation { target: toSlide; property: "scale"; from: 1.1; to: 1; duration: 1; easing.type: Easing.InOutQuart } } PropertyAction { target: fromSlide; property: "visible"; value: false } PropertyAction { target: fromSlide; property: "scale"; value: 1 } diff --git a/experimental/qt5-intro-android/ParticleSlide.qml b/experimental/qt5-intro-android/ParticleSlide.qml index 2569a17..4dadcae 100644 --- a/experimental/qt5-intro-android/ParticleSlide.qml +++ b/experimental/qt5-intro-android/ParticleSlide.qml @@ -46,6 +46,7 @@ Slide id: slide title: "Qt Quick - Particle System" + shouldTimeout: false Row { anchors.fill: parent diff --git a/experimental/qt5-intro-android/SlideDeck.qml b/experimental/qt5-intro-android/SlideDeck.qml index 5a32831..26aa4e6 100644 --- a/experimental/qt5-intro-android/SlideDeck.qml +++ b/experimental/qt5-intro-android/SlideDeck.qml @@ -83,11 +83,17 @@ OpacityTransitionPresentation { Slide { id: introSlide - writeInText: "The following is a quick tour of what is new in Qt 5. + centeredText: "The following is a quick tour of what is new in Qt 5. -It is an application written with Qt Quick, based on Qt 5. +It is an application written with Qt Quick, based on Qt 5." -We hope you will enjoy Qt 5 as much as we have enjoyed creating it. + + (masterWidth < masterHeight ? " + +For an optimal experience, try watching it in the landscape orientation. + +" : " ") + ++ "We hope you will enjoy Qt 5 as much as we have enjoyed creating it. [tap to advance]" @@ -102,11 +108,13 @@ We hope you will enjoy Qt 5 as much as we have enjoyed creating it. Slide { centeredText: "Introducing" fontScale: 2 + timeout: 2000 } Slide { centeredText: "Qt 5" fontScale: 4; + timeout: 2000 } @@ -138,11 +146,11 @@ Wayland support - Wayland-compatible Qt backend and compositor framework" title: "Qt for Android" writeInText: " - Qt 5.1 allows you to write Android apps using Qt Quick or Qt Widgets. +Qt 5.1 allows you to write Android apps using Qt Quick or Qt Widgets. - We support QML media player functionality, as well as a set of commonly used sensors in QtSensors. +We support QML media player functionality, as well as a set of commonly used sensors in QtSensors. - With Qt Creator you can develop your apps, deploy them directly to a device, and debug them on the device. +With Qt Creator you can develop your apps, deploy them directly to a device, and debug them on the device. " } @@ -150,7 +158,7 @@ Wayland support - Wayland-compatible Qt backend and compositor framework" writeInText: "For this preliminary release, we are focusing on the developer experience, working to enable Qt developers to easily run and test their applications on Android devices. - You can easily deploy your app to an app store with Qt 5.1, but we recommend waiting until Qt 5.2 for an even smoother experience." +You can easily deploy your app to an app store with Qt 5.1, but we recommend waiting until Qt 5.2 for an even smoother experience." } @@ -162,7 +170,7 @@ Wayland support - Wayland-compatible Qt backend and compositor framework" ExamplesSlide { } FontSlide { } - CanvasSlide { } + // CanvasSlide { } ParticleSlide { } ShaderSlide { } @@ -219,14 +227,15 @@ Wayland support - Wayland-compatible Qt backend and compositor framework" title: "Links" contentFormat: Text.RichText content: [ - "Qt Project: qt-project.org", - "Qt by Digia: qt.digia.com", + "qt-project.org", + "Qt by Digia: qt.digia.com", "Follow us on Twitter", - " @QtProject", - " @QtByDigia", + " @QtProject", + " @QtByDigia", "Find us on Facebook:", - " Qt Project", - " Qt by Digia", + " Qt Project", + " Qt by Digia", ]; Image { @@ -238,6 +247,7 @@ Wayland support - Wayland-compatible Qt backend and compositor framework" anchors.right: parent.right anchors.rightMargin: parent.width * 0.15 fillMode: Image.PreserveAspectFit + visible: parent.masterWidth > parent.masterHeight } } diff --git a/experimental/qt5-intro-android/VideoSlide.qml b/experimental/qt5-intro-android/VideoSlide.qml index d0aca61..51d70d0 100644 --- a/experimental/qt5-intro-android/VideoSlide.qml +++ b/experimental/qt5-intro-android/VideoSlide.qml @@ -50,6 +50,7 @@ Slide { title: "Qt Multimedia - Video" focus: true + shouldTimeout: false Video { id: video diff --git a/experimental/qt5-intro-android/android.pro b/experimental/qt5-intro-android/android.pro index 118b121..8de4a94 100644 --- a/experimental/qt5-intro-android/android.pro +++ b/experimental/qt5-intro-android/android.pro @@ -151,4 +151,9 @@ OTHER_FILES += \ DemoMain.qml \ CanvasSlide.qml \ CameraSlide.qml \ - Button.qml + Button.qml \ + presentation/SlideCounter.qml \ + presentation/Slide.qml \ + presentation/Presentation.qml \ + presentation/CodeSlide.qml \ + presentation/Clock.qml diff --git a/experimental/qt5-intro-android/android/AndroidManifest.xml b/experimental/qt5-intro-android/android/AndroidManifest.xml index 82a50d3..002dae0 100644 --- a/experimental/qt5-intro-android/android/AndroidManifest.xml +++ b/experimental/qt5-intro-android/android/AndroidManifest.xml @@ -1,5 +1,5 @@ - + @@ -32,7 +32,5 @@ - - - + diff --git a/experimental/qt5-intro-android/android/res/layout/splash.xml b/experimental/qt5-intro-android/android/res/layout/splash.xml new file mode 100644 index 0000000..6b0d492 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/layout/splash.xml @@ -0,0 +1,13 @@ + + + + diff --git a/experimental/qt5-intro-android/android/res/values-de/strings.xml b/experimental/qt5-intro-android/android/res/values-de/strings.xml new file mode 100644 index 0000000..320d9ec --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-de/strings.xml @@ -0,0 +1,6 @@ + + + Ministro-Dienst wurde nicht gefunden.\nAnwendung kann nicht gestartet werden + Diese Anwendung benötigt den Ministro-Dienst. Möchten Sie ihn installieren? + In Ihrer Anwendung ist ein schwerwiegender Fehler aufgetreten, sie kann nicht fortgesetzt werden + diff --git a/experimental/qt5-intro-android/android/res/values-el/strings.xml b/experimental/qt5-intro-android/android/res/values-el/strings.xml new file mode 100644 index 0000000..3cab212 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-el/strings.xml @@ -0,0 +1,6 @@ + + + Δεν ήταν δυνατή η εύρεση της υπηρεσίας Ministro. Δεν είναι δυνατή η εκκίνηση της εφαρμογής. + Η εφαρμογή απαιτεί την υπηρεσία Ministro. Να εγκατασταθεί η υπηρεσία? + Παρουσιάστηκε ένα κρίσιμο σφάλμα και η εφαρμογή δεν μπορεί να συνεχίσει. + diff --git a/experimental/qt5-intro-android/android/res/values-es/strings.xml b/experimental/qt5-intro-android/android/res/values-es/strings.xml new file mode 100644 index 0000000..cf0b54d --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-es/strings.xml @@ -0,0 +1,6 @@ + + + Servicio Ministro inesistente. Imposible ejecutar la aplicación. + Esta aplicación requiere el servicio Ministro. Instalarlo? + La aplicación ha causado un error grave y no es posible continuar. + diff --git a/experimental/qt5-intro-android/android/res/values-et/strings.xml b/experimental/qt5-intro-android/android/res/values-et/strings.xml new file mode 100644 index 0000000..d55a3c1 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-et/strings.xml @@ -0,0 +1,6 @@ + + + Ei suuda leida Ministro teenust.\nProgrammi ei saa käivitada. + See programm vajab Ministro teenust.\nKas soovite paigaldada? + Programmiga juhtus fataalne viga.\nKahjuks ei saa jätkata. + diff --git a/experimental/qt5-intro-android/android/res/values-fa/strings.xml b/experimental/qt5-intro-android/android/res/values-fa/strings.xml new file mode 100644 index 0000000..a8d1b87 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-fa/strings.xml @@ -0,0 +1,6 @@ + + + سرویس Ministro را پیدا نمی‌کند. برنامه نمی‌تواند آغاز شود. + این نرم‌افزار به سرویس Ministro احتیاج دارد. آیا دوست دارید آن را نصب کنید؟ + خطایی اساسی در برنامه‌تان رخ داد و اجرای برنامه نمی‌تواند ادامه یابد. + diff --git a/experimental/qt5-intro-android/android/res/values-fr/strings.xml b/experimental/qt5-intro-android/android/res/values-fr/strings.xml new file mode 100644 index 0000000..efc0fb6 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-fr/strings.xml @@ -0,0 +1,6 @@ + + + Le service Ministro est introuvable.\nL\'application ne peut pas démarrer. + Cette application requiert le service Ministro. Voulez-vous l\'installer? + Votre application a rencontré une erreur fatale et ne peut pas continuer. + diff --git a/experimental/qt5-intro-android/android/res/values-id/strings.xml b/experimental/qt5-intro-android/android/res/values-id/strings.xml new file mode 100644 index 0000000..aaa5bda --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-id/strings.xml @@ -0,0 +1,6 @@ + + + Layanan Ministro tidak bisa ditemukan.\nAplikasi tidak bisa dimulai. + Aplikasi ini membutuhkan layanan Ministro. Apakah Anda ingin menginstalnya? + Aplikasi Anda mengalami kesalahan fatal dan tidak dapat melanjutkan. + diff --git a/experimental/qt5-intro-android/android/res/values-it/strings.xml b/experimental/qt5-intro-android/android/res/values-it/strings.xml new file mode 100644 index 0000000..4773419 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-it/strings.xml @@ -0,0 +1,6 @@ + + + Servizio Ministro inesistente. Impossibile eseguire \nl\'applicazione. + Questa applicazione richiede il servizio Ministro.Installarlo? + L\'applicazione ha provocato un errore grave e non puo\' continuare. + diff --git a/experimental/qt5-intro-android/android/res/values-ja/strings.xml b/experimental/qt5-intro-android/android/res/values-ja/strings.xml new file mode 100644 index 0000000..ba1cfda --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-ja/strings.xml @@ -0,0 +1,6 @@ + + + Ministroサービスが見つかりません。\nアプリケーションが起動できません。 + このアプリケーションにはMinistroサービスが必要です。 インストールしてもよろしいですか? + アプリケーションで致命的なエラーが発生したため続行できません。 + diff --git a/experimental/qt5-intro-android/android/res/values-ms/strings.xml b/experimental/qt5-intro-android/android/res/values-ms/strings.xml new file mode 100644 index 0000000..6e3952e --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-ms/strings.xml @@ -0,0 +1,6 @@ + + + Tidak jumpa servis Ministro.\nAplikasi tidak boleh dimulakan. + Aplikasi ini memerlukan servis Ministro. Adakah anda ingin pasang servis itu? + Aplikasi anda menemui ralat muat dan tidak boleh diteruskan. + diff --git a/experimental/qt5-intro-android/android/res/values-nb/strings.xml b/experimental/qt5-intro-android/android/res/values-nb/strings.xml new file mode 100644 index 0000000..8a550e9 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-nb/strings.xml @@ -0,0 +1,6 @@ + + + Kan ikke finne tjenesten Ministro. Applikasjonen kan ikke starte. + Denne applikasjonen krever tjenesten Ministro. Vil du installere denne? + Applikasjonen fikk en kritisk feil og kan ikke fortsette + diff --git a/experimental/qt5-intro-android/android/res/values-nl/strings.xml b/experimental/qt5-intro-android/android/res/values-nl/strings.xml new file mode 100644 index 0000000..8a45a72 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-nl/strings.xml @@ -0,0 +1,6 @@ + + + De Ministro service is niet gevonden.\nDe applicatie kan niet starten. + Deze applicatie maakt gebruik van de Ministro service. Wilt u deze installeren? + Er is een fatale fout in de applicatie opgetreden. De applicatie kan niet verder gaan. + diff --git a/experimental/qt5-intro-android/android/res/values-pl/strings.xml b/experimental/qt5-intro-android/android/res/values-pl/strings.xml new file mode 100644 index 0000000..9fefc92 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-pl/strings.xml @@ -0,0 +1,6 @@ + + + Usługa Ministro nie została znaleziona.\nAplikacja nie może zostać uruchomiona. + Aplikacja wymaga usługi Ministro. Czy chcesz ją zainstalować? + Wystąpił błąd krytyczny. Aplikacja zostanie zamknięta. + diff --git a/experimental/qt5-intro-android/android/res/values-pt-rBR/strings.xml b/experimental/qt5-intro-android/android/res/values-pt-rBR/strings.xml new file mode 100644 index 0000000..67ac3f9 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-pt-rBR/strings.xml @@ -0,0 +1,6 @@ + + + Não foi possível encontrar o serviço Ministro.\nA aplicação não pode iniciar. + Essa aplicação requer o serviço Ministro. Gostaria de instalá-lo? + Sua aplicação encontrou um erro fatal e não pode continuar. + diff --git a/experimental/qt5-intro-android/android/res/values-ro/strings.xml b/experimental/qt5-intro-android/android/res/values-ro/strings.xml new file mode 100644 index 0000000..f88a442 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-ro/strings.xml @@ -0,0 +1,6 @@ + + + Serviciul Ministro nu poate fi găsit.\nAplicaţia nu poate porni. + Această aplicaţie necesită serviciul Ministro.\nDoriţi să-l instalaţi? + Aplicaţia dumneavoastră a întâmpinat o eroare fatală şi nu poate continua. + diff --git a/experimental/qt5-intro-android/android/res/values-rs/strings.xml b/experimental/qt5-intro-android/android/res/values-rs/strings.xml new file mode 100644 index 0000000..3194ce9 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-rs/strings.xml @@ -0,0 +1,6 @@ + + + Ministro servise nije pronađen. Aplikacija ne može biti pokrenuta. + Ova aplikacija zahteva Ministro servis. Želite li da ga instalirate? + Vaša aplikacija je naišla na fatalnu grešku i ne može nastaviti sa radom. + diff --git a/experimental/qt5-intro-android/android/res/values-ru/strings.xml b/experimental/qt5-intro-android/android/res/values-ru/strings.xml new file mode 100644 index 0000000..d3cee80 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-ru/strings.xml @@ -0,0 +1,6 @@ + + + Сервис Ministro не найден.\nПриложение нельзя запустить. + Этому приложению необходим сервис Ministro. Вы хотите его установить? + Ваше приложение столкнулось с фатальной ошибкой и не может более работать. + diff --git a/experimental/qt5-intro-android/android/res/values-zh-rCN/strings.xml b/experimental/qt5-intro-android/android/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..2eb1269 --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-zh-rCN/strings.xml @@ -0,0 +1,6 @@ + + + 无法找到Ministro服务。\n应用程序无法启动。 + 此应用程序需要Ministro服务。您想安装它吗? + 您的应用程序遇到一个致命错误导致它无法继续。 + diff --git a/experimental/qt5-intro-android/android/res/values-zh-rTW/strings.xml b/experimental/qt5-intro-android/android/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000..f6e68ef --- /dev/null +++ b/experimental/qt5-intro-android/android/res/values-zh-rTW/strings.xml @@ -0,0 +1,6 @@ + + + 無法找到Ministro服務。\n應用程序無法啟動。 + 此應用程序需要Ministro服務。您想安裝它嗎? + 您的應用程序遇到一個致命錯誤導致它無法繼續。 + diff --git a/experimental/qt5-intro-android/android/res/values/libs.xml b/experimental/qt5-intro-android/android/res/values/libs.xml index 44f5669..d495eaa 100644 --- a/experimental/qt5-intro-android/android/res/values/libs.xml +++ b/experimental/qt5-intro-android/android/res/values/libs.xml @@ -5,9 +5,239 @@ default - - + + lib--Managed_by_Qt_Creator--plugins_platforms_libqminimalegl.so:plugins/platforms/libqminimalegl.so + lib--Managed_by_Qt_Creator--plugins_platforms_libqoffscreen.so:plugins/platforms/libqoffscreen.so + lib--Managed_by_Qt_Creator--plugins_platforms_libqeglfs.so:plugins/platforms/libqeglfs.so + lib--Managed_by_Qt_Creator--plugins_platforms_android_libqtforandroid.so:plugins/platforms/android/libqtforandroid.so + lib--Managed_by_Qt_Creator--plugins_platforms_android_libqtforandroidGL.so:plugins/platforms/android/libqtforandroidGL.so + lib--Managed_by_Qt_Creator--plugins_platforms_libqminimal.so:plugins/platforms/libqminimal.so + lib--Managed_by_Qt_Creator--plugins_imageformats_libqjpeg.so:plugins/imageformats/libqjpeg.so + lib--Managed_by_Qt_Creator--plugins_imageformats_libqtiff.so:plugins/imageformats/libqtiff.so + lib--Managed_by_Qt_Creator--plugins_imageformats_libqwbmp.so:plugins/imageformats/libqwbmp.so + lib--Managed_by_Qt_Creator--plugins_imageformats_libqmng.so:plugins/imageformats/libqmng.so + lib--Managed_by_Qt_Creator--plugins_imageformats_libqsvg.so:plugins/imageformats/libqsvg.so + lib--Managed_by_Qt_Creator--plugins_imageformats_libqtga.so:plugins/imageformats/libqtga.so + lib--Managed_by_Qt_Creator--plugins_imageformats_libqico.so:plugins/imageformats/libqico.so + lib--Managed_by_Qt_Creator--plugins_imageformats_libqgif.so:plugins/imageformats/libqgif.so + libQt5MultimediaQuick_p.so:lib/libQt5MultimediaQuick_p.so + lib--Managed_by_Qt_Creator--plugins_mediaservice_libqtmedia_audioengine.so:plugins/mediaservice/libqtmedia_audioengine.so + lib--Managed_by_Qt_Creator--plugins_mediaservice_libandroidmediaplayer.so:plugins/mediaservice/libandroidmediaplayer.so + lib--Managed_by_Qt_Creator--plugins_bearer_libqgenericbearer.so:plugins/bearer/libqgenericbearer.so + lib--Managed_by_Qt_Creator--qml_QtQuick.2_libqtquick2plugin.so:qml/QtQuick.2/libqtquick2plugin.so + lib--Managed_by_Qt_Creator--qml_QtMultimedia_libdeclarative_multimedia.so:qml/QtMultimedia/libdeclarative_multimedia.so + lib--Managed_by_Qt_Creator--qml_QtSensors_libdeclarative_sensors.so:qml/QtSensors/libdeclarative_sensors.so + lib--Managed_by_Qt_Creator--qml_Qt_labs_folderlistmodel_libqmlfolderlistmodelplugin.so:qml/Qt/labs/folderlistmodel/libqmlfolderlistmodelplugin.so + lib--Managed_by_Qt_Creator--qml_QtTest_libqmltestplugin.so:qml/QtTest/libqmltestplugin.so + lib--Managed_by_Qt_Creator--qml_QtQuick_Layouts_libqquicklayoutsplugin.so:qml/QtQuick/Layouts/libqquicklayoutsplugin.so + lib--Managed_by_Qt_Creator--qml_QtQuick_Dialogs_libdialogplugin.so:qml/QtQuick/Dialogs/libdialogplugin.so + lib--Managed_by_Qt_Creator--qml_QtQuick_Particles.2_libparticlesplugin.so:qml/QtQuick/Particles.2/libparticlesplugin.so + lib--Managed_by_Qt_Creator--qml_QtQuick_LocalStorage_libqmllocalstorageplugin.so:qml/QtQuick/LocalStorage/libqmllocalstorageplugin.so + lib--Managed_by_Qt_Creator--qml_QtQuick_PrivateWidgets_libwidgetsplugin.so:qml/QtQuick/PrivateWidgets/libwidgetsplugin.so + lib--Managed_by_Qt_Creator--qml_QtQuick_Controls_Private_libprivateplugin.so:qml/QtQuick/Controls/Private/libprivateplugin.so + lib--Managed_by_Qt_Creator--qml_QtQuick_Controls_libplugin.so:qml/QtQuick/Controls/libplugin.so + lib--Managed_by_Qt_Creator--qml_QtQuick_XmlListModel_libqmlxmllistmodelplugin.so:qml/QtQuick/XmlListModel/libqmlxmllistmodelplugin.so + lib--Managed_by_Qt_Creator--qml_QtQuick_Window.2_libwindowplugin.so:qml/QtQuick/Window.2/libwindowplugin.so + lib--Managed_by_Qt_Creator--qml_QtQml_Models.2_libmodelsplugin.so:qml/QtQml/Models.2/libmodelsplugin.so + libQt5QuickParticles.so:lib/libQt5QuickParticles.so + lib--Managed_by_Qt_Creator--plugins_accessible_libqtaccessiblequick.so:plugins/accessible/libqtaccessiblequick.so + lib--Managed_by_Qt_Creator--plugins_accessible_libqtaccessiblewidgets.so:plugins/accessible/libqtaccessiblewidgets.so + lib--Managed_by_Qt_Creator--plugins_sqldrivers_libqsqlite.so:plugins/sqldrivers/libqsqlite.so + + + --Managed_by_Qt_Creator--/qml/QtQuick.2/qmldir:qml/QtQuick.2/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick.2/plugins.qmltypes:qml/QtQuick.2/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtMultimedia/Video.qml:qml/QtMultimedia/Video.qml + --Managed_by_Qt_Creator--/qml/QtMultimedia/qmldir:qml/QtMultimedia/qmldir + --Managed_by_Qt_Creator--/qml/QtMultimedia/plugins.qmltypes:qml/QtMultimedia/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtSensors/qmldir:qml/QtSensors/qmldir + --Managed_by_Qt_Creator--/qml/QtSensors/plugins.qmltypes:qml/QtSensors/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/Qt/labs/presentation/SlideCounter.qml:qml/Qt/labs/presentation/SlideCounter.qml + --Managed_by_Qt_Creator--/qml/Qt/labs/presentation/CodeSlide.qml:qml/Qt/labs/presentation/CodeSlide.qml + --Managed_by_Qt_Creator--/qml/Qt/labs/presentation/qmldir:qml/Qt/labs/presentation/qmldir + --Managed_by_Qt_Creator--/qml/Qt/labs/presentation/Clock.qml:qml/Qt/labs/presentation/Clock.qml + --Managed_by_Qt_Creator--/qml/Qt/labs/presentation/Slide.qml:qml/Qt/labs/presentation/Slide.qml + --Managed_by_Qt_Creator--/qml/Qt/labs/presentation/Presentation.qml:qml/Qt/labs/presentation/Presentation.qml + --Managed_by_Qt_Creator--/qml/Qt/labs/folderlistmodel/qmldir:qml/Qt/labs/folderlistmodel/qmldir + --Managed_by_Qt_Creator--/qml/Qt/labs/folderlistmodel/plugins.qmltypes:qml/Qt/labs/folderlistmodel/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtTest/TestCase.qml:qml/QtTest/TestCase.qml + --Managed_by_Qt_Creator--/qml/QtTest/testlogger.js:qml/QtTest/testlogger.js + --Managed_by_Qt_Creator--/qml/QtTest/qmldir:qml/QtTest/qmldir + --Managed_by_Qt_Creator--/qml/QtTest/plugins.qmltypes:qml/QtTest/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtTest/SignalSpy.qml:qml/QtTest/SignalSpy.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/private/GaussianInnerShadow.qml:qml/QtGraphicalEffects/private/GaussianInnerShadow.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/private/FastInnerShadow.qml:qml/QtGraphicalEffects/private/FastInnerShadow.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/private/SourceProxy.qml:qml/QtGraphicalEffects/private/SourceProxy.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/private/GaussianDirectionalBlur.qml:qml/QtGraphicalEffects/private/GaussianDirectionalBlur.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/private/GaussianGlow.qml:qml/QtGraphicalEffects/private/GaussianGlow.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/private/GaussianMaskedBlur.qml:qml/QtGraphicalEffects/private/GaussianMaskedBlur.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/private/FastMaskedBlur.qml:qml/QtGraphicalEffects/private/FastMaskedBlur.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/private/FastGlow.qml:qml/QtGraphicalEffects/private/FastGlow.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/RectangularGlow.qml:qml/QtGraphicalEffects/RectangularGlow.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/RadialBlur.qml:qml/QtGraphicalEffects/RadialBlur.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/Glow.qml:qml/QtGraphicalEffects/Glow.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/OpacityMask.qml:qml/QtGraphicalEffects/OpacityMask.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/GaussianBlur.qml:qml/QtGraphicalEffects/GaussianBlur.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/ThresholdMask.qml:qml/QtGraphicalEffects/ThresholdMask.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/LinearGradient.qml:qml/QtGraphicalEffects/LinearGradient.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/Desaturate.qml:qml/QtGraphicalEffects/Desaturate.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/Blend.qml:qml/QtGraphicalEffects/Blend.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/DropShadow.qml:qml/QtGraphicalEffects/DropShadow.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/InnerShadow.qml:qml/QtGraphicalEffects/InnerShadow.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/ZoomBlur.qml:qml/QtGraphicalEffects/ZoomBlur.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/Colorize.qml:qml/QtGraphicalEffects/Colorize.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/ColorOverlay.qml:qml/QtGraphicalEffects/ColorOverlay.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/qmldir:qml/QtGraphicalEffects/qmldir + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/LevelAdjust.qml:qml/QtGraphicalEffects/LevelAdjust.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/RecursiveBlur.qml:qml/QtGraphicalEffects/RecursiveBlur.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/BrightnessContrast.qml:qml/QtGraphicalEffects/BrightnessContrast.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/FastBlur.qml:qml/QtGraphicalEffects/FastBlur.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/ConicalGradient.qml:qml/QtGraphicalEffects/ConicalGradient.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/MaskedBlur.qml:qml/QtGraphicalEffects/MaskedBlur.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/HueSaturation.qml:qml/QtGraphicalEffects/HueSaturation.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/DirectionalBlur.qml:qml/QtGraphicalEffects/DirectionalBlur.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/Displace.qml:qml/QtGraphicalEffects/Displace.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/GammaAdjust.qml:qml/QtGraphicalEffects/GammaAdjust.qml + --Managed_by_Qt_Creator--/qml/QtGraphicalEffects/RadialGradient.qml:qml/QtGraphicalEffects/RadialGradient.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Layouts/qmldir:qml/QtQuick/Layouts/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/Layouts/plugins.qmltypes:qml/QtQuick/Layouts/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/qml/TextField.qml:qml/QtQuick/Dialogs/qml/TextField.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/qml/qmldir:qml/QtQuick/Dialogs/qml/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/qml/Button.qml:qml/QtQuick/Dialogs/qml/Button.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/qml/ColorSlider.qml:qml/QtQuick/Dialogs/qml/ColorSlider.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/DefaultFileDialog.qml:qml/QtQuick/Dialogs/DefaultFileDialog.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/WidgetColorDialog.qml:qml/QtQuick/Dialogs/WidgetColorDialog.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/WidgetFileDialog.qml:qml/QtQuick/Dialogs/WidgetFileDialog.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/qmldir:qml/QtQuick/Dialogs/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/plugins.qmltypes:qml/QtQuick/Dialogs/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/DefaultColorDialog.qml:qml/QtQuick/Dialogs/DefaultColorDialog.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/images/crosshairs.png:qml/QtQuick/Dialogs/images/crosshairs.png + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/images/slider_handle.png:qml/QtQuick/Dialogs/images/slider_handle.png + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/images/sunken_frame.png:qml/QtQuick/Dialogs/images/sunken_frame.png + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/images/folder.png:qml/QtQuick/Dialogs/images/folder.png + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/images/copy.png:qml/QtQuick/Dialogs/images/copy.png + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/images/checkers.png:qml/QtQuick/Dialogs/images/checkers.png + --Managed_by_Qt_Creator--/qml/QtQuick/Dialogs/images/up.png:qml/QtQuick/Dialogs/images/up.png + --Managed_by_Qt_Creator--/qml/QtQuick/Particles.2/qmldir:qml/QtQuick/Particles.2/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/Particles.2/plugins.qmltypes:qml/QtQuick/Particles.2/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtQuick/LocalStorage/qmldir:qml/QtQuick/LocalStorage/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/LocalStorage/plugins.qmltypes:qml/QtQuick/LocalStorage/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtQuick/PrivateWidgets/qmldir:qml/QtQuick/PrivateWidgets/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/PrivateWidgets/plugins.qmltypes:qml/QtQuick/PrivateWidgets/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/StackViewDelegate.qml:qml/QtQuick/Controls/StackViewDelegate.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Label.qml:qml/QtQuick/Controls/Label.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/StackView.qml:qml/QtQuick/Controls/StackView.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/ScrollView.qml:qml/QtQuick/Controls/ScrollView.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/SpinBox.qml:qml/QtQuick/Controls/SpinBox.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/RadioButton.qml:qml/QtQuick/Controls/RadioButton.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/ComboBox.qml:qml/QtQuick/Controls/ComboBox.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/ApplicationWindow.qml:qml/QtQuick/Controls/ApplicationWindow.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/SplitView.qml:qml/QtQuick/Controls/SplitView.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/TextField.qml:qml/QtQuick/Controls/TextField.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/FocusFrame.qml:qml/QtQuick/Controls/Private/FocusFrame.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/Style.qml:qml/QtQuick/Controls/Private/Style.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/StackView.js:qml/QtQuick/Controls/Private/StackView.js + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/ScrollBar.qml:qml/QtQuick/Controls/Private/ScrollBar.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/TabBar.qml:qml/QtQuick/Controls/Private/TabBar.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/Margins.qml:qml/QtQuick/Controls/Private/Margins.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/style.js:qml/QtQuick/Controls/Private/style.js + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/AbstractCheckable.qml:qml/QtQuick/Controls/Private/AbstractCheckable.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/qmldir:qml/QtQuick/Controls/Private/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/ModalPopupBehavior.qml:qml/QtQuick/Controls/Private/ModalPopupBehavior.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/StackViewSlideDelegate.qml:qml/QtQuick/Controls/Private/StackViewSlideDelegate.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/BasicButton.qml:qml/QtQuick/Controls/Private/BasicButton.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/Control.qml:qml/QtQuick/Controls/Private/Control.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Private/ScrollViewHelper.qml:qml/QtQuick/Controls/Private/ScrollViewHelper.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/ToolBar.qml:qml/QtQuick/Controls/ToolBar.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/TextArea.qml:qml/QtQuick/Controls/TextArea.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/qmldir:qml/QtQuick/Controls/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/GroupBox.qml:qml/QtQuick/Controls/GroupBox.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/plugins.qmltypes:qml/QtQuick/Controls/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/ScrollViewStyle.qml:qml/QtQuick/Controls/Styles/ScrollViewStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/TextFieldStyle.qml:qml/QtQuick/Controls/Styles/TextFieldStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/ToolBarStyle.qml:qml/QtQuick/Controls/Styles/ToolBarStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/SliderStyle.qml:qml/QtQuick/Controls/Styles/SliderStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/RadioButtonStyle.qml:qml/QtQuick/Controls/Styles/RadioButtonStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/CheckBoxStyle.qml:qml/QtQuick/Controls/Styles/CheckBoxStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/ComboBoxStyle.qml:qml/QtQuick/Controls/Styles/ComboBoxStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/MenuBarStyle.qml:qml/QtQuick/Controls/Styles/MenuBarStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/ButtonStyle.qml:qml/QtQuick/Controls/Styles/ButtonStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/ScrollViewStyle.qml:qml/QtQuick/Controls/Styles/Desktop/ScrollViewStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/TextFieldStyle.qml:qml/QtQuick/Controls/Styles/Desktop/TextFieldStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/ToolBarStyle.qml:qml/QtQuick/Controls/Styles/Desktop/ToolBarStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/SliderStyle.qml:qml/QtQuick/Controls/Styles/Desktop/SliderStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/RadioButtonStyle.qml:qml/QtQuick/Controls/Styles/Desktop/RadioButtonStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/CheckBoxStyle.qml:qml/QtQuick/Controls/Styles/Desktop/CheckBoxStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/ComboBoxStyle.qml:qml/QtQuick/Controls/Styles/Desktop/ComboBoxStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/MenuBarStyle.qml:qml/QtQuick/Controls/Styles/Desktop/MenuBarStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/ButtonStyle.qml:qml/QtQuick/Controls/Styles/Desktop/ButtonStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/FocusFrameStyle.qml:qml/QtQuick/Controls/Styles/Desktop/FocusFrameStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/MenuStyle.qml:qml/QtQuick/Controls/Styles/Desktop/MenuStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/TabViewStyle.qml:qml/QtQuick/Controls/Styles/Desktop/TabViewStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/TableViewStyle.qml:qml/QtQuick/Controls/Styles/Desktop/TableViewStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/SpinBoxStyle.qml:qml/QtQuick/Controls/Styles/Desktop/SpinBoxStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/ToolButtonStyle.qml:qml/QtQuick/Controls/Styles/Desktop/ToolButtonStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/GroupBoxStyle.qml:qml/QtQuick/Controls/Styles/Desktop/GroupBoxStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/ProgressBarStyle.qml:qml/QtQuick/Controls/Styles/Desktop/ProgressBarStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Desktop/StatusBarStyle.qml:qml/QtQuick/Controls/Styles/Desktop/StatusBarStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/Private/qmldir:qml/QtQuick/Controls/Styles/Private/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/qmldir:qml/QtQuick/Controls/Styles/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/FocusFrameStyle.qml:qml/QtQuick/Controls/Styles/FocusFrameStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/MenuStyle.qml:qml/QtQuick/Controls/Styles/MenuStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/TabViewStyle.qml:qml/QtQuick/Controls/Styles/TabViewStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/TableViewStyle.qml:qml/QtQuick/Controls/Styles/TableViewStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/SpinBoxStyle.qml:qml/QtQuick/Controls/Styles/SpinBoxStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/ToolButtonStyle.qml:qml/QtQuick/Controls/Styles/ToolButtonStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/GroupBoxStyle.qml:qml/QtQuick/Controls/Styles/GroupBoxStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/ProgressBarStyle.qml:qml/QtQuick/Controls/Styles/ProgressBarStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/arrow-down.png:qml/QtQuick/Controls/Styles/images/arrow-down.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/arrow-right.png:qml/QtQuick/Controls/Styles/images/arrow-right.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/groupbox.png:qml/QtQuick/Controls/Styles/images/groupbox.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/progress-indeterminate.png:qml/QtQuick/Controls/Styles/images/progress-indeterminate.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/button_down.png:qml/QtQuick/Controls/Styles/images/button_down.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/header.png:qml/QtQuick/Controls/Styles/images/header.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/arrow-left.png:qml/QtQuick/Controls/Styles/images/arrow-left.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/tab.png:qml/QtQuick/Controls/Styles/images/tab.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/focusframe.png:qml/QtQuick/Controls/Styles/images/focusframe.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/editbox.png:qml/QtQuick/Controls/Styles/images/editbox.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/arrow-right@2x.png:qml/QtQuick/Controls/Styles/images/arrow-right@2x.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/arrow-left@2x.png:qml/QtQuick/Controls/Styles/images/arrow-left@2x.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/arrow-down@2x.png:qml/QtQuick/Controls/Styles/images/arrow-down@2x.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/scrollbar-handle-horizontal.png:qml/QtQuick/Controls/Styles/images/scrollbar-handle-horizontal.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/scrollbar-handle-vertical.png:qml/QtQuick/Controls/Styles/images/scrollbar-handle-vertical.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/tab_selected.png:qml/QtQuick/Controls/Styles/images/tab_selected.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/arrow-up.png:qml/QtQuick/Controls/Styles/images/arrow-up.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/button.png:qml/QtQuick/Controls/Styles/images/button.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/images/arrow-up@2x.png:qml/QtQuick/Controls/Styles/images/arrow-up@2x.png + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Styles/StatusBarStyle.qml:qml/QtQuick/Controls/Styles/StatusBarStyle.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/MenuBar.qml:qml/QtQuick/Controls/MenuBar.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/TabView.qml:qml/QtQuick/Controls/TabView.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/ToolButton.qml:qml/QtQuick/Controls/ToolButton.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Tab.qml:qml/QtQuick/Controls/Tab.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Button.qml:qml/QtQuick/Controls/Button.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/CheckBox.qml:qml/QtQuick/Controls/CheckBox.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/TableViewColumn.qml:qml/QtQuick/Controls/TableViewColumn.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Menu.qml:qml/QtQuick/Controls/Menu.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/StatusBar.qml:qml/QtQuick/Controls/StatusBar.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/ProgressBar.qml:qml/QtQuick/Controls/ProgressBar.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/TableView.qml:qml/QtQuick/Controls/TableView.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/Slider.qml:qml/QtQuick/Controls/Slider.qml + --Managed_by_Qt_Creator--/qml/QtQuick/Controls/StackViewTransition.qml:qml/QtQuick/Controls/StackViewTransition.qml + --Managed_by_Qt_Creator--/qml/QtQuick/XmlListModel/qmldir:qml/QtQuick/XmlListModel/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/XmlListModel/plugins.qmltypes:qml/QtQuick/XmlListModel/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtQuick/Window.2/qmldir:qml/QtQuick/Window.2/qmldir + --Managed_by_Qt_Creator--/qml/QtQuick/Window.2/plugins.qmltypes:qml/QtQuick/Window.2/plugins.qmltypes + --Managed_by_Qt_Creator--/qml/QtQml/Models.2/qmldir:qml/QtQml/Models.2/qmldir + + gnustl_shared Qt5Core + Qt5V8 + Qt5Gui + Qt5Network + Qt5Sql + Qt5Multimedia + Qt5Qml + Qt5Quick diff --git a/experimental/qt5-intro-android/android/src/org/kde/necessitas/ministro/IMinistro.aidl b/experimental/qt5-intro-android/android/src/org/kde/necessitas/ministro/IMinistro.aidl new file mode 100644 index 0000000..236a62f --- /dev/null +++ b/experimental/qt5-intro-android/android/src/org/kde/necessitas/ministro/IMinistro.aidl @@ -0,0 +1,50 @@ +/* + Copyright (c) 2011-2013, BogDan Vatra + Contact: http://www.qt-project.org/legal + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +*/ + + +package org.kde.necessitas.ministro; + +import org.kde.necessitas.ministro.IMinistroCallback; + +interface IMinistro +{ +/** +* Check/download required libs to run the application +* +* param callback - interface used by Minsitro service to notify the client when the loader is ready +* param parameters +* parameters fields: +* * Key Name Key type Explanations +* "sources" StringArray Sources list from where Ministro will download the libs. Make sure you are using ONLY secure locations. +* "repository" String Overwrites the default Ministro repository. Possible values: default, stable, testing and unstable +* "required.modules" StringArray Required modules by your application +* "application.title" String Application name, used to show more informations to user +* "qt.provider" String Qt libs provider, currently only "necessitas" is supported. +* "minimum.ministro.api" Integer Minimum Ministro API level, used to check if Ministro service compatible with your application. Current API Level is 3 ! +* "minimum.qt.version" Integer Minimim Qt version (e.g. 0x040800, which means Qt 4.8.0, check http://qt-project.org/doc/qt-4.8/qtglobal.html#QT_VERSION)! +*/ + void requestLoader(in IMinistroCallback callback, in Bundle parameters); +} diff --git a/experimental/qt5-intro-android/android/src/org/kde/necessitas/ministro/IMinistroCallback.aidl b/experimental/qt5-intro-android/android/src/org/kde/necessitas/ministro/IMinistroCallback.aidl new file mode 100644 index 0000000..0bcb528 --- /dev/null +++ b/experimental/qt5-intro-android/android/src/org/kde/necessitas/ministro/IMinistroCallback.aidl @@ -0,0 +1,55 @@ +/* + Copyright (c) 2011-2013, BogDan Vatra + Contact: http://www.qt-project.org/legal + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +*/ + +package org.kde.necessitas.ministro; + +oneway interface IMinistroCallback { +/** +* This method is called by the Ministro service back into the application which +* implements this interface. +* +* param in - loaderParams +* loaderParams fields: +* * Key Name Key type Explanations +* * "error.code" Integer See below +* * "error.message" String Missing if no error, otherwise will contain the error message translated into phone language where available. +* * "dex.path" String The list of jar/apk files containing classes and resources, needed to be passed to application DexClassLoader +* * "lib.path" String The list of directories containing native libraries; may be missing, needed to be passed to application DexClassLoader +* * "loader.class.name" String Loader class name. +* +* "error.code" field possible errors: +* - 0 no error. +* - 1 incompatible Ministro version. Ministro needs to be upgraded. +* - 2 not all modules could be satisfy. +* - 3 invalid parameters +* - 4 invalid qt version +* - 5 download canceled +* +* The parameter contains additional fields which are used by the loader to start your application, so it must be passed to the loader. +*/ + + void loaderReady(in Bundle loaderParams); +} diff --git a/experimental/qt5-intro-android/android/src/org/qtproject/qt5/android/bindings/QtActivity.java b/experimental/qt5-intro-android/android/src/org/qtproject/qt5/android/bindings/QtActivity.java new file mode 100644 index 0000000..8d129de --- /dev/null +++ b/experimental/qt5-intro-android/android/src/org/qtproject/qt5/android/bindings/QtActivity.java @@ -0,0 +1,1404 @@ +/* + Copyright (c) 2012-2013, BogDan Vatra + Contact: http://www.qt-project.org/legal + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +*/ + +package org.qtproject.qt5.android.bindings; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.InputStream; +import java.io.FileOutputStream; +import java.io.FileInputStream; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; + +import org.kde.necessitas.ministro.IMinistro; +import org.kde.necessitas.ministro.IMinistroCallback; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.ServiceConnection; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Configuration; +import android.content.res.Resources.Theme; +import android.content.res.AssetManager; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.net.Uri; +import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.AttributeSet; +import android.util.Log; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager.LayoutParams; +import android.view.accessibility.AccessibilityEvent; +import dalvik.system.DexClassLoader; + +//@ANDROID-11 +//QtCreator import android.app.Fragment; +//QtCreator import android.view.ActionMode; +//QtCreator import android.view.ActionMode.Callback; +//@ANDROID-11 + +public class QtActivity extends Activity +{ + private final static int MINISTRO_INSTALL_REQUEST_CODE = 0xf3ee; // request code used to know when Ministro instalation is finished + private static final int MINISTRO_API_LEVEL = 3; // Ministro api level (check IMinistro.aidl file) + private static final int NECESSITAS_API_LEVEL = 2; // Necessitas api level used by platform plugin + private static final int QT_VERSION = 0x050100; // This app requires at least Qt version 5.1.0 + + private static final String ERROR_CODE_KEY = "error.code"; + private static final String ERROR_MESSAGE_KEY = "error.message"; + private static final String DEX_PATH_KEY = "dex.path"; + private static final String LIB_PATH_KEY = "lib.path"; + private static final String LOADER_CLASS_NAME_KEY = "loader.class.name"; + private static final String NATIVE_LIBRARIES_KEY = "native.libraries"; + private static final String ENVIRONMENT_VARIABLES_KEY = "environment.variables"; + private static final String APPLICATION_PARAMETERS_KEY = "application.parameters"; + private static final String BUNDLED_LIBRARIES_KEY = "bundled.libraries"; + private static final String BUNDLED_IN_LIB_RESOURCE_ID_KEY = "android.app.bundled_in_lib_resource_id"; + private static final String BUNDLED_IN_ASSETS_RESOURCE_ID_KEY = "android.app.bundled_in_assets_resource_id"; + private static final String MAIN_LIBRARY_KEY = "main.library"; + private static final String STATIC_INIT_CLASSES_KEY = "static.init.classes"; + private static final String NECESSITAS_API_LEVEL_KEY = "necessitas.api.level"; + + /// Ministro server parameter keys + private static final String REQUIRED_MODULES_KEY = "required.modules"; + private static final String APPLICATION_TITLE_KEY = "application.title"; + private static final String MINIMUM_MINISTRO_API_KEY = "minimum.ministro.api"; + private static final String MINIMUM_QT_VERSION_KEY = "minimum.qt.version"; + private static final String SOURCES_KEY = "sources"; // needs MINISTRO_API_LEVEL >=3 !!! + // Use this key to specify any 3rd party sources urls + // Ministro will download these repositories into their + // own folders, check http://community.kde.org/Necessitas/Ministro + // for more details. + + private static final String REPOSITORY_KEY = "repository"; // use this key to overwrite the default ministro repsitory + + private static final String APPLICATION_PARAMETERS = null; // use this variable to pass any parameters to your application, + // the parameters must not contain any white spaces + // and must be separated with "\t" + // e.g "-param1\t-param2=value2\t-param3\tvalue3" + + private static final String ENVIRONMENT_VARIABLES = "QT_USE_ANDROID_NATIVE_STYLE=0\t"; + // use this variable to add any environment variables to your application. + // the env vars must be separated with "\t" + // e.g. "ENV_VAR1=1\tENV_VAR2=2\t" + // Currently the following vars are used by the android plugin: + // * QT_USE_ANDROID_NATIVE_STYLE - 1 to use the android widget style if available, + // note that the android style plugin in Qt 5.1 is not fully functional. + + private static final int INCOMPATIBLE_MINISTRO_VERSION = 1; // Incompatible Ministro version. Ministro needs to be upgraded. + private static final int BUFFER_SIZE = 1024; + + private ActivityInfo m_activityInfo = null; // activity info object, used to access the libs and the strings + private DexClassLoader m_classLoader = null; // loader object + private String[] m_sources = {"https://download.qt-project.org/ministro/android/qt5/latest"}; // Make sure you are using ONLY secure locations + private String m_repository = "default"; // Overwrites the default Ministro repository + // Possible values: + // * default - Ministro default repository set with "Ministro configuration tool". + // By default the stable version is used. Only this or stable repositories should + // be used in production. + // * stable - stable repository, only this and default repositories should be used + // in production. + // * testing - testing repository, DO NOT use this repository in production, + // this repository is used to push a new release, and should be used to test your application. + // * unstable - unstable repository, DO NOT use this repository in production, + // this repository is used to push Qt snapshots. + private String[] m_qtLibs = null; // required qt libs + + // this function is used to load and start the loader + private void loadApplication(Bundle loaderParams) + { + try { + final int errorCode = loaderParams.getInt(ERROR_CODE_KEY); + if (errorCode != 0) { + if (errorCode == INCOMPATIBLE_MINISTRO_VERSION) { + downloadUpgradeMinistro(loaderParams.getString(ERROR_MESSAGE_KEY)); + return; + } + + // fatal error, show the error and quit + AlertDialog errorDialog = new AlertDialog.Builder(QtActivity.this).create(); + errorDialog.setMessage(loaderParams.getString(ERROR_MESSAGE_KEY)); + errorDialog.setButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }); + errorDialog.show(); + return; + } + + // add all bundled Qt libs to loader params + ArrayList libs = new ArrayList(); + if ( m_activityInfo.metaData.containsKey("android.app.bundled_libs_resource_id") ) + libs.addAll(Arrays.asList(getResources().getStringArray(m_activityInfo.metaData.getInt("android.app.bundled_libs_resource_id")))); + + String libName = null; + if ( m_activityInfo.metaData.containsKey("android.app.lib_name") ) { + libName = m_activityInfo.metaData.getString("android.app.lib_name"); + loaderParams.putString(MAIN_LIBRARY_KEY, libName); //main library contains main() function + } + + loaderParams.putStringArrayList(BUNDLED_LIBRARIES_KEY, libs); + loaderParams.putInt(NECESSITAS_API_LEVEL_KEY, NECESSITAS_API_LEVEL); + + // load and start QtLoader class + m_classLoader = new DexClassLoader(loaderParams.getString(DEX_PATH_KEY), // .jar/.apk files + getDir("outdex", Context.MODE_PRIVATE).getAbsolutePath(), // directory where optimized DEX files should be written. + loaderParams.containsKey(LIB_PATH_KEY) ? loaderParams.getString(LIB_PATH_KEY) : null, // libs folder (if exists) + getClassLoader()); // parent loader + + @SuppressWarnings("rawtypes") + Class loaderClass = m_classLoader.loadClass(loaderParams.getString(LOADER_CLASS_NAME_KEY)); // load QtLoader class + Object qtLoader = loaderClass.newInstance(); // create an instance + Method perpareAppMethod = qtLoader.getClass().getMethod("loadApplication", + Activity.class, + ClassLoader.class, + Bundle.class); + if (!(Boolean)perpareAppMethod.invoke(qtLoader, this, m_classLoader, loaderParams)) + throw new Exception(""); + + QtApplication.setQtActivityDelegate(qtLoader); + + // now load the application library so it's accessible from this class loader + if (libName != null) + System.loadLibrary(libName); + + Method startAppMethod=qtLoader.getClass().getMethod("startApplication"); + if (!(Boolean)startAppMethod.invoke(qtLoader)) + throw new Exception(""); + + } catch (Exception e) { + e.printStackTrace(); + AlertDialog errorDialog = new AlertDialog.Builder(QtActivity.this).create(); + if (m_activityInfo.metaData.containsKey("android.app.fatal_error_msg")) + errorDialog.setMessage(m_activityInfo.metaData.getString("android.app.fatal_error_msg")); + else + errorDialog.setMessage("Fatal error, your application can't be started."); + + errorDialog.setButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }); + errorDialog.show(); + } + } + + private ServiceConnection m_ministroConnection=new ServiceConnection() { + private IMinistro m_service = null; + @Override + public void onServiceConnected(ComponentName name, IBinder service) + { + m_service = IMinistro.Stub.asInterface(service); + try { + if (m_service!=null) { + Bundle parameters= new Bundle(); + parameters.putStringArray(REQUIRED_MODULES_KEY, m_qtLibs); + parameters.putString(APPLICATION_TITLE_KEY, (String)QtActivity.this.getTitle()); + parameters.putInt(MINIMUM_MINISTRO_API_KEY, MINISTRO_API_LEVEL); + parameters.putInt(MINIMUM_QT_VERSION_KEY, QT_VERSION); + parameters.putString(ENVIRONMENT_VARIABLES_KEY, ENVIRONMENT_VARIABLES); + if (null!=APPLICATION_PARAMETERS) + parameters.putString(APPLICATION_PARAMETERS_KEY, APPLICATION_PARAMETERS); + parameters.putStringArray(SOURCES_KEY, m_sources); + parameters.putString(REPOSITORY_KEY, m_repository); + m_service.requestLoader(m_ministroCallback, parameters); + } + } catch (RemoteException e) { + e.printStackTrace(); + } + } + + private IMinistroCallback m_ministroCallback = new IMinistroCallback.Stub() { + // this function is called back by Ministro. + @Override + public void loaderReady(final Bundle loaderParams) throws RemoteException { + runOnUiThread(new Runnable() { + @Override + public void run() { + unbindService(m_ministroConnection); + loadApplication(loaderParams); + } + }); + } + }; + + @Override + public void onServiceDisconnected(ComponentName name) { + m_service = null; + } + }; + + private void downloadUpgradeMinistro(String msg) + { + AlertDialog.Builder downloadDialog = new AlertDialog.Builder(this); + downloadDialog.setMessage(msg); + downloadDialog.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + try { + Uri uri = Uri.parse("market://search?q=pname:org.kde.necessitas.ministro"); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + startActivityForResult(intent, MINISTRO_INSTALL_REQUEST_CODE); + } catch (Exception e) { + e.printStackTrace(); + ministroNotFound(); + } + } + }); + + downloadDialog.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + QtActivity.this.finish(); + } + }); + downloadDialog.show(); + } + + private void ministroNotFound() + { + AlertDialog errorDialog = new AlertDialog.Builder(QtActivity.this).create(); + + if (m_activityInfo.metaData.containsKey("android.app.ministro_not_found_msg")) + errorDialog.setMessage(m_activityInfo.metaData.getString("android.app.ministro_not_found_msg")); + else + errorDialog.setMessage("Can't find Ministro service.\nThe application can't start."); + + errorDialog.setButton(getResources().getString(android.R.string.ok), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }); + errorDialog.show(); + } + + static private void copyFile(InputStream inputStream, OutputStream outputStream) + throws IOException + { + byte[] buffer = new byte[BUFFER_SIZE]; + + int count; + while ((count = inputStream.read(buffer)) > 0) + outputStream.write(buffer, 0, count); + } + + + private void copyAsset(String source, String destination) + throws IOException + { + // Already exists, we don't have to do anything + File destinationFile = new File(destination); + if (destinationFile.exists()) + return; + + File parentDirectory = destinationFile.getParentFile(); + if (!parentDirectory.exists()) + parentDirectory.mkdirs(); + + destinationFile.createNewFile(); + + AssetManager assetsManager = getAssets(); + InputStream inputStream = assetsManager.open(source); + OutputStream outputStream = new FileOutputStream(destinationFile); + copyFile(inputStream, outputStream); + } + + private static void createBundledBinary(String source, String destination) + throws IOException + { + // Already exists, we don't have to do anything + File destinationFile = new File(destination); + if (destinationFile.exists()) + return; + + File parentDirectory = destinationFile.getParentFile(); + if (!parentDirectory.exists()) + parentDirectory.mkdirs(); + + destinationFile.createNewFile(); + + InputStream inputStream = new FileInputStream(source); + OutputStream outputStream = new FileOutputStream(destinationFile); + copyFile(inputStream, outputStream); + } + + private void extractBundledPluginsAndImports(String localPrefix) + throws IOException + { + ArrayList libs = new ArrayList(); + + { + String key = BUNDLED_IN_LIB_RESOURCE_ID_KEY; + java.util.Set keys = m_activityInfo.metaData.keySet(); + if (m_activityInfo.metaData.containsKey(key)) { + String[] list = getResources().getStringArray(m_activityInfo.metaData.getInt(key)); + + for (String bundledImportBinary : list) { + String[] split = bundledImportBinary.split(":"); + String sourceFileName = localPrefix + "lib/" + split[0]; + String destinationFileName = localPrefix + split[1]; + createBundledBinary(sourceFileName, destinationFileName); + } + } + } + + { + String key = BUNDLED_IN_ASSETS_RESOURCE_ID_KEY; + if (m_activityInfo.metaData.containsKey(key)) { + String[] list = getResources().getStringArray(m_activityInfo.metaData.getInt(key)); + + for (String fileName : list) { + String[] split = fileName.split(":"); + String sourceFileName = split[0]; + String destinationFileName = localPrefix + split[1]; + copyAsset(sourceFileName, destinationFileName); + } + } + + } + } + + private void startApp(final boolean firstStart) + { + try { + if (m_activityInfo.metaData.containsKey("android.app.qt_sources_resource_id")) { + int resourceId = m_activityInfo.metaData.getInt("android.app.qt_sources_resource_id"); + m_sources = getResources().getStringArray(resourceId); + } + + if (m_activityInfo.metaData.containsKey("android.app.repository")) + m_repository = m_activityInfo.metaData.getString("android.app.repository"); + + if (m_activityInfo.metaData.containsKey("android.app.qt_libs_resource_id")) { + int resourceId = m_activityInfo.metaData.getInt("android.app.qt_libs_resource_id"); + m_qtLibs = getResources().getStringArray(resourceId); + } + + if (m_activityInfo.metaData.containsKey("android.app.use_local_qt_libs") + && m_activityInfo.metaData.getInt("android.app.use_local_qt_libs") == 1) { + ArrayList libraryList = new ArrayList(); + + + String localPrefix = "/data/local/tmp/qt/"; + if (m_activityInfo.metaData.containsKey("android.app.libs_prefix")) + localPrefix = m_activityInfo.metaData.getString("android.app.libs_prefix"); + + boolean bundlingQtLibs = false; + if (m_activityInfo.metaData.containsKey("android.app.bundle_local_qt_libs") + && m_activityInfo.metaData.getInt("android.app.bundle_local_qt_libs") == 1) { + localPrefix = getApplicationInfo().dataDir + "/"; + extractBundledPluginsAndImports(localPrefix); + bundlingQtLibs = true; + } + + if (m_qtLibs != null) { + for (int i=0;i 0) + libraryList.add(localPrefix + lib); + } + } + + + String dexPaths = new String(); + String pathSeparator = System.getProperty("path.separator", ":"); + if (!bundlingQtLibs && m_activityInfo.metaData.containsKey("android.app.load_local_jars")) { + String[] jarFiles = m_activityInfo.metaData.getString("android.app.load_local_jars").split(":"); + for (String jar:jarFiles) { + if (jar.length() > 0) { + if (dexPaths.length() > 0) + dexPaths += pathSeparator; + dexPaths += localPrefix + jar; + } + } + } + + Bundle loaderParams = new Bundle(); + loaderParams.putInt(ERROR_CODE_KEY, 0); + loaderParams.putString(DEX_PATH_KEY, dexPaths); + loaderParams.putString(LOADER_CLASS_NAME_KEY, "org.qtproject.qt5.android.QtActivityDelegate"); + if (m_activityInfo.metaData.containsKey("android.app.static_init_classes")) { + loaderParams.putStringArray(STATIC_INIT_CLASSES_KEY, + m_activityInfo.metaData.getString("android.app.static_init_classes").split(":")); + } + loaderParams.putStringArrayList(NATIVE_LIBRARIES_KEY, libraryList); + loaderParams.putString(ENVIRONMENT_VARIABLES_KEY, ENVIRONMENT_VARIABLES + + "\tQML2_IMPORT_PATH=" + localPrefix + "/qml" + + "\tQML_IMPORT_PATH=" + localPrefix + "/imports" + + "\tQT_PLUGIN_PATH=" + localPrefix + "/plugins"); + loadApplication(loaderParams); + return; + } + + try { + if (!bindService(new Intent(org.kde.necessitas.ministro.IMinistro.class.getCanonicalName()), + m_ministroConnection, + Context.BIND_AUTO_CREATE)) { + throw new SecurityException(""); + } + } catch (Exception e) { + if (firstStart) { + String msg = "This application requires Ministro service. Would you like to install it?"; + if (m_activityInfo.metaData.containsKey("android.app.ministro_needed_msg")) + msg = m_activityInfo.metaData.getString("android.app.ministro_needed_msg"); + downloadUpgradeMinistro(msg); + } else { + ministroNotFound(); + } + } + } catch (Exception e) { + Log.e(QtApplication.QtTAG, "Can't create main activity", e); + } + } + + + + /////////////////////////// forward all notifications //////////////////////////// + /////////////////////////// Super class calls //////////////////////////////////// + /////////////// PLEASE DO NOT CHANGE THE FOLLOWING CODE ////////////////////////// + ////////////////////////////////////////////////////////////////////////////////// + + @Override + public boolean dispatchKeyEvent(KeyEvent event) + { + if (QtApplication.m_delegateObject != null && QtApplication.dispatchKeyEvent != null) + return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchKeyEvent, event); + else + return super.dispatchKeyEvent(event); + } + public boolean super_dispatchKeyEvent(KeyEvent event) + { + return super.dispatchKeyEvent(event); + } + //--------------------------------------------------------------------------- + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) + { + if (QtApplication.m_delegateObject != null && QtApplication.dispatchPopulateAccessibilityEvent != null) + return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchPopulateAccessibilityEvent, event); + else + return super.dispatchPopulateAccessibilityEvent(event); + } + public boolean super_dispatchPopulateAccessibilityEvent(AccessibilityEvent event) + { + return super_dispatchPopulateAccessibilityEvent(event); + } + //--------------------------------------------------------------------------- + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) + { + if (QtApplication.m_delegateObject != null && QtApplication.dispatchTouchEvent != null) + return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchTouchEvent, ev); + else + return super.dispatchTouchEvent(ev); + } + public boolean super_dispatchTouchEvent(MotionEvent event) + { + return super.dispatchTouchEvent(event); + } + //--------------------------------------------------------------------------- + + @Override + public boolean dispatchTrackballEvent(MotionEvent ev) + { + if (QtApplication.m_delegateObject != null && QtApplication.dispatchTrackballEvent != null) + return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchTrackballEvent, ev); + else + return super.dispatchTrackballEvent(ev); + } + public boolean super_dispatchTrackballEvent(MotionEvent event) + { + return super.dispatchTrackballEvent(event); + } + //--------------------------------------------------------------------------- + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) + { + + if (QtApplication.m_delegateObject != null && QtApplication.onActivityResult != null) { + QtApplication.invokeDelegateMethod(QtApplication.onActivityResult, requestCode, resultCode, data); + return; + } + if (requestCode == MINISTRO_INSTALL_REQUEST_CODE) + startApp(false); + super.onActivityResult(requestCode, resultCode, data); + } + public void super_onActivityResult(int requestCode, int resultCode, Intent data) + { + super.onActivityResult(requestCode, resultCode, data); + } + //--------------------------------------------------------------------------- + + @Override + protected void onApplyThemeResource(Theme theme, int resid, boolean first) + { + if (!QtApplication.invokeDelegate(theme, resid, first).invoked) + super.onApplyThemeResource(theme, resid, first); + } + public void super_onApplyThemeResource(Theme theme, int resid, boolean first) + { + super.onApplyThemeResource(theme, resid, first); + } + //--------------------------------------------------------------------------- + + + @Override + protected void onChildTitleChanged(Activity childActivity, CharSequence title) + { + if (!QtApplication.invokeDelegate(childActivity, title).invoked) + super.onChildTitleChanged(childActivity, title); + } + public void super_onChildTitleChanged(Activity childActivity, CharSequence title) + { + super.onChildTitleChanged(childActivity, title); + } + //--------------------------------------------------------------------------- + + @Override + public void onConfigurationChanged(Configuration newConfig) + { + if (!QtApplication.invokeDelegate(newConfig).invoked) + super.onConfigurationChanged(newConfig); + } + public void super_onConfigurationChanged(Configuration newConfig) + { + super.onConfigurationChanged(newConfig); + } + //--------------------------------------------------------------------------- + + @Override + public void onContentChanged() + { + if (!QtApplication.invokeDelegate().invoked) + super.onContentChanged(); + } + public void super_onContentChanged() + { + super.onContentChanged(); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onContextItemSelected(MenuItem item) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(item); + if (res.invoked) + return (Boolean)res.methodReturns; + else + return super.onContextItemSelected(item); + } + public boolean super_onContextItemSelected(MenuItem item) + { + return super.onContextItemSelected(item); + } + //--------------------------------------------------------------------------- + + @Override + public void onContextMenuClosed(Menu menu) + { + if (!QtApplication.invokeDelegate(menu).invoked) + super.onContextMenuClosed(menu); + } + public void super_onContextMenuClosed(Menu menu) + { + super.onContextMenuClosed(menu); + } + //--------------------------------------------------------------------------- + + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + if (QtApplication.m_delegateObject != null && QtApplication.onCreate != null) { + QtApplication.invokeDelegateMethod(QtApplication.onCreate, savedInstanceState); + return; + } + + requestWindowFeature(Window.FEATURE_NO_TITLE); + try { + m_activityInfo = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA); + } catch (NameNotFoundException e) { + e.printStackTrace(); + finish(); + return; + } + + if (null == getLastNonConfigurationInstance()) { + // if splash screen is defined, then show it + if (m_activityInfo.metaData.containsKey("android.app.splash_screen") ) + setContentView(m_activityInfo.metaData.getInt("android.app.splash_screen")); + startApp(true); + } + } + //--------------------------------------------------------------------------- + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) + { + if (!QtApplication.invokeDelegate(menu, v, menuInfo).invoked) + super.onCreateContextMenu(menu, v, menuInfo); + } + public void super_onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) + { + super.onCreateContextMenu(menu, v, menuInfo); + } + //--------------------------------------------------------------------------- + + @Override + public CharSequence onCreateDescription() + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(); + if (res.invoked) + return (CharSequence)res.methodReturns; + else + return super.onCreateDescription(); + } + public CharSequence super_onCreateDescription() + { + return super.onCreateDescription(); + } + //--------------------------------------------------------------------------- + + @Override + protected Dialog onCreateDialog(int id) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(id); + if (res.invoked) + return (Dialog)res.methodReturns; + else + return super.onCreateDialog(id); + } + public Dialog super_onCreateDialog(int id) + { + return super.onCreateDialog(id); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(menu); + if (res.invoked) + return (Boolean)res.methodReturns; + else + return super.onCreateOptionsMenu(menu); + } + public boolean super_onCreateOptionsMenu(Menu menu) + { + return super.onCreateOptionsMenu(menu); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(featureId, menu); + if (res.invoked) + return (Boolean)res.methodReturns; + else + return super.onCreatePanelMenu(featureId, menu); + } + public boolean super_onCreatePanelMenu(int featureId, Menu menu) + { + return super.onCreatePanelMenu(featureId, menu); + } + //--------------------------------------------------------------------------- + + + @Override + public View onCreatePanelView(int featureId) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(featureId); + if (res.invoked) + return (View)res.methodReturns; + else + return super.onCreatePanelView(featureId); + } + public View super_onCreatePanelView(int featureId) + { + return super.onCreatePanelView(featureId); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onCreateThumbnail(Bitmap outBitmap, Canvas canvas) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(outBitmap, canvas); + if (res.invoked) + return (Boolean)res.methodReturns; + else + return super.onCreateThumbnail(outBitmap, canvas); + } + public boolean super_onCreateThumbnail(Bitmap outBitmap, Canvas canvas) + { + return super.onCreateThumbnail(outBitmap, canvas); + } + //--------------------------------------------------------------------------- + + @Override + public View onCreateView(String name, Context context, AttributeSet attrs) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(name, context, attrs); + if (res.invoked) + return (View)res.methodReturns; + else + return super.onCreateView(name, context, attrs); + } + public View super_onCreateView(String name, Context context, AttributeSet attrs) + { + return super.onCreateView(name, context, attrs); + } + //--------------------------------------------------------------------------- + + @Override + protected void onDestroy() + { + super.onDestroy(); + QtApplication.invokeDelegate(); + } + //--------------------------------------------------------------------------- + + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) + { + if (QtApplication.m_delegateObject != null && QtApplication.onKeyDown != null) + return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyDown, keyCode, event); + else + return super.onKeyDown(keyCode, event); + } + public boolean super_onKeyDown(int keyCode, KeyEvent event) + { + return super.onKeyDown(keyCode, event); + } + //--------------------------------------------------------------------------- + + + @Override + public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) + { + if (QtApplication.m_delegateObject != null && QtApplication.onKeyMultiple != null) + return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyMultiple, keyCode, repeatCount, event); + else + return super.onKeyMultiple(keyCode, repeatCount, event); + } + public boolean super_onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) + { + return super.onKeyMultiple(keyCode, repeatCount, event); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) + { + if (QtApplication.m_delegateObject != null && QtApplication.onKeyDown != null) + return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyUp, keyCode, event); + else + return super.onKeyUp(keyCode, event); + } + public boolean super_onKeyUp(int keyCode, KeyEvent event) + { + return super.onKeyUp(keyCode, event); + } + //--------------------------------------------------------------------------- + + @Override + public void onLowMemory() + { + if (!QtApplication.invokeDelegate().invoked) + super.onLowMemory(); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(featureId, item); + if (res.invoked) + return (Boolean)res.methodReturns; + else + return super.onMenuItemSelected(featureId, item); + } + public boolean super_onMenuItemSelected(int featureId, MenuItem item) + { + return super.onMenuItemSelected(featureId, item); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onMenuOpened(int featureId, Menu menu) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(featureId, menu); + if (res.invoked) + return (Boolean)res.methodReturns; + else + return super.onMenuOpened(featureId, menu); + } + public boolean super_onMenuOpened(int featureId, Menu menu) + { + return super.onMenuOpened(featureId, menu); + } + //--------------------------------------------------------------------------- + + @Override + protected void onNewIntent(Intent intent) + { + if (!QtApplication.invokeDelegate(intent).invoked) + super.onNewIntent(intent); + } + public void super_onNewIntent(Intent intent) + { + super.onNewIntent(intent); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(item); + if (res.invoked) + return (Boolean)res.methodReturns; + else + return super.onOptionsItemSelected(item); + } + public boolean super_onOptionsItemSelected(MenuItem item) + { + return super.onOptionsItemSelected(item); + } + //--------------------------------------------------------------------------- + + @Override + public void onOptionsMenuClosed(Menu menu) + { + if (!QtApplication.invokeDelegate(menu).invoked) + super.onOptionsMenuClosed(menu); + } + public void super_onOptionsMenuClosed(Menu menu) + { + super.onOptionsMenuClosed(menu); + } + //--------------------------------------------------------------------------- + + @Override + public void onPanelClosed(int featureId, Menu menu) + { + if (!QtApplication.invokeDelegate(featureId, menu).invoked) + super.onPanelClosed(featureId, menu); + } + public void super_onPanelClosed(int featureId, Menu menu) + { + super.onPanelClosed(featureId, menu); + } + //--------------------------------------------------------------------------- + + @Override + protected void onPause() + { + super.onPause(); + QtApplication.invokeDelegate(); + } + //--------------------------------------------------------------------------- + + @Override + protected void onPostCreate(Bundle savedInstanceState) + { + super.onPostCreate(savedInstanceState); + QtApplication.invokeDelegate(savedInstanceState); + } + //--------------------------------------------------------------------------- + + @Override + protected void onPostResume() + { + super.onPostResume(); + QtApplication.invokeDelegate(); + } + //--------------------------------------------------------------------------- + + @Override + protected void onPrepareDialog(int id, Dialog dialog) + { + if (!QtApplication.invokeDelegate(id, dialog).invoked) + super.onPrepareDialog(id, dialog); + } + public void super_onPrepareDialog(int id, Dialog dialog) + { + super.onPrepareDialog(id, dialog); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onPrepareOptionsMenu(Menu menu) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(menu); + if (res.invoked) + return (Boolean)res.methodReturns; + else + return super.onPrepareOptionsMenu(menu); + } + public boolean super_onPrepareOptionsMenu(Menu menu) + { + return super.onPrepareOptionsMenu(menu); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(featureId, view, menu); + if (res.invoked) + return (Boolean)res.methodReturns; + else + return super.onPreparePanel(featureId, view, menu); + } + public boolean super_onPreparePanel(int featureId, View view, Menu menu) + { + return super.onPreparePanel(featureId, view, menu); + } + //--------------------------------------------------------------------------- + + @Override + protected void onRestart() + { + super.onRestart(); + QtApplication.invokeDelegate(); + } + //--------------------------------------------------------------------------- + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) + { + if (!QtApplication.invokeDelegate(savedInstanceState).invoked) + super.onRestoreInstanceState(savedInstanceState); + } + public void super_onRestoreInstanceState(Bundle savedInstanceState) + { + super.onRestoreInstanceState(savedInstanceState); + } + //--------------------------------------------------------------------------- + + @Override + protected void onResume() + { + super.onResume(); + QtApplication.invokeDelegate(); + } + //--------------------------------------------------------------------------- + + @Override + public Object onRetainNonConfigurationInstance() + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(); + if (res.invoked) + return res.methodReturns; + else + return super.onRetainNonConfigurationInstance(); + } + public Object super_onRetainNonConfigurationInstance() + { + return super.onRetainNonConfigurationInstance(); + } + //--------------------------------------------------------------------------- + + @Override + protected void onSaveInstanceState(Bundle outState) + { + if (!QtApplication.invokeDelegate(outState).invoked) + super.onSaveInstanceState(outState); + } + public void super_onSaveInstanceState(Bundle outState) + { + super.onSaveInstanceState(outState); + + } + //--------------------------------------------------------------------------- + + @Override + public boolean onSearchRequested() + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(); + if (res.invoked) + return (Boolean)res.methodReturns; + else + return super.onSearchRequested(); + } + public boolean super_onSearchRequested() + { + return super.onSearchRequested(); + } + //--------------------------------------------------------------------------- + + @Override + protected void onStart() + { + super.onStart(); + QtApplication.invokeDelegate(); + } + //--------------------------------------------------------------------------- + + @Override + protected void onStop() + { + super.onStop(); + QtApplication.invokeDelegate(); + } + //--------------------------------------------------------------------------- + + @Override + protected void onTitleChanged(CharSequence title, int color) + { + if (!QtApplication.invokeDelegate(title, color).invoked) + super.onTitleChanged(title, color); + } + public void super_onTitleChanged(CharSequence title, int color) + { + super.onTitleChanged(title, color); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onTouchEvent(MotionEvent event) + { + if (QtApplication.m_delegateObject != null && QtApplication.onTouchEvent != null) + return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onTouchEvent, event); + else + return super.onTouchEvent(event); + } + public boolean super_onTouchEvent(MotionEvent event) + { + return super.onTouchEvent(event); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onTrackballEvent(MotionEvent event) + { + if (QtApplication.m_delegateObject != null && QtApplication.onTrackballEvent != null) + return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onTrackballEvent, event); + else + return super.onTrackballEvent(event); + } + public boolean super_onTrackballEvent(MotionEvent event) + { + return super.onTrackballEvent(event); + } + //--------------------------------------------------------------------------- + + @Override + public void onUserInteraction() + { + if (!QtApplication.invokeDelegate().invoked) + super.onUserInteraction(); + } + public void super_onUserInteraction() + { + super.onUserInteraction(); + } + //--------------------------------------------------------------------------- + + @Override + protected void onUserLeaveHint() + { + if (!QtApplication.invokeDelegate().invoked) + super.onUserLeaveHint(); + } + public void super_onUserLeaveHint() + { + super.onUserLeaveHint(); + } + //--------------------------------------------------------------------------- + + @Override + public void onWindowAttributesChanged(LayoutParams params) + { + if (!QtApplication.invokeDelegate(params).invoked) + super.onWindowAttributesChanged(params); + } + public void super_onWindowAttributesChanged(LayoutParams params) + { + super.onWindowAttributesChanged(params); + } + //--------------------------------------------------------------------------- + + @Override + public void onWindowFocusChanged(boolean hasFocus) + { + if (!QtApplication.invokeDelegate(hasFocus).invoked) + super.onWindowFocusChanged(hasFocus); + } + public void super_onWindowFocusChanged(boolean hasFocus) + { + super.onWindowFocusChanged(hasFocus); + } + //--------------------------------------------------------------------------- + + //////////////// Activity API 5 ///////////// +//@ANDROID-5 + @Override + public void onAttachedToWindow() + { + if (!QtApplication.invokeDelegate().invoked) + super.onAttachedToWindow(); + } + public void super_onAttachedToWindow() + { + super.onAttachedToWindow(); + } + //--------------------------------------------------------------------------- + + @Override + public void onBackPressed() + { + if (!QtApplication.invokeDelegate().invoked) + super.onBackPressed(); + } + public void super_onBackPressed() + { + super.onBackPressed(); + } + //--------------------------------------------------------------------------- + + @Override + public void onDetachedFromWindow() + { + if (!QtApplication.invokeDelegate().invoked) + super.onDetachedFromWindow(); + } + public void super_onDetachedFromWindow() + { + super.onDetachedFromWindow(); + } + //--------------------------------------------------------------------------- + + @Override + public boolean onKeyLongPress(int keyCode, KeyEvent event) + { + if (QtApplication.m_delegateObject != null && QtApplication.onKeyLongPress != null) + return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyLongPress, keyCode, event); + else + return super.onKeyLongPress(keyCode, event); + } + public boolean super_onKeyLongPress(int keyCode, KeyEvent event) + { + return super.onKeyLongPress(keyCode, event); + } + //--------------------------------------------------------------------------- +//@ANDROID-5 + +//////////////// Activity API 8 ///////////// +//@ANDROID-8 +@Override + protected Dialog onCreateDialog(int id, Bundle args) + { + QtApplication.InvokeResult res = QtApplication.invokeDelegate(id, args); + if (res.invoked) + return (Dialog)res.methodReturns; + else + return super.onCreateDialog(id, args); + } + public Dialog super_onCreateDialog(int id, Bundle args) + { + return super.onCreateDialog(id, args); + } + //--------------------------------------------------------------------------- + + @Override + protected void onPrepareDialog(int id, Dialog dialog, Bundle args) + { + if (!QtApplication.invokeDelegate(id, dialog, args).invoked) + super.onPrepareDialog(id, dialog, args); + } + public void super_onPrepareDialog(int id, Dialog dialog, Bundle args) + { + super.onPrepareDialog(id, dialog, args); + } + //--------------------------------------------------------------------------- +//@ANDROID-8 + //////////////// Activity API 11 ///////////// + +//@ANDROID-11 +//QtCreator @Override +//QtCreator public boolean dispatchKeyShortcutEvent(KeyEvent event) +//QtCreator { +//QtCreator if (QtApplication.m_delegateObject != null && QtApplication.dispatchKeyShortcutEvent != null) +//QtCreator return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchKeyShortcutEvent, event); +//QtCreator else +//QtCreator return super.dispatchKeyShortcutEvent(event); +//QtCreator } +//QtCreator public boolean super_dispatchKeyShortcutEvent(KeyEvent event) +//QtCreator { +//QtCreator return super.dispatchKeyShortcutEvent(event); +//QtCreator } +//QtCreator //--------------------------------------------------------------------------- +//QtCreator +//QtCreator @Override +//QtCreator public void onActionModeFinished(ActionMode mode) +//QtCreator { +//QtCreator if (!QtApplication.invokeDelegate(mode).invoked) +//QtCreator super.onActionModeFinished(mode); +//QtCreator } +//QtCreator public void super_onActionModeFinished(ActionMode mode) +//QtCreator { +//QtCreator super.onActionModeFinished(mode); +//QtCreator } +//QtCreator //--------------------------------------------------------------------------- +//QtCreator +//QtCreator @Override +//QtCreator public void onActionModeStarted(ActionMode mode) +//QtCreator { +//QtCreator if (!QtApplication.invokeDelegate(mode).invoked) +//QtCreator super.onActionModeStarted(mode); +//QtCreator } +//QtCreator public void super_onActionModeStarted(ActionMode mode) +//QtCreator { +//QtCreator super.onActionModeStarted(mode); +//QtCreator } +//QtCreator //--------------------------------------------------------------------------- +//QtCreator +//QtCreator @Override +//QtCreator public void onAttachFragment(Fragment fragment) +//QtCreator { +//QtCreator if (!QtApplication.invokeDelegate(fragment).invoked) +//QtCreator super.onAttachFragment(fragment); +//QtCreator } +//QtCreator public void super_onAttachFragment(Fragment fragment) +//QtCreator { +//QtCreator super.onAttachFragment(fragment); +//QtCreator } +//QtCreator //--------------------------------------------------------------------------- +//QtCreator +//QtCreator @Override +//QtCreator public View onCreateView(View parent, String name, Context context, AttributeSet attrs) +//QtCreator { +//QtCreator QtApplication.InvokeResult res = QtApplication.invokeDelegate(parent, name, context, attrs); +//QtCreator if (res.invoked) +//QtCreator return (View)res.methodReturns; +//QtCreator else +//QtCreator return super.onCreateView(parent, name, context, attrs); +//QtCreator } +//QtCreator public View super_onCreateView(View parent, String name, Context context, +//QtCreator AttributeSet attrs) { +//QtCreator return super.onCreateView(parent, name, context, attrs); +//QtCreator } +//QtCreator //--------------------------------------------------------------------------- +//QtCreator +//QtCreator @Override +//QtCreator public boolean onKeyShortcut(int keyCode, KeyEvent event) +//QtCreator { +//QtCreator if (QtApplication.m_delegateObject != null && QtApplication.onKeyShortcut != null) +//QtCreator return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyShortcut, keyCode,event); +//QtCreator else +//QtCreator return super.onKeyShortcut(keyCode, event); +//QtCreator } +//QtCreator public boolean super_onKeyShortcut(int keyCode, KeyEvent event) +//QtCreator { +//QtCreator return super.onKeyShortcut(keyCode, event); +//QtCreator } +//QtCreator //--------------------------------------------------------------------------- +//QtCreator +//QtCreator @Override +//QtCreator public ActionMode onWindowStartingActionMode(Callback callback) +//QtCreator { +//QtCreator QtApplication.InvokeResult res = QtApplication.invokeDelegate(callback); +//QtCreator if (res.invoked) +//QtCreator return (ActionMode)res.methodReturns; +//QtCreator else +//QtCreator return super.onWindowStartingActionMode(callback); +//QtCreator } +//QtCreator public ActionMode super_onWindowStartingActionMode(Callback callback) +//QtCreator { +//QtCreator return super.onWindowStartingActionMode(callback); +//QtCreator } +//QtCreator //--------------------------------------------------------------------------- +//@ANDROID-11 + //////////////// Activity API 12 ///////////// + +//@ANDROID-12 +//QtCreator @Override +//QtCreator public boolean dispatchGenericMotionEvent(MotionEvent ev) +//QtCreator { +//QtCreator if (QtApplication.m_delegateObject != null && QtApplication.dispatchGenericMotionEvent != null) +//QtCreator return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchGenericMotionEvent, ev); +//QtCreator else +//QtCreator return super.dispatchGenericMotionEvent(ev); +//QtCreator } +//QtCreator public boolean super_dispatchGenericMotionEvent(MotionEvent event) +//QtCreator { +//QtCreator return super.dispatchGenericMotionEvent(event); +//QtCreator } +//QtCreator //--------------------------------------------------------------------------- +//QtCreator +//QtCreator @Override +//QtCreator public boolean onGenericMotionEvent(MotionEvent event) +//QtCreator { +//QtCreator if (QtApplication.m_delegateObject != null && QtApplication.onGenericMotionEvent != null) +//QtCreator return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onGenericMotionEvent, event); +//QtCreator else +//QtCreator return super.onGenericMotionEvent(event); +//QtCreator } +//QtCreator public boolean super_onGenericMotionEvent(MotionEvent event) +//QtCreator { +//QtCreator return super.onGenericMotionEvent(event); +//QtCreator } +//QtCreator //--------------------------------------------------------------------------- +//@ANDROID-12 + +} diff --git a/experimental/qt5-intro-android/android/src/org/qtproject/qt5/android/bindings/QtApplication.java b/experimental/qt5-intro-android/android/src/org/qtproject/qt5/android/bindings/QtApplication.java new file mode 100644 index 0000000..4de1c83 --- /dev/null +++ b/experimental/qt5-intro-android/android/src/org/qtproject/qt5/android/bindings/QtApplication.java @@ -0,0 +1,149 @@ +/* + Copyright (c) 2012-2013, BogDan Vatra + Contact: http://www.qt-project.org/legal + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +*/ + +package org.qtproject.qt5.android.bindings; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; + +import android.app.Application; + +public class QtApplication extends Application +{ + public final static String QtTAG = "Qt"; + public static Object m_delegateObject = null; + public static HashMap> m_delegateMethods= new HashMap>(); + public static Method dispatchKeyEvent = null; + public static Method dispatchPopulateAccessibilityEvent = null; + public static Method dispatchTouchEvent = null; + public static Method dispatchTrackballEvent = null; + public static Method onKeyDown = null; + public static Method onKeyMultiple = null; + public static Method onKeyUp = null; + public static Method onTouchEvent = null; + public static Method onTrackballEvent = null; + public static Method onActivityResult = null; + public static Method onCreate = null; + public static Method onKeyLongPress = null; + public static Method dispatchKeyShortcutEvent = null; + public static Method onKeyShortcut = null; + public static Method dispatchGenericMotionEvent = null; + public static Method onGenericMotionEvent = null; + + public static void setQtActivityDelegate(Object listener) + { + QtApplication.m_delegateObject = listener; + + ArrayList delegateMethods = new ArrayList(); + for (Method m : listener.getClass().getMethods()) { + if (m.getDeclaringClass().getName().startsWith("org.qtproject.qt5.android")) + delegateMethods.add(m); + } + + ArrayList applicationFields = new ArrayList(); + for (Field f : QtApplication.class.getFields()) { + if (f.getDeclaringClass().getName().equals(QtApplication.class.getName())) + applicationFields.add(f); + } + + for (Method delegateMethod : delegateMethods) { + try { + QtActivity.class.getDeclaredMethod(delegateMethod.getName(), delegateMethod.getParameterTypes()); + if (QtApplication.m_delegateMethods.containsKey(delegateMethod.getName())) { + QtApplication.m_delegateMethods.get(delegateMethod.getName()).add(delegateMethod); + } else { + ArrayList delegateSet = new ArrayList(); + delegateSet.add(delegateMethod); + QtApplication.m_delegateMethods.put(delegateMethod.getName(), delegateSet); + } + for (Field applicationField:applicationFields) { + if (applicationField.getName().equals(delegateMethod.getName())) { + try { + applicationField.set(null, delegateMethod); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } catch (Exception e) { + } + } + } + + @Override + public void onTerminate() { + if (m_delegateObject != null && m_delegateMethods.containsKey("onTerminate")) + invokeDelegateMethod(m_delegateMethods.get("onTerminate").get(0)); + super.onTerminate(); + } + + public static class InvokeResult + { + public boolean invoked = false; + public Object methodReturns = null; + } + + private static int stackDeep=-1; + public static InvokeResult invokeDelegate(Object... args) + { + InvokeResult result = new InvokeResult(); + if (m_delegateObject == null) + return result; + StackTraceElement[] elements = Thread.currentThread().getStackTrace(); + if (-1 == stackDeep) { + String activityClassName = QtActivity.class.getCanonicalName(); + for (int it=0;it 0 ? slides[currentSlide].timeout : 7000 + running: false + onTriggered: goToNextSlide() + } + focus: true Keys.onSpacePressed: goToNextSlide() Keys.onRightPressed: goToNextSlide() @@ -212,4 +223,21 @@ Item { font.italic: notes == ""; } } + + Text { + id: tapToAdvance + color: textColor + anchors.bottom: parent.bottom + anchors.bottomMargin: parent.height * 0.01 + anchors.horizontalCenter: parent.horizontalCenter + text: "[ Tap to advance ]" + font.family: fontFamily + font.pixelSize: slides[currentSlide].baseFontSize + opacity: slides[currentSlide].showTapToAdvance ? 1.0 : 0.0 + visible: opacity > 0.0 + + Behavior on opacity { + NumberAnimation { duration: 400 } + } + } } diff --git a/experimental/qt5-intro-android/presentation/Slide.qml b/experimental/qt5-intro-android/presentation/Slide.qml index 039c3a3..40b7b93 100644 --- a/experimental/qt5-intro-android/presentation/Slide.qml +++ b/experimental/qt5-intro-android/presentation/Slide.qml @@ -51,6 +51,9 @@ Item { id: slide property bool isSlide: true; + property bool shouldTimeout: true + property real timeout: 0 + property bool showTapToAdvance: !shouldTimeout property string title; property variant content: [] @@ -128,7 +131,7 @@ Item { NumberAnimation on length { from: 0; to: slide.writeInText.length; - duration: slide.textAnimating ? slide.writeInText.length * 30 : 1; + duration: slide.textAnimating ? slide.writeInText.length * 10 : 1; running: slide.visible && parent.visible && slide.writeInText.length > 0 } -- cgit v1.2.3