File indexing completed on 2024-04-28 03:41:41
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 }