| 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
|
|
|