From 4da8ca2397f0b5ca87c1915fc29e185d57e9020c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christian=20Str=C3=B8mme?= <christian.stromme@qt.io>
Date: Mon, 12 Dec 2016 18:27:33 +0100
Subject: [PATCH] Android: Add convenience method for checking and requesting
 permissions

This will be used to check and request permissions at run-time.

Task-number: QTBUG-55992
Change-Id: I344859aeb05fecf09ac46064e9452787d615a8a1
Reviewed-by: Yoann Lopes <yoann.lopes@qt.io>
---
 .../src/common/qandroidmultimediautils.cpp    | 29 +++++++++++++++++++
 .../src/common/qandroidmultimediautils.h      |  2 ++
 2 files changed, 31 insertions(+)

diff --git a/src/plugins/android/src/common/qandroidmultimediautils.cpp b/src/plugins/android/src/common/qandroidmultimediautils.cpp
index c7a16dcf0..a4a7f773d 100644
--- a/src/plugins/android/src/common/qandroidmultimediautils.cpp
+++ b/src/plugins/android/src/common/qandroidmultimediautils.cpp
@@ -38,8 +38,11 @@
 ****************************************************************************/
 
 #include "qandroidmultimediautils.h"
+#include "qandroidglobal.h"
 
 #include <qlist.h>
+#include <QtCore/private/qjni_p.h>
+#include <QtCore/private/qjnihelpers_p.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -110,4 +113,30 @@ AndroidCamera::ImageFormat qt_androidImageFormatFromPixelFormat(QVideoFrame::Pix
     }
 }
 
+bool qt_androidRequestPermission(const QString &key)
+{
+    using namespace QtAndroidPrivate;
+
+    if (androidSdkVersion() < 23)
+        return true;
+
+    PermissionsResult res = checkPermission(key);
+    if (res == PermissionsResult::Granted) // Permission already granted?
+        return true;
+
+    QJNIEnvironmentPrivate env;
+    const auto &results = requestPermissionsSync(env, QStringList() << key);
+    if (!results.contains(key)) {
+        qCWarning(qtAndroidMediaPlugin, "No permission found for key: %s", qPrintable(key));
+        return false;
+    }
+
+    if (results[key] == PermissionsResult::Denied) {
+        qCDebug(qtAndroidMediaPlugin, "%s - Permission denied by user!", qPrintable(key));
+        return false;
+    }
+
+    return true;
+}
+
 QT_END_NAMESPACE
diff --git a/src/plugins/android/src/common/qandroidmultimediautils.h b/src/plugins/android/src/common/qandroidmultimediautils.h
index 0e811ecb8..0a837ae3c 100644
--- a/src/plugins/android/src/common/qandroidmultimediautils.h
+++ b/src/plugins/android/src/common/qandroidmultimediautils.h
@@ -55,6 +55,8 @@ bool qt_sizeLessThan(const QSize &s1, const QSize &s2);
 QVideoFrame::PixelFormat qt_pixelFormatFromAndroidImageFormat(AndroidCamera::ImageFormat f);
 AndroidCamera::ImageFormat qt_androidImageFormatFromPixelFormat(QVideoFrame::PixelFormat f);
 
+bool qt_androidRequestPermission(const QString &key);
+
 QT_END_NAMESPACE
 
 #endif // QANDROIDMULTIMEDIAUTILS_H
-- 
GitLab