Index: chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view.cc |
diff --git a/chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view.cc b/chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view.cc |
index 123aefab35614a82d1ec289e6bf9708a1c8ca783..5924a25c458841114f4a5a9c12439048469420af 100644 |
--- a/chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view.cc |
+++ b/chrome/browser/chromeos/display/touch_calibrator/touch_calibrator_view.cc |
@@ -9,10 +9,12 @@ |
#include "ash/shell.h" |
#include "ui/aura/window.h" |
#include "ui/base/resource/resource_bundle.h" |
+#include "ui/compositor/scoped_layer_animation_settings.h" |
#include "ui/gfx/animation/linear_animation.h" |
#include "ui/gfx/animation/throb_animation.h" |
#include "ui/gfx/canvas.h" |
#include "ui/strings/grit/ui_strings.h" |
+#include "ui/views/background.h" |
#include "ui/views/controls/label.h" |
#include "ui/views/widget/widget.h" |
@@ -24,23 +26,28 @@ constexpr char kWidgetName[] = "TouchCalibratorOverlay"; |
constexpr int kAnimationFrameRate = 100; |
constexpr int kFadeDurationInMs = 150; |
+constexpr int kPointMoveDurationInMs = 600; |
+constexpr int kPointMoveDurationLongInMs = 700; |
const SkColor kExitLabelColor = SkColorSetARGBInline(255, 96, 96, 96); |
const SkColor kExitLabelShadowColor = SkColorSetARGBInline(255, 11, 11, 11); |
constexpr int kExitLabelWidth = 300; |
constexpr int kExitLabelHeight = 20; |
+const SkColor kTapHereLabelColor = SK_ColorWHITE; |
+ |
constexpr int kHintBoxWidth = 298; |
constexpr int kHintBoxHeight = 180; |
constexpr int kHintBoxLabelTextSize = 5; |
constexpr int kHintBoxSublabelTextSize = 3; |
-constexpr int kThrobberCircleViewWidth = 128; |
+constexpr int kThrobberCircleViewWidth = 64; |
constexpr float kThrobberCircleRadiusFactor = 3.f / 8.f; |
constexpr int kTouchPointViewOffset = 100; |
constexpr int kTapLabelHeight = 48; |
+constexpr int kTapLabelWidth = 80; |
const SkColor kHintLabelTextColor = SK_ColorBLACK; |
const SkColor kHintSublabelTextColor = SkColorSetARGBInline(255, 161, 161, 161); |
@@ -50,7 +57,7 @@ const SkColor kOuterCircleColor = SkColorSetA(kInnerCircleColor, 128); |
constexpr int kCircleAnimationDurationMs = 900; |
-constexpr int kHintRectBorderRadius = 8; |
+constexpr int kHintRectBorderRadius = 4; |
constexpr float kBackgroundFinalOpacity = 0.75f; |
@@ -78,6 +85,17 @@ gfx::Size GetSizeForString(const base::string16& text, |
return gfx::Size(width, height); |
} |
+void AnimateLayerToPosition(views::View* view, |
+ int duration, |
+ gfx::Point end_position) { |
+ ui::ScopedLayerAnimationSettings slide_settings(view->layer()->GetAnimator()); |
+ slide_settings.SetPreemptionStrategy( |
+ ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); |
+ slide_settings.SetTransitionDuration( |
+ base::TimeDelta::FromMilliseconds(duration)); |
+ view->SetBoundsRect(gfx::Rect(end_position, view->size())); |
+} |
+ |
} // namespace |
// Creates a throbbing animated view with two concentric circles. The radius of |
@@ -291,6 +309,7 @@ TouchCalibratorView::TouchCalibratorView(const display::Display& target_display, |
: display_(target_display), |
is_primary_view_(is_primary_view), |
exit_label_(nullptr), |
+ tap_label_(nullptr), |
throbber_circle_(nullptr), |
hint_box_view_(nullptr), |
touch_point_view_(nullptr) { |
@@ -349,18 +368,41 @@ void TouchCalibratorView::InitViewContents() { |
// Initialize the touch point view that contains the animated circle that the |
// user needs to tap. |
const int kTouchPointViewHeight = kThrobberCircleViewWidth + kTapLabelHeight; |
+ const int kThrobberCircleViewHorizontalOffset = |
+ (kTapLabelWidth - kThrobberCircleViewWidth) / 2; |
throbber_circle_ = |
new CircularThrobberView(kThrobberCircleViewWidth, kInnerCircleColor, |
kOuterCircleColor, kCircleAnimationDurationMs); |
- throbber_circle_->SetPosition(gfx::Point(0, 0)); |
+ throbber_circle_->SetPosition( |
+ gfx::Point(kThrobberCircleViewHorizontalOffset, 0)); |
+ |
+ // Initialize the tap label. |
+ tap_label_ = new views::Label( |
+ rb.GetLocalizedString(IDS_DISPLAY_TOUCH_CALIBRATION_TAP_HERE_LABEL), |
+ rb.GetFontListWithDelta(6, gfx::Font::FontStyle::NORMAL, |
+ gfx::Font::Weight::NORMAL)); |
+ tap_label_->SetBounds(0, kThrobberCircleViewWidth, kTapLabelWidth, |
+ kTapLabelHeight); |
+ tap_label_->SetEnabledColor(kTapHereLabelColor); |
+ tap_label_->SetDisabledColor(kTapHereLabelColor); |
+ tap_label_->SetHorizontalAlignment(gfx::ALIGN_CENTER); |
+ tap_label_->SetAutoColorReadabilityEnabled(false); |
+ tap_label_->SetSubpixelRenderingEnabled(false); |
+ tap_label_->SetVisible(false); |
touch_point_view_ = new views::View; |
touch_point_view_->SetBounds(kTouchPointViewOffset, kTouchPointViewOffset, |
- kThrobberCircleViewWidth, kTouchPointViewHeight); |
+ kTapLabelWidth, kTouchPointViewHeight); |
touch_point_view_->SetVisible(false); |
+ touch_point_view_->SetPaintToLayer(true); |
+ touch_point_view_->layer()->SetFillsBoundsOpaquely(false); |
+ touch_point_view_->layer()->GetAnimator()->AddObserver(this); |
+ touch_point_view_->set_background( |
+ views::Background::CreateSolidBackground(SK_ColorTRANSPARENT)); |
touch_point_view_->AddChildView(throbber_circle_); |
+ touch_point_view_->AddChildView(tap_label_); |
AddChildView(touch_point_view_); |
@@ -411,7 +453,10 @@ void TouchCalibratorView::OnPaintBackground(gfx::Canvas* canvas) { |
} |
void TouchCalibratorView::AnimationProgressed(const gfx::Animation* animation) { |
- SchedulePaint(); |
+ if (!is_primary_view_) { |
+ SchedulePaint(); |
+ return; |
+ } |
} |
void TouchCalibratorView::AnimationCanceled(const gfx::Animation* animation) { |
@@ -433,9 +478,38 @@ void TouchCalibratorView::AnimationEnded(const gfx::Animation* animation) { |
} |
} |
+void TouchCalibratorView::OnLayerAnimationStarted( |
+ ui::LayerAnimationSequence* sequence) {} |
+ |
+void TouchCalibratorView::OnLayerAnimationEnded( |
+ ui::LayerAnimationSequence* sequence) { |
+ switch (state_) { |
+ case ANIMATING_1_TO_2: |
+ state_ = DISPLAY_POINT_2; |
+ tap_label_->SetVisible(true); |
+ break; |
+ case ANIMATING_2_TO_3: |
+ state_ = DISPLAY_POINT_3; |
+ break; |
+ case ANIMATING_3_TO_4: |
+ state_ = DISPLAY_POINT_4; |
+ break; |
+ default: |
+ break; |
+ } |
+} |
+ |
+void TouchCalibratorView::OnLayerAnimationAborted( |
+ ui::LayerAnimationSequence* sequence) { |
+ OnLayerAnimationEnded(sequence); |
+} |
+ |
+void TouchCalibratorView::OnLayerAnimationScheduled( |
+ ui::LayerAnimationSequence* sequence) {} |
+ |
void TouchCalibratorView::AdvanceToNextState() { |
// Stop any previous animations and skip them to the end. |
- animator_->End(); |
+ SkipCurrentAnimation(); |
switch (state_) { |
case UNKNOWN: |
@@ -445,26 +519,75 @@ void TouchCalibratorView::AdvanceToNextState() { |
end_opacity_value_ = kBackgroundFinalOpacity; |
paint_.setStyle(SkPaint::kFill_Style); |
- |
animator_->SetDuration(kFadeDurationInMs); |
- break; |
+ animator_->Start(); |
+ return; |
+ case DISPLAY_POINT_1: |
+ state_ = ANIMATING_1_TO_2; |
+ |
+ // The touch point has to be animated from the top left corner of the |
+ // screen to the top right corner. |
+ AnimateLayerToPosition( |
+ touch_point_view_, kPointMoveDurationInMs, |
+ gfx::Point(display_.bounds().width() - kTouchPointViewOffset - |
+ touch_point_view_->width(), |
+ touch_point_view_->y())); |
+ hint_box_view_->SetVisible(false); |
+ return; |
+ case DISPLAY_POINT_2: |
+ state_ = ANIMATING_2_TO_3; |
+ |
+ // The touch point has to be animated from the top right corner of the |
+ // screen to the bottom left corner. |
+ AnimateLayerToPosition( |
+ touch_point_view_, kPointMoveDurationLongInMs, |
+ gfx::Point(kTouchPointViewOffset, display_.bounds().height() - |
+ kTouchPointViewOffset - |
+ touch_point_view_->height())); |
+ return; |
+ case DISPLAY_POINT_3: |
+ state_ = ANIMATING_3_TO_4; |
+ |
+ // The touch point has to be animated from the bottom left corner of the |
+ // screen to the bottom right corner. |
+ AnimateLayerToPosition( |
+ touch_point_view_, kPointMoveDurationInMs, |
+ gfx::Point(display_.bounds().width() - kTouchPointViewOffset - |
+ touch_point_view_->width(), |
+ touch_point_view_->y())); |
+ return; |
default: |
- break; |
+ return; |
} |
- animator_->Start(); |
} |
bool TouchCalibratorView::GetDisplayPointLocation(gfx::Point* location) { |
+ DCHECK(location); |
if (!is_primary_view_) |
return false; |
- return false; |
+ |
+ if (state_ != DISPLAY_POINT_1 && state_ != DISPLAY_POINT_2 && |
+ state_ != DISPLAY_POINT_3 && state_ != DISPLAY_POINT_4) { |
+ return false; |
+ } |
+ |
+ if (!touch_point_view_ || !throbber_circle_) |
+ return false; |
+ // TODO(malaykeshav): Can use views::ConvertPointToScreen() |
+ location->SetPoint(touch_point_view_->x() + touch_point_view_->width() / 2.f, |
+ touch_point_view_->y() + touch_point_view_->width() / 2.f); |
+ return true; |
} |
void TouchCalibratorView::SkipToFinalState() {} |
-void TouchCalibratorView::SkipCurrentAnimationForTest() { |
+void TouchCalibratorView::SkipCurrentAnimation() { |
if (animator_->is_animating()) |
animator_->End(); |
+ if (touch_point_view_ && |
+ touch_point_view_->layer()->GetAnimator()->is_animating()) { |
+ touch_point_view_->layer()->GetAnimator()->StopAnimating(); |
+ } |
} |
} // namespace chromeos |