// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include <QApplication>
#include <QHBoxLayout>
#include <QLabel>
#include <QLatin1String>
#include <QList>
#include <QMessageBox>
#include <QPushButton>
#include <QString>
#include <QVBoxLayout>
#include <QWidget>
#include <QtOhosExtras>
#include <functional>
#include <utility>
namespace {
struct SupportedPermission {
QString readableName;
QtOhosExtras::AppPermissions::Permission permission;
QString namedPermission;
};
static const QList<SupportedPermission> supportedPermissions = {
{
QLatin1String("Read pasteboard"),
QtOhosExtras::AppPermissions::Permission::ReadPasteboard,
QLatin1String("ohos.permission.READ_PASTEBOARD")
},
{
QLatin1String("Custom screen capture"),
QtOhosExtras::AppPermissions::Permission::CustomScreenCapture,
QLatin1String("ohos.permission.CUSTOM_SCREEN_CAPTURE")
},
{
QLatin1String("Access bluetooth"),
QtOhosExtras::AppPermissions::Permission::AccessBluetooth,
QLatin1String("ohos.permission.ACCESS_BLUETOOTH")
},
{
QLatin1String("Approximate location"),
QtOhosExtras::AppPermissions::Permission::ApproximatelyLocation,
QLatin1String("ohos.permission.APPROXIMATELY_LOCATION")
},
{
QLatin1String("Location"),
QtOhosExtras::AppPermissions::Permission::Location,
QLatin1String("ohos.permission.LOCATION")
},
};
QString readableNameForPermission(QtOhosExtras::AppPermissions::Permission permission)
{
for (const auto &supportedPermission : supportedPermissions) {
if (supportedPermission.permission == permission) {
return supportedPermission.readableName;
}
}
return {};
}
QString readableNameForNamedPermission(const QString &namedPermission)
{
for (const auto &supportedPermission : supportedPermissions) {
if (supportedPermission.namedPermission == namedPermission) {
return supportedPermission.readableName;
}
}
return {};
}
QWidget *createActionButton(QString label, QWidget *parent, std::function<void()> action)
{
auto *button = new QPushButton(label, parent);
QObject::connect(button, &QPushButton::clicked, parent, std::move(action));
return button;
}
QSharedPointer<QtOhosExtras::QOhosAbilityContext> tryGetAbilityContext(QWidget *window)
{
auto *qWindow = window->windowHandle();
return qWindow != nullptr
? QtOhosExtras::QOhosAbilityContext::getInstanceForMainWindow(qWindow)
: nullptr;
}
QWidget *createWindowWithRequestPermissionButtons()
{
auto *window = new QWidget();
window->setMinimumSize({640, 480});
QVBoxLayout *layout = new QVBoxLayout(window);
for (const auto &supportedPermission : supportedPermissions) {
auto *horizontalLayout = new QHBoxLayout();
horizontalLayout->addWidget(new QLabel(supportedPermission.readableName, window));
horizontalLayout->addWidget(
createActionButton(
QLatin1String("Enum based request"), window,
[window, supportedPermission]() {
auto abilityContext = tryGetAbilityContext(window);
if (abilityContext != nullptr) {
abilityContext->requestPermissionFromUserIfNeeded(
supportedPermission.permission);
}
}));
horizontalLayout->addWidget(
createActionButton(
QLatin1String("Named request"), window,
[window, supportedPermission]() {
auto abilityContext = tryGetAbilityContext(window);
if (abilityContext != nullptr) {
abilityContext->requestPermissionFromUserIfNeeded(
supportedPermission.namedPermission);
}
}));
layout->addLayout(horizontalLayout);
}
window->setLayout(layout);
return window;
}
void showAppPermissionResponseDialog(
QWidget *parent, const QString &requestType, const QString &readablePermissionName,
QtOhosExtras::AppPermissions::PermissionResult result)
{
QStringList messages;
messages.append(QLatin1String("Permission: ") + readablePermissionName);
messages.append(
result.permissionGranted
? QLatin1String("Permission granted.")
: QLatin1String("Permission not granted."));
messages.append(
result.dialogShown
? QLatin1String("Dialog shown.")
: QLatin1String("Dialog not shown."));
QMessageBox::information(
parent, requestType + QLatin1String(" permission request response"),
messages.join(QLatin1String("\n")));
}
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget window;
window.setWindowTitle(QLatin1String("Requesting application permissions from main windows"));
QVBoxLayout *layout = new QVBoxLayout(&window);
layout->addWidget(
createActionButton(
QLatin1String("Open new Main Window"), &window,
[]() {
auto *newWindow = createWindowWithRequestPermissionButtons();
newWindow->show();
auto abilityContext = QtOhosExtras::QOhosAbilityContext::getInstanceForMainWindow(newWindow->windowHandle());
QObject::connect(
abilityContext.data(),
&QtOhosExtras::QOhosAbilityContext::permissionRequestResponseReceived,
newWindow,
[newWindow](
QtOhosExtras::AppPermissions::Permission permission,
QtOhosExtras::AppPermissions::PermissionResult result) {
showAppPermissionResponseDialog(
newWindow, QLatin1String("Enum based"),
readableNameForPermission(permission),
result);
});
QObject::connect(
abilityContext.data(),
&QtOhosExtras::QOhosAbilityContext::namedPermissionRequestResponseReceived,
newWindow,
[newWindow](
const QString &permissionName,
QtOhosExtras::AppPermissions::PermissionResult result) {
showAppPermissionResponseDialog(
newWindow, QLatin1String("Named"),
readableNameForNamedPermission(permissionName),
result);
});
}));
window.setLayout(layout);
window.show();
return app.exec();
}