Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1507)

Unified Diff: ash/system/chromeos/tray_display.cc

Issue 2395523002: chromeos: Refactor system tray "show settings" commands to use mojo (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/system/chromeos/tray_display.cc
diff --git a/ash/system/chromeos/tray_display.cc b/ash/system/chromeos/tray_display.cc
deleted file mode 100644
index dc5a11d3a078feb22d3e6879cfe29dad7df5e667..0000000000000000000000000000000000000000
--- a/ash/system/chromeos/tray_display.cc
+++ /dev/null
@@ -1,482 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/system/chromeos/tray_display.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "ash/common/metrics/user_metrics_action.h"
-#include "ash/common/system/chromeos/devicetype_utils.h"
-#include "ash/common/system/system_notifier.h"
-#include "ash/common/system/tray/actionable_view.h"
-#include "ash/common/system/tray/fixed_sized_image_view.h"
-#include "ash/common/system/tray/system_tray.h"
-#include "ash/common/system/tray/system_tray_delegate.h"
-#include "ash/common/system/tray/tray_constants.h"
-#include "ash/common/system/tray/tray_notification_view.h"
-#include "ash/common/wm_shell.h"
-#include "ash/display/display_manager.h"
-#include "ash/display/screen_orientation_controller_chromeos.h"
-#include "ash/shell.h"
-#include "base/bind.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "grit/ash_resources.h"
-#include "grit/ash_strings.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/display/display.h"
-#include "ui/message_center/message_center.h"
-#include "ui/message_center/notification.h"
-#include "ui/message_center/notification_delegate.h"
-#include "ui/views/controls/image_view.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/layout/box_layout.h"
-
-using message_center::Notification;
-
-namespace ash {
-namespace {
-
-DisplayManager* GetDisplayManager() {
- return Shell::GetInstance()->display_manager();
-}
-
-base::string16 GetDisplayName(int64_t display_id) {
- return base::UTF8ToUTF16(
- GetDisplayManager()->GetDisplayNameForId(display_id));
-}
-
-base::string16 GetDisplaySize(int64_t display_id) {
- DisplayManager* display_manager = GetDisplayManager();
-
- const display::Display* display =
- &display_manager->GetDisplayForId(display_id);
-
- // We don't show display size for mirrored display. Fallback
- // to empty string if this happens on release build.
- bool mirroring = display_manager->mirroring_display_id() == display_id;
- DCHECK(!mirroring);
- if (mirroring)
- return base::string16();
-
- DCHECK(display->is_valid());
- return base::UTF8ToUTF16(display->size().ToString());
-}
-
-// Returns 1-line information for the specified display, like
-// "InternalDisplay: 1280x750"
-base::string16 GetDisplayInfoLine(int64_t display_id) {
- const display::ManagedDisplayInfo& display_info =
- GetDisplayManager()->GetDisplayInfo(display_id);
- if (GetDisplayManager()->mirroring_display_id() == display_id)
- return GetDisplayName(display_id);
-
- base::string16 size_text = GetDisplaySize(display_id);
- base::string16 display_data;
- if (display_info.has_overscan()) {
- display_data = l10n_util::GetStringFUTF16(
- IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION, size_text,
- l10n_util::GetStringUTF16(
- IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION_OVERSCAN));
- } else {
- display_data = size_text;
- }
-
- return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_SINGLE_DISPLAY,
- GetDisplayName(display_id), display_data);
-}
-
-base::string16 GetAllDisplayInfo() {
- DisplayManager* display_manager = GetDisplayManager();
- std::vector<base::string16> lines;
- int64_t internal_id = display::Display::kInvalidDisplayID;
- // Make sure to show the internal display first.
- if (!display_manager->IsInUnifiedMode() &&
- display::Display::IsInternalDisplayId(
- display_manager->first_display_id())) {
- internal_id = display_manager->first_display_id();
- lines.push_back(GetDisplayInfoLine(internal_id));
- }
-
- for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
- int64_t id = display_manager->GetDisplayAt(i).id();
- if (id == internal_id)
- continue;
- lines.push_back(GetDisplayInfoLine(id));
- }
-
- return base::JoinString(lines, base::ASCIIToUTF16("\n"));
-}
-
-// Attempts to open the display settings, returns true if successful.
-bool OpenSettings() {
- // switch is intentionally introduced without default, to cause an error when
- // a new type of login status is introduced.
- switch (WmShell::Get()->system_tray_delegate()->GetUserLoginStatus()) {
- case LoginStatus::NOT_LOGGED_IN:
- case LoginStatus::LOCKED:
- return false;
-
- case LoginStatus::USER:
- case LoginStatus::OWNER:
- case LoginStatus::GUEST:
- case LoginStatus::PUBLIC:
- case LoginStatus::SUPERVISED:
- case LoginStatus::KIOSK_APP:
- SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
- if (delegate->ShouldShowSettings()) {
- delegate->ShowDisplaySettings();
- return true;
- }
- }
-
- return false;
-}
-
-// Callback to handle a user selecting the notification view.
-void OpenSettingsFromNotification() {
- WmShell::Get()->RecordUserMetricsAction(
- UMA_STATUS_AREA_DISPLAY_NOTIFICATION_SELECTED);
- if (OpenSettings()) {
- WmShell::Get()->RecordUserMetricsAction(
- UMA_STATUS_AREA_DISPLAY_NOTIFICATION_SHOW_SETTINGS);
- }
-}
-
-} // namespace
-
-const char TrayDisplay::kNotificationId[] = "chrome://settings/display";
-
-class DisplayView : public ActionableView {
- public:
- explicit DisplayView() {
- SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
- kTrayPopupPaddingHorizontal, 0,
- kTrayPopupPaddingBetweenItems));
-
- ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
- image_ =
- new FixedSizedImageView(0, GetTrayConstant(TRAY_POPUP_ITEM_HEIGHT));
- image_->SetImage(
- bundle.GetImageNamed(IDR_AURA_UBER_TRAY_DISPLAY).ToImageSkia());
- AddChildView(image_);
-
- label_ = new views::Label();
- label_->SetMultiLine(true);
- label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- AddChildView(label_);
- Update();
- }
-
- ~DisplayView() override {}
-
- void Update() {
- base::string16 message = GetTrayDisplayMessage(NULL);
- if (message.empty() && ShouldShowFirstDisplayInfo())
- message = GetDisplayInfoLine(GetDisplayManager()->first_display_id());
- SetVisible(!message.empty());
- label_->SetText(message);
- SetAccessibleName(message);
- Layout();
- }
-
- const views::Label* label() const { return label_; }
-
- // Overridden from views::View.
- bool GetTooltipText(const gfx::Point& p,
- base::string16* tooltip) const override {
- base::string16 tray_message = GetTrayDisplayMessage(NULL);
- base::string16 display_message = GetAllDisplayInfo();
- if (tray_message.empty() && display_message.empty())
- return false;
-
- *tooltip = tray_message + base::ASCIIToUTF16("\n") + display_message;
- return true;
- }
-
- // Returns the name of the currently connected external display.
- // This should not be used when the external display is used for
- // mirroring.
- static base::string16 GetExternalDisplayName() {
- DisplayManager* display_manager = GetDisplayManager();
- DCHECK(!display_manager->IsInMirrorMode());
-
- int64_t external_id = display::Display::kInvalidDisplayID;
- for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
- int64_t id = display_manager->GetDisplayAt(i).id();
- if (!display::Display::IsInternalDisplayId(id)) {
- external_id = id;
- break;
- }
- }
-
- if (external_id == display::Display::kInvalidDisplayID) {
- return l10n_util::GetStringUTF16(
- IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME);
- }
-
- // The external display name may have an annotation of "(width x height)" in
- // case that the display is rotated or its resolution is changed.
- base::string16 name = GetDisplayName(external_id);
- const display::ManagedDisplayInfo& display_info =
- display_manager->GetDisplayInfo(external_id);
- if (display_info.GetActiveRotation() != display::Display::ROTATE_0 ||
- display_info.configured_ui_scale() != 1.0f ||
- !display_info.overscan_insets_in_dip().IsEmpty()) {
- name =
- l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME,
- name, GetDisplaySize(external_id));
- } else if (display_info.overscan_insets_in_dip().IsEmpty() &&
- display_info.has_overscan()) {
- name = l10n_util::GetStringFUTF16(
- IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATED_NAME, name,
- l10n_util::GetStringUTF16(
- IDS_ASH_STATUS_TRAY_DISPLAY_ANNOTATION_OVERSCAN));
- }
-
- return name;
- }
-
- static base::string16 GetTrayDisplayMessage(
- base::string16* additional_message_out) {
- DisplayManager* display_manager = GetDisplayManager();
- if (display_manager->GetNumDisplays() > 1) {
- if (display::Display::HasInternalDisplay()) {
- return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED,
- GetExternalDisplayName());
- }
- return l10n_util::GetStringUTF16(
- IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL);
- }
-
- if (display_manager->IsInMirrorMode()) {
- if (display::Display::HasInternalDisplay()) {
- return l10n_util::GetStringFUTF16(
- IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING,
- GetDisplayName(display_manager->mirroring_display_id()));
- }
- return l10n_util::GetStringUTF16(
- IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING_NO_INTERNAL);
- }
-
- if (display_manager->IsInUnifiedMode())
- return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_UNIFIED);
-
- int64_t primary_id = display::Screen::GetScreen()->GetPrimaryDisplay().id();
- if (display::Display::HasInternalDisplay() &&
- !(display::Display::IsInternalDisplayId(primary_id))) {
- if (additional_message_out) {
- *additional_message_out = ash::SubstituteChromeOSDeviceType(
- IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED_DESCRIPTION);
- }
- return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_DOCKED);
- }
-
- return base::string16();
- }
-
- private:
- bool ShouldShowFirstDisplayInfo() const {
- const int64_t first_display_id = GetDisplayManager()->first_display_id();
-
- const display::ManagedDisplayInfo& display_info =
- GetDisplayManager()->GetDisplayInfo(first_display_id);
- return (display_info.GetActiveRotation() != display::Display::ROTATE_0 &&
- (display_info.active_rotation_source() !=
- display::Display::ROTATION_SOURCE_ACCELEROMETER ||
- !display::Display::IsInternalDisplayId(first_display_id))) ||
- display_info.configured_ui_scale() != 1.0f ||
- !display_info.overscan_insets_in_dip().IsEmpty() ||
- display_info.has_overscan();
- }
-
- // Overridden from ActionableView.
- bool PerformAction(const ui::Event& event) override {
- WmShell::Get()->RecordUserMetricsAction(
- UMA_STATUS_AREA_DISPLAY_DEFAULT_SELECTED);
- if (OpenSettings()) {
- WmShell::Get()->RecordUserMetricsAction(
- UMA_STATUS_AREA_DISPLAY_DEFAULT_SHOW_SETTINGS);
- }
- return true;
- }
-
- void OnBoundsChanged(const gfx::Rect& previous_bounds) override {
- int label_max_width = bounds().width() - kTrayPopupPaddingHorizontal * 2 -
- kTrayPopupPaddingBetweenItems -
- image_->GetPreferredSize().width();
- label_->SizeToFit(label_max_width);
- }
-
- views::ImageView* image_;
- views::Label* label_;
-
- DISALLOW_COPY_AND_ASSIGN(DisplayView);
-};
-
-TrayDisplay::TrayDisplay(SystemTray* system_tray)
- : SystemTrayItem(system_tray, UMA_DISPLAY), default_(nullptr) {
- WmShell::Get()->AddDisplayObserver(this);
- UpdateDisplayInfo(NULL);
-}
-
-TrayDisplay::~TrayDisplay() {
- WmShell::Get()->RemoveDisplayObserver(this);
-}
-
-void TrayDisplay::UpdateDisplayInfo(TrayDisplay::DisplayInfoMap* old_info) {
- if (old_info)
- old_info->swap(display_info_);
- display_info_.clear();
-
- DisplayManager* display_manager = GetDisplayManager();
- for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
- int64_t id = display_manager->GetDisplayAt(i).id();
- display_info_[id] = display_manager->GetDisplayInfo(id);
- }
-}
-
-bool TrayDisplay::GetDisplayMessageForNotification(
- const TrayDisplay::DisplayInfoMap& old_info,
- base::string16* message_out,
- base::string16* additional_message_out) {
- // Display is added or removed. Use the same message as the one in
- // the system tray.
- if (display_info_.size() != old_info.size()) {
- *message_out = DisplayView::GetTrayDisplayMessage(additional_message_out);
- return true;
- }
-
- for (DisplayInfoMap::const_iterator iter = display_info_.begin();
- iter != display_info_.end(); ++iter) {
- DisplayInfoMap::const_iterator old_iter = old_info.find(iter->first);
- // The display's number is same but different displays. This happens
- // for the transition between docked mode and mirrored display. Falls back
- // to GetTrayDisplayMessage().
- if (old_iter == old_info.end()) {
- *message_out = DisplayView::GetTrayDisplayMessage(additional_message_out);
- return true;
- }
-
- if (iter->second.configured_ui_scale() !=
- old_iter->second.configured_ui_scale()) {
- *additional_message_out = l10n_util::GetStringFUTF16(
- IDS_ASH_STATUS_TRAY_DISPLAY_RESOLUTION_CHANGED,
- GetDisplayName(iter->first), GetDisplaySize(iter->first));
- return true;
- }
- if (iter->second.GetActiveRotation() !=
- old_iter->second.GetActiveRotation()) {
- int rotation_text_id = 0;
- switch (iter->second.GetActiveRotation()) {
- case display::Display::ROTATE_0:
- rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_STANDARD_ORIENTATION;
- break;
- case display::Display::ROTATE_90:
- rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_90;
- break;
- case display::Display::ROTATE_180:
- rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_180;
- break;
- case display::Display::ROTATE_270:
- rotation_text_id = IDS_ASH_STATUS_TRAY_DISPLAY_ORIENTATION_270;
- break;
- }
- *additional_message_out = l10n_util::GetStringFUTF16(
- IDS_ASH_STATUS_TRAY_DISPLAY_ROTATED, GetDisplayName(iter->first),
- l10n_util::GetStringUTF16(rotation_text_id));
- return true;
- }
- }
-
- // Found nothing special
- return false;
-}
-
-void TrayDisplay::CreateOrUpdateNotification(
- const base::string16& message,
- const base::string16& additional_message) {
- // Always remove the notification to make sure the notification appears
- // as a popup in any situation.
- message_center::MessageCenter::Get()->RemoveNotification(kNotificationId,
- false /* by_user */);
-
- if (message.empty() && additional_message.empty())
- return;
-
- // Don't display notifications for accelerometer triggered screen rotations.
- // See http://crbug.com/364949
- if (Shell::GetInstance()
- ->screen_orientation_controller()
- ->ignore_display_configuration_updates()) {
- return;
- }
-
- ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
- std::unique_ptr<Notification> notification(new Notification(
- message_center::NOTIFICATION_TYPE_SIMPLE, kNotificationId, message,
- additional_message, bundle.GetImageNamed(IDR_AURA_NOTIFICATION_DISPLAY),
- base::string16(), // display_source
- GURL(),
- message_center::NotifierId(message_center::NotifierId::SYSTEM_COMPONENT,
- system_notifier::kNotifierDisplay),
- message_center::RichNotificationData(),
- new message_center::HandleNotificationClickedDelegate(
- base::Bind(&OpenSettingsFromNotification))));
-
- WmShell::Get()->RecordUserMetricsAction(
- UMA_STATUS_AREA_DISPLAY_NOTIFICATION_CREATED);
- message_center::MessageCenter::Get()->AddNotification(
- std::move(notification));
-}
-
-views::View* TrayDisplay::CreateDefaultView(LoginStatus status) {
- DCHECK(default_ == NULL);
- default_ = new DisplayView();
- return default_;
-}
-
-void TrayDisplay::DestroyDefaultView() {
- default_ = NULL;
-}
-
-void TrayDisplay::OnDisplayConfigurationChanged() {
- DisplayInfoMap old_info;
- UpdateDisplayInfo(&old_info);
-
- if (default_)
- default_->Update();
-
- if (!WmShell::Get()
- ->system_tray_delegate()
- ->ShouldShowDisplayNotification()) {
- return;
- }
-
- base::string16 message;
- base::string16 additional_message;
- if (GetDisplayMessageForNotification(old_info, &message, &additional_message))
- CreateOrUpdateNotification(message, additional_message);
-}
-
-base::string16 TrayDisplay::GetDefaultViewMessage() const {
- if (!default_ || !default_->visible())
- return base::string16();
-
- return static_cast<DisplayView*>(default_)->label()->text();
-}
-
-bool TrayDisplay::GetAccessibleStateForTesting(ui::AXViewState* state) {
- views::View* view = default_;
- if (view) {
- view->GetAccessibleState(state);
- return true;
- }
- return false;
-}
-
-} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698