File indexing completed on 2024-05-12 16:14:32
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Nicolas Fella <nicolas.fella@gmx.de> 0003 * SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org> 0004 * 0005 * SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "androidintegration.h" 0009 0010 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 0011 #include <QAndroidJniObject> 0012 #include <QtAndroid> 0013 #else 0014 #include <QCoreApplication> 0015 #include <QJniObject> 0016 // TODO KF6 remove this porting aid 0017 using QAndroidJniObject = QJniObject; 0018 #endif 0019 #include <QDebug> 0020 0021 using namespace KirigamiAddonsDateAndTime; 0022 0023 AndroidIntegration &AndroidIntegration::instance() 0024 { 0025 static AndroidIntegration instance; 0026 return instance; 0027 } 0028 0029 static void dateSelected(JNIEnv *env, jobject that, jint day, jint month, jint year) 0030 { 0031 Q_UNUSED(that); 0032 Q_UNUSED(env); 0033 Q_EMIT AndroidIntegration::instance().datePickerFinished(true, QDate(year, month, day).startOfDay()); 0034 } 0035 0036 static void dateCancelled(JNIEnv *env, jobject that) 0037 { 0038 Q_UNUSED(that); 0039 Q_UNUSED(env); 0040 Q_EMIT AndroidIntegration::instance().datePickerFinished(false, {}); 0041 } 0042 0043 static void timeSelected(JNIEnv *env, jobject that, jint hours, jint minutes) 0044 { 0045 Q_UNUSED(that); 0046 Q_UNUSED(env); 0047 Q_EMIT AndroidIntegration::instance().timePickerFinished(true, QDateTime(QDate::currentDate(), QTime(hours, minutes))); 0048 } 0049 0050 static void timeCancelled(JNIEnv *env, jobject that) 0051 { 0052 Q_UNUSED(that); 0053 Q_UNUSED(env); 0054 Q_EMIT AndroidIntegration::instance().timePickerFinished(false, {}); 0055 } 0056 0057 static const JNINativeMethod dateMethods[] = { 0058 {"dateSelected", "(III)V", (void *)dateSelected}, 0059 {"cancelled", "()V", (void *)dateCancelled} 0060 }; 0061 0062 static const JNINativeMethod timeMethods[] = { 0063 {"timeSelected", "(II)V", (void *)timeSelected}, 0064 {"cancelled", "()V", (void *)timeCancelled} 0065 }; 0066 0067 Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) 0068 { 0069 static bool initialized = false; 0070 if (initialized) { 0071 return JNI_VERSION_1_6; 0072 } 0073 initialized = true; 0074 0075 JNIEnv *env = nullptr; 0076 if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) { 0077 qWarning() << "Failed to get JNI environment."; 0078 return -1; 0079 } 0080 jclass theclass = env->FindClass("org/kde/kirigamiaddons/dateandtime/DatePicker"); 0081 if (env->RegisterNatives(theclass, dateMethods, sizeof(dateMethods) / sizeof(JNINativeMethod)) < 0) { 0082 qWarning() << "Failed to register native functions."; 0083 return -1; 0084 } 0085 0086 jclass timeclass = env->FindClass("org/kde/kirigamiaddons/dateandtime/TimePicker"); 0087 if (env->RegisterNatives(timeclass, timeMethods, sizeof(timeMethods) / sizeof(JNINativeMethod)) < 0) { 0088 qWarning() << "Failed to register native functions."; 0089 return -1; 0090 } 0091 0092 return JNI_VERSION_1_4; 0093 } 0094 0095 void AndroidIntegration::showDatePicker(qint64 initialDate) 0096 { 0097 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 0098 QAndroidJniObject activity = QtAndroid::androidActivity(); 0099 #else 0100 QJniObject activity = QNativeInterface::QAndroidApplication::context(); 0101 #endif 0102 QAndroidJniObject picker("org/kde/kirigamiaddons/dateandtime/DatePicker", "(Landroid/app/Activity;J)V", activity.object(), initialDate); 0103 picker.callMethod<void>("doShow"); 0104 } 0105 0106 void AndroidIntegration::showTimePicker(qint64 initialTime) 0107 { 0108 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) 0109 QAndroidJniObject activity = QtAndroid::androidActivity(); 0110 #else 0111 QJniObject activity = QNativeInterface::QAndroidApplication::context(); 0112 #endif 0113 QAndroidJniObject picker("org/kde/kirigamiaddons/dateandtime/TimePicker", "(Landroid/app/Activity;J)V", activity.object(), initialTime); 0114 picker.callMethod<void>("doShow"); 0115 } 0116 0117 #include "moc_androidintegration.cpp"