1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <set>
#include <string>
#include <utility>
#include <vector>
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "base/functional/bind.h"
#include "base/numerics/safe_conversions.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/webdata_services/web_data_service_factory.h"
#include "components/payments/content/android/payment_handler_host.h"
#include "components/payments/content/payment_event_response_util.h"
#include "components/payments/content/payment_handler_host.h"
#include "components/payments/content/payment_manifest_web_data_service.h"
#include "components/payments/content/service_worker_payment_app_finder.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/installed_payment_apps_finder.h"
#include "content/public/browser/payment_app_provider.h"
#include "content/public/browser/payment_app_provider_util.h"
#include "content/public/browser/web_contents.h"
#include "services/metrics/public/cpp/ukm_recorder.h"
#include "third_party/blink/public/mojom/payments/payment_app.mojom.h"
#include "ui/gfx/android/java_bitmap.h"
#include "url/android/gurl_android.h"
#include "url/gurl.h"
#include "url/origin.h"
// Must come after all headers that specialize FromJniType() / ToJniType().
#include "chrome/android/chrome_jni_headers/ServiceWorkerPaymentAppBridge_jni.h"
namespace {
using ::base::android::AppendJavaStringArrayToStringVector;
using ::base::android::AttachCurrentThread;
using ::base::android::ConvertJavaStringToUTF8;
using ::base::android::ConvertUTF8ToJavaString;
using ::base::android::JavaParamRef;
using ::base::android::JavaRef;
using ::base::android::ScopedJavaGlobalRef;
using ::base::android::ScopedJavaLocalRef;
using ::base::android::ToJavaArrayOfStrings;
using ::base::android::ToJavaIntArray;
using ::payments::mojom::BasicCardNetwork;
using ::payments::mojom::CanMakePaymentEventData;
using ::payments::mojom::CanMakePaymentEventDataPtr;
using ::payments::mojom::PaymentCurrencyAmount;
using ::payments::mojom::PaymentDetailsModifier;
using ::payments::mojom::PaymentDetailsModifierPtr;
using ::payments::mojom::PaymentItem;
using ::payments::mojom::PaymentMethodData;
using ::payments::mojom::PaymentMethodDataPtr;
using ::payments::mojom::PaymentOptions;
using ::payments::mojom::PaymentOptionsPtr;
using ::payments::mojom::PaymentRequestEventData;
using ::payments::mojom::PaymentRequestEventDataPtr;
using ::payments::mojom::PaymentShippingOption;
using ::payments::mojom::PaymentShippingOptionPtr;
using ::payments::mojom::PaymentShippingType;
void OnHasServiceWorkerPaymentAppsResponse(
const JavaRef<jobject>& jcallback,
content::InstalledPaymentAppsFinder::PaymentApps apps) {
JNIEnv* env = AttachCurrentThread();
Java_ServiceWorkerPaymentAppBridge_onHasServiceWorkerPaymentApps(
env, jcallback, apps.size() > 0);
}
void OnGetServiceWorkerPaymentAppsInfo(
const JavaRef<jobject>& jcallback,
content::InstalledPaymentAppsFinder::PaymentApps apps) {
JNIEnv* env = AttachCurrentThread();
base::android::ScopedJavaLocalRef<jobject> jappsInfo =
Java_ServiceWorkerPaymentAppBridge_createPaymentAppsInfo(env);
for (const auto& app_info : apps) {
Java_ServiceWorkerPaymentAppBridge_addPaymentAppInfo(
env, jappsInfo, app_info.second->scope.host(), app_info.second->name,
app_info.second->icon == nullptr
? nullptr
: gfx::ConvertToJavaBitmap(*app_info.second->icon));
}
Java_ServiceWorkerPaymentAppBridge_onGetServiceWorkerPaymentAppsInfo(
env, jcallback, jappsInfo);
}
} // namespace
static void JNI_ServiceWorkerPaymentAppBridge_HasServiceWorkerPaymentApps(
JNIEnv* env,
Profile* profile,
const JavaParamRef<jobject>& jcallback) {
// Checks whether there is a installed service worker payment app through
// GetAllPaymentApps.
content::InstalledPaymentAppsFinder::GetInstance(profile)->GetAllPaymentApps(
base::BindOnce(&OnHasServiceWorkerPaymentAppsResponse,
ScopedJavaGlobalRef<jobject>(env, jcallback)));
}
static void JNI_ServiceWorkerPaymentAppBridge_GetServiceWorkerPaymentAppsInfo(
JNIEnv* env,
Profile* profile,
const JavaParamRef<jobject>& jcallback) {
content::InstalledPaymentAppsFinder::GetInstance(profile)->GetAllPaymentApps(
base::BindOnce(&OnGetServiceWorkerPaymentAppsInfo,
ScopedJavaGlobalRef<jobject>(env, jcallback)));
}
static void JNI_ServiceWorkerPaymentAppBridge_OnClosingPaymentAppWindow(
JNIEnv* env,
const JavaParamRef<jobject>& payment_request_jweb_contents,
jint reason) {
content::WebContents* payment_request_web_contents =
content::WebContents::FromJavaWebContents(payment_request_jweb_contents);
DCHECK(payment_request_web_contents); // Verified in Java before invoking
// this function.
content::PaymentAppProvider::GetOrCreateForWebContents(
payment_request_web_contents)
->OnClosingOpenedWindow(
static_cast<payments::mojom::PaymentEventResponseType>(reason));
}
static void JNI_ServiceWorkerPaymentAppBridge_OnOpeningPaymentAppWindow(
JNIEnv* env,
const JavaParamRef<jobject>& payment_request_jweb_contents,
const JavaParamRef<jobject>& payment_handler_jweb_contents) {
content::WebContents* payment_request_web_contents =
content::WebContents::FromJavaWebContents(payment_request_jweb_contents);
content::WebContents* payment_handler_web_contents =
content::WebContents::FromJavaWebContents(payment_handler_jweb_contents);
DCHECK(payment_request_web_contents); // Verified in Java before invoking
// this function.
DCHECK(payment_handler_web_contents); // Verified in Java before invoking
// this function.
content::PaymentAppProvider::GetOrCreateForWebContents(
payment_request_web_contents)
->SetOpenedWindow(payment_handler_web_contents);
}
static jlong
JNI_ServiceWorkerPaymentAppBridge_GetSourceIdForPaymentAppFromScope(
JNIEnv* env,
const JavaParamRef<jobject>& jscope) {
// At this point we know that the payment handler window is open for the
// payment app associated with this scope. Since this getter is called inside
// PaymentApp::getUkmSourceId() function which in turn gets called for the
// invoked app inside
// ChromePaymentRequestService::openPaymentHandlerWindowInternal.
return content::PaymentAppProviderUtil::GetSourceIdForPaymentAppFromScope(
url::GURLAndroid::ToNativeGURL(env, jscope).DeprecatedGetOriginAsURL());
}
|