File indexing completed on 2024-04-14 14:08:45

0001 /* GCompris - ApplicationAndroid.cpp
0002  *
0003  * SPDX-FileCopyrightText: 2014-2015 Bruno Coudoin <bruno.coudoin@gcompris.net>
0004  *
0005  * Authors:
0006  *   Bruno Coudoin <bruno.coudoin@gcompris.net>
0007  *
0008  *   SPDX-License-Identifier: GPL-3.0-or-later
0009  */
0010 
0011 #include "ApplicationSettings.h"
0012 #include "ApplicationInfo.h"
0013 #include <QAndroidJniObject>
0014 #include <QDebug>
0015 #include <QtAndroid>
0016 
0017 bool ApplicationInfo::requestAudioFocus() const
0018 {
0019     qDebug() << "requestAudioFocus";
0020     return QAndroidJniObject::callStaticMethod<jboolean>("net/gcompris/GComprisActivity",
0021                                                          "requestAudioFocus");
0022 }
0023 
0024 void ApplicationInfo::abandonAudioFocus() const
0025 {
0026     QAndroidJniObject::callStaticMethod<void>("net/gcompris/GComprisActivity",
0027                                               "abandonAudioFocus");
0028 }
0029 
0030 jint JNICALL JNI_OnLoad(JavaVM *vm, void *)
0031 {
0032     JNIEnv *env;
0033     if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_4) != JNI_OK)
0034         return JNI_FALSE;
0035 
0036     return JNI_VERSION_1_4;
0037 }
0038 
0039 void ApplicationInfo::setRequestedOrientation(int orientation)
0040 {
0041     QAndroidJniObject activity = QtAndroid::androidActivity();
0042     activity.callMethod<void>("setRequestedOrientation", "(I)V", orientation);
0043 }
0044 
0045 int ApplicationInfo::getRequestedOrientation()
0046 {
0047     QAndroidJniObject activity = QtAndroid::androidActivity();
0048     jint orientation = activity.callMethod<jint>("getRequestedOrientation");
0049     return orientation;
0050 }
0051 
0052 void ApplicationInfo::setKeepScreenOn(bool value)
0053 {
0054     QAndroidJniObject activity = QtAndroid::androidActivity();
0055     activity.callMethod<void>("setKeepScreenOn", "(Z)V", value);
0056 }
0057 
0058 int ApplicationInfo::localeCompare(const QString &a, const QString &b,
0059                                    const QString &locale) const
0060 {
0061     QString _locale = locale.isEmpty() ? ApplicationSettings::getInstance()->locale()
0062                                        : locale;
0063     if (_locale == GC_DEFAULT_LOCALE)
0064         _locale = QLocale::system().name();
0065 
0066     // QCollator on Android uses only the posix backend as of Qt 5.5.1,
0067     // which is not capable of doing locale aware comparison.
0068     // cf. https://bugreports.qt.io/browse/QTBUG-43637
0069     // Therefore use native Collation via jni:
0070     jint res = QtAndroid::androidActivity().callMethod<jint>(
0071         "localeCompare",
0072         "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
0073         QAndroidJniObject::fromString(a).object<jstring>(),
0074         QAndroidJniObject::fromString(b).object<jstring>(),
0075         QAndroidJniObject::fromString(_locale).object<jstring>());
0076     return res;
0077 }
0078 
0079 // Code adapted from https://bugreports.qt.io/browse/QTBUG-50759
0080 bool ApplicationInfo::checkPermissions() const
0081 {
0082     const QStringList permissionsRequest = QStringList(
0083         { QString("android.permission.READ_EXTERNAL_STORAGE"),
0084           QString("android.permission.WRITE_EXTERNAL_STORAGE") });
0085     /* clang-format off */
0086     if ((QtAndroid::checkPermission(permissionsRequest[0]) == QtAndroid::PermissionResult::Denied) ||
0087         (QtAndroid::checkPermission(permissionsRequest[1])) == QtAndroid::PermissionResult::Denied) {
0088         /* clang-format on */
0089         auto permissionResults = QtAndroid::requestPermissionsSync(permissionsRequest);
0090         for (const QString &permission: permissionsRequest) {
0091             if (permissionResults[permission] == QtAndroid::PermissionResult::Denied) {
0092                 qDebug() << "Permission denied for" << permission;
0093                 return false;
0094             }
0095         }
0096     }
0097     return true;
0098 }