summaryrefslogtreecommitdiffstats
path: root/src/android/java
diff options
context:
space:
mode:
authorPaul Olav Tvete <paul.tvete@digia.com>2013-03-04 10:16:42 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-03-05 08:31:23 +0100
commit97fcf3bc987a18f32233fea550eb4a5a22e2b822 (patch)
tree31d75557fdc4a525af8f5053db514066c63bd1bd /src/android/java
parent1b582d64eb6d13e60a02ebc40956302a4864eb6c (diff)
Introducing the Qt Android port
Based on the Necessitas project by Bogdan Vatra. Contributors to the Qt5 project: BogDan Vatra <bogdan@kde.org> Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com> hjk <hjk121@nokiamail.com> Oswald Buddenhagen <oswald.buddenhagen@digia.com> Paul Olav Tvete <paul.tvete@digia.com> Robin Burchell <robin+qt@viroteck.net> Samuel Rødal <samuel.rodal@digia.com> Yoann Lopes <yoann.lopes@digia.com> The full history of the Qt5 port can be found in refs/old-heads/android, SHA-1 249ca9ca2c7d876b91b31df9434dde47f9065d0d Change-Id: Iff1a7b2dbb707c986f2639e65e39ed8f22430120 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com> Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/android/java')
-rw-r--r--src/android/java/AndroidManifest.xml25
-rw-r--r--src/android/java/res/layout/splash.xml13
-rw-r--r--src/android/java/res/values-de/strings.xml6
-rw-r--r--src/android/java/res/values-el/strings.xml6
-rw-r--r--src/android/java/res/values-es/strings.xml6
-rw-r--r--src/android/java/res/values-et/strings.xml6
-rw-r--r--src/android/java/res/values-fa/strings.xml6
-rw-r--r--src/android/java/res/values-fr/strings.xml6
-rw-r--r--src/android/java/res/values-id/strings.xml6
-rw-r--r--src/android/java/res/values-it/strings.xml6
-rw-r--r--src/android/java/res/values-ja/strings.xml6
-rw-r--r--src/android/java/res/values-ms/strings.xml6
-rw-r--r--src/android/java/res/values-nb/strings.xml6
-rw-r--r--src/android/java/res/values-nl/strings.xml6
-rw-r--r--src/android/java/res/values-pl/strings.xml6
-rw-r--r--src/android/java/res/values-pt-rBR/strings.xml6
-rw-r--r--src/android/java/res/values-ro/strings.xml6
-rw-r--r--src/android/java/res/values-rs/strings.xml6
-rw-r--r--src/android/java/res/values-ru/strings.xml6
-rw-r--r--src/android/java/res/values-zh-rCN/strings.xml6
-rw-r--r--src/android/java/res/values-zh-rTW/strings.xml6
-rw-r--r--src/android/java/res/values/libs.xml8
-rw-r--r--src/android/java/res/values/strings.xml7
-rw-r--r--src/android/java/src/org/kde/necessitas/ministro/IMinistro.aidl49
-rw-r--r--src/android/java/src/org/kde/necessitas/ministro/IMinistroCallback.aidl53
-rw-r--r--src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java1278
-rw-r--r--src/android/java/src/org/qtproject/qt5/android/bindings/QtApplication.java149
-rw-r--r--src/android/java/version.xml8
28 files changed, 1704 insertions, 0 deletions
diff --git a/src/android/java/AndroidManifest.xml b/src/android/java/AndroidManifest.xml
new file mode 100644
index 0000000000..7a77d6fd83
--- /dev/null
+++ b/src/android/java/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version='1.0' encoding='utf-8'?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="org.kde.necessitas.example">
+ <application android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="@string/app_name">
+ <activity android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="@string/app_name" android:configChanges="orientation|locale|fontScale|keyboard|keyboardHidden" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ <meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
+ <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
+ <meta-data android:name="android.app.lib_name" android:value=""/>
+ <!-- Messages maps -->
+ <meta-data android:name="android.app.ministro_not_found_msg" android:value="@string/ministro_not_found_msg"/>
+ <meta-data android:name="android.app.ministro_needed_msg" android:value="@string/ministro_needed_msg"/>
+ <meta-data android:name="android.app.fatal_error_msg" android:value="@string/fatal_error_msg"/>
+ <!-- Messages maps -->
+ <!-- Splash screen -->
+ <meta-data android:name="android.app.splash_screen" android:resource="@layout/splash"/>
+ <!-- Splash screen -->
+ </activity>
+ </application>
+ <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
+ <uses-permission android:name="android.permission.INTERNET"/>
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+</manifest>
diff --git a/src/android/java/res/layout/splash.xml b/src/android/java/res/layout/splash.xml
new file mode 100644
index 0000000000..6b0d492dd5
--- /dev/null
+++ b/src/android/java/res/layout/splash.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:layout_gravity="center"
+ >
+ <ImageView
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:scaleType="fitXY"
+ />
+</LinearLayout>
diff --git a/src/android/java/res/values-de/strings.xml b/src/android/java/res/values-de/strings.xml
new file mode 100644
index 0000000000..320d9ec33f
--- /dev/null
+++ b/src/android/java/res/values-de/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Ministro-Dienst wurde nicht gefunden.\nAnwendung kann nicht gestartet werden</string>
+ <string name="ministro_needed_msg">Diese Anwendung benötigt den Ministro-Dienst. Möchten Sie ihn installieren?</string>
+ <string name="fatal_error_msg">In Ihrer Anwendung ist ein schwerwiegender Fehler aufgetreten, sie kann nicht fortgesetzt werden</string>
+</resources>
diff --git a/src/android/java/res/values-el/strings.xml b/src/android/java/res/values-el/strings.xml
new file mode 100644
index 0000000000..3cab212f2b
--- /dev/null
+++ b/src/android/java/res/values-el/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Δεν ήταν δυνατή η εύρεση της υπηρεσίας Ministro. Δεν είναι δυνατή η εκκίνηση της εφαρμογής.</string>
+ <string name="ministro_needed_msg">Η εφαρμογή απαιτεί την υπηρεσία Ministro. Να εγκατασταθεί η υπηρεσία?</string>
+ <string name="fatal_error_msg">Παρουσιάστηκε ένα κρίσιμο σφάλμα και η εφαρμογή δεν μπορεί να συνεχίσει.</string>
+</resources>
diff --git a/src/android/java/res/values-es/strings.xml b/src/android/java/res/values-es/strings.xml
new file mode 100644
index 0000000000..cf0b54d0b0
--- /dev/null
+++ b/src/android/java/res/values-es/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Servicio Ministro inesistente. Imposible ejecutar la aplicación.</string>
+ <string name="ministro_needed_msg">Esta aplicación requiere el servicio Ministro. Instalarlo?</string>
+ <string name="fatal_error_msg">La aplicación ha causado un error grave y no es posible continuar.</string>
+</resources>
diff --git a/src/android/java/res/values-et/strings.xml b/src/android/java/res/values-et/strings.xml
new file mode 100644
index 0000000000..d55a3c1471
--- /dev/null
+++ b/src/android/java/res/values-et/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Ei suuda leida Ministro teenust.\nProgrammi ei saa käivitada.</string>
+ <string name="ministro_needed_msg">See programm vajab Ministro teenust.\nKas soovite paigaldada?</string>
+ <string name="fatal_error_msg">Programmiga juhtus fataalne viga.\nKahjuks ei saa jätkata.</string>
+</resources>
diff --git a/src/android/java/res/values-fa/strings.xml b/src/android/java/res/values-fa/strings.xml
new file mode 100644
index 0000000000..a8d1b87444
--- /dev/null
+++ b/src/android/java/res/values-fa/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">سرویس Ministro را پیدا نمی‌کند. برنامه نمی‌تواند آغاز شود.</string>
+ <string name="ministro_needed_msg">این نرم‌افزار به سرویس Ministro احتیاج دارد. آیا دوست دارید آن را نصب کنید؟</string>
+ <string name="fatal_error_msg">خطایی اساسی در برنامه‌تان رخ داد و اجرای برنامه نمی‌تواند ادامه یابد.</string>
+</resources>
diff --git a/src/android/java/res/values-fr/strings.xml b/src/android/java/res/values-fr/strings.xml
new file mode 100644
index 0000000000..efc0fb6e1e
--- /dev/null
+++ b/src/android/java/res/values-fr/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Le service Ministro est introuvable.\nL\'application ne peut pas démarrer.</string>
+ <string name="ministro_needed_msg">Cette application requiert le service Ministro. Voulez-vous l\'installer?</string>
+ <string name="fatal_error_msg">Votre application a rencontré une erreur fatale et ne peut pas continuer.</string>
+</resources>
diff --git a/src/android/java/res/values-id/strings.xml b/src/android/java/res/values-id/strings.xml
new file mode 100644
index 0000000000..aaa5bda0de
--- /dev/null
+++ b/src/android/java/res/values-id/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Layanan Ministro tidak bisa ditemukan.\nAplikasi tidak bisa dimulai.</string>
+ <string name="ministro_needed_msg">Aplikasi ini membutuhkan layanan Ministro. Apakah Anda ingin menginstalnya?</string>
+ <string name="fatal_error_msg">Aplikasi Anda mengalami kesalahan fatal dan tidak dapat melanjutkan.</string>
+</resources>
diff --git a/src/android/java/res/values-it/strings.xml b/src/android/java/res/values-it/strings.xml
new file mode 100644
index 0000000000..4773419c44
--- /dev/null
+++ b/src/android/java/res/values-it/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Servizio Ministro inesistente. Impossibile eseguire \nl\'applicazione.</string>
+ <string name="ministro_needed_msg">Questa applicazione richiede il servizio Ministro.Installarlo?</string>
+ <string name="fatal_error_msg">L\'applicazione ha provocato un errore grave e non puo\' continuare.</string>
+</resources>
diff --git a/src/android/java/res/values-ja/strings.xml b/src/android/java/res/values-ja/strings.xml
new file mode 100644
index 0000000000..ba1cfda9ec
--- /dev/null
+++ b/src/android/java/res/values-ja/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Ministroサービスが見つかりません。\nアプリケーションが起動できません。</string>
+ <string name="ministro_needed_msg">このアプリケーションにはMinistroサービスが必要です。 インストールしてもよろしいですか?</string>
+ <string name="fatal_error_msg">アプリケーションで致命的なエラーが発生したため続行できません。</string>
+</resources>
diff --git a/src/android/java/res/values-ms/strings.xml b/src/android/java/res/values-ms/strings.xml
new file mode 100644
index 0000000000..6e3952eaec
--- /dev/null
+++ b/src/android/java/res/values-ms/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Tidak jumpa servis Ministro.\nAplikasi tidak boleh dimulakan.</string>
+ <string name="ministro_needed_msg">Aplikasi ini memerlukan servis Ministro. Adakah anda ingin pasang servis itu?</string>
+ <string name="fatal_error_msg">Aplikasi anda menemui ralat muat dan tidak boleh diteruskan.</string>
+</resources>
diff --git a/src/android/java/res/values-nb/strings.xml b/src/android/java/res/values-nb/strings.xml
new file mode 100644
index 0000000000..8a550e99a2
--- /dev/null
+++ b/src/android/java/res/values-nb/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Kan ikke finne tjenesten Ministro. Applikasjonen kan ikke starte.</string>
+ <string name="ministro_needed_msg">Denne applikasjonen krever tjenesten Ministro. Vil du installere denne?</string>
+ <string name="fatal_error_msg">Applikasjonen fikk en kritisk feil og kan ikke fortsette</string>
+</resources>
diff --git a/src/android/java/res/values-nl/strings.xml b/src/android/java/res/values-nl/strings.xml
new file mode 100644
index 0000000000..8a45a724ff
--- /dev/null
+++ b/src/android/java/res/values-nl/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">De Ministro service is niet gevonden.\nDe applicatie kan niet starten.</string>
+ <string name="ministro_needed_msg">Deze applicatie maakt gebruik van de Ministro service. Wilt u deze installeren?</string>
+ <string name="fatal_error_msg">Er is een fatale fout in de applicatie opgetreden. De applicatie kan niet verder gaan.</string>
+</resources>
diff --git a/src/android/java/res/values-pl/strings.xml b/src/android/java/res/values-pl/strings.xml
new file mode 100644
index 0000000000..9fefc92dcd
--- /dev/null
+++ b/src/android/java/res/values-pl/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Usługa Ministro nie została znaleziona.\nAplikacja nie może zostać uruchomiona.</string>
+ <string name="ministro_needed_msg">Aplikacja wymaga usługi Ministro. Czy chcesz ją zainstalować?</string>
+ <string name="fatal_error_msg">Wystąpił błąd krytyczny. Aplikacja zostanie zamknięta.</string>
+</resources>
diff --git a/src/android/java/res/values-pt-rBR/strings.xml b/src/android/java/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000000..67ac3f9f98
--- /dev/null
+++ b/src/android/java/res/values-pt-rBR/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Não foi possível encontrar o serviço Ministro.\nA aplicação não pode iniciar.</string>
+ <string name="ministro_needed_msg">Essa aplicação requer o serviço Ministro. Gostaria de instalá-lo?</string>
+ <string name="fatal_error_msg">Sua aplicação encontrou um erro fatal e não pode continuar.</string>
+</resources>
diff --git a/src/android/java/res/values-ro/strings.xml b/src/android/java/res/values-ro/strings.xml
new file mode 100644
index 0000000000..f88a442b35
--- /dev/null
+++ b/src/android/java/res/values-ro/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Serviciul Ministro nu poate fi găsit.\nAplicaţia nu poate porni.</string>
+ <string name="ministro_needed_msg">Această aplicaţie necesită serviciul Ministro.\nDoriţi să-l instalaţi?</string>
+ <string name="fatal_error_msg">Aplicaţia dumneavoastră a întâmpinat o eroare fatală şi nu poate continua.</string>
+</resources>
diff --git a/src/android/java/res/values-rs/strings.xml b/src/android/java/res/values-rs/strings.xml
new file mode 100644
index 0000000000..3194ce9022
--- /dev/null
+++ b/src/android/java/res/values-rs/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Ministro servise nije pronađen. Aplikacija ne može biti pokrenuta.</string>
+ <string name="ministro_needed_msg">Ova aplikacija zahteva Ministro servis. Želite li da ga instalirate?</string>
+ <string name="fatal_error_msg">Vaša aplikacija je naišla na fatalnu grešku i ne može nastaviti sa radom.</string>
+</resources>
diff --git a/src/android/java/res/values-ru/strings.xml b/src/android/java/res/values-ru/strings.xml
new file mode 100644
index 0000000000..d3cee80f9d
--- /dev/null
+++ b/src/android/java/res/values-ru/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">Сервис Ministro не найден.\nПриложение нельзя запустить.</string>
+ <string name="ministro_needed_msg">Этому приложению необходим сервис Ministro. Вы хотите его установить?</string>
+ <string name="fatal_error_msg">Ваше приложение столкнулось с фатальной ошибкой и не может более работать.</string>
+</resources>
diff --git a/src/android/java/res/values-zh-rCN/strings.xml b/src/android/java/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000000..2eb1269880
--- /dev/null
+++ b/src/android/java/res/values-zh-rCN/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">无法找到Ministro服务。\n应用程序无法启动。</string>
+ <string name="ministro_needed_msg">此应用程序需要Ministro服务。您想安装它吗?</string>
+ <string name="fatal_error_msg">您的应用程序遇到一个致命错误导致它无法继续。</string>
+</resources>
diff --git a/src/android/java/res/values-zh-rTW/strings.xml b/src/android/java/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000000..f6e68efa52
--- /dev/null
+++ b/src/android/java/res/values-zh-rTW/strings.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="ministro_not_found_msg">無法找到Ministro服務。\n應用程序無法啟動。</string>
+ <string name="ministro_needed_msg">此應用程序需要Ministro服務。您想安裝它嗎?</string>
+ <string name="fatal_error_msg">您的應用程序遇到一個致命錯誤導致它無法繼續。</string>
+</resources>
diff --git a/src/android/java/res/values/libs.xml b/src/android/java/res/values/libs.xml
new file mode 100644
index 0000000000..92ce09b7c0
--- /dev/null
+++ b/src/android/java/res/values/libs.xml
@@ -0,0 +1,8 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <array name="qt_libs">
+ <item>QtCore</item>
+ <item>QtGui</item>
+ </array>
+ <array name="bundled_libs"/>
+</resources>
diff --git a/src/android/java/res/values/strings.xml b/src/android/java/res/values/strings.xml
new file mode 100644
index 0000000000..bd6928fe59
--- /dev/null
+++ b/src/android/java/res/values/strings.xml
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+ <string name="app_name"></string>
+ <string name="ministro_not_found_msg">Can\'t find Ministro service.\nThe application can\'t start.</string>
+ <string name="ministro_needed_msg">This application requires Ministro service. Would you like to install it?</string>
+ <string name="fatal_error_msg">Your application encountered a fatal error and cannot continue.</string>
+</resources>
diff --git a/src/android/java/src/org/kde/necessitas/ministro/IMinistro.aidl b/src/android/java/src/org/kde/necessitas/ministro/IMinistro.aidl
new file mode 100644
index 0000000000..1c33a77fdb
--- /dev/null
+++ b/src/android/java/src/org/kde/necessitas/ministro/IMinistro.aidl
@@ -0,0 +1,49 @@
+/*
+ Copyright (c) 2012, BogDan Vatra <bogdan@kde.org>
+ 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
+* "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 1 !
+* "minimum.qt.version" Integer Minimim Qt version (e.g. 0x040800, which means Qt 4.8.0, check http://doc.trolltech.com/4.8/qtglobal.html#QT_VERSION)!
+* "3rd.party.repositories" StringArray 3rd party repositories, which should be downloaded by ministro, needs minimum.ministro.api >= 2
+* Check http://community.kde.org/Necessitas/Ministro for more details.
+*/
+ void requestLoader(in IMinistroCallback callback, in Bundle parameters);
+}
diff --git a/src/android/java/src/org/kde/necessitas/ministro/IMinistroCallback.aidl b/src/android/java/src/org/kde/necessitas/ministro/IMinistroCallback.aidl
new file mode 100644
index 0000000000..eec270aec1
--- /dev/null
+++ b/src/android/java/src/org/kde/necessitas/ministro/IMinistroCallback.aidl
@@ -0,0 +1,53 @@
+/*
+ Copyright (c) 2012, BogDan Vatra <bogdan@kde.org>
+ 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
+*
+* This parameter will contain additional fields which are used by the loader to start your application, so it must be passed to loader.
+*/
+
+ void loaderReady(in Bundle loaderParams);
+}
diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
new file mode 100644
index 0000000000..c3d82bca8d
--- /dev/null
+++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
@@ -0,0 +1,1278 @@
+/*
+ Copyright (c) 2012, BogDan Vatra <bogdan@kde.org>
+ 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.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.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
+import android.app.Fragment;
+import android.view.ActionMode;
+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 = 2; // 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 String QT_PROVIDER = "necessitas";
+ 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 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 QT_PROVIDER_KEY = "qt.provider";
+ 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 REPOSITORIES="3rd.party.repositories"; // needs MINISTRO_API_LEVEL >=2 !!!
+ // Use this key to specify any 3rd party repositories urls
+ // Ministro will download these repositories into thier
+ // own folders, check http://community.kde.org/Necessitas/Ministro
+ // for more details.
+
+ 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=1\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 - 0 if you don't want to use android style plugin, it will save a few ms at startup.
+
+ private static final int INCOMPATIBLE_MINISTRO_VERSION = 1; // Incompatible Ministro version. Ministro needs to be upgraded.
+ 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_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<String> libs = new ArrayList<String>();
+ 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 != null && 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.putString(QT_PROVIDER_KEY, QT_PROVIDER);
+ 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(REPOSITORIES, null);
+ 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 != null && 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();
+ }
+
+ private void startApp(final boolean firstStart)
+ {
+ try {
+ ActivityInfo ai=getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
+ if (ai.metaData.containsKey("android.app.qt_libs_resource_id")) {
+ int resourceId = ai.metaData.getInt("android.app.qt_libs_resource_id");
+ m_qtLibs = getResources().getStringArray(resourceId);
+ }
+
+ if (getIntent().getExtras()!= null
+ && getIntent().getExtras().containsKey("use_local_qt_libs")
+ && getIntent().getExtras().getString("use_local_qt_libs").equals("true")) {
+ ArrayList<String> libraryList= new ArrayList<String>();
+
+ String localPrefix="/data/local/tmp/qt/";
+ if (getIntent().getExtras().containsKey("libs_prefix"))
+ localPrefix=getIntent().getExtras().getString("libs_prefix");
+
+ if (m_qtLibs != null) {
+ for (int i=0;i<m_qtLibs.length;i++)
+ libraryList.add(localPrefix+"lib/lib"+m_qtLibs[i]+".so");
+ }
+
+ if (getIntent().getExtras().containsKey("load_local_libs")) {
+ String[] extraLibs=getIntent().getExtras().getString("load_local_libs").split(":");
+ for (String lib:extraLibs) {
+ if (lib.length() > 0)
+ libraryList.add(localPrefix + lib);
+ }
+ }
+
+ String dexPaths = new String();
+ String pathSeparator = System.getProperty("path.separator", ":");
+ if (getIntent().getExtras().containsKey("load_local_jars")) {
+ String[] jarFiles = getIntent().getExtras().getString("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, getIntent().getExtras().containsKey("loader_class_name")
+ ? getIntent().getExtras().getString("loader_class_name")
+ : "org.qtproject.qt5.android.QtActivityDelegate");
+ if (getIntent().getExtras().containsKey("static_init_classes")) {
+ loaderParams.putStringArray(STATIC_INIT_CLASSES_KEY,
+ getIntent().getExtras().getString("static_init_classes").split(":"));
+ }
+ loaderParams.putStringArrayList(NATIVE_LIBRARIES_KEY, libraryList);
+ loaderParams.putString(ENVIRONMENT_VARIABLES_KEY, ENVIRONMENT_VARIABLES
+ + "QT_QPA_EGLFS_HIDECURSOR=1"
+ + "\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 != null && 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
+ @Override
+ public boolean dispatchKeyShortcutEvent(KeyEvent event)
+ {
+ if (QtApplication.m_delegateObject != null && QtApplication.dispatchKeyShortcutEvent != null)
+ return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchKeyShortcutEvent, event);
+ else
+ return super.dispatchKeyShortcutEvent(event);
+ }
+ public boolean super_dispatchKeyShortcutEvent(KeyEvent event)
+ {
+ return super.dispatchKeyShortcutEvent(event);
+ }
+ //---------------------------------------------------------------------------
+
+ @Override
+ public void onActionModeFinished(ActionMode mode)
+ {
+ if (!QtApplication.invokeDelegate(mode).invoked)
+ super.onActionModeFinished(mode);
+ }
+ public void super_onActionModeFinished(ActionMode mode)
+ {
+ super.onActionModeFinished(mode);
+ }
+ //---------------------------------------------------------------------------
+
+ @Override
+ public void onActionModeStarted(ActionMode mode)
+ {
+ if (!QtApplication.invokeDelegate(mode).invoked)
+ super.onActionModeStarted(mode);
+ }
+ public void super_onActionModeStarted(ActionMode mode)
+ {
+ super.onActionModeStarted(mode);
+ }
+ //---------------------------------------------------------------------------
+
+ @Override
+ public void onAttachFragment(Fragment fragment)
+ {
+ if (!QtApplication.invokeDelegate(fragment).invoked)
+ super.onAttachFragment(fragment);
+ }
+ public void super_onAttachFragment(Fragment fragment)
+ {
+ super.onAttachFragment(fragment);
+ }
+ //---------------------------------------------------------------------------
+
+ @Override
+ public View onCreateView(View parent, String name, Context context, AttributeSet attrs)
+ {
+ QtApplication.InvokeResult res = QtApplication.invokeDelegate(parent, name, context, attrs);
+ if (res.invoked)
+ return (View)res.methodReturns;
+ else
+ return super.onCreateView(parent, name, context, attrs);
+ }
+ public View super_onCreateView(View parent, String name, Context context,
+ AttributeSet attrs) {
+ return super.onCreateView(parent, name, context, attrs);
+ }
+ //---------------------------------------------------------------------------
+
+ @Override
+ public boolean onKeyShortcut(int keyCode, KeyEvent event)
+ {
+ if (QtApplication.m_delegateObject != null && QtApplication.onKeyShortcut != null)
+ return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyShortcut, keyCode,event);
+ else
+ return super.onKeyShortcut(keyCode, event);
+ }
+ public boolean super_onKeyShortcut(int keyCode, KeyEvent event)
+ {
+ return super.onKeyShortcut(keyCode, event);
+ }
+ //---------------------------------------------------------------------------
+
+ @Override
+ public ActionMode onWindowStartingActionMode(Callback callback)
+ {
+ QtApplication.InvokeResult res = QtApplication.invokeDelegate(callback);
+ if (res.invoked)
+ return (ActionMode)res.methodReturns;
+ else
+ return super.onWindowStartingActionMode(callback);
+ }
+ public ActionMode super_onWindowStartingActionMode(Callback callback)
+ {
+ return super.onWindowStartingActionMode(callback);
+ }
+ //---------------------------------------------------------------------------
+//@ANDROID-11
+ //////////////// Activity API 12 /////////////
+
+//@ANDROID-12
+ @Override
+ public boolean dispatchGenericMotionEvent(MotionEvent ev)
+ {
+ if (QtApplication.m_delegateObject != null && QtApplication.dispatchGenericMotionEvent != null)
+ return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchGenericMotionEvent, ev);
+ else
+ return super.dispatchGenericMotionEvent(ev);
+ }
+ public boolean super_dispatchGenericMotionEvent(MotionEvent event)
+ {
+ return super.dispatchGenericMotionEvent(event);
+ }
+ //---------------------------------------------------------------------------
+
+ @Override
+ public boolean onGenericMotionEvent(MotionEvent event)
+ {
+ if (QtApplication.m_delegateObject != null && QtApplication.onGenericMotionEvent != null)
+ return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onGenericMotionEvent, event);
+ else
+ return super.onGenericMotionEvent(event);
+ }
+ public boolean super_onGenericMotionEvent(MotionEvent event)
+ {
+ return super.onGenericMotionEvent(event);
+ }
+ //---------------------------------------------------------------------------
+//@ANDROID-12
+
+}
diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtApplication.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtApplication.java
new file mode 100644
index 0000000000..a23c3afb4d
--- /dev/null
+++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtApplication.java
@@ -0,0 +1,149 @@
+/*
+ Copyright (c) 2012, BogDan Vatra <bogdan@kde.org>
+ 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<String, ArrayList<Method>> m_delegateMethods= new HashMap<String, ArrayList<Method>>();
+ 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<Method> delegateMethods = new ArrayList<Method>();
+ for (Method m : listener.getClass().getMethods()) {
+ if (m.getDeclaringClass().getName().startsWith("org.qtproject.qt5.android"))
+ delegateMethods.add(m);
+ }
+
+ ArrayList<Field> applicationFields = new ArrayList<Field>();
+ 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<Method> delegateSet = new ArrayList<Method>();
+ 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<elements.length;it++)
+ if (elements[it].getClassName().equals(activityClassName)) {
+ stackDeep = it;
+ break;
+ }
+ }
+ final String methodName=elements[stackDeep].getMethodName();
+ if (-1 == stackDeep || !m_delegateMethods.containsKey(methodName))
+ return result;
+
+ for (Method m : m_delegateMethods.get(methodName)) {
+ if (m.getParameterTypes().length == args.length) {
+ result.methodReturns = invokeDelegateMethod(m, args);
+ result.invoked = true;
+ return result;
+ }
+ }
+ return result;
+ }
+
+ public static Object invokeDelegateMethod(Method m, Object... args)
+ {
+ try {
+ return m.invoke(m_delegateObject, args);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/src/android/java/version.xml b/src/android/java/version.xml
new file mode 100644
index 0000000000..1cd8eb31fe
--- /dev/null
+++ b/src/android/java/version.xml
@@ -0,0 +1,8 @@
+<version value="3">
+ <ignore>
+ <file>AndroidManifest.xml</file>
+ <file>libs.xml</file>
+ <file>logo.png</file>
+ <file>icon.png</file>
+ </ignore>
+</version>