File indexing completed on 2024-04-28 04:40:43

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 #include <QCoreApplication>
0011 #include <QJniObject>
0012 #include <QDebug>
0013 
0014 using namespace KirigamiAddonsDateAndTime;
0015 
0016 AndroidIntegration &AndroidIntegration::instance()
0017 {
0018     static AndroidIntegration instance;
0019     return instance;
0020 }
0021 
0022 static void dateSelected(JNIEnv *env, jobject that, jint day, jint month, jint year)
0023 {
0024     Q_UNUSED(that);
0025     Q_UNUSED(env);
0026     Q_EMIT AndroidIntegration::instance().datePickerFinished(true, QDate(year, month, day).startOfDay());
0027 }
0028 
0029 static void dateCancelled(JNIEnv *env, jobject that)
0030 {
0031     Q_UNUSED(that);
0032     Q_UNUSED(env);
0033     Q_EMIT AndroidIntegration::instance().datePickerFinished(false, {});
0034 }
0035 
0036 static void timeSelected(JNIEnv *env, jobject that, jint hours, jint minutes)
0037 {
0038     Q_UNUSED(that);
0039     Q_UNUSED(env);
0040     Q_EMIT AndroidIntegration::instance().timePickerFinished(true, QDateTime(QDate::currentDate(), QTime(hours, minutes)));
0041 }
0042 
0043 static void timeCancelled(JNIEnv *env, jobject that)
0044 {
0045     Q_UNUSED(that);
0046     Q_UNUSED(env);
0047     Q_EMIT AndroidIntegration::instance().timePickerFinished(false, {});
0048 }
0049 
0050 static const JNINativeMethod dateMethods[] = {
0051     {"dateSelected", "(III)V", (void *)dateSelected},
0052     {"cancelled", "()V", (void *)dateCancelled}
0053 };
0054 
0055 static const JNINativeMethod timeMethods[] = {
0056     {"timeSelected", "(II)V", (void *)timeSelected},
0057     {"cancelled", "()V", (void *)timeCancelled}
0058 };
0059 
0060 Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *)
0061 {
0062     static bool initialized = false;
0063     if (initialized) {
0064         return JNI_VERSION_1_6;
0065     }
0066     initialized = true;
0067 
0068     JNIEnv *env = nullptr;
0069     if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {
0070         qWarning() << "Failed to get JNI environment.";
0071         return -1;
0072     }
0073     jclass theclass = env->FindClass("org/kde/kirigamiaddons/dateandtime/DatePicker");
0074     if (env->RegisterNatives(theclass, dateMethods, sizeof(dateMethods) / sizeof(JNINativeMethod)) < 0) {
0075         qWarning() << "Failed to register native functions.";
0076         return -1;
0077     }
0078 
0079     jclass timeclass = env->FindClass("org/kde/kirigamiaddons/dateandtime/TimePicker");
0080     if (env->RegisterNatives(timeclass, timeMethods, sizeof(timeMethods) / sizeof(JNINativeMethod)) < 0) {
0081         qWarning() << "Failed to register native functions.";
0082         return -1;
0083     }
0084 
0085     return JNI_VERSION_1_4;
0086 }
0087 
0088 void AndroidIntegration::showDatePicker(qint64 initialDate)
0089 {
0090     QJniObject picker("org/kde/kirigamiaddons/dateandtime/DatePicker", "(Landroid/app/Activity;J)V", QNativeInterface::QAndroidApplication::context(), initialDate);
0091     picker.callMethod<void>("doShow");
0092 }
0093 
0094 void AndroidIntegration::showTimePicker(qint64 initialTime)
0095 {
0096     QJniObject picker("org/kde/kirigamiaddons/dateandtime/TimePicker", "(Landroid/app/Activity;J)V", QNativeInterface::QAndroidApplication::context(), initialTime);
0097     picker.callMethod<void>("doShow");
0098 }
0099 
0100 #include "moc_androidintegration.cpp"