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"