NekoX/TMessagesProj/src/main/java/org/telegram/ui/Components/ChatActivityEnterViewAnimat...

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
}
}