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