Chromium Code Reviews| Index: ash/frame/custom_frame_view_ash.cc |
| diff --git a/ash/frame/custom_frame_view_ash.cc b/ash/frame/custom_frame_view_ash.cc |
| index a236c1293ad2e40bca8f621cb3b81319836fccc6..c5e947783932cf89ae234b934454877ff13e6fff 100644 |
| --- a/ash/frame/custom_frame_view_ash.cc |
| +++ b/ash/frame/custom_frame_view_ash.cc |
| @@ -23,6 +23,7 @@ |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/gfx/geometry/rect_conversions.h" |
| #include "ui/gfx/geometry/size.h" |
| +#include "ui/gfx/image/image_skia.h" |
| #include "ui/views/view.h" |
| #include "ui/views/view_targeter.h" |
| #include "ui/views/widget/widget.h" |
| @@ -88,12 +89,14 @@ class CustomFrameViewAshWindowStateDelegate : public wm::WindowStateDelegate, |
| } |
| return true; |
| } |
| + |
| // Overridden from aura::WindowObserver: |
| void OnWindowDestroying(aura::Window* window) override { |
| window_state_->RemoveObserver(this); |
| window->RemoveObserver(this); |
| window_state_ = nullptr; |
| } |
| + |
| // Overridden from wm::WindowStateObserver: |
| void OnPostWindowStateTypeChange(wm::WindowState* window_state, |
| wm::WindowStateType old_type) override { |
| @@ -118,6 +121,48 @@ class CustomFrameViewAshWindowStateDelegate : public wm::WindowStateDelegate, |
| bool CustomFrameViewAsh::use_empty_minimum_size_for_test_ = false; |
| /////////////////////////////////////////////////////////////////////////////// |
| +// CustomFrameViewAsh::AvatarObserver |
| + |
| +// AvatarObserver watches the frame window's avatar icon property and updates |
| +// HeaderView with it. |
| +class CustomFrameViewAsh::AvatarObserver : public aura::WindowObserver { |
| + public: |
| + AvatarObserver(views::Widget* frame, HeaderView* header_view) |
| + : frame_window_(frame->GetNativeWindow()), header_view_(header_view) { |
| + frame_window_->AddObserver(this); |
| + } |
| + |
| + ~AvatarObserver() override { |
| + if (frame_window_) |
| + frame_window_->RemoveObserver(this); |
| + } |
| + |
| + // aura::WindowObserver: |
| + void OnWindowPropertyChanged(aura::Window* window, |
| + const void* key, |
| + intptr_t old) override { |
| + DCHECK_EQ(frame_window_, window); |
| + if (key != aura::client::kAvatarIconKey) |
| + return; |
| + |
| + gfx::ImageSkia* const avatar_icon = |
| + frame_window_->GetProperty(aura::client::kAvatarIconKey); |
| + header_view_->SetAvatarIcon(avatar_icon ? *avatar_icon : gfx::ImageSkia()); |
| + } |
| + |
| + void OnWindowDestroyed(aura::Window* window) override { |
| + DCHECK_EQ(frame_window_, window); |
| + frame_window_ = nullptr; |
| + } |
| + |
| + private: |
| + aura::Window* frame_window_; |
| + HeaderView* const header_view_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(AvatarObserver); |
| +}; |
| + |
| +/////////////////////////////////////////////////////////////////////////////// |
| // CustomFrameViewAsh::OverlayView |
| // View which takes up the entire widget and contains the HeaderView. HeaderView |
| @@ -213,7 +258,8 @@ CustomFrameViewAsh::CustomFrameViewAsh( |
| header_view_(new HeaderView(frame, window_style)), |
| overlay_view_(new OverlayView(header_view_)), |
| immersive_delegate_(immersive_delegate ? immersive_delegate |
| - : header_view_) { |
| + : header_view_), |
| + avatar_observer_(new AvatarObserver(frame_, header_view_)) { |
|
James Cook
2017/05/30 21:27:15
nit: base::MakeUnique
xiyuan
2017/05/30 22:44:14
Done.
|
| WmWindow* frame_window = WmWindow::Get(frame->GetNativeWindow()); |
| frame_window->InstallResizeHandleWindowTargeter(nullptr); |
| // |header_view_| is set as the non client view's overlay view so that it can |
| @@ -252,7 +298,7 @@ void CustomFrameViewAsh::SetHeaderHeight(base::Optional<int> height) { |
| overlay_view_->SetHeaderHeight(height); |
| } |
| -views::View* CustomFrameViewAsh::header_view() { |
| +views::View* CustomFrameViewAsh::GetHeaderView() { |
| return header_view_; |
| } |
| @@ -359,16 +405,6 @@ void CustomFrameViewAsh::SchedulePaintInRect(const gfx::Rect& r) { |
| } |
| } |
| -void CustomFrameViewAsh::VisibilityChanged(views::View* starting_from, |
| - bool is_visible) { |
| - if (is_visible) |
| - header_view_->UpdateAvatarIcon(); |
| -} |
| - |
| -views::View* CustomFrameViewAsh::GetHeaderView() { |
| - return header_view_; |
| -} |
| - |
| const views::View* CustomFrameViewAsh::GetAvatarIconViewForTest() const { |
| return header_view_->avatar_icon(); |
| } |