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

Side by Side Diff: chrome/browser/payments/android/payment_manifest_web_data_service_android.cc

Issue 2838433002: [Payments] Cache payment manifests. (Closed)
Patch Set: address comments 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/payments/android/payment_manifest_web_data_service_andr oid.h"
6
7 #include <string>
8
9 #include "base/android/jni_android.h"
10 #include "base/android/jni_array.h"
11 #include "base/android/jni_string.h"
12 #include "base/logging.h"
13 #include "base/memory/ptr_util.h"
14 #include "base/numerics/safe_conversions.h"
15 #include "chrome/browser/profiles/profile_manager.h"
16 #include "chrome/browser/web_data_service_factory.h"
17 #include "components/keyed_service/core/service_access_type.h"
18 #include "jni/PaymentManifestWebDataService_jni.h"
19
20 namespace payments {
21
22 // static
23 bool PaymentManifestWebDataServiceAndroid::Register(JNIEnv* env) {
24 return RegisterNativesImpl(env);
25 }
26
27 PaymentManifestWebDataServiceAndroid::PaymentManifestWebDataServiceAndroid(
28 JNIEnv* env,
29 jobject obj)
30 : weak_java_obj_(env, obj) {}
31
32 PaymentManifestWebDataServiceAndroid::~PaymentManifestWebDataServiceAndroid() {}
33
34 void PaymentManifestWebDataServiceAndroid::OnWebDataServiceRequestDone(
35 WebDataServiceBase::Handle h,
36 std::unique_ptr<WDTypedResult> result) {
37 JNIEnv* env = base::android::AttachCurrentThread();
38 if (weak_java_obj_.get(env).is_null())
39 return;
40
41 if (web_data_service_requests_.find(h) == web_data_service_requests_.end())
42 return;
43
44 switch (result->GetType()) {
45 case PAYMENT_WEB_APP_MANIFEST:
46 OnWebAppManifestRequestDone(env, h, result.get());
47 break;
48 case PAYMENT_METHOD_MANIFEST:
49 OnPaymentMethodManifestRequestDone(env, h, result.get());
50 break;
51 default:
52 NOTREACHED() << "unsupported data type";
53 }
54 }
55
56 void PaymentManifestWebDataServiceAndroid::OnWebAppManifestRequestDone(
57 JNIEnv* env,
58 WebDataServiceBase::Handle h,
59 WDTypedResult* result) {
60 const WDResult<std::vector<mojom::WebAppManifestSectionPtr>>* typed_result =
61 static_cast<
62 const WDResult<std::vector<mojom::WebAppManifestSectionPtr>>*>(
63 result);
64 const std::vector<mojom::WebAppManifestSectionPtr>* manifest =
65 &(typed_result->GetValue());
66
67 base::android::ScopedJavaLocalRef<jobjectArray> jmanifest =
68 Java_PaymentManifestWebDataService_createManifest(env, manifest->size());
69
70 for (size_t i = 0; i < manifest->size(); ++i) {
71 const mojom::WebAppManifestSectionPtr& section = manifest->at(i);
72 DCHECK_GE(100U, section->fingerprints.size());
73
74 Java_PaymentManifestWebDataService_addSectionToManifest(
75 env, jmanifest.obj(), base::checked_cast<int>(i),
76 base::android::ConvertUTF8ToJavaString(env, section->id),
77 section->min_version,
78 base::checked_cast<int>(section->fingerprints.size()));
79
80 for (size_t j = 0; j < section->fingerprints.size(); ++j) {
81 const std::vector<uint8_t>& fingerprint = section->fingerprints[j];
82 Java_PaymentManifestWebDataService_addFingerprintToSection(
83 env, jmanifest.obj(), base::checked_cast<int>(i),
84 base::checked_cast<int>(j),
85 base::android::ToJavaByteArray(env, fingerprint));
86 }
87 }
88
89 Java_PaymentManifestWebDataServiceCallback_onPaymentWebAppManifestFetched(
90 env, web_data_service_requests_[h]->obj(), jmanifest.obj());
91 web_data_service_requests_.erase(h);
92 }
93
94 void PaymentManifestWebDataServiceAndroid::OnPaymentMethodManifestRequestDone(
95 JNIEnv* env,
96 WebDataServiceBase::Handle h,
97 WDTypedResult* result) {
98 const WDResult<std::vector<std::string>>* typed_result =
99 static_cast<const WDResult<std::vector<std::string>>*>(result);
100 const std::vector<std::string>* web_apps_ids = &(typed_result->GetValue());
101
102 Java_PaymentManifestWebDataServiceCallback_onPaymentMethodManifestFetched(
103 env, web_data_service_requests_[h]->obj(),
104 base::android::ToJavaArrayOfStrings(env, *web_apps_ids));
105 web_data_service_requests_.erase(h);
106 }
107
108 void PaymentManifestWebDataServiceAndroid::Destroy(
109 JNIEnv* env,
110 const base::android::JavaParamRef<jobject>& unused_obj) {
111 delete this;
112 }
113
114 void PaymentManifestWebDataServiceAndroid::AddPaymentMethodManifest(
115 JNIEnv* env,
116 const base::android::JavaParamRef<jobject>& unused_obj,
117 const base::android::JavaParamRef<jstring>& jmethod_name,
118 const base::android::JavaParamRef<jobjectArray>& japps_package_names) {
119 std::vector<std::string> apps_package_names;
120 base::android::AppendJavaStringArrayToStringVector(env, japps_package_names,
121 &apps_package_names);
122
123 scoped_refptr<payments::PaymentManifestWebDataService> web_data_service =
124 WebDataServiceFactory::GetPaymentManifestWebDataForProfile(
125 ProfileManager::GetActiveUserProfile(),
126 ServiceAccessType::EXPLICIT_ACCESS);
127 if (web_data_service == nullptr)
128 return;
129
130 web_data_service->AddPaymentMethodManifest(
131 base::android::ConvertJavaStringToUTF8(jmethod_name),
132 std::move(apps_package_names));
133 }
134
135 void PaymentManifestWebDataServiceAndroid::AddPaymentWebAppManifest(
136 JNIEnv* env,
137 const base::android::JavaParamRef<jobject>& unused_obj,
138 const base::android::JavaParamRef<jobjectArray>& jmanifest_sections) {
139 scoped_refptr<payments::PaymentManifestWebDataService> web_data_service =
140 WebDataServiceFactory::GetPaymentManifestWebDataForProfile(
141 ProfileManager::GetActiveUserProfile(),
142 ServiceAccessType::EXPLICIT_ACCESS);
143 if (web_data_service == nullptr)
144 return;
145
146 std::vector<mojom::WebAppManifestSectionPtr> manifest;
147
148 jsize jcount_of_sections = env->GetArrayLength(jmanifest_sections.obj());
149 for (jsize i = 0; i < jcount_of_sections; i++) {
150 mojom::WebAppManifestSectionPtr section =
151 mojom::WebAppManifestSection::New();
152
153 base::android::ScopedJavaLocalRef<jobject> jsection(
154 env, env->GetObjectArrayElement(jmanifest_sections.obj(), i));
155 section->id = base::android::ConvertJavaStringToUTF8(
156 Java_PaymentManifestWebDataService_getIdFromSection(env,
157 jsection.obj()));
158 section->min_version = static_cast<int64_t>(
159 Java_PaymentManifestWebDataService_getMinVersionFromSection(
160 env, jsection.obj()));
161
162 base::android::ScopedJavaLocalRef<jobjectArray> jsection_fingerprints(
163 Java_PaymentManifestWebDataService_getFingerprintsFromSection(
164 env, jsection.obj()));
165 jsize jcount_of_fingerprints =
166 env->GetArrayLength(jsection_fingerprints.obj());
167 for (jsize j = 0; j < jcount_of_fingerprints; j++) {
168 std::vector<uint8_t> fingerprint;
169 base::android::ScopedJavaLocalRef<jbyteArray> jfingerprint(
170 env, (jbyteArray)env->GetObjectArrayElement(
171 jsection_fingerprints.obj(), j));
172 base::android::JavaByteArrayToByteVector(env, jfingerprint.obj(),
173 &fingerprint);
174 section->fingerprints.emplace_back(fingerprint);
175 }
176
177 manifest.emplace_back(std::move(section));
178 }
179
180 web_data_service->AddPaymentWebAppManifest(std::move(manifest));
181 }
182
183 bool PaymentManifestWebDataServiceAndroid::GetPaymentMethodManifest(
184 JNIEnv* env,
185 const base::android::JavaParamRef<jobject>& unused_obj,
186 const base::android::JavaParamRef<jstring>& jmethod_name,
187 const base::android::JavaParamRef<jobject>& jcallback) {
188 scoped_refptr<payments::PaymentManifestWebDataService> web_data_service =
189 WebDataServiceFactory::GetPaymentManifestWebDataForProfile(
190 ProfileManager::GetActiveUserProfile(),
191 ServiceAccessType::EXPLICIT_ACCESS);
192 if (web_data_service == nullptr)
193 return false;
194
195 WebDataServiceBase::Handle handle =
196 web_data_service->GetPaymentMethodManifest(
197 base::android::ConvertJavaStringToUTF8(env, jmethod_name), this);
198 web_data_service_requests_[handle] =
199 base::MakeUnique<base::android::ScopedJavaGlobalRef<jobject>>(jcallback);
200
201 return true;
202 }
203
204 bool PaymentManifestWebDataServiceAndroid::GetPaymentWebAppManifest(
205 JNIEnv* env,
206 const base::android::JavaParamRef<jobject>& unused_obj,
207 const base::android::JavaParamRef<jstring>& japp_package_name,
208 const base::android::JavaParamRef<jobject>& jcallback) {
209 scoped_refptr<payments::PaymentManifestWebDataService> web_data_service =
210 WebDataServiceFactory::GetPaymentManifestWebDataForProfile(
211 ProfileManager::GetActiveUserProfile(),
212 ServiceAccessType::EXPLICIT_ACCESS);
213 if (web_data_service == nullptr)
214 return false;
215
216 WebDataServiceBase::Handle handle =
217 web_data_service->GetPaymentWebAppManifest(
218 base::android::ConvertJavaStringToUTF8(env, japp_package_name), this);
219 web_data_service_requests_[handle] =
220 base::MakeUnique<base::android::ScopedJavaGlobalRef<jobject>>(jcallback);
221
222 return true;
223 }
224
225 static jlong Init(JNIEnv* env,
226 const base::android::JavaParamRef<jobject>& obj) {
227 PaymentManifestWebDataServiceAndroid* manifest_web_data_service_android =
228 new PaymentManifestWebDataServiceAndroid(env, obj);
229 return reinterpret_cast<intptr_t>(manifest_web_data_service_android);
230 }
231
232 } // namespace payments
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698