| Index: ash/system/chromeos/screen_layout_observer.cc
|
| diff --git a/ash/system/chromeos/screen_layout_observer.cc b/ash/system/chromeos/screen_layout_observer.cc
|
| deleted file mode 100644
|
| index 1110c769928c0c820973ab7daa99a805b91c97a5..0000000000000000000000000000000000000000
|
| --- a/ash/system/chromeos/screen_layout_observer.cc
|
| +++ /dev/null
|
| @@ -1,424 +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/screen_layout_observer.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/fixed_sized_image_view.h"
|
| -#include "ash/common/system/tray/system_tray_controller.h"
|
| -#include "ash/common/system/tray/system_tray_delegate.h"
|
| -#include "ash/common/system/tray/tray_constants.h"
|
| -#include "ash/common/wm_shell.h"
|
| -#include "ash/display/screen_orientation_controller_chromeos.h"
|
| -#include "ash/resources/grit/ash_resources.h"
|
| -#include "ash/shell.h"
|
| -#include "ash/strings/grit/ash_strings.h"
|
| -#include "base/bind.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -#include "ui/base/resource/resource_bundle.h"
|
| -#include "ui/display/display.h"
|
| -#include "ui/display/manager/display_manager.h"
|
| -#include "ui/display/types/display_constants.h"
|
| -#include "ui/message_center/message_center.h"
|
| -#include "ui/message_center/notification.h"
|
| -#include "ui/message_center/notification_delegate.h"
|
| -#include "ui/strings/grit/ui_strings.h"
|
| -
|
| -using message_center::Notification;
|
| -
|
| -namespace ash {
|
| -namespace {
|
| -
|
| -display::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) {
|
| - display::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());
|
| -}
|
| -
|
| -// 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:
|
| - case LoginStatus::ARC_KIOSK_APP:
|
| - SystemTrayDelegate* delegate = WmShell::Get()->system_tray_delegate();
|
| - if (delegate->ShouldShowSettings()) {
|
| - WmShell::Get()->system_tray_controller()->ShowDisplaySettings();
|
| - return true;
|
| - }
|
| - break;
|
| - }
|
| -
|
| - 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);
|
| - }
|
| -}
|
| -
|
| -// Returns the name of the currently connected external display whose ID is
|
| -// |external_display_id|. This should not be used when the external display is
|
| -// used for mirroring.
|
| -base::string16 GetExternalDisplayName(int64_t external_display_id) {
|
| - DCHECK(!display::Display::IsInternalDisplayId(external_display_id));
|
| -
|
| - display::DisplayManager* display_manager = GetDisplayManager();
|
| - DCHECK(!display_manager->IsInMirrorMode());
|
| -
|
| - if (external_display_id == display::kInvalidDisplayId)
|
| - return l10n_util::GetStringUTF16(IDS_DISPLAY_NAME_UNKNOWN);
|
| -
|
| - // 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_display_id);
|
| - const display::ManagedDisplayInfo& display_info =
|
| - display_manager->GetDisplayInfo(external_display_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_display_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;
|
| -}
|
| -
|
| -// Returns true if docked mode is currently enabled.
|
| -bool IsDockedModeEnabled() {
|
| - display::DisplayManager* display_manager = GetDisplayManager();
|
| - if (!display::Display::HasInternalDisplay())
|
| - return false;
|
| -
|
| - for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
|
| - if (display::Display::IsInternalDisplayId(
|
| - display_manager->GetDisplayAt(i).id())) {
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - // We have an internal display but it's not one of the active displays.
|
| - return true;
|
| -}
|
| -
|
| -// Returns the notification message that should be shown when mirror display
|
| -// mode is entered.
|
| -base::string16 GetEnterMirrorModeMessage() {
|
| - if (display::Display::HasInternalDisplay()) {
|
| - return l10n_util::GetStringFUTF16(
|
| - IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING,
|
| - GetDisplayName(GetDisplayManager()->mirroring_display_id()));
|
| - }
|
| -
|
| - return l10n_util::GetStringUTF16(
|
| - IDS_ASH_STATUS_TRAY_DISPLAY_MIRRORING_NO_INTERNAL);
|
| -}
|
| -
|
| -// Returns the notification message that should be shown when unified desktop
|
| -// mode is entered.
|
| -base::string16 GetEnterUnifiedModeMessage() {
|
| - return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_UNIFIED);
|
| -}
|
| -
|
| -// Returns the notification message that should be shown when unified desktop
|
| -// mode is exited.
|
| -base::string16 GetExitUnifiedModeMessage() {
|
| - return l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_UNIFIED_EXITING);
|
| -}
|
| -
|
| -base::string16 GetDisplayRemovedMessage(
|
| - const display::ManagedDisplayInfo& removed_display_info,
|
| - base::string16* out_additional_message) {
|
| - return l10n_util::GetStringFUTF16(
|
| - IDS_ASH_STATUS_TRAY_DISPLAY_REMOVED,
|
| - base::UTF8ToUTF16(removed_display_info.name()));
|
| -}
|
| -
|
| -base::string16 GetDisplayAddedMessage(int64_t added_display_id,
|
| - base::string16* additional_message_out) {
|
| - if (!display::Display::HasInternalDisplay()) {
|
| - return l10n_util::GetStringUTF16(
|
| - IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED_NO_INTERNAL);
|
| - }
|
| -
|
| - return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_EXTENDED,
|
| - GetExternalDisplayName(added_display_id));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -const char ScreenLayoutObserver::kNotificationId[] =
|
| - "chrome://settings/display";
|
| -
|
| -ScreenLayoutObserver::ScreenLayoutObserver() {
|
| - WmShell::Get()->AddDisplayObserver(this);
|
| - UpdateDisplayInfo(NULL);
|
| -}
|
| -
|
| -ScreenLayoutObserver::~ScreenLayoutObserver() {
|
| - WmShell::Get()->RemoveDisplayObserver(this);
|
| -}
|
| -
|
| -void ScreenLayoutObserver::UpdateDisplayInfo(
|
| - ScreenLayoutObserver::DisplayInfoMap* old_info) {
|
| - if (old_info)
|
| - old_info->swap(display_info_);
|
| - display_info_.clear();
|
| -
|
| - display::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 ScreenLayoutObserver::GetDisplayMessageForNotification(
|
| - const ScreenLayoutObserver::DisplayInfoMap& old_info,
|
| - base::string16* out_message,
|
| - base::string16* out_additional_message) {
|
| - if (old_display_mode_ != current_display_mode_) {
|
| - // Detect changes in the mirror mode status.
|
| - if (current_display_mode_ == DisplayMode::MIRRORING) {
|
| - *out_message = GetEnterMirrorModeMessage();
|
| - return true;
|
| - }
|
| - if (old_display_mode_ == DisplayMode::MIRRORING &&
|
| - GetExitMirrorModeMessage(out_message, out_additional_message)) {
|
| - return true;
|
| - }
|
| -
|
| - // Detect changes in the unified mode status.
|
| - if (current_display_mode_ == DisplayMode::UNIFIED) {
|
| - *out_message = GetEnterUnifiedModeMessage();
|
| - return true;
|
| - }
|
| - if (old_display_mode_ == DisplayMode::UNIFIED) {
|
| - *out_message = GetExitUnifiedModeMessage();
|
| - return true;
|
| - }
|
| -
|
| - if (current_display_mode_ == DisplayMode::DOCKED ||
|
| - old_display_mode_ == DisplayMode::DOCKED) {
|
| - // We no longer show any notification for docked mode events.
|
| - // crbug.com/674719.
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - // Displays are added or removed.
|
| - if (display_info_.size() < old_info.size()) {
|
| - // A display has been removed.
|
| - for (const auto& iter : old_info) {
|
| - if (display_info_.count(iter.first))
|
| - continue;
|
| -
|
| - *out_message =
|
| - GetDisplayRemovedMessage(iter.second, out_additional_message);
|
| - return true;
|
| - }
|
| - } else if (display_info_.size() > old_info.size()) {
|
| - // A display has been added.
|
| - for (const auto& iter : display_info_) {
|
| - if (old_info.count(iter.first))
|
| - continue;
|
| -
|
| - *out_message = GetDisplayAddedMessage(iter.first, out_additional_message);
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - for (const auto& iter : display_info_) {
|
| - DisplayInfoMap::const_iterator old_iter = old_info.find(iter.first);
|
| - if (old_iter == old_info.end()) {
|
| - // The display's number is same but different displays. This happens
|
| - // for the transition between docked mode and mirrored display.
|
| - // This condition can never be reached here, since it is handled above.
|
| - NOTREACHED() << "A display mode transition that should have been handled"
|
| - "earlier.";
|
| - return false;
|
| - }
|
| -
|
| - if (iter.second.configured_ui_scale() !=
|
| - old_iter->second.configured_ui_scale()) {
|
| - *out_additional_message = 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;
|
| - }
|
| - *out_additional_message = 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 ScreenLayoutObserver::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));
|
| -}
|
| -
|
| -void ScreenLayoutObserver::OnDisplayConfigurationChanged() {
|
| - DisplayInfoMap old_info;
|
| - UpdateDisplayInfo(&old_info);
|
| -
|
| - old_display_mode_ = current_display_mode_;
|
| - if (GetDisplayManager()->IsInMirrorMode())
|
| - current_display_mode_ = DisplayMode::MIRRORING;
|
| - else if (GetDisplayManager()->IsInUnifiedMode())
|
| - current_display_mode_ = DisplayMode::UNIFIED;
|
| - else if (IsDockedModeEnabled())
|
| - current_display_mode_ = DisplayMode::DOCKED;
|
| - else if (GetDisplayManager()->GetNumDisplays() > 2)
|
| - current_display_mode_ = DisplayMode::EXTENDED_3_PLUS;
|
| - else if (GetDisplayManager()->GetNumDisplays() == 2)
|
| - current_display_mode_ = DisplayMode::EXTENDED_2;
|
| - else
|
| - current_display_mode_ = DisplayMode::SINGLE;
|
| -
|
| - if (!show_notifications_for_testing)
|
| - return;
|
| -
|
| - base::string16 message;
|
| - base::string16 additional_message;
|
| - if (GetDisplayMessageForNotification(old_info, &message, &additional_message))
|
| - CreateOrUpdateNotification(message, additional_message);
|
| -}
|
| -
|
| -bool ScreenLayoutObserver::GetExitMirrorModeMessage(
|
| - base::string16* out_message,
|
| - base::string16* out_additional_message) {
|
| - switch (current_display_mode_) {
|
| - case DisplayMode::EXTENDED_3_PLUS:
|
| - // Mirror mode was turned off due to having more than two displays.
|
| - // Show a message that mirror mode for 3+ displays is not supported.
|
| - *out_message =
|
| - l10n_util::GetStringUTF16(IDS_ASH_DISPLAY_MIRRORING_NOT_SUPPORTED);
|
| - return true;
|
| -
|
| - case DisplayMode::DOCKED:
|
| - // Handle disabling mirror mode as a result of going to docked mode
|
| - // when we only have a single display (this means we actually have two
|
| - // physical displays, one of which is the internal display, but they
|
| - // were in mirror mode, and hence considered as one. Closing the
|
| - // internal display disables mirror mode and we still have a single
|
| - // active display).
|
| - // Falls through.
|
| - case DisplayMode::SINGLE:
|
| - // We're exiting mirror mode because we removed one of the two
|
| - // displays.
|
| - *out_message =
|
| - l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_DISPLAY_MIRROR_EXIT);
|
| - return true;
|
| -
|
| - default:
|
| - // Mirror mode was turned off; other messages should be shown e.g.
|
| - // extended mode is on, ... etc.
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -} // namespace ash
|
|
|