1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/system/chromeos/rotation/tray_rotation_lock.h"
6a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/shell.h"
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/system/tray/system_tray.h"
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/system/tray/tray_item_more.h"
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ash/wm/maximize_mode/maximize_mode_controller.h"
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "grit/ash_resources.h"
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "grit/ash_strings.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/base/l10n/l10n_util.h"
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/base/resource/resource_bundle.h"
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ui/gfx/display.h"
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace ash {
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochnamespace tray {
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Extends TrayItemMore, however does not make use of the chevron, nor of the
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// DetailedView. This was chosen over ActionableView in order to reuse the
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// layout and styling of labels and images. This allows RotationLockDefaultView
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// to maintain the look of other system tray items without code duplication.
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass RotationLockDefaultView : public TrayItemMore,
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                public ShellObserver {
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public:
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  explicit RotationLockDefaultView(SystemTrayItem* owner);
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual ~RotationLockDefaultView();
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // ActionableView:
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual bool PerformAction(const ui::Event& event) OVERRIDE;
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // ShellObserver:
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void OnMaximizeModeStarted() OVERRIDE;
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void OnMaximizeModeEnded() OVERRIDE;
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private:
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void UpdateImage();
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DISALLOW_COPY_AND_ASSIGN(RotationLockDefaultView);
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
44a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochRotationLockDefaultView::RotationLockDefaultView(SystemTrayItem* owner)
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : TrayItemMore(owner, false) {
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  UpdateImage();
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SetVisible(Shell::GetInstance()->maximize_mode_controller()->
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 IsMaximizeModeWindowManagerEnabled());
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Shell::GetInstance()->AddShellObserver(this);
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
52a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochRotationLockDefaultView::~RotationLockDefaultView() {
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Shell::GetInstance()->RemoveShellObserver(this);
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool RotationLockDefaultView::PerformAction(const ui::Event& event) {
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MaximizeModeController* maximize_mode_controller = Shell::GetInstance()->
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      maximize_mode_controller();
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  maximize_mode_controller->SetRotationLocked(
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      !maximize_mode_controller->rotation_locked());
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  UpdateImage();
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return true;
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid RotationLockDefaultView::OnMaximizeModeStarted() {
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  UpdateImage();
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  SetVisible(true);
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid RotationLockDefaultView::OnMaximizeModeEnded() {
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  SetVisible(false);
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid RotationLockDefaultView::UpdateImage() {
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::string16 label;
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (Shell::GetInstance()->maximize_mode_controller()->rotation_locked()) {
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SetImage(bundle.GetImageNamed(
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        IDR_AURA_UBER_TRAY_AUTO_ROTATION_LOCKED_DARK).ToImageSkia());
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    label = l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED);
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SetLabel(label);
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SetAccessibleName(label);
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  } else {
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_AUTO_ROTATION_DARK).
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        ToImageSkia());
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    label = l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ROTATION_LOCK_AUTO);
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SetLabel(label);
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    SetAccessibleName(label);
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace tray
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
94a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTrayRotationLock::TrayRotationLock(SystemTray* system_tray)
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_AUTO_ROTATION_LOCKED),
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      on_primary_display_(false) {
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  gfx::NativeView native_view = system_tray->GetWidget()->GetNativeView();
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  gfx::Display parent_display = Shell::GetScreen()->
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      GetDisplayNearestWindow(native_view);
100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  on_primary_display_ = parent_display.IsInternal();
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (on_primary_display_)
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Shell::GetInstance()->AddShellObserver(this);
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
107a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochTrayRotationLock::~TrayRotationLock() {
108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (on_primary_display_)
109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    Shell::GetInstance()->RemoveShellObserver(this);
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void TrayRotationLock::OnRotationLockChanged(bool rotation_locked) {
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  tray_view()->SetVisible(ShouldBeVisible());
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochviews::View* TrayRotationLock::CreateDefaultView(user::LoginStatus status) {
117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (on_primary_display_)
118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return new tray::RotationLockDefaultView(this);
119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return NULL;
120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TrayRotationLock::OnMaximizeModeStarted() {
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  tray_view()->SetVisible(
1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      Shell::GetInstance()->maximize_mode_controller()->rotation_locked());
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Shell::GetInstance()->maximize_mode_controller()->AddObserver(this);
126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid TrayRotationLock::OnMaximizeModeEnded() {
129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  tray_view()->SetVisible(false);
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Shell::GetInstance()->maximize_mode_controller()->RemoveObserver(this);
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
132a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
133a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool TrayRotationLock::GetInitialVisibility() {
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return ShouldBeVisible();
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool TrayRotationLock::ShouldBeVisible() {
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  MaximizeModeController* controller = Shell::GetInstance()->
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      maximize_mode_controller();
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return on_primary_display_ &&
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         controller->IsMaximizeModeWindowManagerEnabled() &&
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         controller->rotation_locked();
143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}  // namespace ash
146