Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: ui/arc/notification/arc_notification_content_view.cc

Issue 2906323002: Rename ArcCustomNotificationView to ArcNotificationContentView (Closed)
Patch Set: Addressed comments Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/arc/notification/arc_custom_notification_view.h" 5 #include "ui/arc/notification/arc_notification_content_view.h"
6 6
7 #include "ash/wm/window_util.h" 7 #include "ash/wm/window_util.h"
8 #include "base/auto_reset.h" 8 #include "base/auto_reset.h"
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "components/exo/notification_surface.h" 10 #include "components/exo/notification_surface.h"
11 #include "components/exo/surface.h" 11 #include "components/exo/surface.h"
12 #include "ui/accessibility/ax_action_data.h" 12 #include "ui/accessibility/ax_action_data.h"
13 #include "ui/accessibility/ax_node_data.h" 13 #include "ui/accessibility/ax_node_data.h"
14 #include "ui/arc/notification/arc_notification_view.h" 14 #include "ui/arc/notification/arc_notification_view.h"
15 #include "ui/base/l10n/l10n_util.h" 15 #include "ui/base/l10n/l10n_util.h"
(...skipping 26 matching lines...) Expand all
42 SkColor GetControlButtonBackgroundColor( 42 SkColor GetControlButtonBackgroundColor(
43 const mojom::ArcNotificationShownContents& shown_contents) { 43 const mojom::ArcNotificationShownContents& shown_contents) {
44 if (shown_contents == mojom::ArcNotificationShownContents::CONTENTS_SHOWN) 44 if (shown_contents == mojom::ArcNotificationShownContents::CONTENTS_SHOWN)
45 return message_center::kControlButtonBackgroundColor; 45 return message_center::kControlButtonBackgroundColor;
46 else 46 else
47 return SK_ColorTRANSPARENT; 47 return SK_ColorTRANSPARENT;
48 } 48 }
49 49
50 } // namespace 50 } // namespace
51 51
52 class ArcCustomNotificationView::EventForwarder : public ui::EventHandler { 52 class ArcNotificationContentView::EventForwarder : public ui::EventHandler {
53 public: 53 public:
54 explicit EventForwarder(ArcCustomNotificationView* owner) : owner_(owner) {} 54 explicit EventForwarder(ArcNotificationContentView* owner) : owner_(owner) {}
55 ~EventForwarder() override = default; 55 ~EventForwarder() override = default;
56 56
57 private: 57 private:
58 // ui::EventHandler 58 // ui::EventHandler
59 void OnEvent(ui::Event* event) override { 59 void OnEvent(ui::Event* event) override {
60 // Do not forward event targeted to the floating close button so that 60 // Do not forward event targeted to the floating close button so that
61 // keyboard press and tap are handled properly. 61 // keyboard press and tap are handled properly.
62 if (owner_->floating_control_buttons_widget_ && event->target() && 62 if (owner_->floating_control_buttons_widget_ && event->target() &&
63 owner_->floating_control_buttons_widget_->GetNativeWindow() == 63 owner_->floating_control_buttons_widget_->GetNativeWindow() ==
64 event->target()) { 64 event->target()) {
(...skipping 25 matching lines...) Expand all
90 widget->OnMouseEvent(located_event->AsMouseEvent()); 90 widget->OnMouseEvent(located_event->AsMouseEvent());
91 } else if (located_event->IsScrollEvent()) { 91 } else if (located_event->IsScrollEvent()) {
92 widget->OnScrollEvent(located_event->AsScrollEvent()); 92 widget->OnScrollEvent(located_event->AsScrollEvent());
93 } else if (located_event->IsGestureEvent() && 93 } else if (located_event->IsGestureEvent() &&
94 event->type() != ui::ET_GESTURE_TAP) { 94 event->type() != ui::ET_GESTURE_TAP) {
95 widget->OnGestureEvent(located_event->AsGestureEvent()); 95 widget->OnGestureEvent(located_event->AsGestureEvent());
96 } 96 }
97 } 97 }
98 } 98 }
99 99
100 ArcCustomNotificationView* const owner_; 100 ArcNotificationContentView* const owner_;
101 101
102 DISALLOW_COPY_AND_ASSIGN(EventForwarder); 102 DISALLOW_COPY_AND_ASSIGN(EventForwarder);
103 }; 103 };
104 104
105 class ArcCustomNotificationView::SlideHelper 105 class ArcNotificationContentView::SlideHelper
106 : public ui::LayerAnimationObserver { 106 : public ui::LayerAnimationObserver {
107 public: 107 public:
108 explicit SlideHelper(ArcCustomNotificationView* owner) : owner_(owner) { 108 explicit SlideHelper(ArcNotificationContentView* owner) : owner_(owner) {
109 GetSlideOutLayer()->GetAnimator()->AddObserver(this); 109 GetSlideOutLayer()->GetAnimator()->AddObserver(this);
110 110
111 // Reset opacity to 1 to handle to case when the surface is sliding before 111 // Reset opacity to 1 to handle to case when the surface is sliding before
112 // getting managed by this class, e.g. sliding in a popup before showing 112 // getting managed by this class, e.g. sliding in a popup before showing
113 // in a message center view. 113 // in a message center view.
114 if (owner_->surface_ && owner_->surface_->window()) 114 if (owner_->surface_ && owner_->surface_->window())
115 owner_->surface_->window()->layer()->SetOpacity(1.0f); 115 owner_->surface_->window()->layer()->SetOpacity(1.0f);
116 } 116 }
117 ~SlideHelper() override { 117 ~SlideHelper() override {
118 if (GetSlideOutLayer()) 118 if (GetSlideOutLayer())
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 162
163 // ui::LayerAnimationObserver 163 // ui::LayerAnimationObserver
164 void OnLayerAnimationEnded(ui::LayerAnimationSequence* seq) override { 164 void OnLayerAnimationEnded(ui::LayerAnimationSequence* seq) override {
165 Update(); 165 Update();
166 } 166 }
167 void OnLayerAnimationAborted(ui::LayerAnimationSequence* seq) override { 167 void OnLayerAnimationAborted(ui::LayerAnimationSequence* seq) override {
168 Update(); 168 Update();
169 } 169 }
170 void OnLayerAnimationScheduled(ui::LayerAnimationSequence* seq) override {} 170 void OnLayerAnimationScheduled(ui::LayerAnimationSequence* seq) override {}
171 171
172 ArcCustomNotificationView* const owner_; 172 ArcNotificationContentView* const owner_;
173 bool sliding_ = false; 173 bool sliding_ = false;
174 std::unique_ptr<ui::LayerTreeOwner> surface_copy_; 174 std::unique_ptr<ui::LayerTreeOwner> surface_copy_;
175 175
176 DISALLOW_COPY_AND_ASSIGN(SlideHelper); 176 DISALLOW_COPY_AND_ASSIGN(SlideHelper);
177 }; 177 };
178 178
179 class ArcCustomNotificationView::ContentViewDelegate 179 class ArcNotificationContentView::ContentViewDelegate
180 : public ArcNotificationContentViewDelegate { 180 : public ArcNotificationContentViewDelegate {
181 public: 181 public:
182 explicit ContentViewDelegate(ArcCustomNotificationView* owner) 182 explicit ContentViewDelegate(ArcNotificationContentView* owner)
183 : owner_(owner) {} 183 : owner_(owner) {}
184 184
185 bool IsCloseButtonFocused() const override { 185 bool IsCloseButtonFocused() const override {
186 if (!owner_->close_button_) 186 if (!owner_->close_button_)
187 return false; 187 return false;
188 return owner_->close_button_->HasFocus(); 188 return owner_->close_button_->HasFocus();
189 } 189 }
190 190
191 void RequestFocusOnCloseButton() override { 191 void RequestFocusOnCloseButton() override {
192 if (owner_->close_button_) 192 if (owner_->close_button_)
193 owner_->close_button_->RequestFocus(); 193 owner_->close_button_->RequestFocus();
194 owner_->UpdateControlButtonsVisibility(); 194 owner_->UpdateControlButtonsVisibility();
195 } 195 }
196 196
197 void UpdateControlButtonsVisibility() override { 197 void UpdateControlButtonsVisibility() override {
198 owner_->UpdateControlButtonsVisibility(); 198 owner_->UpdateControlButtonsVisibility();
199 } 199 }
200 200
201 void OnSlideChanged() override { 201 void OnSlideChanged() override {
202 if (owner_->slide_helper_) 202 if (owner_->slide_helper_)
203 owner_->slide_helper_->Update(); 203 owner_->slide_helper_->Update();
204 } 204 }
205 205
206 private: 206 private:
207 ArcCustomNotificationView* const owner_; 207 ArcNotificationContentView* const owner_;
208 208
209 DISALLOW_COPY_AND_ASSIGN(ContentViewDelegate); 209 DISALLOW_COPY_AND_ASSIGN(ContentViewDelegate);
210 }; 210 };
211 211
212 ArcCustomNotificationView::ControlButton::ControlButton( 212 ArcNotificationContentView::ControlButton::ControlButton(
213 ArcCustomNotificationView* owner) 213 ArcNotificationContentView* owner)
214 : message_center::PaddedButton(owner), owner_(owner) { 214 : message_center::PaddedButton(owner), owner_(owner) {
215 if (owner_->item_) { 215 if (owner_->item_) {
216 set_background(views::Background::CreateSolidBackground( 216 set_background(views::Background::CreateSolidBackground(
217 GetControlButtonBackgroundColor(owner_->item_->GetShownContents()))); 217 GetControlButtonBackgroundColor(owner_->item_->GetShownContents())));
218 } else { 218 } else {
219 set_background(views::Background::CreateSolidBackground( 219 set_background(views::Background::CreateSolidBackground(
220 message_center::kControlButtonBackgroundColor)); 220 message_center::kControlButtonBackgroundColor));
221 } 221 }
222 } 222 }
223 223
224 void ArcCustomNotificationView::ControlButton::OnFocus() { 224 void ArcNotificationContentView::ControlButton::OnFocus() {
225 message_center::PaddedButton::OnFocus(); 225 message_center::PaddedButton::OnFocus();
226 owner_->UpdateControlButtonsVisibility(); 226 owner_->UpdateControlButtonsVisibility();
227 } 227 }
228 228
229 void ArcCustomNotificationView::ControlButton::OnBlur() { 229 void ArcNotificationContentView::ControlButton::OnBlur() {
230 message_center::PaddedButton::OnBlur(); 230 message_center::PaddedButton::OnBlur();
231 owner_->UpdateControlButtonsVisibility(); 231 owner_->UpdateControlButtonsVisibility();
232 } 232 }
233 233
234 ArcCustomNotificationView::ArcCustomNotificationView(ArcNotificationItem* item) 234 ArcNotificationContentView::ArcNotificationContentView(
235 ArcNotificationItem* item)
235 : item_(item), 236 : item_(item),
236 notification_key_(item->GetNotificationKey()), 237 notification_key_(item->GetNotificationKey()),
237 event_forwarder_(new EventForwarder(this)) { 238 event_forwarder_(new EventForwarder(this)) {
238 SetFocusBehavior(FocusBehavior::ALWAYS); 239 SetFocusBehavior(FocusBehavior::ALWAYS);
239 240
240 item_->IncrementWindowRefCount(); 241 item_->IncrementWindowRefCount();
241 item_->AddObserver(this); 242 item_->AddObserver(this);
242 243
243 auto* surface_manager = ArcNotificationSurfaceManager::Get(); 244 auto* surface_manager = ArcNotificationSurfaceManager::Get();
244 if (surface_manager) { 245 if (surface_manager) {
245 surface_manager->AddObserver(this); 246 surface_manager->AddObserver(this);
246 exo::NotificationSurface* surface = 247 exo::NotificationSurface* surface =
247 surface_manager->GetSurface(notification_key_); 248 surface_manager->GetSurface(notification_key_);
248 if (surface) 249 if (surface)
249 OnNotificationSurfaceAdded(surface); 250 OnNotificationSurfaceAdded(surface);
250 } 251 }
251 252
252 // Create a layer as an anchor to insert surface copy during a slide. 253 // Create a layer as an anchor to insert surface copy during a slide.
253 SetPaintToLayer(); 254 SetPaintToLayer();
254 UpdatePreferredSize(); 255 UpdatePreferredSize();
255 UpdateAccessibleName(); 256 UpdateAccessibleName();
256 } 257 }
257 258
258 ArcCustomNotificationView::~ArcCustomNotificationView() { 259 ArcNotificationContentView::~ArcNotificationContentView() {
259 SetSurface(nullptr); 260 SetSurface(nullptr);
260 261
261 auto* surface_manager = ArcNotificationSurfaceManager::Get(); 262 auto* surface_manager = ArcNotificationSurfaceManager::Get();
262 if (surface_manager) 263 if (surface_manager)
263 surface_manager->RemoveObserver(this); 264 surface_manager->RemoveObserver(this);
264 if (item_) { 265 if (item_) {
265 item_->RemoveObserver(this); 266 item_->RemoveObserver(this);
266 item_->DecrementWindowRefCount(); 267 item_->DecrementWindowRefCount();
267 } 268 }
268 } 269 }
269 270
270 std::unique_ptr<ArcNotificationContentViewDelegate> 271 std::unique_ptr<ArcNotificationContentViewDelegate>
271 ArcCustomNotificationView::CreateContentViewDelegate() { 272 ArcNotificationContentView::CreateContentViewDelegate() {
272 return base::MakeUnique<ArcCustomNotificationView::ContentViewDelegate>(this); 273 return base::MakeUnique<ArcNotificationContentView::ContentViewDelegate>(
274 this);
273 } 275 }
274 276
275 void ArcCustomNotificationView::CreateCloseButton() { 277 void ArcNotificationContentView::CreateCloseButton() {
276 DCHECK(control_buttons_view_); 278 DCHECK(control_buttons_view_);
277 DCHECK(item_); 279 DCHECK(item_);
278 280
279 close_button_ = base::MakeUnique<ControlButton>(this); 281 close_button_ = base::MakeUnique<ControlButton>(this);
280 close_button_->SetImage(views::CustomButton::STATE_NORMAL, 282 close_button_->SetImage(views::CustomButton::STATE_NORMAL,
281 message_center::GetCloseIcon()); 283 message_center::GetCloseIcon());
282 close_button_->SetAccessibleName(l10n_util::GetStringUTF16( 284 close_button_->SetAccessibleName(l10n_util::GetStringUTF16(
283 IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME)); 285 IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_ACCESSIBLE_NAME));
284 close_button_->SetTooltipText(l10n_util::GetStringUTF16( 286 close_button_->SetTooltipText(l10n_util::GetStringUTF16(
285 IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_TOOLTIP)); 287 IDS_MESSAGE_CENTER_CLOSE_NOTIFICATION_BUTTON_TOOLTIP));
286 close_button_->set_owned_by_client(); 288 close_button_->set_owned_by_client();
287 control_buttons_view_->AddChildView(close_button_.get()); 289 control_buttons_view_->AddChildView(close_button_.get());
288 } 290 }
289 291
290 void ArcCustomNotificationView::CreateSettingsButton() { 292 void ArcNotificationContentView::CreateSettingsButton() {
291 DCHECK(control_buttons_view_); 293 DCHECK(control_buttons_view_);
292 DCHECK(item_); 294 DCHECK(item_);
293 295
294 settings_button_ = new ControlButton(this); 296 settings_button_ = new ControlButton(this);
295 settings_button_->SetImage(views::CustomButton::STATE_NORMAL, 297 settings_button_->SetImage(views::CustomButton::STATE_NORMAL,
296 message_center::GetSettingsIcon()); 298 message_center::GetSettingsIcon());
297 settings_button_->SetAccessibleName(l10n_util::GetStringUTF16( 299 settings_button_->SetAccessibleName(l10n_util::GetStringUTF16(
298 IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME)); 300 IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME));
299 settings_button_->SetTooltipText(l10n_util::GetStringUTF16( 301 settings_button_->SetTooltipText(l10n_util::GetStringUTF16(
300 IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME)); 302 IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME));
301 control_buttons_view_->AddChildView(settings_button_); 303 control_buttons_view_->AddChildView(settings_button_);
302 } 304 }
303 305
304 void ArcCustomNotificationView::MaybeCreateFloatingControlButtons() { 306 void ArcNotificationContentView::MaybeCreateFloatingControlButtons() {
305 // Floating close button is a transient child of |surface_| and also part 307 // Floating close button is a transient child of |surface_| and also part
306 // of the hosting widget's focus chain. It could only be created when both 308 // of the hosting widget's focus chain. It could only be created when both
307 // are present. Further, if we are being destroyed (|item_| is null), don't 309 // are present. Further, if we are being destroyed (|item_| is null), don't
308 // create the control buttons. 310 // create the control buttons.
309 if (!surface_ || !GetWidget() || !item_) 311 if (!surface_ || !GetWidget() || !item_)
310 return; 312 return;
311 313
312 // Creates the control_buttons_view_, which collects all control buttons into 314 // Creates the control_buttons_view_, which collects all control buttons into
313 // a horizontal box. 315 // a horizontal box.
314 control_buttons_view_ = new views::View(); 316 control_buttons_view_ = new views::View();
(...skipping 15 matching lines...) Expand all
330 floating_control_buttons_widget_->SetContentsView(control_buttons_view_); 332 floating_control_buttons_widget_->SetContentsView(control_buttons_view_);
331 333
332 // Put the close button into the focus chain. 334 // Put the close button into the focus chain.
333 floating_control_buttons_widget_->SetFocusTraversableParent( 335 floating_control_buttons_widget_->SetFocusTraversableParent(
334 GetWidget()->GetFocusTraversable()); 336 GetWidget()->GetFocusTraversable());
335 floating_control_buttons_widget_->SetFocusTraversableParentView(this); 337 floating_control_buttons_widget_->SetFocusTraversableParentView(this);
336 338
337 Layout(); 339 Layout();
338 } 340 }
339 341
340 void ArcCustomNotificationView::SetSurface(exo::NotificationSurface* surface) { 342 void ArcNotificationContentView::SetSurface(exo::NotificationSurface* surface) {
341 if (surface_ == surface) 343 if (surface_ == surface)
342 return; 344 return;
343 345
344 // Reset |floating_control_buttons_widget_| when |surface_| is changed. 346 // Reset |floating_control_buttons_widget_| when |surface_| is changed.
345 floating_control_buttons_widget_.reset(); 347 floating_control_buttons_widget_.reset();
346 control_buttons_view_ = nullptr; 348 control_buttons_view_ = nullptr;
347 settings_button_ = nullptr; 349 settings_button_ = nullptr;
348 close_button_.reset(); 350 close_button_.reset();
349 351
350 if (surface_ && surface_->window()) { 352 if (surface_ && surface_->window()) {
351 surface_->window()->RemoveObserver(this); 353 surface_->window()->RemoveObserver(this);
352 surface_->window()->RemovePreTargetHandler(event_forwarder_.get()); 354 surface_->window()->RemovePreTargetHandler(event_forwarder_.get());
353 } 355 }
354 356
355 surface_ = surface; 357 surface_ = surface;
356 358
357 if (surface_ && surface_->window()) { 359 if (surface_ && surface_->window()) {
358 surface_->window()->AddObserver(this); 360 surface_->window()->AddObserver(this);
359 surface_->window()->AddPreTargetHandler(event_forwarder_.get()); 361 surface_->window()->AddPreTargetHandler(event_forwarder_.get());
360 362
361 MaybeCreateFloatingControlButtons(); 363 MaybeCreateFloatingControlButtons();
362 364
363 if (GetWidget()) 365 if (GetWidget())
364 AttachSurface(); 366 AttachSurface();
365 } 367 }
366 } 368 }
367 369
368 void ArcCustomNotificationView::UpdatePreferredSize() { 370 void ArcNotificationContentView::UpdatePreferredSize() {
369 gfx::Size preferred_size; 371 gfx::Size preferred_size;
370 if (surface_) 372 if (surface_)
371 preferred_size = surface_->GetSize(); 373 preferred_size = surface_->GetSize();
372 else if (item_) 374 else if (item_)
373 preferred_size = item_->GetSnapshot().size(); 375 preferred_size = item_->GetSnapshot().size();
374 376
375 if (preferred_size.IsEmpty()) 377 if (preferred_size.IsEmpty())
376 return; 378 return;
377 379
378 if (preferred_size.width() != message_center::kNotificationWidth) { 380 if (preferred_size.width() != message_center::kNotificationWidth) {
379 const float scale = static_cast<float>(message_center::kNotificationWidth) / 381 const float scale = static_cast<float>(message_center::kNotificationWidth) /
380 preferred_size.width(); 382 preferred_size.width();
381 preferred_size.SetSize(message_center::kNotificationWidth, 383 preferred_size.SetSize(message_center::kNotificationWidth,
382 preferred_size.height() * scale); 384 preferred_size.height() * scale);
383 } 385 }
384 386
385 SetPreferredSize(preferred_size); 387 SetPreferredSize(preferred_size);
386 } 388 }
387 389
388 void ArcCustomNotificationView::UpdateControlButtonsVisibility() { 390 void ArcNotificationContentView::UpdateControlButtonsVisibility() {
389 if (!surface_) 391 if (!surface_)
390 return; 392 return;
391 393
392 // TODO(edcourtney, yhanada): Creating the floating control widget here is not 394 // TODO(edcourtney, yhanada): Creating the floating control widget here is not
393 // correct. This function may be called during the destruction of 395 // correct. This function may be called during the destruction of
394 // |floating_control_buttons_widget_|. This can lead to memory corruption. 396 // |floating_control_buttons_widget_|. This can lead to memory corruption.
395 // Rather than creating it here, we should fix the behaviour of OnMouseExited 397 // Rather than creating it here, we should fix the behaviour of OnMouseExited
396 // and OnMouseEntered for ARC notifications in MessageCenterView. See 398 // and OnMouseEntered for ARC notifications in MessageCenterView. See
397 // crbug.com/714587 and crbug.com/709862. 399 // crbug.com/714587 and crbug.com/709862.
398 if (!floating_control_buttons_widget_) { 400 if (!floating_control_buttons_widget_) {
399 // This may update |floating_control_buttons_widget_|. 401 // This may update |floating_control_buttons_widget_|.
400 MaybeCreateFloatingControlButtons(); 402 MaybeCreateFloatingControlButtons();
401 if (!floating_control_buttons_widget_) 403 if (!floating_control_buttons_widget_)
402 return; 404 return;
403 } 405 }
404 406
405 const bool target_visiblity = 407 const bool target_visiblity =
406 IsMouseHovered() || (close_button_ && close_button_->HasFocus()) || 408 IsMouseHovered() || (close_button_ && close_button_->HasFocus()) ||
407 (settings_button_ && settings_button_->HasFocus()); 409 (settings_button_ && settings_button_->HasFocus());
408 if (target_visiblity == floating_control_buttons_widget_->IsVisible()) 410 if (target_visiblity == floating_control_buttons_widget_->IsVisible())
409 return; 411 return;
410 412
411 if (target_visiblity) 413 if (target_visiblity)
412 floating_control_buttons_widget_->Show(); 414 floating_control_buttons_widget_->Show();
413 else 415 else
414 floating_control_buttons_widget_->Hide(); 416 floating_control_buttons_widget_->Hide();
415 } 417 }
416 418
417 void ArcCustomNotificationView::UpdatePinnedState() { 419 void ArcNotificationContentView::UpdatePinnedState() {
418 if (!item_) 420 if (!item_)
419 return; 421 return;
420 422
421 if (item_->GetPinned() && close_button_) { 423 if (item_->GetPinned() && close_button_) {
422 control_buttons_view_->RemoveChildView(close_button_.get()); 424 control_buttons_view_->RemoveChildView(close_button_.get());
423 close_button_.reset(); 425 close_button_.reset();
424 Layout(); 426 Layout();
425 } else if (!item_->GetPinned() && !close_button_) { 427 } else if (!item_->GetPinned() && !close_button_) {
426 CreateCloseButton(); 428 CreateCloseButton();
427 Layout(); 429 Layout();
428 } 430 }
429 } 431 }
430 432
431 void ArcCustomNotificationView::UpdateSnapshot() { 433 void ArcNotificationContentView::UpdateSnapshot() {
432 // Bail if we have a |surface_| because it controls the sizes and paints UI. 434 // Bail if we have a |surface_| because it controls the sizes and paints UI.
433 if (surface_) 435 if (surface_)
434 return; 436 return;
435 437
436 UpdatePreferredSize(); 438 UpdatePreferredSize();
437 SchedulePaint(); 439 SchedulePaint();
438 } 440 }
439 441
440 void ArcCustomNotificationView::AttachSurface() { 442 void ArcNotificationContentView::AttachSurface() {
441 if (!GetWidget()) 443 if (!GetWidget())
442 return; 444 return;
443 445
444 UpdatePreferredSize(); 446 UpdatePreferredSize();
445 Attach(surface_->window()); 447 Attach(surface_->window());
446 448
447 // The texture for this window can be placed at subpixel position 449 // The texture for this window can be placed at subpixel position
448 // with fractional scale factor. Force to align it at the pixel 450 // with fractional scale factor. Force to align it at the pixel
449 // boundary here, and when layout is updated in Layout(). 451 // boundary here, and when layout is updated in Layout().
450 ash::wm::SnapWindowToPixelBoundary(surface_->window()); 452 ash::wm::SnapWindowToPixelBoundary(surface_->window());
451 453
452 // Creates slide helper after this view is added to its parent. 454 // Creates slide helper after this view is added to its parent.
453 slide_helper_.reset(new SlideHelper(this)); 455 slide_helper_.reset(new SlideHelper(this));
454 456
455 // Invokes Update() in case surface is attached during a slide. 457 // Invokes Update() in case surface is attached during a slide.
456 slide_helper_->Update(); 458 slide_helper_->Update();
457 459
458 // Updates pinned state to create or destroy the floating close button 460 // Updates pinned state to create or destroy the floating close button
459 // after |surface_| is attached to a widget. 461 // after |surface_| is attached to a widget.
460 if (item_) 462 if (item_)
461 UpdatePinnedState(); 463 UpdatePinnedState();
462 } 464 }
463 465
464 void ArcCustomNotificationView::StartControlButtonsColorAnimation() { 466 void ArcNotificationContentView::StartControlButtonsColorAnimation() {
465 if (control_button_color_animation_) 467 if (control_button_color_animation_)
466 control_button_color_animation_->End(); 468 control_button_color_animation_->End();
467 control_button_color_animation_.reset(new gfx::LinearAnimation(this)); 469 control_button_color_animation_.reset(new gfx::LinearAnimation(this));
468 control_button_color_animation_->SetDuration(kBackgroundColorChangeDuration); 470 control_button_color_animation_->SetDuration(kBackgroundColorChangeDuration);
469 control_button_color_animation_->Start(); 471 control_button_color_animation_->Start();
470 } 472 }
471 473
472 bool ArcCustomNotificationView::ShouldUpdateControlButtonsColor() const { 474 bool ArcNotificationContentView::ShouldUpdateControlButtonsColor() const {
473 // Don't update the control button color when we are about to be destroyed. 475 // Don't update the control button color when we are about to be destroyed.
474 if (!item_) 476 if (!item_)
475 return false; 477 return false;
476 478
477 if (settings_button_ && 479 if (settings_button_ &&
478 settings_button_->background()->get_color() != 480 settings_button_->background()->get_color() !=
479 GetControlButtonBackgroundColor(item_->GetShownContents())) 481 GetControlButtonBackgroundColor(item_->GetShownContents()))
480 return true; 482 return true;
481 if (close_button_ && 483 if (close_button_ &&
482 close_button_->background()->get_color() != 484 close_button_->background()->get_color() !=
483 GetControlButtonBackgroundColor(item_->GetShownContents())) 485 GetControlButtonBackgroundColor(item_->GetShownContents()))
484 return true; 486 return true;
485 return false; 487 return false;
486 } 488 }
487 489
488 void ArcCustomNotificationView::UpdateAccessibleName() { 490 void ArcNotificationContentView::UpdateAccessibleName() {
489 // Don't update the accessible name when we are about to be destroyed. 491 // Don't update the accessible name when we are about to be destroyed.
490 if (!item_) 492 if (!item_)
491 return; 493 return;
492 494
493 accessible_name_ = item_->GetAccessibleName(); 495 accessible_name_ = item_->GetAccessibleName();
494 } 496 }
495 497
496 void ArcCustomNotificationView::ViewHierarchyChanged( 498 void ArcNotificationContentView::ViewHierarchyChanged(
497 const views::View::ViewHierarchyChangedDetails& details) { 499 const views::View::ViewHierarchyChangedDetails& details) {
498 views::Widget* widget = GetWidget(); 500 views::Widget* widget = GetWidget();
499 501
500 if (!details.is_add) { 502 if (!details.is_add) {
501 // Resets slide helper when this view is removed from its parent. 503 // Resets slide helper when this view is removed from its parent.
502 slide_helper_.reset(); 504 slide_helper_.reset();
503 505
504 // Bail if this view is no longer attached to a widget or native_view() has 506 // Bail if this view is no longer attached to a widget or native_view() has
505 // attached to a different widget. 507 // attached to a different widget.
506 if (!widget || (native_view() && 508 if (!widget ||
507 views::Widget::GetTopLevelWidgetForNativeView( 509 (native_view() && views::Widget::GetTopLevelWidgetForNativeView(
508 native_view()) != widget)) { 510 native_view()) != widget)) {
509 return; 511 return;
510 } 512 }
511 } 513 }
512 514
513 views::NativeViewHost::ViewHierarchyChanged(details); 515 views::NativeViewHost::ViewHierarchyChanged(details);
514 516
515 if (!widget || !surface_ || !details.is_add) 517 if (!widget || !surface_ || !details.is_add)
516 return; 518 return;
517 519
518 AttachSurface(); 520 AttachSurface();
519 } 521 }
520 522
521 void ArcCustomNotificationView::Layout() { 523 void ArcNotificationContentView::Layout() {
522 base::AutoReset<bool> auto_reset_in_layout(&in_layout_, true); 524 base::AutoReset<bool> auto_reset_in_layout(&in_layout_, true);
523 525
524 views::NativeViewHost::Layout(); 526 views::NativeViewHost::Layout();
525 527
526 if (!surface_ || !GetWidget()) 528 if (!surface_ || !GetWidget())
527 return; 529 return;
528 530
529 const gfx::Rect contents_bounds = GetContentsBounds(); 531 const gfx::Rect contents_bounds = GetContentsBounds();
530 532
531 // Scale notification surface if necessary. 533 // Scale notification surface if necessary.
(...skipping 30 matching lines...) Expand all
562 message_center::kControlButtonPadding); 564 message_center::kControlButtonPadding);
563 control_buttons_bounds.set_width(buttons_width); 565 control_buttons_bounds.set_width(buttons_width);
564 control_buttons_bounds.set_height(buttons_height); 566 control_buttons_bounds.set_height(buttons_height);
565 floating_control_buttons_widget_->SetBounds(control_buttons_bounds); 567 floating_control_buttons_widget_->SetBounds(control_buttons_bounds);
566 568
567 UpdateControlButtonsVisibility(); 569 UpdateControlButtonsVisibility();
568 570
569 ash::wm::SnapWindowToPixelBoundary(surface_->window()); 571 ash::wm::SnapWindowToPixelBoundary(surface_->window());
570 } 572 }
571 573
572 void ArcCustomNotificationView::OnPaint(gfx::Canvas* canvas) { 574 void ArcNotificationContentView::OnPaint(gfx::Canvas* canvas) {
573 views::NativeViewHost::OnPaint(canvas); 575 views::NativeViewHost::OnPaint(canvas);
574 576
575 // Bail if there is a |surface_| or no item or no snapshot image. 577 // Bail if there is a |surface_| or no item or no snapshot image.
576 if (surface_ || !item_ || item_->GetSnapshot().isNull()) 578 if (surface_ || !item_ || item_->GetSnapshot().isNull())
577 return; 579 return;
578 const gfx::Rect contents_bounds = GetContentsBounds(); 580 const gfx::Rect contents_bounds = GetContentsBounds();
579 canvas->DrawImageInt(item_->GetSnapshot(), 0, 0, item_->GetSnapshot().width(), 581 canvas->DrawImageInt(item_->GetSnapshot(), 0, 0, item_->GetSnapshot().width(),
580 item_->GetSnapshot().height(), contents_bounds.x(), 582 item_->GetSnapshot().height(), contents_bounds.x(),
581 contents_bounds.y(), contents_bounds.width(), 583 contents_bounds.y(), contents_bounds.width(),
582 contents_bounds.height(), false); 584 contents_bounds.height(), false);
583 } 585 }
584 586
585 void ArcCustomNotificationView::OnMouseEntered(const ui::MouseEvent&) { 587 void ArcNotificationContentView::OnMouseEntered(const ui::MouseEvent&) {
586 UpdateControlButtonsVisibility(); 588 UpdateControlButtonsVisibility();
587 } 589 }
588 590
589 void ArcCustomNotificationView::OnMouseExited(const ui::MouseEvent&) { 591 void ArcNotificationContentView::OnMouseExited(const ui::MouseEvent&) {
590 UpdateControlButtonsVisibility(); 592 UpdateControlButtonsVisibility();
591 } 593 }
592 594
593 void ArcCustomNotificationView::OnFocus() { 595 void ArcNotificationContentView::OnFocus() {
594 CHECK_EQ(ArcNotificationView::kViewClassName, parent()->GetClassName()); 596 CHECK_EQ(ArcNotificationView::kViewClassName, parent()->GetClassName());
595 597
596 NativeViewHost::OnFocus(); 598 NativeViewHost::OnFocus();
597 static_cast<ArcNotificationView*>(parent())->OnContentFocused(); 599 static_cast<ArcNotificationView*>(parent())->OnContentFocused();
598 } 600 }
599 601
600 void ArcCustomNotificationView::OnBlur() { 602 void ArcNotificationContentView::OnBlur() {
601 if (!parent()) { 603 if (!parent()) {
602 // OnBlur may be called when this view is being removed. 604 // OnBlur may be called when this view is being removed.
603 return; 605 return;
604 } 606 }
605 607
606 CHECK_EQ(ArcNotificationView::kViewClassName, parent()->GetClassName()); 608 CHECK_EQ(ArcNotificationView::kViewClassName, parent()->GetClassName());
607 609
608 NativeViewHost::OnBlur(); 610 NativeViewHost::OnBlur();
609 static_cast<ArcNotificationView*>(parent())->OnContentBlured(); 611 static_cast<ArcNotificationView*>(parent())->OnContentBlured();
610 } 612 }
611 613
612 void ArcCustomNotificationView::ActivateToast() { 614 void ArcNotificationContentView::ActivateToast() {
613 if (message_center::ToastContentsView::kViewClassName == 615 if (message_center::ToastContentsView::kViewClassName ==
614 parent()->parent()->GetClassName()) { 616 parent()->parent()->GetClassName()) {
615 static_cast<message_center::ToastContentsView*>(parent()->parent()) 617 static_cast<message_center::ToastContentsView*>(parent()->parent())
616 ->ActivateToast(); 618 ->ActivateToast();
617 } 619 }
618 } 620 }
619 621
620 views::FocusTraversable* ArcCustomNotificationView::GetFocusTraversable() { 622 views::FocusTraversable* ArcNotificationContentView::GetFocusTraversable() {
621 if (floating_control_buttons_widget_) 623 if (floating_control_buttons_widget_)
622 return static_cast<views::internal::RootView*>( 624 return static_cast<views::internal::RootView*>(
623 floating_control_buttons_widget_->GetRootView()); 625 floating_control_buttons_widget_->GetRootView());
624 return nullptr; 626 return nullptr;
625 } 627 }
626 628
627 bool ArcCustomNotificationView::HandleAccessibleAction( 629 bool ArcNotificationContentView::HandleAccessibleAction(
628 const ui::AXActionData& action_data) { 630 const ui::AXActionData& action_data) {
629 if (item_ && action_data.action == ui::AX_ACTION_DO_DEFAULT) { 631 if (item_ && action_data.action == ui::AX_ACTION_DO_DEFAULT) {
630 item_->ToggleExpansion(); 632 item_->ToggleExpansion();
631 return true; 633 return true;
632 } 634 }
633 return false; 635 return false;
634 } 636 }
635 637
636 void ArcCustomNotificationView::GetAccessibleNodeData( 638 void ArcNotificationContentView::GetAccessibleNodeData(
637 ui::AXNodeData* node_data) { 639 ui::AXNodeData* node_data) {
638 node_data->role = ui::AX_ROLE_BUTTON; 640 node_data->role = ui::AX_ROLE_BUTTON;
639 node_data->SetName(accessible_name_); 641 node_data->SetName(accessible_name_);
640 } 642 }
641 643
642 void ArcCustomNotificationView::ButtonPressed(views::Button* sender, 644 void ArcNotificationContentView::ButtonPressed(views::Button* sender,
643 const ui::Event& event) { 645 const ui::Event& event) {
644 if (item_ && !item_->GetPinned() && sender == close_button_.get()) { 646 if (item_ && !item_->GetPinned() && sender == close_button_.get()) {
645 CHECK_EQ(ArcNotificationView::kViewClassName, parent()->GetClassName()); 647 CHECK_EQ(ArcNotificationView::kViewClassName, parent()->GetClassName());
646 static_cast<ArcNotificationView*>(parent())->OnCloseButtonPressed(); 648 static_cast<ArcNotificationView*>(parent())->OnCloseButtonPressed();
647 } 649 }
648 if (item_ && settings_button_ && sender == settings_button_) { 650 if (item_ && settings_button_ && sender == settings_button_) {
649 item_->OpenSettings(); 651 item_->OpenSettings();
650 } 652 }
651 } 653 }
652 654
653 void ArcCustomNotificationView::OnWindowBoundsChanged( 655 void ArcNotificationContentView::OnWindowBoundsChanged(
654 aura::Window* window, 656 aura::Window* window,
655 const gfx::Rect& old_bounds, 657 const gfx::Rect& old_bounds,
656 const gfx::Rect& new_bounds) { 658 const gfx::Rect& new_bounds) {
657 if (in_layout_) 659 if (in_layout_)
658 return; 660 return;
659 661
660 UpdatePreferredSize(); 662 UpdatePreferredSize();
661 Layout(); 663 Layout();
662 } 664 }
663 665
664 void ArcCustomNotificationView::OnWindowDestroying(aura::Window* window) { 666 void ArcNotificationContentView::OnWindowDestroying(aura::Window* window) {
665 SetSurface(nullptr); 667 SetSurface(nullptr);
666 } 668 }
667 669
668 void ArcCustomNotificationView::OnItemDestroying() { 670 void ArcNotificationContentView::OnItemDestroying() {
669 item_->RemoveObserver(this); 671 item_->RemoveObserver(this);
670 item_ = nullptr; 672 item_ = nullptr;
671 673
672 // Reset |surface_| with |item_| since no one is observing the |surface_| 674 // Reset |surface_| with |item_| since no one is observing the |surface_|
673 // after |item_| is gone and this view should be removed soon. 675 // after |item_| is gone and this view should be removed soon.
674 SetSurface(nullptr); 676 SetSurface(nullptr);
675 } 677 }
676 678
677 void ArcCustomNotificationView::OnItemUpdated() { 679 void ArcNotificationContentView::OnItemUpdated() {
678 UpdateAccessibleName(); 680 UpdateAccessibleName();
679 UpdatePinnedState(); 681 UpdatePinnedState();
680 UpdateSnapshot(); 682 UpdateSnapshot();
681 if (ShouldUpdateControlButtonsColor()) 683 if (ShouldUpdateControlButtonsColor())
682 StartControlButtonsColorAnimation(); 684 StartControlButtonsColorAnimation();
683 } 685 }
684 686
685 void ArcCustomNotificationView::OnNotificationSurfaceAdded( 687 void ArcNotificationContentView::OnNotificationSurfaceAdded(
686 exo::NotificationSurface* surface) { 688 exo::NotificationSurface* surface) {
687 if (surface->notification_id() != notification_key_) 689 if (surface->notification_id() != notification_key_)
688 return; 690 return;
689 691
690 SetSurface(surface); 692 SetSurface(surface);
691 } 693 }
692 694
693 void ArcCustomNotificationView::OnNotificationSurfaceRemoved( 695 void ArcNotificationContentView::OnNotificationSurfaceRemoved(
694 exo::NotificationSurface* surface) { 696 exo::NotificationSurface* surface) {
695 if (surface->notification_id() != notification_key_) 697 if (surface->notification_id() != notification_key_)
696 return; 698 return;
697 699
698 SetSurface(nullptr); 700 SetSurface(nullptr);
699 } 701 }
700 702
701 void ArcCustomNotificationView::AnimationEnded( 703 void ArcNotificationContentView::AnimationEnded(
702 const gfx::Animation* animation) { 704 const gfx::Animation* animation) {
703 DCHECK_EQ(animation, control_button_color_animation_.get()); 705 DCHECK_EQ(animation, control_button_color_animation_.get());
704 control_button_color_animation_.reset(); 706 control_button_color_animation_.reset();
705 } 707 }
706 708
707 void ArcCustomNotificationView::AnimationProgressed( 709 void ArcNotificationContentView::AnimationProgressed(
708 const gfx::Animation* animation) { 710 const gfx::Animation* animation) {
709 DCHECK_EQ(animation, control_button_color_animation_.get()); 711 DCHECK_EQ(animation, control_button_color_animation_.get());
710 712
711 if (item_) { 713 if (item_) {
712 const SkColor target = 714 const SkColor target =
713 GetControlButtonBackgroundColor(item_->GetShownContents()); 715 GetControlButtonBackgroundColor(item_->GetShownContents());
714 const SkColor start = 716 const SkColor start =
715 target == message_center::kControlButtonBackgroundColor 717 target == message_center::kControlButtonBackgroundColor
716 ? SK_ColorTRANSPARENT 718 ? SK_ColorTRANSPARENT
717 : message_center::kControlButtonBackgroundColor; 719 : message_center::kControlButtonBackgroundColor;
718 const SkColor current_color = gfx::Tween::ColorValueBetween( 720 const SkColor current_color = gfx::Tween::ColorValueBetween(
719 animation->GetCurrentValue(), start, target); 721 animation->GetCurrentValue(), start, target);
720 if (settings_button_) { 722 if (settings_button_) {
721 settings_button_->set_background( 723 settings_button_->set_background(
722 views::Background::CreateSolidBackground(current_color)); 724 views::Background::CreateSolidBackground(current_color));
723 settings_button_->SchedulePaint(); 725 settings_button_->SchedulePaint();
724 } 726 }
725 if (close_button_) { 727 if (close_button_) {
726 close_button_->set_background( 728 close_button_->set_background(
727 views::Background::CreateSolidBackground(current_color)); 729 views::Background::CreateSolidBackground(current_color));
728 close_button_->SchedulePaint(); 730 close_button_->SchedulePaint();
729 } 731 }
730 } 732 }
731 } 733 }
732 734
733 } // namespace arc 735 } // namespace arc
OLDNEW
« no previous file with comments | « ui/arc/notification/arc_notification_content_view.h ('k') | ui/arc/notification/arc_notification_delegate.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698