NekoX/TMessagesProj/src/main/java/org/telegram/ui/ActionBar/EmojiThemes.java

626 lines
24 KiB
Java

package org.telegram.ui.ActionBar;
import android.app.Activity;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.util.Pair;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.ChatThemeController;
import org.telegram.messenger.FileLoader;
import org.telegram.messenger.FileLog;
import org.telegram.messenger.ImageLoader;
import org.telegram.messenger.ImageLocation;
import org.telegram.messenger.ImageReceiver;
import org.telegram.messenger.Utilities;
import org.telegram.tgnet.ResultCallback;
import org.telegram.tgnet.TLRPC;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class EmojiThemes {
public boolean showAsDefaultStub;
public String emoji;
int currentIndex = 0;
public ArrayList<ThemeItem> items = new ArrayList<>();
private static final String[] previewColorKeys = new String[]{
Theme.key_chat_inBubble,
Theme.key_chat_outBubble,
Theme.key_featuredStickers_addButton,
Theme.key_chat_wallpaper,
Theme.key_chat_wallpaper_gradient_to1,
Theme.key_chat_wallpaper_gradient_to2,
Theme.key_chat_wallpaper_gradient_to3,
Theme.key_chat_wallpaper_gradient_rotation
};
private EmojiThemes() {
}
public EmojiThemes(TLRPC.TL_theme chatThemeObject, boolean isDefault) {
this.showAsDefaultStub = isDefault;
this.emoji = chatThemeObject.emoticon;
if (!isDefault) {
ThemeItem lightTheme = new ThemeItem();
lightTheme.tlTheme = chatThemeObject;
lightTheme.settingsIndex = 0;
items.add(lightTheme);
ThemeItem darkTheme = new ThemeItem();
darkTheme.tlTheme = chatThemeObject;
darkTheme.settingsIndex = 1;
items.add(darkTheme);
}
}
public static EmojiThemes createPreviewFullTheme(TLRPC.TL_theme tl_theme) {
EmojiThemes chatTheme = new EmojiThemes();
chatTheme.emoji = tl_theme.emoticon;
for (int i = 0; i < tl_theme.settings.size(); i++) {
ThemeItem theme = new ThemeItem();
theme.tlTheme = tl_theme;
theme.settingsIndex = i;
chatTheme.items.add(theme);
}
return chatTheme;
}
public static EmojiThemes createChatThemesDefault() {
EmojiThemes themeItem = new EmojiThemes();
themeItem.emoji = "";
themeItem.showAsDefaultStub = true;
ThemeItem lightTheme = new ThemeItem();
lightTheme.themeInfo = getDefaultThemeInfo(true);
themeItem.items.add(lightTheme);
ThemeItem darkTheme = new ThemeItem();
darkTheme.themeInfo = getDefaultThemeInfo(false);
themeItem.items.add(darkTheme);
return themeItem;
}
public static EmojiThemes createPreviewCustom() {
EmojiThemes themeItem = new EmojiThemes();
themeItem.emoji = "\uD83C\uDFA8";
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("themeconfig", Activity.MODE_PRIVATE);
String lastDayCustomTheme = preferences.getString("lastDayCustomTheme", null);
int dayAccentId = preferences.getInt("lastDayCustomThemeAccentId", -1);
if (lastDayCustomTheme == null || Theme.getTheme(lastDayCustomTheme) == null) {
lastDayCustomTheme = preferences.getString("lastDayTheme", "Blue");
Theme.ThemeInfo themeInfo = Theme.getTheme(lastDayCustomTheme);
if (themeInfo == null) {
lastDayCustomTheme = "Blue";
dayAccentId = 99;
} else {
dayAccentId = themeInfo.currentAccentId;
}
preferences.edit().putString("lastDayCustomTheme", lastDayCustomTheme).apply();
} else {
if (dayAccentId == -1) {
dayAccentId = Theme.getTheme(lastDayCustomTheme).lastAccentId;
}
}
if (dayAccentId == -1) {
lastDayCustomTheme = "Blue";
dayAccentId = 99;
}
String lastDarkCustomTheme = preferences.getString("lastDarkCustomTheme", null);
int darkAccentId = preferences.getInt("lastDarkCustomThemeAccentId", -1);
if (lastDarkCustomTheme == null || Theme.getTheme(lastDarkCustomTheme) == null) {
lastDarkCustomTheme = preferences.getString("lastDarkTheme", "Dark Blue");
Theme.ThemeInfo themeInfo = Theme.getTheme(lastDarkCustomTheme);
if (themeInfo == null) {
lastDarkCustomTheme = "Dark Blue";
darkAccentId = 0;
} else {
darkAccentId = themeInfo.currentAccentId;
}
preferences.edit().putString("lastDarkCustomTheme", lastDarkCustomTheme).apply();
} else {
if (darkAccentId == -1) {
darkAccentId = Theme.getTheme(lastDayCustomTheme).lastAccentId;
}
}
if (darkAccentId == -1) {
lastDarkCustomTheme = "Dark Blue";
darkAccentId = 0;
}
ThemeItem lightTheme = new ThemeItem();
lightTheme.themeInfo = Theme.getTheme(lastDayCustomTheme);
lightTheme.accentId = dayAccentId;
themeItem.items.add(lightTheme);
themeItem.items.add(null);
ThemeItem darkTheme = new ThemeItem();
darkTheme.themeInfo = Theme.getTheme(lastDarkCustomTheme);
darkTheme.accentId = darkAccentId;
themeItem.items.add(darkTheme);
themeItem.items.add(null);
return themeItem;
}
public static EmojiThemes createHomePreviewTheme() {
EmojiThemes themeItem = new EmojiThemes();
themeItem.emoji = "\uD83C\uDFE0";
ThemeItem blue = new ThemeItem();
blue.themeInfo = Theme.getTheme("Blue");
blue.accentId = 99;
themeItem.items.add(blue);
ThemeItem day = new ThemeItem();
day.themeInfo = Theme.getTheme("Day");
day.accentId = 9;
themeItem.items.add(day);
ThemeItem night = new ThemeItem();
night.themeInfo = Theme.getTheme("Night");
night.accentId = 0;
themeItem.items.add(night);
ThemeItem nightBlue = new ThemeItem();
nightBlue.themeInfo = Theme.getTheme("Dark Blue");
nightBlue.accentId = 0;
themeItem.items.add(nightBlue);
return themeItem;
}
public static EmojiThemes createHomeQrTheme() {
EmojiThemes themeItem = new EmojiThemes();
themeItem.emoji = "\uD83C\uDFE0";
ThemeItem blue = new ThemeItem();
blue.themeInfo = Theme.getTheme("Blue");
blue.accentId = 99;
themeItem.items.add(blue);
ThemeItem nightBlue = new ThemeItem();
nightBlue.themeInfo = Theme.getTheme("Dark Blue");
nightBlue.accentId = 0;
themeItem.items.add(nightBlue);
return themeItem;
}
public void initColors() {
getPreviewColors(0, 0);
getPreviewColors(0, 1);
}
public String getEmoticon() {
return emoji;
}
public TLRPC.TL_theme getTlTheme(int index) {
return items.get(index).tlTheme;
}
public TLRPC.WallPaper getWallpaper(int index) {
int settingsIndex = items.get(index).settingsIndex;
if (settingsIndex >= 0) {
TLRPC.TL_theme tlTheme = getTlTheme(index);
if (tlTheme != null) {
return tlTheme.settings.get(settingsIndex).wallpaper;
}
}
return null;
}
public String getWallpaperLink(int index) {
return items.get(index).wallpaperLink;
}
public int getSettingsIndex(int index) {
return items.get(index).settingsIndex;
}
public HashMap<String, Integer> getPreviewColors(int currentAccount, int index) {
HashMap<String, Integer> currentColors = items.get(index).currentPreviewColors;
if (currentColors != null) {
return currentColors;
}
Theme.ThemeInfo themeInfo = getThemeInfo(index);
Theme.ThemeAccent accent = null;
if (themeInfo == null) {
int settingsIndex = getSettingsIndex(index);
TLRPC.TL_theme tlTheme = getTlTheme(index);
Theme.ThemeInfo baseTheme = Theme.getTheme(Theme.getBaseThemeKey(tlTheme.settings.get(settingsIndex)));
themeInfo = new Theme.ThemeInfo(baseTheme);
accent = themeInfo.createNewAccent(tlTheme, currentAccount, true, settingsIndex);
themeInfo.setCurrentAccentId(accent.id);
} else {
if (themeInfo.themeAccentsMap != null) {
accent = themeInfo.themeAccentsMap.get(items.get(index).accentId);
}
}
HashMap<String, Integer> currentColorsNoAccent = new HashMap<>();
String[] wallpaperLink = new String[1];
if (themeInfo.pathToFile != null) {
currentColorsNoAccent.putAll(Theme.getThemeFileValues(new File(themeInfo.pathToFile), null, wallpaperLink));
} else if (themeInfo.assetName != null) {
currentColorsNoAccent.putAll(Theme.getThemeFileValues(null, themeInfo.assetName, wallpaperLink));
}
items.get(index).wallpaperLink = wallpaperLink[0];
if (accent != null) {
currentColors = new HashMap<>(currentColorsNoAccent);
accent.fillAccentColors(currentColorsNoAccent, currentColors);
currentColorsNoAccent.clear();
} else {
currentColors = currentColorsNoAccent;
}
HashMap<String, String> fallbackKeys = Theme.getFallbackKeys();
items.get(index).currentPreviewColors = new HashMap<>();
for (int i = 0; i < previewColorKeys.length; i++) {
String key = previewColorKeys[i];
items.get(index).currentPreviewColors.put(key, currentColors.get(key));
if (!items.get(index).currentPreviewColors.containsKey(key)) {
Integer color = currentColors.get(fallbackKeys.get(key));
currentColors.put(key, color);
}
}
currentColors.clear();
return items.get(index).currentPreviewColors;
}
public HashMap<String, Integer> createColors(int currentAccount, int index) {
HashMap<String, Integer> currentColors;
Theme.ThemeInfo themeInfo = getThemeInfo(index);
Theme.ThemeAccent accent = null;
if (themeInfo == null) {
int settingsIndex = getSettingsIndex(index);
TLRPC.TL_theme tlTheme = getTlTheme(index);
Theme.ThemeInfo baseTheme = Theme.getTheme(Theme.getBaseThemeKey(tlTheme.settings.get(settingsIndex)));
themeInfo = new Theme.ThemeInfo(baseTheme);
accent = themeInfo.createNewAccent(tlTheme, currentAccount, true, settingsIndex);
themeInfo.setCurrentAccentId(accent.id);
} else {
if (themeInfo.themeAccentsMap != null) {
accent = themeInfo.themeAccentsMap.get(items.get(index).accentId);
}
}
HashMap<String, Integer> currentColorsNoAccent = new HashMap<>();
String[] wallpaperLink = new String[1];
if (themeInfo.pathToFile != null) {
currentColorsNoAccent.putAll(Theme.getThemeFileValues(new File(themeInfo.pathToFile), null, wallpaperLink));
} else if (themeInfo.assetName != null) {
currentColorsNoAccent.putAll(Theme.getThemeFileValues(null, themeInfo.assetName, wallpaperLink));
}
items.get(index).wallpaperLink = wallpaperLink[0];
if (accent != null) {
currentColors = new HashMap<>(currentColorsNoAccent);
accent.fillAccentColors(currentColorsNoAccent, currentColors);
currentColorsNoAccent.clear();
} else {
currentColors = currentColorsNoAccent;
}
HashMap<String, String> fallbackKeys = Theme.getFallbackKeys();
for (Map.Entry<String, String> fallbackEntry : fallbackKeys.entrySet()) {
String colorKey = fallbackEntry.getKey();
if (!currentColors.containsKey(colorKey)) {
Integer color = currentColors.get(fallbackEntry.getValue());
currentColors.put(colorKey, color);
}
}
HashMap<String, Integer> defaultColors = Theme.getDefaultColors();
for (Map.Entry<String, Integer> entry : defaultColors.entrySet()) {
if (!currentColors.containsKey(entry.getKey())) {
currentColors.put(entry.getKey(), entry.getValue());
}
}
return currentColors;
}
public Theme.ThemeInfo getThemeInfo(int index) {
return items.get(index).themeInfo;
}
public void loadWallpaper(int index, ResultCallback<Pair<Long, Bitmap>> callback) {
final TLRPC.WallPaper wallPaper = getWallpaper(index);
if (wallPaper == null) {
if (callback != null) {
callback.onComplete(null);
}
return;
}
long themeId = getTlTheme(index).id;
ChatThemeController.getWallpaperBitmap(themeId, cachedBitmap -> {
if (cachedBitmap != null && callback != null) {
callback.onComplete(new Pair<>(themeId, cachedBitmap));
return;
}
ImageLocation imageLocation = ImageLocation.getForDocument(wallPaper.document);
ImageReceiver imageReceiver = new ImageReceiver();
String imageFilter;
int w = Math.min(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y);
int h = Math.max(AndroidUtilities.displaySize.x, AndroidUtilities.displaySize.y);
imageFilter = (int) (w / AndroidUtilities.density) + "_" + (int) (h / AndroidUtilities.density) + "_f";
imageReceiver.setImage(imageLocation, imageFilter, null, ".jpg", wallPaper, 1);
imageReceiver.setDelegate((receiver, set, thumb, memCache) -> {
ImageReceiver.BitmapHolder holder = receiver.getBitmapSafe();
if (!set || holder == null) {
return;
}
Bitmap bitmap = holder.bitmap;
if (bitmap == null && (holder.drawable instanceof BitmapDrawable)) {
bitmap = ((BitmapDrawable) holder.drawable).getBitmap();
}
if (callback != null) {
callback.onComplete(new Pair<>(themeId, bitmap));
}
ChatThemeController.saveWallpaperBitmap(bitmap, themeId);
});
ImageLoader.getInstance().loadImageForImageReceiver(imageReceiver);
});
}
public void loadWallpaperThumb(int index, ResultCallback<Pair<Long, Bitmap>> callback) {
final TLRPC.WallPaper wallpaper = getWallpaper(index);
if (wallpaper == null) {
if (callback != null) {
callback.onComplete(null);
}
return;
}
long themeId = getTlTheme(index).id;
Bitmap bitmap = ChatThemeController.getWallpaperThumbBitmap(themeId);
File file = getWallpaperThumbFile(themeId);
if (bitmap == null && file.exists() && file.length() > 0) {
try {
bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
} catch (Exception e) {
FileLog.e(e);
}
}
if (bitmap != null) {
if (callback != null) {
callback.onComplete(new Pair<>(themeId, bitmap));
}
return;
}
if (wallpaper.document == null) {
if (callback != null) {
callback.onComplete(new Pair<>(themeId, null));
}
return;
}
final TLRPC.PhotoSize thumbSize = FileLoader.getClosestPhotoSizeWithSize(wallpaper.document.thumbs, 140);
ImageLocation imageLocation = ImageLocation.getForDocument(thumbSize, wallpaper.document);
ImageReceiver imageReceiver = new ImageReceiver();
imageReceiver.setImage(imageLocation, "120_140", null, null, null, 1);
imageReceiver.setDelegate((receiver, set, thumb, memCache) -> {
ImageReceiver.BitmapHolder holder = receiver.getBitmapSafe();
if (!set || holder == null || holder.bitmap.isRecycled()) {
return;
}
Bitmap resultBitmap = holder.bitmap;
if (resultBitmap == null && (holder.drawable instanceof BitmapDrawable)) {
resultBitmap = ((BitmapDrawable) holder.drawable).getBitmap();
}
if (resultBitmap != null) {
if (callback != null) {
callback.onComplete(new Pair<>(themeId, resultBitmap));
}
final Bitmap saveBitmap = resultBitmap;
Utilities.globalQueue.postRunnable(() -> {
try (FileOutputStream outputStream = new FileOutputStream(file)) {
saveBitmap.compress(Bitmap.CompressFormat.PNG, 87, outputStream);
} catch (Exception e) {
FileLog.e(e);
}
});
} else {
if (callback != null) {
callback.onComplete(null);
}
}
});
ImageLoader.getInstance().loadImageForImageReceiver(imageReceiver);
}
public void preloadWallpaper() {
loadWallpaperThumb(0, null);
loadWallpaperThumb(1, null);
loadWallpaper(0, null);
loadWallpaper(1, null);
}
private File getWallpaperThumbFile(long themeId) {
return new File(ApplicationLoader.getFilesDirFixed(), "wallpaper_thumb_" + themeId + ".png");
}
public static Theme.ThemeInfo getDefaultThemeInfo(boolean isDark) {
Theme.ThemeInfo themeInfo = isDark ? Theme.getCurrentNightTheme() : Theme.getCurrentTheme();
if (isDark != themeInfo.isDark()) {
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("themeconfig", Activity.MODE_PRIVATE);
String lastThemeName = isDark
? preferences.getString("lastDarkTheme", "Dark Blue")
: preferences.getString("lastDayTheme", "Blue");
themeInfo = Theme.getTheme(lastThemeName);
if (themeInfo == null) {
themeInfo = Theme.getTheme(isDark ? "Dark Blue" : "Blue");
}
}
return new Theme.ThemeInfo(themeInfo);
}
public static void fillTlTheme(Theme.ThemeInfo themeInfo) {
if (themeInfo.info == null) {
themeInfo.info = new TLRPC.TL_theme();
}
}
public static HashMap<String, Integer> getPreviewColors(Theme.ThemeInfo themeInfo) {
HashMap<String, Integer> currentColorsNoAccent = new HashMap<>();
if (themeInfo.pathToFile != null) {
currentColorsNoAccent.putAll(Theme.getThemeFileValues(new File(themeInfo.pathToFile), null, null));
} else if (themeInfo.assetName != null) {
currentColorsNoAccent.putAll(Theme.getThemeFileValues(null, themeInfo.assetName, null));
}
HashMap<String, Integer> currentColors = new HashMap<>(currentColorsNoAccent);
Theme.ThemeAccent themeAccent = themeInfo.getAccent(false);
if (themeAccent != null) {
themeAccent.fillAccentColors(currentColorsNoAccent, currentColors);
}
return currentColors;
}
public int getAccentId(int themeIndex) {
return items.get(themeIndex).accentId;
}
public void loadPreviewColors(int currentAccount) {
for (int i = 0; i < items.size(); i++) {
if (items.get(i) == null) {
continue;
}
HashMap<String, Integer> colorsMap = getPreviewColors(currentAccount, i);
Integer color = colorsMap.get(Theme.key_chat_inBubble);
if (color == null) {
color = Theme.getDefaultColor(Theme.key_chat_inBubble);
}
items.get(i).inBubbleColor = color;
color = colorsMap.get(Theme.key_chat_outBubble);
if (color == null) {
color = Theme.getDefaultColor(Theme.key_chat_outBubble);
}
items.get(i).outBubbleColor = color;
color = colorsMap.get(Theme.key_featuredStickers_addButton);
if (color == null) {
color = Theme.getDefaultColor(Theme.key_featuredStickers_addButton);
}
items.get(i).outLineColor = color;
color = colorsMap.get(Theme.key_chat_wallpaper);
if (color == null) {
items.get(i).patternBgColor = 0;
} else {
items.get(i).patternBgColor = color;
}
color = colorsMap.get(Theme.key_chat_wallpaper_gradient_to1);
if (color == null) {
items.get(i).patternBgGradientColor1 = 0;
} else {
items.get(i).patternBgGradientColor1 = color;
}
color = colorsMap.get(Theme.key_chat_wallpaper_gradient_to2);
if (color == null) {
items.get(i).patternBgGradientColor2 = 0;
} else {
items.get(i).patternBgGradientColor2 = color;
}
color = colorsMap.get(Theme.key_chat_wallpaper_gradient_to3);
if (color == null) {
items.get(i).patternBgGradientColor3 = 0;
} else {
items.get(i).patternBgGradientColor3 = color;
}
color = colorsMap.get(Theme.key_chat_wallpaper_gradient_rotation);
if (color == null) {
items.get(i).patternBgRotation = 0;
} else {
items.get(i).patternBgRotation = color;
}
if (items.get(i).themeInfo != null && items.get(i).themeInfo.getKey().equals("Blue")) {
int accentId = items.get(i).accentId >= 0 ? items.get(i).accentId : items.get(i).themeInfo.currentAccentId;
if (accentId == 99) {
items.get(i).patternBgColor = 0xffdbddbb;
items.get(i).patternBgGradientColor1 = 0xff6ba587;
items.get(i).patternBgGradientColor2 = 0xffd5d88d;
items.get(i).patternBgGradientColor3 = 0xff88b884;
}
}
}
}
public ThemeItem getThemeItem(int index) {
return items.get(index);
}
public static void saveCustomTheme(Theme.ThemeInfo themeInfo, int accentId) {
if (themeInfo == null) {
return;
}
if (accentId >= 0 && themeInfo.themeAccentsMap != null) {
Theme.ThemeAccent accent = themeInfo.themeAccentsMap.get(accentId);
if (accent == null || accent.isDefault) {
return;
}
}
if (themeInfo.getKey().equals("Blue") && accentId == 99) {
return;
}
if (themeInfo.getKey().equals("Day") && accentId == 9) {
return;
}
if (themeInfo.getKey().equals("Night") && accentId == 0) {
return;
}
if (themeInfo.getKey().equals("Dark Blue") && accentId == 0) {
return;
}
boolean dark = themeInfo.isDark();
String key = dark ? "lastDarkCustomTheme" : "lastDayCustomTheme";
String accentKey = dark ? "lastDarkCustomThemeAccentId" : "lastDayCustomThemeAccentId";
ApplicationLoader.applicationContext.getSharedPreferences("themeconfig", Activity.MODE_PRIVATE).edit()
.putString(key, themeInfo.getKey())
.putInt(accentKey, accentId)
.apply();
}
public static class ThemeItem {
public Theme.ThemeInfo themeInfo;
TLRPC.TL_theme tlTheme;
int settingsIndex;
public int accentId = -1;
public HashMap<String, Integer> currentPreviewColors;
private String wallpaperLink;
public int inBubbleColor;
public int outBubbleColor;
public int outLineColor;
public int patternBgColor;
public int patternBgGradientColor1;
public int patternBgGradientColor2;
public int patternBgGradientColor3;
public int patternBgRotation;
}
}