6#include <qohosqpafunctions_p.h>
7#include <qohosapppermissions_p.h>
9#include <render/qwindowproxyregistry.h>
18QWindow *getFocusedWindowOrNull()
21 return !focusedWindows.empty() ? focusedWindows.front() :
nullptr;
24class QOhosPermissionsHelperImpl :
public QOhosPermissionsHelper
27 bool isPermissionGranted(
const QString &permissionName)
const override;
29 void requestPermissionsFromUserIfNeeded(
30 const QStringList &permissionNames, QObject *resultConsumerContext,
31 QOhosConsumer<QList<QOhosPermissionsHelper::PermissionRequestResult>> resultConsumer)
override;
33 void requestPermissionsOnSettingIfNeeded(
34 const QStringList &permissionNames, QObject *resultConsumerContext,
35 QOhosConsumer<QList<
bool>> resultConsumer)
override;
38bool QOhosPermissionsHelperImpl::isPermissionGranted(
const QString &permissionName)
const
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);
50void QOhosPermissionsHelperImpl::requestPermissionsFromUserIfNeeded(
51 const QStringList &qPermissionNames, QObject *resultConsumerContext,
52 QOhosConsumer<QList<QOhosPermissionsHelper::PermissionRequestResult>> resultConsumer)
54 std::vector<std::string> permissionNames(qPermissionNames.size());
56 qPermissionNames.constBegin(), qPermissionNames.constEnd(),
57 permissionNames.begin(), [](
const QString &str) {
return str.toStdString(); });
60 QtOhos::QObjectThreadSafeRef resultConsumerQtContextRef;
61 QOhosConsumer<QList<PermissionRequestResult>> resultConsumer;
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) {
69 QOhosPermissionsHelper::PermissionRequestResult{
70 .permissionGranted = inputEntry.permissionGranted,
71 .dialogShown = inputEntry.dialogShown,
73 resultConsumer(
std::move(result));
77 auto context = QtOhos::moveToSharedPtr(
79 .resultConsumerQtContextRef = QtOhos::QObjectThreadSafeRef(resultConsumerContext),
80 .resultConsumer = std::move(qResultConsumer),
83 QObject *optInstanceMainWindow = getFocusedWindowOrNull();
84 auto optInstanceMainWindowRef =
85 optInstanceMainWindow !=
nullptr
86 ? makeQOhosOptional(QtOhos::QObjectThreadSafeRef(optInstanceMainWindow))
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(
98 PermissionRequestResult {
99 .permissionGranted =
false,
100 .dialogShown =
false,
102 context->resultConsumer(appPermissionResults);
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,
118 context->resultConsumer(appPermResults);
124void QOhosPermissionsHelperImpl::requestPermissionsOnSettingIfNeeded(
125 const QStringList &qPermissionNames, QObject *resultConsumerContext,
126 QOhosConsumer<QList<
bool>> resultConsumer)
128 std::vector<std::string> permissionNames(qPermissionNames.size());
130 qPermissionNames.constBegin(), qPermissionNames.constEnd(),
131 permissionNames.begin(), [](
const QString &str) {
return str.toStdString(); });
134 QtOhos::QObjectThreadSafeRef resultConsumerQtContextRef;
135 QOhosConsumer<QList<
bool>> resultConsumer;
138 auto context = QtOhos::moveToSharedPtr(
140 .resultConsumerQtContextRef = QtOhos::QObjectThreadSafeRef(resultConsumerContext),
141 .resultConsumer = std::move(resultConsumer),
144 QObject *optInstanceMainWindow = getFocusedWindowOrNull();
145 auto optInstanceMainWindowRef =
146 optInstanceMainWindow !=
nullptr
147 ? makeQOhosOptional(QtOhos::QObjectThreadSafeRef(optInstanceMainWindow))
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);
162 jsState, optAbilityPeer ? optAbilityPeer : jsState.defaultQAbilityPeer(),
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);
178 static QOhosPermissionsHelperImpl permissionsHelperImpl;
179 return &permissionsHelperImpl;
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()