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