blob: 283626205a6351110d4c466f77d5a9ee5e2039f7 [file] [log] [blame]
// 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/glic/browser_ui/glic_button_controller.h"
#include "chrome/browser/glic/browser_ui/glic_button_controller_delegate.h"
#include "chrome/browser/glic/browser_ui/glic_vector_icon_manager.h"
#include "chrome/browser/glic/glic_pref_names.h"
#include "chrome/browser/glic/public/glic_enabling.h"
#include "chrome/browser/glic/public/glic_keyed_service.h"
#include "chrome/browser/glic/widget/glic_window_controller.h"
#include "chrome/browser/profiles/profile.h"
#include "components/feature_engagement/public/feature_list.h"
#include "components/prefs/pref_service.h"
#include "ui/views/widget/widget.h"
namespace glic {
GlicButtonController::GlicButtonController(
Profile* profile,
GlicButtonControllerDelegate* delegate,
GlicKeyedService* service)
: profile_(profile),
glic_controller_delegate_(delegate),
glic_keyed_service_(service) {
CHECK(glic_controller_delegate_);
CHECK(glic_keyed_service_);
// Initialize default values
PanelStateChanged(glic_keyed_service_->window_controller().GetPanelState(),
{});
// Observe for changes in preferences and panel state events
pref_registrar_.Init(profile_->GetPrefs());
pref_registrar_.Add(glic::prefs::kGlicPinnedToTabstrip,
base::BindRepeating(&GlicButtonController::OnPrefsChanged,
base::Unretained(this)));
subscriptions_.push_back(
glic_keyed_service_->enabling().RegisterAllowedChanged(
base::BindRepeating(&GlicButtonController::OnPrefsChanged,
base::Unretained(this))));
glic_keyed_service_->window_controller().AddStateObserver(this);
}
GlicButtonController::~GlicButtonController() {
glic_keyed_service_->window_controller().RemoveStateObserver(this);
}
void GlicButtonController::PanelStateChanged(
const mojom::PanelState& panel_state,
const GlicWindowController::PanelStateContext& context) {
if (GlicWindowController::AlwaysDetached()) {
UpdateShowState(true);
} else {
bool detached = panel_state.kind == mojom::PanelState_Kind::kDetached;
if (detached) {
glic_controller_delegate_->SetGlicIcon(
GlicVectorIconManager::GetVectorIcon(
IDR_GLIC_ATTACH_BUTTON_VECTOR_ICON));
} else {
glic_controller_delegate_->SetGlicIcon(
GlicVectorIconManager::GetVectorIcon(IDR_GLIC_BUTTON_VECTOR_ICON));
}
UpdateShowState(detached);
}
}
void GlicButtonController::OnPrefsChanged() {
UpdateShowState(
glic_keyed_service_->window_controller().GetPanelState().kind ==
mojom::PanelState_Kind::kDetached);
}
void GlicButtonController::UpdateShowState(bool detached) {
// If the glic window is detached, we want to show the re-attach icon
// regardless of glic enabling/pinned state.
if (detached && !GlicWindowController::AlwaysDetached()) {
glic_controller_delegate_->SetGlicShowState(true);
return;
}
const bool is_enabled_for_profile =
GlicEnabling::IsEnabledForProfile(profile_);
const bool is_pinned_to_tabstrip =
profile_->GetPrefs()->GetBoolean(prefs::kGlicPinnedToTabstrip);
if (is_enabled_for_profile && is_pinned_to_tabstrip) {
glic_keyed_service_->TryPreload();
glic_controller_delegate_->SetGlicShowState(true);
} else {
glic_controller_delegate_->SetGlicShowState(false);
}
}
} // namespace glic