summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authorantrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-21 14:02:09 +0000
committerantrim@chromium.org <antrim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-21 14:02:09 +0000
commit83482fbfd131c230019694c77725c58b672ea444 (patch)
treef008c9419ab680878ef08aa422e2c0f46082dc8d /ash
parentd38ae9d947c2d0804af4747f34833c72ef897f81 (diff)
downloadchromium_src-83482fbfd131c230019694c77725c58b672ea444.zip
chromium_src-83482fbfd131c230019694c77725c58b672ea444.tar.gz
chromium_src-83482fbfd131c230019694c77725c58b672ea444.tar.bz2
Introduce SessionStateObserver
Use this in tooltip managers (158027 : Lockscreen leaks information via tooltip), Use this in launcher animation on full lock in new animations (138171). BUG=158027,138171 Review URL: https://chromiumcodereview.appspot.com/11416037 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@169033 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r--ash/ash.gyp1
-rw-r--r--ash/launcher/launcher_tooltip_manager.cc17
-rw-r--r--ash/launcher/launcher_tooltip_manager.h8
-rw-r--r--ash/root_window_controller.cc1
-rw-r--r--ash/shell.cc21
-rw-r--r--ash/tooltips/tooltip_controller.cc15
-rw-r--r--ash/tooltips/tooltip_controller.h8
-rw-r--r--ash/wm/session_state_controller.cc14
-rw-r--r--ash/wm/session_state_controller.h8
-rw-r--r--ash/wm/session_state_controller_impl.cc11
-rw-r--r--ash/wm/session_state_controller_impl2.cc11
-rw-r--r--ash/wm/session_state_observer.h28
12 files changed, 128 insertions, 15 deletions
diff --git a/ash/ash.gyp b/ash/ash.gyp
index 1e9ef82e..a89f96b 100644
--- a/ash/ash.gyp
+++ b/ash/ash.gyp
@@ -340,6 +340,7 @@
'wm/session_state_controller_impl.h',
'wm/session_state_controller_impl2.cc',
'wm/session_state_controller_impl2.h',
+ 'wm/session_state_observer.h',
'wm/shelf_layout_manager.cc',
'wm/shelf_layout_manager.h',
'wm/shelf_types.h',
diff --git a/ash/launcher/launcher_tooltip_manager.cc b/ash/launcher/launcher_tooltip_manager.cc
index 9768aa8..047aabf 100644
--- a/ash/launcher/launcher_tooltip_manager.cc
+++ b/ash/launcher/launcher_tooltip_manager.cc
@@ -7,6 +7,8 @@
#include "ash/launcher/launcher_view.h"
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
+#include "ash/wm/session_state_controller.h"
+#include "ash/wm/session_state_observer.h"
#include "ash/wm/window_animations.h"
#include "base/bind.h"
#include "base/message_loop.h"
@@ -148,8 +150,10 @@ LauncherTooltipManager::LauncherTooltipManager(
launcher_view_(launcher_view) {
if (shelf_layout_manager)
shelf_layout_manager->AddObserver(this);
- if (Shell::HasInstance())
+ if (Shell::HasInstance()) {
Shell::GetInstance()->AddPreTargetHandler(this);
+ Shell::GetInstance()->session_state_controller()->AddObserver(this);
+ }
}
LauncherTooltipManager::~LauncherTooltipManager() {
@@ -157,8 +161,10 @@ LauncherTooltipManager::~LauncherTooltipManager() {
Close();
if (shelf_layout_manager_)
shelf_layout_manager_->RemoveObserver(this);
- if (Shell::HasInstance())
+ if (Shell::HasInstance()) {
Shell::GetInstance()->RemovePreTargetHandler(this);
+ Shell::GetInstance()->session_state_controller()->RemoveObserver(this);
+ }
}
void LauncherTooltipManager::ShowDelayed(views::View* anchor,
@@ -307,6 +313,13 @@ ui::EventResult LauncherTooltipManager::OnGestureEvent(
return ui::ER_UNHANDLED;
}
+void LauncherTooltipManager::OnSessionStateEvent(
+ SessionStateObserver::EventType event) {
+ if (event == SessionStateObserver::EVENT_PRELOCK_ANIMATION_STARTED ||
+ event == SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED)
+ Close();
+}
+
void LauncherTooltipManager::WillDeleteShelf() {
shelf_layout_manager_ = NULL;
}
diff --git a/ash/launcher/launcher_tooltip_manager.h b/ash/launcher/launcher_tooltip_manager.h
index 5adea3c..5bbab27 100644
--- a/ash/launcher/launcher_tooltip_manager.h
+++ b/ash/launcher/launcher_tooltip_manager.h
@@ -6,6 +6,7 @@
#define ASH_LAUNCHER_LAUNCHER_TOOLTIP_MANAGER_H_
#include "ash/ash_export.h"
+#include "ash/wm/session_state_observer.h"
#include "ash/wm/shelf_layout_manager.h"
#include "ash/wm/shelf_types.h"
#include "base/basictypes.h"
@@ -36,7 +37,8 @@ class LauncherView;
// LauncherTooltipManager manages the tooltip balloon poping up on launcher
// items.
class ASH_EXPORT LauncherTooltipManager : public ui::EventHandler,
- public ShelfLayoutManager::Observer {
+ public ShelfLayoutManager::Observer,
+ public SessionStateObserver {
public:
LauncherTooltipManager(ShelfAlignment alignment,
ShelfLayoutManager* shelf_layout_manager,
@@ -75,6 +77,10 @@ protected:
virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
virtual ui::EventResult OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
+ // SessionStateObserver override:
+ virtual void OnSessionStateEvent(SessionStateObserver::EventType event)
+ OVERRIDE;
+
// ShelfLayoutManager::Observer overrides:
virtual void WillDeleteShelf() OVERRIDE;
virtual void WillChangeVisibilityState(
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index 5a1b36e..e6c4bd9 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -407,6 +407,7 @@ void RootWindowController::CloseChildWindows() {
delete child;
}
+ launcher_.reset();
// All containers are deleted, so reset shelf_.
shelf_ = NULL;
}
diff --git a/ash/shell.cc b/ash/shell.cc
index 9ef82e9..c2460e2 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -275,8 +275,6 @@ Shell::~Shell() {
drag_drop_controller_.reset();
magnification_controller_.reset();
partial_magnification_controller_.reset();
- power_button_controller_.reset();
- session_state_controller_.reset();
resize_shadow_controller_.reset();
shadow_controller_.reset();
tooltip_controller_.reset();
@@ -287,6 +285,9 @@ Shell::~Shell() {
user_action_client_.reset();
visibility_controller_.reset();
+ power_button_controller_.reset();
+ session_state_controller_.reset();
+
// This also deletes all RootWindows.
display_controller_.reset();
screen_position_controller_.reset();
@@ -463,6 +464,14 @@ void Shell::Init() {
CommandLine* command_line = CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(ash::switches::kAshNewLockAnimationsEnabled))
+ session_state_controller_.reset(new SessionStateControllerImpl2);
+ else
+ session_state_controller_.reset(new SessionStateControllerImpl);
+ power_button_controller_.reset(new PowerButtonController(
+ session_state_controller_.get()));
+ AddShellObserver(session_state_controller_.get());
+
if (command_line->HasSwitch(switches::kAshTouchHud)) {
touch_observer_hud_.reset(new internal::TouchObserverHUD);
AddPreTargetHandler(touch_observer_hud_.get());
@@ -542,14 +551,6 @@ void Shell::Init() {
// the correct size.
user_wallpaper_delegate_->InitializeWallpaper();
- if (command_line->HasSwitch(ash::switches::kAshNewLockAnimationsEnabled))
- session_state_controller_.reset(new SessionStateControllerImpl2);
- else
- session_state_controller_.reset(new SessionStateControllerImpl);
- power_button_controller_.reset(new PowerButtonController(
- session_state_controller_.get()));
- AddShellObserver(session_state_controller_.get());
-
if (initially_hide_cursor_)
cursor_manager_.ShowCursor(false);
cursor_manager_.SetCursor(ui::kCursorPointer);
diff --git a/ash/tooltips/tooltip_controller.cc b/ash/tooltips/tooltip_controller.cc
index c13bcdd..fb0d17f 100644
--- a/ash/tooltips/tooltip_controller.cc
+++ b/ash/tooltips/tooltip_controller.cc
@@ -10,6 +10,8 @@
#include "ash/shell.h"
#include "ash/wm/coordinate_conversion.h"
#include "ash/wm/cursor_manager.h"
+#include "ash/wm/session_state_controller.h"
+#include "ash/wm/session_state_observer.h"
#include "base/command_line.h"
#include "base/location.h"
#include "base/string_split.h"
@@ -216,11 +218,15 @@ TooltipController::TooltipController(
base::TimeDelta::FromMilliseconds(kTooltipTimeoutMs),
this, &TooltipController::TooltipTimerFired);
DCHECK(drag_drop_client_);
+ if (Shell::GetInstance())
+ Shell::GetInstance()->session_state_controller()->AddObserver(this);
}
TooltipController::~TooltipController() {
if (tooltip_window_)
tooltip_window_->RemoveObserver(this);
+ if (Shell::GetInstance())
+ Shell::GetInstance()->session_state_controller()->RemoveObserver(this);
}
void TooltipController::UpdateTooltip(aura::Window* target) {
@@ -312,6 +318,15 @@ ui::EventResult TooltipController::OnTouchEvent(ui::TouchEvent* event) {
return ui::ER_UNHANDLED;
}
+void TooltipController::OnSessionStateEvent(
+ SessionStateObserver::EventType event) {
+ if (event == SessionStateObserver::EVENT_PRELOCK_ANIMATION_STARTED ||
+ event == SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED) {
+ if (tooltip_.get() && tooltip_->IsVisible())
+ tooltip_->Hide();
+ }
+}
+
void TooltipController::OnWindowDestroyed(aura::Window* window) {
if (tooltip_window_ == window) {
tooltip_window_->RemoveObserver(this);
diff --git a/ash/tooltips/tooltip_controller.h b/ash/tooltips/tooltip_controller.h
index 67c6f77..dc21527 100644
--- a/ash/tooltips/tooltip_controller.h
+++ b/ash/tooltips/tooltip_controller.h
@@ -6,6 +6,7 @@
#define ASH_TOOLTIPS_TOOLTIP_CONTROLLER_H_
#include "ash/ash_export.h"
+#include "ash/wm/session_state_observer.h"
#include "base/memory/scoped_ptr.h"
#include "base/string16.h"
#include "base/timer.h"
@@ -32,7 +33,8 @@ namespace internal {
// TooltipController provides tooltip functionality for aura shell.
class ASH_EXPORT TooltipController : public aura::client::TooltipClient,
public ui::EventHandler,
- public aura::WindowObserver {
+ public aura::WindowObserver,
+ public SessionStateObserver {
public:
explicit TooltipController(aura::client::DragDropClient* drag_drop_client);
virtual ~TooltipController();
@@ -46,6 +48,10 @@ class ASH_EXPORT TooltipController : public aura::client::TooltipClient,
virtual ui::EventResult OnMouseEvent(ui::MouseEvent* event) OVERRIDE;
virtual ui::EventResult OnTouchEvent(ui::TouchEvent* event) OVERRIDE;
+ // Overridden from SessionStateController.
+ virtual void OnSessionStateEvent(SessionStateObserver::EventType event)
+ OVERRIDE;
+
// Overridden from aura::WindowObserver.
virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE;
diff --git a/ash/wm/session_state_controller.cc b/ash/wm/session_state_controller.cc
index ea12b8d..0bcf31d 100644
--- a/ash/wm/session_state_controller.cc
+++ b/ash/wm/session_state_controller.cc
@@ -36,4 +36,18 @@ void SessionStateController::SetDelegate(
SessionStateControllerDelegate* delegate) {
delegate_.reset(delegate);
}
+
+void SessionStateController::AddObserver(SessionStateObserver* observer) {
+ observers_.AddObserver(observer);
+}
+
+void SessionStateController::RemoveObserver(SessionStateObserver* observer) {
+ observers_.RemoveObserver(observer);
+}
+
+bool SessionStateController::HasObserver(SessionStateObserver* observer) {
+ return observers_.HasObserver(observer);
+}
+
+
} // namespace ash
diff --git a/ash/wm/session_state_controller.h b/ash/wm/session_state_controller.h
index 703a680..648e923 100644
--- a/ash/wm/session_state_controller.h
+++ b/ash/wm/session_state_controller.h
@@ -8,8 +8,10 @@
#include "ash/ash_export.h"
#include "ash/shell_observer.h"
#include "ash/wm/session_state_animator.h"
+#include "ash/wm/session_state_observer.h"
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
+#include "base/observer_list.h"
#include "base/time.h"
#include "base/timer.h"
#include "ui/aura/root_window_observer.h"
@@ -120,6 +122,10 @@ class ASH_EXPORT SessionStateController : public aura::RootWindowObserver,
// Callback is guaranteed to be called once and then discarded.
virtual void SetLockScreenDisplayedCallback(base::Closure& callback) = 0;
+ virtual void AddObserver(SessionStateObserver* observer);
+ virtual void RemoveObserver(SessionStateObserver* observer);
+ virtual bool HasObserver(SessionStateObserver* observer);
+
protected:
friend class test::PowerButtonControllerTest;
@@ -127,6 +133,8 @@ class ASH_EXPORT SessionStateController : public aura::RootWindowObserver,
scoped_ptr<SessionStateControllerDelegate> delegate_;
+ ObserverList<SessionStateObserver> observers_;
+
private:
DISALLOW_COPY_AND_ASSIGN(SessionStateController);
};
diff --git a/ash/wm/session_state_controller_impl.cc b/ash/wm/session_state_controller_impl.cc
index 93b55ce..96b2788 100644
--- a/ash/wm/session_state_controller_impl.cc
+++ b/ash/wm/session_state_controller_impl.cc
@@ -71,6 +71,9 @@ void SessionStateControllerImpl::OnLockStateChanged(bool locked) {
internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
internal::SessionStateAnimator::ANIMATION_FADE_IN,
internal::SessionStateAnimator::ANIMATION_SPEED_SHOW_LOCK_SCREEN);
+ FOR_EACH_OBSERVER(SessionStateObserver, observers_,
+ OnSessionStateEvent(
+ SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED));
lock_timer_.Stop();
lock_fail_timer_.Stop();
@@ -102,6 +105,9 @@ void SessionStateControllerImpl::OnStartingLock() {
internal::SessionStateAnimator::ANIMATION_FULL_CLOSE,
internal::SessionStateAnimator::ANIMATION_SPEED_FAST);
+ FOR_EACH_OBSERVER(SessionStateObserver, observers_,
+ OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED));
+
// Hide the screen locker containers so we can make them fade in later.
animator_->StartAnimation(
internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
@@ -114,6 +120,8 @@ void SessionStateControllerImpl::StartLockAnimationAndLockImmediately() {
internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
internal::SessionStateAnimator::ANIMATION_PARTIAL_CLOSE,
internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE);
+ FOR_EACH_OBSERVER(SessionStateObserver, observers_,
+ OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED));
OnLockTimeout();
}
@@ -124,6 +132,9 @@ void SessionStateControllerImpl::StartLockAnimation(bool shutdown_after_lock) {
internal::SessionStateAnimator::NON_LOCK_SCREEN_CONTAINERS,
internal::SessionStateAnimator::ANIMATION_PARTIAL_CLOSE,
internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE);
+ FOR_EACH_OBSERVER(SessionStateObserver, observers_,
+ OnSessionStateEvent(
+ SessionStateObserver::EVENT_PRELOCK_ANIMATION_STARTED));
StartLockTimer();
}
diff --git a/ash/wm/session_state_controller_impl2.cc b/ash/wm/session_state_controller_impl2.cc
index 0cacb44..ef1da5e 100644
--- a/ash/wm/session_state_controller_impl2.cc
+++ b/ash/wm/session_state_controller_impl2.cc
@@ -93,6 +93,9 @@ void SessionStateControllerImpl2::SetLockScreenDisplayedCallback(
}
void SessionStateControllerImpl2::OnLockScreenAnimationFinished() {
+ FOR_EACH_OBSERVER(SessionStateObserver, observers_,
+ OnSessionStateEvent(
+ SessionStateObserver::EVENT_LOCK_ANIMATION_FINISHED));
if (!lock_screen_displayed_callback_.is_null()) {
lock_screen_displayed_callback_.Run();
lock_screen_displayed_callback_.Reset();
@@ -112,7 +115,8 @@ void SessionStateControllerImpl2::OnStartingLock() {
internal::SessionStateAnimator::LAUNCHER,
internal::SessionStateAnimator::ANIMATION_LIFT,
internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
-
+ FOR_EACH_OBSERVER(SessionStateObserver, observers_,
+ OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED));
// Hide the screen locker containers so we can raise them later.
animator_->StartAnimation(
internal::SessionStateAnimator::LOCK_SCREEN_CONTAINERS,
@@ -126,6 +130,8 @@ void SessionStateControllerImpl2::StartLockAnimationAndLockImmediately() {
internal::SessionStateAnimator::LAUNCHER,
internal::SessionStateAnimator::ANIMATION_LIFT,
internal::SessionStateAnimator::ANIMATION_SPEED_MOVE_WINDOWS);
+ FOR_EACH_OBSERVER(SessionStateObserver, observers_,
+ OnSessionStateEvent(SessionStateObserver::EVENT_LOCK_ANIMATION_STARTED));
OnLockTimeout();
}
@@ -137,6 +143,9 @@ void SessionStateControllerImpl2::StartLockAnimation(bool shutdown_after_lock) {
internal::SessionStateAnimator::LAUNCHER,
internal::SessionStateAnimator::ANIMATION_LIFT,
internal::SessionStateAnimator::ANIMATION_SPEED_UNDOABLE);
+ FOR_EACH_OBSERVER(SessionStateObserver, observers_,
+ OnSessionStateEvent(
+ SessionStateObserver::EVENT_PRELOCK_ANIMATION_STARTED));
StartLockTimer();
}
diff --git a/ash/wm/session_state_observer.h b/ash/wm/session_state_observer.h
new file mode 100644
index 0000000..8df4018
--- /dev/null
+++ b/ash/wm/session_state_observer.h
@@ -0,0 +1,28 @@
+// 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.
+
+#ifndef ASH_WM_SESSION_STATE_OBSERVER_H_
+#define ASH_WM_SESSION_STATE_OBSERVER_H_
+
+#include "ash/ash_export.h"
+
+namespace ash {
+
+// Interface for classes that want to be notified by SessionStateController when
+// session-related events occur.
+class ASH_EXPORT SessionStateObserver {
+ public:
+ enum EventType {
+ EVENT_PRELOCK_ANIMATION_STARTED,
+ EVENT_LOCK_ANIMATION_STARTED,
+ EVENT_LOCK_ANIMATION_FINISHED,
+ };
+
+ virtual void OnSessionStateEvent(EventType event) = 0;
+ virtual ~SessionStateObserver() {};
+};
+
+} // namespace ash
+
+#endif // ASH_WM_SESSION_STATE_CONTROLLER_H_