blob: 3edd00d656c6565ce1bc14daf098adbd5efc18a4 [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 "base/android/jni_android.h"
#include "base/android/scoped_java_ref.h"
#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
#include "chrome/browser/ui/extensions/extensions_menu_view_model.h"
#include "chrome/browser/ui/views/extensions/extensions_menu_handler.h"
#include "third_party/skia/include/core/SkBitmap.h"
#ifndef CHROME_BROWSER_UI_ANDROID_EXTENSIONS_EXTENSIONS_MENU_DELEGATE_ANDROID_H_
#define CHROME_BROWSER_UI_ANDROID_EXTENSIONS_EXTENSIONS_MENU_DELEGATE_ANDROID_H_
namespace extensions {
// Implements Android-specific extensions menu UI logic. Acts as the JNI bridge
// for the extensions menu. This bridge is created and owned by Java UI code.
class ExtensionsMenuDelegateAndroid : public ExtensionsMenuViewModel::Delegate,
public ExtensionsMenuViewModel::Observer,
public ExtensionsMenuHandler {
public:
ExtensionsMenuDelegateAndroid(
BrowserWindowInterface* browser,
const base::android::JavaRef<jobject>& java_object);
ExtensionsMenuDelegateAndroid(const ExtensionsMenuDelegateAndroid&) = delete;
const ExtensionsMenuDelegateAndroid& operator=(
const ExtensionsMenuDelegateAndroid&) = delete;
~ExtensionsMenuDelegateAndroid() override;
// JNI implementations:
void Destroy(JNIEnv* env);
base::android::ScopedJavaLocalRef<jobject> GetActionIcon(JNIEnv* env,
int action_index);
base::android::ScopedJavaLocalRef<jobject> GetMenuEntry(JNIEnv* env,
int action_index);
std::vector<base::android::ScopedJavaLocalRef<jobject>> GetMenuEntries(
JNIEnv* env);
base::android::ScopedJavaLocalRef<jobject> GetSiteSettings(JNIEnv* env);
int GetOptionalSection(JNIEnv* env);
std::vector<base::android::ScopedJavaLocalRef<jobject>> GetHostAccessRequests(
JNIEnv* env);
bool IsReady(JNIEnv* env);
void OnReloadPageButtonClicked(JNIEnv* env);
void OnSiteSettingsToggleChanged(JNIEnv* env, bool is_checked);
// ExtensionsMenuViewModel::Delegate:
std::unique_ptr<ExtensionActionViewModel> CreateActionViewModel(
const extensions::ExtensionId& extension_id) override;
// ExtensionsMenuViewModel::Observer:
void OnPageNavigation() override;
void OnActionAdded(ExtensionActionViewModel* action_model,
int index) override;
void OnActionIconUpdated(const ToolbarActionsModel::ActionId& action_id,
int index) override;
void OnActionRemoved(const ToolbarActionsModel::ActionId& action_id,
int index) override;
void OnActionUpdated(const ToolbarActionsModel::ActionId& action_id,
int index) override;
void OnActionsInitialized() override;
void OnHostAccessRequestAdded(const extensions::ExtensionId& extension_id,
int index) override;
void OnHostAccessRequestUpdated(const extensions::ExtensionId& extension_id,
int index) override;
void OnHostAccessRequestsCleared() override;
void OnHostAccessRequestRemoved(const extensions::ExtensionId& extension_id,
int index) override;
void OnShowHostAccessRequestsInToolbarChanged(
const extensions::ExtensionId& extension_id,
bool can_show_requests) override;
void OnToolbarPinnedActionsChanged() override;
void OnUserPermissionsSettingsChanged() override;
// ExtensionsMenuHandler:
void CloseBubble() override;
void OnActionButtonClicked(
const extensions::ExtensionId& extension_id) override;
void OnAllowExtensionClicked(
const extensions::ExtensionId& extension_id) override;
void OnDismissExtensionClicked(
const extensions::ExtensionId& extension_id) override;
void OnExtensionToggleSelected(const extensions::ExtensionId& extension_id,
bool is_on) override;
void OnReloadPageButtonClicked() override;
void OnShowRequestsTogglePressed(const extensions::ExtensionId& extension_id,
bool is_on) override;
void OnSiteAccessSelected(
const extensions::ExtensionId& extension_id,
extensions::PermissionsManager::UserSiteAccess site_access) override;
void OnSiteSettingsToggleButtonPressed(bool is_on) override;
void OpenMainPage() override;
void OpenSitePermissionsPage(
const extensions::ExtensionId& extension_id) override;
private:
// Notifies the Java side that the menu is ready to be shown.
void OnReady();
const raw_ptr<BrowserWindowInterface> browser_;
// The platform-agnostic menu view model.
std::unique_ptr<ExtensionsMenuViewModel> menu_model_;
base::ScopedObservation<ExtensionsMenuViewModel,
ExtensionsMenuViewModel::Observer>
menu_model_observation_{this};
const base::android::ScopedJavaGlobalRef<jobject> java_object_;
};
} // namespace extensions
#endif // CHROME_BROWSER_UI_ANDROID_EXTENSIONS_EXTENSIONS_MENU_DELEGATE_ANDROID_H_