// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_REQUEST_SPEC_H_
#define COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_REQUEST_SPEC_H_
#include <jni.h>
#include <memory>
#include "base/android/scoped_java_ref.h"
#include "components/payments/content/payment_request_spec.h"
namespace payments {
namespace android {
// A bridge for Android to own a C++ PaymentRequestSpec object.
//
// Object ownership diagram:
//
// ChromePaymentRequestService.java
// |
// v
// PaymentRequestSpec.java
// |
// v
// android/payment_request_spec.h
// |
// v
// payment_request_spec.h
class PaymentRequestSpec {
public:
// Returns the C++ PaymentRequestSpec that is owned by the Java
// PaymentRequestSpec, or nullptr after the Java method
// PaymentRequestSpec.destroy() has been called.
static base::WeakPtr<payments::PaymentRequestSpec> FromJavaPaymentRequestSpec(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jpayment_request_spec);
// Constructs the Android bridge with the given |spec|.
explicit PaymentRequestSpec(
std::unique_ptr<payments::PaymentRequestSpec> spec);
// Called when the renderer updates the payment details in response to, e.g.,
// new shipping address.
void UpdateWith(JNIEnv* env,
const base::android::JavaParamRef<jobject>& jdetails_buffer);
// Called when the merchant retries a failed payment.
void Retry(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jvalidation_errors_buffer);
// Recomputes spec based on details.
void RecomputeSpecForDetails(JNIEnv* env);
// Returns whether the secure-payment-confirmation method is requested.
bool IsSecurePaymentConfirmationRequested(JNIEnv* env);
// Returns the selected shipping option error.
base::android::ScopedJavaLocalRef<jstring> SelectedShippingOptionError(
JNIEnv* env);
// Returns the payment details.
base::android::ScopedJavaLocalRef<jbyteArray> GetPaymentDetails(JNIEnv* env);
// Returns the payment options.
base::android::ScopedJavaLocalRef<jbyteArray> GetPaymentOptions(JNIEnv* env);
// Returns the method data.
base::android::ScopedJavaLocalRef<jobjectArray> GetMethodData(JNIEnv* env);
// Destroys this bridge.
void Destroy(JNIEnv* env);
private:
~PaymentRequestSpec();
std::unique_ptr<payments::PaymentRequestSpec> spec_;
};
} // namespace android
} // namespace payments
#endif // COMPONENTS_PAYMENTS_CONTENT_ANDROID_PAYMENT_REQUEST_SPEC_H_