| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:LGPL$ |
| ** 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 Lesser General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Lesser |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
| ** packaging of this file. Please review the following information to |
| ** ensure the GNU Lesser General Public License version 3 requirements |
| ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 2.0 or (at your option) the GNU General |
| ** Public license version 3 or any later version approved by the KDE Free |
| ** Qt Foundation. The licenses are as published by the Free Software |
| ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
| ** https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| #include "qandroidactivityresultreceiver.h" |
| #include "qandroidactivityresultreceiver_p.h" |
| #include "qandroidfunctions.h" |
| #include <QtCore/private/qjnihelpers_p.h> |
| #include <QtCore/qmutex.h> |
| |
| QT_BEGIN_NAMESPACE |
| |
| // Get a unique activity request code. |
| static int uniqueActivityRequestCode() |
| { |
| static QMutex mutex; |
| static int requestCode = 0x1000; // Reserve all request codes under 0x1000 for Qt. |
| |
| QMutexLocker locker(&mutex); |
| if (requestCode == 0xf3ee) // Special case for MINISTRO_INSTALL_REQUEST_CODE |
| requestCode++; |
| |
| if (requestCode == INT_MAX) |
| qWarning("Unique activity request code has wrapped. Unexpected behavior may occur."); |
| |
| return requestCode++; |
| } |
| |
| int QAndroidActivityResultReceiverPrivate::globalRequestCode(int localRequestCode) const |
| { |
| if (!localToGlobalRequestCode.contains(localRequestCode)) { |
| int globalRequestCode = uniqueActivityRequestCode(); |
| localToGlobalRequestCode[localRequestCode] = globalRequestCode; |
| globalToLocalRequestCode[globalRequestCode] = localRequestCode; |
| } |
| return localToGlobalRequestCode.value(localRequestCode); |
| } |
| |
| bool QAndroidActivityResultReceiverPrivate::handleActivityResult(jint requestCode, jint resultCode, jobject data) |
| { |
| if (globalToLocalRequestCode.contains(requestCode)) { |
| q->handleActivityResult(globalToLocalRequestCode.value(requestCode), resultCode, QAndroidJniObject(data)); |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /*! |
| \class QAndroidActivityResultReceiver |
| \inmodule QtAndroidExtras |
| \since 5.3 |
| \brief Interface used for callbacks from onActivityResult() in the main Android activity. |
| |
| Create a subclass of this class to be notified of the results when using the |
| \c QtAndroid::startActivity() and \c QtAndroid::startIntentSender() APIs. |
| */ |
| |
| /*! |
| \internal |
| */ |
| QAndroidActivityResultReceiver::QAndroidActivityResultReceiver() |
| : d(new QAndroidActivityResultReceiverPrivate) |
| { |
| d->q = this; |
| QtAndroidPrivate::registerActivityResultListener(d.data()); |
| } |
| |
| /*! |
| \internal |
| */ |
| QAndroidActivityResultReceiver::~QAndroidActivityResultReceiver() |
| { |
| QtAndroidPrivate::unregisterActivityResultListener(d.data()); |
| } |
| |
| /*! |
| \fn void QAndroidActivityResultReceiver::handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data) |
| |
| Reimplement this function to get activity results after starting an activity using either QtAndroid::startActivity() or |
| QtAndroid::startIntentSender(). The \a receiverRequestCode is the request code unique to this receiver which was originally |
| passed to the startActivity() or startIntentSender() functions. The \a resultCode is the result returned by the activity, |
| and \a data is either null or a Java object of the class android.content.Intent. Both the last to arguments are identical to the |
| arguments passed to onActivityResult(). |
| */ |
| |
| QT_END_NAMESPACE |