[go: nahoru, domu]

blob: 7aa6e2a558c932cc2ee7cca607132027cbae6461 [file] [log] [blame]
Joe Antonetti92e3f7b2023-01-20 18:28:231// Copyright 2023 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Sammie Quonc5976c92023-04-28 23:54:585#include "ash/system/phonehub/phone_hub_app_loading_icon.h"
Joe Antonetti92e3f7b2023-01-20 18:28:236
7#include "ash/style/ash_color_provider.h"
Allen Bauer912e8ff32023-11-08 21:13:118#include "ui/base/metadata/metadata_impl_macros.h"
Joe Antonetti92e3f7b2023-01-20 18:28:239#include "ui/compositor/layer.h"
10#include "ui/gfx/canvas.h"
11#include "ui/gfx/image/canvas_image_source.h"
Curt Clemens533b5012023-03-21 21:46:1512#include "ui/views/animation/animation_builder.h"
Joe Antonetti92e3f7b2023-01-20 18:28:2313
14namespace ash {
Curt Clemens971477fd2023-03-17 00:15:0715
16namespace {
17
Curt Clemens6dc633cf82023-03-17 22:21:1818// Constants for loading animation
19constexpr float kAnimationOpacityHigh = 1.0f;
20constexpr float kAnimationOpacityLow = 0.5f;
21constexpr int kAnimationFadeDownDurationInMs = 500;
22constexpr int kAnimationFadeUpDurationInMs = 500;
23
Joe Antonetti92e3f7b2023-01-20 18:28:2324class LoadingCircle : public gfx::CanvasImageSource {
25 public:
Curt Clemens971477fd2023-03-17 00:15:0726 explicit LoadingCircle(int size)
27 : CanvasImageSource(AppIcon::GetRecommendedImageSize(size)) {}
Joe Antonetti92e3f7b2023-01-20 18:28:2328
29 LoadingCircle(const LoadingCircle&) = delete;
30 LoadingCircle& operator=(const LoadingCircle&) = delete;
31
32 void Draw(gfx::Canvas* canvas) override {
33 float radius = size().width() / 2.0f;
34 cc::PaintFlags flags;
35 flags.setStyle(cc::PaintFlags::kFill_Style);
36 flags.setAntiAlias(true);
37 flags.setColor(AshColorProvider::Get()->GetControlsLayerColor(
38 AshColorProvider::ControlsLayerType::kControlBackgroundColorInactive));
39 canvas->DrawCircle(gfx::PointF(radius, radius), radius, flags);
40 }
41};
42
Curt Clemens971477fd2023-03-17 00:15:0743} // namespace
44
45AppLoadingIcon::AppLoadingIcon(int size)
46 : AppIcon(gfx::Image(
47 gfx::CanvasImageSource::MakeImageSkia<LoadingCircle>(size)),
48 size) {
Joe Antonetti92e3f7b2023-01-20 18:28:2349 SetPaintToLayer();
50 layer()->SetFillsBoundsOpaquely(false);
51 layer()->SetFillsBoundsCompletely(false);
52}
Curt Clemens971477fd2023-03-17 00:15:0753
Curt Clemens6dc633cf82023-03-17 22:21:1854AppLoadingIcon::~AppLoadingIcon() = default;
55
56void AppLoadingIcon::StartLoadingAnimation(
Arthur Sonzognia98e4432023-11-28 18:15:0157 std::optional<base::TimeDelta> initial_delay) {
Curt Clemens6dc633cf82023-03-17 22:21:1858 if (initial_delay) {
59 animation_initial_delay_timer_.Start(
60 FROM_HERE, *initial_delay,
61 base::BindOnce(&AppLoadingIcon::StartLoadingAnimation,
62 base::Unretained(this),
Arthur Sonzognia98e4432023-11-28 18:15:0163 /*initial_delay=*/std::nullopt));
Curt Clemens6dc633cf82023-03-17 22:21:1864 return;
65 }
66
67 views::AnimationBuilder builder;
Curt Clemens1861e552023-03-21 21:00:1568 animation_abort_handle_ = builder.GetAbortHandle();
Curt Clemens6dc633cf82023-03-17 22:21:1869 builder.Repeatedly()
70 .SetDuration(base::Milliseconds(kAnimationFadeDownDurationInMs))
71 .SetOpacity(this, kAnimationOpacityLow, gfx::Tween::ACCEL_30_DECEL_20_85)
72 .Then()
73 .SetDuration(base::Milliseconds(kAnimationFadeUpDurationInMs))
74 .SetOpacity(this, kAnimationOpacityHigh, gfx::Tween::LINEAR);
Curt Clemens6dc633cf82023-03-17 22:21:1875}
76
77void AppLoadingIcon::StopLoadingAnimation() {
78 animation_abort_handle_.reset();
79 animation_initial_delay_timer_.Stop();
80}
81
Allen Bauer912e8ff32023-11-08 21:13:1182BEGIN_METADATA(AppLoadingIcon)
83END_METADATA
84
Curt Clemens971477fd2023-03-17 00:15:0785} // namespace ash