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
qohosapppermissions.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 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#include <QtCore/private/qohoscommon_p.h>
6#include <QtCore/private/qohoslogger_p.h>
7#include <qohosplugincore.h>
8
10
12
13namespace {
14
15void tryGetBundleAccessTokenIdWithConsumer(
16 QtOhos::JsState &jsState, QOhosConsumer<QtOhos::JsState &, QOhosOptional<int>> resultConsumer)
17{
18 auto bundleFlags = jsState.eval<QNapi::Number>(
19 "@ohos.bundle.bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION");
20
21 jsState.eval<QNapi::Promise>(
22 "@ohos.bundle.bundleManager.getBundleInfoForSelf(*)", {bundleFlags})
23 .withContext(std::move(resultConsumer))
24 .onThenWithContext([](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
25 QNapi::Object bundleInfo = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
26 resultConsumer(
27 cbInfo.jsState(),
28 QOhosOptional<int>(bundleInfo.eval<QNapi::Number>("appInfo.accessTokenId")));
29 })
30 .onCatchWithContext([](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
31 QtOhos::logJsCallbackError(cbInfo, "Got error from getBundleInfoForSelf()");
32 resultConsumer(cbInfo.jsState(), makeEmptyQOhosOptional());
33 });
34}
35
36void checkAppPermissionStatusGrantedWithConsumer(
37 QtOhos::JsState &jsState, int bundleAccessToken, const std::string &permissionName,
38 QOhosConsumer<QtOhos::JsState &, bool> resultConsumer)
39{
40 jsState.eval<QNapi::Promise>(
41 "@ohos.abilityAccessCtrl.createAtManager().checkAccessToken(*)",
42 {bundleAccessToken, permissionName})
43 .withContext(std::move(resultConsumer))
44 .onThenWithContext([](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
45 auto status = cbInfo.getFirstArg<QNapi::Number>(Q_FUNC_INFO);
46 auto permissionGrantedStatus = cbInfo.jsState().eval<QNapi::Number>(
47 "@ohos.abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED");
48 resultConsumer(cbInfo.jsState(), status == permissionGrantedStatus);
49 })
50 .onCatchWithContext([](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
51 QtOhos::logJsCallbackError(cbInfo, "Got error from checkAccessToken()");
52 resultConsumer(cbInfo.jsState(), false);
53 });
54}
55
56}
57
59 QtOhos::JsState &jsState, const std::string &permissionName,
60 QOhosConsumer<QtOhos::JsState &, bool> resultConsumer)
61{
62 tryGetBundleAccessTokenIdWithConsumer(
63 jsState,
64 [permissionName, resultConsumer = std::move(resultConsumer)](
65 QtOhos::JsState &jsState, QOhosOptional<int> bundleAccessTokenId) mutable {
66 if (bundleAccessTokenId.hasValue()) {
67 checkAppPermissionStatusGrantedWithConsumer(
68 jsState, bundleAccessTokenId.value(), permissionName,
69 std::move(resultConsumer));
70 } else {
71 qOhosPrintfError(
72 "Cannot check permission: '%s': cannot get bundle access token id.",
73 permissionName.c_str());
74 resultConsumer(jsState, false);
75 }
76 });
77}
78
80 QtOhos::JsState &jsState, const std::string &permissionName,
81 QOhosConsumer<QtOhos::JsState &, bool> resultConsumer)
82{
83 return requestAppPermissionFromUser(
84 jsState, jsState.defaultQAbilityPeer(), permissionName,
85 std::move(resultConsumer));
86}
87
89 QtOhos::JsState &jsState, std::shared_ptr<QtOhos::QAbilityPeer> abilityPeer,
90 const std::string &permissionName,
91 QOhosConsumer<QtOhos::JsState &, bool> resultConsumer)
92{
93 requestAppPermissionsFromUserWithResult(
94 jsState, abilityPeer, {permissionName},
95 [resultConsumer = std::move(resultConsumer)](QtOhos::JsState &jsState, std::vector<QOhosAppPermissions::AppPermissionResult> result) {
96 resultConsumer(jsState, result.size() == 1 && result.front().permissionGranted);
97 });
98}
99
101 QtOhos::JsState &jsState, const std::vector<std::string> &permissionNames,
102 QOhosConsumer<QtOhos::JsState &, std::vector<AppPermissionResult>> resultConsumer)
103{
104 requestAppPermissionsFromUserWithResult(
105 jsState, jsState.defaultQAbilityPeer(), permissionNames,
106 std::move(resultConsumer));
107}
108
110 QtOhos::JsState &jsState, std::shared_ptr<QtOhos::QAbilityPeer> abilityPeer,
111 const std::vector<std::string> &permissionNames,
112 QOhosConsumer<QtOhos::JsState &, std::vector<AppPermissionResult>> resultConsumer)
113{
114 jsState.eval<QNapi::Promise>(
115 "@ohos.abilityAccessCtrl.createAtManager().requestPermissionsFromUser(*)",
116 {
117 abilityPeer->qAbility().eval<QNapi::Object>("context"),
118 QNapi::makeArray(
119 jsState.env(),
120 std::vector<QNapi::ValueWrapper>(permissionNames.begin(), permissionNames.end()))
121 })
122 .withContext(std::move(resultConsumer))
123 .onThenWithContext(
124 [permissionNames](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
125 QNapi::Object resultObj = cbInfo.getFirstArg<QNapi::Object>(Q_FUNC_INFO);
126
127 auto resultPermissionsNames =
128 QNapi::getArrayElements<std::vector<std::string>, QNapi::String>(
129 resultObj.get<QNapi::Array>("permissions"));
130 auto resultAuthResults =
131 QNapi::getArrayElements<std::vector<int>, QNapi::Number>(
132 resultObj.get<QNapi::Array>("authResults"));
133
134 auto dialogShownResultsOrEmpty = QNapi::getOptionalPropOrEmpty<QNapi::Array>(resultObj, "dialogShownResults");
135 auto dialogShownResultsVector =
136 !dialogShownResultsOrEmpty.IsEmpty()
137 ? QNapi::getArrayElements<std::vector<bool>, QNapi::Boolean>(dialogShownResultsOrEmpty)
138 : std::vector<bool>();
139
140 int permissionGrantedStatus = cbInfo.jsState().eval<QNapi::Number>(
141 "@ohos.abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED");
142
143 const std::size_t totalPermissions = permissionNames.size();
144 std::vector<AppPermissionResult> appPermissionResults(
145 totalPermissions,
146 AppPermissionResult {
147 .permissionGranted = false,
148 .dialogShown = false
149 });
150 if (resultPermissionsNames.size() == totalPermissions && resultAuthResults.size() == totalPermissions
151 && dialogShownResultsVector.size() == totalPermissions) {
152 for (const auto &permissionName : permissionNames) {
153 const auto it = std::find(resultPermissionsNames.begin(), resultPermissionsNames.end(), permissionName);
154 if (it != resultPermissionsNames.end()) {
155 const int index = std::distance(resultPermissionsNames.begin(), it);
156 appPermissionResults[index].permissionGranted = (resultAuthResults[index] == permissionGrantedStatus);
157 appPermissionResults[index].dialogShown = dialogShownResultsVector[index];
158 }
159 }
160 }
161 resultConsumer(cbInfo.jsState(), appPermissionResults);
162 })
163 .onCatchWithContext(
164 [permissionNames](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
165 QtOhos::logJsCallbackError(cbInfo, "Got error from requestPermissionsFromUser()");
166 const std::size_t totalPermissions = permissionNames.size();
167 std::vector<AppPermissionResult> appPermissionResults(
168 totalPermissions,
169 AppPermissionResult {
170 .permissionGranted = false,
171 .dialogShown = false
172 });
173 resultConsumer(cbInfo.jsState(), appPermissionResults);
174 });
175}
176
178 QtOhos::JsState &jsState, const std::vector<std::string> &permissionNames,
179 QOhosConsumer<QtOhos::JsState &, std::vector<bool>> resultConsumer)
180{
181 requestAppPermissionsOnSetting(
182 jsState, jsState.defaultQAbilityPeer(), permissionNames, std::move(resultConsumer));
183}
184
186 QtOhos::JsState &jsState, std::shared_ptr<QtOhos::QAbilityPeer> abilityPeer,
187 const std::vector<std::string> &permissionNames,
188 QOhosConsumer<QtOhos::JsState &, std::vector<bool>> resultConsumer)
189{
190 jsState.eval<QNapi::Promise>(
191 "@ohos.abilityAccessCtrl.createAtManager().requestPermissionOnSetting(*)",
192 {
193 abilityPeer->qAbility().eval<QNapi::Object>("context"),
194 QNapi::makeArray(
195 jsState.env(),
196 std::vector<QNapi::ValueWrapper>(permissionNames.begin(), permissionNames.end()))
197 })
198 .withContext(std::move(resultConsumer))
199 .onThenWithContext(
200 [permissionNames](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
201 QNapi::Array resultArray = cbInfo.getFirstArg<QNapi::Array>(Q_FUNC_INFO);
202
203 auto resultAuthResults = QNapi::getArrayElements<std::vector<int>, QNapi::Number>(resultArray);
204
205 int permissionGrantedStatus = cbInfo.jsState().eval<QNapi::Number>(
206 "@ohos.abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED");
207
208 const std::size_t totalPermissions = permissionNames.size();
209 std::vector<bool> settingsPermissionResults(totalPermissions, false);
210 if (resultAuthResults.size() == totalPermissions) {
211 for (std::size_t permIndex = 0; permIndex < totalPermissions; permIndex++)
212 settingsPermissionResults[permIndex] = (resultAuthResults[permIndex] == permissionGrantedStatus);
213 }
214
215 resultConsumer(cbInfo.jsState(), settingsPermissionResults);
216 })
217 .onCatchWithContext(
218 [permissionNames](const QtOhos::CallbackInfo &cbInfo, auto &resultConsumer) {
219 QtOhos::logJsCallbackError(cbInfo, "Got error from requestPermissionOnSetting()");
220 std::vector<bool> settingsPermissionResults(permissionNames.size(), false);
221 resultConsumer(cbInfo.jsState(), settingsPermissionResults);
222 });
223}
224
225}
226
227QT_END_NAMESPACE
std::enable_if_t< qohosplugincore_h_detail::isQOhosOptional< QOhosInvokeResult< Func, T > >, QOhosInvokeResult< Func, T > > andThen(Func &&func) const
virtual std::shared_ptr< QAbilityPeer > defaultQAbilityPeer()=0
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 requestAppPermissionsFromUserWithResult(QtOhos::JsState &jsState, const std::vector< std::string > &permissionNames, QOhosConsumer< QtOhos::JsState &, std::vector< AppPermissionResult > > resultConsumer)
void requestAppPermissionsOnSetting(QtOhos::JsState &jsState, 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)
void requestAppPermissionFromUser(QtOhos::JsState &jsState, std::shared_ptr< QtOhos::QAbilityPeer > abilityPeer, const std::string &permissionName, QOhosConsumer< QtOhos::JsState &, bool > resultConsumer)
void requestAppPermissionFromUser(QtOhos::JsState &jsState, const std::string &permissionName, QOhosConsumer< QtOhos::JsState &, bool > resultConsumer)
Combined button and popup list for selecting options.