1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "ash/assistant/ui/main_stage/assistant_ui_element_view_animator.h"
6 
7 #include "ash/assistant/ui/main_stage/assistant_ui_element_view.h"
8 #include "ash/assistant/ui/main_stage/element_animator.h"
9 #include "ash/assistant/util/animation_util.h"
10 #include "base/metrics/histogram_functions.h"
11 #include "ui/compositor/callback_layer_animation_observer.h"
12 #include "ui/gfx/animation/tween.h"
13 
14 namespace ash {
15 
16 namespace {
17 
18 using assistant::util::CreateLayerAnimationSequence;
19 using assistant::util::CreateOpacityElement;
20 using assistant::util::StartLayerAnimationSequence;
21 
22 // Animation.
23 constexpr base::TimeDelta kAnimateInDuration =
24     base::TimeDelta::FromMilliseconds(250);
25 constexpr base::TimeDelta kAnimateOutDuration =
26     base::TimeDelta::FromMilliseconds(200);
27 
28 }  // namespace
29 
AssistantUiElementViewAnimator(AssistantUiElementView * view,const char * animation_smoothness_histogram)30 AssistantUiElementViewAnimator::AssistantUiElementViewAnimator(
31     AssistantUiElementView* view,
32     const char* animation_smoothness_histogram)
33     : ElementAnimator(view),
34       view_(view),
35       animation_smoothness_histogram_(animation_smoothness_histogram) {}
36 
37 AssistantUiElementViewAnimator::AnimationSmoothnessCallback
GetAnimationSmoothnessCallback() const38 AssistantUiElementViewAnimator::GetAnimationSmoothnessCallback() const {
39   return base::BindRepeating<void(const std::string&, int value)>(
40       base::UmaHistogramPercentageObsoleteDoNotUse,
41       animation_smoothness_histogram_);
42 }
43 
44 // ElementAnimator:
AnimateIn(ui::CallbackLayerAnimationObserver * observer)45 void AssistantUiElementViewAnimator::AnimateIn(
46     ui::CallbackLayerAnimationObserver* observer) {
47   StartLayerAnimationSequence(
48       layer()->GetAnimator(),
49       CreateLayerAnimationSequence(CreateOpacityElement(
50           1.f, kAnimateInDuration, gfx::Tween::Type::FAST_OUT_SLOW_IN)),
51       observer, GetAnimationSmoothnessCallback());
52 }
53 
AnimateOut(ui::CallbackLayerAnimationObserver * observer)54 void AssistantUiElementViewAnimator::AnimateOut(
55     ui::CallbackLayerAnimationObserver* observer) {
56   StartLayerAnimationSequence(
57       layer()->GetAnimator(),
58       CreateLayerAnimationSequence(
59           CreateOpacityElement(kMinimumAnimateOutOpacity, kAnimateOutDuration)),
60       observer, GetAnimationSmoothnessCallback());
61 }
62 
layer() const63 ui::Layer* AssistantUiElementViewAnimator::layer() const {
64   return view_->GetLayerForAnimating();
65 }
66 
67 }  // namespace ash
68