Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qpermissions_harmony.cpp
Go to the documentation of this file.
1// Copyright (C) 2026 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qpermissions.h"
6#include <QtCore/qcoreapplication.h>
7#include <QtCore/private/qohospermissionshelper_p.h>
8#include <QtCore/qstringlist.h>
9
11
13
14static QString makeOhosPermissionStr(const char *permissionSubString)
15{
16 if (permissionSubString == nullptr)
17 return QString();
18
19 return QString::fromUtf8("ohos.permission.%1").arg(permissionSubString);
20}
21
23{
24 const auto id = permission.type().id();
25 if (id == qMetaTypeId<QCameraPermission>()) {
26 return { makeOhosPermissionStr("CAMERA") };
27 } else if (id == qMetaTypeId<QBluetoothPermission>()) {
28 return { makeOhosPermissionStr("ACCESS_BLUETOOTH") };
29 } else if (id == qMetaTypeId<QLocationPermission>()) {
30 return { makeOhosPermissionStr("LOCATION") };
31 } else if (id == qMetaTypeId<QMicrophonePermission>()) {
32 return { makeOhosPermissionStr("MICROPHONE") };
33 } else if (id == qMetaTypeId<QCalendarPermission>()) {
34 switch (permission.value<QCalendarPermission>()->accessMode()) {
35 case QCalendarPermission::AccessMode::ReadOnly:
36 return { makeOhosPermissionStr("READ_CALENDAR") };
37 case QCalendarPermission::AccessMode::WriteOnly:
38 return { makeOhosPermissionStr("WRITE_CALENDAR") };
39 case QCalendarPermission::AccessMode::ReadWrite:
40 return { makeOhosPermissionStr("READ_CALENDAR"),
41 makeOhosPermissionStr("WRITE_CALENDAR") };
42 }
43 Q_UNREACHABLE_RETURN({});
44 } else if (id == qMetaTypeId<QContactsPermission>()) {
45 // The contact permission goes under the category of the restricted permission
46 // and this requires special previlege from the application
47 switch (permission.value<QContactsPermission>()->accessMode()) {
48 case QContactsPermission::AccessMode::ReadOnly:
49 return { makeOhosPermissionStr("READ_CONTACTS") };
50 case QContactsPermission::AccessMode::ReadWrite:
51 return { makeOhosPermissionStr("READ_CONTACTS"),
52 makeOhosPermissionStr("WRITE_CONTACTS") };
53 }
54 Q_UNREACHABLE_RETURN({});
55 }
56
57 return {};
58}
59
61 const QStringList &qPermissionNames,
62 const QPermissions::Private::PermissionCallback &callback)
63{
64 auto userPermissionResultConsumer = [=](QList<QOhosPermissionsHelper::PermissionRequestResult> appPermissionResults) {
65 Qt::PermissionStatus status = Qt::PermissionStatus::Granted;
66 for (const auto &permissionResult : appPermissionResults) {
67 if (!permissionResult.permissionGranted) {
68 status = permissionResult.dialogShown ? Qt::PermissionStatus::Denied : Qt::PermissionStatus::Undetermined;
69 break;
70 }
71 }
72 if (status == Qt::PermissionStatus::Undetermined) {
73 auto settingsPermissionResultConsumer = [callback](QList<bool> status) {
74 auto granted = std::none_of(status.begin(), status.end(), std::logical_not<>{});
75 callback(granted ? Qt::PermissionStatus::Granted : Qt::PermissionStatus::Denied);
76 };
77 s_permissionsHelper->requestPermissionsOnSettingIfNeeded(
78 qPermissionNames, QCoreApplication::instance(), settingsPermissionResultConsumer);
79 } else {
80 callback(status);
81 }
82 };
83
84 s_permissionsHelper->requestPermissionsFromUserIfNeeded(
85 qPermissionNames, QCoreApplication::instance(), userPermissionResultConsumer);
86}
87
88namespace QPermissions::Private
89{
91 {
92 if (s_permissionsHelper == nullptr)
93 return Qt::PermissionStatus::Undetermined;
94
95 const auto permissionStrList = ohosPermissionStrings(permission);
96 if (!permissionStrList.isEmpty()) {
97 for (const auto &ohosPermissionStr : permissionStrList)
98 if (!s_permissionsHelper->isPermissionGranted(ohosPermissionStr))
99 return Qt::PermissionStatus::Undetermined;
100 }
101 return Qt::PermissionStatus::Granted;
102 }
103
105 const QPermission &permission,
106 const QPermissions::Private::PermissionCallback &callback)
107 {
108 if (s_permissionsHelper == nullptr) {
109 callback(Qt::PermissionStatus::Undetermined);
110 return;
111 }
112
113 const auto permissionNames = ohosPermissionStrings(permission);
114 if (permissionNames.isEmpty())
115 callback(Qt::PermissionStatus::Granted);
116 else
117 requestPermissionsFromUser(permissionNames, callback);
118 }
119}
120
121void qt_setQOhosPermissionsHelper(QOhosPermissionsHelper *permissionsHelper)
122{
123 s_permissionsHelper = permissionsHelper;
124}
125
126QT_END_NAMESPACE
Access Bluetooth peripherals.
\inmodule QtCore \inheaderfile QPermissions
void requestPermission(const QPermission &permission, const PermissionCallback &callback)
Qt::PermissionStatus checkPermission(const QPermission &permission)
Combined button and popup list for selecting options.
static QString makeOhosPermissionStr(const char *permissionSubString)
static void requestPermissionsFromUser(const QStringList &qPermissionNames, const QPermissions::Private::PermissionCallback &callback)
void qt_setQOhosPermissionsHelper(QOhosPermissionsHelper *permissionsHelper)
static QStringList ohosPermissionStrings(const QPermission &permission)
static QT_BEGIN_NAMESPACE QOhosPermissionsHelper * s_permissionsHelper