mirror of https://github.com/NekoX-Dev/NekoX.git
128 lines
4.0 KiB
Java
128 lines
4.0 KiB
Java
package org.telegram.ui.Components;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.ColorFilter;
|
|
import android.graphics.Paint;
|
|
import android.graphics.PixelFormat;
|
|
import android.graphics.RectF;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.os.SystemClock;
|
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
|
import org.telegram.messenger.R;
|
|
import org.telegram.ui.ActionBar.Theme;
|
|
|
|
public class ProxyDrawable extends Drawable {
|
|
|
|
private Drawable emptyDrawable;
|
|
private Drawable fullDrawable;
|
|
|
|
private Paint outerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
private RectF cicleRect = new RectF();
|
|
private int radOffset = 0;
|
|
private long lastUpdateTime;
|
|
private int currentColorType;
|
|
|
|
private float connectedAnimationProgress;
|
|
|
|
private boolean connected;
|
|
private boolean isEnabled;
|
|
|
|
public ProxyDrawable(Context context) {
|
|
super();
|
|
emptyDrawable = context.getResources().getDrawable(R.drawable.proxy_off);
|
|
fullDrawable = context.getResources().getDrawable(R.drawable.proxy_on);
|
|
|
|
outerPaint.setStyle(Paint.Style.STROKE);
|
|
outerPaint.setStrokeWidth(AndroidUtilities.dp(2));
|
|
outerPaint.setStrokeCap(Paint.Cap.ROUND);
|
|
lastUpdateTime = SystemClock.elapsedRealtime();
|
|
}
|
|
|
|
public void setConnected(boolean enabled, boolean value, boolean animated) {
|
|
isEnabled = enabled;
|
|
connected = value;
|
|
lastUpdateTime = SystemClock.elapsedRealtime();
|
|
if (!animated) {
|
|
connectedAnimationProgress = connected ? 1.0f : 0.0f;
|
|
}
|
|
invalidateSelf();
|
|
}
|
|
|
|
@Override
|
|
public void draw(Canvas canvas) {
|
|
long newTime = SystemClock.elapsedRealtime();
|
|
long dt = newTime - lastUpdateTime;
|
|
lastUpdateTime = newTime;
|
|
|
|
if (!isEnabled) {
|
|
emptyDrawable.setBounds(getBounds());
|
|
emptyDrawable.draw(canvas);
|
|
} else if (!connected || connectedAnimationProgress != 1.0f) {
|
|
emptyDrawable.setBounds(getBounds());
|
|
emptyDrawable.draw(canvas);
|
|
|
|
outerPaint.setColor(Theme.getColor(Theme.key_contextProgressOuter2));
|
|
outerPaint.setAlpha((int) (255 * (1.0f - connectedAnimationProgress)));
|
|
|
|
radOffset += 360 * dt / 1000.0f;
|
|
|
|
int width = getBounds().width();
|
|
int height = getBounds().height();
|
|
|
|
int x = width / 2 - AndroidUtilities.dp(3);
|
|
int y = height / 2 - AndroidUtilities.dp(3);
|
|
cicleRect.set(x, y, x + AndroidUtilities.dp(6), y + AndroidUtilities.dp(6));
|
|
canvas.drawArc(cicleRect, -90 + radOffset, 90, false, outerPaint);
|
|
invalidateSelf();
|
|
}
|
|
|
|
if (isEnabled && (connected || connectedAnimationProgress != 0.0f)) {
|
|
fullDrawable.setAlpha((int) (255 * connectedAnimationProgress));
|
|
fullDrawable.setBounds(getBounds());
|
|
fullDrawable.draw(canvas);
|
|
}
|
|
|
|
if (connected && connectedAnimationProgress != 1.0f) {
|
|
connectedAnimationProgress += dt / 300.0f;
|
|
if (connectedAnimationProgress > 1.0f) {
|
|
connectedAnimationProgress = 1.0f;
|
|
}
|
|
invalidateSelf();
|
|
} else if (!connected && connectedAnimationProgress != 0.0f) {
|
|
connectedAnimationProgress -= dt / 300.0f;
|
|
if (connectedAnimationProgress < 0.0f) {
|
|
connectedAnimationProgress = 0.0f;
|
|
}
|
|
invalidateSelf();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setAlpha(int alpha) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void setColorFilter(ColorFilter cf) {
|
|
emptyDrawable.setColorFilter(cf);
|
|
fullDrawable.setColorFilter(cf);
|
|
}
|
|
|
|
@Override
|
|
public int getOpacity() {
|
|
return PixelFormat.TRANSPARENT;
|
|
}
|
|
|
|
@Override
|
|
public int getIntrinsicWidth() {
|
|
return AndroidUtilities.dp(24);
|
|
}
|
|
|
|
@Override
|
|
public int getIntrinsicHeight() {
|
|
return AndroidUtilities.dp(24);
|
|
}
|
|
}
|