blob: 6ee6ea83a7481854aa693c8a686d31e8608b4d8d [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/collaboration/internal/android/messaging/conversion_utils.h"
#include <optional>
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "base/uuid.h"
#include "components/collaboration/public/messaging/activity_log.h"
#include "components/collaboration/public/messaging/message.h"
#include "components/data_sharing/public/android/conversion_utils.h"
#include "components/saved_tab_groups/public/android/tab_group_sync_conversions_bridge.h"
#include "components/saved_tab_groups/public/android/tab_group_sync_conversions_utils.h"
// Must come after all headers that specialize FromJniType() / ToJniType().
#include "components/collaboration/internal/messaging_jni_headers/ConversionUtils_jni.h"
using base::android::ConvertUTF16ToJavaString;
using base::android::ConvertUTF8ToJavaString;
using base::android::ScopedJavaLocalRef;
namespace collaboration::messaging::android {
namespace {
ScopedJavaLocalRef<jstring> JavaStringOrNullFromOptionalString(
JNIEnv* env,
std::optional<std::string> str) {
if (!str.has_value()) {
return ScopedJavaLocalRef<jstring>();
}
return ConvertUTF8ToJavaString(env, (*str));
}
ScopedJavaLocalRef<jstring> OptionalUuidToLowercaseJavaString(
JNIEnv* env,
std::optional<base::Uuid> uuid) {
if (!uuid.has_value()) {
return ScopedJavaLocalRef<jstring>();
}
return ConvertUTF8ToJavaString(env, (*uuid).AsLowercaseString());
}
// Helper method to provide a consistent way to create a MessageAttribution
// across multiple entry points.
ScopedJavaLocalRef<jobject> MessageAttributionToJava(
JNIEnv* env,
const MessageAttribution& attribution) {
ScopedJavaLocalRef<jstring> j_collaboration_id =
ConvertUTF8ToJavaString(env, attribution.collaboration_id.value());
ScopedJavaLocalRef<jobject> j_local_tab_group_id = nullptr;
ScopedJavaLocalRef<jstring> j_sync_tab_group_id = nullptr;
ScopedJavaLocalRef<jstring> j_last_known_tab_group_title = nullptr;
ScopedJavaLocalRef<jstring> j_id =
OptionalUuidToLowercaseJavaString(env, attribution.id);
int32_t j_last_known_tab_group_color = -1;
if (attribution.tab_group_metadata.has_value()) {
j_local_tab_group_id =
tab_groups::TabGroupSyncConversionsBridge::ToJavaTabGroupId(
env, attribution.tab_group_metadata->local_tab_group_id);
j_sync_tab_group_id = OptionalUuidToLowercaseJavaString(
env, attribution.tab_group_metadata->sync_tab_group_id);
j_last_known_tab_group_title = JavaStringOrNullFromOptionalString(
env, attribution.tab_group_metadata->last_known_title);
if (attribution.tab_group_metadata->last_known_color.has_value()) {
j_last_known_tab_group_color = static_cast<int32_t>(
*attribution.tab_group_metadata->last_known_color);
}
}
int32_t j_local_tab_id = -1;
ScopedJavaLocalRef<jstring> j_sync_tab_id = nullptr;
ScopedJavaLocalRef<jstring> j_last_known_tab_url = nullptr;
ScopedJavaLocalRef<jstring> j_last_known_tab_title = nullptr;
ScopedJavaLocalRef<jstring> j_previous_tab_url = nullptr;
if (attribution.tab_metadata.has_value()) {
j_local_tab_id =
tab_groups::ToJavaTabId((*attribution.tab_metadata).local_tab_id);
j_sync_tab_id = OptionalUuidToLowercaseJavaString(
env, attribution.tab_metadata->sync_tab_id);
j_last_known_tab_url = JavaStringOrNullFromOptionalString(
env, attribution.tab_metadata->last_known_url);
j_last_known_tab_title = JavaStringOrNullFromOptionalString(
env, attribution.tab_metadata->last_known_title);
j_previous_tab_url = JavaStringOrNullFromOptionalString(
env, attribution.tab_metadata->previous_url);
}
ScopedJavaLocalRef<jobject> j_affected_user = nullptr;
if (attribution.affected_user.has_value()) {
j_affected_user = data_sharing::conversion::CreateJavaGroupMember(
env, attribution.affected_user.value());
}
ScopedJavaLocalRef<jobject> j_triggering_user = nullptr;
if (attribution.triggering_user.has_value()) {
j_triggering_user = data_sharing::conversion::CreateJavaGroupMember(
env, attribution.triggering_user.value());
}
return Java_ConversionUtils_createAttributionFrom(
env, j_id, j_collaboration_id, j_local_tab_group_id, j_sync_tab_group_id,
j_last_known_tab_group_title, j_last_known_tab_group_color,
j_local_tab_id, j_sync_tab_id, j_last_known_tab_title,
j_last_known_tab_url, j_previous_tab_url, j_affected_user,
attribution.affected_user_is_self, j_triggering_user,
attribution.triggering_user_is_self);
}
// Helper method to provide a consistent way to create a PersistentMessage
// across multiple entry points.
ScopedJavaLocalRef<jobject> CreatePersistentMessageAndMaybeAddToListHelper(
JNIEnv* env,
ScopedJavaLocalRef<jobject> jlist,
const PersistentMessage& message) {
ScopedJavaLocalRef<jobject> jmessage =
Java_ConversionUtils_createPersistentMessageAndMaybeAddToList(
env, jlist, MessageAttributionToJava(env, message.attribution),
static_cast<int>(message.collaboration_event),
static_cast<int>(message.type));
return jmessage;
}
ScopedJavaLocalRef<jobject> AttributionListToJava(
JNIEnv* env,
const std::vector<MessageAttribution>& attributions) {
ScopedJavaLocalRef<jobject> j_attribution_list;
for (const auto& attribution : attributions) {
auto j_attribution = MessageAttributionToJava(env, attribution);
j_attribution_list = Java_ConversionUtils_addAttributionToList(
env, j_attribution_list, j_attribution);
}
return j_attribution_list;
}
} // namespace
ScopedJavaLocalRef<jobject> PersistentMessageToJava(
JNIEnv* env,
const PersistentMessage& message) {
return CreatePersistentMessageAndMaybeAddToListHelper(env, nullptr, message);
}
ScopedJavaLocalRef<jobject> PersistentMessagesToJava(
JNIEnv* env,
const std::vector<PersistentMessage>& messages) {
ScopedJavaLocalRef<jobject> jlist =
Java_ConversionUtils_createPersistentMessageList(env);
for (const auto& message : messages) {
CreatePersistentMessageAndMaybeAddToListHelper(env, jlist, message);
}
return jlist;
}
ScopedJavaLocalRef<jobject> InstantMessageToJava(
JNIEnv* env,
const InstantMessage& message) {
ScopedJavaLocalRef<jobject> j_attribution_list =
AttributionListToJava(env, message.attributions);
return Java_ConversionUtils_createInstantMessage(
env, static_cast<int>(message.collaboration_event),
static_cast<int>(message.level), static_cast<int>(message.type),
ConvertUTF16ToJavaString(env, message.localized_message),
j_attribution_list);
}
ScopedJavaLocalRef<jobject> UuidSetToJavaStringSet(
JNIEnv* env,
const std::set<base::Uuid>& uuids) {
ScopedJavaLocalRef<jobject> j_string_set =
Java_ConversionUtils_createStringSet(env);
for (const auto& uuid : uuids) {
Java_ConversionUtils_addStringToStringSet(
env, j_string_set,
ConvertUTF8ToJavaString(env, uuid.AsLowercaseString()));
}
return j_string_set;
}
ScopedJavaLocalRef<jobject> ActivityLogItemsToJava(
JNIEnv* env,
const std::vector<ActivityLogItem>& activity_log_items) {
ScopedJavaLocalRef<jobject> jlist =
Java_ConversionUtils_createActivityLogItemList(env);
for (const auto& activity_log_item : activity_log_items) {
Java_ConversionUtils_createActivityLogItemAndMaybeAddToList(
env, jlist, static_cast<int>(activity_log_item.collaboration_event),
ConvertUTF16ToJavaString(env, activity_log_item.title_text),
ConvertUTF16ToJavaString(env, activity_log_item.description_text),
ConvertUTF16ToJavaString(env, activity_log_item.time_delta_text),
activity_log_item.show_favicon,
static_cast<int>(activity_log_item.action),
MessageAttributionToJava(env, activity_log_item.activity_metadata));
}
return jlist;
}
} // namespace collaboration::messaging::android
DEFINE_JNI(ConversionUtils)