summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authorxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-16 01:00:34 +0000
committerxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-16 01:00:34 +0000
commit380aeaf0c6f3e4ab8ae8b2acbab2616eb83e445a (patch)
treedae23a5a4250e83974f1b538411f7874ab9a133e /ash
parent26dc99aa8ecc3b19c8c8d51e8d302e7358ee01d6 (diff)
downloadchromium_src-380aeaf0c6f3e4ab8ae8b2acbab2616eb83e445a.zip
chromium_src-380aeaf0c6f3e4ab8ae8b2acbab2616eb83e445a.tar.gz
chromium_src-380aeaf0c6f3e4ab8ae8b2acbab2616eb83e445a.tar.bz2
ash/app_list: Make app list bubble move with launcher app list button.
BUG=131693 TEST=Verify that app list bubble moves with launcher app list button when pinning/unpinning from app list grid. Review URL: https://chromiumcodereview.appspot.com/10535170 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142548 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r--ash/launcher/launcher_icon_observer.h5
-rw-r--r--ash/launcher/launcher_view.cc23
-rw-r--r--ash/launcher/launcher_view.h13
-rw-r--r--ash/launcher/launcher_view_unittest.cc43
-rw-r--r--ash/test/launcher_view_test_api.cc2
-rw-r--r--ash/wm/app_list_controller.cc18
-rw-r--r--ash/wm/app_list_controller.h10
-rw-r--r--ash/wm/panel_layout_manager.cc5
-rw-r--r--ash/wm/panel_layout_manager.h4
-rw-r--r--ash/wm/panel_layout_manager_unittest.cc21
10 files changed, 104 insertions, 40 deletions
diff --git a/ash/launcher/launcher_icon_observer.h b/ash/launcher/launcher_icon_observer.h
index 5b24e92..b38f958 100644
--- a/ash/launcher/launcher_icon_observer.h
+++ b/ash/launcher/launcher_icon_observer.h
@@ -6,21 +6,18 @@
#define ASH_LAUNCHER_LAUNCHER_ICON_OBSERVER_H_
#pragma once
+#include "ash/ash_export.h"
#include "base/basictypes.h"
namespace ash {
class ASH_EXPORT LauncherIconObserver {
public:
- LauncherIconObserver() {}
-
// Invoked when any icon on launcher changes position.
virtual void OnLauncherIconPositionsChanged() = 0;
protected:
virtual ~LauncherIconObserver() {}
-
- DISALLOW_COPY_AND_ASSIGN(LauncherIconObserver);
};
} // namespace ash
diff --git a/ash/launcher/launcher_view.cc b/ash/launcher/launcher_view.cc
index e2581e5..d5112c2 100644
--- a/ash/launcher/launcher_view.cc
+++ b/ash/launcher/launcher_view.cc
@@ -274,12 +274,14 @@ LauncherView::LauncherView(LauncherModel* model, LauncherDelegate* delegate)
alignment_(SHELF_ALIGNMENT_BOTTOM) {
DCHECK(model_);
bounds_animator_.reset(new views::BoundsAnimator(this));
+ bounds_animator_->AddObserver(this);
set_context_menu_controller(this);
focus_search_.reset(new LauncherFocusSearch(view_model_.get()));
tooltip_.reset(new LauncherTooltipManager(alignment_));
}
LauncherView::~LauncherView() {
+ bounds_animator_->RemoveObserver(this);
model_->RemoveObserver(this);
}
@@ -837,9 +839,6 @@ void LauncherView::LauncherItemAdded(int model_index) {
// Undo the hiding if animation does not run.
view->layer()->SetOpacity(1.0f);
}
-
- FOR_EACH_OBSERVER(LauncherIconObserver, observers_,
- OnLauncherIconPositionsChanged());
}
void LauncherView::LauncherItemRemoved(int model_index, LauncherID id) {
@@ -855,14 +854,6 @@ void LauncherView::LauncherItemRemoved(int model_index, LauncherID id) {
bounds_animator_->AnimateViewTo(view, view->bounds());
bounds_animator_->SetAnimationDelegate(
view, new FadeOutAnimationDelegate(this, view), true);
-
- // The animation will eventually update the ideal bounds, but we want to
- // force an update immediately so we can notify launcher icon observers.
- IdealBounds ideal_bounds;
- CalculateIdealBounds(&ideal_bounds);
-
- FOR_EACH_OBSERVER(LauncherIconObserver, observers_,
- OnLauncherIconPositionsChanged());
}
void LauncherView::LauncherItemChanged(int model_index,
@@ -913,8 +904,6 @@ void LauncherView::LauncherItemChanged(int model_index,
void LauncherView::LauncherItemMoved(int start_index, int target_index) {
view_model_->Move(start_index, target_index);
AnimateToIdealBounds();
- FOR_EACH_OBSERVER(LauncherIconObserver, observers_,
- OnLauncherIconPositionsChanged());
}
void LauncherView::MousePressedOnButton(views::View* view,
@@ -1071,5 +1060,13 @@ void LauncherView::ShowContextMenuForView(views::View* source,
#endif
}
+void LauncherView::OnBoundsAnimatorProgressed(views::BoundsAnimator* animator) {
+ FOR_EACH_OBSERVER(LauncherIconObserver, observers_,
+ OnLauncherIconPositionsChanged());
+}
+
+void LauncherView::OnBoundsAnimatorDone(views::BoundsAnimator* animator) {
+}
+
} // namespace internal
} // namespace ash
diff --git a/ash/launcher/launcher_view.h b/ash/launcher/launcher_view.h
index 8f0323f..0935ccc 100644
--- a/ash/launcher/launcher_view.h
+++ b/ash/launcher/launcher_view.h
@@ -13,6 +13,7 @@
#include "ash/launcher/launcher_model_observer.h"
#include "ash/wm/shelf_auto_hide_behavior.h"
#include "base/observer_list.h"
+#include "ui/views/animation/bounds_animator_observer.h"
#include "ui/views/context_menu_controller.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/focus/focus_manager.h"
@@ -46,7 +47,8 @@ class ASH_EXPORT LauncherView : public views::View,
public views::ButtonListener,
public LauncherButtonHost,
public views::ContextMenuController,
- public views::FocusTraversable {
+ public views::FocusTraversable,
+ public views::BoundsAnimatorObserver {
public:
LauncherView(LauncherModel* model, LauncherDelegate* delegate);
virtual ~LauncherView();
@@ -178,14 +180,19 @@ class ASH_EXPORT LauncherView : public views::View,
virtual ShelfAlignment GetShelfAlignment() const OVERRIDE;
virtual string16 GetAccessibleName(const views::View* view) OVERRIDE;
- // Overriden from views::ButtonListener:
+ // Overridden from views::ButtonListener:
virtual void ButtonPressed(views::Button* sender,
const views::Event& event) OVERRIDE;
- // Overriden from views::ContextMenuController:
+ // Overridden from views::ContextMenuController:
virtual void ShowContextMenuForView(views::View* source,
const gfx::Point& point) OVERRIDE;
+ // Overridden from views::BoundsAnimatorObserver:
+ virtual void OnBoundsAnimatorProgressed(
+ views::BoundsAnimator* animator) OVERRIDE;
+ virtual void OnBoundsAnimatorDone(views::BoundsAnimator* animator) OVERRIDE;
+
// The model; owned by Launcher.
LauncherModel* model_;
diff --git a/ash/launcher/launcher_view_unittest.cc b/ash/launcher/launcher_view_unittest.cc
index e769835..556c99d 100644
--- a/ash/launcher/launcher_view_unittest.cc
+++ b/ash/launcher/launcher_view_unittest.cc
@@ -36,24 +36,29 @@ namespace test {
class TestLauncherIconObserver : public LauncherIconObserver {
public:
- TestLauncherIconObserver() : count_(0) {
- Shell::GetInstance()->launcher()->AddIconObserver(this);
+ explicit TestLauncherIconObserver(Launcher* launcher)
+ : launcher_(launcher),
+ change_notified_(false) {
+ if (launcher_)
+ launcher_->AddIconObserver(this);
}
virtual ~TestLauncherIconObserver() {
- Shell::GetInstance()->launcher()->RemoveIconObserver(this);
+ if (launcher_)
+ launcher_->RemoveIconObserver(this);
}
// LauncherIconObserver implementation.
- void OnLauncherIconPositionsChanged() OVERRIDE {
- ++count_;
+ virtual void OnLauncherIconPositionsChanged() OVERRIDE {
+ change_notified_ = true;
}
- int count() const { return count_; }
- void Reset() { count_ = 0; }
+ int change_notified() const { return change_notified_; }
+ void Reset() { change_notified_ = false; }
private:
- int count_;
+ Launcher* launcher_;
+ bool change_notified_;
DISALLOW_COPY_AND_ASSIGN(TestLauncherIconObserver);
};
@@ -65,7 +70,13 @@ class LauncherViewIconObserverTest : public ash::test::AshTestBase {
virtual void SetUp() OVERRIDE {
AshTestBase::SetUp();
- observer_.reset(new TestLauncherIconObserver);
+
+ Launcher* launcher = Shell::GetInstance()->launcher();
+ observer_.reset(new TestLauncherIconObserver(launcher));
+
+ launcher_view_test_.reset(new LauncherViewTestAPI(
+ launcher->GetLauncherViewForTest()));
+ launcher_view_test_->SetAnimationDuration(1);
}
virtual void TearDown() OVERRIDE {
@@ -75,8 +86,13 @@ class LauncherViewIconObserverTest : public ash::test::AshTestBase {
TestLauncherIconObserver* observer() { return observer_.get(); }
+ LauncherViewTestAPI* launcher_vew_test() {
+ return launcher_view_test_.get();
+ }
+
private:
scoped_ptr<TestLauncherIconObserver> observer_;
+ scoped_ptr<LauncherViewTestAPI> launcher_view_test_;
DISALLOW_COPY_AND_ASSIGN(LauncherViewIconObserverTest);
};
@@ -93,12 +109,14 @@ TEST_F(LauncherViewIconObserverTest, AddRemove) {
scoped_ptr<views::Widget> widget(new views::Widget());
widget->Init(params);
launcher_delegate->AddLauncherItem(widget->GetNativeWindow());
- EXPECT_EQ(1, observer()->count());
+ launcher_vew_test()->RunMessageLoopUntilAnimationsDone();
+ EXPECT_TRUE(observer()->change_notified());
observer()->Reset();
widget->Show();
widget->GetNativeWindow()->parent()->RemoveChild(widget->GetNativeWindow());
- EXPECT_EQ(1, observer()->count());
+ launcher_vew_test()->RunMessageLoopUntilAnimationsDone();
+ EXPECT_TRUE(observer()->change_notified());
observer()->Reset();
}
@@ -108,7 +126,8 @@ TEST_F(LauncherViewIconObserverTest, BoundsChanged) {
int total_width = launcher_size.width() / 2;
ASSERT_GT(total_width, 0);
launcher->SetStatusSize(gfx::Size(total_width, launcher_size.height()));
- EXPECT_EQ(1, observer()->count());
+ // No animation happens for LauncherView bounds change.
+ EXPECT_TRUE(observer()->change_notified());
observer()->Reset();
}
diff --git a/ash/test/launcher_view_test_api.cc b/ash/test/launcher_view_test_api.cc
index 3dc45bf..0f8893b 100644
--- a/ash/test/launcher_view_test_api.cc
+++ b/ash/test/launcher_view_test_api.cc
@@ -20,6 +20,8 @@ class TestAPIAnimationObserver : public views::BoundsAnimatorObserver {
virtual ~TestAPIAnimationObserver() {}
// views::BoundsAnimatorObserver overrides:
+ virtual void OnBoundsAnimatorProgressed(
+ views::BoundsAnimator* animator) OVERRIDE {}
virtual void OnBoundsAnimatorDone(views::BoundsAnimator* animator) OVERRIDE {
MessageLoop::current()->Quit();
}
diff --git a/ash/wm/app_list_controller.cc b/ash/wm/app_list_controller.cc
index 5ffc075..69b2ed7 100644
--- a/ash/wm/app_list_controller.cc
+++ b/ash/wm/app_list_controller.cc
@@ -5,6 +5,7 @@
#include "ash/wm/app_list_controller.h"
#include "ash/ash_switches.h"
+#include "ash/launcher/launcher.h"
#include "ash/root_window_controller.h"
#include "ash/shell.h"
#include "ash/shell_delegate.h"
@@ -115,6 +116,7 @@ void AppListController::SetView(app_list::AppListView* view) {
views::Widget* widget = view_->GetWidget();
widget->AddObserver(this);
Shell::GetInstance()->AddEnvEventFilter(this);
+ Shell::GetInstance()->launcher()->AddIconObserver(this);
widget->GetNativeView()->GetRootWindow()->AddRootWindowObserver(this);
widget->GetNativeView()->GetFocusManager()->AddObserver(this);
widget->SetOpacity(0);
@@ -134,6 +136,7 @@ void AppListController::ResetView() {
widget->RemoveObserver(this);
GetLayer(widget)->GetAnimator()->RemoveObserver(this);
Shell::GetInstance()->RemoveEnvEventFilter(this);
+ Shell::GetInstance()->launcher()->RemoveIconObserver(this);
widget->GetNativeView()->GetRootWindow()->RemoveRootWindowObserver(this);
widget->GetNativeView()->GetFocusManager()->RemoveObserver(this);
view_ = NULL;
@@ -168,6 +171,11 @@ void AppListController::ProcessLocatedEvent(const aura::LocatedEvent& event) {
}
}
+void AppListController::UpdateBounds() {
+ if (view_ && is_visible_)
+ view_->UpdateBounds();
+}
+
////////////////////////////////////////////////////////////////////////////////
// AppListController, aura::EventFilter implementation:
@@ -218,8 +226,7 @@ void AppListController::OnWindowFocused(aura::Window* window) {
// AppListController, aura::RootWindowObserver implementation:
void AppListController::OnRootWindowResized(const aura::RootWindow* root,
const gfx::Size& old_size) {
- if (view_ && is_visible_)
- view_->UpdateBounds();
+ UpdateBounds();
}
////////////////////////////////////////////////////////////////////////////////
@@ -249,5 +256,12 @@ void AppListController::OnShelfAlignmentChanged() {
view_->SetBubbleArrowLocation(GetBubbleArrowLocation());
}
+////////////////////////////////////////////////////////////////////////////////
+// AppListController, LauncherIconObserver implementation:
+
+void AppListController::OnLauncherIconPositionsChanged() {
+ UpdateBounds();
+}
+
} // namespace internal
} // namespace ash
diff --git a/ash/wm/app_list_controller.h b/ash/wm/app_list_controller.h
index 4031111..303326a 100644
--- a/ash/wm/app_list_controller.h
+++ b/ash/wm/app_list_controller.h
@@ -6,6 +6,7 @@
#define ASH_WM_APP_LIST_CONTROLLER_H_
#pragma once
+#include "ash/launcher/launcher_icon_observer.h"
#include "ash/shell_observer.h"
#include "base/basictypes.h"
#include "base/compiler_specific.h"
@@ -36,7 +37,8 @@ class AppListController : public aura::EventFilter,
public aura::RootWindowObserver,
public ui::ImplicitAnimationObserver,
public views::Widget::Observer,
- public ShellObserver {
+ public ShellObserver,
+ public LauncherIconObserver {
public:
AppListController();
virtual ~AppListController();
@@ -67,6 +69,9 @@ class AppListController : public aura::EventFilter,
void ProcessLocatedEvent(const aura::LocatedEvent& event);
+ // Makes app list bubble update its bounds.
+ void UpdateBounds();
+
// aura::EventFilter overrides:
virtual bool PreHandleKeyEvent(aura::Window* target,
aura::KeyEvent* event) OVERRIDE;
@@ -94,6 +99,9 @@ class AppListController : public aura::EventFilter,
// ShellObserver overrides:
virtual void OnShelfAlignmentChanged() OVERRIDE;
+ // LauncherIconObserver overrides:
+ virtual void OnLauncherIconPositionsChanged() OVERRIDE;
+
// Whether we should show or hide app list widget.
bool is_visible_;
diff --git a/ash/wm/panel_layout_manager.cc b/ash/wm/panel_layout_manager.cc
index 1a5d20d..b426c4e 100644
--- a/ash/wm/panel_layout_manager.cc
+++ b/ash/wm/panel_layout_manager.cc
@@ -5,6 +5,7 @@
#include "ash/wm/panel_layout_manager.h"
#include <algorithm>
+#include <map>
#include "ash/launcher/launcher.h"
#include "ash/shell.h"
@@ -218,7 +219,11 @@ void PanelLayoutManager::SetChildBounds(aura::Window* child,
////////////////////////////////////////////////////////////////////////////////
// PanelLayoutManager, ash::LauncherIconObserver implementation:
+
void PanelLayoutManager::OnLauncherIconPositionsChanged() {
+ // TODO: As this is called for every animation step now. Relayout needs to be
+ // updated to use current icon position instead of use the ideal bounds so
+ // that the panels slide with their icons instead of jumping.
Relayout();
}
diff --git a/ash/wm/panel_layout_manager.h b/ash/wm/panel_layout_manager.h
index cb3c20c..652ed2e 100644
--- a/ash/wm/panel_layout_manager.h
+++ b/ash/wm/panel_layout_manager.h
@@ -43,8 +43,8 @@ namespace internal {
// its layout manager to this instance, e.g.:
// panel_container->SetLayoutManager(new PanelLayoutManager(panel_container));
-class ASH_EXPORT PanelLayoutManager :
- public aura::LayoutManager,
+class ASH_EXPORT PanelLayoutManager
+ : public aura::LayoutManager,
public ash::LauncherIconObserver,
public aura::client::ActivationChangeObserver {
public:
diff --git a/ash/wm/panel_layout_manager_unittest.cc b/ash/wm/panel_layout_manager_unittest.cc
index f1878ca..947a892 100644
--- a/ash/wm/panel_layout_manager_unittest.cc
+++ b/ash/wm/panel_layout_manager_unittest.cc
@@ -9,6 +9,7 @@
#include "ash/shell.h"
#include "ash/shell_window_ids.h"
#include "ash/test/ash_test_base.h"
+#include "ash/test/launcher_view_test_api.h"
#include "ash/test/test_launcher_delegate.h"
#include "ash/wm/window_util.h"
#include "base/basictypes.h"
@@ -19,7 +20,6 @@
#include "ui/views/widget/widget.h"
namespace ash {
-
namespace internal {
using aura::test::WindowIsAbove;
@@ -33,6 +33,11 @@ class PanelLayoutManagerTest : public ash::test::AshTestBase {
CommandLine::ForCurrentProcess()->AppendSwitch(switches::kAuraPanelManager);
ash::test::AshTestBase::SetUp();
ASSERT_TRUE(ash::test::TestLauncherDelegate::instance());
+
+ Launcher* launcher = Shell::GetInstance()->launcher();
+ launcher_view_test_.reset(new test::LauncherViewTestAPI(
+ launcher->GetLauncherViewForTest()));
+ launcher_view_test_->SetAnimationDuration(1);
}
aura::Window* CreateNormalWindow() {
@@ -69,6 +74,9 @@ class PanelLayoutManagerTest : public ash::test::AshTestBase {
// TODO(dcheng): This should be const, but GetScreenBoundsOfItemIconForWindow
// takes a non-const Window. We can probably fix that.
void IsPanelAboveLauncherIcon(aura::Window* panel) {
+ // Waits until all launcher view animations are done.
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
+
Launcher* launcher = Shell::GetInstance()->launcher();
gfx::Rect icon_bounds = launcher->GetScreenBoundsOfItemIconForWindow(panel);
ASSERT_FALSE(icon_bounds.IsEmpty());
@@ -104,7 +112,13 @@ class PanelLayoutManagerTest : public ash::test::AshTestBase {
return widget->IsVisible();
}
+ test::LauncherViewTestAPI* launcher_view_test() {
+ return launcher_view_test_.get();
+ }
+
private:
+ scoped_ptr<test::LauncherViewTestAPI> launcher_view_test_;
+
DISALLOW_COPY_AND_ASSIGN(PanelLayoutManagerTest);
};
@@ -147,10 +161,12 @@ TEST_F(PanelLayoutManagerTest, MultiplePanelStacking) {
// Changing the active window should update the stacking order.
wm::ActivateWindow(w1.get());
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
EXPECT_TRUE(WindowIsAbove(w1.get(), w2.get()));
EXPECT_TRUE(WindowIsAbove(w2.get(), w3.get()));
wm::ActivateWindow(w2.get());
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
EXPECT_TRUE(WindowIsAbove(w1.get(), w3.get()));
EXPECT_TRUE(WindowIsAbove(w2.get(), w3.get()));
EXPECT_TRUE(WindowIsAbove(w2.get(), w1.get()));
@@ -179,7 +195,6 @@ TEST_F(PanelLayoutManagerTest, MultiplePanelCallout) {
EXPECT_NO_FATAL_FAILURE(IsCalloutAbovePanel(w3.get()));
w3.reset();
EXPECT_FALSE(IsCalloutVisible());
-
}
// Tests removing panels.
@@ -191,6 +206,7 @@ TEST_F(PanelLayoutManagerTest, RemoveLeftPanel) {
// At this point, windows should be stacked with 1 < 2 < 3
wm::ActivateWindow(w1.get());
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
// Now, windows should be stacked 1 > 2 > 3
w1.reset();
EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get()));
@@ -244,5 +260,4 @@ TEST_F(PanelLayoutManagerTest, RemoveNonActivePanel) {
}
} // namespace internal
-
} // namespace ash