2021-03-19 11:25:58 +01:00
|
|
|
package org.telegram.ui;
|
|
|
|
|
|
|
|
import android.animation.Animator;
|
|
|
|
import android.animation.AnimatorListenerAdapter;
|
|
|
|
import android.animation.ValueAnimator;
|
|
|
|
import android.graphics.Canvas;
|
|
|
|
import android.graphics.LinearGradient;
|
|
|
|
import android.graphics.Matrix;
|
|
|
|
import android.graphics.Paint;
|
|
|
|
import android.graphics.PorterDuff;
|
|
|
|
import android.graphics.PorterDuffXfermode;
|
|
|
|
import android.graphics.Shader;
|
2021-07-15 16:24:57 +02:00
|
|
|
import android.transition.Transition;
|
2021-03-19 11:25:58 +01:00
|
|
|
import android.view.View;
|
|
|
|
import android.view.animation.LinearInterpolator;
|
|
|
|
import android.widget.FrameLayout;
|
|
|
|
|
|
|
|
import androidx.core.graphics.ColorUtils;
|
|
|
|
|
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
|
|
|
import org.telegram.ui.ActionBar.Theme;
|
|
|
|
import org.telegram.ui.Cells.ChatMessageCell;
|
|
|
|
import org.telegram.ui.Components.ChatActivityEnterView;
|
|
|
|
import org.telegram.ui.Components.CubicBezierInterpolator;
|
|
|
|
import org.telegram.ui.Components.RecyclerListView;
|
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
public class VoiceMessageEnterTransition implements MessageEnterTransitionContainer.Transition {
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
private final ChatMessageCell messageView;
|
|
|
|
private final RecyclerListView listView;
|
2021-03-19 11:25:58 +01:00
|
|
|
float fromRadius;
|
|
|
|
float progress;
|
|
|
|
|
|
|
|
final Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
|
|
|
|
|
|
private final ValueAnimator animator;
|
2021-07-15 16:24:57 +02:00
|
|
|
private final ChatActivityEnterView.RecordCircle recordCircle;
|
|
|
|
private final Matrix gradientMatrix;
|
|
|
|
private final Paint gradientPaint;
|
|
|
|
private final LinearGradient gradientShader;
|
|
|
|
private final int messageId;
|
|
|
|
MessageEnterTransitionContainer container;
|
2021-09-20 07:54:41 +02:00
|
|
|
private final Theme.ResourcesProvider resourcesProvider;
|
2021-07-15 16:24:57 +02:00
|
|
|
|
2021-09-20 07:54:41 +02:00
|
|
|
public VoiceMessageEnterTransition(ChatMessageCell messageView, ChatActivityEnterView chatActivityEnterView, RecyclerListView listView, MessageEnterTransitionContainer container, Theme.ResourcesProvider resourcesProvider) {
|
|
|
|
this.resourcesProvider = resourcesProvider;
|
2021-07-15 16:24:57 +02:00
|
|
|
this.messageView = messageView;
|
|
|
|
this.container = container;
|
|
|
|
this.listView = listView;
|
2021-03-19 11:25:58 +01:00
|
|
|
fromRadius = chatActivityEnterView.getRecordCicle().drawingCircleRadius;
|
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
messageView.setEnterTransitionInProgress(true);
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
recordCircle = chatActivityEnterView.getRecordCicle();
|
2021-03-19 11:25:58 +01:00
|
|
|
recordCircle.voiceEnterTransitionInProgress = true;
|
|
|
|
recordCircle.skipDraw = true;
|
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
gradientMatrix = new Matrix();
|
|
|
|
gradientPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
2021-03-19 11:25:58 +01:00
|
|
|
gradientPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
|
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
gradientShader = new LinearGradient(0, AndroidUtilities.dp(12), 0, 0, 0, 0xFF000000, Shader.TileMode.CLAMP);
|
2021-03-19 11:25:58 +01:00
|
|
|
gradientPaint.setShader(gradientShader);
|
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
messageId = messageView.getMessageObject().stableId;
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
container.addTransition(this);
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
animator = ValueAnimator.ofFloat(0f, 1f);
|
|
|
|
animator.addUpdateListener(valueAnimator -> {
|
|
|
|
progress = (float) valueAnimator.getAnimatedValue();
|
|
|
|
container.invalidate();
|
|
|
|
});
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
animator.setInterpolator(new LinearInterpolator());
|
|
|
|
animator.setDuration(220);
|
|
|
|
animator.addListener(new AnimatorListenerAdapter() {
|
2021-03-19 11:25:58 +01:00
|
|
|
@Override
|
2021-07-15 16:24:57 +02:00
|
|
|
public void onAnimationEnd(Animator animation) {
|
|
|
|
messageView.setEnterTransitionInProgress(false);
|
|
|
|
container.removeTransition(VoiceMessageEnterTransition.this);
|
|
|
|
recordCircle.skipDraw = false;
|
|
|
|
}
|
|
|
|
});
|
2022-06-21 04:51:00 +02:00
|
|
|
|
|
|
|
if (messageView.getSeekBarWaveform() != null) {
|
|
|
|
messageView.getSeekBarWaveform().setSent();
|
|
|
|
}
|
2021-07-15 16:24:57 +02:00
|
|
|
}
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
public void start() {
|
|
|
|
animator.start();
|
|
|
|
}
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
float lastToCx;
|
|
|
|
float lastToCy;
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
@Override
|
|
|
|
public void onDraw(Canvas canvas) {
|
|
|
|
float step1Time = 0.6f;
|
|
|
|
float moveProgress = progress;
|
|
|
|
float hideWavesProgress = progress > step1Time ? 1f : progress / step1Time;
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
float fromCx = recordCircle.drawingCx + recordCircle.getX() - container.getX();
|
|
|
|
float fromCy = recordCircle.drawingCy + recordCircle.getY() - container.getY();
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
float toCy;
|
|
|
|
float toCx;
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
if (messageView.getMessageObject().stableId != messageId) {
|
|
|
|
toCx = lastToCx;
|
|
|
|
toCy = lastToCy;
|
|
|
|
} else {
|
|
|
|
toCy = messageView.getRadialProgress().getProgressRect().centerY() + messageView.getY() + listView.getY() - container.getY();
|
|
|
|
toCx = messageView.getRadialProgress().getProgressRect().centerX() + messageView.getX() + listView.getX() - container.getX();
|
|
|
|
}
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
lastToCx = toCx;
|
|
|
|
lastToCy = toCy;
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
float progress = CubicBezierInterpolator.DEFAULT.getInterpolation(moveProgress);
|
|
|
|
float xProgress = CubicBezierInterpolator.EASE_OUT_QUINT.getInterpolation(moveProgress);
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
float cx = fromCx * (1f - xProgress) + toCx * xProgress;
|
|
|
|
float cy = fromCy * (1f - progress) + toCy * progress;
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
float toRadius = messageView.getRadialProgress().getProgressRect().height() / 2;
|
|
|
|
float radius = fromRadius * (1f - progress) + toRadius * progress;
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
float listViewBottom = listView.getY() - container.getY() + listView.getMeasuredHeight();
|
|
|
|
int clipBottom = 0;
|
|
|
|
if (container.getMeasuredHeight() > 0) {
|
|
|
|
clipBottom = (int) (container.getMeasuredHeight() * (1f - progress) + listViewBottom * progress);
|
|
|
|
}
|
2022-08-12 17:23:51 +02:00
|
|
|
// canvas.saveLayerAlpha(0, container.getMeasuredHeight() - AndroidUtilities.dp(400), container.getMeasuredWidth(), container.getMeasuredHeight(), 255, Canvas.ALL_SAVE_FLAG);
|
|
|
|
// } else {
|
|
|
|
// canvas.save();
|
|
|
|
// }
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-09-20 07:54:41 +02:00
|
|
|
circlePaint.setColor(ColorUtils.blendARGB(getThemedColor(Theme.key_chat_messagePanelVoiceBackground), getThemedColor(messageView.getRadialProgress().getCircleColorKey()), progress));
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
recordCircle.drawWaves(canvas, cx, cy, 1f - hideWavesProgress);
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
canvas.drawCircle(cx, cy, radius, circlePaint);
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
canvas.save();
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
float scale = radius / toRadius;
|
|
|
|
canvas.scale(scale, scale, cx, cy);
|
|
|
|
canvas.translate(cx - messageView.getRadialProgress().getProgressRect().centerX(), cy - messageView.getRadialProgress().getProgressRect().centerY());
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
messageView.getRadialProgress().setOverrideAlpha(progress);
|
|
|
|
messageView.getRadialProgress().setDrawBackground(false);
|
|
|
|
messageView.getRadialProgress().draw(canvas);
|
|
|
|
messageView.getRadialProgress().setDrawBackground(true);
|
|
|
|
messageView.getRadialProgress().setOverrideAlpha(1f);
|
|
|
|
canvas.restore();
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
if (container.getMeasuredHeight() > 0) {
|
|
|
|
gradientMatrix.setTranslate(0, clipBottom);
|
|
|
|
gradientShader.setLocalMatrix(gradientMatrix);
|
2022-08-12 17:23:51 +02:00
|
|
|
// canvas.drawRect(0, clipBottom, container.getMeasuredWidth(), container.getMeasuredHeight(), gradientPaint);
|
2021-07-15 16:24:57 +02:00
|
|
|
}
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
//restore clipRect
|
2022-08-12 17:23:51 +02:00
|
|
|
// canvas.restore();
|
2021-03-19 11:25:58 +01:00
|
|
|
|
2021-07-15 16:24:57 +02:00
|
|
|
recordCircle.drawIcon(canvas, (int) fromCx, (int) fromCy, 1f - moveProgress);
|
2021-03-19 11:25:58 +01:00
|
|
|
}
|
2021-09-20 07:54:41 +02:00
|
|
|
|
|
|
|
private int getThemedColor(String key) {
|
|
|
|
Integer color = resourcesProvider != null ? resourcesProvider.getColor(key) : null;
|
|
|
|
return color != null ? color : Theme.getColor(key);
|
|
|
|
}
|
2021-03-19 11:25:58 +01:00
|
|
|
}
|