1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
// Copyright 2025 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/ui/android/extensions/extension_install_dialog_view_android.h"
#include <jni.h>
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "chrome/browser/extensions/extension_install_prompt.h"
#include "chrome/browser/extensions/extension_install_prompt_show_params.h"
#include "content/public/browser/web_contents.h"
#include "ui/android/view_android.h"
#include "ui/android/window_android.h"
#include "ui/gfx/android/java_bitmap.h"
// Must come after all headers that specialize FromJniType() / ToJniType().
#include "chrome/browser/ui/android/extensions/jni_headers/ExtensionInstallDialogBridge_jni.h"
using base::android::ConvertUTF16ToJavaString;
namespace {
void ShowExtensionInstallDialogAndroid(
std::unique_ptr<ExtensionInstallPromptShowParams> show_params,
ExtensionInstallPrompt::DoneCallback done_callback,
std::unique_ptr<ExtensionInstallPrompt::Prompt> prompt) {
content::WebContents* web_contents = show_params->GetParentWebContents();
if (!web_contents) {
return;
}
ui::ViewAndroid* view_android = web_contents->GetNativeView();
DCHECK(view_android);
ui::WindowAndroid* window_android = view_android->GetWindowAndroid();
if (!window_android) {
return;
}
auto* dialog_view = new extensions::ExtensionInstallDialogViewAndroid(
std::move(prompt), std::move(done_callback));
dialog_view->ShowDialog(window_android);
// `dialog_view` will delete itself when dialog is dismissed.
}
} // namespace
namespace extensions {
ExtensionInstallDialogViewAndroid::ExtensionInstallDialogViewAndroid(
std::unique_ptr<ExtensionInstallPrompt::Prompt> prompt,
ExtensionInstallPrompt::DoneCallback done_callback)
: prompt_(std::move(prompt)), done_callback_(std::move(done_callback)) {}
ExtensionInstallDialogViewAndroid::~ExtensionInstallDialogViewAndroid() {
if (!done_callback_) {
return;
}
prompt_->OnDialogCanceled();
std::move(done_callback_)
.Run(ExtensionInstallPrompt::DoneCallbackPayload(
ExtensionInstallPrompt::Result::USER_CANCELED));
}
void ExtensionInstallDialogViewAndroid::ShowDialog(
ui::WindowAndroid* window_android) {
JNIEnv* env = base::android::AttachCurrentThread();
base::android::ScopedJavaGlobalRef<jobject> java_object;
java_object.Reset(Java_ExtensionInstallDialogBridge_create(
env, reinterpret_cast<intptr_t>(this), window_android->GetJavaObject()));
Java_ExtensionInstallDialogBridge_showDialog(
env, java_object,
ConvertUTF16ToJavaString(env, prompt_->GetDialogTitle()),
gfx::ConvertToJavaBitmap(prompt_->icon().AsBitmap()),
ConvertUTF16ToJavaString(env, prompt_->GetAcceptButtonLabel()),
ConvertUTF16ToJavaString(env, prompt_->GetAbortButtonLabel()));
}
void ExtensionInstallDialogViewAndroid::OnDialogAccepted(JNIEnv* env) {
prompt_->OnDialogAccepted();
std::move(done_callback_)
.Run(ExtensionInstallPrompt::DoneCallbackPayload(
ExtensionInstallPrompt::Result::ACCEPTED,
/* justification= */ std::string()));
}
void ExtensionInstallDialogViewAndroid::OnDialogCanceled(JNIEnv* env) {
OnDialogDismissed(env);
}
void ExtensionInstallDialogViewAndroid::OnDialogDismissed(JNIEnv* env) {
prompt_->OnDialogCanceled();
std::move(done_callback_)
.Run(ExtensionInstallPrompt::DoneCallbackPayload(
ExtensionInstallPrompt::Result::USER_CANCELED));
}
void ExtensionInstallDialogViewAndroid::Destroy(JNIEnv* env) {
delete this;
}
} // namespace extensions
// static
ExtensionInstallPrompt::ShowDialogCallback
ExtensionInstallPrompt::GetDefaultShowDialogCallback() {
return base::BindRepeating(&ShowExtensionInstallDialogAndroid);
}
|