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

229 lines
9.8 KiB
Java

package org.telegram.ui.Components;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.util.TypedValue;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MediaDataController;
import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.Utilities;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.Theme;
import java.util.ArrayList;
public class AvatarConstructorPreviewCell extends FrameLayout {
private AnimatedEmojiDrawable animatedEmojiDrawable;
BackupImageView currentImage;
BackupImageView nextImage;
GradientTools currentBackgroundDrawable;
GradientTools nextBackgroundDrawable;
TextView textView;
TLRPC.TL_emojiList emojiList;
public final boolean forUser;
private final int currentAccount = UserConfig.selectedAccount;
int backgroundIndex = 0;
int emojiIndex = 0;
float progressToNext = 1f;
Runnable scheduleSwitchToNextRunnable = new Runnable() {
@Override
public void run() {
AndroidUtilities.runOnUIThread(scheduleSwitchToNextRunnable, 1000);
if (emojiList == null || emojiList.document_id.isEmpty() || progressToNext != 1f) {
return;
}
emojiIndex++;
backgroundIndex++;
if (emojiIndex > emojiList.document_id.size() - 1) {
emojiIndex = 0;
}
if (backgroundIndex > AvatarConstructorFragment.defaultColors.length - 1) {
backgroundIndex = 0;
}
animatedEmojiDrawable = new AnimatedEmojiDrawable(AnimatedEmojiDrawable.CACHE_TYPE_ALERT_PREVIEW_LARGE, currentAccount, emojiList.document_id.get(emojiIndex));
nextImage.setAnimatedEmojiDrawable(animatedEmojiDrawable);
int color1 = AvatarConstructorFragment.defaultColors[backgroundIndex][0];
int color2 = AvatarConstructorFragment.defaultColors[backgroundIndex][1];
int color3 = AvatarConstructorFragment.defaultColors[backgroundIndex][2];
int color4 = AvatarConstructorFragment.defaultColors[backgroundIndex][3];
nextBackgroundDrawable = new GradientTools();
nextBackgroundDrawable.setColors(color1, color2, color3, color4);
progressToNext = 0f;
invalidate();
}
};
public AvatarConstructorPreviewCell(Context context, boolean forUser) {
super(context);
this.forUser = forUser;
if (forUser) {
emojiList = MediaDataController.getInstance(currentAccount).profileAvatarConstructorDefault;
} else {
emojiList = MediaDataController.getInstance(currentAccount).groupAvatarConstructorDefault;
}
if (emojiList == null || emojiList.document_id.isEmpty()) {
ArrayList<TLRPC.TL_messages_stickerSet> installedEmojipacks = MediaDataController.getInstance(currentAccount).getStickerSets(MediaDataController.TYPE_EMOJIPACKS);
emojiList = new TLRPC.TL_emojiList();
if (installedEmojipacks.isEmpty()) {
ArrayList<TLRPC.StickerSetCovered> featured = MediaDataController.getInstance(currentAccount).getFeaturedEmojiSets();
for (int i = 0; i < featured.size(); i++) {
TLRPC.StickerSetCovered set = featured.get(i);
if (set.cover != null) {
emojiList.document_id.add(set.cover.id);
} else if (set instanceof TLRPC.TL_stickerSetFullCovered) {
TLRPC.TL_stickerSetFullCovered setFullCovered = ((TLRPC.TL_stickerSetFullCovered) set);
if (!setFullCovered.documents.isEmpty()) {
emojiList.document_id.add(setFullCovered.documents.get(0).id);
}
}
}
} else {
for (int i = 0; i < installedEmojipacks.size(); i++) {
TLRPC.TL_messages_stickerSet set = installedEmojipacks.get(i);
if (!set.documents.isEmpty()) {
int index = Math.abs(Utilities.fastRandom.nextInt() % set.documents.size());
emojiList.document_id.add(set.documents.get(index).id);
}
}
}
}
currentImage = new BackupImageView(context);
nextImage = new BackupImageView(context);
addView(currentImage, LayoutHelper.createFrame(50, 50, Gravity.CENTER_HORIZONTAL));
addView(nextImage, LayoutHelper.createFrame(50, 50, Gravity.CENTER_HORIZONTAL));
if (emojiList != null && !emojiList.document_id.isEmpty()) {
animatedEmojiDrawable = new AnimatedEmojiDrawable(AnimatedEmojiDrawable.CACHE_TYPE_ALERT_PREVIEW_LARGE, currentAccount, emojiList.document_id.get(0));
currentImage.setAnimatedEmojiDrawable(animatedEmojiDrawable);
}
int color1 = AvatarConstructorFragment.defaultColors[backgroundIndex][0];
int color2 = AvatarConstructorFragment.defaultColors[backgroundIndex][1];
int color3 = AvatarConstructorFragment.defaultColors[backgroundIndex][2];
int color4 = AvatarConstructorFragment.defaultColors[backgroundIndex][3];
currentBackgroundDrawable = new GradientTools();
currentBackgroundDrawable.setColors(color1, color2, color3, color4);
textView = new TextView(context);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12);
textView.setTextColor(Theme.getColor(Theme.key_avatar_text));
textView.setTypeface(AndroidUtilities.getTypeface("fonts/rmedium.ttf"));
textView.setGravity(Gravity.CENTER);
textView.setText(LocaleController.getString("UseEmoji", R.string.UseEmoji));
addView(textView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 28, Gravity.BOTTOM, 10, 10, 10, 10));
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int availableHeight = textView.getTop();
int imageHeight = (int) (availableHeight * 0.7f);
int padding = (int) ((availableHeight - imageHeight) * 0.7f);
currentImage.getLayoutParams().width = currentImage.getLayoutParams().height = imageHeight;
nextImage.getLayoutParams().width = nextImage.getLayoutParams().height = imageHeight;
((LayoutParams) currentImage.getLayoutParams()).topMargin = padding;
((LayoutParams) nextImage.getLayoutParams()).topMargin = padding;
}
@Override
protected void dispatchDraw(Canvas canvas) {
if (currentBackgroundDrawable != null) {
currentBackgroundDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
}
if (nextBackgroundDrawable != null) {
nextBackgroundDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
}
if (progressToNext == 1f) {
currentBackgroundDrawable.paint.setAlpha(255);
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), currentBackgroundDrawable.paint);
currentImage.setAlpha(1f);
currentImage.setScaleX(1f);
currentImage.setScaleY(1f);
nextImage.setAlpha(0f);
} else {
float progressInternal = CubicBezierInterpolator.DEFAULT.getInterpolation(progressToNext);
currentBackgroundDrawable.paint.setAlpha(255);
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), currentBackgroundDrawable.paint);
nextBackgroundDrawable.paint.setAlpha((int) (255 * progressInternal));
canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), nextBackgroundDrawable.paint);
progressToNext += 16 / 250f;
currentImage.setAlpha(1f - progressInternal);
currentImage.setScaleX(1f - progressInternal);
currentImage.setScaleY(1f - progressInternal);
currentImage.setPivotY(0);
nextImage.setAlpha(progressInternal);
nextImage.setScaleX(progressInternal);
nextImage.setScaleY(progressInternal);
nextImage.setPivotY(nextImage.getMeasuredHeight());
if (progressToNext > 1f) {
progressToNext = 1f;
currentBackgroundDrawable = nextBackgroundDrawable;
BackupImageView tmp = currentImage;
currentImage = nextImage;
nextImage = tmp;
}
invalidate();
}
super.dispatchDraw(canvas);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
AndroidUtilities.runOnUIThread(scheduleSwitchToNextRunnable, 1000);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
AndroidUtilities.cancelRunOnUIThread(scheduleSwitchToNextRunnable);
}
public AvatarConstructorFragment.BackgroundGradient getBackgroundGradient() {
AvatarConstructorFragment.BackgroundGradient backgroundGradient = new AvatarConstructorFragment.BackgroundGradient();
backgroundGradient.color1 = AvatarConstructorFragment.defaultColors[backgroundIndex][0];
backgroundGradient.color2 = AvatarConstructorFragment.defaultColors[backgroundIndex][1];
backgroundGradient.color3 = AvatarConstructorFragment.defaultColors[backgroundIndex][2];
backgroundGradient.color4 = AvatarConstructorFragment.defaultColors[backgroundIndex][3];
return backgroundGradient;
}
public AnimatedEmojiDrawable getAnimatedEmoji() {
return animatedEmojiDrawable;
}
}