blob: f1a0e2fb27821a9a3e56993e09e50946b189d2ed [file] [log] [blame]
// Copyright 2016 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 "content/browser/android/interface_provider_android_impl.h"
#include <utility>
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/callback.h"
#include "base/memory/ptr_util.h"
#include "jni/InterfaceProvider_jni.h"
#include "mojo/public/cpp/system/message_pipe.h"
#include "services/shell/public/cpp/interface_provider.h"
#include "services/shell/public/cpp/interface_registry.h"
using base::android::AttachCurrentThread;
using base::android::ConvertJavaStringToUTF8;
using base::android::JavaParamRef;
using base::android::ScopedJavaGlobalRef;
namespace content {
// static
std::unique_ptr<InterfaceProviderAndroid> InterfaceProviderAndroid::Create(
shell::InterfaceProvider* remote_interfaces) {
return base::WrapUnique(new InterfaceProviderAndroidImpl(remote_interfaces));
}
// static
bool InterfaceProviderAndroidImpl::Register(JNIEnv* env) {
return RegisterNativesImpl(env);
}
InterfaceProviderAndroidImpl::~InterfaceProviderAndroidImpl() {
Java_InterfaceProvider_destroy(AttachCurrentThread(), obj_);
}
// Constructor and destructor call into Java.
InterfaceProviderAndroidImpl::InterfaceProviderAndroidImpl(
shell::InterfaceProvider* remote_interfaces)
: remote_interfaces_(remote_interfaces) {
JNIEnv* env = AttachCurrentThread();
obj_.Reset(
env,
Java_InterfaceProvider_create(
env, reinterpret_cast<intptr_t>(this)).obj());
}
const base::android::ScopedJavaGlobalRef<jobject>&
InterfaceProviderAndroidImpl::GetObj() {
return obj_;
}
// Methods called from Java.
void InterfaceProviderAndroidImpl::GetInterface(
JNIEnv* env,
const JavaParamRef<jobject>& j_interface_provider,
const JavaParamRef<jstring>& j_name,
jint j_handle) {
std::string name(ConvertJavaStringToUTF8(env, j_name));
mojo::ScopedMessagePipeHandle handle((mojo::MessagePipeHandle(j_handle)));
remote_interfaces_->GetInterface(name, std::move(handle));
}
} // namespace content