summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAssam Boudjelthia <assam.boudjelthia@qt.io>2021-07-29 12:10:34 +0300
committerAssam Boudjelthia <assam.boudjelthia@qt.io>2021-07-30 14:46:55 +0300
commit72e5b36e2e4c79dc7995f0203968503266b4f2f5 (patch)
treef979859294d19d481abfce9f7cd29c8fd0ccafa4 /src
parentb72fa182b4f08d0787ccdb62864cf4ae8a641205 (diff)
Remove app permission API from QCoreApplication
From the API review session, a potential deadlock behavior might occur when using QFuture's synchronous APIs on the UI thread. Also the fact that this api currently have an implementation only for Android. For those reasons we thought this API could be postponed until Qt 6.3, when the QFuture concern is addressed and other platforms other than Android are implemented as well. Pick-to: 6.2 Change-Id: I1aef025488c24791da85d15fb57367d3e5e681be Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/corelib/doc/snippets/permissions/permissions.cpp141
-rw-r--r--src/corelib/kernel/qapplicationpermission.qdoc100
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp160
-rw-r--r--src/corelib/kernel/qcoreapplication.h11
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h11
-rw-r--r--src/corelib/platform/android/qandroidextras.cpp33
6 files changed, 33 insertions, 423 deletions
diff --git a/src/corelib/doc/snippets/permissions/permissions.cpp b/src/corelib/doc/snippets/permissions/permissions.cpp
deleted file mode 100644
index a2c05db423..0000000000
--- a/src/corelib/doc/snippets/permissions/permissions.cpp
+++ /dev/null
@@ -1,141 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qdebug.h>
-#include <QtCore/qstring.h>
-
-void takeSelfie() {};
-
-void requestCameraPermissionAndroid()
-{
-//! [Request camera permission on Android]
- QCoreApplication::requestPermission(QStringLiteral("android.permission.CAMERA"))
- .then([=](QApplicationPermission::PermissionResult result) {
- if (result == QApplicationPermission::Authorized)
- takeSelfie();
- });
-//! [Request camera permission on Android]
-}
-
-void requestCameraPermission()
-{
-//! [Request camera permission]
- QCoreApplication::requestPermission(QApplicationPermission::Camera)
- .then([=](QApplicationPermission::PermissionResult result) {
- if (result == QApplicationPermission::Authorized)
- takeSelfie();
- });
-//! [Request camera permission]
-}
-
-void requestCameraPermissionSyncAndroid()
-{
-//! [Request camera permission sync on Android]
- auto future = QCoreApplication::requestPermission(QStringLiteral("android.permission.CAMERA"));
- auto result = future.result(); // blocks and waits for the result to be ready
- if (result == QApplicationPermission::Authorized)
- takeSelfie();
-//! [Request camera permission sync on Android]
-}
-
-void requestCameraPermissionSync()
-{
-//! [Request camera permission sync]
- auto future = QCoreApplication::requestPermission(QApplicationPermission::Camera);
- auto result = future.result(); // blocks and waits for the result to be ready
- if (result == QApplicationPermission::Authorized)
- takeSelfie();
-//! [Request camera permission sync]
-}
-
-void checkCameraPermissionAndroid()
-{
-//! [Check camera permission on Android]
- QCoreApplication::checkPermission(QStringLiteral("android.permission.CAMERA"))
- .then([=](QApplicationPermission::PermissionResult result) {
- if (result == QApplicationPermission::Authorized)
- takeSelfie();
- });
-//! [Check camera permission on Android]
-}
-
-void checkCameraPermission()
-{
-//! [Check camera permission]
- QCoreApplication::checkPermission(QApplicationPermission::Camera)
- .then([=](QApplicationPermission::PermissionResult result) {
- if (result == QApplicationPermission::Authorized)
- takeSelfie();
- });
-//! [Check camera permission]
-}
-
-void checkCameraPermissionAndroidSync()
-{
-//! [Check camera permission sync on Android]
- auto future = QCoreApplication::checkPermission(QStringLiteral("android.permission.CAMERA"));
- // may block and wait for the result to be ready on some platforms
- auto result = future.result();
- if (result == QApplicationPermission::Authorized)
- takeSelfie();
-//! [Check camera permission sync on Android]
-}
-
-void checkCameraPermissionSync()
-{
-//! [Check camera permission sync]
- auto future = QCoreApplication::checkPermission(QApplicationPermission::Camera);
- // may block and wait for the result to be ready on some platforms
- auto result = future.result();
- if (result == QApplicationPermission::Authorized)
- takeSelfie();
-//! [Check camera permission sync]
-}
diff --git a/src/corelib/kernel/qapplicationpermission.qdoc b/src/corelib/kernel/qapplicationpermission.qdoc
deleted file mode 100644
index 7e2bcaad91..0000000000
--- a/src/corelib/kernel/qapplicationpermission.qdoc
+++ /dev/null
@@ -1,100 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \namespace QApplicationPermission
-
- \brief The QApplicationPermission namespace contains enums for app permission
- types and results.
-
- This namespace's enums are used by \l {QCoreApplication::requestPermission()} and
- \l {QCoreApplication::checkPermission()}.
-*/
-
-/*!
- \enum QApplicationPermission::PermissionType
-
- Predefined sets of permission values.
-
- \value Camera Access the camera for taking pictures or videos and configuring
- the camera settings. Maps to "android.permission.CAMERA" on Android.
- \value Microphone Access the microphone, receive the sound signal (e.g. to
- analyze or record it). Maps to \c "android.permission.RECORD_AUDIO"
- on Android.
- \value Location Access approximate location provider (wifi, cell tower).
- Maps to \c "android.permission.ACCESS_COARSE_LOCATION" on Android.
- \value PreciseLocation Location Access accurate location provider (satellite).
- Maps to \c "android.permission.ACCESS_FINE_LOCATION" on Android.
- \value PreciseBackgroundLocation Access the precise location services when
- the app is in the background. Maps to
- \c "android.permission.ACCESS_BACKGROUND_LOCATION" on Android, and
- implies \l PreciseLocation.
- \value BackgroundLocation Access the approximate location services when
- the app is in the background. Maps to
- \c "android.permission.ACCESS_BACKGROUND_LOCATION" on Android, and
- implies \l Location.
- \value BodySensors Access body sensors such as a heart rate sensor.
- Maps to \c "android.permission.BODY_SENSORS" on Android.
- \value PhysicalActivity Access to data about physical activity and body
- movements. Maps to \c "android.permission.ACTIVITY_RECOGNITION"
- on Android.
- \value Contacts Read and write user contacts. Maps to
- \c "android.permission.READ_CONTACTS" and \c "android.permission.WRITE_CONTACTS"
- on Android.
- \value Storage Access device storage with read and write permissions.
- Maps to \c "android.permission.READ_EXTERNAL_STORAGE" and
- \c "android.permission.WRITE_EXTERNAL_STORAGE"on Android.
- \value Calendar Read and write the user's calendar.
- Maps to \c "android.permission.READ_CALENDAR" and
- \c "android.permission.WRITE_CALENDAR" on Android.
-
- \omitvalue Bluetooth
-
- \note Both Android and iOS require the native permission values to be added
- to the \c AndroidManifest.xml and \c info.plist respectively. For more
- information on Android permissions, see \c {Qt Creator: Editing Manifest Files}.
- For more information on iOS \c info.plist, see
- \l {Information Property List Files}.
-
- \since 6.2
- \sa QCoreApplication::requestPermission(), QCoreApplication::checkPermission()
-*/
-
-/*!
- \enum QApplicationPermission::PermissionResult
-
- The result values for a permission check or request.
-
- \value Authorized The permission is authorized.
- \value Denied The permission is denied.
- \value Restricted The permission state is denied and cannot be changed due
- to restrictions from the system.
- \value Undetermined The permission state is not yet known.
-
- \since 6.2
- \sa QCoreApplication::requestPermission(), QCoreApplication::checkPermission()
-*/
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 10dbe2f684..812b4afcc4 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -3083,166 +3083,6 @@ void QCoreApplication::setEventDispatcher(QAbstractEventDispatcher *eventDispatc
\sa Q_OBJECT, QObject::tr()
*/
-#if QT_CONFIG(future) && !defined(QT_NO_QOBJECT)
-
- QFuture<QApplicationPermission::PermissionResult> defaultPermissionFuture()
- {
- QPromise<QApplicationPermission::PermissionResult> promise;
- QFuture<QApplicationPermission::PermissionResult> future = promise.future();
- promise.start();
-#if defined(QT_DEBUG)
- qWarning() << "This platform doesn't have an implementation"
- << "for the application permissions API.";
-#endif
- promise.addResult(QApplicationPermission::Authorized);
- promise.finish();
- return future;
- }
-
- QFuture<QApplicationPermission::PermissionResult>
- QCoreApplicationPrivate::requestPermission(QApplicationPermission::PermissionType permission)
- {
- Q_UNUSED(permission)
- return defaultPermissionFuture();
- }
-
- QFuture<QApplicationPermission::PermissionResult>
- QCoreApplicationPrivate::requestPermission(const QString &permission)
- {
- Q_UNUSED(permission)
- return defaultPermissionFuture();
- }
-
- QFuture<QApplicationPermission::PermissionResult>
- QCoreApplicationPrivate::checkPermission(QApplicationPermission::PermissionType permission)
- {
- Q_UNUSED(permission)
- return defaultPermissionFuture();
- }
-
- QFuture<QApplicationPermission::PermissionResult>
- QCoreApplicationPrivate::checkPermission(const QString &permission)
- {
- Q_UNUSED(permission)
- return defaultPermissionFuture();
- }
-
-/*!
- Requests the \a permission and returns a QFuture representing the
- result of the request.
-
- Applications can request a permission in a cross-platform fashion. For example
- you can request permission to use the camera asynchronously as follows:
-
- \snippet permissions/permissions.cpp Request camera permission
-
- \note A function passed to \l {QFuture::then()} will be called once the request
- is processed. It can take some suitable action in response to the
- granting or refusal of the permission. It must not access objects that
- might be deleted before it is called.
-
- To do the same request synchronously:
-
- \snippet permissions/permissions.cpp Request camera permission sync
-
- \note Any platform that doesn't have an implementation for this API,
- returns QApplicationPermission::Authorized by default. Currently, only Android
- has an implemtation for this API.
-
- \since 6.2
- \sa checkPermission()
-*/
-QFuture<QApplicationPermission::PermissionResult>
-QCoreApplication::requestPermission(QApplicationPermission::PermissionType permission)
-{
- return QCoreApplicationPrivate::requestPermission(permission);
-}
-
-/*!
- Requests the \a permission and returns a QFuture representing the
- result of the request.
-
- All application permissions supported by a platform can be requested by their
- platform-specific names. For example you can request permission to use the
- camera asynchronously on Android as follows:
-
- \snippet permissions/permissions.cpp Request camera permission on Android
-
- \note A function passed to \l {QFuture::then()} will be called once the request
- is processed. It can take some suitable action in response to the
- granting or refusal of the permission. It must not access objects that
- might be deleted before it is called.
-
- To do the same request synchronously:
-
- \snippet permissions/permissions.cpp Request camera permission sync on Android
-
- \note Any platform that doesn't have an implementation for this API,
- returns QApplicationPermission::Authorized by default. Currently, only Android
- has an implemtation for this API.
-
- \since 6.2
- \sa checkPermission()
-*/
-QFuture<QApplicationPermission::PermissionResult>
-QCoreApplication::requestPermission(const QString &permission)
-{
- return QCoreApplicationPrivate::requestPermission(permission);
-}
-
-/*!
- Checks whether this process has the named \a permission and returns a QFuture
- representing the result of the check.
-
- Applications can check a permission in a cross-platform fashion. For example
- you can check the permission to use the camera asynchronously as follows:
-
- \snippet permissions/permissions.cpp Check camera permission
-
- To do the same request synchronously:
-
- \snippet permissions/permissions.cpp Check camera permission sync
-
- \note Any platform that doesn't have an implementation for this API,
- returns QApplicationPermission::Authorized by default. Currently, only Android
- has an implemtation for this API.
-
- \since 6.2
- \sa requestPermission()
-*/
-QFuture<QApplicationPermission::PermissionResult>
-QCoreApplication::checkPermission(QApplicationPermission::PermissionType permission)
-{
- return QCoreApplicationPrivate::checkPermission(permission);
-}
-
-/*!
- Checks whether this process has the named \a permission and returns a QFuture
- representing the result of the check.
-
- All application permissions supported by a platform can be checked by their
- platform-specific names. For example you can check the permission to use the
- camera asynchronously on Android as follows:
-
- \snippet permissions/permissions.cpp Check camera permission on Android
-
- To do the same request synchronously:
-
- \snippet permissions/permissions.cpp Check camera permission sync on Android
-
- \note Any platform that doesn't have an implementation for this API,
- returns QApplicationPermission::Authorized by default. Currently, only Android
- has an implemtation for this API.
-
- \since 6.2
- \sa requestPermission()
-*/
-QFuture<QApplicationPermission::PermissionResult>
-QCoreApplication::checkPermission(const QString &permission)
-{
- return QCoreApplicationPrivate::checkPermission(permission);
-}
-#endif // future && QT_NO_QOBJECT
void *QCoreApplication::resolveInterface(const char *name, int revision) const
{
diff --git a/src/corelib/kernel/qcoreapplication.h b/src/corelib/kernel/qcoreapplication.h
index 873c0acf1f..a72b0b6439 100644
--- a/src/corelib/kernel/qcoreapplication.h
+++ b/src/corelib/kernel/qcoreapplication.h
@@ -167,17 +167,6 @@ public:
QT_DECLARE_NATIVE_INTERFACE_ACCESSOR(QCoreApplication)
#ifndef QT_NO_QOBJECT
-#if QT_CONFIG(future)
- static QFuture<QApplicationPermission::PermissionResult>
- requestPermission(QApplicationPermission::PermissionType permission);
- static QFuture<QApplicationPermission::PermissionResult>
- requestPermission(const QString &permission);
-
- static QFuture<QApplicationPermission::PermissionResult>
- checkPermission(QApplicationPermission::PermissionType permission);
- static QFuture<QApplicationPermission::PermissionResult>
- checkPermission(const QString &permission);
-#endif
void installNativeEventFilter(QAbstractNativeEventFilter *filterObj);
void removeNativeEventFilter(QAbstractNativeEventFilter *filterObj);
diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h
index 26dfef2059..ae1e1cd4e9 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -203,17 +203,6 @@ public:
void processCommandLineArguments();
QString qmljs_debug_arguments; // a string containing arguments for js/qml debugging.
inline QString qmljsDebugArgumentsString() const { return qmljs_debug_arguments; }
-#if QT_CONFIG(future) && !defined QT_NO_QOBJECT
- static QFuture<QApplicationPermission::PermissionResult>
- requestPermission(QApplicationPermission::PermissionType permission);
- static QFuture<QApplicationPermission::PermissionResult>
- requestPermission(const QString &permission);
-
- static QFuture<QApplicationPermission::PermissionResult>
- checkPermission(QApplicationPermission::PermissionType permission);
- static QFuture<QApplicationPermission::PermissionResult>
- checkPermission(const QString &permission);
-#endif
#ifdef QT_NO_QOBJECT
QCoreApplication *q_ptr;
diff --git a/src/corelib/platform/android/qandroidextras.cpp b/src/corelib/platform/android/qandroidextras.cpp
index e43800e27c..7de28f5a12 100644
--- a/src/corelib/platform/android/qandroidextras.cpp
+++ b/src/corelib/platform/android/qandroidextras.cpp
@@ -1178,6 +1178,14 @@ requestPermissionsInternal(const QStringList &permissions)
return future;
}
+/*!
+ \preliminary
+ Requests the \a permission and returns a QFuture representing the
+ result of the request.
+
+ \since 6.2
+ \sa checkPermission()
+*/
QFuture<QtAndroidPrivate::PermissionResult>
QtAndroidPrivate::requestPermission(const QString &permission)
{
@@ -1200,6 +1208,15 @@ static bool isBackgroundLocationApi29(QtAndroidPrivate::PermissionType permissio
|| permission == QtAndroidPrivate::PreciseBackgroundLocation);
}
+/*!
+ \preliminary
+
+ Requests the \a permission and returns a QFuture representing the
+ result of the request.
+
+ \since 6.2
+ \sa checkPermission()
+*/
QFuture<QtAndroidPrivate::PermissionResult>
QtAndroidPrivate::requestPermission(QtAndroidPrivate::PermissionType permission)
{
@@ -1232,6 +1249,14 @@ QtAndroidPrivate::requestPermission(QtAndroidPrivate::PermissionType permission)
return future;
}
+/*!
+ \preliminary
+ Checks whether this process has the named \a permission and returns a QFuture
+ representing the result of the check.
+
+ \since 6.2
+ \sa requestPermission()
+*/
QFuture<QtAndroidPrivate::PermissionResult>
QtAndroidPrivate::checkPermission(const QString &permission)
{
@@ -1253,6 +1278,14 @@ QtAndroidPrivate::checkPermission(const QString &permission)
return future;
}
+/*!
+ \preliminary
+ Checks whether this process has the named \a permission and returns a QFuture
+ representing the result of the check.
+
+ \since 6.2
+ \sa requestPermission()
+*/
QFuture<QtAndroidPrivate::PermissionResult>
QtAndroidPrivate::checkPermission(QtAndroidPrivate::PermissionType permission)
{