blob: 35cc017e6031b3c2c3e65d27d769dfb2f52a05f8 [file] [log] [blame]
// Copyright 2014 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/rotation/tray_rotation_lock.h"
#include "ash/shell.h"
#include "ash/system/tray/system_tray.h"
#include "ash/system/tray/tray_item_more.h"
#include "ash/wm/maximize_mode/maximize_mode_controller.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/gfx/display.h"
namespace ash {
namespace tray {
// Extends TrayItemMore, however does not make use of the chevron, nor of the
// DetailedView. This was chosen over ActionableView in order to reuse the
// layout and styling of labels and images. This allows RotationLockDefaultView
// to maintain the look of other system tray items without code duplication.
class RotationLockDefaultView : public TrayItemMore,
public ShellObserver {
public:
explicit RotationLockDefaultView(SystemTrayItem* owner);
virtual ~RotationLockDefaultView();
// ActionableView:
virtual bool PerformAction(const ui::Event& event) OVERRIDE;
// ShellObserver:
virtual void OnMaximizeModeStarted() OVERRIDE;
virtual void OnMaximizeModeEnded() OVERRIDE;
private:
void UpdateImage();
DISALLOW_COPY_AND_ASSIGN(RotationLockDefaultView);
};
RotationLockDefaultView::RotationLockDefaultView(SystemTrayItem* owner)
: TrayItemMore(owner, false) {
UpdateImage();
SetVisible(Shell::GetInstance()->maximize_mode_controller()->
IsMaximizeModeWindowManagerEnabled());
Shell::GetInstance()->AddShellObserver(this);
}
RotationLockDefaultView::~RotationLockDefaultView() {
Shell::GetInstance()->RemoveShellObserver(this);
}
bool RotationLockDefaultView::PerformAction(const ui::Event& event) {
MaximizeModeController* maximize_mode_controller = Shell::GetInstance()->
maximize_mode_controller();
maximize_mode_controller->SetRotationLocked(
!maximize_mode_controller->rotation_locked());
UpdateImage();
return true;
}
void RotationLockDefaultView::OnMaximizeModeStarted() {
UpdateImage();
SetVisible(true);
}
void RotationLockDefaultView::OnMaximizeModeEnded() {
SetVisible(false);
}
void RotationLockDefaultView::UpdateImage() {
base::string16 label;
ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
if (Shell::GetInstance()->maximize_mode_controller()->rotation_locked()) {
SetImage(bundle.GetImageNamed(
IDR_AURA_UBER_TRAY_AUTO_ROTATION_LOCKED_DARK).ToImageSkia());
label = l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ROTATION_LOCK_LOCKED);
SetLabel(label);
SetAccessibleName(label);
} else {
SetImage(bundle.GetImageNamed(IDR_AURA_UBER_TRAY_AUTO_ROTATION_DARK).
ToImageSkia());
label = l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_ROTATION_LOCK_AUTO);
SetLabel(label);
SetAccessibleName(label);
}
}
} // namespace tray
TrayRotationLock::TrayRotationLock(SystemTray* system_tray)
: TrayImageItem(system_tray, IDR_AURA_UBER_TRAY_AUTO_ROTATION_LOCKED),
on_primary_display_(false) {
gfx::NativeView native_view = system_tray->GetWidget()->GetNativeView();
gfx::Display parent_display = Shell::GetScreen()->
GetDisplayNearestWindow(native_view);
on_primary_display_ = parent_display.IsInternal();
if (on_primary_display_)
Shell::GetInstance()->AddShellObserver(this);
}
TrayRotationLock::~TrayRotationLock() {
if (on_primary_display_)
Shell::GetInstance()->RemoveShellObserver(this);
}
void TrayRotationLock::OnRotationLockChanged(bool rotation_locked) {
tray_view()->SetVisible(ShouldBeVisible());
}
views::View* TrayRotationLock::CreateDefaultView(user::LoginStatus status) {
if (on_primary_display_)
return new tray::RotationLockDefaultView(this);
return NULL;
}
void TrayRotationLock::OnMaximizeModeStarted() {
tray_view()->SetVisible(
Shell::GetInstance()->maximize_mode_controller()->rotation_locked());
Shell::GetInstance()->maximize_mode_controller()->AddObserver(this);
}
void TrayRotationLock::OnMaximizeModeEnded() {
tray_view()->SetVisible(false);
Shell::GetInstance()->maximize_mode_controller()->RemoveObserver(this);
}
bool TrayRotationLock::GetInitialVisibility() {
return ShouldBeVisible();
}
bool TrayRotationLock::ShouldBeVisible() {
MaximizeModeController* controller = Shell::GetInstance()->
maximize_mode_controller();
return on_primary_display_ &&
controller->IsMaximizeModeWindowManagerEnabled() &&
controller->rotation_locked();
}
} // namespace ash