6#include <QtCore/private/qcore_ohos_p.h>
7#include <QtCore/private/qohoslogger_p.h>
9#include <qohosapppermissions_p.h>
10#include <qohosqpaenums.h>
11#include <qohosutils.h>
12#include <render/qwindowproxyregistry.h>
20QWindow *getFocusedWindowOrNull()
23 return !focusedWindows.empty() ? focusedWindows.front() :
nullptr;
26std::optional<Qt::PermissionStatus> tryMapPermissionStatusFromOhos(
31 switch (ohosPermissionStatus) {
32 case OhosPermissionStatus::GRANTED:
33 return Qt::PermissionStatus::Granted;
34 case OhosPermissionStatus::NOT_DETERMINED:
35 return Qt::PermissionStatus::Undetermined;
36 case OhosPermissionStatus::DENIED:
37 case OhosPermissionStatus::INVALID:
38 case OhosPermissionStatus::RESTRICTED:
39 return Qt::PermissionStatus::Denied;
46 QOhosJsState &jsState,
const std::string &permissionName)
50 std::optional<QNapi::Number> optJsPermissionStatusValue;
52 optJsPermissionStatusValue = jsState.eval<QNapi::Number>(
53 "@ohos.abilityAccessCtrl.createAtManager().getSelfPermissionStatus(*)",
55 }
catch (
const Napi::Error &error) {
56 qOhosPrintfError(
"%s: getSelfPermissionStatus() failed: %s", Q_FUNC_INFO, error.what());
60 optJsPermissionStatusValue,
61 [&](
auto jsPermissionStatusValue) {
62 return jsState.tryMapOhosEnumFromJs<OhosPermissionStatus>(jsPermissionStatusValue);
66class QOhosPermissionsHelperImpl :
public QOhosPermissionsHelper
69 QList<Qt::PermissionStatus> checkStatusesOfPermissions(
const QStringList &permissionNames)
const override;
71 void requestPermissionsFromUserIfNeeded(
72 const QStringList &permissionNames, QObject *resultConsumerContext,
73 QOhosConsumer<QList<QOhosPermissionsHelper::PermissionRequestResult>> resultConsumer)
override;
75 void requestPermissionsOnSettingIfNeeded(
76 const QStringList &permissionNames, QObject *resultConsumerContext,
77 QOhosConsumer<QList<
bool>> resultConsumer)
override;
80QList<Qt::PermissionStatus> QOhosPermissionsHelperImpl::checkStatusesOfPermissions(
81 const QStringList &permissionNames)
const
83 if (permissionNames.isEmpty())
86 return QOhosJsThreadGateway::eval(
87 [&](QOhosJsState &jsState) {
88 QList<Qt::PermissionStatus> statuses;
89 for (
const auto &permissionName : permissionNames) {
90 auto optPermissionStatus = qAndThen(
91 tryGetSelfPermissionStatus(jsState, permissionName.toStdString()),
92 &tryMapPermissionStatusFromOhos);
93 statuses.append(optPermissionStatus.value_or(Qt::PermissionStatus::Denied));
99void QOhosPermissionsHelperImpl::requestPermissionsFromUserIfNeeded(
100 const QStringList &qPermissionNames, QObject *resultConsumerContext,
101 QOhosConsumer<QList<QOhosPermissionsHelper::PermissionRequestResult>> resultConsumer)
103 std::vector<std::string> permissionNames(qPermissionNames.size());
105 qPermissionNames.constBegin(), qPermissionNames.constEnd(),
106 permissionNames.begin(), [](
const QString &str) {
return str.toStdString(); });
109 QtOhos::QObjectThreadSafeRef resultConsumerQtContextRef;
110 QOhosConsumer<QList<PermissionRequestResult>> resultConsumer;
113 QOhosConsumer<QList<QOhosPermissionsHelper::PermissionRequestResult>> qResultConsumer =
114 [resultConsumer = std::move(resultConsumer)](
const auto &inputResult) {
115 QList<QOhosPermissionsHelper::PermissionRequestResult> result;
116 for (
const auto &inputEntry : inputResult) {
118 QOhosPermissionsHelper::PermissionRequestResult{
119 .permissionGranted = inputEntry.permissionGranted,
120 .dialogShown = inputEntry.dialogShown,
122 resultConsumer(
std::move(result));
126 auto context = QtOhos::moveToSharedPtr(
128 .resultConsumerQtContextRef = QtOhos::QObjectThreadSafeRef(resultConsumerContext),
129 .resultConsumer = std::move(qResultConsumer),
132 QObject *optInstanceMainWindow = getFocusedWindowOrNull();
133 auto optInstanceMainWindowRef =
134 optInstanceMainWindow !=
nullptr
135 ? std::optional(QtOhos::QObjectThreadSafeRef(optInstanceMainWindow))
138 QOhosJsThreadGateway::invoke(
139 [context, permissionNames, optInstanceMainWindowRef](QOhosJsState &jsState) {
140 auto optQAbility = QtOhos::tryMapOptMainWindowToQAbility(jsState, optInstanceMainWindowRef);
142 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
143 [context, permissionNames](
auto &) {
144 const size_t totalPermissions = permissionNames.size();
145 QList<PermissionRequestResult> appPermissionResults(
147 PermissionRequestResult {
148 .permissionGranted =
false,
149 .dialogShown =
false,
151 context->resultConsumer(appPermissionResults);
155 QOhosAppPermissions::requestAppPermissionsFromUserWithResult(
156 jsState, optQAbility.value(), permissionNames,
157 [context](QOhosJsState &, std::vector<QOhosPermissionsHelper::PermissionRequestResult> result) {
158 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
159 [context, appPermissionResults = result](
auto &) {
160 QList<PermissionRequestResult> appPermResults;
161 for (
const auto &appPermResult: appPermissionResults)
162 appPermResults.push_back(
163 PermissionRequestResult {
164 .permissionGranted = appPermResult.permissionGranted,
165 .dialogShown = appPermResult.dialogShown,
167 context->resultConsumer(appPermResults);
173void QOhosPermissionsHelperImpl::requestPermissionsOnSettingIfNeeded(
174 const QStringList &qPermissionNames, QObject *resultConsumerContext,
175 QOhosConsumer<QList<
bool>> resultConsumer)
177 std::vector<std::string> permissionNames(qPermissionNames.size());
179 qPermissionNames.constBegin(), qPermissionNames.constEnd(),
180 permissionNames.begin(), [](
const QString &str) {
return str.toStdString(); });
183 QtOhos::QObjectThreadSafeRef resultConsumerQtContextRef;
184 QOhosConsumer<QList<
bool>> resultConsumer;
187 auto context = QtOhos::moveToSharedPtr(
189 .resultConsumerQtContextRef = QtOhos::QObjectThreadSafeRef(resultConsumerContext),
190 .resultConsumer = std::move(resultConsumer),
193 QObject *optInstanceMainWindow = getFocusedWindowOrNull();
194 auto optInstanceMainWindowRef =
195 optInstanceMainWindow !=
nullptr
196 ? std::optional(QtOhos::QObjectThreadSafeRef(optInstanceMainWindow))
199 QOhosJsThreadGateway::invoke(
200 [context, permissionNames, optInstanceMainWindowRef](
auto &jsState) {
201 auto optQAbility = QtOhos::tryMapOptMainWindowToQAbility(jsState, optInstanceMainWindowRef);
203 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
204 [context, permissionNames](
auto &) {
205 QList<
bool> settingPermissionResults(permissionNames.size(),
false);
206 context->resultConsumer(settingPermissionResults);
210 QOhosAppPermissions::requestAppPermissionsOnSetting(
211 jsState, optQAbility.value(), permissionNames,
212 [context](QOhosJsState &, std::vector<
bool> permissionsGranted) {
213 context->resultConsumerQtContextRef.visitInQtThreadIfAlive(
214 [context, permissionsGranted](
auto &) {
215 QList<
bool> qPermissionsGranted(
216 permissionsGranted.begin(), permissionsGranted.end());
217 context->resultConsumer(qPermissionsGranted);
226 static QOhosPermissionsHelperImpl permissionsHelperImpl;
227 return &permissionsHelperImpl;
static QWindowProxyRegistry & instance()
Combined button and popup list for selecting options.
QOhosPermissionsHelper * getQOhosPermissionsHelperImpl()