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 |