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

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