blob: 3756629df07971bcc13d941899c205256f48f4af [file]
// 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.
#ifndef CHROME_BROWSER_UI_ANDROID_EXTENSIONS_EXTENSIONS_TOOLBAR_ANDROID_H_
#define CHROME_BROWSER_UI_ANDROID_EXTENSIONS_EXTENSIONS_TOOLBAR_ANDROID_H_
#include "base/android/jni_android.h"
#include "base/android/scoped_java_ref.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/ui/android/extensions/extension_keybinding_registry_android.h"
#include "chrome/browser/ui/extensions/extensions_toolbar_view_model.h"
#include "third_party/jni_zero/jni_zero.h"
class BrowserWindowInterface;
namespace extensions {
// The JNI bridge for the extensions UI.
// This bridge is created and owned by Java UI code.
class ExtensionsToolbarAndroid : public ExtensionsToolbarViewModel::Delegate,
public ExtensionsToolbarViewModel::Observer {
public:
ExtensionsToolbarAndroid(BrowserWindowInterface* browser,
const base::android::JavaRef<jobject>& java_object);
ExtensionsToolbarAndroid(const ExtensionsToolbarAndroid&) = delete;
ExtensionsToolbarAndroid& operator=(const ExtensionsToolbarAndroid&) = delete;
~ExtensionsToolbarAndroid() override;
// Triggers the display of an extension popup in the Java UI.
void TriggerPopup(const ToolbarActionsModel::ActionId& action_id,
std::unique_ptr<ExtensionViewHost> host);
// Shows the context menu for the given action ID.
void ShowContextMenu(const ToolbarActionsModel::ActionId& action_id);
// Returns whether there is an active popup.
bool HasActivePopup();
// ExtensionsToolbarViewModel::Delegate:
std::unique_ptr<ExtensionActionViewModel> CreateActionViewModel(
const ToolbarActionsModel::ActionId& action_id,
ExtensionsContainer* extensions_container) override;
void HideActivePopup() override;
void CloseExtensionsMenuIfOpen() override;
bool CanShowToolbarActionPopupForAPICall(
const ToolbarActionsModel::ActionId& action_id) override;
void ToggleExtensionsMenu() override;
void ShowManageExtensionsIPH() override;
// ExtensionsToolbarViewModel::Observer:
void OnActionsInitialized() override;
void OnActionAdded(const ToolbarActionsModel::ActionId& action_id) override;
void OnActionRemoved(const ToolbarActionsModel::ActionId& action_id) override;
void OnActionUpdated(const ToolbarActionsModel::ActionId& action_id) override;
void OnPinnedActionsChanged() override;
void OnActiveWebContentsChanged(bool is_same_document,
content::WebContents* web_contents) override;
void OnToolbarControlStateUpdated() override;
void OnRequestAccessButtonParamsChanged(
content::WebContents* web_contents) override;
// JNI implementations.
void Destroy(JNIEnv* env);
base::android::ScopedJavaLocalRef<jobject> GetRequestAccessButtonParams(
JNIEnv* env,
content::WebContents* web_contents);
base::android::ScopedJavaLocalRef<jobject> GetAction(
JNIEnv* env,
const ToolbarActionsModel::ActionId& action_id,
content::WebContents* web_contents);
base::android::ScopedJavaLocalRef<jobject> GetIcon(
JNIEnv* env,
const ToolbarActionsModel::ActionId& action_id,
content::WebContents* web_contents,
int canvas_width_dp,
int canvas_height_dp,
float scale_factor);
std::vector<ToolbarActionsModel::ActionId> GetAllActionIds(JNIEnv* env);
std::vector<ToolbarActionsModel::ActionId> GetPinnedActionIds(JNIEnv* env);
base::android::ScopedJavaLocalRef<jobject> GetMenuButtonState(
JNIEnv* env,
content::WebContents* web_contents,
int canvas_width_dp,
int canvas_height_dp,
float scale_factor,
int color);
bool HandleKeyDownEvent(JNIEnv* env, const ui::KeyEventAndroid& key_event);
bool IsActionDraggable(JNIEnv* env,
const ToolbarActionsModel::ActionId& action_id);
void ExecuteUserAction(const ToolbarActionsModel::ActionId& action_id,
ToolbarActionViewModel::InvocationSource source);
void OnRequestAccessButtonClicked(JNIEnv* env,
content::WebContents* web_contents);
void MovePinnedAction(const ToolbarActionsModel::ActionId& action_id,
int target_index);
private:
void RegisterIconObserverForAction(
const ToolbarActionsModel::ActionId& action_id);
void OnActionIconUpdated(const ToolbarActionsModel::ActionId& action_id);
const raw_ptr<BrowserWindowInterface> browser_;
// The view model for this container.
std::unique_ptr<ExtensionsToolbarViewModel> toolbar_view_model_;
// Registers ExtensionsToolbarViewModel as the ExtensionsContainer for the
// browser window.
ui::ScopedUnownedUserData<ExtensionsContainer>
scoped_toolbar_view_model_user_data_;
// Map of action IDs to their respective `ExtensionActionViewModel` update
// subscriptions for icon updates.
std::map<ToolbarActionsModel::ActionId, base::CallbackListSubscription>
icon_subscriptions_;
// Observes and listens to changes to the view model.
base::ScopedObservation<ExtensionsToolbarViewModel,
ExtensionsToolbarViewModel::Observer>
toolbar_view_model_observation_{this};
// The registry for keybindings.
const std::unique_ptr<ExtensionKeybindingRegistryAndroid>
keybinding_registry_;
// Java counterpart that `this` is owned by.
const base::android::ScopedJavaGlobalRef<jobject> java_object_;
};
} // namespace extensions
#endif // CHROME_BROWSER_UI_ANDROID_EXTENSIONS_EXTENSIONS_TOOLBAR_ANDROID_H_