blob: ee3d367f4930b0f00f7e3c28b6cf4499ac1badf2 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/actor/android/actor_task_android.h"
#include <vector>
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "chrome/browser/actor/android/jni_headers/ActorTask_jni.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/profiles/profile.h"
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaRef;
using base::android::ScopedJavaLocalRef;
using base::android::ToJavaIntArray;
namespace actor {
namespace {
const char kActorTaskBridgeKey[] = "actor_task_bridge";
} // namespace
// static
ActorTaskAndroid* ActorTaskAndroid::GetForTask(ActorTask* task) {
if (!task) {
return nullptr;
}
ActorTaskAndroid* bridge =
static_cast<ActorTaskAndroid*>(task->GetUserData(kActorTaskBridgeKey));
if (!bridge) {
task->SetUserData(kActorTaskBridgeKey,
std::make_unique<ActorTaskAndroid>(task));
bridge =
static_cast<ActorTaskAndroid*>(task->GetUserData(kActorTaskBridgeKey));
}
return bridge;
}
ActorTaskAndroid::ActorTaskAndroid(ActorTask* task) : task_(task) {
JNIEnv* env = base::android::AttachCurrentThread();
java_obj_.Reset(env, Java_ActorTask_Constructor(
env, reinterpret_cast<int64_t>(this),
task_->id().GetUnsafeValue(),
ConvertUTF8ToJavaString(env, task_->title()),
task_->GetProfile()->GetJavaObject()));
}
ActorTaskAndroid::~ActorTaskAndroid() {
JNIEnv* env = base::android::AttachCurrentThread();
Java_ActorTask_clearNativePtr(env, java_obj_);
}
ScopedJavaLocalRef<jobject> ActorTaskAndroid::GetJavaObject() {
return ScopedJavaLocalRef<jobject>(java_obj_);
}
ScopedJavaLocalRef<jstring> ActorTaskAndroid::GetCurrentActionName(
JNIEnv* env) {
return ConvertUTF8ToJavaString(env, "");
}
int32_t ActorTaskAndroid::GetState(JNIEnv* env) {
return static_cast<int>(task_->GetState());
}
bool ActorTaskAndroid::IsCompleted(JNIEnv* env) {
return task_->IsCompleted();
}
bool ActorTaskAndroid::IsUnderActorControl(JNIEnv* env) {
return task_->IsUnderActorControl();
}
void ActorTaskAndroid::Pause(JNIEnv* env) {
task_->Pause(/*from_actor=*/false);
}
void ActorTaskAndroid::Resume(JNIEnv* env) {
task_->Resume();
}
ScopedJavaLocalRef<jintArray> ActorTaskAndroid::GetTabs(JNIEnv* env) {
auto tab_handles = task_->GetTabs();
std::vector<int> tab_ids;
for (const auto& handle : tab_handles) {
if (auto* tab_android = TabAndroid::FromTabHandle(handle)) {
tab_ids.push_back(tab_android->GetAndroidId());
}
}
return ToJavaIntArray(env, tab_ids);
}
ScopedJavaLocalRef<jintArray> ActorTaskAndroid::GetLastActedTabs(JNIEnv* env) {
auto tab_handles = task_->GetLastActedTabs();
std::vector<int> tab_ids;
for (const auto& handle : tab_handles) {
if (auto* tab_android = TabAndroid::FromTabHandle(handle)) {
tab_ids.push_back(tab_android->GetAndroidId());
}
}
return ToJavaIntArray(env, tab_ids);
}
} // namespace actor
DEFINE_JNI(ActorTask)