NekoX/TMessagesProj/src/main/java/org/telegram/ui/Cells/ThemePreviewMessagesCell.java

252 lines
11 KiB
Java
Raw Normal View History

2019-09-10 12:56:11 +02:00
package org.telegram.ui.Cells;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessageObject;
import org.telegram.messenger.R;
import org.telegram.messenger.UserConfig;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.ActionBarLayout;
import org.telegram.ui.ActionBar.Theme;
2019-12-31 14:08:08 +01:00
import org.telegram.ui.Components.BackgroundGradientDrawable;
2019-09-10 12:56:11 +02:00
import org.telegram.ui.Components.LayoutHelper;
public class ThemePreviewMessagesCell extends LinearLayout {
2019-12-31 14:08:08 +01:00
private final Runnable invalidateRunnable = this::invalidate;
private BackgroundGradientDrawable.Disposable backgroundGradientDisposable;
private BackgroundGradientDrawable.Disposable oldBackgroundGradientDisposable;
2019-09-10 12:56:11 +02:00
private Drawable backgroundDrawable;
private Drawable oldBackgroundDrawable;
private ChatMessageCell[] cells = new ChatMessageCell[2];
private Drawable shadowDrawable;
private ActionBarLayout parentLayout;
public ThemePreviewMessagesCell(Context context, ActionBarLayout layout, int type) {
super(context);
parentLayout = layout;
setWillNotDraw(false);
setOrientation(LinearLayout.VERTICAL);
setPadding(0, AndroidUtilities.dp(11), 0, AndroidUtilities.dp(11));
shadowDrawable = Theme.getThemedDrawable(context, R.drawable.greydivider_bottom, Theme.key_windowBackgroundGrayShadow);
int date = (int) (System.currentTimeMillis() / 1000) - 60 * 60;
TLRPC.Message message = new TLRPC.TL_message();
if (type == 0) {
message.message = LocaleController.getString("FontSizePreviewReply", R.string.FontSizePreviewReply);
} else {
message.message = LocaleController.getString("NewThemePreviewReply", R.string.NewThemePreviewReply);
}
message.date = date + 60;
message.dialog_id = 1;
message.flags = 259;
2020-09-30 15:48:47 +02:00
message.from_id = new TLRPC.TL_peerUser();
message.from_id.user_id = UserConfig.getInstance(UserConfig.selectedAccount).getClientUserId();
2019-09-10 12:56:11 +02:00
message.id = 1;
message.media = new TLRPC.TL_messageMediaEmpty();
message.out = true;
2020-09-30 15:48:47 +02:00
message.peer_id = new TLRPC.TL_peerUser();
message.peer_id.user_id = 0;
2020-08-14 18:58:22 +02:00
MessageObject replyMessageObject = new MessageObject(UserConfig.selectedAccount, message, true, false);
2019-09-10 12:56:11 +02:00
message = new TLRPC.TL_message();
if (type == 0) {
message.message = LocaleController.getString("FontSizePreviewLine2", R.string.FontSizePreviewLine2);
} else {
2019-12-31 14:08:08 +01:00
String text = LocaleController.getString("NewThemePreviewLine3", R.string.NewThemePreviewLine3);
StringBuilder builder = new StringBuilder(text);
int index1 = text.indexOf('*');
int index2 = text.lastIndexOf('*');
if (index1 != -1 && index2 != -1) {
builder.replace(index2, index2 + 1, "");
builder.replace(index1, index1 + 1, "");
TLRPC.TL_messageEntityTextUrl entityUrl = new TLRPC.TL_messageEntityTextUrl();
entityUrl.offset = index1;
entityUrl.length = index2 - index1 - 1;
entityUrl.url = "https://telegram.org";
message.entities.add(entityUrl);
}
message.message = builder.toString();
2019-09-10 12:56:11 +02:00
}
message.date = date + 960;
message.dialog_id = 1;
message.flags = 259;
2020-09-30 15:48:47 +02:00
message.from_id = new TLRPC.TL_peerUser();
message.from_id.user_id = UserConfig.getInstance(UserConfig.selectedAccount).getClientUserId();
2019-09-10 12:56:11 +02:00
message.id = 1;
message.media = new TLRPC.TL_messageMediaEmpty();
message.out = true;
2020-09-30 15:48:47 +02:00
message.peer_id = new TLRPC.TL_peerUser();
message.peer_id.user_id = 0;
2020-08-14 18:58:22 +02:00
MessageObject message1 = new MessageObject(UserConfig.selectedAccount, message, true, false);
2019-09-10 12:56:11 +02:00
message1.resetLayout();
message1.eventId = 1;
message = new TLRPC.TL_message();
if (type == 0) {
message.message = LocaleController.getString("FontSizePreviewLine1", R.string.FontSizePreviewLine1);
} else {
message.message = LocaleController.getString("NewThemePreviewLine1", R.string.NewThemePreviewLine1);
}
message.date = date + 60;
message.dialog_id = 1;
message.flags = 257 + 8;
2020-09-30 15:48:47 +02:00
message.from_id = new TLRPC.TL_peerUser();
2019-09-10 12:56:11 +02:00
message.id = 1;
2020-09-30 15:48:47 +02:00
message.reply_to = new TLRPC.TL_messageReplyHeader();
message.reply_to.reply_to_msg_id = 5;
2019-09-10 12:56:11 +02:00
message.media = new TLRPC.TL_messageMediaEmpty();
message.out = false;
2020-09-30 15:48:47 +02:00
message.peer_id = new TLRPC.TL_peerUser();
message.peer_id.user_id = UserConfig.getInstance(UserConfig.selectedAccount).getClientUserId();
2020-08-14 18:58:22 +02:00
MessageObject message2 = new MessageObject(UserConfig.selectedAccount, message, true, false);
2019-09-10 12:56:11 +02:00
if (type == 0) {
message2.customReplyName = LocaleController.getString("FontSizePreviewName", R.string.FontSizePreviewName);
} else {
message2.customReplyName = LocaleController.getString("NewThemePreviewName", R.string.NewThemePreviewName);
}
message2.eventId = 1;
message2.resetLayout();
message2.replyMessageObject = replyMessageObject;
for (int a = 0; a < cells.length; a++) {
cells[a] = new ChatMessageCell(context);
cells[a].setDelegate(new ChatMessageCell.ChatMessageCellDelegate() {
});
cells[a].isChat = false;
cells[a].setFullyDraw(true);
cells[a].setMessageObject(a == 0 ? message2 : message1, null, false, false);
addView(cells[a], LayoutHelper.createLinear(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
}
}
public ChatMessageCell[] getCells() {
return cells;
}
@Override
public void invalidate() {
super.invalidate();
for (int a = 0; a < cells.length; a++) {
cells[a].invalidate();
}
}
@Override
protected void onDraw(Canvas canvas) {
Drawable newDrawable = Theme.getCachedWallpaperNonBlocking();
if (newDrawable != backgroundDrawable && newDrawable != null) {
if (Theme.isAnimatingColor()) {
oldBackgroundDrawable = backgroundDrawable;
2019-12-31 14:08:08 +01:00
oldBackgroundGradientDisposable = backgroundGradientDisposable;
} else if (backgroundGradientDisposable != null) {
backgroundGradientDisposable.dispose();
backgroundGradientDisposable = null;
2019-09-10 12:56:11 +02:00
}
backgroundDrawable = newDrawable;
}
float themeAnimationValue = parentLayout.getThemeAnimationValue();
for (int a = 0; a < 2; a++) {
Drawable drawable = a == 0 ? oldBackgroundDrawable : backgroundDrawable;
if (drawable == null) {
continue;
}
if (a == 1 && oldBackgroundDrawable != null && parentLayout != null) {
drawable.setAlpha((int) (255 * themeAnimationValue));
} else {
drawable.setAlpha(255);
}
if (drawable instanceof ColorDrawable || drawable instanceof GradientDrawable) {
drawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
2019-12-31 14:08:08 +01:00
if (drawable instanceof BackgroundGradientDrawable) {
final BackgroundGradientDrawable backgroundGradientDrawable = (BackgroundGradientDrawable) drawable;
backgroundGradientDisposable = backgroundGradientDrawable.drawExactBoundsSize(canvas, this);
} else {
drawable.draw(canvas);
}
2019-09-10 12:56:11 +02:00
} else if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if (bitmapDrawable.getTileModeX() == Shader.TileMode.REPEAT) {
canvas.save();
float scale = 2.0f / AndroidUtilities.density;
canvas.scale(scale, scale);
drawable.setBounds(0, 0, (int) Math.ceil(getMeasuredWidth() / scale), (int) Math.ceil(getMeasuredHeight() / scale));
} else {
int viewHeight = getMeasuredHeight();
float scaleX = (float) getMeasuredWidth() / (float) drawable.getIntrinsicWidth();
float scaleY = (float) (viewHeight) / (float) drawable.getIntrinsicHeight();
2020-08-14 18:58:22 +02:00
float scale = Math.max(scaleX, scaleY);
2019-09-10 12:56:11 +02:00
int width = (int) Math.ceil(drawable.getIntrinsicWidth() * scale);
int height = (int) Math.ceil(drawable.getIntrinsicHeight() * scale);
int x = (getMeasuredWidth() - width) / 2;
int y = (viewHeight - height) / 2;
canvas.save();
canvas.clipRect(0, 0, width, getMeasuredHeight());
drawable.setBounds(x, y, x + width, y + height);
}
2020-08-14 18:58:22 +02:00
drawable.draw(canvas);
canvas.restore();
2019-09-10 12:56:11 +02:00
}
if (a == 0 && oldBackgroundDrawable != null && themeAnimationValue >= 1.0f) {
2019-12-31 14:08:08 +01:00
if (oldBackgroundGradientDisposable != null) {
oldBackgroundGradientDisposable.dispose();
oldBackgroundGradientDisposable = null;
}
2019-09-10 12:56:11 +02:00
oldBackgroundDrawable = null;
2019-12-31 14:08:08 +01:00
invalidate();
2019-09-10 12:56:11 +02:00
}
}
shadowDrawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
shadowDrawable.draw(canvas);
}
2019-12-31 14:08:08 +01:00
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (backgroundGradientDisposable != null) {
backgroundGradientDisposable.dispose();
backgroundGradientDisposable = null;
}
if (oldBackgroundGradientDisposable != null) {
oldBackgroundGradientDisposable.dispose();
oldBackgroundGradientDisposable = null;
}
}
2019-09-10 12:56:11 +02:00
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return false;
}
@Override
protected void dispatchSetPressed(boolean pressed) {
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return false;
}
}