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..e166ff9d4b23ea5f0c82008fb77410df28c296ab |
--- /dev/null |
+++ b/chrome/browser/payments/android/payment_manifest_web_data_service_android.cc |
@@ -0,0 +1,179 @@ |
+// 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 "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 "chrome/browser/profiles/profile_manager.h" |
+#include "chrome/browser/web_data_service_factory.h" |
+#include "components/keyed_service/core/service_access_type.h" |
+#include "jni/PaymentManifestWebDataService_jni.h" |
+ |
+namespace payments { |
please use gerrit instead
2017/04/24 18:22:31
Add an empty line after the namespace start.
gogerald1
2017/04/26 13:46:32
Done.
|
+// static |
+bool PaymentManifestWebDataServiceAndroid::Register(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+ |
+PaymentManifestWebDataServiceAndroid::PaymentManifestWebDataServiceAndroid( |
+ JNIEnv* env, |
+ jobject obj) |
+ : weak_java_obj_(env, obj) {} |
+ |
+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: |
please use gerrit instead
2017/04/24 18:22:32
Question: Where is this defined?
gogerald1
2017/04/26 13:46:32
web_data_results.h
please use gerrit instead
2017/04/26 15:00:43
Include it?
gogerald1
2017/04/26 17:30:30
Done.
|
+ 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 std::vector<mojom::WebAppManifestSectionPtr>* manifest = &( |
+ static_cast< |
+ const WDResult<std::vector<mojom::WebAppManifestSectionPtr>>*>(result) |
+ ->GetValue()); |
please use gerrit instead
2017/04/24 18:22:31
Ouch, this is confusing. Please separate this into
gogerald1
2017/04/26 13:46:32
Done.
|
+ |
+ 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)[i]; |
please use gerrit instead
2017/04/24 18:22:32
manifest->get(i) is less ugly, IMHO.
gogerald1
2017/04/26 13:46:32
Done.
|
+ DCHECK_GE(100U, section->fingerprints.size()); |
+ |
+ Java_PaymentManifestWebDataService_addSectionToManifest( |
+ env, jmanifest.obj(), base::checked_cast<int>(i), |
please use gerrit instead
2017/04/24 18:22:31
#include "base/numerics/safe_conversions.h"
gogerald1
2017/04/26 13:46:32
Done.
|
+ 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 std::vector<std::string>* web_apps_ids = |
please use gerrit instead
2017/04/24 18:22:32
#include <string>
gogerald1
2017/04/26 13:46:32
Done.
|
+ &(static_cast<const WDResult<std::vector<std::string>>*>(result) |
+ ->GetValue()); |
please use gerrit instead
2017/04/24 18:22:32
Confusing. Please separate into several statements
gogerald1
2017/04/26 13:46:32
Done.
|
+ |
+ Java_PaymentManifestWebDataServiceCallback_onPaymentMethodManifestFetched( |
+ env, web_data_service_requests_[h]->obj(), |
+ base::android::ToJavaArrayOfStrings(env, *web_apps_ids)); |
+ web_data_service_requests_.erase(h); |
+} |
+ |
+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; |
+} |
+ |
+void PaymentManifestWebDataServiceAndroid::AddPaymentMethodManifest( |
+ JNIEnv* env, |
+ const base::android::JavaParamRef<jobject>& unused_obj, |
+ const base::android::JavaParamRef<jstring>& jmethod_name, |
+ const base::android::JavaParamRef<jobjectArray>& jweb_apps_ids) { |
+ std::vector<std::string> web_apps_ids; |
+ base::android::AppendJavaStringArrayToStringVector(env, jweb_apps_ids, |
+ &web_apps_ids); |
+ |
+ 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), web_apps_ids); |
+} |
+ |
+bool PaymentManifestWebDataServiceAndroid::GetPaymentWebAppManifest( |
+ JNIEnv* env, |
+ const base::android::JavaParamRef<jobject>& unused_obj, |
+ const base::android::JavaParamRef<jstring>& jweb_app_id, |
+ 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, jweb_app_id), this); |
+ web_data_service_requests_[handle] = |
+ base::MakeUnique<base::android::ScopedJavaGlobalRef<jobject>>(jcallback); |
+ |
+ return true; |
+} |
+ |
+void PaymentManifestWebDataServiceAndroid::AddPaymentWebAppManifest( |
+ const std::vector<mojom::WebAppManifestSectionPtr>& manifest) { |
+ scoped_refptr<payments::PaymentManifestWebDataService> web_data_service = |
+ WebDataServiceFactory::GetPaymentManifestWebDataForProfile( |
+ ProfileManager::GetActiveUserProfile(), |
+ ServiceAccessType::EXPLICIT_ACCESS); |
+ if (web_data_service != nullptr) |
+ web_data_service->AddPaymentWebAppManifest(manifest); |
+} |
+ |
+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 |