From e42348b047391d76135c8340b134b3b107d6f99e Mon Sep 17 00:00:00 2001 From: Benjamin Kindle Date: Wed, 2 Dec 2020 20:45:53 -0500 Subject: [PATCH] feat(animations): implement get and set position in no op animation player --- .../src/players/animation_group_player.ts | 8 +-- .../src/players/animation_player.ts | 7 ++- .../test/animation_group_player_spec.ts | 57 +++++++++---------- .../animations/src/animation_builder.ts | 2 +- 4 files changed, 38 insertions(+), 36 deletions(-) diff --git a/packages/animations/src/players/animation_group_player.ts b/packages/animations/src/players/animation_group_player.ts index d774e807256931..692f0b971c22c1 100644 --- a/packages/animations/src/players/animation_group_player.ts +++ b/packages/animations/src/players/animation_group_player.ts @@ -149,12 +149,12 @@ export class AnimationGroupPlayer implements AnimationPlayer { getPosition(): number { const longestPlayer = - this.players.reduce((longestSoFar: AnimationPlayer|undefined, player: AnimationPlayer) => { + this.players.reduce((longestSoFar: AnimationPlayer|null, player: AnimationPlayer) => { const newPlayerIsLongest = - longestSoFar === undefined || player.totalTime > longestSoFar!.totalTime; + longestSoFar === null || player.totalTime > longestSoFar.totalTime; return newPlayerIsLongest ? player : longestSoFar; - }, undefined); - return longestPlayer != undefined ? longestPlayer.getPosition() / longestPlayer.totalTime : 0; + }, null); + return longestPlayer != null ? longestPlayer.getPosition() : 0; } beforeDestroy(): void { diff --git a/packages/animations/src/players/animation_player.ts b/packages/animations/src/players/animation_player.ts index 3d3472c0c48d2a..607a996b6a8a63 100644 --- a/packages/animations/src/players/animation_player.ts +++ b/packages/animations/src/players/animation_player.ts @@ -124,6 +124,7 @@ export class NoopAnimationPlayer implements AnimationPlayer { private _started = false; private _destroyed = false; private _finished = false; + private _position = 0; public parentPlayer: AnimationPlayer|null = null; public readonly totalTime: number; constructor(duration: number = 0, delay: number = 0) { @@ -184,9 +185,11 @@ export class NoopAnimationPlayer implements AnimationPlayer { } } reset(): void {} - setPosition(position: number): void {} + setPosition(position: number): void { + this._position = this.totalTime ? position * this.totalTime : 1; + } getPosition(): number { - return 0; + return this.totalTime ? this._position / this.totalTime : 1; } /** @internal */ diff --git a/packages/animations/test/animation_group_player_spec.ts b/packages/animations/test/animation_group_player_spec.ts index 856e71b415a80b..549eec5c28e14c 100644 --- a/packages/animations/test/animation_group_player_spec.ts +++ b/packages/animations/test/animation_group_player_spec.ts @@ -9,34 +9,33 @@ import {fakeAsync} from '@angular/core/testing'; import {NoopAnimationPlayer} from '../src/animations'; import {AnimationGroupPlayer} from '../src/players/animation_group_player'; -{ - describe('AnimationGroupPlayer', function() { - it('should getPosition of an empty group', fakeAsync(() => { - const players: NoopAnimationPlayer[] = []; - const groupPlayer = new AnimationGroupPlayer(players); - expect(groupPlayer.getPosition()).toBe(0); - })); - it('should getPosition of a single player in a group', fakeAsync(() => { - const player = new NoopAnimationPlayer(5, 5); - player.getPosition = () => 2; - const players = [player]; - const groupPlayer = new AnimationGroupPlayer(players); - expect(groupPlayer.getPosition()).toBe(0.2); - })); +describe('AnimationGroupPlayer', () => { + it('should getPosition of an empty group', fakeAsync(() => { + const players: NoopAnimationPlayer[] = []; + const groupPlayer = new AnimationGroupPlayer(players); + expect(groupPlayer.getPosition()).toBe(0); + })); - it('should getPosition based on the longest player in the group', fakeAsync(() => { - const longestPlayer = new NoopAnimationPlayer(5, 5); - longestPlayer.getPosition = () => 2; - const players = [ - new NoopAnimationPlayer(1, 4), - new NoopAnimationPlayer(4, 1), - new NoopAnimationPlayer(7, 0), - longestPlayer, - new NoopAnimationPlayer(1, 1), - ]; - const groupPlayer = new AnimationGroupPlayer(players); - expect(groupPlayer.getPosition()).toBe(0.2); - })); - }); -} + it('should getPosition of a single player in a group', fakeAsync(() => { + const player = new NoopAnimationPlayer(5, 5); + player.setPosition(0.2); + const players = [player]; + const groupPlayer = new AnimationGroupPlayer(players); + expect(groupPlayer.getPosition()).toBe(0.2); + })); + + it('should getPosition based on the longest player in the group', fakeAsync(() => { + const longestPlayer = new NoopAnimationPlayer(5, 5); + longestPlayer.setPosition(0.2); + const players = [ + new NoopAnimationPlayer(1, 4), + new NoopAnimationPlayer(4, 1), + new NoopAnimationPlayer(7, 0), + longestPlayer, + new NoopAnimationPlayer(1, 1), + ]; + const groupPlayer = new AnimationGroupPlayer(players); + expect(groupPlayer.getPosition()).toBe(0.2); + })); +}); diff --git a/packages/platform-browser/animations/src/animation_builder.ts b/packages/platform-browser/animations/src/animation_builder.ts index 80e767c461317e..057b1b5d556853 100644 --- a/packages/platform-browser/animations/src/animation_builder.ts +++ b/packages/platform-browser/animations/src/animation_builder.ts @@ -111,7 +111,7 @@ export class RendererAnimationPlayer implements AnimationPlayer { } getPosition(): number { - return this._renderer.engine.players[+this.id].getPosition(); + return this._renderer.engine.players[+this.id]?.getPosition() ?? 0; } public totalTime = 0;