| Index: chrome/browser/payments/android/payment_manifest_web_data_service_android.cc
|
| diff --git a/chrome/browser/payments/android/payment_manifest_web_data_service_android.cc b/chrome/browser/payments/android/payment_manifest_web_data_service_android.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0938af01db257b3dec81986dd87d642ed8002b63
|
| --- /dev/null
|
| +++ b/chrome/browser/payments/android/payment_manifest_web_data_service_android.cc
|
| @@ -0,0 +1,233 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/payments/android/payment_manifest_web_data_service_android.h"
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/android/jni_android.h"
|
| +#include "base/android/jni_array.h"
|
| +#include "base/android/jni_string.h"
|
| +#include "base/logging.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/numerics/safe_conversions.h"
|
| +#include "chrome/browser/profiles/profile_manager.h"
|
| +#include "chrome/browser/web_data_service_factory.h"
|
| +#include "components/keyed_service/core/service_access_type.h"
|
| +#include "components/webdata/common/web_data_results.h"
|
| +#include "jni/PaymentManifestWebDataService_jni.h"
|
| +
|
| +namespace payments {
|
| +
|
| +// static
|
| +bool PaymentManifestWebDataServiceAndroid::Register(JNIEnv* env) {
|
| + return RegisterNativesImpl(env);
|
| +}
|
| +
|
| +PaymentManifestWebDataServiceAndroid::PaymentManifestWebDataServiceAndroid(
|
| + JNIEnv* env,
|
| + jobject obj)
|
| + : weak_java_obj_(env, obj) {}
|
| +
|
| +PaymentManifestWebDataServiceAndroid::~PaymentManifestWebDataServiceAndroid() {}
|
| +
|
| +void PaymentManifestWebDataServiceAndroid::OnWebDataServiceRequestDone(
|
| + WebDataServiceBase::Handle h,
|
| + std::unique_ptr<WDTypedResult> result) {
|
| + JNIEnv* env = base::android::AttachCurrentThread();
|
| + if (weak_java_obj_.get(env).is_null())
|
| + return;
|
| +
|
| + if (web_data_service_requests_.find(h) == web_data_service_requests_.end())
|
| + return;
|
| +
|
| + switch (result->GetType()) {
|
| + case PAYMENT_WEB_APP_MANIFEST:
|
| + OnWebAppManifestRequestDone(env, h, result.get());
|
| + break;
|
| + case PAYMENT_METHOD_MANIFEST:
|
| + OnPaymentMethodManifestRequestDone(env, h, result.get());
|
| + break;
|
| + default:
|
| + NOTREACHED() << "unsupported data type";
|
| + }
|
| +}
|
| +
|
| +void PaymentManifestWebDataServiceAndroid::OnWebAppManifestRequestDone(
|
| + JNIEnv* env,
|
| + WebDataServiceBase::Handle h,
|
| + WDTypedResult* result) {
|
| + const WDResult<std::vector<mojom::WebAppManifestSectionPtr>>* typed_result =
|
| + static_cast<
|
| + const WDResult<std::vector<mojom::WebAppManifestSectionPtr>>*>(
|
| + result);
|
| + const std::vector<mojom::WebAppManifestSectionPtr>* manifest =
|
| + &(typed_result->GetValue());
|
| +
|
| + base::android::ScopedJavaLocalRef<jobjectArray> jmanifest =
|
| + Java_PaymentManifestWebDataService_createManifest(env, manifest->size());
|
| +
|
| + for (size_t i = 0; i < manifest->size(); ++i) {
|
| + const mojom::WebAppManifestSectionPtr& section = manifest->at(i);
|
| + DCHECK_GE(100U, section->fingerprints.size());
|
| +
|
| + Java_PaymentManifestWebDataService_addSectionToManifest(
|
| + env, jmanifest.obj(), base::checked_cast<int>(i),
|
| + base::android::ConvertUTF8ToJavaString(env, section->id),
|
| + section->min_version,
|
| + base::checked_cast<int>(section->fingerprints.size()));
|
| +
|
| + for (size_t j = 0; j < section->fingerprints.size(); ++j) {
|
| + const std::vector<uint8_t>& fingerprint = section->fingerprints[j];
|
| + Java_PaymentManifestWebDataService_addFingerprintToSection(
|
| + env, jmanifest.obj(), base::checked_cast<int>(i),
|
| + base::checked_cast<int>(j),
|
| + base::android::ToJavaByteArray(env, fingerprint));
|
| + }
|
| + }
|
| +
|
| + Java_PaymentManifestWebDataServiceCallback_onPaymentWebAppManifestFetched(
|
| + env, web_data_service_requests_[h]->obj(), jmanifest.obj());
|
| + web_data_service_requests_.erase(h);
|
| +}
|
| +
|
| +void PaymentManifestWebDataServiceAndroid::OnPaymentMethodManifestRequestDone(
|
| + JNIEnv* env,
|
| + WebDataServiceBase::Handle h,
|
| + WDTypedResult* result) {
|
| + const WDResult<std::vector<std::string>>* typed_result =
|
| + static_cast<const WDResult<std::vector<std::string>>*>(result);
|
| + const std::vector<std::string>* web_apps_ids = &(typed_result->GetValue());
|
| +
|
| + Java_PaymentManifestWebDataServiceCallback_onPaymentMethodManifestFetched(
|
| + env, web_data_service_requests_[h]->obj(),
|
| + base::android::ToJavaArrayOfStrings(env, *web_apps_ids));
|
| + web_data_service_requests_.erase(h);
|
| +}
|
| +
|
| +void PaymentManifestWebDataServiceAndroid::Destroy(
|
| + JNIEnv* env,
|
| + const base::android::JavaParamRef<jobject>& unused_obj) {
|
| + delete this;
|
| +}
|
| +
|
| +void PaymentManifestWebDataServiceAndroid::AddPaymentMethodManifest(
|
| + JNIEnv* env,
|
| + const base::android::JavaParamRef<jobject>& unused_obj,
|
| + const base::android::JavaParamRef<jstring>& jmethod_name,
|
| + const base::android::JavaParamRef<jobjectArray>& japps_package_names) {
|
| + std::vector<std::string> apps_package_names;
|
| + base::android::AppendJavaStringArrayToStringVector(env, japps_package_names,
|
| + &apps_package_names);
|
| +
|
| + scoped_refptr<payments::PaymentManifestWebDataService> web_data_service =
|
| + WebDataServiceFactory::GetPaymentManifestWebDataForProfile(
|
| + ProfileManager::GetActiveUserProfile(),
|
| + ServiceAccessType::EXPLICIT_ACCESS);
|
| + if (web_data_service == nullptr)
|
| + return;
|
| +
|
| + web_data_service->AddPaymentMethodManifest(
|
| + base::android::ConvertJavaStringToUTF8(jmethod_name),
|
| + std::move(apps_package_names));
|
| +}
|
| +
|
| +void PaymentManifestWebDataServiceAndroid::AddPaymentWebAppManifest(
|
| + JNIEnv* env,
|
| + const base::android::JavaParamRef<jobject>& unused_obj,
|
| + const base::android::JavaParamRef<jobjectArray>& jmanifest_sections) {
|
| + scoped_refptr<payments::PaymentManifestWebDataService> web_data_service =
|
| + WebDataServiceFactory::GetPaymentManifestWebDataForProfile(
|
| + ProfileManager::GetActiveUserProfile(),
|
| + ServiceAccessType::EXPLICIT_ACCESS);
|
| + if (web_data_service == nullptr)
|
| + return;
|
| +
|
| + std::vector<mojom::WebAppManifestSectionPtr> manifest;
|
| +
|
| + jsize jcount_of_sections = env->GetArrayLength(jmanifest_sections.obj());
|
| + for (jsize i = 0; i < jcount_of_sections; i++) {
|
| + mojom::WebAppManifestSectionPtr section =
|
| + mojom::WebAppManifestSection::New();
|
| +
|
| + base::android::ScopedJavaLocalRef<jobject> jsection(
|
| + env, env->GetObjectArrayElement(jmanifest_sections.obj(), i));
|
| + section->id = base::android::ConvertJavaStringToUTF8(
|
| + Java_PaymentManifestWebDataService_getIdFromSection(env,
|
| + jsection.obj()));
|
| + section->min_version = static_cast<int64_t>(
|
| + Java_PaymentManifestWebDataService_getMinVersionFromSection(
|
| + env, jsection.obj()));
|
| +
|
| + base::android::ScopedJavaLocalRef<jobjectArray> jsection_fingerprints(
|
| + Java_PaymentManifestWebDataService_getFingerprintsFromSection(
|
| + env, jsection.obj()));
|
| + jsize jcount_of_fingerprints =
|
| + env->GetArrayLength(jsection_fingerprints.obj());
|
| + for (jsize j = 0; j < jcount_of_fingerprints; j++) {
|
| + std::vector<uint8_t> fingerprint;
|
| + base::android::ScopedJavaLocalRef<jbyteArray> jfingerprint(
|
| + env, (jbyteArray)env->GetObjectArrayElement(
|
| + jsection_fingerprints.obj(), j));
|
| + base::android::JavaByteArrayToByteVector(env, jfingerprint.obj(),
|
| + &fingerprint);
|
| + section->fingerprints.emplace_back(fingerprint);
|
| + }
|
| +
|
| + manifest.emplace_back(std::move(section));
|
| + }
|
| +
|
| + web_data_service->AddPaymentWebAppManifest(std::move(manifest));
|
| +}
|
| +
|
| +bool PaymentManifestWebDataServiceAndroid::GetPaymentMethodManifest(
|
| + JNIEnv* env,
|
| + const base::android::JavaParamRef<jobject>& unused_obj,
|
| + const base::android::JavaParamRef<jstring>& jmethod_name,
|
| + const base::android::JavaParamRef<jobject>& jcallback) {
|
| + scoped_refptr<payments::PaymentManifestWebDataService> web_data_service =
|
| + WebDataServiceFactory::GetPaymentManifestWebDataForProfile(
|
| + ProfileManager::GetActiveUserProfile(),
|
| + ServiceAccessType::EXPLICIT_ACCESS);
|
| + if (web_data_service == nullptr)
|
| + return false;
|
| +
|
| + WebDataServiceBase::Handle handle =
|
| + web_data_service->GetPaymentMethodManifest(
|
| + base::android::ConvertJavaStringToUTF8(env, jmethod_name), this);
|
| + web_data_service_requests_[handle] =
|
| + base::MakeUnique<base::android::ScopedJavaGlobalRef<jobject>>(jcallback);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool PaymentManifestWebDataServiceAndroid::GetPaymentWebAppManifest(
|
| + JNIEnv* env,
|
| + const base::android::JavaParamRef<jobject>& unused_obj,
|
| + const base::android::JavaParamRef<jstring>& japp_package_name,
|
| + const base::android::JavaParamRef<jobject>& jcallback) {
|
| + scoped_refptr<payments::PaymentManifestWebDataService> web_data_service =
|
| + WebDataServiceFactory::GetPaymentManifestWebDataForProfile(
|
| + ProfileManager::GetActiveUserProfile(),
|
| + ServiceAccessType::EXPLICIT_ACCESS);
|
| + if (web_data_service == nullptr)
|
| + return false;
|
| +
|
| + WebDataServiceBase::Handle handle =
|
| + web_data_service->GetPaymentWebAppManifest(
|
| + base::android::ConvertJavaStringToUTF8(env, japp_package_name), this);
|
| + web_data_service_requests_[handle] =
|
| + base::MakeUnique<base::android::ScopedJavaGlobalRef<jobject>>(jcallback);
|
| +
|
| + return true;
|
| +}
|
| +
|
| +static jlong Init(JNIEnv* env,
|
| + const base::android::JavaParamRef<jobject>& obj) {
|
| + PaymentManifestWebDataServiceAndroid* manifest_web_data_service_android =
|
| + new PaymentManifestWebDataServiceAndroid(env, obj);
|
| + return reinterpret_cast<intptr_t>(manifest_web_data_service_android);
|
| +}
|
| +
|
| +} // namespace payments
|
|
|