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

Commit 0feb52d5 authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Slow down sparkles and make them more sparse

Sparkles were moving too fast, and were also very dense. They were
looking like TV static.

Test: visual
Bug: 182173639
Change-Id: I9dc1de92e7cc9d56f999a9719f1fae8ff41404c5
parent b9610108
Loading
Loading
Loading
Loading
+4 −10
Original line number Diff line number Diff line
@@ -50,7 +50,6 @@ public final class RippleAnimationSession {
    private long mStartTime;
    private boolean mForceSoftware;
    private final ValueAnimator mSparkle = ValueAnimator.ofFloat(0, 1);
    private final ArraySet<Animator> mActiveAnimations = new ArraySet<>(3);

    RippleAnimationSession(@NonNull AnimationProperties<Float, Paint> properties,
            boolean forceSoftware) {
@@ -60,12 +59,11 @@ public final class RippleAnimationSession {
        mSparkle.addUpdateListener(anim -> {
            final long now = AnimationUtils.currentAnimationTimeMillis();
            final long elapsed = now - mStartTime - ENTER_ANIM_DURATION;
            final float phase = (float) elapsed / 1000f;
            mProperties.getShader().setSecondsOffset(phase);
            final float phase = (float) elapsed / 30000f;
            mProperties.getShader().setNoisePhase(phase);
            notifyUpdate();
        });
        mSparkle.setDuration(ENTER_ANIM_DURATION);
        mSparkle.setStartDelay(ENTER_ANIM_DURATION);
        mSparkle.setInterpolator(LINEAR_INTERPOLATOR);
        mSparkle.setRepeatCount(ValueAnimator.INFINITE);
    }
@@ -81,7 +79,6 @@ public final class RippleAnimationSession {
    }

    @NonNull RippleAnimationSession exit(Canvas canvas) {
        mSparkle.end();
        if (isHwAccelerated(canvas)) exitHardware((RecordingCanvas) canvas);
        else exitSoftware();
        return this;
@@ -89,7 +86,6 @@ public final class RippleAnimationSession {

    private void onAnimationEnd(Animator anim) {
        notifyUpdate();
        mActiveAnimations.remove(anim);
    }

    @NonNull RippleAnimationSession setOnSessionEnd(
@@ -119,13 +115,13 @@ public final class RippleAnimationSession {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                mSparkle.end();
                Consumer<RippleAnimationSession> onEnd = mOnSessionEnd;
                if (onEnd != null) onEnd.accept(RippleAnimationSession.this);
            }
        });
        expand.setInterpolator(LINEAR_INTERPOLATOR);
        expand.start();
        mActiveAnimations.add(expand);
    }

    private long computeDelay() {
@@ -153,6 +149,7 @@ public final class RippleAnimationSession {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                mSparkle.end();
                Consumer<RippleAnimationSession> onEnd = mOnSessionEnd;
                if (onEnd != null) onEnd.accept(RippleAnimationSession.this);
            }
@@ -163,7 +160,6 @@ public final class RippleAnimationSession {
        long delay = computeDelay();
        exit.setStartDelay(delay);
        exit.start();
        mActiveAnimations.add(exit);
    }

    private void enterHardware(RecordingCanvas canvas) {
@@ -182,9 +178,7 @@ public final class RippleAnimationSession {
        expand.start();
        if (!mSparkle.isRunning()) {
            mSparkle.start();
            mActiveAnimations.add(mSparkle);
        }
        mActiveAnimations.add(expand);
    }

    private void enterSoftware() {
+1 −1
Original line number Diff line number Diff line
@@ -915,7 +915,7 @@ public class RippleDrawable extends LayerDrawable {
        shader.setOrigin(w / 2, y / 2);
        shader.setTouch(x, y);
        shader.setResolution(w, h);
        shader.setSecondsOffset(0);
        shader.setNoisePhase(0);
        shader.setRadius(radius);
        shader.setProgress(.0f);
        properties = new RippleAnimationSession.AnimationProperties<>(
+6 −7
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ final class RippleShader extends RuntimeShader {
            + "uniform float in_maxRadius;\n"
            + "uniform vec2 in_resolution;\n"
            + "uniform float in_hasMask;\n"
            + "uniform float in_secondsOffset;\n"
            + "uniform float in_noisePhase;\n"
            + "uniform vec4 in_color;\n"
            + "uniform shader in_shader;\n";
    private static final String SHADER_LIB =
@@ -49,7 +49,7 @@ final class RippleShader extends RuntimeShader {
            + "  float s = 0.0;\n"
            + "  for (float i = 0; i < 4; i += 1) {\n"
            + "    float l = i * 0.25;\n"
            + "    float h = l + 0.025;\n"
            + "    float h = l + 0.005;\n"
            + "    float o = abs(sin(0.1 * PI * (t + i)));\n"
            + "    s += threshold(n + o, l, h);\n"
            + "  }\n"
@@ -83,8 +83,7 @@ final class RippleShader extends RuntimeShader {
            + "    vec2 center = mix(in_touch, in_origin, fadeIn);\n"
            + "    float ring = getRingMask(p, center, in_maxRadius, fadeIn);\n"
            + "    float alpha = min(fadeIn, 1. - fadeOutNoise);\n"
            + "    float sparkle = sparkles(p, in_progress * 0.25 + in_secondsOffset)\n"
            + "        * ring * alpha;\n"
            + "    float sparkle = sparkles(p, in_noisePhase) * ring * alpha;\n"
            + "    float fade = min(fadeIn, 1. - fadeOutRipple);\n"
            + "    vec4 circle = in_color * (softCircle(p, center, in_maxRadius "
            + "      * fadeIn, 0.2) * fade);\n"
@@ -111,8 +110,8 @@ final class RippleShader extends RuntimeShader {
    /**
     * Continuous offset used as noise phase.
     */
    public void setSecondsOffset(float t) {
        setUniform("in_secondsOffset", t);
    public void setNoisePhase(float t) {
        setUniform("in_noisePhase", t);
    }

    public void setOrigin(float x, float y) {