chromium/ash/system/ime/ime_detailed_view.cc

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ash/system/ime/ime_detailed_view.h"

#include <memory>
#include <vector>

#include "ash/ime/ime_controller_impl.h"
#include "ash/public/cpp/system_tray_client.h"
#include "ash/resources/vector_icons/vector_icons.h"
#include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/style/ash_color_id.h"
#include "ash/system/model/system_tray_model.h"
#include "ash/system/tray/tray_detailed_view.h"
#include "ash/system/tray/tray_popup_utils.h"
#include "ash/system/tray/tray_utils.h"
#include "ash/system/tray/tri_view.h"
#include "base/functional/bind.h"
#include "base/metrics/user_metrics.h"
#include "chromeos/constants/chromeos_features.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/metadata/metadata_impl_macros.h"
#include "ui/base/models/image_model.h"
#include "ui/chromeos/styles/cros_tokens_color_mappings.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/views/controls/image_view.h"

namespace ash {

IMEDetailedView::IMEDetailedView(DetailedViewDelegate* delegate,
                                 ImeControllerImpl* ime_controller)
    : ImeListView(delegate), ime_controller_(ime_controller) {
  DCHECK(ime_controller_);
}

void IMEDetailedView::Update(const std::string& current_ime_id,
                             const std::vector<ImeInfo>& list,
                             const std::vector<ImeMenuItem>& property_list,
                             bool show_keyboard_toggle,
                             SingleImeBehavior single_ime_behavior) {
  ImeListView::Update(current_ime_id, list, property_list, show_keyboard_toggle,
                      single_ime_behavior);
  CreateTitleRow(IDS_ASH_STATUS_TRAY_IME);
}

void IMEDetailedView::ResetImeListView() {
  settings_button_ = nullptr;
  controlled_setting_icon_ = nullptr;
  ImeListView::ResetImeListView();
}

void IMEDetailedView::CreateExtraTitleRowButtons() {
  if (ime_controller_->managed_by_policy()) {
    controlled_setting_icon_ = TrayPopupUtils::CreateMainImageView(
        /*use_wide_layout=*/true);
    // Match the size of the settings button. This size matches IconButton
    // kSmall, but IconButton doesn't expose that value, so we inline it here.
    controlled_setting_icon_->SetPreferredSize(gfx::Size(32, 32));
    controlled_setting_icon_->SetImage(ui::ImageModel::FromVectorIcon(
        kSystemMenuBusinessIcon,
        static_cast<ui::ColorId>(cros_tokens::kCrosSysOnSurface)));
    controlled_setting_icon_->SetTooltipText(
        l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_IME_MANAGED));
    tri_view()->AddView(TriView::Container::END, controlled_setting_icon_);
  }

  tri_view()->SetContainerVisible(TriView::Container::END, true);
  settings_button_ =
      CreateSettingsButton(base::BindRepeating(&IMEDetailedView::ShowSettings,
                                               base::Unretained(this)),
                           IDS_ASH_STATUS_TRAY_IME_SETTINGS);
  tri_view()->AddView(TriView::Container::END, settings_button_);
}

void IMEDetailedView::ShowSettings() {
  base::RecordAction(base::UserMetricsAction("StatusArea_IME_Detailed"));
  CloseBubble();  // Deletes `this`.
  Shell::Get()->system_tray_model()->client()->ShowIMESettings();
}

BEGIN_METADATA(IMEDetailedView)
END_METADATA

}  // namespace ash