blob: f3ab94e9371e39e63be3203cb889fa4c10f36e83 [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_string.h"
#include "base/strings/string_util.h"
#include "chrome/browser/android/tab_android.h"
#include "chrome/browser/profiles/profile.h"
#include "third_party/jni_zero/default_conversions.h"
// Must come after headers that provide symbols used by @JniType.
#include "chrome/browser/actor/android/jni_headers/ActorTask_jni.h"
using base::android::ScopedJavaLocalRef;
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();
std::optional<std::string> glic_conversation_id;
if (task_->source_info().type == actor::TaskSourceInfo::Client::kGlic &&
task_->source_info().id.has_value() &&
!task_->source_info().id->empty() &&
base::IsStringUTF8(*task_->source_info().id)) {
glic_conversation_id = task_->source_info().id;
}
java_obj_.Reset(
env, Java_ActorTask_Constructor(
env, reinterpret_cast<int64_t>(this),
task_->id().GetUnsafeValue(), task_->title(),
task_->GetProfile()->GetJavaObject(), glic_conversation_id));
}
ActorTaskAndroid::~ActorTaskAndroid() {
JNIEnv* env = base::android::AttachCurrentThread();
Java_ActorTask_clearNativePtr(env, java_obj_);
}
ScopedJavaLocalRef<jobject> ActorTaskAndroid::GetJavaObject() {
return ScopedJavaLocalRef<jobject>(java_obj_);
}
std::string ActorTaskAndroid::GetCurrentActionName() {
return task_->step_progress();
}
int32_t ActorTaskAndroid::GetState() {
return static_cast<int>(task_->GetState());
}
bool ActorTaskAndroid::IsCompleted() {
return task_->IsCompleted();
}
bool ActorTaskAndroid::IsUnderActorControl() {
return task_->IsUnderActorControl();
}
void ActorTaskAndroid::Pause() {
task_->Pause(/*from_actor=*/false);
}
void ActorTaskAndroid::Resume() {
task_->Resume();
}
std::vector<int32_t> ActorTaskAndroid::GetTabs() {
auto tab_handles = task_->GetTabs();
std::vector<int32_t> tab_ids;
for (const auto& handle : tab_handles) {
if (auto* tab_android = TabAndroid::FromTabHandle(handle)) {
tab_ids.push_back(tab_android->GetAndroidId());
}
}
return tab_ids;
}
std::vector<int32_t> ActorTaskAndroid::GetLastActedTabs() {
auto tab_handles = task_->GetLastActedTabs();
std::vector<int32_t> tab_ids;
for (const auto& handle : tab_handles) {
if (auto* tab_android = TabAndroid::FromTabHandle(handle)) {
tab_ids.push_back(tab_android->GetAndroidId());
}
}
return tab_ids;
}
int32_t ActorTaskAndroid::GetLastActuatedTabId() {
auto handle = task_->GetLastActuatedTabHandle();
auto* tab_android = TabAndroid::FromTabHandle(handle);
return tab_android ? tab_android->GetAndroidId() : TabAndroid::kInvalidTabId;
}
bool ActorTaskAndroid::IsActingOnTab(int32_t tab_id) {
if (!task_->IsUnderActorControl()) {
return false;
}
for (const auto& handle : task_->GetTabs()) {
if (auto* tab_android = TabAndroid::FromTabHandle(handle)) {
if (tab_android->GetAndroidId() == tab_id) {
return true;
}
}
}
return false;
}
} // namespace actor
DEFINE_JNI(ActorTask)