Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 167a3232 authored by Chet Haase's avatar Chet Haase
Browse files

Fix lockscreen wave animation artifacts

On some display sizes, the wave animation was sometimes
running more than once, starting over in the center and animating
outward... partially.

The problem was that the calculations determining the alpha value
of the dots was returning bogus values when the display area was
large enough, which is why the bug is only on some devices.

This fix simplifies the math and ensures that the wave only animates
once, from start to finish.

Issue #11005936 regression on lockscreen animation for multi-wave widget

Change-Id: Id21a2e4d2271f01c82c4bc6e1f37d78e68b9b6e4
parent cf5b34b0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -76,7 +76,7 @@ public class GlowPadView extends View {
    }

    // Tuneable parameters for animation
    private static final int WAVE_ANIMATION_DURATION = 1350;
    private static final int WAVE_ANIMATION_DURATION = 1000;
    private static final int RETURN_TO_HOME_DELAY = 1200;
    private static final int RETURN_TO_HOME_DURATION = 200;
    private static final int HIDE_ANIMATION_DELAY = 200;
+5 −6
Original line number Diff line number Diff line
@@ -45,8 +45,8 @@ public class PointCloud {

    public class WaveManager {
        private float radius = 50;
        private float width = 200.0f; // TODO: Make configurable
        private float alpha = 0.0f;

        public void setRadius(float r) {
            radius = r;
        }
@@ -186,13 +186,12 @@ public class PointCloud {

        // Compute contribution from Wave
        float radius = hypot(point.x, point.y);
        float distanceToWaveRing = (radius - waveManager.radius);
        float waveAlpha = 0.0f;
        if (distanceToWaveRing < waveManager.width * 0.5f && distanceToWaveRing < 0.0f) {
            float cosf = FloatMath.cos(PI * 0.25f * distanceToWaveRing / waveManager.width);
            waveAlpha = waveManager.alpha * max(0.0f, (float) Math.pow(cosf, 20.0f));
        if (radius < waveManager.radius * 2) {
            float distanceToWaveRing = (radius - waveManager.radius);
            float cosf = FloatMath.cos(PI * 0.5f * distanceToWaveRing / waveManager.radius);
            waveAlpha = waveManager.alpha * max(0.0f, (float) Math.pow(cosf, 6.0f));
        }

        return (int) (max(glowAlpha, waveAlpha) * 255);
    }