Added start transaction method

This commit is contained in:
r.kuznetsov 2018-10-16 14:26:24 +03:00 committed by Aleksandr Zatsepin
parent 52d94a68d2
commit ef8c2bf736
5 changed files with 130 additions and 9 deletions

View file

@ -735,6 +735,21 @@ void CallPurchaseValidationListener(shared_ptr<jobject> listener, Purchase::Vali
receiptData.get());
}
void CallStartPurchaseTransactionListener(shared_ptr<jobject> listener, bool success,
std::string const & serverId,
std::string const & vendorId)
{
JNIEnv * env = jni::GetEnv();
jmethodID const methodId = jni::GetMethodID(env, *listener, "onStartTransaction",
"(ZLjava/lang/String;Ljava/lang/String;)V");
jni::TScopedLocalRef const serverIdStr(env, jni::ToJavaString(env, serverId));
jni::TScopedLocalRef const vendorIdStr(env, jni::ToJavaString(env, vendorId));
env->CallVoidMethod(*listener, methodId, static_cast<jboolean>(success),
serverIdStr.get(), vendorIdStr.get());
}
/// @name JNI EXPORTS
//@{
JNIEXPORT jstring JNICALL
@ -1783,6 +1798,20 @@ Java_com_mapswithme_maps_Framework_nativeValidatePurchase(JNIEnv * env, jclass,
purchase->Validate(info, frm()->GetUser().GetAccessToken());
}
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_Framework_nativeStartPurchaseTransaction(JNIEnv * env, jclass,
jstring serverId,
jstring vendorId)
{
auto const & purchase = frm()->GetPurchase();
if (purchase == nullptr)
return;
purchase->StartTransaction(jni::ToNativeString(env, serverId),
jni::ToNativeString(env, vendorId),
frm()->GetUser().GetAccessToken());
}
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_Framework_nativeSetPurchaseValidationListener(JNIEnv *, jclass,
jobject listener)
@ -1802,6 +1831,25 @@ Java_com_mapswithme_maps_Framework_nativeSetPurchaseValidationListener(JNIEnv *,
}
}
JNIEXPORT void JNICALL
Java_com_mapswithme_maps_Framework_nativeStartPurchaseTransactionListener(JNIEnv *, jclass,
jobject listener)
{
auto const & purchase = frm()->GetPurchase();
if (purchase == nullptr)
return;
if (listener != nullptr)
{
purchase->SetStartTransactionCallback(bind(&CallStartPurchaseTransactionListener,
jni::make_global_ref(listener), _1, _2, _3));
}
else
{
purchase->SetStartTransactionCallback(nullptr);
}
}
JNIEXPORT jboolean JNICALL
Java_com_mapswithme_maps_Framework_nativeHasActiveRemoveAdsSubscription(JNIEnv *, jclass)
{

View file

@ -150,6 +150,12 @@ public class Framework
@NonNull String vendorId, @NonNull String purchaseToken);
}
@SuppressWarnings("unused")
public interface StartTransactionListener
{
void onStartTransaction(boolean success, @NonNull String serverId, @NonNull String vendorId);
}
public static class Params3dMode
{
public boolean enabled;
@ -479,6 +485,11 @@ public class Framework
public static native void nativeMakeCrash();
public static native void nativeStartPurchaseTransaction(@NonNull String serverId,
@NonNull String vendorId);
public static native void nativeStartPurchaseTransactionListener(@Nullable
StartTransactionListener listener);
public static native void nativeValidatePurchase(@NonNull String serverId,
@NonNull String vendorId,
@NonNull String purchaseData);

View file

@ -91,7 +91,8 @@
vi.m_receiptData = [receiptData base64EncodedStringWithOptions:0].UTF8String;
vi.m_serverId = self.serverId.UTF8String;
vi.m_vendorId = ADS_REMOVAL_VENDOR;
GetFramework().GetPurchase()->Validate(vi, {} /* accessToken */);
auto const accessToken = GetFramework().GetUser().GetAccessToken();
GetFramework().GetPurchase()->Validate(vi, accessToken);
}
- (void)validReceipt

View file

