mirror of https://github.com/NekoX-Dev/NekoX.git
116 lines
4.0 KiB
Java
116 lines
4.0 KiB
Java
package org.telegram.ui.Components;
|
|
|
|
import android.content.Context;
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
|
import org.telegram.messenger.R;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
|
|
public class ChatActivityEnterViewAnimatedIconView extends RLottieImageView {
|
|
private State currentState;
|
|
private TransitState animatingState;
|
|
|
|
private Map<TransitState, RLottieDrawable> stateMap = new HashMap<TransitState, RLottieDrawable>() {
|
|
@Nullable
|
|
@Override
|
|
public RLottieDrawable get(@Nullable Object key) {
|
|
RLottieDrawable obj = super.get(key);
|
|
if (obj == null) {
|
|
TransitState state = (TransitState) key;
|
|
int res = state.resource;
|
|
return new RLottieDrawable(res, String.valueOf(res), AndroidUtilities.dp(32), AndroidUtilities.dp(32));
|
|
}
|
|
return obj;
|
|
}
|
|
};
|
|
|
|
public ChatActivityEnterViewAnimatedIconView(Context context) {
|
|
super(context);
|
|
}
|
|
|
|
public void setState(State state, boolean animate) {
|
|
if (animate && state == currentState) {
|
|
return;
|
|
}
|
|
State fromState = currentState;
|
|
currentState = state;
|
|
if (!animate || fromState == null || getState(fromState, currentState) == null) {
|
|
RLottieDrawable drawable = stateMap.get(getAnyState(currentState));
|
|
drawable.stop();
|
|
|
|
drawable.setProgress(0, false);
|
|
setAnimation(drawable);
|
|
} else {
|
|
TransitState transitState = getState(fromState, currentState);
|
|
if (transitState == animatingState) {
|
|
return;
|
|
}
|
|
|
|
animatingState = transitState;
|
|
RLottieDrawable drawable = stateMap.get(transitState);
|
|
drawable.stop();
|
|
drawable.setProgress(0, false);
|
|
drawable.setAutoRepeat(0);
|
|
drawable.setOnAnimationEndListener(() -> animatingState = null);
|
|
setAnimation(drawable);
|
|
AndroidUtilities.runOnUIThread(drawable::start);
|
|
}
|
|
}
|
|
|
|
private TransitState getAnyState(State from) {
|
|
for (TransitState transitState : TransitState.values()) {
|
|
if (transitState.firstState == from) {
|
|
return transitState;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private TransitState getState(State from, State to) {
|
|
for (TransitState transitState : TransitState.values()) {
|
|
if (transitState.firstState == from && transitState.secondState == to) {
|
|
return transitState;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private enum TransitState {
|
|
VOICE_TO_VIDEO(State.VOICE, State.VIDEO, R.raw.voice_to_video),
|
|
STICKER_TO_KEYBOARD(State.STICKER, State.KEYBOARD, R.raw.sticker_to_keyboard),
|
|
SMILE_TO_KEYBOARD(State.SMILE, State.KEYBOARD, R.raw.smile_to_keyboard),
|
|
VIDEO_TO_VOICE(State.VIDEO, State.VOICE, R.raw.video_to_voice),
|
|
KEYBOARD_TO_STICKER(State.KEYBOARD, State.STICKER, R.raw.keyboard_to_sticker),
|
|
KEYBOARD_TO_GIF(State.KEYBOARD, State.GIF, R.raw.keyboard_to_gif),
|
|
KEYBOARD_TO_SMILE(State.KEYBOARD, State.SMILE, R.raw.keyboard_to_smile),
|
|
GIF_TO_KEYBOARD(State.GIF, State.KEYBOARD, R.raw.gif_to_keyboard),
|
|
GIF_TO_SMILE(State.GIF, State.SMILE, R.raw.gif_to_smile),
|
|
SMILE_TO_GIF(State.SMILE, State.GIF, R.raw.smile_to_gif),
|
|
SMILE_TO_STICKER(State.SMILE, State.STICKER, R.raw.smile_to_sticker),
|
|
STICKER_TO_SMILE(State.STICKER, State.SMILE, R.raw.sticker_to_smile);
|
|
|
|
final State firstState, secondState;
|
|
final int resource;
|
|
|
|
TransitState(State firstState, State secondState, int resource) {
|
|
this.firstState = firstState;
|
|
this.secondState = secondState;
|
|
this.resource = resource;
|
|
}
|
|
}
|
|
|
|
public enum State {
|
|
VOICE,
|
|
VIDEO,
|
|
STICKER,
|
|
KEYBOARD,
|
|
SMILE,
|
|
GIF
|
|
}
|
|
}
|