aboutsummaryrefslogtreecommitdiffstats
path: root/src/androidextras/android/qandroidactivityresultreceiver.cpp
blob: f1caa2798983d9d6e608a18d58d4ffbefc114058 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/****************************************************************************
**
** Copyright (C) 2021 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:COMM$
**
** 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.
**
** $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