Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2248)

Unified Diff: chrome/browser/payments/android/payment_manifest_web_data_service_android.cc

Issue 2838433002: [Payments] Cache payment manifests. (Closed)
Patch Set: rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « chrome/browser/payments/android/payment_manifest_web_data_service_android.h ('k') | chrome/browser/ui/profile_error_dialog.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698