9#include <QAndroidJniEnvironment>
11#include <QTemporaryFile>
18void cleanupProductIconData(
void *info)
20 uint32_t *data =
static_cast<uint32_t *
>(info);
24QPixmap getProductIcon(
const QAndroidJniObject &javaProduct)
29 QAndroidJniObject pixelsArrayObject = javaProduct.callObjectMethod(
"getIconPixels",
"(II)[I", width, height);
30 if (!pixelsArrayObject.isValid()) {
34 jintArray pixelsArray =
static_cast<jintArray
>(pixelsArrayObject.object());
39 QAndroidJniEnvironment env;
40 jsize
length = env->GetArrayLength(pixelsArray);
41 if (
length != jsize(width) * jsize(height)) {
45 jint *pixels = env->GetIntArrayElements(pixelsArray,
nullptr);
50 uint32_t *data =
new uint32_t[
length];
51 for (jsize i = 0; i <
length; ++i) {
52 data[i] = uint32_t(pixels[i]);
55 env->ReleaseIntArrayElements(pixelsArray, pixels, 0);
58 if (!
pixmap.convertFromImage(QImage(
reinterpret_cast<uchar *
>(data),
61 qsizetype(width) * qsizetype(4),
62 QImage::Format_ARGB32,
63 cleanupProductIconData,
74 KisApplication *app = qobject_cast<KisApplication *>(KisApplication::instance());
76 return app->androidDonations();
84 QAndroidJniObject::callStaticMethod<void>(
"org/krita/android/MainActivity",
"setLoaded",
"(Z)V", jboolean(loaded));
89 QAndroidJniObject textObject = QAndroidJniObject::fromString(text);
90 QAndroidJniObject::callStaticMethod<void>(
"org/krita/android/MainActivity",
92 "(Ljava/lang/String;)V",
93 textObject.object<jstring>());
98 QAndroidJniEnvironment env;
99 jbyteArray splashBytes =
nullptr;
100 QString splashArtist;
103 splashArtist =
source.artistCredit;
104 QFile f(
source.resourcePath);
105 if (f.open(QIODevice::ReadOnly)) {
106 QByteArray buf = f.readAll();
109 jsize
length = buf.size();
111 splashBytes = env->NewByteArray(
length);
112 env->SetByteArrayRegion(splashBytes, 0,
length,
reinterpret_cast<const jbyte *
>(buf.constData()));
115 qWarning(
"Failed to read splash screen image from '%s': %s",
116 qUtf8Printable(
source.resourcePath),
117 qUtf8Printable(f.errorString()));
120 QAndroidJniObject splashArtistObject = QAndroidJniObject::fromString(splashArtist);
121 QAndroidJniObject splashVersionObject = QAndroidJniObject::fromString(qApp->applicationVersion());
122 QAndroidJniObject::callStaticMethod<void>(
"org/krita/android/MainActivity",
123 "showDonationDialog",
124 "(Z[BLjava/lang/String;Ljava/lang/String;)V",
127 splashArtistObject.object(),
128 splashVersionObject.object());
130 env->DeleteLocalRef(splashBytes);
152 QAndroidJniObject currentProducts = QAndroidJniObject::callStaticObjectMethod(
"org/krita/android/DonationHelper",
153 "getCurrentProducts",
154 "()Ljava/util/List;");
155 jint size = currentProducts.callMethod<jint>(
"size",
"()I");
156 products.reserve(size);
157 for (jint i = 0; i < size; ++i) {
158 QAndroidJniObject javaProduct = currentProducts.callObjectMethod(
"get",
"(I)Ljava/lang/Object;", i);
163 javaProduct.callObjectMethod(
"getId",
"()Ljava/lang/String;").toString(),
164 javaProduct.callObjectMethod(
"getTitle",
"()Ljava/lang/String;").toString(),
165 javaProduct.callObjectMethod(
"getDescription",
"()Ljava/lang/String;").toString(),
166 getProductIcon(javaProduct),
167 javaProduct.callObjectMethod(
"getButtonText",
"()Ljava/lang/String;").toString(),
168 javaProduct.callObjectMethod(
"getOfferToken",
"()Ljava/lang/String;").toString(),
176 QAndroidJniObject productIdObject = QAndroidJniObject::fromString(productId);
177 QAndroidJniObject offerTokenObject = QAndroidJniObject::fromString(offerToken);
178 QAndroidJniObject::callStaticMethod<void>(
"org/krita/android/DonationHelper",
179 "startBillingFlowForProductId",
180 "(Ljava/lang/String;Ljava/lang/String;)V",
181 productIdObject.object<jstring>(),
182 offerTokenObject.object<jstring>());
192 QAndroidJniObject::callStaticMethod<void>(
"org/krita/android/MainActivity",
"manageSubscriptions",
"()V");
197 QAndroidJniObject productIdObject = QAndroidJniObject::fromString(productId);
198 QAndroidJniObject::callStaticMethod<void>(
"org/krita/android/MainActivity",
199 "manageSubscription",
200 "(Ljava/lang/String;)V",
201 productIdObject.object<jstring>());
221 Qt::QueuedConnection);
226 QAndroidJniObject productIdObject = QAndroidJniObject::fromString(productId);
227 return QAndroidJniObject::callStaticMethod<jboolean>(
"org/krita/android/DonationHelper",
229 "(Ljava/lang/String;)B");
234 QAndroidJniObject::callStaticMethod<void>(
"org/krita/android/DonationHelper",
"syncState",
"()V");
240 jlong ownedProductFlags)
242 KisApplication *app = qobject_cast<KisApplication *>(KisApplication::instance());
245 if (androidDonations) {
254 KisApplication *app = qobject_cast<KisApplication *>(KisApplication::instance());
257 if (androidDonations) {
266 KisApplication *app = qobject_cast<KisApplication *>(KisApplication::instance());
269 if (androidDonations) {
qreal length(const QPointF &vec)
JNIEXPORT void JNICALL Java_org_krita_android_JNIWrappers_donationStateUpdated(JNIEnv *, jobject, jint state, jlong ownedProductFlags)
JNIEXPORT void JNICALL Java_org_krita_android_JNIWrappers_onSplashDialogDismissed(JNIEnv *, jobject)
JNIEXPORT void JNICALL Java_org_krita_android_JNIWrappers_showDonationManagementDialog(JNIEnv *, jobject)
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
enum KRITAUI_EXPORT KisSupporterProductAvailability
enum KRITAUI_EXPORT KisSupporterProductType
void slotUpdateState(int state, long long ownedProductFlags)
void slotManageSubscriptions()
static void setLoaded(bool loaded)
void setShowDonationManagementDialogPending(bool pending)
static void showDonationDialog(bool splash)
void slotStartDonationFlow()
bool m_showDonationManagementDialogPending
static void setLoadingText(const QString &text)
bool shouldShowSupporterBadge() const
KisAndroidDonations(QObject *parent=nullptr)
static KisAndroidDonations * instance()
void sigSplashDialogDismissed()
void sigShowDonationManagementDialogRequested()
void sigStateUpdateReceived(int state, long long ownedProductFlags)
void startBillingFlowFor(const QString &productId, const QString &offerToken)
void slotManageSubscription(const QString &productId)
long long m_ownedProductFlags
QVector< KisSupporterProduct > getCurrentProducts() const
bool isProductOwned(const QString &productId) const
Base class for the Krita app.
static Source getImageSource()