Chromium Code Reviews| 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 |