blob: e514dc34618afbb1b02926f0a20a134d1b60e194 [file] [log] [blame]
// Copyright 2019 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 "components/content_capture/android/content_capture_receiver_manager_android.h"
#include <utility>
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "components/content_capture/android/content_capture_controller.h"
#include "content/public/browser/web_contents.h"
#include "jni/ContentCaptureData_jni.h"
#include "jni/ContentCaptureReceiverManager_jni.h"
using base::android::AttachCurrentThread;
using base::android::ConvertUTF16ToJavaString;
using base::android::JavaRef;
using base::android::ScopedJavaLocalRef;
using base::android::ToJavaLongArray;
static ScopedJavaLocalRef<jobject>
JNI_ContentCaptureReceiverManager_CreateOrGet(
JNIEnv* env,
const base::android::JavaParamRef<jobject>& jwebContents) {
auto* web_contents = content::WebContents::FromJavaWebContents(jwebContents);
DCHECK(web_contents);
auto* manager =
content_capture::ContentCaptureReceiverManager::FromWebContents(
web_contents);
if (!manager) {
manager = content_capture::ContentCaptureReceiverManagerAndroid::Create(
env, web_contents);
}
return static_cast<content_capture::ContentCaptureReceiverManagerAndroid*>(
manager)
->GetJavaObject();
}
namespace content_capture {
namespace {
ScopedJavaLocalRef<jobject> ToJavaObjectOfContentCaptureData(
JNIEnv* env,
const ContentCaptureData& data,
const JavaRef<jobject>& parent) {
ScopedJavaLocalRef<jstring> jvalue =
ConvertUTF16ToJavaString(env, data.value);
ScopedJavaLocalRef<jobject> jdata =
Java_ContentCaptureData_createContentCaptureData(
env, parent, data.id, jvalue, data.bounds.x(), data.bounds.y(),
data.bounds.width(), data.bounds.height());
if (jdata.is_null())
return jdata;
for (auto child : data.children) {
ToJavaObjectOfContentCaptureData(env, child, jdata);
}
return jdata;
}
ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfContentCaptureData(
JNIEnv* env,
const ContentCaptureSession& session) {
ScopedJavaLocalRef<jclass> object_clazz =
base::android::GetClass(env, "java/lang/Object");
jobjectArray joa =
env->NewObjectArray(session.size(), object_clazz.obj(), NULL);
jni_generator::CheckException(env);
for (size_t i = 0; i < session.size(); ++i) {
ScopedJavaLocalRef<jobject> item =
ToJavaObjectOfContentCaptureData(env, session[i], JavaRef<jobject>());
env->SetObjectArrayElement(joa, i, item.obj());
}
return ScopedJavaLocalRef<jobjectArray>(env, joa);
}
} // namespace
ContentCaptureReceiverManagerAndroid::ContentCaptureReceiverManagerAndroid(
JNIEnv* env,
content::WebContents* web_contents)
: ContentCaptureReceiverManager(web_contents),
java_ref_(Java_ContentCaptureReceiverManager_Constructor(env)) {}
ContentCaptureReceiverManagerAndroid::~ContentCaptureReceiverManagerAndroid() =
default;
ContentCaptureReceiverManagerAndroid*
ContentCaptureReceiverManagerAndroid::Create(
JNIEnv* env,
content::WebContents* web_contents) {
auto* manager = FromWebContents(web_contents);
if (manager)
return static_cast<ContentCaptureReceiverManagerAndroid*>(manager);
return new ContentCaptureReceiverManagerAndroid(env, web_contents);
}
void ContentCaptureReceiverManagerAndroid::DidCaptureContent(
const ContentCaptureSession& parent_session,
const ContentCaptureData& data) {
JNIEnv* env = AttachCurrentThread();
DCHECK(java_ref_.obj());
ScopedJavaLocalRef<jobject> jdata =
ToJavaObjectOfContentCaptureData(env, data, JavaRef<jobject>());
if (jdata.is_null())
return;
Java_ContentCaptureReceiverManager_didCaptureContent(
env, java_ref_, ToJavaArrayOfContentCaptureData(env, parent_session),
jdata);
}
void ContentCaptureReceiverManagerAndroid::DidRemoveContent(
const ContentCaptureSession& session,
const std::vector<int64_t>& data) {
JNIEnv* env = AttachCurrentThread();
DCHECK(java_ref_.obj());
Java_ContentCaptureReceiverManager_didRemoveContent(
env, java_ref_, ToJavaArrayOfContentCaptureData(env, session),
ToJavaLongArray(env, data));
}
void ContentCaptureReceiverManagerAndroid::DidRemoveSession(
const ContentCaptureSession& session) {
JNIEnv* env = AttachCurrentThread();
DCHECK(java_ref_.obj());
Java_ContentCaptureReceiverManager_didRemoveSession(
env, java_ref_, ToJavaArrayOfContentCaptureData(env, session));
}
bool ContentCaptureReceiverManagerAndroid::ShouldCapture(const GURL& url) {
return ContentCaptureController::Get()->ShouldCapture(url);
}
ScopedJavaLocalRef<jobject>
ContentCaptureReceiverManagerAndroid::GetJavaObject() {
return ScopedJavaLocalRef<jobject>(java_ref_);
}
} // namespace content_capture