@ -55,6 +55,13 @@ std::string ValidationUrl()
return kServerUrl + "registrar/register";
}
std::string StartTransactionUrl()
{
if (kServerUrl.empty())
return {};
return kServerUrl + "registrar/start_transaction";
}
struct ReceiptData
{
ReceiptData(std::string const & data, std::string const & type)
@ -121,6 +128,12 @@ void Purchase::SetValidationCallback(ValidationCallback && callback)
m_validationCallback = std::move(callback);
}
void Purchase::SetStartTransactionCallback(StartTransactionCallback && callback)
{
CHECK_THREAD_CHECKER(m_threadChecker, ());
m_startTransactionCallback = std::move(callback);
}
bool Purchase::IsSubscriptionActive(SubscriptionType type) const
{
switch (type)
@ -170,12 +183,39 @@ void Purchase::Validate(ValidationInfo const & validationInfo, std::string const
GetPlatform().RunTask(Platform::Thread::Network, [this, url, validationInfo, accessToken]()
{
ValidateImpl(url, validationInfo, accessToken, 0 /* attemptIndex */, kFirstWaitingTimeInSec);
ValidateImpl(url, validationInfo, accessToken, false /* startTransaction */,
0 /* attemptIndex */, kFirstWaitingTimeInSec);
});
}
void Purchase::StartTransaction(std::string const & serverId, std::string const & vendorId,
std::string const & accessToken)
{
CHECK_THREAD_CHECKER(m_threadChecker, ());
ValidationInfo info;
info.m_serverId = serverId;
info.m_vendorId = vendorId;
std::string const url = StartTransactionUrl();
auto const status = GetPlatform().ConnectionStatus();
if (url.empty() || status == Platform::EConnectionType::CONNECTION_NONE)
{
if (m_startTransactionCallback)
m_startTransactionCallback(false /* success */, serverId, vendorId);
return;
}
GetPlatform().RunTask(Platform::Thread::Network, [this, url, info, accessToken]()
{
ValidateImpl(url, info, accessToken, true /* startTransaction */,
0 /* attemptIndex */, kFirstWaitingTimeInSec);
});
}
void Purchase::ValidateImpl(std::string const & url, ValidationInfo const & validationInfo,
std::string const & accessToken, uint8_t attemptIndex, uint32_t waitingTimeInSeconds)
std::string const & accessToken, bool startTransaction,
uint8_t attemptIndex, uint32_t waitingTimeInSeconds)
{
platform::HttpClient request(url);
request.SetRawHeader("Accept", "application/json");
@ -232,17 +272,30 @@ void Purchase::ValidateImpl(std::string const & url, ValidationInfo const & vali
++attemptIndex;
waitingTimeInSeconds *= kWaitingTimeScaleFactor;
GetPlatform().RunDelayedTask(Platform::Thread::Network, delayTime,
[this, url, validationInfo, accessToken, attemptIndex, waitingTimeInSeconds]()
[this, url, validationInfo, accessToken, startTransaction,
attemptIndex, waitingTimeInSeconds]()
{
ValidateImpl(url, validationInfo, accessToken, attemptIndex, waitingTimeInSeconds);
ValidateImpl(url, validationInfo, accessToken, startTransaction,
attemptIndex, waitingTimeInSeconds);
});
}
else
{
GetPlatform().RunTask(Platform::Thread::Gui, [this, code, validationInfo]()
GetPlatform().RunTask(Platform::Thread::Gui, [this, code, startTransaction, validationInfo]()
{
if (m_validationCallback)
m_validationCallback(code, validationInfo);
if (startTransaction)
{
if (m_startTransactionCallback)
{
m_startTransactionCallback(code == ValidationCode::Verified /* success */,
validationInfo.m_serverId, validationInfo.m_vendorId);
}
}
else
{
if (m_validationCallback)
m_validationCallback(code, validationInfo);
}
});
}
}

View file

@ -46,13 +46,20 @@ public:
};
using ValidationCallback = std::function<void(ValidationCode, ValidationInfo const &)>;
using StartTransactionCallback = std::function<void(bool success, std::string const & serverId,
std::string const & vendorId)>;
void SetValidationCallback(ValidationCallback && callback);
void Validate(ValidationInfo const & validationInfo, std::string const & accessToken);
void SetStartTransactionCallback(StartTransactionCallback && callback);
void StartTransaction(std::string const & serverId, std::string const & vendorId,
std::string const & accessToken);
private:
void ValidateImpl(std::string const & url, ValidationInfo const & validationInfo,
std::string const & accessToken, uint8_t attemptIndex, uint32_t waitingTimeInSeconds);
std::string const & accessToken, bool startTransaction,
uint8_t attemptIndex, uint32_t waitingTimeInSeconds);
struct RemoveAdsSubscriptionData
{
@ -64,6 +71,7 @@ private:
std::vector<SubscriptionListener *> m_listeners;
ValidationCallback m_validationCallback;
StartTransactionCallback m_startTransactionCallback;
ThreadChecker m_threadChecker;
};