Index: athena/system/system_ui_impl.cc |
diff --git a/athena/system/system_ui_impl.cc b/athena/system/system_ui_impl.cc |
index aa65e5e7fe8666ecdcba500f0a8b6260547dde02..f2e254c5a50a7957df3e3148e66228efb305c33c 100644 |
--- a/athena/system/system_ui_impl.cc |
+++ b/athena/system/system_ui_impl.cc |
@@ -10,19 +10,35 @@ |
#include "athena/system/shutdown_dialog.h" |
#include "athena/system/status_icon_container_view.h" |
#include "athena/system/time_view.h" |
+#include "athena/util/athena_constants.h" |
#include "athena/util/container_priorities.h" |
#include "athena/util/fill_layout_manager.h" |
+#include "athena/wm/public/window_manager.h" |
+#include "athena/wm/public/window_manager_observer.h" |
#include "base/logging.h" |
#include "base/memory/ref_counted.h" |
#include "base/memory/scoped_ptr.h" |
#include "ui/aura/window.h" |
+#include "ui/compositor/closure_animation_observer.h" |
+#include "ui/compositor/layer.h" |
+#include "ui/compositor/scoped_layer_animation_settings.h" |
+#include "ui/gfx/animation/tween.h" |
+#include "ui/gfx/transform.h" |
#include "ui/views/view.h" |
+#include "ui/views/widget/widget.h" |
namespace athena { |
namespace { |
SystemUI* instance = nullptr; |
+void ClearSystemInfo(views::Widget* widget) { |
+ aura::Window* container = widget->GetNativeWindow()->parent(); |
+ container->Hide(); |
+ container->parent()->RemoveChild(container); |
+ delete container; |
+} |
+ |
// View which positions the TimeView on the left and the StatusIconView on the |
// right. |
class SystemInfoView : public views::View { |
@@ -69,15 +85,19 @@ class SystemInfoView : public views::View { |
DISALLOW_COPY_AND_ASSIGN(SystemInfoView); |
}; |
-class SystemUIImpl : public SystemUI { |
+class SystemUIImpl : public SystemUI, public WindowManagerObserver { |
public: |
SystemUIImpl(scoped_refptr<base::TaskRunner> blocking_task_runner) |
: orientation_controller_(new OrientationController()), |
- background_container_(nullptr) { |
+ background_container_(nullptr), |
+ system_info_widget_(nullptr) { |
orientation_controller_->InitWith(blocking_task_runner); |
+ WindowManager::Get()->AddObserver(this); |
} |
~SystemUIImpl() override { |
+ WindowManager::Get()->RemoveObserver(this); |
+ |
// Stops file watching now if exists. Waiting until message loop shutdon |
// leads to FilePathWatcher crash. |
orientation_controller_->Shutdown(); |
@@ -97,14 +117,58 @@ class SystemUIImpl : public SystemUI { |
private: |
// SystemUI: |
- virtual void SetBackgroundImage(const gfx::ImageSkia& image) override { |
+ void SetBackgroundImage(const gfx::ImageSkia& image) override { |
background_controller_->SetImage(image); |
} |
- virtual views::View* CreateSystemInfoView(ColorScheme color_scheme) override { |
- return new SystemInfoView(color_scheme); |
+ // WindowManagerObserver: |
+ void OnOverviewModeEnter() override { |
+ DCHECK(!system_info_widget_); |
+ |
+ ScreenManager* screen_manager = ScreenManager::Get(); |
+ aura::Window* container = screen_manager->CreateContainer( |
+ ScreenManager::ContainerParams("SystemInfo", CP_SYSTEM_INFO)); |
+ |
+ system_info_widget_ = new views::Widget(); |
+ views::Widget::InitParams widget_params( |
+ views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); |
+ widget_params.parent = container; |
+ widget_params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW; |
+ widget_params.bounds = |
+ gfx::Rect(0, 0, container->bounds().width(), kSystemUIHeight); |
+ system_info_widget_->Init(widget_params); |
+ system_info_widget_->SetContentsView( |
+ new SystemInfoView(SystemUI::COLOR_SCHEME_LIGHT)); |
+ system_info_widget_->Show(); |
+ |
+ gfx::Transform transform; |
+ transform.Translate(0, SkMScalar(-kSystemUIHeight)); |
+ system_info_widget_->GetLayer()->SetTransform(transform); |
+ |
+ { |
+ ui::ScopedLayerAnimationSettings settings( |
+ system_info_widget_->GetLayer()->GetAnimator()); |
+ settings.SetTweenType(gfx::Tween::EASE_OUT); |
+ system_info_widget_->GetLayer()->SetTransform(gfx::Transform()); |
+ } |
+ } |
+ |
+ void OnOverviewModeExit() override { |
+ ui::ScopedLayerAnimationSettings settings( |
+ system_info_widget_->GetLayer()->GetAnimator()); |
+ settings.SetTweenType(gfx::Tween::EASE_IN); |
+ gfx::Transform transform; |
+ transform.Translate(0, SkIntToMScalar(-kSystemUIHeight)); |
+ system_info_widget_->GetLayer()->SetTransform(transform); |
+ settings.AddObserver(new ui::ClosureAnimationObserver( |
+ base::Bind(&ClearSystemInfo, system_info_widget_))); |
oshima
2014/11/12 20:35:03
It's probably better to use ScopedHidingAnimatinoS
Jun Mukai
2014/11/12 21:39:58
Removed the the code around here and replaced by u
|
+ system_info_widget_ = nullptr; |
} |
+ void OnSplitViewModeEnter() override {} |
+ |
+ void OnSplitViewModeExit() override {} |
+ |
scoped_ptr<OrientationController> orientation_controller_; |
scoped_ptr<ShutdownDialog> shutdown_dialog_; |
scoped_ptr<BackgroundController> background_controller_; |
@@ -112,12 +176,7 @@ class SystemUIImpl : public SystemUI { |
// The parent container for the background. |
aura::Window* background_container_; |
- // The parent container used by system modal dialogs. |
- aura::Window* system_modal_container_; |
- |
- // The parent container used by system modal dialogs when the login screen is |
- // visible. |
- aura::Window* login_screen_system_modal_container_; |
+ views::Widget* system_info_widget_; |
DISALLOW_COPY_AND_ASSIGN(SystemUIImpl); |
}; |