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

Side by Side Diff: chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view.cc

Issue 2633423004: Displays the calibration complete message to touch calibration and gracefully quits (Closed)
Patch Set: Resolving comments Created 3 years, 11 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 "chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view .h" 5 #include "chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view .h"
6 6
7 #include "ash/display/window_tree_host_manager.h" 7 #include "ash/display/window_tree_host_manager.h"
8 #include "ash/public/cpp/shell_window_ids.h" 8 #include "ash/public/cpp/shell_window_ids.h"
9 #include "ash/resources/vector_icons/vector_icons.h"
9 #include "ash/shell.h" 10 #include "ash/shell.h"
10 #include "ui/aura/window.h" 11 #include "ui/aura/window.h"
11 #include "ui/base/resource/resource_bundle.h" 12 #include "ui/base/resource/resource_bundle.h"
12 #include "ui/compositor/scoped_layer_animation_settings.h" 13 #include "ui/compositor/scoped_layer_animation_settings.h"
13 #include "ui/gfx/animation/linear_animation.h" 14 #include "ui/gfx/animation/linear_animation.h"
14 #include "ui/gfx/animation/throb_animation.h" 15 #include "ui/gfx/animation/throb_animation.h"
15 #include "ui/gfx/canvas.h" 16 #include "ui/gfx/canvas.h"
17 #include "ui/gfx/paint_vector_icon.h"
16 #include "ui/strings/grit/ui_strings.h" 18 #include "ui/strings/grit/ui_strings.h"
17 #include "ui/views/background.h" 19 #include "ui/views/background.h"
18 #include "ui/views/controls/label.h" 20 #include "ui/views/controls/label.h"
19 #include "ui/views/widget/widget.h" 21 #include "ui/views/widget/widget.h"
20 22
21 namespace chromeos { 23 namespace chromeos {
22 24
23 namespace { 25 namespace {
24 26
25 constexpr char kWidgetName[] = "TouchCalibratorOverlay"; 27 constexpr char kWidgetName[] = "TouchCalibratorOverlay";
26 28
27 constexpr int kAnimationFrameRate = 100; 29 constexpr int kAnimationFrameRate = 100;
28 constexpr int kFadeDurationInMs = 150; 30 constexpr int kFadeDurationInMs = 150;
29 constexpr int kPointMoveDurationInMs = 600; 31 constexpr int kPointMoveDurationInMs = 400;
30 constexpr int kPointMoveDurationLongInMs = 700; 32 constexpr int kPointMoveDurationLongInMs = 500;
31 33
32 const SkColor kExitLabelColor = SkColorSetARGBInline(255, 96, 96, 96); 34 const SkColor kExitLabelColor = SkColorSetARGBInline(255, 96, 96, 96);
33 const SkColor kExitLabelShadowColor = SkColorSetARGBInline(255, 11, 11, 11); 35 const SkColor kExitLabelShadowColor = SkColorSetARGBInline(255, 11, 11, 11);
34 constexpr int kExitLabelWidth = 300; 36 constexpr int kExitLabelWidth = 300;
35 constexpr int kExitLabelHeight = 20; 37 constexpr int kExitLabelHeight = 20;
36 38
37 const SkColor kTapHereLabelColor = SK_ColorWHITE; 39 const SkColor kTapHereLabelColor = SK_ColorWHITE;
38 40
39 constexpr int kHintBoxWidth = 298; 41 constexpr int kHintBoxWidth = 298;
40 constexpr int kHintBoxHeight = 180; 42 constexpr int kHintBoxHeight = 180;
41 constexpr int kHintBoxLabelTextSize = 5; 43 constexpr int kHintBoxLabelTextSize = 5;
42 constexpr int kHintBoxSublabelTextSize = 3; 44 constexpr int kHintBoxSublabelTextSize = 3;
43 45
44 constexpr int kThrobberCircleViewWidth = 64; 46 constexpr int kThrobberCircleViewWidth = 64;
45 constexpr float kThrobberCircleRadiusFactor = 3.f / 8.f; 47 constexpr float kThrobberCircleRadiusFactor = 3.f / 8.f;
46 48
49 constexpr int kFinalMessageTransitionDurationMs = 200;
50 constexpr int kCompleteMessageViewWidth = 427;
51 constexpr int kCompleteMessageViewHeight = kThrobberCircleViewWidth;
52 constexpr int kCompleteMessageTextSize = 16;
53
47 constexpr int kTouchPointViewOffset = 100; 54 constexpr int kTouchPointViewOffset = 100;
48 55
49 constexpr int kTapLabelHeight = 48; 56 constexpr int kTapLabelHeight = 48;
50 constexpr int kTapLabelWidth = 80; 57 constexpr int kTapLabelWidth = 80;
51 58
52 const SkColor kHintLabelTextColor = SK_ColorBLACK; 59 const SkColor kHintLabelTextColor = SK_ColorBLACK;
53 const SkColor kHintSublabelTextColor = SkColorSetARGBInline(255, 161, 161, 161); 60 const SkColor kHintSublabelTextColor = SkColorSetARGBInline(255, 161, 161, 161);
54 61
55 const SkColor kInnerCircleColor = SK_ColorWHITE; 62 const SkColor kInnerCircleColor = SK_ColorWHITE;
56 const SkColor kOuterCircleColor = SkColorSetA(kInnerCircleColor, 128); 63 const SkColor kOuterCircleColor = SkColorSetA(kInnerCircleColor, 255 * 0.2);
57 64
58 constexpr int kCircleAnimationDurationMs = 900; 65 constexpr int kCircleAnimationDurationMs = 900;
59 66
60 constexpr int kHintRectBorderRadius = 4; 67 constexpr int kHintRectBorderRadius = 4;
61 68
62 constexpr float kBackgroundFinalOpacity = 0.75f; 69 constexpr float kBackgroundFinalOpacity = 0.75f;
63 70
64 // Returns the initialization params for the widget that contains the touch 71 // Returns the initialization params for the widget that contains the touch
65 // calibrator view. 72 // calibrator view.
66 views::Widget::InitParams GetWidgetParams(aura::Window* root_window) { 73 views::Widget::InitParams GetWidgetParams(aura::Window* root_window) {
(...skipping 13 matching lines...) Expand all
80 // Returns the size of bounding box required for |text| of given |font_list|. 87 // Returns the size of bounding box required for |text| of given |font_list|.
81 gfx::Size GetSizeForString(const base::string16& text, 88 gfx::Size GetSizeForString(const base::string16& text,
82 const gfx::FontList& font_list) { 89 const gfx::FontList& font_list) {
83 int height = 0, width = 0; 90 int height = 0, width = 0;
84 gfx::Canvas::SizeStringInt(text, font_list, &width, &height, 0, 0); 91 gfx::Canvas::SizeStringInt(text, font_list, &width, &height, 0, 0);
85 return gfx::Size(width, height); 92 return gfx::Size(width, height);
86 } 93 }
87 94
88 void AnimateLayerToPosition(views::View* view, 95 void AnimateLayerToPosition(views::View* view,
89 int duration, 96 int duration,
90 gfx::Point end_position) { 97 gfx::Point end_position,
98 float opacity = 1.f) {
91 ui::ScopedLayerAnimationSettings slide_settings(view->layer()->GetAnimator()); 99 ui::ScopedLayerAnimationSettings slide_settings(view->layer()->GetAnimator());
92 slide_settings.SetPreemptionStrategy( 100 slide_settings.SetPreemptionStrategy(
93 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 101 ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
94 slide_settings.SetTransitionDuration( 102 slide_settings.SetTransitionDuration(
95 base::TimeDelta::FromMilliseconds(duration)); 103 base::TimeDelta::FromMilliseconds(duration));
96 view->SetBoundsRect(gfx::Rect(end_position, view->size())); 104 view->SetBoundsRect(gfx::Rect(end_position, view->size()));
105 view->layer()->SetOpacity(opacity);
97 } 106 }
98 107
99 } // namespace 108 } // namespace
100 109
101 // Creates a throbbing animated view with two concentric circles. The radius of 110 // Creates a throbbing animated view with two concentric circles. The radius of
102 // the inner circle is fixed while that of the outer circle oscillates between a 111 // the inner circle is fixed while that of the outer circle oscillates between a
103 // min and max radius. The animation takes |animation_duration| milliseconds 112 // min and max radius. The animation takes |animation_duration| milliseconds
104 // to complete. The center of these circles are at the center of the view 113 // to complete. The center of these circles are at the center of the view
105 // element. 114 // element.
106 class CircularThrobberView : public views::View, public gfx::AnimationDelegate { 115 class CircularThrobberView : public views::View, public gfx::AnimationDelegate {
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 306
298 void HintBox::OnPaint(gfx::Canvas* canvas) { 307 void HintBox::OnPaint(gfx::Canvas* canvas) {
299 canvas->DrawRoundRect(GetLocalBounds(), border_radius_, paint_); 308 canvas->DrawRoundRect(GetLocalBounds(), border_radius_, paint_);
300 canvas->DrawStringRectWithFlags(label_text_, label_font_list_, label_color_, 309 canvas->DrawStringRectWithFlags(label_text_, label_font_list_, label_color_,
301 label_text_bounds_, gfx::Canvas::NO_ELLIPSIS); 310 label_text_bounds_, gfx::Canvas::NO_ELLIPSIS);
302 canvas->DrawStringRectWithFlags(sublabel_text_, sublabel_font_list_, 311 canvas->DrawStringRectWithFlags(sublabel_text_, sublabel_font_list_,
303 sublabel_color_, sublabel_text_bounds_, 312 sublabel_color_, sublabel_text_bounds_,
304 gfx::Canvas::NO_ELLIPSIS); 313 gfx::Canvas::NO_ELLIPSIS);
305 } 314 }
306 315
316 class CompletionMessageView : public views::View {
317 public:
318 CompletionMessageView(const gfx::Rect& bounds, const base::string16& message);
319 ~CompletionMessageView() override;
320
321 // views::View overrides:
322 void OnPaint(gfx::Canvas* canvas) override;
323
324 private:
325 const base::string16 message_;
326 gfx::FontList font_list_;
327
328 gfx::Rect text_bounds_;
329
330 gfx::ImageSkia check_icon_;
331
332 SkPaint paint_;
333
334 DISALLOW_COPY_AND_ASSIGN(CompletionMessageView);
335 };
336
337 CompletionMessageView::CompletionMessageView(const gfx::Rect& bounds,
338 const base::string16& message)
339 : message_(message) {
340 SetBoundsRect(bounds);
341
342 int x_offset = height() * 5.f / 4.f;
343 text_bounds_.SetRect(x_offset, 0, width() - x_offset, height());
344
345 font_list_ = ui::ResourceBundle::GetSharedInstance().GetFontListWithDelta(
346 kCompleteMessageTextSize, gfx::Font::FontStyle::NORMAL,
347 gfx::Font::Weight::NORMAL);
348
349 // crbug/676513 moves this file to src/ash which will require an ash icon
350 // file.
351 check_icon_ = gfx::CreateVectorIcon(ash::kTouchCalibrationCompleteCheckIcon,
352 SK_ColorWHITE);
353
354 paint_.setColor(SK_ColorWHITE);
355 paint_.setStyle(SkPaint::kFill_Style);
356 paint_.setFlags(SkPaint::kAntiAlias_Flag);
357 }
358
359 CompletionMessageView::~CompletionMessageView() {}
360
361 void CompletionMessageView::OnPaint(gfx::Canvas* canvas) {
362 canvas->DrawImageInt(check_icon_, 0, 0);
363
364 // TODO(malaykeshav): Work with elizabethchiu@ to get better UX for RTL.
365 canvas->DrawStringRectWithFlags(
366 message_, font_list_, paint_.getColor(), text_bounds_,
367 gfx::Canvas::TEXT_ALIGN_LEFT | gfx::Canvas::NO_SUBPIXEL_RENDERING);
368 }
369
307 TouchCalibratorView::TouchCalibratorView(const display::Display& target_display, 370 TouchCalibratorView::TouchCalibratorView(const display::Display& target_display,
308 bool is_primary_view) 371 bool is_primary_view)
309 : display_(target_display), 372 : display_(target_display),
310 is_primary_view_(is_primary_view), 373 is_primary_view_(is_primary_view),
311 exit_label_(nullptr), 374 exit_label_(nullptr),
312 tap_label_(nullptr), 375 tap_label_(nullptr),
313 throbber_circle_(nullptr), 376 throbber_circle_(nullptr),
314 hint_box_view_(nullptr), 377 hint_box_view_(nullptr),
315 touch_point_view_(nullptr) { 378 touch_point_view_(nullptr) {
316 aura::Window* root = ash::Shell::GetInstance() 379 aura::Window* root = ash::Shell::GetInstance()
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 touch_point_view_->y() + (tpv_width / 2.f) - (size.height() / 2.f)); 484 touch_point_view_->y() + (tpv_width / 2.f) - (size.height() / 2.f));
422 485
423 HintBox* hint_box = 486 HintBox* hint_box =
424 new HintBox(gfx::Rect(position, size), kHintRectBorderRadius); 487 new HintBox(gfx::Rect(position, size), kHintRectBorderRadius);
425 hint_box->SetVisible(false); 488 hint_box->SetVisible(false);
426 hint_box->SetLabel(hint_label_text, kHintLabelTextColor); 489 hint_box->SetLabel(hint_label_text, kHintLabelTextColor);
427 hint_box->SetSubLabel(hint_sublabel_text, kHintSublabelTextColor); 490 hint_box->SetSubLabel(hint_sublabel_text, kHintSublabelTextColor);
428 hint_box_view_ = hint_box; 491 hint_box_view_ = hint_box;
429 492
430 AddChildView(hint_box_view_); 493 AddChildView(hint_box_view_);
494
495 // Initialize the view that contains the calibration complete message which
496 // will be displayed at the end.
497 base::string16 finish_msg_text =
498 rb.GetLocalizedString(IDS_DISPLAY_TOUCH_CALIBRATION_FINISH_LABEL);
499
500 gfx::Rect msg_view_bounds(
501 (display_.bounds().width() - kCompleteMessageViewWidth) / 2,
502 display_.bounds().height() / 3, kCompleteMessageViewWidth,
503 kCompleteMessageViewHeight);
504 completion_message_view_ =
505 new CompletionMessageView(msg_view_bounds, finish_msg_text);
506 completion_message_view_->SetVisible(false);
507 completion_message_view_->SetPaintToLayer(true);
508 completion_message_view_->layer()->SetFillsBoundsOpaquely(false);
509 completion_message_view_->layer()->GetAnimator()->AddObserver(this);
510 completion_message_view_->set_background(
511 views::Background::CreateSolidBackground(SK_ColorTRANSPARENT));
512
513 AddChildView(completion_message_view_);
431 } 514 }
432 515
433 void TouchCalibratorView::OnPaint(gfx::Canvas* canvas) { 516 void TouchCalibratorView::OnPaint(gfx::Canvas* canvas) {
434 OnPaintBackground(canvas); 517 OnPaintBackground(canvas);
435 } 518 }
436 519
437 void TouchCalibratorView::OnPaintBackground(gfx::Canvas* canvas) { 520 void TouchCalibratorView::OnPaintBackground(gfx::Canvas* canvas) {
438 float opacity; 521 float opacity;
439 522
440 // If current state is a fade in or fade out state then update opacity 523 // If current state is a fade in or fade out state then update opacity
(...skipping 25 matching lines...) Expand all
466 void TouchCalibratorView::AnimationEnded(const gfx::Animation* animation) { 549 void TouchCalibratorView::AnimationEnded(const gfx::Animation* animation) {
467 switch (state_) { 550 switch (state_) {
468 case BACKGROUND_FADING_IN: 551 case BACKGROUND_FADING_IN:
469 exit_label_->SetVisible(true); 552 exit_label_->SetVisible(true);
470 state_ = is_primary_view_ ? DISPLAY_POINT_1 : CALIBRATION_COMPLETE; 553 state_ = is_primary_view_ ? DISPLAY_POINT_1 : CALIBRATION_COMPLETE;
471 if (is_primary_view_) { 554 if (is_primary_view_) {
472 touch_point_view_->SetVisible(true); 555 touch_point_view_->SetVisible(true);
473 hint_box_view_->SetVisible(true); 556 hint_box_view_->SetVisible(true);
474 } 557 }
475 break; 558 break;
559 case BACKGROUND_FADING_OUT:
560 exit_label_->SetVisible(false);
561 if (is_primary_view_)
562 completion_message_view_->SetVisible(false);
563 widget_->Hide();
564 break;
476 default: 565 default:
477 break; 566 break;
478 } 567 }
479 } 568 }
480 569
481 void TouchCalibratorView::OnLayerAnimationStarted( 570 void TouchCalibratorView::OnLayerAnimationStarted(
482 ui::LayerAnimationSequence* sequence) {} 571 ui::LayerAnimationSequence* sequence) {}
483 572
484 void TouchCalibratorView::OnLayerAnimationEnded( 573 void TouchCalibratorView::OnLayerAnimationEnded(
485 ui::LayerAnimationSequence* sequence) { 574 ui::LayerAnimationSequence* sequence) {
486 switch (state_) { 575 switch (state_) {
487 case ANIMATING_1_TO_2: 576 case ANIMATING_1_TO_2:
488 state_ = DISPLAY_POINT_2; 577 state_ = DISPLAY_POINT_2;
489 tap_label_->SetVisible(true); 578 tap_label_->SetVisible(true);
490 break; 579 break;
491 case ANIMATING_2_TO_3: 580 case ANIMATING_2_TO_3:
492 state_ = DISPLAY_POINT_3; 581 state_ = DISPLAY_POINT_3;
493 break; 582 break;
494 case ANIMATING_3_TO_4: 583 case ANIMATING_3_TO_4:
495 state_ = DISPLAY_POINT_4; 584 state_ = DISPLAY_POINT_4;
496 break; 585 break;
586 case ANIMATING_FINAL_MESSAGE:
587 state_ = CALIBRATION_COMPLETE;
588 break;
497 default: 589 default:
498 break; 590 break;
499 } 591 }
500 } 592 }
501 593
502 void TouchCalibratorView::OnLayerAnimationAborted( 594 void TouchCalibratorView::OnLayerAnimationAborted(
503 ui::LayerAnimationSequence* sequence) { 595 ui::LayerAnimationSequence* sequence) {
504 OnLayerAnimationEnded(sequence); 596 OnLayerAnimationEnded(sequence);
505 } 597 }
506 598
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 state_ = ANIMATING_3_TO_4; 641 state_ = ANIMATING_3_TO_4;
550 642
551 // The touch point has to be animated from the bottom left corner of the 643 // The touch point has to be animated from the bottom left corner of the
552 // screen to the bottom right corner. 644 // screen to the bottom right corner.
553 AnimateLayerToPosition( 645 AnimateLayerToPosition(
554 touch_point_view_, kPointMoveDurationInMs, 646 touch_point_view_, kPointMoveDurationInMs,
555 gfx::Point(display_.bounds().width() - kTouchPointViewOffset - 647 gfx::Point(display_.bounds().width() - kTouchPointViewOffset -
556 touch_point_view_->width(), 648 touch_point_view_->width(),
557 touch_point_view_->y())); 649 touch_point_view_->y()));
558 return; 650 return;
651 case DISPLAY_POINT_4:
652 state_ = ANIMATING_FINAL_MESSAGE;
653 completion_message_view_->layer()->SetOpacity(0.f);
654 completion_message_view_->SetVisible(true);
655
656 touch_point_view_->SetVisible(false);
657
658 AnimateLayerToPosition(completion_message_view_,
659 kFinalMessageTransitionDurationMs,
660 gfx::Point(completion_message_view_->x(),
661 display_.bounds().height() / 2));
662 return;
663 case CALIBRATION_COMPLETE:
664 state_ = BACKGROUND_FADING_OUT;
665 if (is_primary_view_) {
666 // In case of primary view, we also need to fade out the calibration
667 // complete message view.
668 AnimateLayerToPosition(
669 completion_message_view_, kFadeDurationInMs,
670 gfx::Point(completion_message_view_->x(),
671 completion_message_view_->y() +
672 2 * completion_message_view_->height()),
673 0.f);
674 }
675
676 start_opacity_value_ = kBackgroundFinalOpacity;
677 end_opacity_value_ = 0.f;
678
679 paint_.setStyle(SkPaint::kFill_Style);
680 animator_->SetDuration(kFadeDurationInMs);
681 animator_->Start();
682 return;
559 default: 683 default:
560 return; 684 return;
561 } 685 }
562 } 686 }
563 687
564 bool TouchCalibratorView::GetDisplayPointLocation(gfx::Point* location) { 688 bool TouchCalibratorView::GetDisplayPointLocation(gfx::Point* location) {
565 DCHECK(location); 689 DCHECK(location);
566 if (!is_primary_view_) 690 if (!is_primary_view_)
567 return false; 691 return false;
568 692
569 if (state_ != DISPLAY_POINT_1 && state_ != DISPLAY_POINT_2 && 693 if (state_ != DISPLAY_POINT_1 && state_ != DISPLAY_POINT_2 &&
570 state_ != DISPLAY_POINT_3 && state_ != DISPLAY_POINT_4) { 694 state_ != DISPLAY_POINT_3 && state_ != DISPLAY_POINT_4) {
571 return false; 695 return false;
572 } 696 }
573 697
574 if (!touch_point_view_ || !throbber_circle_) 698 if (!touch_point_view_ || !throbber_circle_)
575 return false; 699 return false;
576 // TODO(malaykeshav): Can use views::ConvertPointToScreen() 700 // TODO(malaykeshav): Can use views::ConvertPointToScreen()
577 location->SetPoint(touch_point_view_->x() + touch_point_view_->width() / 2.f, 701 location->SetPoint(touch_point_view_->x() + touch_point_view_->width() / 2.f,
578 touch_point_view_->y() + touch_point_view_->width() / 2.f); 702 touch_point_view_->y() + touch_point_view_->width() / 2.f);
579 return true; 703 return true;
580 } 704 }
581 705
582 void TouchCalibratorView::SkipToFinalState() {} 706 void TouchCalibratorView::SkipToFinalState() {
707 state_ = CALIBRATION_COMPLETE;
708
709 exit_label_->SetVisible(false);
710
711 if (is_primary_view_) {
712 touch_point_view_->SetVisible(false);
713 hint_box_view_->SetVisible(false);
714 }
715
716 AdvanceToNextState();
717 }
583 718
584 void TouchCalibratorView::SkipCurrentAnimation() { 719 void TouchCalibratorView::SkipCurrentAnimation() {
585 if (animator_->is_animating()) 720 if (animator_->is_animating())
586 animator_->End(); 721 animator_->End();
587 if (touch_point_view_ && 722 if (touch_point_view_ &&
588 touch_point_view_->layer()->GetAnimator()->is_animating()) { 723 touch_point_view_->layer()->GetAnimator()->is_animating()) {
589 touch_point_view_->layer()->GetAnimator()->StopAnimating(); 724 touch_point_view_->layer()->GetAnimator()->StopAnimating();
590 } 725 }
591 } 726 }
592 727
593 } // namespace chromeos 728 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698