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
qohospermissionshelperimpl.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
5
6#include <qohosqpafunctions_p.h>
7#include <qohosapppermissions_p.h>
8#include <qohosutils.h>
9#include <render/qwindowproxyregistry.h>
10#include <utility>
11
13
14namespace QtOhos {
15
16namespace {
17
18QWindow *getFocusedWindowOrNull()
19{
20 auto focusedWindows = QWindowProxyRegistry::instance().queryWindowsWithSystemWindowAndFocus();
21 return !focusedWindows.empty() ? focusedWindows.front() : nullptr;
22}
23
24class QOhosPermissionsHelperImpl : public QOhosPermissionsHelper
25{
26public:
27 bool isPermissionGranted(const QString &permissionName) const override;
28
29 void requestPermissionsFromUserIfNeeded(
30 const QStringList &permissionNames, QObject *resultConsumerContext,
31 QOhosConsumer<QList<QOhosPermissionsHelper::PermissionRequestResult>> resultConsumer) override;
32
33 void requestPermissionsOnSettingIfNeeded(
34 const QStringList &permissionNames, QObject *resultConsumerContext,
35 QOhosConsumer<QList<bool>> resultConsumer) override;
36};
37
38bool QOhosPermissionsHelperImpl::isPermissionGranted(const QString &permissionName) const
39{
40 return QtOhos::evalInJsThreadWithConsumer<bool>(
41 [&](auto &jsState, std::function<void(bool)> resultConsumer) {
43 jsState, permissionName.toStdString(),
44 [resultConsumer = std::move(resultConsumer)](QtOhos::JsState &, bool granted) {
45 resultConsumer(granted);
46 });
47 });
48}
49
50void QOhosPermissionsHelperImpl::requestPermissionsFromUserIfNeeded(
51 const QStringList &qPermissionNames, QObject *resultConsumerContext,
52 QOhosConsumer<QList<QOhosPermissionsHelper::PermissionRequestResult>> resultConsumer)
53{
54 std::vector<std::string> permissionNames(qPermissionNames.size());
55 std::transform(
56 qPermissionNames.constBegin(), qPermissionNames.constEnd(),
57 permissionNames.begin(), [](const QString &str) { return str.toStdString(); });
58
59 struct Context {
60 QtOhos::QObjectThreadSafeRef resultConsumerQtContextRef;
61 QOhosConsumer<QList<PermissionRequestResult>> resultConsumer;
62 };
63
64 QOhosConsumer<QList<QOhosPermissionsHelper::PermissionRequestResult>> qResultConsumer =
65 [resultConsumer = std::move(resultConsumer)](const auto &inputResult) {
66 QList<QOhosPermissionsHelper::PermissionRequestResult> result;
67 for (const auto &inputEntry : inputResult) {
68 result.append(
69 QOhosPermissionsHelper::PermissionRequestResult{
70 .permissionGranted = inputEntry.permissionGranted,
71 .dialogShown = inputEntry.dialogShown,
72 });
73 resultConsumer(std::move(result));
74 }
75 };
76
77 auto context = QtOhos::moveToSharedPtr(
78 Context{
79 .resultConsumerQtContextRef = QtOhos::QObjectThreadSafeRef(resultConsumerContext),
80 .resultConsumer = std::move(qResultConsumer),
81 });
82
83 QObject *optInstanceMainWindow = getFocusedWindowOrNull();
84 auto optInstanceMainWindowRef =
85 optInstanceMainWindow != nullptr
86 ? makeQOhosOptional(QtOhos::QObjectThreadSafeRef(optInstanceMainWindow))
88
90 [context, permissionNames, optInstanceMainWindowRef](QtOhos::JsState &jsState) {
91 auto optAbilityPeer = QtOhos::tryMapOptMainWindowToAbilityPeer(jsState, optInstanceMainWindowRef);
92 if (!optAbilityPeer) {
93 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
94 [context, permissionNames](auto &) {
95 const size_t totalPermissions = permissionNames.size();
96 QList<PermissionRequestResult> appPermissionResults(
97 totalPermissions,
98 PermissionRequestResult {
99 .permissionGranted = false,
100 .dialogShown = false,
101 });
102 context->resultConsumer(appPermissionResults);
103 });
104 return;
105 }
107 jsState, optAbilityPeer, permissionNames,
108 [context](QtOhos::JsState &, std::vector<QOhosPermissionsHelper::PermissionRequestResult> result) {
109 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
110 [context, appPermissionResults = result](auto &) {
111 QList<PermissionRequestResult> appPermResults;
112 for (const auto &appPermResult: appPermissionResults)
113 appPermResults.push_back(
114 PermissionRequestResult {
115 .permissionGranted = appPermResult.permissionGranted,
116 .dialogShown = appPermResult.dialogShown,
117 });
118 context->resultConsumer(appPermResults);
119 });
120 });
121 });
122}
123
124void QOhosPermissionsHelperImpl::requestPermissionsOnSettingIfNeeded(
125 const QStringList &qPermissionNames, QObject *resultConsumerContext,
126 QOhosConsumer<QList<bool>> resultConsumer)
127{
128 std::vector<std::string> permissionNames(qPermissionNames.size());
129 std::transform(
130 qPermissionNames.constBegin(), qPermissionNames.constEnd(),
131 permissionNames.begin(), [](const QString &str) { return str.toStdString(); });
132
133 struct Context {
134 QtOhos::QObjectThreadSafeRef resultConsumerQtContextRef;
135 QOhosConsumer<QList<bool>> resultConsumer;
136 };
137
138 auto context = QtOhos::moveToSharedPtr(
139 Context{
140 .resultConsumerQtContextRef = QtOhos::QObjectThreadSafeRef(resultConsumerContext),
141 .resultConsumer = std::move(resultConsumer),
142 });
143
144 QObject *optInstanceMainWindow = getFocusedWindowOrNull();
145 auto optInstanceMainWindowRef =
146 optInstanceMainWindow != nullptr
147 ? makeQOhosOptional(QtOhos::QObjectThreadSafeRef(optInstanceMainWindow))
149
151 [context, permissionNames, optInstanceMainWindowRef](auto &jsState) {
152 auto optAbilityPeer = QtOhos::tryMapOptMainWindowToAbilityPeer(jsState, optInstanceMainWindowRef);
153 if (!optAbilityPeer) {
154 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
155 [context, permissionNames](auto &) {
156 QList<bool> settingPermissionResults(permissionNames.size(), false);
157 context->resultConsumer(settingPermissionResults);
158 });
159 return;
160 }
162 jsState, optAbilityPeer ? optAbilityPeer : jsState.defaultQAbilityPeer(),
163 permissionNames,
164 [context](QtOhos::JsState &, std::vector<bool> permissionsGranted) {
165 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
166 [context, permissionsGranted](auto &) {
167 QList<bool> qPermissionsGranted(
168 permissionsGranted.begin(), permissionsGranted.end());
169 context->resultConsumer(qPermissionsGranted);
170 });
171 });
172 });
173 }
174}
175
177{
178 static QOhosPermissionsHelperImpl permissionsHelperImpl;
179 return &permissionsHelperImpl;
180}
181
182}
183
184QT_END_NAMESPACE
static QWindowProxyRegistry & instance()
void requestAppPermissionsOnSetting(QtOhos::JsState &jsState, std::shared_ptr< QtOhos::QAbilityPeer > abilityPeer, const std::vector< std::string > &permissionNames, QOhosConsumer< QtOhos::JsState &, std::vector< bool > > resultConsumer)
void checkAppPermissionGrantedWithConsumer(QtOhos::JsState &jsState, const std::string &permissionName, QOhosConsumer< QtOhos::JsState &, bool > resultConsumer)
void requestAppPermissionsFromUserWithResult(QtOhos::JsState &jsState, std::shared_ptr< QtOhos::QAbilityPeer > abilityPeer, const std::vector< std::string > &permissionNames, QOhosConsumer< QtOhos::JsState &, std::vector< AppPermissionResult > > resultConsumer)
Combined button and popup list for selecting options.
void invokeInJsThread(std::function< void(JsState &)> task)
QOhosPermissionsHelper * getQOhosPermissionsHelperImpl()
QOhosOptional< void > makeEmptyQOhosOptional()