// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/browser/android/drop_data_android.h"

#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "base/files/file_path.h"
#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
#include "url/android/gurl_android.h"
#include "url/gurl.h"

// Must come after all headers that specialize FromJniType() / ToJniType().
#include "ui/android/ui_android_jni_headers/DropDataAndroid_jni.h"

using base::android::AttachCurrentThread;
using base::android::ConvertUTF16ToJavaString;
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
using base::android::ToJavaByteArray;

namespace content {

// This function refers to //content/browser/renderer_host/data_transfer_util.cc
// on how data fields are populated. If data_transfer_util.cc ever changed, this
// function will need updates to keep in sync.
ScopedJavaLocalRef<jobject> ToJavaDropData(const DropData& drop_data) {
  JNIEnv* env = AttachCurrentThread();
  ScopedJavaLocalRef<jstring> jtext;
  if (drop_data.text) {
    jtext = ConvertUTF16ToJavaString(env, *drop_data.text);
  }

  ScopedJavaLocalRef<jobject> jgurl;
  if (!drop_data.url_infos.empty()) {
    const ui::ClipboardUrlInfo& url_info = drop_data.url_infos.front();
    jgurl = url::GURLAndroid::FromNativeGURL(env, url_info.url);
    jtext = ConvertUTF16ToJavaString(env, url_info.title);
  }

  // If file_contents is not empty, user is trying to drag image out of the
  // web contents. If the image contains a link, the link URL, represented by
  // |jgurl|, will be ignored.
  // drop_data.file_contents_source_url represents the image source URL.
  ScopedJavaLocalRef<jbyteArray> jimage_bytes;
  ScopedJavaLocalRef<jstring> jimage_extension;
  ScopedJavaLocalRef<jstring> jimage_filename;
  if (!drop_data.file_contents.empty()) {
    jimage_bytes = ToJavaByteArray(env, drop_data.file_contents);
    jimage_extension = ConvertUTF8ToJavaString(
        env, drop_data.file_contents_filename_extension);
    std::optional<base::FilePath> filename =
        drop_data.GetSafeFilenameForImageFileContents();
    if (filename) {
      jimage_filename =
          ConvertUTF16ToJavaString(env, filename->LossyDisplayName());
    } else {
      // Use the current timestamp as the image file name in case the file name
      // is not retrieved from the source.
      jimage_filename = ConvertUTF8ToJavaString(
          env, base::NumberToString(
                   base::Time::Now().since_origin().InMilliseconds()) +
                   "." + drop_data.file_contents_filename_extension);
    }
  }

  return ui::Java_DropDataAndroid_create(env, jtext, jgurl, jimage_bytes,
                                         jimage_extension, jimage_filename);
}  // ToJavaDropData

}  // namespace content
