[VCN][M2] Upstream enrollment dialog

This CL creates a parallel flow for upstream enrollment in which the enrollment info is shown in a dialog instead of an infobar.

The dialog is reused from crrev.com/c/3455322.
This CL follows the new recommended way to implement view/controller JNI interfaces documented here (https://docs.google.com/document/d/1J19BNafBk90mSzQnAjykguROCDK8ZzYiUVi3Uwj_5jg/edit?resourcekey=0-QT0PzlbhCbjNFoAaSe4_qg#heading=h.subvi3olnqaf).
Screen record of the upstream flow: https://drive.google.com/file/d/1oUNacjoNAZOPhX890zEsu5nBUILU5Sao/view?usp=sharing&resourcekey=0-qzoH3eu2-jJoUZvxpBGyQA

Bug: 1281695, 1306021

Change-Id: Ifb860cf891725986dece9c5865773d20b9474f03
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3610789
Reviewed-by: Siyu An <[email protected]>
Reviewed-by: Elizabeth Popova <[email protected]>
Reviewed-by: David Trainor <[email protected]>
Reviewed-by: Evan Stade <[email protected]>
Commit-Queue: Vishwas Uppoor <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1000581}
diff --git a/chrome/browser/ui/android/autofill/virtual_card_utils.cc b/chrome/browser/ui/android/autofill/virtual_card_utils.cc
new file mode 100644
index 0000000..7f1b795f
--- /dev/null
+++ b/chrome/browser/ui/android/autofill/virtual_card_utils.cc
@@ -0,0 +1,59 @@
+// Copyright 2022 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 "chrome/browser/ui/android/autofill/virtual_card_utils.h"
+
+#include "base/android/jni_string.h"
+#include "chrome/android/chrome_jni_headers/VirtualCardEnrollmentFields_jni.h"
+#include "ui/gfx/android/java_bitmap.h"
+#include "ui/gfx/image/image.h"
+#include "ui/gfx/image/image_skia.h"
+
+using base::android::AttachCurrentThread;
+using base::android::ConvertUTF16ToJavaString;
+using base::android::ConvertUTF8ToJavaString;
+using base::android::ScopedJavaLocalRef;
+
+namespace autofill {
+
+ScopedJavaLocalRef<jobject> CreateVirtualCardEnrollmentFieldsJavaObject(
+    autofill::VirtualCardEnrollmentFields* virtual_card_enrollment_fields) {
+  JNIEnv* env = AttachCurrentThread();
+  // Create VirtualCardEnrollmentFields java object.
+  ScopedJavaLocalRef<jobject> java_object =
+      Java_VirtualCardEnrollmentFields_create(
+          env,
+          ConvertUTF16ToJavaString(
+              env, virtual_card_enrollment_fields->credit_card
+                       .CardIdentifierStringForAutofillDisplay()),
+          gfx::ConvertToJavaBitmap(
+              *virtual_card_enrollment_fields->card_art_image->bitmap()));
+  // Add Google legal messages.
+  for (const auto& legal_message_line :
+       virtual_card_enrollment_fields->google_legal_message) {
+    Java_VirtualCardEnrollmentFields_addGoogleLegalMessageLine(
+        env, java_object,
+        ConvertUTF16ToJavaString(env, legal_message_line.text()));
+    for (const auto& link : legal_message_line.links()) {
+      Java_VirtualCardEnrollmentFields_addLinkToLastGoogleLegalMessageLine(
+          env, java_object, link.range.start(), link.range.end(),
+          ConvertUTF8ToJavaString(env, link.url.spec()));
+    }
+  }
+  // Add issuer legal messages.
+  for (const auto& legal_message_line :
+       virtual_card_enrollment_fields->issuer_legal_message) {
+    Java_VirtualCardEnrollmentFields_addIssuerLegalMessageLine(
+        env, java_object,
+        ConvertUTF16ToJavaString(env, legal_message_line.text()));
+    for (const auto& link : legal_message_line.links()) {
+      Java_VirtualCardEnrollmentFields_addLinkToLastIssuerLegalMessageLine(
+          env, java_object, link.range.start(), link.range.end(),
+          ConvertUTF8ToJavaString(env, link.url.spec()));
+    }
+  }
+  return java_object;
+}
+
+}  // namespace autofill