NekoX/TMessagesProj/src/main/java/org/telegram/ui/DefaultThemesPreviewCell.java

402 lines
19 KiB
Java

package org.telegram.ui;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import androidx.core.graphics.ColorUtils;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.NotificationCenter;
import org.telegram.messenger.R;
import org.telegram.tgnet.TLRPC;
import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.EmojiThemes;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Cells.DrawerProfileCell;
import org.telegram.ui.Cells.TextCell;
import org.telegram.ui.Components.ChatThemeBottomSheet;
import org.telegram.ui.Components.ThemeSmallPreviewView;
import org.telegram.ui.Components.FlickerLoadingView;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.RLottieDrawable;
import org.telegram.ui.Components.RecyclerListView;
import java.util.ArrayList;
@SuppressLint("ViewConstructor")
public class DefaultThemesPreviewCell extends LinearLayout {
private final RecyclerListView recyclerView;
private final LinearLayoutManager layoutManager;
private final FlickerLoadingView progressView;
private final ChatThemeBottomSheet.Adapter adapter;
RLottieDrawable darkThemeDrawable;
TextCell dayNightCell;
TextCell browseThemesCell;
private int selectedPosition = -1;
BaseFragment parentFragment;
int currentType;
int themeIndex;
public DefaultThemesPreviewCell(Context context, BaseFragment parentFragment, int type) {
super(context);
this.currentType = type;
this.parentFragment = parentFragment;
setOrientation(LinearLayout.VERTICAL);
FrameLayout frameLayout = new FrameLayout(context);
addView(frameLayout, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
adapter = new ChatThemeBottomSheet.Adapter(parentFragment.getCurrentAccount(), null, currentType == ThemeActivity.THEME_TYPE_BASIC ? ThemeSmallPreviewView.TYPE_DEFAULT : ThemeSmallPreviewView.TYPE_GRID);
recyclerView = new RecyclerListView(getContext());
recyclerView.setAdapter(adapter);
recyclerView.setClipChildren(false);
recyclerView.setClipToPadding(false);
recyclerView.setHasFixedSize(true);
recyclerView.setItemAnimator(null);
recyclerView.setNestedScrollingEnabled(false);
if (currentType == ThemeActivity.THEME_TYPE_BASIC) {
recyclerView.setLayoutManager(layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
} else {
recyclerView.setHasFixedSize(false);
GridLayoutManager gridLayoutManager = new GridLayoutManager(getContext(), 3);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return 1;
}
});
recyclerView.setLayoutManager(layoutManager = gridLayoutManager);
}
recyclerView.setFocusable(false);
recyclerView.setPadding(AndroidUtilities.dp(12), 0, AndroidUtilities.dp(12), 0);
recyclerView.setOnItemClickListener((view, position) -> {
ChatThemeBottomSheet.ChatThemeItem chatTheme = adapter.items.get(position);
Theme.ThemeInfo info = chatTheme.chatTheme.getThemeInfo(themeIndex);
int accentId = -1;
if (chatTheme.chatTheme.getEmoticon().equals("\uD83C\uDFE0") || chatTheme.chatTheme.getEmoticon().equals("\uD83C\uDFA8")) {
accentId = chatTheme.chatTheme.getAccentId(themeIndex);
}
if (info == null) {
TLRPC.TL_theme theme = chatTheme.chatTheme.getTlTheme(themeIndex);
int settingsIndex = chatTheme.chatTheme.getSettingsIndex(themeIndex);
TLRPC.ThemeSettings settings = theme.settings.get(settingsIndex);
String key = Theme.getBaseThemeKey(settings);
info = Theme.getTheme(key);
if (info != null) {
Theme.ThemeAccent accent = info.accentsByThemeId.get(theme.id);
if (accent == null) {
accent = info.createNewAccent(theme, parentFragment.getCurrentAccount());
}
accentId = accent.id;
info.setCurrentAccentId(accentId);
}
}
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needSetDayNightTheme, info, false, null, accentId);
selectedPosition = position;
for (int i = 0; i < adapter.items.size(); i++) {
adapter.items.get(i).isSelected = i == selectedPosition;
}
adapter.setSelectedItem(selectedPosition);
for (int i = 0; i < recyclerView.getChildCount(); i++) {
ThemeSmallPreviewView child = (ThemeSmallPreviewView) recyclerView.getChildAt(i);
if (child != view) {
child.cancelAnimation();
}
}
((ThemeSmallPreviewView) view).playEmojiAnimation();
if (info != null) {
SharedPreferences.Editor editor = ApplicationLoader.applicationContext.getSharedPreferences("themeconfig", Activity.MODE_PRIVATE).edit();
editor.putString(currentType == ThemeActivity.THEME_TYPE_NIGHT || info.isDark() ? "lastDarkTheme" : "lastDayTheme", info.getKey());
editor.commit();
}
});
progressView = new FlickerLoadingView(getContext(), null);
progressView.setViewType(FlickerLoadingView.CHAT_THEMES_TYPE);
progressView.setVisibility(View.VISIBLE);
if (currentType == ThemeActivity.THEME_TYPE_BASIC) {
frameLayout.addView(progressView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 104, Gravity.START, 0, 8, 0, 8));
frameLayout.addView(recyclerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 104, Gravity.START, 0, 8, 0, 8));
} else {
frameLayout.addView(progressView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 104, Gravity.START, 0, 8, 0, 8));
frameLayout.addView(recyclerView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.START, 0, 8, 0, 8));
}
recyclerView.setEmptyView(progressView);
recyclerView.setAnimateEmptyView(true, 0);
if (currentType == ThemeActivity.THEME_TYPE_BASIC) {
darkThemeDrawable = new RLottieDrawable(R.raw.sun_outline, "" + R.raw.sun_outline, AndroidUtilities.dp(28), AndroidUtilities.dp(28), true, null);
darkThemeDrawable.setPlayInDirectionOfCustomEndFrame(true);
darkThemeDrawable.beginApplyLayerColors();
darkThemeDrawable.commitApplyLayerColors();
dayNightCell = new TextCell(context);
dayNightCell.imageLeft = 21;
addView(dayNightCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
browseThemesCell = new TextCell(context);
browseThemesCell.setTextAndIcon(LocaleController.getString("SettingsBrowseThemes", R.string.SettingsBrowseThemes), R.drawable.msg_colors, false);
addView(browseThemesCell, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT));
dayNightCell.setOnClickListener(new OnClickListener() {
@SuppressLint("NotifyDataSetChanged")
@Override
public void onClick(View view) {
if (DrawerProfileCell.switchingTheme) {
return;
}
int iconOldColor = Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4);
DrawerProfileCell.switchingTheme = true;
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("themeconfig", Activity.MODE_PRIVATE);
String dayThemeName = preferences.getString("lastDayTheme", "Blue");
if (Theme.getTheme(dayThemeName) == null || Theme.getTheme(dayThemeName).isDark()) {
dayThemeName = "Blue";
}
String nightThemeName = preferences.getString("lastDarkTheme", "Dark Blue");
if (Theme.getTheme(nightThemeName) == null || !Theme.getTheme(nightThemeName).isDark()) {
nightThemeName = "Dark Blue";
}
Theme.ThemeInfo themeInfo = Theme.getActiveTheme();
if (dayThemeName.equals(nightThemeName)) {
if (themeInfo.isDark() || dayThemeName.equals("Dark Blue") || dayThemeName.equals("Night")) {
dayThemeName = "Blue";
} else {
nightThemeName = "Dark Blue";
}
}
boolean toDark;
if (toDark = !Theme.isCurrentThemeDark()) {
themeInfo = Theme.getTheme(nightThemeName);
} else {
themeInfo = Theme.getTheme(dayThemeName);
}
darkThemeDrawable.setCustomEndFrame(toDark ? darkThemeDrawable.getFramesCount() - 1 : 0);
dayNightCell.getImageView().playAnimation();
int[] pos = new int[2];
dayNightCell.getImageView().getLocationInWindow(pos);
pos[0] += dayNightCell.getImageView().getMeasuredWidth() / 2;
pos[1] += dayNightCell.getImageView().getMeasuredHeight() / 2 + AndroidUtilities.dp(3);
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needSetDayNightTheme, themeInfo, false, pos, -1, toDark, dayNightCell.getImageView());
updateDayNightMode();
updateSelectedPosition();
int iconNewColor = Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4);
darkThemeDrawable.setColorFilter(new PorterDuffColorFilter(iconNewColor, PorterDuff.Mode.SRC_IN));
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1f);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int color = ColorUtils.blendARGB(iconOldColor, iconNewColor, (Float) valueAnimator.getAnimatedValue());
darkThemeDrawable.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN));
}
});
valueAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
darkThemeDrawable.setColorFilter(new PorterDuffColorFilter(iconNewColor, PorterDuff.Mode.SRC_IN));
super.onAnimationEnd(animation);
}
});
valueAnimator.setDuration(350);
valueAnimator.start();
if (Theme.isCurrentThemeDay()) {
dayNightCell.setTextAndIcon(LocaleController.getString("SettingsSwitchToNightMode", R.string.SettingsSwitchToNightMode), darkThemeDrawable, true);
} else {
dayNightCell.setTextAndIcon(LocaleController.getString("SettingsSwitchToDayMode", R.string.SettingsSwitchToDayMode), darkThemeDrawable, true);
}
}
});
darkThemeDrawable.setPlayInDirectionOfCustomEndFrame(true);
browseThemesCell.setOnClickListener(view -> {
parentFragment.presentFragment(new ThemeActivity(ThemeActivity.THEME_TYPE_THEMES_BROWSER));
});
if (!Theme.isCurrentThemeDay()) {
darkThemeDrawable.setCurrentFrame(darkThemeDrawable.getFramesCount() - 1);
dayNightCell.setTextAndIcon(LocaleController.getString("SettingsSwitchToDayMode", R.string.SettingsSwitchToDayMode), darkThemeDrawable, true);
} else {
dayNightCell.setTextAndIcon(LocaleController.getString("SettingsSwitchToNightMode", R.string.SettingsSwitchToNightMode), darkThemeDrawable, true);
}
}
if (!Theme.defaultEmojiThemes.isEmpty()) {
ArrayList<ChatThemeBottomSheet.ChatThemeItem> themes = new ArrayList<>(Theme.defaultEmojiThemes);
if (currentType == ThemeActivity.THEME_TYPE_BASIC) {
EmojiThemes chatTheme = EmojiThemes.createPreviewCustom();
chatTheme.loadPreviewColors(parentFragment.getCurrentAccount());
ChatThemeBottomSheet.ChatThemeItem item = new ChatThemeBottomSheet.ChatThemeItem(chatTheme);
item.themeIndex = !Theme.isCurrentThemeDay() ? 2 : 0;
themes.add(item);
}
adapter.setItems(themes);
}
updateDayNightMode();
updateSelectedPosition();
updateColors();
if (selectedPosition >= 0) {
layoutManager.scrollToPositionWithOffset(selectedPosition, AndroidUtilities.dp(16));
}
}
public void updateDayNightMode() {
if (currentType == ThemeActivity.THEME_TYPE_BASIC) {
themeIndex = !Theme.isCurrentThemeDay() ? 2 : 0;
} else {
if (Theme.getActiveTheme().getKey().equals("Blue")) {
themeIndex = 0;
} else if (Theme.getActiveTheme().getKey().equals("Day")) {
themeIndex = 1;
} else if (Theme.getActiveTheme().getKey().equals("Night")) {
themeIndex = 2;
} else if (Theme.getActiveTheme().getKey().equals("Dark Blue")) {
themeIndex = 3;
} else {
if (Theme.isCurrentThemeDay() && (themeIndex == 2 || themeIndex == 3)) {
themeIndex = 0;
}
if (!Theme.isCurrentThemeDay() && (themeIndex == 0 || themeIndex == 1)) {
themeIndex = 2;
}
}
}
if (adapter.items != null) {
for (int i = 0; i < adapter.items.size(); i++) {
adapter.items.get(i).themeIndex = themeIndex;
}
adapter.notifyItemRangeChanged(0, adapter.items.size());
}
updateSelectedPosition();
}
private void updateSelectedPosition() {
if (adapter.items == null) {
return;
}
selectedPosition = -1;
for (int i = 0; i < adapter.items.size(); i++) {
TLRPC.TL_theme theme = adapter.items.get(i).chatTheme.getTlTheme(themeIndex);
Theme.ThemeInfo themeInfo = adapter.items.get(i).chatTheme.getThemeInfo(themeIndex);
if (theme != null) {
int settingsIndex = adapter.items.get(i).chatTheme.getSettingsIndex(themeIndex);
String key = Theme.getBaseThemeKey(theme.settings.get(settingsIndex));
if (Theme.getActiveTheme().name.equals(key)) {
if (Theme.getActiveTheme().accentsByThemeId == null) {
selectedPosition = i;
break;
} else {
Theme.ThemeAccent accent = Theme.getActiveTheme().accentsByThemeId.get(theme.id);
if (accent != null && accent.id == Theme.getActiveTheme().currentAccentId) {
selectedPosition = i;
break;
}
}
}
} else if (themeInfo != null) {
String key = themeInfo.getKey();
if (Theme.getActiveTheme().name.equals(key) && adapter.items.get(i).chatTheme.getAccentId(themeIndex) == Theme.getActiveTheme().currentAccentId) {
selectedPosition = i;
break;
}
}
}
if (selectedPosition == -1 && currentType != ThemeActivity.THEME_TYPE_THEMES_BROWSER) {
selectedPosition = adapter.items.size() - 1;
}
for (int i = 0; i < adapter.items.size(); i++) {
adapter.items.get(i).isSelected = i == selectedPosition;
}
adapter.setSelectedItem(selectedPosition);
}
public void selectTheme(Theme.ThemeInfo themeInfo) {
if (themeInfo.info != null) {
if (!themeInfo.themeLoaded) {
return;
}
}
if (!TextUtils.isEmpty(themeInfo.assetName)) {
Theme.PatternsLoader.createLoader(false);
}
if (currentType != ThemeActivity.THEME_TYPE_OTHER) {
SharedPreferences.Editor editor = ApplicationLoader.applicationContext.getSharedPreferences("themeconfig", Activity.MODE_PRIVATE).edit();
editor.putString(currentType == ThemeActivity.THEME_TYPE_NIGHT || themeInfo.isDark() ? "lastDarkTheme" : "lastDayTheme", themeInfo.getKey());
editor.commit();
}
if (currentType == ThemeActivity.THEME_TYPE_NIGHT) {
if (themeInfo == Theme.getCurrentNightTheme()) {
return;
}
Theme.setCurrentNightTheme(themeInfo);
} else {
if (themeInfo == Theme.getActiveTheme()) {
return;
}
NotificationCenter.getGlobalInstance().postNotificationName(NotificationCenter.needSetDayNightTheme, themeInfo, false, null, -1);
}
//updateRows();
int count = getChildCount();
// for (int a = 0; a < count; a++) {
// View child = getChildAt(a);
// if (child instanceof ThemesHorizontalListCell.InnerThemeView) {
// ((ThemesHorizontalListCell.InnerThemeView) child).updateCurrentThemeCheck();
// }
// }
}
public void updateColors() {
if (currentType == ThemeActivity.THEME_TYPE_BASIC) {
darkThemeDrawable.setColorFilter(new PorterDuffColorFilter(Theme.getColor(Theme.key_windowBackgroundWhiteBlueText4), PorterDuff.Mode.SRC_IN));
dayNightCell.setBackground(Theme.createSelectorWithBackgroundDrawable(Theme.getColor(Theme.key_windowBackgroundWhite), Theme.getColor(Theme.key_listSelector)));
browseThemesCell.setBackground(Theme.createSelectorWithBackgroundDrawable(Theme.getColor(Theme.key_windowBackgroundWhite), Theme.getColor(Theme.key_listSelector)));
dayNightCell.setColors(null, Theme.key_windowBackgroundWhiteBlueText4);
browseThemesCell.setColors(Theme.key_windowBackgroundWhiteBlueText4, Theme.key_windowBackgroundWhiteBlueText4);
}
}
@Override
public void setBackgroundColor(int color) {
super.setBackgroundColor(color);
updateColors();
}
}