From 47f4c5c911a59f0639b9c75392bcee34f6ef98a2 Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Tue, 22 Nov 2022 16:58:09 +0300 Subject: [PATCH 01/95] Init --- .../vtosters/lite/themes/ColorReferences.java | 43 ++++++ .../ru/vtosters/lite/themes/ThemesCore.java | 143 ++++++++++++++++++ .../ru/vtosters/lite/themes/ThemesHacks.java | 61 ++++++++ .../ru/vtosters/lite/themes/VTLResources.java | 92 +++++++++++ .../ru/vtosters/lite/themes/ViewInjector.java | 45 ++++++ .../vtosters/lite/themes/hooks/BaseHook.java | 7 + .../lite/themes/hooks/ButtonHook.java | 24 +++ .../lite/themes/hooks/ImageViewHook.java | 24 +++ .../lite/themes/hooks/ProgressWheelHook.java | 21 +++ .../lite/themes/hooks/TabLayoutHook.java | 21 +++ .../lite/themes/hooks/TextViewHook.java | 92 +++++++++++ .../lite/themes/hooks/ToolbarHook.java | 14 ++ .../lite/themes/hooks/VKImageViewHook.java | 29 ++++ .../lite/themes/hooks/WaveformViewHook.java | 16 ++ .../lite/themes/utils/VkUiThemer.java | 81 ++++++++++ .../ru/vtosters/lite/utils/ThemesUtils.java | 25 ++- .../androidx/core/content/ContextCompat.smali | 7 + .../com/vk/core/ui/VKLayoutInflater.smali | 64 ++++++++ .../vk/core/ui/themes/VKThemeHelper$b.smali | 28 ++++ .../com/vk/core/util/ContextExtKt.smali | 13 ++ 20 files changed, 834 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/ThemesHacks.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/VTLResources.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/ViewInjector.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/hooks/BaseHook.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/hooks/ButtonHook.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/hooks/ImageViewHook.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/hooks/ProgressWheelHook.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/hooks/TabLayoutHook.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/hooks/ToolbarHook.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/hooks/VKImageViewHook.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/hooks/WaveformViewHook.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/utils/VkUiThemer.java diff --git a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java new file mode 100644 index 000000000..1217785b3 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java @@ -0,0 +1,43 @@ +package ru.vtosters.lite.themes; + +import android.content.res.ColorStateList; +import android.graphics.Color; + +import java.util.Arrays; +import java.util.List; + +import ru.vtosters.lite.utils.ThemesUtils; + +public class ColorReferences { + public static List accentColors = Arrays.asList( + "5692d7", "528bcc", "7aa0cc", "518bcc", "6296d0", "2f68aa", "638ebf", "5181b8", "71aaeb", + "4774a8", "5baaf4", "4186c8", "add3ff", "4774a8", "718198", "5a9eff", "99a2ad", "74a2d6", + "e9eef3", "dfe3e7", "eff1f3", "5c9ce6", "4986cc", "4680c2", "3f8ae0" + ); + + public static boolean isAccentedColor(ColorStateList target) { + return target != null && isAccentedColor(target.getDefaultColor()); + } + + public static boolean isAccentedColor(int target) { + return accentColors.contains(ThemesUtils.hexx(target).toLowerCase()); + } + + public static boolean isColorRefAccented(int target) { + return target == com.vtosters.lite.R.color.accent_blue || // accent_blue + target == com.vtosters.lite.R.color.blue_gray || // light_blue_gray + target == com.vtosters.lite.R.color.azure_300 || + target == com.vtosters.lite.R.color.light_blue_old || // light_blue + target == com.vtosters.lite.R.color.blue_200 || // blue_200 + target == com.vtosters.lite.R.color.vk_blue_400 || // blue_200 + target == com.vtosters.lite.R.color.blue_200_muted; // blue_200_muted + } + + public static boolean isCslNeedToBeThemed(ColorStateList csl) { + int unsel = csl.getColorForState(new int[]{-android.R.attr.state_selected}, Color.BLACK); + int sel = csl.getColorForState(new int[]{android.R.attr.state_selected}, Color.BLACK); + boolean isUnselAccent = isAccentedColor(unsel); + boolean isSelAccent = isAccentedColor(sel); + return ThemesCore.isCachedAccents() && (isUnselAccent || isSelAccent); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java new file mode 100644 index 000000000..5e71bbdd8 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java @@ -0,0 +1,143 @@ +package ru.vtosters.lite.themes; + +import android.content.Context; +import android.util.Log; +import android.util.SparseBooleanArray; +import android.util.SparseIntArray; + +import androidx.annotation.IdRes; + +import ru.vtosters.lite.utils.ThemesUtils; + + +public class ThemesCore { + private static final String TAG = "ThemesCore"; + + public static SparseIntArray themedColors = new SparseIntArray(); + public static SparseBooleanArray ACCENT_THEME_ONLY_LIGHT = new SparseBooleanArray(); + public static SparseBooleanArray ACCENT_THEME_ONLY_NOMILK_LIGHT = new SparseBooleanArray(); + public static SparseBooleanArray ACCENT_THEME_ONLY_NOMILK = new SparseBooleanArray(); + public static SparseBooleanArray ACCENT_THEME_ONLY_MILK_LIGHT = new SparseBooleanArray(); + public static SparseBooleanArray ACCENT_THEME_ONLY_MILK_DARK = new SparseBooleanArray(); + + private static boolean cachedAccents = false; + + private static int wallDarkColor; + private static int wallLightColor; + + public static void setExceptions() { + ACCENT_THEME_ONLY_LIGHT.clear(); + ACCENT_THEME_ONLY_NOMILK_LIGHT.clear(); + ACCENT_THEME_ONLY_NOMILK.clear(); + ACCENT_THEME_ONLY_MILK_LIGHT.clear(); + ACCENT_THEME_ONLY_MILK_DARK.clear(); + + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.button_primary_background, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.button_secondary_foreground, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.button_tertiary_foreground, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.button_muted_foreground, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.button_outline_border, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.text_name, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.newsfeed_post_title_color, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.attach_picker_tab_active_background, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.attach_picker_tab_active_text, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.newsfeed_action_color, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.counter_primary_background, false); + ACCENT_THEME_ONLY_LIGHT.put(com.vtosters.lite.R.attr.action_sheet_action_foreground, false); + + ACCENT_THEME_ONLY_NOMILK_LIGHT.put(com.vtosters.lite.R.attr.header_background, false); + + ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.header_tint, false); + ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.header_tint_alternate, false); + ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.toolbarIconsColor, false); + ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.header_tab_active_indicator, false); + ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.im_dropdown_arrow_tint, false); + + ACCENT_THEME_ONLY_NOMILK.put(com.vtosters.lite.R.attr.im_dropdown_icon_color, false); + } + + public static void setThemedColors(int accentColor) { + cachedAccents = true; + themedColors.clear(); + + themedColors.put(com.vtosters.lite.R.attr.text_link, accentColor); + themedColors.put(com.vtosters.lite.R.attr.accent, accentColor); + themedColors.put(com.vtosters.lite.R.attr.newsfeed_dropdown_color, accentColor); + + themedColors.put(com.vtosters.lite.R.attr.vk_accent, accentColor); + themedColors.put(com.vtosters.lite.R.attr.accentColor, accentColor); + themedColors.put(com.vtosters.lite.R.attr.text_name, accentColor); + themedColors.put(com.vtosters.lite.R.attr.tabbar_active_icon, accentColor); + //themedColors.put(com.vtosters.lite.R.attr.header_background, accentColor); + themedColors.put(com.vtosters.lite.R.attr.header_tint, accentColor); + themedColors.put(com.vtosters.lite.R.attr.header_tint_alternate, accentColor); + themedColors.put(com.vtosters.lite.R.attr.activity_indicator_tint, accentColor); + themedColors.put(com.vtosters.lite.R.attr.toolbarIconsColor, accentColor); + + themedColors.put(com.vtosters.lite.R.attr.button_primary_background, accentColor); + themedColors.put(com.vtosters.lite.R.attr.button_secondary_foreground, accentColor); + themedColors.put(com.vtosters.lite.R.attr.button_tertiary_foreground, accentColor); + themedColors.put(com.vtosters.lite.R.attr.button_outline_border, accentColor); + themedColors.put(com.vtosters.lite.R.attr.button_muted_foreground, accentColor); + themedColors.put(com.vtosters.lite.R.attr.header_tab_active_indicator, accentColor); + + themedColors.put(com.vtosters.lite.R.attr.im_dropdown_icon_color, accentColor); + themedColors.put(com.vtosters.lite.R.attr.im_dropdown_arrow_tint, accentColor); + + themedColors.put(com.vtosters.lite.R.attr.im_attach_tint, accentColor); + themedColors.put(com.vtosters.lite.R.attr.im_forward_line_tint, accentColor); + themedColors.put(com.vtosters.lite.R.attr.link_alternate, accentColor); + themedColors.put(com.vtosters.lite.R.attr.newsfeed_post_title_color, accentColor); + + themedColors.put(com.vtosters.lite.R.attr.attach_picker_tab_active_background, accentColor); + themedColors.put(com.vtosters.lite.R.attr.attach_picker_tab_active_text, accentColor); + themedColors.put(com.vtosters.lite.R.attr.newsfeed_action_color, accentColor); + themedColors.put(com.vtosters.lite.R.attr.counter_primary_background, accentColor); + + themedColors.put(com.vtosters.lite.R.attr.action_sheet_action_foreground, accentColor); + + // messages + wallDarkColor = ThemesUtils.darken(accentColor, 0.25f); + wallLightColor = ThemesUtils.lighten(accentColor, 0.25f); + + //themedColors.put(com.vtosters.lite.R.attr.im_ic_send_msg, accentColor); + themedColors.put(com.vtosters.lite.R.attr.im_bubble_wallpaper_outgoing, accentColor); + themedColors.put(com.vtosters.lite.R.attr.im_bubble_outgoing, accentColor); + themedColors.put(com.vtosters.lite.R.attr.im_bubble_outgoing_highlighted, accentColor); + } + + public static int getThemedAttr(Context context, @IdRes int attr) { + if (attr == com.vtosters.lite.R.attr.im_bubble_wallpaper_outgoing || attr == com.vtosters.lite.R.attr.im_bubble_outgoing) { + return (!ThemesUtils.isDarkTheme()) ? wallLightColor : wallDarkColor; + } + + if (attr == com.vtosters.lite.R.attr.im_bubble_outgoing_highlighted) { + return (!ThemesUtils.isDarkTheme()) ? ThemesUtils.lighten(wallLightColor, 0.2f) : ThemesUtils.darken(wallDarkColor, 0.2f); + } + + return themedColors.get(attr); + } + + public static boolean hasThemedAttr(Context context, int attrID) { + try { + Log.d(TAG, "Requesting color by attr " + context.getResources().getResourceName(attrID)); + } catch (Exception e) { + } + + if (isCachedAccents()) { + if (!ThemesUtils.isDarkTheme()) { + return (themedColors.get(attrID) != 0 + && ACCENT_THEME_ONLY_MILK_DARK.get(attrID, true) + && ACCENT_THEME_ONLY_NOMILK_LIGHT.get(attrID, true)); + } else { + return (themedColors.get(attrID) != 0 + && ACCENT_THEME_ONLY_MILK_LIGHT.get(attrID, true) + && ACCENT_THEME_ONLY_NOMILK_LIGHT.get(attrID, true)); + } + } else return themedColors.get(attrID) != 0; + } + + public static boolean isCachedAccents() { + return cachedAccents; + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/lite/themes/ThemesHacks.java b/app/src/main/java/ru/vtosters/lite/themes/ThemesHacks.java new file mode 100644 index 000000000..1337101a1 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/ThemesHacks.java @@ -0,0 +1,61 @@ +package ru.vtosters.lite.themes; + +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.DrawableContainer; +import android.graphics.drawable.InsetDrawable; +import android.graphics.drawable.LayerDrawable; +import android.graphics.drawable.StateListDrawable; +import android.os.Build; +import android.util.Log; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.ColorRes; +import androidx.annotation.NonNull; + +import com.vtosters.lite.R; + +import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.ThemesUtils; + +public class ThemesHacks { + // Фиксит селектор (все/свои/архив) в профиле + public static void fixProfileSelector(View view) { + if (!ThemesUtils.isMilkshake()) return; + var id = view.getId(); + + if (id == R.id.profile_wall_owner_posts || id == R.id.profile_wall_all_posts || id == R.id.profile_wall_archived_posts) { + StateListDrawable states = (StateListDrawable) ((LayerDrawable) view.getBackground()).getDrawable(0); + LayerDrawable selected = (LayerDrawable) ((DrawableContainer.DrawableContainerState) states.getConstantState()).getChildren()[0]; + ((ColorDrawable) selected.getDrawable(0)).setColor(ThemesUtils.getAccentColor()); + } + } + + public static void fixThemedFeed(TextView textView, int i) { + if (i != R.layout.themed_feed_tab_2) { + return; + } + textView.setTextColor(ThemesUtils.recolorCSL(textView.getTextColors())); + ((InsetDrawable) ((DrawableContainer.DrawableContainerState) textView.getBackground().getConstantState()).getChildren()[0]).getDrawable().setTint(ThemesUtils.lighten(ThemesUtils.getAccentColor(), 0.15f)); + } + + public static void fixDropdown(Drawable drawable) { + if (!ThemesUtils.isDarkTheme() && ThemesUtils.isMilkshake() && ThemesCore.isCachedAccents()) { + StateListDrawable stateListDrawable = (StateListDrawable) drawable; + ((DrawableContainer.DrawableContainerState) stateListDrawable.getConstantState()).getChildren()[0].setTint(ThemesUtils.getAccentColor()); + ((DrawableContainer.DrawableContainerState) stateListDrawable.getConstantState()).getChildren()[1].setTint(ThemesUtils.halfAlpha(ThemesUtils.getAccentColor())); + } + } + + public static int getHackedColor(@NonNull Context context, @ColorRes int color) { + if (ThemesCore.isCachedAccents() && ColorReferences.isColorRefAccented(color)) { + Log.d("ThemesHacks", "getHackedColor: got accent color: " + AndroidUtils.getResources().getResourceName(color)); + return ThemesUtils.getAccentColor(); + } + if (Build.VERSION.SDK_INT > 23) { + return context.getColor(color); + } else return context.getResources().getColor(color); + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/lite/themes/VTLResources.java b/app/src/main/java/ru/vtosters/lite/themes/VTLResources.java new file mode 100644 index 000000000..673a6b52c --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/VTLResources.java @@ -0,0 +1,92 @@ +package ru.vtosters.lite.themes; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.Log; +import android.util.TypedValue; + +import androidx.annotation.Nullable; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +import ru.vtosters.lite.utils.ThemesUtils; + +public class VTLResources extends Resources { + private static final String TAG = "VTLResources"; + private final Context context; + private static Field typedArrayField; + + private static final List attributesToTheme = new ArrayList<>(); + + static { + try { + typedArrayField = TypedArray.class.getDeclaredField("mData"); + typedArrayField.setAccessible(true); + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + + attributesToTheme.add(16843041); + attributesToTheme.add(android.R.attr.backgroundTint); + attributesToTheme.add(16843173); + } + + public VTLResources(Context context, Resources parent) { + super(parent.getAssets(), parent.getDisplayMetrics(), parent.getConfiguration()); + this.context = context; + Log.d(TAG, "VTLResources: init"); + } + + @Override + public TypedArray obtainAttributes(AttributeSet set, int[] attrs) { + var typedArray = super.obtainAttributes(set, attrs); + var data = getArrayData(typedArray); + for (int i = 0; i < attrs.length; i++) { + try { + int attrID = attrs[i]; + if (attributesToTheme.contains(attrID)) { + int type = data[i*6]; + int cnt = data[(i*6)+1]; + + if (type == TypedValue.TYPE_ATTRIBUTE && isAttrThemeable(cnt)) { + data[i*6] = TypedValue.TYPE_INT_COLOR_RGB8; + data[(i*6)+1] = ThemesUtils.getAccentColor(); + data[(i*6)+2] = 0; // clear reference content + } + } + } catch (Exception e) { + Log.e(TAG, "TAVzlom failed! (obtainAttributes)"); + e.printStackTrace(); + } + } + return typedArray; + } + + @Override + public Drawable getDrawable(int id, @Nullable Theme theme) throws NotFoundException { + var drawable = super.getDrawable(id, theme); + if (id == com.vtosters.lite.R.drawable.newsfeed_tab_dropdown_16) { + ThemesHacks.fixDropdown(drawable); + } + return drawable; + } + + private static boolean isAttrThemeable(int attrID) { + return !ThemesUtils.isDarkTheme() && attrID == com.vtosters.lite.R.attr.button_primary_background; + } + + private static int[] getArrayData(TypedArray arr) { + try { + return (int[]) typedArrayField.get(arr); + } catch (IllegalAccessException e) { + Log.e(TAG, "getArrayData: ", e); + e.printStackTrace(); + return new int[0]; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/lite/themes/ViewInjector.java b/app/src/main/java/ru/vtosters/lite/themes/ViewInjector.java new file mode 100644 index 000000000..774f316c4 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/ViewInjector.java @@ -0,0 +1,45 @@ +package ru.vtosters.lite.themes; + +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; + +import ru.vtosters.lite.themes.hooks.BaseHook; +import ru.vtosters.lite.themes.hooks.ButtonHook; +import ru.vtosters.lite.themes.hooks.ImageViewHook; +import ru.vtosters.lite.themes.hooks.ProgressWheelHook; +import ru.vtosters.lite.themes.hooks.TabLayoutHook; +import ru.vtosters.lite.themes.hooks.TextViewHook; +import ru.vtosters.lite.themes.hooks.ToolbarHook; +import ru.vtosters.lite.themes.hooks.VKImageViewHook; +import ru.vtosters.lite.themes.hooks.WaveformViewHook; + +public class ViewInjector { + public static ArrayList hooks = new ArrayList<>(); + + static { + hooks.add(new ButtonHook()); + hooks.add(new ImageViewHook()); + hooks.add(new TabLayoutHook()); + hooks.add(new TextViewHook()); + hooks.add(new ToolbarHook()); + hooks.add(new VKImageViewHook()); + hooks.add(new WaveformViewHook()); + hooks.add(new ProgressWheelHook()); + } + + public static View inject(View view, int i, boolean z) { + for (BaseHook hook : hooks) { + hook.inject(view, i, z); + } + if (view instanceof ViewGroup) { + var viewGroup = (ViewGroup) view; + for (int i2 = 0; i2 < viewGroup.getChildCount(); i2++) { + inject(viewGroup.getChildAt(i2), i, false); + } + } + + return view; + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/BaseHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/BaseHook.java new file mode 100644 index 000000000..d56a91414 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/BaseHook.java @@ -0,0 +1,7 @@ +package ru.vtosters.lite.themes.hooks; + +import android.view.View; + +public interface BaseHook { + void inject(View view, int i, boolean z); +} diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/ButtonHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/ButtonHook.java new file mode 100644 index 000000000..c8150c9d8 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/ButtonHook.java @@ -0,0 +1,24 @@ +package ru.vtosters.lite.themes.hooks; + +import android.content.res.ColorStateList; +import android.view.View; +import android.widget.Button; + +import ru.vtosters.lite.themes.ColorReferences; +import ru.vtosters.lite.utils.ThemesUtils; + +public class ButtonHook implements BaseHook { + @Override + public void inject(View view, int i, boolean z) { + if (view instanceof Button) { + var button = (Button) view; + if (button.getBackgroundTintList() != null && ColorReferences.isAccentedColor(button.getBackgroundTintList())) { + button.setBackgroundTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); + } + if (TextViewHook.isPositiveButton(button) || TextViewHook.isVkUiButton(view)) { + button.setBackgroundTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); + } + } + } +} + diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/ImageViewHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/ImageViewHook.java new file mode 100644 index 000000000..b9b88ef8a --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/ImageViewHook.java @@ -0,0 +1,24 @@ +package ru.vtosters.lite.themes.hooks; + +import android.content.res.ColorStateList; +import android.view.View; +import android.widget.ImageView; + +import ru.vtosters.lite.themes.ColorReferences; +import ru.vtosters.lite.themes.ThemesCore; +import ru.vtosters.lite.utils.ThemesUtils; + +public class ImageViewHook implements BaseHook { + @Override + public void inject(View view, int i, boolean z) { + if (view instanceof ImageView) { + if (ThemesCore.isCachedAccents()) { + var imageView = (ImageView) view; + if (imageView.getImageTintList() == null) return; + if (ColorReferences.isCslNeedToBeThemed(imageView.getImageTintList())) { + imageView.setImageTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); + } + } + } + } +} diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/ProgressWheelHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/ProgressWheelHook.java new file mode 100644 index 000000000..01da24ac2 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/ProgressWheelHook.java @@ -0,0 +1,21 @@ +package ru.vtosters.lite.themes.hooks; + +import android.view.View; + +import com.pnikosis.materialishprogress.ProgressWheel; + +import ru.vtosters.lite.themes.ThemesCore; +import ru.vtosters.lite.utils.ThemesUtils; + +public class ProgressWheelHook implements BaseHook { + @Override + public void inject(View view, int i, boolean z) { + if (view instanceof ProgressWheel) { + if (ThemesCore.isCachedAccents()) { + var progressWheel = (ProgressWheel) view; + progressWheel.setBarColor(ThemesUtils.getAccentColor()); + } + } + } +} + diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/TabLayoutHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/TabLayoutHook.java new file mode 100644 index 000000000..c85402c26 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/TabLayoutHook.java @@ -0,0 +1,21 @@ +package ru.vtosters.lite.themes.hooks; + +import android.content.res.ColorStateList; +import android.view.View; + +import com.vk.core.view.VKTabLayout; + +import ru.vtosters.lite.utils.ThemesUtils; + + +public class TabLayoutHook implements BaseHook { + @Override + public void inject(View view, int i, boolean z) { + if (view instanceof VKTabLayout) { + var tabLayout = (VKTabLayout) view; + tabLayout.setSelectedTabIndicatorColor(ThemesUtils.getAccentColor()); + tabLayout.setTabRippleColor(ColorStateList.valueOf(ThemesUtils.getAccentColor())); + } + } +} + diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java new file mode 100644 index 000000000..55d3f50bd --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java @@ -0,0 +1,92 @@ +package ru.vtosters.lite.themes.hooks; + +import android.annotation.SuppressLint; +import android.content.res.ColorStateList; +import android.os.Build; +import android.view.View; +import android.widget.TextView; + +import androidx.appcompat.widget.AppCompatCheckedTextView; + +import com.vk.core.view.TintTextView; +import com.vk.core.view.links.LinkedTextView; +import com.vtosters.lite.R; + +import ru.vtosters.lite.themes.ColorReferences; +import ru.vtosters.lite.themes.ThemesHacks; +import ru.vtosters.lite.themes.utils.VkUiThemer; +import ru.vtosters.lite.utils.ThemesUtils; + +public class TextViewHook implements BaseHook { + + private static final String TAG = "TextViewHook"; + + @SuppressLint("RestrictedApi") + @Override + public void inject(View view, int i, boolean z) { + if (view instanceof TextView) { + var textView = (TextView) view; + + if (ColorReferences.isAccentedColor(textView.getCurrentTextColor())) { + textView.setTextColor(ThemesUtils.getAccentColor()); + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && textView.getCompoundDrawableTintList() != null) { + if (ColorReferences.isAccentedColor(textView.getCompoundDrawableTintList())) { + textView.setCompoundDrawableTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); + } + } + + if (textView.getLinkTextColors() != null && ColorReferences.isAccentedColor(textView.getLinkTextColors())) { + textView.setLinkTextColor(ThemesUtils.getAccentColor()); + } + + if (isPositiveButton(textView) || isVkUiButton(textView)) { + view.setBackgroundTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); + } + + if (view instanceof TintTextView) { + if (eligibleForStartTinting((TintTextView) view)) { + ((TintTextView) view).setDrawableStartTint(ThemesUtils.getAccentColor()); + } + if (eligibleForTinting(view.getId())) { + ((TintTextView) view).setDrawableTint(ThemesUtils.getAccentColor()); + } + } + + if (view instanceof LinkedTextView) { + ((LinkedTextView) view).setLinkTextColor(ThemesUtils.getAccentColor()); + } + + if (view instanceof AppCompatCheckedTextView) { + var check = (AppCompatCheckedTextView) view; + if (ColorReferences.isAccentedColor(check.getCheckMarkTintList())) { + check.setCheckMarkTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); + } + } + + VkUiThemer.autoThemeVkuiButtons(textView); + ThemesHacks.fixProfileSelector(textView); + ThemesHacks.fixThemedFeed(textView, i); + } + } + + public static boolean eligibleForStartTinting(TintTextView view) { + return ColorReferences.isAccentedColor(view.getTextColors()) || view.getTextColors().getDefaultColor() == ThemesUtils.getAccentColor(); + } + + public static boolean eligibleForTinting(int id) { + return !ThemesUtils.isDarkTheme() && (id == R.id.attach_title); + } + + public static boolean isPositiveButton(View view) { + return !ThemesUtils.isDarkTheme() && (view.getId() == R.id.positive || view.getId() == R.id.positive_button); + } + + public static boolean isVkUiButton(View view) { + return !ThemesUtils.isDarkTheme() && ( + view.getId() == R.id.empty_button + ); + } +} + diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/ToolbarHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/ToolbarHook.java new file mode 100644 index 000000000..b4275e0de --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/ToolbarHook.java @@ -0,0 +1,14 @@ +package ru.vtosters.lite.themes.hooks; + +import android.view.View; +import android.widget.Toolbar; + +public class ToolbarHook implements BaseHook { + @Override + public void inject(View view, int i, boolean z) { + if (view instanceof Toolbar) { + // wtf? + } + } +} + diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/VKImageViewHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/VKImageViewHook.java new file mode 100644 index 000000000..38a4f6c09 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/VKImageViewHook.java @@ -0,0 +1,29 @@ +package ru.vtosters.lite.themes.hooks; + +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.view.View; + +import com.vk.imageloader.view.VKImageView; + +import ru.vtosters.lite.utils.ThemesUtils; + +public class VKImageViewHook implements BaseHook { + private static Paint paint = new Paint(); + static { + paint.setColorFilter(new PorterDuffColorFilter(ThemesUtils.getAccentColor(), PorterDuff.Mode.SRC_IN)); + } + + @Override + public void inject(View view, int i, boolean z) { + if (view instanceof VKImageView) { + var imageView = (VKImageView) view; + if (imageView.getImageTintList() != null) { + imageView.setImageTintList(ThemesUtils.recolorCSL(imageView.getImageTintList())); + imageView.setColorFilter(ThemesUtils.getAccentColor(), PorterDuff.Mode.SRC_IN); + } + } + } +} + diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/WaveformViewHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/WaveformViewHook.java new file mode 100644 index 000000000..50d554859 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/WaveformViewHook.java @@ -0,0 +1,16 @@ +package ru.vtosters.lite.themes.hooks; + +import android.view.View; + +import com.vtosters.lite.ui.widget.WaveformView; + +public class WaveformViewHook implements BaseHook { + @Override + public void inject(View view, int i, boolean z) { + if (view instanceof WaveformView) { + var waveformView = (WaveformView) view; + //waveformView.set(ThemesUtils.getAccentColor()); + } + } +} + diff --git a/app/src/main/java/ru/vtosters/lite/themes/utils/VkUiThemer.java b/app/src/main/java/ru/vtosters/lite/themes/utils/VkUiThemer.java new file mode 100644 index 000000000..d18e7f478 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/utils/VkUiThemer.java @@ -0,0 +1,81 @@ +package ru.vtosters.lite.themes.utils; + +import android.content.res.ColorStateList; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.DrawableContainer; +import android.graphics.drawable.GradientDrawable; +import android.graphics.drawable.RippleDrawable; +import android.graphics.drawable.StateListDrawable; +import android.os.Build; +import android.util.Log; +import android.widget.TextView; + +import ru.vtosters.lite.themes.ColorReferences; +import ru.vtosters.lite.utils.ThemesUtils; + +public class VkUiThemer { + public static void autoThemeVkuiButtons(TextView view) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) return; + if (ThemesUtils.isDarkTheme()) + return; // no need to theme b/w buttons, well it should skip, but I do it for extra performance + + try { + if (!(view.getBackground() instanceof StateListDrawable)) return; + + StateListDrawable states = ((StateListDrawable) view.getBackground()); + if (states.getConstantState() == null) return; + DrawableContainer.DrawableContainerState dStates = (DrawableContainer.DrawableContainerState) states.getConstantState(); + + if (dStates.getChildCount() == 2) { + Drawable target = dStates.getChildren()[0]; + if (!(target instanceof RippleDrawable)) return; + + RippleDrawable ripple = (RippleDrawable) target; + for (int i = 0; i < ripple.getNumberOfLayers(); i++) { + if (ripple.getId(i) == android.R.id.mask) continue; + + Drawable currentTarget = ripple.getDrawable(i); + + if (!(currentTarget instanceof GradientDrawable)) continue; + + //if (TSColorRefs.TS_DEBUG_MODE) Log.d("TSCore", "[tsh] finally, obamium = ["+currentTarget.toString()+"]"); + + GradientDrawable spd = (GradientDrawable) currentTarget; + if (spd.getShape() != GradientDrawable.RECTANGLE) continue; + + Log.d("TSCore", "[tsh] got a color!"); + + ColorStateList csl = spd.getColor(); + if (csl != null) { + Log.d("TSCore", "[tsh] csl2 | " + csl); + } + + if (ColorReferences.isAccentedColor(spd.getColor())) { + Log.d("TSCore", "[tsh] theming CSL"); + spd.setTint(ThemesUtils.getAccentColor()); + } + } + + Drawable draw2 = dStates.getChildren()[0]; + if (!(draw2 instanceof GradientDrawable)) return; + GradientDrawable spd = (GradientDrawable) draw2; + if (spd.getShape() != GradientDrawable.RECTANGLE) return; + + Log.d("TSCore", "[tsh:disabled] got a color!"); + + ColorStateList csl = spd.getColor(); + if (csl != null) { + Log.d("TSCore", "[tsh:disabled] csl2 | " + csl); + } + + if (ColorReferences.isAccentedColor(spd.getColor())) { + Log.d("TSCore", "[tsh:disabled] theming CSL"); + spd.setTint(ThemesUtils.getAccentColor()); + } + } + } catch (Exception e) { + // This must go wrong, so we ignore any exceptions that may occur + e.printStackTrace(); // REMOVE THIS! + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java index ea51fb091..28e0d5da9 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -40,14 +40,9 @@ import com.vk.core.ui.themes.VKThemeHelper; import com.vtosters.lite.R; import com.vtosters.lite.data.ThemeTracker; -import java.util.Arrays; -import java.util.List; +import ru.vtosters.lite.themes.ColorReferences; public class ThemesUtils { - public static List accentColors = Arrays.asList( - "5692d7", "528bcc", "7aa0cc", "518bcc", "6296d0", "2f68aa", "638ebf", "5181b8", "71aaeb", "4774a8", "5baaf4", "4186c8", "add3ff", "4774a8", "718198", "5a9eff", "99a2ad", "74a2d6", "e9eef3", "dfe3e7", "eff1f3", "5c9ce6", "4986cc", "4680c2" - ); - public static void applyTheme(VKTheme theme) { var currentActivity = LifecycleUtils.getCurrentActivity(); if (currentActivity != null) { @@ -100,7 +95,7 @@ public class ThemesUtils { } public static int getAccentColor() { - return getColorFromAttr(R.attr.accent); + return getColor2(R.color.red); } // Color accent public static int getTextAttr() { @@ -267,8 +262,8 @@ public class ThemesUtils { int unsel = csl.getColorForState(new int[]{-android.R.attr.state_selected}, Color.BLACK); int sel = csl.getColorForState(new int[]{android.R.attr.state_selected}, Color.BLACK); - boolean isUnselAccent = isAccentedColor(unsel); - boolean isSelAccent = isAccentedColor(sel); + boolean isUnselAccent = ColorReferences.isAccentedColor(unsel); + boolean isSelAccent = ColorReferences.isAccentedColor(sel); if (isUnselAccent || isSelAccent) { @@ -311,13 +306,6 @@ public class ThemesUtils { return ColorUtils.setAlphaComponent(src, 169); } - public static boolean isAccentedColor(ColorStateList target) { - return target != null && isAccentedColor(target.getDefaultColor()); - } - - public static boolean isAccentedColor(int target) { - return accentColors.contains(hex(target).toLowerCase()); - } public static int getColor(Context context, int i) { if (isColorRefAccented(i) && isAndroidMonet()) { @@ -384,6 +372,11 @@ public class ThemesUtils { return String.format("#%06X", i & 16777215); } // Get color as hex string + // hex, but without # at the beginning + public static String hexx(int i) { + return String.format("%06X", i & 16777215); + } + public static int getNavigationHeight(int Default) { int VKME = R.dimen.design_bottom_sheet_peek_height_min; diff --git a/smali/smali/androidx/core/content/ContextCompat.smali b/smali/smali/androidx/core/content/ContextCompat.smali index d9fa6879e..15f36416b 100644 --- a/smali/smali/androidx/core/content/ContextCompat.smali +++ b/smali/smali/androidx/core/content/ContextCompat.smali @@ -245,6 +245,13 @@ .annotation build Landroidx/annotation/ColorInt; .end annotation + # ru.vtosters.lite.themes.ThemesHacks.getHackedColor(Landroid/content/Context;I)I + invoke-static {p0, p1}, Lru/vtosters/lite/themes/ThemesHacks;->getHackedColor(Landroid/content/Context;I)I + + move-result v0 + + return v0 + .line 1 sget v0, Landroid/os/Build$VERSION;->SDK_INT:I diff --git a/smali/smali_classes2/com/vk/core/ui/VKLayoutInflater.smali b/smali/smali_classes2/com/vk/core/ui/VKLayoutInflater.smali index 81d7409bf..0caaa64cc 100644 --- a/smali/smali_classes2/com/vk/core/ui/VKLayoutInflater.smali +++ b/smali/smali_classes2/com/vk/core/ui/VKLayoutInflater.smali @@ -337,3 +337,67 @@ return-object p1 .end method + +.method public inflate(ILandroid/view/ViewGroup;)Landroid/view/View; + .registers 4 + + invoke-super {p0, p1, p2}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;)Landroid/view/View; + + move-result-object p2 + + const/4 v0, 0x1 + + invoke-static {p2, p1, v0}, Lru/vtosters/lite/themes/ViewInjector;->inject(Landroid/view/View;IZ)Landroid/view/View; + + move-result-object p1 + + return-object p1 +.end method + +.method public inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View; + .registers 4 + + invoke-super {p0, p1, p2, p3}, Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View; + + move-result-object p2 + + invoke-static {p2, p1, p3}, Lru/vtosters/lite/themes/ViewInjector;->inject(Landroid/view/View;IZ)Landroid/view/View; + + move-result-object p1 + + return-object p1 +.end method + +.method public inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;)Landroid/view/View; + .registers 4 + + invoke-super {p0, p1, p2}, Landroid/view/LayoutInflater;->inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;)Landroid/view/View; + + move-result-object p1 + + const/4 p2, -0x1 + + const/4 v0, 0x1 + + invoke-static {p1, p2, v0}, Lru/vtosters/lite/themes/ViewInjector;->inject(Landroid/view/View;IZ)Landroid/view/View; + + move-result-object p1 + + return-object p1 +.end method + +.method public inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;Z)Landroid/view/View; + .registers 4 + + invoke-super {p0, p1, p2, p3}, Landroid/view/LayoutInflater;->inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;Z)Landroid/view/View; + + move-result-object p1 + + const/4 p2, -0x1 + + invoke-static {p1, p2, p3}, Lru/vtosters/lite/themes/ViewInjector;->inject(Landroid/view/View;IZ)Landroid/view/View; + + move-result-object p1 + + return-object p1 +.end method \ No newline at end of file diff --git a/smali/smali_classes2/com/vk/core/ui/themes/VKThemeHelper$b.smali b/smali/smali_classes2/com/vk/core/ui/themes/VKThemeHelper$b.smali index 7f4c2bdff..1d4b829fe 100644 --- a/smali/smali_classes2/com/vk/core/ui/themes/VKThemeHelper$b.smali +++ b/smali/smali_classes2/com/vk/core/ui/themes/VKThemeHelper$b.smali @@ -27,6 +27,8 @@ .end annotation .end field +.field private resources:Landroid/content/res/Resources; + # direct methods .method public constructor (Landroid/content/Context;I)V @@ -151,3 +153,29 @@ return-object p1 .end method + +.method public getResources()Landroid/content/res/Resources; + .registers 3 + + iget-object v0, p0, Lcom/vk/core/ui/themes/VKThemeHelper$b;->resources:Landroid/content/res/Resources; + + if-eqz v0, :cond_7 + + iget-object v0, p0, Lcom/vk/core/ui/themes/VKThemeHelper$b;->resources:Landroid/content/res/Resources; + + :goto_6 + return-object v0 + + :cond_7 + new-instance v0, Lru/vtosters/lite/themes/VTLResources; + + invoke-static {}, Lru/vtosters/lite/utils/AndroidUtils;->getResources()Landroid/content/res/Resources; + + move-result-object v1 + + invoke-direct {v0, p0, v1}, Lru/vtosters/lite/themes/VTLResources;->(Landroid/content/Context;Landroid/content/res/Resources;)V + + iput-object v0, p0, Lcom/vk/core/ui/themes/VKThemeHelper$b;->resources:Landroid/content/res/Resources; + + goto :goto_6 +.end method diff --git a/smali/smali_classes2/com/vk/core/util/ContextExtKt.smali b/smali/smali_classes2/com/vk/core/util/ContextExtKt.smali index f536180e8..b86782ede 100644 --- a/smali/smali_classes2/com/vk/core/util/ContextExtKt.smali +++ b/smali/smali_classes2/com/vk/core/util/ContextExtKt.smali @@ -920,6 +920,19 @@ .end annotation .end param + invoke-static {p0, p1}, Lru/vtosters/lite/themes/ThemesCore;->hasThemedAttr(Landroid/content/Context;I)Z + + move-result v1 + + if-eqz v1, :cond_b + + invoke-static {p0, p1}, Lru/vtosters/lite/themes/ThemesCore;->getThemedAttr(Landroid/content/Context;I)I + + move-result v1 + + return v1 + :cond_b + .line 1 invoke-virtual {p0}, Landroid/content/Context;->getTheme()Landroid/content/res/Resources$Theme; From 96de61fd15813bba43c2fd827e0edacdad4f986a Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Tue, 22 Nov 2022 18:00:12 +0300 Subject: [PATCH 02/95] move some stuff from ThemesUtils --- .../vtosters/lite/themes/ColorReferences.java | 13 ++- .../ru/vtosters/lite/themes/ThemesHacks.java | 5 +- .../lite/themes/hooks/TextViewHook.java | 2 + .../lite/themes/hooks/VKImageViewHook.java | 3 +- .../lite/themes/utils/RecolorUtils.java | 91 +++++++++++++++++++ .../ru/vtosters/lite/utils/ThemesUtils.java | 63 ------------- 6 files changed, 104 insertions(+), 73 deletions(-) create mode 100644 app/src/main/java/ru/vtosters/lite/themes/utils/RecolorUtils.java diff --git a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java index 1217785b3..f46fc4904 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java @@ -6,13 +6,12 @@ import android.graphics.Color; import java.util.Arrays; import java.util.List; -import ru.vtosters.lite.utils.ThemesUtils; - public class ColorReferences { - public static List accentColors = Arrays.asList( - "5692d7", "528bcc", "7aa0cc", "518bcc", "6296d0", "2f68aa", "638ebf", "5181b8", "71aaeb", - "4774a8", "5baaf4", "4186c8", "add3ff", "4774a8", "718198", "5a9eff", "99a2ad", "74a2d6", - "e9eef3", "dfe3e7", "eff1f3", "5c9ce6", "4986cc", "4680c2", "3f8ae0" + public static List accentColors = Arrays.asList( + Color.parseColor("#3f8ae0"), // azure_300 (light accent) + Color.parseColor("#4986cc"), // azure_a400 + Color.parseColor("#528bcc"), // another light accent + Color.parseColor("#71AAEB") // vk_sky_300 (dark accent) ); public static boolean isAccentedColor(ColorStateList target) { @@ -20,7 +19,7 @@ public class ColorReferences { } public static boolean isAccentedColor(int target) { - return accentColors.contains(ThemesUtils.hexx(target).toLowerCase()); + return accentColors.contains(target); } public static boolean isColorRefAccented(int target) { diff --git a/app/src/main/java/ru/vtosters/lite/themes/ThemesHacks.java b/app/src/main/java/ru/vtosters/lite/themes/ThemesHacks.java index 1337101a1..051a07881 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ThemesHacks.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ThemesHacks.java @@ -17,6 +17,7 @@ import androidx.annotation.NonNull; import com.vtosters.lite.R; +import ru.vtosters.lite.themes.utils.RecolorUtils; import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.ThemesUtils; @@ -37,7 +38,7 @@ public class ThemesHacks { if (i != R.layout.themed_feed_tab_2) { return; } - textView.setTextColor(ThemesUtils.recolorCSL(textView.getTextColors())); + textView.setTextColor(RecolorUtils.recolorCSL(textView.getTextColors())); ((InsetDrawable) ((DrawableContainer.DrawableContainerState) textView.getBackground().getConstantState()).getChildren()[0]).getDrawable().setTint(ThemesUtils.lighten(ThemesUtils.getAccentColor(), 0.15f)); } @@ -50,7 +51,7 @@ public class ThemesHacks { } public static int getHackedColor(@NonNull Context context, @ColorRes int color) { - if (ThemesCore.isCachedAccents() && ColorReferences.isColorRefAccented(color)) { + if (ThemesCore.isCachedAccents() && ColorReferences.isAccentedColor(context.getColor(color))) { Log.d("ThemesHacks", "getHackedColor: got accent color: " + AndroidUtils.getResources().getResourceName(color)); return ThemesUtils.getAccentColor(); } diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java index 55d3f50bd..063eaab15 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java @@ -3,6 +3,7 @@ package ru.vtosters.lite.themes.hooks; import android.annotation.SuppressLint; import android.content.res.ColorStateList; import android.os.Build; +import android.util.Log; import android.view.View; import android.widget.TextView; @@ -27,6 +28,7 @@ public class TextViewHook implements BaseHook { if (view instanceof TextView) { var textView = (TextView) view; + Log.d(TAG, "inject: " + textView.getText() + " " + textView.getCurrentTextColor()); if (ColorReferences.isAccentedColor(textView.getCurrentTextColor())) { textView.setTextColor(ThemesUtils.getAccentColor()); } diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/VKImageViewHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/VKImageViewHook.java index 38a4f6c09..eb3133a7e 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/hooks/VKImageViewHook.java +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/VKImageViewHook.java @@ -7,6 +7,7 @@ import android.view.View; import com.vk.imageloader.view.VKImageView; +import ru.vtosters.lite.themes.utils.RecolorUtils; import ru.vtosters.lite.utils.ThemesUtils; public class VKImageViewHook implements BaseHook { @@ -20,7 +21,7 @@ public class VKImageViewHook implements BaseHook { if (view instanceof VKImageView) { var imageView = (VKImageView) view; if (imageView.getImageTintList() != null) { - imageView.setImageTintList(ThemesUtils.recolorCSL(imageView.getImageTintList())); + imageView.setImageTintList(RecolorUtils.recolorCSL(imageView.getImageTintList())); imageView.setColorFilter(ThemesUtils.getAccentColor(), PorterDuff.Mode.SRC_IN); } } diff --git a/app/src/main/java/ru/vtosters/lite/themes/utils/RecolorUtils.java b/app/src/main/java/ru/vtosters/lite/themes/utils/RecolorUtils.java new file mode 100644 index 000000000..1d35952eb --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/utils/RecolorUtils.java @@ -0,0 +1,91 @@ +package ru.vtosters.lite.themes.utils; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.os.Build; + +import com.vk.core.drawable.RecoloredDrawable; + +import ru.vtosters.lite.themes.ColorReferences; +import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.ThemesUtils; + +public class RecolorUtils { + public static Drawable recolorDrawableToolbar(Drawable drawable) { + if (drawable == null) return null; + + return new RecoloredDrawable(drawable, ThemesUtils.getHeaderText()); + } // Recolor toolbar drawable to accent color + + @SuppressLint("UseCompatLoadingForDrawables") + public static Drawable recolorDrawableInt(int drawable) { + + @SuppressLint("UseCompatLoadingForDrawables") Drawable res = AndroidUtils.getResources().getDrawable(drawable); + return new RecoloredDrawable(res, ThemesUtils.getAccentColor()); + } // Get res drawable via id and coloring to accent + + public static ColorStateList recolorCSL(ColorStateList colorStateList) { + if (colorStateList == null) return null; + + return ColorStateList.valueOf(ThemesUtils.getAccentColor()); + } // Recolor ColorStateList to accent color + + @SuppressLint("UseCompatLoadingForColorStateLists") + public static ColorStateList themeCSL(Context context, int color) { + if (ColorReferences.isColorRefAccented(color)) { + return ColorStateList.valueOf(ThemesUtils.getAccentColor()); + } + + ColorStateList csl; + + if (Build.VERSION.SDK_INT >= 23) { + csl = context.getColorStateList(color); + } else { + csl = context.getResources().getColorStateList(color); + } + + try { + int unsel = csl.getColorForState(new int[]{-android.R.attr.state_selected}, Color.BLACK); + int sel = csl.getColorForState(new int[]{android.R.attr.state_selected}, Color.BLACK); + + boolean isUnselAccent = ColorReferences.isAccentedColor(unsel); + boolean isSelAccent = ColorReferences.isAccentedColor(sel); + + if (isUnselAccent || isSelAccent) { + + return new ColorStateList(new int[][]{ + new int[]{android.R.attr.state_selected}, new int[]{-android.R.attr.state_selected} + }, new int[]{isSelAccent ? ThemesUtils.getAccentColor() : sel, isUnselAccent ? ThemesUtils.getAccentColor() : unsel}); + } + + return csl; + } catch (Exception e) { + + e.printStackTrace(); + return null; + } + } // Recolor ColorStateList + + public static ColorStateList themeCSL(ColorStateList csl){ + try { + int unsel = csl.getColorForState(new int[] {-android.R.attr.state_selected}, Color.BLACK); + int sel = csl.getColorForState(new int[] {android.R.attr.state_selected}, Color.BLACK); + + boolean isUnselAccent = ColorReferences.isAccentedColor(unsel); + boolean isSelAccent = ColorReferences.isAccentedColor(sel); + + if (isUnselAccent || isSelAccent) { + return new ColorStateList(new int[][] { + new int[] {android.R.attr.state_selected}, new int[] {-android.R.attr.state_selected} + }, new int[] {isSelAccent ? ThemesUtils.getAccentColor() : sel, isUnselAccent ? ThemesUtils.getAccentColor() : unsel}); + } + return csl; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java index 28e0d5da9..eaec00da9 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -14,7 +14,6 @@ import static ru.vtosters.lite.utils.Preferences.milkshake; import static ru.vtosters.lite.utils.Preferences.navbar; import static ru.vtosters.lite.utils.Preferences.vkme; -import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; @@ -40,8 +39,6 @@ import com.vk.core.ui.themes.VKThemeHelper; import com.vtosters.lite.R; import com.vtosters.lite.data.ThemeTracker; -import ru.vtosters.lite.themes.ColorReferences; - public class ThemesUtils { public static void applyTheme(VKTheme theme) { var currentActivity = LifecycleUtils.getCurrentActivity(); @@ -220,66 +217,6 @@ public class ThemesUtils { } // Recolor vk icon to accent color - public static Drawable recolorDrawableToolbar(Drawable drawable) { - if (drawable == null) return null; - - if (!isAndroidMonet()) return drawable; - - return new RecoloredDrawable(drawable, getHeaderText()); - } // Recolor toolbar drawable to accent color - - @SuppressLint("UseCompatLoadingForDrawables") - public static Drawable recolorDrawableInt(int drawable) { - if (!isAndroidMonet()) return getResources().getDrawable(drawable); - - @SuppressLint("UseCompatLoadingForDrawables") Drawable res = getResources().getDrawable(drawable); - return new RecoloredDrawable(res, getAccentColor()); - } // Get res drawable via id and coloring to accent - - public static ColorStateList recolorCSL(ColorStateList colorStateList) { - if (colorStateList == null) return null; - - if (!isAndroidMonet()) return colorStateList; - - return ColorStateList.valueOf(getAccentColor()); - } // Recolor ColorStateList to accent color - - @SuppressLint("UseCompatLoadingForColorStateLists") - public static ColorStateList themeCSL(Context context, int color) { - if (isColorRefAccented(color) && isAndroidMonet()) { - return ColorStateList.valueOf(getAccentColor()); - } - - ColorStateList csl; - - if (Build.VERSION.SDK_INT >= 23) { - csl = context.getColorStateList(color); - } else { - csl = context.getResources().getColorStateList(color); - } - - try { - int unsel = csl.getColorForState(new int[]{-android.R.attr.state_selected}, Color.BLACK); - int sel = csl.getColorForState(new int[]{android.R.attr.state_selected}, Color.BLACK); - - boolean isUnselAccent = ColorReferences.isAccentedColor(unsel); - boolean isSelAccent = ColorReferences.isAccentedColor(sel); - - if (isUnselAccent || isSelAccent) { - - return new ColorStateList(new int[][]{ - new int[]{android.R.attr.state_selected}, new int[]{-android.R.attr.state_selected} - }, new int[]{isSelAccent ? getAccentColor() : sel, isUnselAccent ? getAccentColor() : unsel}); - } - - return csl; - } catch (Exception e) { - - e.printStackTrace(); - return null; - } - } // Recolor ColorStateList - public static int darken(int color, float by) { float[] hsl = new float[3]; ColorUtils.colorToHSL(color, hsl); From 4dcea46be77ca0d60bf4e7fee187810123269e32 Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Tue, 22 Nov 2022 18:06:32 +0300 Subject: [PATCH 03/95] recolor CSL where it is possible --- .../content/res/AppCompatResources.smali | 4 ++ .../androidx/core/content/ContextCompat.smali | 46 +++++++++++-------- .../graphics/drawable/DrawableCompat.smali | 4 ++ .../vk/core/drawable/RecoloredDrawable.smali | 4 ++ 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/smali/smali/androidx/appcompat/content/res/AppCompatResources.smali b/smali/smali/androidx/appcompat/content/res/AppCompatResources.smali index 2d17d0ff8..9a80cf07e 100644 --- a/smali/smali/androidx/appcompat/content/res/AppCompatResources.smali +++ b/smali/smali/androidx/appcompat/content/res/AppCompatResources.smali @@ -268,6 +268,10 @@ move-result-object p0 + invoke-static {p0}, Lru/vtosters/lite/themes/utils/RecolorUtils;->themeCSL(Landroid/content/res/ColorStateList;)Landroid/content/res/ColorStateList; + + move-result-object p0 + return-object p0 .line 3 diff --git a/smali/smali/androidx/core/content/ContextCompat.smali b/smali/smali/androidx/core/content/ContextCompat.smali index 15f36416b..425d44f8a 100644 --- a/smali/smali/androidx/core/content/ContextCompat.smali +++ b/smali/smali/androidx/core/content/ContextCompat.smali @@ -292,31 +292,37 @@ .annotation build Landroidx/annotation/Nullable; .end annotation - .line 1 - sget v0, Landroid/os/Build$VERSION;->SDK_INT:I - - const/16 v1, 0x17 - - if-lt v0, v1, :cond_0 - - .line 2 - invoke-virtual {p0, p1}, Landroid/content/Context;->getColorStateList(I)Landroid/content/res/ColorStateList; + invoke-static {p0, p1}, Lru/vtosters/lite/themes/utils/RecolorUtils;->themeCSL(Landroid/content/Context;I)Landroid/content/res/ColorStateList; move-result-object p0 return-object p0 - .line 3 - :cond_0 - invoke-virtual {p0}, Landroid/content/Context;->getResources()Landroid/content/res/Resources; - - move-result-object p0 - - invoke-virtual {p0, p1}, Landroid/content/res/Resources;->getColorStateList(I)Landroid/content/res/ColorStateList; - - move-result-object p0 - - return-object p0 +# .line 1 +# sget v0, Landroid/os/Build$VERSION;->SDK_INT:I +# +# const/16 v1, 0x17 +# +# if-lt v0, v1, :cond_0 +# +# .line 2 +# invoke-virtual {p0, p1}, Landroid/content/Context;->getColorStateList(I)Landroid/content/res/ColorStateList; +# +# move-result-object p0 +# +# return-object p0 +# +# .line 3 +# :cond_0 +# invoke-virtual {p0}, Landroid/content/Context;->getResources()Landroid/content/res/Resources; +# +# move-result-object p0 +# +# invoke-virtual {p0, p1}, Landroid/content/res/Resources;->getColorStateList(I)Landroid/content/res/ColorStateList; +# +# move-result-object p0 +# +# return-object p0 .end method .method public static getDataDir(Landroid/content/Context;)Ljava/io/File; diff --git a/smali/smali/androidx/core/graphics/drawable/DrawableCompat.smali b/smali/smali/androidx/core/graphics/drawable/DrawableCompat.smali index 69b709c1d..8b710f823 100644 --- a/smali/smali/androidx/core/graphics/drawable/DrawableCompat.smali +++ b/smali/smali/androidx/core/graphics/drawable/DrawableCompat.smali @@ -645,6 +645,10 @@ .end annotation .end param + invoke-static {p1}, Lru/vtosters/lite/themes/utils/RecolorUtils;->themeCSL(Landroid/content/res/ColorStateList;)Landroid/content/res/ColorStateList; + + move-result-object p1 + .line 1 sget v0, Landroid/os/Build$VERSION;->SDK_INT:I diff --git a/smali/smali_classes2/com/vk/core/drawable/RecoloredDrawable.smali b/smali/smali_classes2/com/vk/core/drawable/RecoloredDrawable.smali index cb6a6d397..5c0ad4e90 100644 --- a/smali/smali_classes2/com/vk/core/drawable/RecoloredDrawable.smali +++ b/smali/smali_classes2/com/vk/core/drawable/RecoloredDrawable.smali @@ -87,6 +87,10 @@ invoke-virtual {p1, p0}, Landroid/graphics/drawable/Drawable;->setCallback(Landroid/graphics/drawable/Drawable$Callback;)V + invoke-static {p2}, Lru/vtosters/lite/themes/utils/RecolorUtils;->themeCSL(Landroid/content/res/ColorStateList;)Landroid/content/res/ColorStateList; + + move-result-object p2 + .line 6 iput-object p2, p0, Lcom/vk/core/drawable/RecoloredDrawable;->b:Landroid/content/res/ColorStateList; From d3eeaf5f2352a8b42ca30e464b654a0c0e2042a6 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Tue, 22 Nov 2022 19:06:06 +0300 Subject: [PATCH 04/95] removed some hardcode --- .../ru/vtosters/lite/themes/ColorReferences.java | 4 +++- .../com/vk/articles/ArticleFragment.smali | 5 +---- .../com/vk/attachpicker/fragment/StoryFragment.smali | 4 +--- .../smali_classes2/com/vk/cameraui/CameraUI$a.smali | 4 +--- .../com/vk/cameraui/CameraUIView.smali | 4 +--- .../vk/common/widget/LocatorIndicatorDrawable.smali | 4 +--- .../holders/LoadersComponentsViewHolder$1.smali | 4 +--- .../utils/VerifyInfoHelper$colorAccentBlue$2.smali | 7 +------ .../core/utils/VerifyInfoHelper$colorBlue200$2.smali | 6 +----- .../com/vk/core/view/ArrowSendButton.smali | 4 +--- .../adapters/IdentityLabelAdapter$LabelHolder.smali | 4 +--- .../live/views/chat/g/CommentRoundedDrawable.smali | 4 +--- .../com/vk/libvideo/live/views/gifts/GiftsView.smali | 4 +--- .../adapters/PollBackgroundSmallViewHolders2.smali | 5 +---- .../vk/poll/adapters/PollResultAnswerHolder.smali | 4 +--- .../com/vk/poll/views/PollFilterBottomView.smali | 4 +--- .../com/vk/poll/views/PollResultRateDrawable.smali | 4 +--- .../community/CommunityOnlineStatusItem$a.smali | 4 +--- .../com/vk/profile/presenter/UserPresenter.smali | 4 +--- .../ui/user/AdministratorProfileFragment.smali | 4 +--- .../im/BusinessNotifyGroupNotification.smali | 4 +--- .../notifications/im/MessageGroupNotification.smali | 4 +--- .../dialogs/music/SelectRangeWaveFormView.smali | 12 +++--------- .../question/StoryCreateQuestionDataProvider.smali | 5 +---- .../stories/clickable/models/StoryQuestionInfo.smali | 5 +---- .../clickable/stickers/StoryPollSticker.smali | 5 +---- .../view/question/StoryViewAskQuestionView.smali | 4 +--- .../vtosters/lite/BirthdayBroadcastReceiver.smali | 4 +--- .../com/vtosters/lite/NotificationUtils.smali | 5 +---- .../fragments/money/MoneyInfoBottomSheetDialog.smali | 5 +---- .../lite/general/fragments/PhotosFragment.smali | 4 +--- .../lite/fragments/photos/PhotoListFragment.smali | 4 +--- .../vtosters/lite/fragments/y2/VideosFragment.smali | 4 +--- .../com/vtosters/lite/live/LiveUserHolder.smali | 4 +--- .../com/vtosters/lite/ui/WriteBar.smali | 4 +--- .../ui/widget/VoiceRecordControlPopupWindow.smali | 4 +--- .../lite/ui/widget/WaveRecordCircleView.smali | 4 +--- .../vtosters/lite/upload/UploadNotification.smali | 4 +--- 38 files changed, 42 insertions(+), 130 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java index f46fc4904..32c710fca 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java @@ -11,7 +11,8 @@ public class ColorReferences { Color.parseColor("#3f8ae0"), // azure_300 (light accent) Color.parseColor("#4986cc"), // azure_a400 Color.parseColor("#528bcc"), // another light accent - Color.parseColor("#71AAEB") // vk_sky_300 (dark accent) + Color.parseColor("#71aaeb"), // vk_sky_300 (dark accent) + Color.parseColor("#5181b8") // header_blue ); public static boolean isAccentedColor(ColorStateList target) { @@ -29,6 +30,7 @@ public class ColorReferences { target == com.vtosters.lite.R.color.light_blue_old || // light_blue target == com.vtosters.lite.R.color.blue_200 || // blue_200 target == com.vtosters.lite.R.color.vk_blue_400 || // blue_200 + target == com.vtosters.lite.R.color.header_blue || target == com.vtosters.lite.R.color.blue_200_muted; // blue_200_muted } diff --git a/smali/smali_classes2/com/vk/articles/ArticleFragment.smali b/smali/smali_classes2/com/vk/articles/ArticleFragment.smali index f8a2f6d50..46e770135 100644 --- a/smali/smali_classes2/com/vk/articles/ArticleFragment.smali +++ b/smali/smali_classes2/com/vk/articles/ArticleFragment.smali @@ -3492,10 +3492,7 @@ .line 18 invoke-direct {p0, v2, v1, v3}, Lcom/vk/articles/ArticleFragment;->a(Ljava/lang/String;II)V - const v1, 0x7f060018 - - .line 19 - invoke-static {p1, v1}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v2 diff --git a/smali/smali_classes2/com/vk/attachpicker/fragment/StoryFragment.smali b/smali/smali_classes2/com/vk/attachpicker/fragment/StoryFragment.smali index c174693da..5b498f294 100644 --- a/smali/smali_classes2/com/vk/attachpicker/fragment/StoryFragment.smali +++ b/smali/smali_classes2/com/vk/attachpicker/fragment/StoryFragment.smali @@ -75,9 +75,7 @@ move-result-object v0 - const v1, 0x7f060018 - - invoke-virtual {v0, v1}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes2/com/vk/cameraui/CameraUI$a.smali b/smali/smali_classes2/com/vk/cameraui/CameraUI$a.smali index 1303c0958..1bc977efd 100644 --- a/smali/smali_classes2/com/vk/cameraui/CameraUI$a.smali +++ b/smali/smali_classes2/com/vk/cameraui/CameraUI$a.smali @@ -497,9 +497,7 @@ invoke-static {v2, v3}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V - const v3, 0x7f060023 - - invoke-static {p1, v3}, Lcom/vk/core/util/ContextExtKt;->a(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v3 diff --git a/smali/smali_classes2/com/vk/cameraui/CameraUIView.smali b/smali/smali_classes2/com/vk/cameraui/CameraUIView.smali index 9b74b59f2..423f4db13 100644 --- a/smali/smali_classes2/com/vk/cameraui/CameraUIView.smali +++ b/smali/smali_classes2/com/vk/cameraui/CameraUIView.smali @@ -4160,9 +4160,7 @@ move-result-object v0 - const v2, 0x7f060023 - - invoke-static {v0, v2}, Lcom/vk/core/util/ContextExtKt;->a(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes2/com/vk/common/widget/LocatorIndicatorDrawable.smali b/smali/smali_classes2/com/vk/common/widget/LocatorIndicatorDrawable.smali index 113bbff67..940b03164 100644 --- a/smali/smali_classes2/com/vk/common/widget/LocatorIndicatorDrawable.smali +++ b/smali/smali_classes2/com/vk/common/widget/LocatorIndicatorDrawable.smali @@ -226,9 +226,7 @@ move-result-object p1 - const v0, 0x7f060018 - - invoke-virtual {p1, v0}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p1 diff --git a/smali/smali_classes2/com/vk/components/holders/LoadersComponentsViewHolder$1.smali b/smali/smali_classes2/com/vk/components/holders/LoadersComponentsViewHolder$1.smali index 84f5d2fa3..661ce97e1 100644 --- a/smali/smali_classes2/com/vk/components/holders/LoadersComponentsViewHolder$1.smali +++ b/smali/smali_classes2/com/vk/components/holders/LoadersComponentsViewHolder$1.smali @@ -68,9 +68,7 @@ move-result-object v1 - const v2, 0x7f0600f7 - - invoke-static {v1, v2}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 diff --git a/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorAccentBlue$2.smali b/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorAccentBlue$2.smali index f5bb5094c..a4db283c6 100644 --- a/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorAccentBlue$2.smali +++ b/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorAccentBlue$2.smali @@ -58,12 +58,7 @@ .method public final invoke()I .locals 2 - .line 2 - sget-object v0, Lcom/vk/core/util/AppContextHolder;->a:Landroid/content/Context; - - sget v1, Lb/h/z/c;->accent_blue:I - - invoke-static {v0, v1}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorBlue200$2.smali b/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorBlue200$2.smali index 4ad8ab53f..841bdf68c 100644 --- a/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorBlue200$2.smali +++ b/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorBlue200$2.smali @@ -59,11 +59,7 @@ .locals 2 .line 2 - sget-object v0, Lcom/vk/core/util/AppContextHolder;->a:Landroid/content/Context; - - sget v1, Lb/h/z/c;->blue_200:I - - invoke-static {v0, v1}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes2/com/vk/core/view/ArrowSendButton.smali b/smali/smali_classes2/com/vk/core/view/ArrowSendButton.smali index 86d21f86c..05910ffa7 100644 --- a/smali/smali_classes2/com/vk/core/view/ArrowSendButton.smali +++ b/smali/smali_classes2/com/vk/core/view/ArrowSendButton.smali @@ -131,9 +131,7 @@ invoke-direct {v0, v1}, Landroid/graphics/drawable/ShapeDrawable;->(Landroid/graphics/drawable/shapes/Shape;)V .line 10 - sget v1, Lb/h/z/c;->blue_300:I - - invoke-static {p1, v1}, Lcom/vk/core/util/ContextExtKt;->a(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 diff --git a/smali/smali_classes2/com/vk/identity/adapters/IdentityLabelAdapter$LabelHolder.smali b/smali/smali_classes2/com/vk/identity/adapters/IdentityLabelAdapter$LabelHolder.smali index b02cce7c4..d1e122ef4 100644 --- a/smali/smali_classes2/com/vk/identity/adapters/IdentityLabelAdapter$LabelHolder.smali +++ b/smali/smali_classes2/com/vk/identity/adapters/IdentityLabelAdapter$LabelHolder.smali @@ -125,9 +125,7 @@ move-result-object v1 - const v2, 0x7f0600f7 - - invoke-static {v1, v2}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 diff --git a/smali/smali_classes3/com/vk/libvideo/live/views/chat/g/CommentRoundedDrawable.smali b/smali/smali_classes3/com/vk/libvideo/live/views/chat/g/CommentRoundedDrawable.smali index c2487c525..ece8b03fd 100644 --- a/smali/smali_classes3/com/vk/libvideo/live/views/chat/g/CommentRoundedDrawable.smali +++ b/smali/smali_classes3/com/vk/libvideo/live/views/chat/g/CommentRoundedDrawable.smali @@ -21,9 +21,7 @@ invoke-direct {p0}, Landroid/graphics/drawable/Drawable;->()V .line 2 - sget v0, Lcom/vk/libvideo/c;->accent_blue:I - - invoke-static {p1, v0}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes3/com/vk/libvideo/live/views/gifts/GiftsView.smali b/smali/smali_classes3/com/vk/libvideo/live/views/gifts/GiftsView.smali index c4d631b03..18a747a8b 100644 --- a/smali/smali_classes3/com/vk/libvideo/live/views/gifts/GiftsView.smali +++ b/smali/smali_classes3/com/vk/libvideo/live/views/gifts/GiftsView.smali @@ -991,9 +991,7 @@ move-result-object v0 - sget v1, Lcom/vk/libvideo/c;->header_blue:I - - invoke-static {v0, v1}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes4/com/vk/poll/adapters/PollBackgroundSmallViewHolders2.smali b/smali/smali_classes4/com/vk/poll/adapters/PollBackgroundSmallViewHolders2.smali index e665eb67e..edf2f4469 100644 --- a/smali/smali_classes4/com/vk/poll/adapters/PollBackgroundSmallViewHolders2.smali +++ b/smali/smali_classes4/com/vk/poll/adapters/PollBackgroundSmallViewHolders2.smali @@ -67,10 +67,7 @@ invoke-static {p1, p2}, Lcom/vk/extensions/ViewExtKt;->b(Landroid/view/View;Z)V - const p1, 0x7f060018 - - .line 4 - invoke-static {p1}, Lcom/vk/core/util/ResUtils;->b(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p1 diff --git a/smali/smali_classes4/com/vk/poll/adapters/PollResultAnswerHolder.smali b/smali/smali_classes4/com/vk/poll/adapters/PollResultAnswerHolder.smali index 509f6a171..cc29fcef9 100644 --- a/smali/smali_classes4/com/vk/poll/adapters/PollResultAnswerHolder.smali +++ b/smali/smali_classes4/com/vk/poll/adapters/PollResultAnswerHolder.smali @@ -289,9 +289,7 @@ move-result-object v0 - const v1, 0x7f0600f7 - - invoke-virtual {v0, v1}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes4/com/vk/poll/views/PollFilterBottomView.smali b/smali/smali_classes4/com/vk/poll/views/PollFilterBottomView.smali index 73e1b2d70..6244f5678 100644 --- a/smali/smali_classes4/com/vk/poll/views/PollFilterBottomView.smali +++ b/smali/smali_classes4/com/vk/poll/views/PollFilterBottomView.smali @@ -500,9 +500,7 @@ sget-object v1, Lcom/vk/core/util/AppContextHolder;->a:Landroid/content/Context; - const v3, 0x7f060018 - - invoke-static {v1, v3}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 diff --git a/smali/smali_classes4/com/vk/poll/views/PollResultRateDrawable.smali b/smali/smali_classes4/com/vk/poll/views/PollResultRateDrawable.smali index 09484a858..21d19338f 100644 --- a/smali/smali_classes4/com/vk/poll/views/PollResultRateDrawable.smali +++ b/smali/smali_classes4/com/vk/poll/views/PollResultRateDrawable.smali @@ -47,9 +47,7 @@ .line 2 sget-object v0, Lcom/vk/core/util/AppContextHolder;->a:Landroid/content/Context; - const v1, 0x7f060018 - - invoke-static {v0, v1}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes4/com/vk/profile/adapter/items/community/CommunityOnlineStatusItem$a.smali b/smali/smali_classes4/com/vk/profile/adapter/items/community/CommunityOnlineStatusItem$a.smali index a91568ba5..bec4ffc56 100644 --- a/smali/smali_classes4/com/vk/profile/adapter/items/community/CommunityOnlineStatusItem$a.smali +++ b/smali/smali_classes4/com/vk/profile/adapter/items/community/CommunityOnlineStatusItem$a.smali @@ -257,9 +257,7 @@ invoke-static {v7, v3}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V - const v8, 0x7f060018 - - invoke-static {v7, v8}, Lcom/vk/core/util/ContextExtKt;->a(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v7 diff --git a/smali/smali_classes4/com/vk/profile/presenter/UserPresenter.smali b/smali/smali_classes4/com/vk/profile/presenter/UserPresenter.smali index 42803d69c..75face8b2 100644 --- a/smali/smali_classes4/com/vk/profile/presenter/UserPresenter.smali +++ b/smali/smali_classes4/com/vk/profile/presenter/UserPresenter.smali @@ -1124,9 +1124,7 @@ move-result-object v1 - const v2, 0x7f060018 - - invoke-virtual {v1, v2}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 diff --git a/smali/smali_classes4/com/vk/profile/ui/user/AdministratorProfileFragment.smali b/smali/smali_classes4/com/vk/profile/ui/user/AdministratorProfileFragment.smali index df42b0cdd..95945e655 100644 --- a/smali/smali_classes4/com/vk/profile/ui/user/AdministratorProfileFragment.smali +++ b/smali/smali_classes4/com/vk/profile/ui/user/AdministratorProfileFragment.smali @@ -377,9 +377,7 @@ if-eqz v3, :cond_3 - const v4, 0x7f0600f7 - - invoke-static {v2, v4}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v4 diff --git a/smali/smali_classes4/com/vk/pushes/notifications/im/BusinessNotifyGroupNotification.smali b/smali/smali_classes4/com/vk/pushes/notifications/im/BusinessNotifyGroupNotification.smali index 9969c2d5c..bf35a4f9d 100644 --- a/smali/smali_classes4/com/vk/pushes/notifications/im/BusinessNotifyGroupNotification.smali +++ b/smali/smali_classes4/com/vk/pushes/notifications/im/BusinessNotifyGroupNotification.smali @@ -113,9 +113,7 @@ .line 6 iget-object v1, p0, Lcom/vk/pushes/notifications/im/BusinessNotifyGroupNotification;->d:Landroid/content/Context; - const v2, 0x7f0600f7 - - invoke-static {v1, v2}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 diff --git a/smali/smali_classes4/com/vk/pushes/notifications/im/MessageGroupNotification.smali b/smali/smali_classes4/com/vk/pushes/notifications/im/MessageGroupNotification.smali index 58a48d0f1..7a78e986c 100644 --- a/smali/smali_classes4/com/vk/pushes/notifications/im/MessageGroupNotification.smali +++ b/smali/smali_classes4/com/vk/pushes/notifications/im/MessageGroupNotification.smali @@ -164,9 +164,7 @@ .line 6 iget-object v1, p0, Lcom/vk/pushes/notifications/im/MessageGroupNotification;->d:Landroid/content/Context; - const v2, 0x7f0600f7 - - invoke-static {v1, v2}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 diff --git a/smali/smali_classes4/com/vk/stories/clickable/dialogs/music/SelectRangeWaveFormView.smali b/smali/smali_classes4/com/vk/stories/clickable/dialogs/music/SelectRangeWaveFormView.smali index 1524a658f..f220d8801 100644 --- a/smali/smali_classes4/com/vk/stories/clickable/dialogs/music/SelectRangeWaveFormView.smali +++ b/smali/smali_classes4/com/vk/stories/clickable/dialogs/music/SelectRangeWaveFormView.smali @@ -324,9 +324,7 @@ invoke-static {v1, v2}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V - const v3, 0x7f060023 - - invoke-static {v1, v3}, Lcom/vk/core/util/ContextExtKt;->a(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 @@ -659,9 +657,7 @@ invoke-static {v0, v1}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V - const v2, 0x7f060023 - - invoke-static {v0, v2}, Lcom/vk/core/util/ContextExtKt;->a(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 @@ -994,9 +990,7 @@ invoke-static {p3, v0}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V - const v1, 0x7f060023 - - invoke-static {p3, v1}, Lcom/vk/core/util/ContextExtKt;->a(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p3 diff --git a/smali/smali_classes4/com/vk/stories/clickable/dialogs/question/StoryCreateQuestionDataProvider.smali b/smali/smali_classes4/com/vk/stories/clickable/dialogs/question/StoryCreateQuestionDataProvider.smali index 33bb66f00..d86619081 100644 --- a/smali/smali_classes4/com/vk/stories/clickable/dialogs/question/StoryCreateQuestionDataProvider.smali +++ b/smali/smali_classes4/com/vk/stories/clickable/dialogs/question/StoryCreateQuestionDataProvider.smali @@ -126,10 +126,7 @@ aput-object v1, v0, v6 - const v1, 0x7f060023 - - .line 7 - invoke-static {v1}, Lcom/vk/core/util/ResUtils;->b(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 diff --git a/smali/smali_classes4/com/vk/stories/clickable/models/StoryQuestionInfo.smali b/smali/smali_classes4/com/vk/stories/clickable/models/StoryQuestionInfo.smali index 55ce7ff58..34bb3aefb 100644 --- a/smali/smali_classes4/com/vk/stories/clickable/models/StoryQuestionInfo.smali +++ b/smali/smali_classes4/com/vk/stories/clickable/models/StoryQuestionInfo.smali @@ -56,10 +56,7 @@ sput-object v0, Lcom/vk/stories/clickable/models/StoryQuestionInfo;->g:Lcom/vk/stories/clickable/models/StoryQuestionInfo$b; - const v0, 0x7f060023 - - .line 2 - invoke-static {v0}, Lcom/vk/core/util/ResUtils;->b(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes4/com/vk/stories/clickable/stickers/StoryPollSticker.smali b/smali/smali_classes4/com/vk/stories/clickable/stickers/StoryPollSticker.smali index 22ced051a..6867d95ba 100644 --- a/smali/smali_classes4/com/vk/stories/clickable/stickers/StoryPollSticker.smali +++ b/smali/smali_classes4/com/vk/stories/clickable/stickers/StoryPollSticker.smali @@ -1453,10 +1453,7 @@ if-eqz v16, :cond_12 - const v1, 0x7f060023 - - .line 72 - invoke-static {v1}, Lcom/vk/core/util/ResUtils;->b(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 diff --git a/smali/smali_classes4/com/vk/stories/view/question/StoryViewAskQuestionView.smali b/smali/smali_classes4/com/vk/stories/view/question/StoryViewAskQuestionView.smali index 4b07d2c63..43e84675d 100644 --- a/smali/smali_classes4/com/vk/stories/view/question/StoryViewAskQuestionView.smali +++ b/smali/smali_classes4/com/vk/stories/view/question/StoryViewAskQuestionView.smali @@ -1139,9 +1139,7 @@ invoke-static {p2, v2}, Lkotlin/jvm/internal/Intrinsics;->a(Ljava/lang/Object;Ljava/lang/String;)V - const v2, 0x7f060023 - - invoke-static {p2, v2}, Lcom/vk/core/util/ContextExtKt;->a(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p2 diff --git a/smali/smali_classes4/com/vtosters/lite/BirthdayBroadcastReceiver.smali b/smali/smali_classes4/com/vtosters/lite/BirthdayBroadcastReceiver.smali index da9b6fe5b..a29c0b158 100644 --- a/smali/smali_classes4/com/vtosters/lite/BirthdayBroadcastReceiver.smali +++ b/smali/smali_classes4/com/vtosters/lite/BirthdayBroadcastReceiver.smali @@ -196,9 +196,7 @@ move-result-object v0 - const v1, 0x7f0600f7 - - invoke-virtual {v0, v1}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes4/com/vtosters/lite/NotificationUtils.smali b/smali/smali_classes4/com/vtosters/lite/NotificationUtils.smali index e2313b36c..b185b9efe 100644 --- a/smali/smali_classes4/com/vtosters/lite/NotificationUtils.smali +++ b/smali/smali_classes4/com/vtosters/lite/NotificationUtils.smali @@ -51,10 +51,7 @@ move-result-object v0 - const v1, 0x7f0600f7 - - .line 4 - invoke-static {p0, v1}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p0 diff --git a/smali/smali_classes4/com/vtosters/lite/fragments/money/MoneyInfoBottomSheetDialog.smali b/smali/smali_classes4/com/vtosters/lite/fragments/money/MoneyInfoBottomSheetDialog.smali index 5c3c73bc1..66995420b 100644 --- a/smali/smali_classes4/com/vtosters/lite/fragments/money/MoneyInfoBottomSheetDialog.smali +++ b/smali/smali_classes4/com/vtosters/lite/fragments/money/MoneyInfoBottomSheetDialog.smali @@ -2088,10 +2088,7 @@ return p1 :cond_1 - const v0, 0x7f0600f7 - - .line 24 - invoke-static {p1, v0}, Lcom/vk/core/util/ContextExtKt;->a(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p1 diff --git a/smali/smali_classes4/com/vtosters/lite/general/fragments/PhotosFragment.smali b/smali/smali_classes4/com/vtosters/lite/general/fragments/PhotosFragment.smali index 889f872fb..9039b8b8c 100644 --- a/smali/smali_classes4/com/vtosters/lite/general/fragments/PhotosFragment.smali +++ b/smali/smali_classes4/com/vtosters/lite/general/fragments/PhotosFragment.smali @@ -833,9 +833,7 @@ move-result-object v0 - const v1, 0x7f0600f7 - - invoke-virtual {v0, v1}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes5/com/vtosters/lite/fragments/photos/PhotoListFragment.smali b/smali/smali_classes5/com/vtosters/lite/fragments/photos/PhotoListFragment.smali index 8e16258c0..dd58acfb2 100644 --- a/smali/smali_classes5/com/vtosters/lite/fragments/photos/PhotoListFragment.smali +++ b/smali/smali_classes5/com/vtosters/lite/fragments/photos/PhotoListFragment.smali @@ -2159,9 +2159,7 @@ move-result-object p2 - const v0, 0x7f0600f7 - - invoke-virtual {p2, v0}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p2 diff --git a/smali/smali_classes5/com/vtosters/lite/fragments/y2/VideosFragment.smali b/smali/smali_classes5/com/vtosters/lite/fragments/y2/VideosFragment.smali index dff7a0317..970a69e37 100644 --- a/smali/smali_classes5/com/vtosters/lite/fragments/y2/VideosFragment.smali +++ b/smali/smali_classes5/com/vtosters/lite/fragments/y2/VideosFragment.smali @@ -1135,9 +1135,7 @@ move-result-object v1 - const v2, 0x7f0600f7 - - invoke-virtual {v1, v2}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v1 diff --git a/smali/smali_classes5/com/vtosters/lite/live/LiveUserHolder.smali b/smali/smali_classes5/com/vtosters/lite/live/LiveUserHolder.smali index f1360c7ab..c2d22f618 100644 --- a/smali/smali_classes5/com/vtosters/lite/live/LiveUserHolder.smali +++ b/smali/smali_classes5/com/vtosters/lite/live/LiveUserHolder.smali @@ -194,9 +194,7 @@ move-result-object v0 - const v2, 0x7f060018 - - invoke-static {v0, v2}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes5/com/vtosters/lite/ui/WriteBar.smali b/smali/smali_classes5/com/vtosters/lite/ui/WriteBar.smali index 27f4e384b..929fbfdd7 100644 --- a/smali/smali_classes5/com/vtosters/lite/ui/WriteBar.smali +++ b/smali/smali_classes5/com/vtosters/lite/ui/WriteBar.smali @@ -5824,9 +5824,7 @@ move-result-object v0 - const v1, 0x7f060018 - - invoke-static {v0, v1}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali_classes5/com/vtosters/lite/ui/widget/VoiceRecordControlPopupWindow.smali b/smali/smali_classes5/com/vtosters/lite/ui/widget/VoiceRecordControlPopupWindow.smali index ce586e025..9a2779672 100644 --- a/smali/smali_classes5/com/vtosters/lite/ui/widget/VoiceRecordControlPopupWindow.smali +++ b/smali/smali_classes5/com/vtosters/lite/ui/widget/VoiceRecordControlPopupWindow.smali @@ -135,9 +135,7 @@ move-result-object p2 - const p3, 0x7f0600f7 - - invoke-virtual {p2, p3}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p2 diff --git a/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali b/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali index cf1ec15e4..eb4297fe4 100644 --- a/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali +++ b/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali @@ -80,9 +80,7 @@ move-result-object p3 - const v0, 0x7f0600f7 - - invoke-virtual {p3, v0}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p3 diff --git a/smali/smali_classes5/com/vtosters/lite/upload/UploadNotification.smali b/smali/smali_classes5/com/vtosters/lite/upload/UploadNotification.smali index 1e7fcfba4..ba655c957 100644 --- a/smali/smali_classes5/com/vtosters/lite/upload/UploadNotification.smali +++ b/smali/smali_classes5/com/vtosters/lite/upload/UploadNotification.smali @@ -100,9 +100,7 @@ move-result-object p2 - const p3, 0x7f0600f7 - - invoke-virtual {p2, p3}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p2 From c7d350f5b1804f043bd78cf5352f62d39c2c56c7 Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Tue, 22 Nov 2022 19:08:39 +0300 Subject: [PATCH 05/95] remove logger from TextViewHook --- .../main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java index 063eaab15..55d3f50bd 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/TextViewHook.java @@ -3,7 +3,6 @@ package ru.vtosters.lite.themes.hooks; import android.annotation.SuppressLint; import android.content.res.ColorStateList; import android.os.Build; -import android.util.Log; import android.view.View; import android.widget.TextView; @@ -28,7 +27,6 @@ public class TextViewHook implements BaseHook { if (view instanceof TextView) { var textView = (TextView) view; - Log.d(TAG, "inject: " + textView.getText() + " " + textView.getCurrentTextColor()); if (ColorReferences.isAccentedColor(textView.getCurrentTextColor())) { textView.setTextColor(ThemesUtils.getAccentColor()); } From 3b83f05bf0df317ada91897c769ca1673acad2b8 Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Tue, 22 Nov 2022 19:08:47 +0300 Subject: [PATCH 06/95] init ThemesCore --- app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java index 5e71bbdd8..fac71ef5c 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java @@ -25,6 +25,11 @@ public class ThemesCore { private static int wallDarkColor; private static int wallLightColor; + static { + setExceptions(); + setThemedColors(ThemesUtils.getAccentColor()); + } + public static void setExceptions() { ACCENT_THEME_ONLY_LIGHT.clear(); ACCENT_THEME_ONLY_NOMILK_LIGHT.clear(); From 95a0451c6b2a1dca0cd5d354b3352de5be20a6f1 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Tue, 22 Nov 2022 20:06:56 +0300 Subject: [PATCH 07/95] fixed dw coloring --- .../java/ru/vtosters/lite/themes/utils/RecolorUtils.java | 6 ++++++ .../smali_classes2/com/vk/core/extensions/DrawableExt.smali | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/app/src/main/java/ru/vtosters/lite/themes/utils/RecolorUtils.java b/app/src/main/java/ru/vtosters/lite/themes/utils/RecolorUtils.java index 1d35952eb..023e2ec8e 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/utils/RecolorUtils.java +++ b/app/src/main/java/ru/vtosters/lite/themes/utils/RecolorUtils.java @@ -7,6 +7,7 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Build; +import android.util.Log; import com.vk.core.drawable.RecoloredDrawable; import ru.vtosters.lite.themes.ColorReferences; @@ -27,6 +28,11 @@ public class RecolorUtils { return new RecoloredDrawable(res, ThemesUtils.getAccentColor()); } // Get res drawable via id and coloring to accent + public static int recolorHexColor(int i){ + Log.d("RecolorUtils", ThemesUtils.hex(i)); + return ColorReferences.isAccentedColor(i) ? ThemesUtils.getAccentColor() : i; + } + public static ColorStateList recolorCSL(ColorStateList colorStateList) { if (colorStateList == null) return null; diff --git a/smali/smali_classes2/com/vk/core/extensions/DrawableExt.smali b/smali/smali_classes2/com/vk/core/extensions/DrawableExt.smali index 3cb24e12e..54ba928be 100644 --- a/smali/smali_classes2/com/vk/core/extensions/DrawableExt.smali +++ b/smali/smali_classes2/com/vk/core/extensions/DrawableExt.smali @@ -7,6 +7,10 @@ .method public static final a(Landroid/graphics/drawable/Drawable;ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/drawable/Drawable; .locals 1 + invoke-static {p2}, Lru/vtosters/lite/themes/utils/RecolorUtils;->recolorHexColor(I)I + + move-result p2 + .line 2 invoke-virtual {p0}, Landroid/graphics/drawable/Drawable;->mutate()Landroid/graphics/drawable/Drawable; From 802d88cad70f06719f563d66dcadb3c5d7e4994e Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Tue, 22 Nov 2022 20:09:07 +0300 Subject: [PATCH 08/95] fix AppCompatResources --- .../appcompat/content/res/AppCompatResources.smali | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/smali/smali/androidx/appcompat/content/res/AppCompatResources.smali b/smali/smali/androidx/appcompat/content/res/AppCompatResources.smali index 9a80cf07e..6611003d8 100644 --- a/smali/smali/androidx/appcompat/content/res/AppCompatResources.smali +++ b/smali/smali/androidx/appcompat/content/res/AppCompatResources.smali @@ -257,6 +257,12 @@ .end param .line 1 + invoke-static {p0, p1}, Lru/vtosters/lite/themes/utils/RecolorUtils;->themeCSL(Landroid/content/Context;I)Landroid/content/res/ColorStateList; + + move-result-object p0 + + return-object p0 + sget v0, Landroid/os/Build$VERSION;->SDK_INT:I const/16 v1, 0x17 @@ -268,12 +274,6 @@ move-result-object p0 - invoke-static {p0}, Lru/vtosters/lite/themes/utils/RecolorUtils;->themeCSL(Landroid/content/res/ColorStateList;)Landroid/content/res/ColorStateList; - - move-result-object p0 - - return-object p0 - .line 3 :cond_0 invoke-static {p0, p1}, Landroidx/appcompat/content/res/AppCompatResources;->getCachedColorStateList(Landroid/content/Context;I)Landroid/content/res/ColorStateList; From 989075a3d2678175ced390823d3a5a7db4753b96 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Tue, 22 Nov 2022 20:21:29 +0300 Subject: [PATCH 09/95] Update DrawableExt.smali --- .../smali_classes2/com/vk/core/extensions/DrawableExt.smali | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/smali/smali_classes2/com/vk/core/extensions/DrawableExt.smali b/smali/smali_classes2/com/vk/core/extensions/DrawableExt.smali index 54ba928be..1fb0d3778 100644 --- a/smali/smali_classes2/com/vk/core/extensions/DrawableExt.smali +++ b/smali/smali_classes2/com/vk/core/extensions/DrawableExt.smali @@ -7,10 +7,10 @@ .method public static final a(Landroid/graphics/drawable/Drawable;ILandroid/graphics/PorterDuff$Mode;)Landroid/graphics/drawable/Drawable; .locals 1 - invoke-static {p2}, Lru/vtosters/lite/themes/utils/RecolorUtils;->recolorHexColor(I)I + invoke-static {p1}, Lru/vtosters/lite/themes/utils/RecolorUtils;->recolorHexColor(I)I + + move-result p1 - move-result p2 - .line 2 invoke-virtual {p0}, Landroid/graphics/drawable/Drawable;->mutate()Landroid/graphics/drawable/Drawable; From 3fd0757fd45dfead5bade1425a3cbdcd7b97ee18 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Tue, 22 Nov 2022 21:06:26 +0300 Subject: [PATCH 10/95] Update DialogActionsListView.smali --- .../vk/im/ui/views/dialog_actions/DialogActionsListView.smali | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/smali/smali_classes3/com/vk/im/ui/views/dialog_actions/DialogActionsListView.smali b/smali/smali_classes3/com/vk/im/ui/views/dialog_actions/DialogActionsListView.smali index d058e52b0..1a18f5173 100644 --- a/smali/smali_classes3/com/vk/im/ui/views/dialog_actions/DialogActionsListView.smali +++ b/smali/smali_classes3/com/vk/im/ui/views/dialog_actions/DialogActionsListView.smali @@ -472,6 +472,10 @@ move-result-object p1 + invoke-static {p1}, Lru/vtosters/lite/utils/ThemesUtils;->recolorDrawable(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; + + move-result-object p1 + goto :goto_0 :cond_0 From 1a96f77aa12e9a81663a2f5351b2108a03bc67bd Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Tue, 22 Nov 2022 21:34:48 +0300 Subject: [PATCH 11/95] some crash fixes --- smali/smali_classes2/com/vk/articles/ArticleFragment.smali | 6 ++++-- .../vk/core/utils/VerifyInfoHelper$colorLightBlue$2.smali | 2 +- .../com/vk/mentions/w/DefaultMentionSpanProvider.smali | 2 +- .../com/vtosters/lite/ui/widget/WaveRecordCircleView.smali | 4 +++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/smali/smali_classes2/com/vk/articles/ArticleFragment.smali b/smali/smali_classes2/com/vk/articles/ArticleFragment.smali index 46e770135..f6aa78b5a 100644 --- a/smali/smali_classes2/com/vk/articles/ArticleFragment.smali +++ b/smali/smali_classes2/com/vk/articles/ArticleFragment.smali @@ -3492,14 +3492,16 @@ .line 18 invoke-direct {p0, v2, v1, v3}, Lcom/vk/articles/ArticleFragment;->a(Ljava/lang/String;II)V - invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I + const v1, 0x7f060018 + + invoke-static {v1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor2(I)I move-result v2 const v3, 0x7f060105 .line 20 - invoke-static {p1, v3}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {v3}, Lru/vtosters/lite/utils/ThemesUtils;->getColor2(I)I move-result v4 diff --git a/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorLightBlue$2.smali b/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorLightBlue$2.smali index 9e556d4de..a099fe483 100644 --- a/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorLightBlue$2.smali +++ b/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorLightBlue$2.smali @@ -63,7 +63,7 @@ sget v1, Lb/h/z/c;->light_blue:I - invoke-static {v0, v1}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {v1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor2(I)I move-result v0 diff --git a/smali/smali_classes3/com/vk/mentions/w/DefaultMentionSpanProvider.smali b/smali/smali_classes3/com/vk/mentions/w/DefaultMentionSpanProvider.smali index 9623fc915..43f952892 100644 --- a/smali/smali_classes3/com/vk/mentions/w/DefaultMentionSpanProvider.smali +++ b/smali/smali_classes3/com/vk/mentions/w/DefaultMentionSpanProvider.smali @@ -27,7 +27,7 @@ .line 2 sget v0, Lcom/vk/mentions/p;->light_blue:I - invoke-static {p1, v0}, Landroidx/core/content/ContextCompat;->getColor(Landroid/content/Context;I)I + invoke-static {v0}, Lru/vtosters/lite/utils/ThemesUtils;->getColor2(I)I move-result p1 diff --git a/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali b/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali index eb4297fe4..4c2f2e288 100644 --- a/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali +++ b/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali @@ -80,7 +80,9 @@ move-result-object p3 - invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I + const v0, 0x7f0600f7 + + invoke-static {v0}, Lru/vtosters/lite/utils/ThemesUtils;->getColor2(I)I move-result p3 From c17e604db6cf023739e3c48cdf1be22f1b25af4f Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Tue, 22 Nov 2022 22:31:32 +0300 Subject: [PATCH 12/95] fixed cringe code + coloring bug --- .../java/ru/vtosters/lite/hooks/PhotoViewer.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/hooks/PhotoViewer.java b/app/src/main/java/ru/vtosters/lite/hooks/PhotoViewer.java index 12872dea8..12714ed3f 100644 --- a/app/src/main/java/ru/vtosters/lite/hooks/PhotoViewer.java +++ b/app/src/main/java/ru/vtosters/lite/hooks/PhotoViewer.java @@ -97,9 +97,8 @@ public class PhotoViewer { @SuppressLint("UseCompatLoadingForDrawables") public static void addMenuItems(AttachmentWithMedia attachment, ActionsPopup.b actionPopup, int i, boolean z) { actionPopup.a(R.string.search_photo_content, - ThemesUtils.isDarkTheme() - ? AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28) - : new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28), ThemesUtils.getAccentColor()), + new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_menu_search_outline_28), + ThemesUtils.isDarkTheme() ? Color.WHITE : ThemesUtils.getAccentColor()), false, () -> { if (attachment instanceof PhotoAttachment) { @@ -119,9 +118,8 @@ public class PhotoViewer { } ); actionPopup.a(R.string.copy_photo_url_content, - !ThemesUtils.isDarkTheme() - ? new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), ThemesUtils.getAccentColor()) - : new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), Color.WHITE), + new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_copy_outline_28), + ThemesUtils.isDarkTheme() ? Color.WHITE : ThemesUtils.getAccentColor()), false, () -> { if (attachment instanceof PhotoAttachment) { @@ -141,10 +139,8 @@ public class PhotoViewer { } ); actionPopup.a(R.string.open_original_photo_content, - ThemesUtils.isDarkTheme() - ? AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_link_outline_28) - : new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_link_outline_28), - ThemesUtils.getAccentColor()), + new RecoloredDrawable(AndroidUtils.getGlobalContext().getDrawable(R.drawable.ic_link_outline_28), + ThemesUtils.isDarkTheme() ? Color.WHITE : ThemesUtils.getAccentColor()), false, () -> { if (attachment instanceof PhotoAttachment) { From 76468d886371341f9a8d14508bc8af4e6a19c82b Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Wed, 23 Nov 2022 22:24:25 +0300 Subject: [PATCH 13/95] [WIP] Accent picker in settings --- .../vtosters/lite/themes/ColorReferences.java | 1 + .../ru/vtosters/lite/themes/ThemesCore.java | 5 ++ .../lite/ui/fragments/ThemesFragment.java | 89 ++++++++++++++++--- .../ru/vtosters/lite/utils/ThemesUtils.java | 4 +- smali/res/xml/preferences_themes.xml | 10 ++- 5 files changed, 95 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java index 32c710fca..c3568d2e0 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java @@ -7,6 +7,7 @@ import java.util.Arrays; import java.util.List; public class ColorReferences { + public static final int stockAccent = Color.parseColor("#3f8ae0"); public static List accentColors = Arrays.asList( Color.parseColor("#3f8ae0"), // azure_300 (light accent) Color.parseColor("#4986cc"), // azure_a400 diff --git a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java index fac71ef5c..9424084f8 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java @@ -142,6 +142,11 @@ public class ThemesCore { } else return themedColors.get(attrID) != 0; } + public static void clear() { + cachedAccents = false; + themedColors.clear(); + } + public static boolean isCachedAccents() { return cachedAccents; } diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java index fbc0ffa5e..0c4c7537b 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java @@ -1,19 +1,29 @@ package ru.vtosters.lite.ui.fragments; -import static ru.vtosters.lite.utils.AndroidUtils.edit; -import static ru.vtosters.lite.utils.AndroidUtils.isTablet; -import static ru.vtosters.lite.utils.LifecycleUtils.restartApplicationWithTimer; -import static ru.vtosters.lite.utils.Preferences.milkshake; - import android.content.Context; import android.content.Intent; +import android.content.res.ColorStateList; +import android.graphics.Color; import android.os.Bundle; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; +import com.vk.core.util.ToastUtils; import com.vk.navigation.Navigator; import com.vtosters.lite.R; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; +import com.vtosters.lite.ui.EditText; + +import ru.vtosters.lite.themes.ColorReferences; +import ru.vtosters.lite.themes.ThemesCore; +import ru.vtosters.lite.ui.PreferencesUtil; +import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.LifecycleUtils; +import ru.vtosters.lite.utils.Preferences; +import ru.vtosters.lite.utils.ThemesUtils; public class ThemesFragment extends MaterialPreferenceToolbarFragment { @@ -26,6 +36,7 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { } private void prefs() { + findPreference("accent_color").setOnPreferenceClickListener(new AccentDialog()); findPreference("navbar").setOnPreferenceClickListener(new restart()); findPreference("milkshake").setOnPreferenceClickListener(new restart()); findPreference("darktheme").setOnPreferenceChangeListener(new restartdark()); @@ -35,9 +46,9 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { findPreference("dockbar_accent").setOnPreferenceClickListener(new restart()); findPreference("dockcounter").setOnPreferenceClickListener(new restart()); findPreference("newsfeed_notif").setOnPreferenceClickListener(new restart()); - findPreference("newsfeed_notif").setVisible(milkshake()); + findPreference("newsfeed_notif").setVisible(Preferences.milkshake()); - if (isTablet()) { + if (AndroidUtils.isTablet()) { findPreference("dockbarsett").setVisible(false); } } @@ -50,7 +61,7 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { public static class restart implements Preference.OnPreferenceClickListener { @Override public boolean onPreferenceClick(Preference preference) { - restartApplicationWithTimer(); + LifecycleUtils.restartApplicationWithTimer(); return true; } } @@ -58,8 +69,8 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { public static class restartlight implements Preference.OnPreferenceChangeListener { @Override public boolean onPreferenceChange(Preference preference, Object o) { - edit().putString("lighttheme", o.toString()).commit(); - restartApplicationWithTimer(); + AndroidUtils.edit().putString("lighttheme", o.toString()).commit(); + LifecycleUtils.restartApplicationWithTimer(); return false; } } @@ -67,8 +78,8 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { public static class restartdark implements Preference.OnPreferenceChangeListener { @Override public boolean onPreferenceChange(Preference preference, Object o) { - edit().putString("darktheme", o.toString()).commit(); - restartApplicationWithTimer(); + AndroidUtils.edit().putString("darktheme", o.toString()).commit(); + LifecycleUtils.restartApplicationWithTimer(); return false; } } @@ -83,4 +94,58 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { return true; } } + + private class AccentDialog implements Preference.OnPreferenceClickListener { + @Override + public boolean onPreferenceClick(Preference preference) { + LinearLayout linearLayout = new LinearLayout(requireContext()); + + final EditText editText = new EditText(requireContext()); + editText.setHint("Акцент"); + editText.setText(ThemesUtils.hex(AndroidUtils.getPreferences().getInt("accent_color", ColorReferences.stockAccent))); + editText.setHintTextColor(PreferencesUtil.getSTextColor(requireActivity())); + editText.setBackgroundTintList(ColorStateList.valueOf(PreferencesUtil.getTextColor(requireActivity()))); + + linearLayout.addView(editText); + editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; + ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams()); + margin.setMargins(AndroidUtils.dp2px(24f), 0, AndroidUtils.dp2px(24f), 0); + editText.setLayoutParams(margin); + + AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); + builder.setTitle("Акценты"); + builder.setMessage("Это изменит цвет иконки таббара, ссылки и.т.д.\nДанная функция еще в разработке, поэтому возможны недокрасы!\n\nЦвет указывается в формате #RRGGBB (#9600FF).\n\nЧтобы вернуть стандартный акцент ВК, оставьте это поле пустым."); + builder.setView(linearLayout); + builder.setPositiveButton("OK", (dialog, which) -> { + String color = editText.getText().toString(); + if (color.equals("")) { + AndroidUtils.edit().putInt("theme_accent", ColorReferences.stockAccent).apply(); + ToastUtils.a("Функция отключена."); + ThemesCore.clear(); + ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); + return; + } + if (!color.startsWith("#")) { + ToastUtils.a("Цвет надо вводить в HEX-формате!"); + return; + } + if (color.length() != 7) { + ToastUtils.a("Неправильная длина цвета (прозрачность не поддерживается)"); + return; + } + try { + Color.parseColor(color); + } catch (Exception e) { + ToastUtils.a("Ошибка: неправильный формат цвета."); + return; + } + + AndroidUtils.edit().putInt("accent_color", Color.parseColor(color)).apply(); + ThemesCore.setThemedColors(Color.parseColor(color)); + ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); + }); + builder.show(); + return false; + } + } } diff --git a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java index eaec00da9..503960c5c 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -39,6 +39,8 @@ import com.vk.core.ui.themes.VKThemeHelper; import com.vtosters.lite.R; import com.vtosters.lite.data.ThemeTracker; +import ru.vtosters.lite.themes.ColorReferences; + public class ThemesUtils { public static void applyTheme(VKTheme theme) { var currentActivity = LifecycleUtils.getCurrentActivity(); @@ -92,7 +94,7 @@ public class ThemesUtils { } public static int getAccentColor() { - return getColor2(R.color.red); + return AndroidUtils.getPreferences().getInt("accent_color", ColorReferences.stockAccent); } // Color accent public static int getTextAttr() { diff --git a/smali/res/xml/preferences_themes.xml b/smali/res/xml/preferences_themes.xml index 593a83efa..2376a8fc2 100644 --- a/smali/res/xml/preferences_themes.xml +++ b/smali/res/xml/preferences_themes.xml @@ -1,5 +1,11 @@ + + + - + Date: Wed, 23 Nov 2022 23:06:31 +0300 Subject: [PATCH 14/95] [accents] replace AlertDialog with VkAlertDialog --- .../java/ru/vtosters/lite/ui/fragments/ThemesFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java index 0c4c7537b..130265b9b 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java @@ -8,9 +8,9 @@ import android.os.Bundle; import android.view.ViewGroup; import android.widget.LinearLayout; -import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; +import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.util.ToastUtils; import com.vk.navigation.Navigator; import com.vtosters.lite.R; @@ -112,7 +112,7 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { margin.setMargins(AndroidUtils.dp2px(24f), 0, AndroidUtils.dp2px(24f), 0); editText.setLayoutParams(margin); - AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); + VkAlertDialog.Builder builder = new VkAlertDialog.Builder(requireContext()); builder.setTitle("Акценты"); builder.setMessage("Это изменит цвет иконки таббара, ссылки и.т.д.\nДанная функция еще в разработке, поэтому возможны недокрасы!\n\nЦвет указывается в формате #RRGGBB (#9600FF).\n\nЧтобы вернуть стандартный акцент ВК, оставьте это поле пустым."); builder.setView(linearLayout); From 2bcf5d1c2d8212a2ce68d94b6d806b22a4312fb9 Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Wed, 23 Nov 2022 23:08:01 +0300 Subject: [PATCH 15/95] [accents] highlight edittext field --- .../main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java index 130265b9b..2e77d3443 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java @@ -104,7 +104,7 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { editText.setHint("Акцент"); editText.setText(ThemesUtils.hex(AndroidUtils.getPreferences().getInt("accent_color", ColorReferences.stockAccent))); editText.setHintTextColor(PreferencesUtil.getSTextColor(requireActivity())); - editText.setBackgroundTintList(ColorStateList.valueOf(PreferencesUtil.getTextColor(requireActivity()))); + editText.setBackgroundTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); linearLayout.addView(editText); editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; From 88339feb12499054c5282ecd8631a220ca82646c Mon Sep 17 00:00:00 2001 From: aliveoutside <53598473+aliveoutside@users.noreply.github.com> Date: Wed, 23 Nov 2022 23:29:01 +0300 Subject: [PATCH 16/95] [accents] create a separate fragment for accents --- .../lite/ui/fragments/AccentsFragment.java | 86 +++++++++++++++++++ .../lite/ui/fragments/ThemesFragment.java | 68 ++------------- 2 files changed, 93 insertions(+), 61 deletions(-) create mode 100644 app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java new file mode 100644 index 000000000..38c0c9a67 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java @@ -0,0 +1,86 @@ +package ru.vtosters.lite.ui.fragments; + +import android.content.res.ColorStateList; +import android.graphics.Color; +import android.os.Bundle; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import androidx.preference.Preference; + +import com.vk.core.dialogs.alert.VkAlertDialog; +import com.vk.core.util.ToastUtils; +import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; + +import com.vtosters.lite.R; +import com.vtosters.lite.ui.EditText; + +import ru.vtosters.lite.themes.ColorReferences; +import ru.vtosters.lite.themes.ThemesCore; +import ru.vtosters.lite.ui.PreferencesUtil; +import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.ThemesUtils; + +public class AccentsFragment extends MaterialPreferenceToolbarFragment { + @Override + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + addPreferencesFromResource(R.xml.empty); + PreferencesUtil.addPreference(this, "Выбор акцента через HEX", "", 0, new AccentHexDialog()); + } + + private class AccentHexDialog implements Preference.OnPreferenceClickListener { + @Override + public boolean onPreferenceClick(Preference preference) { + LinearLayout linearLayout = new LinearLayout(requireContext()); + + final EditText editText = new EditText(requireContext()); + editText.setHint("Акцент"); + editText.setText(ThemesUtils.hex(AndroidUtils.getPreferences().getInt("accent_color", ColorReferences.stockAccent))); + editText.setHintTextColor(PreferencesUtil.getSTextColor(requireActivity())); + editText.setBackgroundTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); + + linearLayout.addView(editText); + editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; + ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams()); + margin.setMargins(AndroidUtils.dp2px(24f), 0, AndroidUtils.dp2px(24f), 0); + editText.setLayoutParams(margin); + + VkAlertDialog.Builder builder = new VkAlertDialog.Builder(requireContext()); + builder.setTitle("Акценты"); + builder.setMessage("Это изменит цвет иконки таббара, ссылки и.т.д.\nДанная функция еще в разработке, поэтому возможны недокрасы!\n\nЦвет указывается в формате #RRGGBB (#9600FF).\n\nЧтобы вернуть стандартный акцент ВК, оставьте это поле пустым."); + builder.setView(linearLayout); + builder.setPositiveButton("OK", (dialog, which) -> { + String color = editText.getText().toString(); + if (color.equals("")) { + AndroidUtils.edit().putInt("theme_accent", ColorReferences.stockAccent).apply(); + ToastUtils.a("Функция отключена."); + ThemesCore.clear(); + ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); + return; + } + if (!color.startsWith("#")) { + ToastUtils.a("Цвет надо вводить в HEX-формате!"); + return; + } + if (color.length() != 7) { + ToastUtils.a("Неправильная длина цвета (прозрачность не поддерживается)"); + return; + } + try { + Color.parseColor(color); + } catch (Exception e) { + ToastUtils.a("Ошибка: неправильный формат цвета."); + return; + } + + AndroidUtils.edit().putInt("accent_color", Color.parseColor(color)).apply(); + ThemesCore.setThemedColors(Color.parseColor(color)); + ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); + }); + builder.show(); + return false; + } + } + +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java index 2e77d3443..285f82758 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java @@ -2,28 +2,17 @@ package ru.vtosters.lite.ui.fragments; import android.content.Context; import android.content.Intent; -import android.content.res.ColorStateList; -import android.graphics.Color; import android.os.Bundle; -import android.view.ViewGroup; -import android.widget.LinearLayout; import androidx.preference.Preference; -import com.vk.core.dialogs.alert.VkAlertDialog; -import com.vk.core.util.ToastUtils; import com.vk.navigation.Navigator; import com.vtosters.lite.R; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; -import com.vtosters.lite.ui.EditText; -import ru.vtosters.lite.themes.ColorReferences; -import ru.vtosters.lite.themes.ThemesCore; -import ru.vtosters.lite.ui.PreferencesUtil; import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.LifecycleUtils; import ru.vtosters.lite.utils.Preferences; -import ru.vtosters.lite.utils.ThemesUtils; public class ThemesFragment extends MaterialPreferenceToolbarFragment { @@ -36,7 +25,7 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { } private void prefs() { - findPreference("accent_color").setOnPreferenceClickListener(new AccentDialog()); + findPreference("accent_color").setOnPreferenceClickListener(new Accents()); findPreference("navbar").setOnPreferenceClickListener(new restart()); findPreference("milkshake").setOnPreferenceClickListener(new restart()); findPreference("darktheme").setOnPreferenceChangeListener(new restartdark()); @@ -95,57 +84,14 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { } } - private class AccentDialog implements Preference.OnPreferenceClickListener { + private class Accents implements Preference.OnPreferenceClickListener { @Override public boolean onPreferenceClick(Preference preference) { - LinearLayout linearLayout = new LinearLayout(requireContext()); - - final EditText editText = new EditText(requireContext()); - editText.setHint("Акцент"); - editText.setText(ThemesUtils.hex(AndroidUtils.getPreferences().getInt("accent_color", ColorReferences.stockAccent))); - editText.setHintTextColor(PreferencesUtil.getSTextColor(requireActivity())); - editText.setBackgroundTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); - - linearLayout.addView(editText); - editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; - ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams()); - margin.setMargins(AndroidUtils.dp2px(24f), 0, AndroidUtils.dp2px(24f), 0); - editText.setLayoutParams(margin); - - VkAlertDialog.Builder builder = new VkAlertDialog.Builder(requireContext()); - builder.setTitle("Акценты"); - builder.setMessage("Это изменит цвет иконки таббара, ссылки и.т.д.\nДанная функция еще в разработке, поэтому возможны недокрасы!\n\nЦвет указывается в формате #RRGGBB (#9600FF).\n\nЧтобы вернуть стандартный акцент ВК, оставьте это поле пустым."); - builder.setView(linearLayout); - builder.setPositiveButton("OK", (dialog, which) -> { - String color = editText.getText().toString(); - if (color.equals("")) { - AndroidUtils.edit().putInt("theme_accent", ColorReferences.stockAccent).apply(); - ToastUtils.a("Функция отключена."); - ThemesCore.clear(); - ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); - return; - } - if (!color.startsWith("#")) { - ToastUtils.a("Цвет надо вводить в HEX-формате!"); - return; - } - if (color.length() != 7) { - ToastUtils.a("Неправильная длина цвета (прозрачность не поддерживается)"); - return; - } - try { - Color.parseColor(color); - } catch (Exception e) { - ToastUtils.a("Ошибка: неправильный формат цвета."); - return; - } - - AndroidUtils.edit().putInt("accent_color", Color.parseColor(color)).apply(); - ThemesCore.setThemedColors(Color.parseColor(color)); - ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); - }); - builder.show(); - return false; + Context context = requireContext(); + Intent a2 = new Navigator(AccentsFragment.class).b(context); + a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(a2); + return true; } } } From 985ced6e3c17acd4327b4da9c287d482c020f6b4 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 24 Nov 2022 11:57:49 +0300 Subject: [PATCH 17/95] deleted useless hook --- .../ru/vtosters/lite/themes/ViewInjector.java | 2 -- .../lite/themes/hooks/WaveformViewHook.java | 16 ---------------- 2 files changed, 18 deletions(-) delete mode 100644 app/src/main/java/ru/vtosters/lite/themes/hooks/WaveformViewHook.java diff --git a/app/src/main/java/ru/vtosters/lite/themes/ViewInjector.java b/app/src/main/java/ru/vtosters/lite/themes/ViewInjector.java index 774f316c4..f3c2ae118 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ViewInjector.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ViewInjector.java @@ -13,7 +13,6 @@ import ru.vtosters.lite.themes.hooks.TabLayoutHook; import ru.vtosters.lite.themes.hooks.TextViewHook; import ru.vtosters.lite.themes.hooks.ToolbarHook; import ru.vtosters.lite.themes.hooks.VKImageViewHook; -import ru.vtosters.lite.themes.hooks.WaveformViewHook; public class ViewInjector { public static ArrayList hooks = new ArrayList<>(); @@ -25,7 +24,6 @@ public class ViewInjector { hooks.add(new TextViewHook()); hooks.add(new ToolbarHook()); hooks.add(new VKImageViewHook()); - hooks.add(new WaveformViewHook()); hooks.add(new ProgressWheelHook()); } diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/WaveformViewHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/WaveformViewHook.java deleted file mode 100644 index 50d554859..000000000 --- a/app/src/main/java/ru/vtosters/lite/themes/hooks/WaveformViewHook.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.vtosters.lite.themes.hooks; - -import android.view.View; - -import com.vtosters.lite.ui.widget.WaveformView; - -public class WaveformViewHook implements BaseHook { - @Override - public void inject(View view, int i, boolean z) { - if (view instanceof WaveformView) { - var waveformView = (WaveformView) view; - //waveformView.set(ThemesUtils.getAccentColor()); - } - } -} - From 8c03ab60fce18e37cc68c115ac036412dde00e96 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 24 Nov 2022 15:00:02 +0300 Subject: [PATCH 18/95] updated attrs and some swipe coloring --- .../ru/vtosters/lite/themes/ThemesCore.java | 7 +++++ .../ru/vtosters/lite/utils/ThemesUtils.java | 28 ++++++++----------- .../viewcontrollers/msg_list/MsgListVc.smali | 4 +++ .../SwipeToReplyItemTouchCallback.smali | 4 +++ 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java index 9424084f8..5bf652d42 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java @@ -56,6 +56,7 @@ public class ThemesCore { ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.header_tint_alternate, false); ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.toolbarIconsColor, false); ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.header_tab_active_indicator, false); + ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.header_alternate_tab_active_indicator, false); ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.im_dropdown_arrow_tint, false); ACCENT_THEME_ONLY_NOMILK.put(com.vtosters.lite.R.attr.im_dropdown_icon_color, false); @@ -85,6 +86,7 @@ public class ThemesCore { themedColors.put(com.vtosters.lite.R.attr.button_outline_border, accentColor); themedColors.put(com.vtosters.lite.R.attr.button_muted_foreground, accentColor); themedColors.put(com.vtosters.lite.R.attr.header_tab_active_indicator, accentColor); + themedColors.put(com.vtosters.lite.R.attr.header_alternate_tab_active_indicator, accentColor); themedColors.put(com.vtosters.lite.R.attr.im_dropdown_icon_color, accentColor); themedColors.put(com.vtosters.lite.R.attr.im_dropdown_arrow_tint, accentColor); @@ -99,12 +101,17 @@ public class ThemesCore { themedColors.put(com.vtosters.lite.R.attr.newsfeed_action_color, accentColor); themedColors.put(com.vtosters.lite.R.attr.counter_primary_background, accentColor); + themedColors.put(com.vtosters.lite.R.attr.dynamic_blue, accentColor); + themedColors.put(com.vtosters.lite.R.attr.action_sheet_action_foreground, accentColor); // messages wallDarkColor = ThemesUtils.darken(accentColor, 0.25f); wallLightColor = ThemesUtils.lighten(accentColor, 0.25f); + themedColors.put(com.vtosters.lite.R.attr.im_reply_separator, accentColor); + themedColors.put(com.vtosters.lite.R.attr.im_text_name, accentColor); + //themedColors.put(com.vtosters.lite.R.attr.im_ic_send_msg, accentColor); themedColors.put(com.vtosters.lite.R.attr.im_bubble_wallpaper_outgoing, accentColor); themedColors.put(com.vtosters.lite.R.attr.im_bubble_outgoing, accentColor); diff --git a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java index 503960c5c..62bb94c32 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -1,19 +1,5 @@ package ru.vtosters.lite.utils; -import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; -import static ru.vtosters.lite.hooks.VKUIHook.isLoaded; -import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaper; -import static ru.vtosters.lite.utils.AndroidUtils.getCenterScreenCoords; -import static ru.vtosters.lite.utils.AndroidUtils.getIdentifier; -import static ru.vtosters.lite.utils.AndroidUtils.getPrefsValue; -import static ru.vtosters.lite.utils.AndroidUtils.getResources; -import static ru.vtosters.lite.utils.LifecycleUtils.getCurrentActivity; -import static ru.vtosters.lite.utils.Preferences.color_grishka; -import static ru.vtosters.lite.utils.Preferences.dockbar_accent; -import static ru.vtosters.lite.utils.Preferences.milkshake; -import static ru.vtosters.lite.utils.Preferences.navbar; -import static ru.vtosters.lite.utils.Preferences.vkme; - import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; @@ -25,11 +11,9 @@ import android.view.View; import android.view.Window; import android.webkit.WebView; import android.widget.ImageButton; - import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.Toolbar; import androidx.core.graphics.ColorUtils; - import com.vk.articles.preload.WebCachePreloader; import com.vk.core.drawable.RecoloredDrawable; import com.vk.core.preference.Preference; @@ -38,9 +22,15 @@ import com.vk.core.ui.themes.VKTheme; import com.vk.core.ui.themes.VKThemeHelper; import com.vtosters.lite.R; import com.vtosters.lite.data.ThemeTracker; - import ru.vtosters.lite.themes.ColorReferences; +import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; +import static ru.vtosters.lite.hooks.VKUIHook.isLoaded; +import static ru.vtosters.lite.ui.wallpapers.WallpapersHooks.getWallpaper; +import static ru.vtosters.lite.utils.AndroidUtils.*; +import static ru.vtosters.lite.utils.LifecycleUtils.getCurrentActivity; +import static ru.vtosters.lite.utils.Preferences.*; + public class ThemesUtils { public static void applyTheme(VKTheme theme) { var currentActivity = LifecycleUtils.getCurrentActivity(); @@ -198,6 +188,10 @@ public class ThemesUtils { return false; } // Accent colors + public static int replaceColor(int i){ + return ColorReferences.isAccentedColor(i) ? getAccentColor() : i; + } + public static void themeMonetToolbar(ImageButton imageButton, Toolbar toolbar) { imageButton.setImageTintList(ColorStateList.valueOf(getHeaderText())); toolbar.setElevation(0.0f); diff --git a/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/msg_list/MsgListVc.smali b/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/msg_list/MsgListVc.smali index a6371a6e6..fb3a0c6fb 100644 --- a/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/msg_list/MsgListVc.smali +++ b/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/msg_list/MsgListVc.smali @@ -1873,6 +1873,10 @@ if-eqz p1, :cond_2 + invoke-static {p1}, Lru/vtosters/lite/utils/ThemesUtils;->recolorDrawable(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; + + move-result-object p1 + .line 7 :goto_0 invoke-virtual {v0, p1}, Lcom/vk/im/ui/components/viewcontrollers/msg_list/SwipeToReplyItemTouchCallback;->a(Landroid/graphics/drawable/Drawable;)V diff --git a/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/msg_list/SwipeToReplyItemTouchCallback.smali b/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/msg_list/SwipeToReplyItemTouchCallback.smali index f5528f9e8..50f90ce1f 100644 --- a/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/msg_list/SwipeToReplyItemTouchCallback.smali +++ b/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/msg_list/SwipeToReplyItemTouchCallback.smali @@ -172,6 +172,10 @@ if-eqz p1, :cond_0 + invoke-static {p1}, Lru/vtosters/lite/utils/ThemesUtils;->recolorDrawable(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; + + move-result-object p1 + iput-object p1, p0, Lcom/vk/im/ui/components/viewcontrollers/msg_list/SwipeToReplyItemTouchCallback;->l:Landroid/graphics/drawable/Drawable; return-void From c9cfc5e749406010a5480d8d80d824101ce7e011 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sun, 27 Nov 2022 00:36:39 +0300 Subject: [PATCH 19/95] updated msg recoloring --- .../java/ru/vtosters/lite/utils/ThemesUtils.java | 15 +++++++++++++++ .../vk/im/ui/drawables/MsgStatusDrawable.smali | 4 ++++ .../com/vk/im/ui/views/ScrollToBottomView.smali | 2 ++ .../vk/newsfeed/j0/FreshNewsButtonHelper$a.smali | 1 + 4 files changed, 22 insertions(+) diff --git a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java index 62bb94c32..fdd15bc92 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; +import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.Log; @@ -11,6 +12,8 @@ import android.view.View; import android.view.Window; import android.webkit.WebView; import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.TextView; import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.Toolbar; import androidx.core.graphics.ColorUtils; @@ -197,11 +200,23 @@ public class ThemesUtils { toolbar.setElevation(0.0f); } + public static void setImageViewColored(ImageView view){ + view.setColorFilter(ThemesUtils.getAccentColor(), PorterDuff.Mode.MULTIPLY); + } + public static Drawable recolorDrawable(Drawable drawable) { if (drawable == null) return null; return new RecoloredDrawable(drawable, getAccentColor()); } // Recolor drawable to accent color + public static void recolorTextView(TextView tw) { + tw.getBackground().setColorFilter(ThemesUtils.getAccentColor(), PorterDuff.Mode.SRC_OVER); + } + + public static void recolorBGView(View view) { + view.getBackground().setColorFilter(ThemesUtils.getAccentColor(), PorterDuff.Mode.SRC_OVER); + } + public static Drawable recolorVKIconMenu(Drawable drawable) { int accent = getHeaderText(); diff --git a/smali/smali_classes3/com/vk/im/ui/drawables/MsgStatusDrawable.smali b/smali/smali_classes3/com/vk/im/ui/drawables/MsgStatusDrawable.smali index 9ac6630cb..1bcfee6a6 100644 --- a/smali/smali_classes3/com/vk/im/ui/drawables/MsgStatusDrawable.smali +++ b/smali/smali_classes3/com/vk/im/ui/drawables/MsgStatusDrawable.smali @@ -92,6 +92,10 @@ move-result-object v0 + invoke-static {v0}, Lru/vtosters/lite/utils/ThemesUtils;->recolorDrawable(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; + + move-result-object v0 + invoke-virtual {v0}, Landroid/graphics/drawable/Drawable;->mutate()Landroid/graphics/drawable/Drawable; move-result-object v0 diff --git a/smali/smali_classes3/com/vk/im/ui/views/ScrollToBottomView.smali b/smali/smali_classes3/com/vk/im/ui/views/ScrollToBottomView.smali index 6c026c7c7..d6be5d1e3 100644 --- a/smali/smali_classes3/com/vk/im/ui/views/ScrollToBottomView.smali +++ b/smali/smali_classes3/com/vk/im/ui/views/ScrollToBottomView.smali @@ -321,6 +321,8 @@ invoke-virtual {v0, v1}, Landroid/widget/TextView;->setBackground(Landroid/graphics/drawable/Drawable;)V + invoke-static {v0}, Lru/vtosters/lite/utils/ThemesUtils;->recolorTextView(Landroid/widget/TextView;)V + .line 6 sget v1, Lcom/vk/im/ui/o;->ScrollToBottomView_vkim_stb_counter_fontFamily:I diff --git a/smali/smali_classes3/com/vk/newsfeed/j0/FreshNewsButtonHelper$a.smali b/smali/smali_classes3/com/vk/newsfeed/j0/FreshNewsButtonHelper$a.smali index 02c3af5cf..980b6929f 100644 --- a/smali/smali_classes3/com/vk/newsfeed/j0/FreshNewsButtonHelper$a.smali +++ b/smali/smali_classes3/com/vk/newsfeed/j0/FreshNewsButtonHelper$a.smali @@ -65,6 +65,7 @@ invoke-virtual {v0, v1}, Landroid/view/View;->setVisibility(I)V + const/4 v1, 0x0 const v2, 0x1020019 From 7b35501461ddde63dde958776f19b046bdddb135 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sun, 27 Nov 2022 02:13:40 +0300 Subject: [PATCH 20/95] coloring playlists icons --- .../modern/holders/buttons/MusicPlaylistButtonsHolder.smali | 6 ++++++ .../com/vk/music/view/MusicActionButton.smali | 4 ++++ .../smali_classes5/com/vtosters/lite/ui/BadooTextView.smali | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/smali/smali_classes3/com/vk/music/playlist/modern/holders/buttons/MusicPlaylistButtonsHolder.smali b/smali/smali_classes3/com/vk/music/playlist/modern/holders/buttons/MusicPlaylistButtonsHolder.smali index 30bf5c07a..2689dec49 100644 --- a/smali/smali_classes3/com/vk/music/playlist/modern/holders/buttons/MusicPlaylistButtonsHolder.smali +++ b/smali/smali_classes3/com/vk/music/playlist/modern/holders/buttons/MusicPlaylistButtonsHolder.smali @@ -178,6 +178,8 @@ invoke-virtual {p1, p4}, Landroid/widget/ImageView;->setImageTintList(Landroid/content/res/ColorStateList;)V + invoke-static {p1}, Lru/vtosters/lite/utils/ThemesUtils;->setImageViewColored(Landroid/widget/ImageView;)V + .line 16 iget-object p4, p0, Lcom/vk/music/playlist/modern/holders/buttons/MusicPlaylistButtonsHolder;->d:Lcom/vk/music/view/MusicActionButton; @@ -287,6 +289,8 @@ .line 26 invoke-virtual {p1, p3}, Landroid/widget/ImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V + invoke-static {p1}, Lru/vtosters/lite/utils/ThemesUtils;->setImageViewColored(Landroid/widget/ImageView;)V + .line 27 iget-object p3, p0, Lcom/vk/music/playlist/modern/holders/buttons/MusicPlaylistButtonsHolder;->f:Landroid/widget/ImageView; @@ -303,6 +307,8 @@ .line 28 iput-object p1, p0, Lcom/vk/music/playlist/modern/holders/buttons/MusicPlaylistButtonsHolder;->D:Landroid/widget/ImageView; + invoke-static {p1}, Lru/vtosters/lite/utils/ThemesUtils;->setImageViewColored(Landroid/widget/ImageView;)V + .line 29 iget-object v0, p0, Landroidx/recyclerview/widget/RecyclerView$ViewHolder;->itemView:Landroid/view/View; diff --git a/smali/smali_classes3/com/vk/music/view/MusicActionButton.smali b/smali/smali_classes3/com/vk/music/view/MusicActionButton.smali index 898d30b8d..3240d4a75 100644 --- a/smali/smali_classes3/com/vk/music/view/MusicActionButton.smali +++ b/smali/smali_classes3/com/vk/music/view/MusicActionButton.smali @@ -345,6 +345,10 @@ .method public final setIcon(Landroid/graphics/drawable/Drawable;)V .locals 2 + invoke-static {p1}, Lru/vtosters/lite/utils/ThemesUtils;->recolorDrawable(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; + + move-result-object p1 + .line 2 iget-object v0, p0, Lcom/vk/music/view/MusicActionButton;->c:Landroid/content/res/ColorStateList; diff --git a/smali/smali_classes5/com/vtosters/lite/ui/BadooTextView.smali b/smali/smali_classes5/com/vtosters/lite/ui/BadooTextView.smali index 7edb4c4ef..6b7be30a8 100644 --- a/smali/smali_classes5/com/vtosters/lite/ui/BadooTextView.smali +++ b/smali/smali_classes5/com/vtosters/lite/ui/BadooTextView.smali @@ -115,6 +115,10 @@ sget-object v4, Landroid/graphics/PorterDuff$Mode;->SRC_IN:Landroid/graphics/PorterDuff$Mode; + invoke-static {v1}, Lru/vtosters/lite/themes/utils/RecolorUtils;->recolorHexColor(I)I + + move-result v1 + invoke-virtual {v3, v1, v4}, Landroid/graphics/drawable/Drawable;->setColorFilter(ILandroid/graphics/PorterDuff$Mode;)V :cond_1 From 80e78fa2c16158389afd5b38973706e6735e0ed5 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sun, 27 Nov 2022 02:34:22 +0300 Subject: [PATCH 21/95] some music coloring --- smali/smali_classes2/com/vk/core/extensions/TextViewExt.smali | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/smali/smali_classes2/com/vk/core/extensions/TextViewExt.smali b/smali/smali_classes2/com/vk/core/extensions/TextViewExt.smali index 8626c1100..08d43945b 100644 --- a/smali/smali_classes2/com/vk/core/extensions/TextViewExt.smali +++ b/smali/smali_classes2/com/vk/core/extensions/TextViewExt.smali @@ -496,6 +496,10 @@ move-result-object p1 + invoke-static {p1}, Lru/vtosters/lite/utils/ThemesUtils;->recolorDrawable(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; + + move-result-object p1 + invoke-static {p0, p1}, Lcom/vk/core/extensions/TextViewExt;->b(Landroid/widget/TextView;Landroid/graphics/drawable/Drawable;)V return-void From e8a2c3af56f1c6eae0853f1548d708c03fcc68f0 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Sun, 27 Nov 2022 15:20:27 +0300 Subject: [PATCH 22/95] ssfs update --- app/src/main/java/ru/vtosters/lite/utils/SSFSUtils.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/ru/vtosters/lite/utils/SSFSUtils.java b/app/src/main/java/ru/vtosters/lite/utils/SSFSUtils.java index 8419217d3..3626712d8 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/SSFSUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/SSFSUtils.java @@ -1,5 +1,7 @@ package ru.vtosters.lite.utils; +import com.vk.core.network.Network; + import static ru.vtosters.lite.hooks.DateHook.getLocale; import static ru.vtosters.lite.proxy.ProxyUtils.isAnyProxyEnabled; import static ru.vtosters.lite.utils.About.getBuildNumber; @@ -19,6 +21,7 @@ public class SSFSUtils { "&lang=" + getLocale() + "&vt=1&vksans=" + isVKSansEnabled() + "&vt_version=" + getBuildNumber() + + "&useragent=" + Base64Utils.encode(Network.l.c().a()) + "&vt_debug=" + isDEVModEnabled(); } @@ -27,7 +30,7 @@ public class SSFSUtils { if (!string.isEmpty()) return string; - return "https://vtsf.vknext.net"; + return "https://ssfs.vtosters.app"; } public static String getDarkVKUI() { From ceb84ed6f6fe8543f21ef0ff50097acba308626c Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Mon, 28 Nov 2022 11:51:47 +0300 Subject: [PATCH 23/95] reply bar fix --- smali/smali_classes3/com/vk/im/ui/views/ReplyView$a.smali | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/smali/smali_classes3/com/vk/im/ui/views/ReplyView$a.smali b/smali/smali_classes3/com/vk/im/ui/views/ReplyView$a.smali index 0d4822992..673cdc693 100644 --- a/smali/smali_classes3/com/vk/im/ui/views/ReplyView$a.smali +++ b/smali/smali_classes3/com/vk/im/ui/views/ReplyView$a.smali @@ -56,6 +56,10 @@ .line 1 iget-object v0, p0, Lcom/vk/im/ui/views/ReplyView$a;->a:Landroid/graphics/Paint; + invoke-static {p1}, Lru/vtosters/lite/themes/utils/RecolorUtils;->recolorHexColor(I)I + + move-result p1 + invoke-virtual {v0, p1}, Landroid/graphics/Paint;->setColor(I)V invoke-virtual {p0}, Landroid/graphics/drawable/Drawable;->invalidateSelf()V From 76260981c569854b9f7c9f5779b17e9b75e412a5 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Mon, 28 Nov 2022 12:01:29 +0300 Subject: [PATCH 24/95] disabled useless hide button --- .../components/viewcontrollers/dialog_bar/DialogBarVc.smali | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/dialog_bar/DialogBarVc.smali b/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/dialog_bar/DialogBarVc.smali index 205cd8355..d511b3eeb 100644 --- a/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/dialog_bar/DialogBarVc.smali +++ b/smali/smali_classes3/com/vk/im/ui/components/viewcontrollers/dialog_bar/DialogBarVc.smali @@ -218,6 +218,10 @@ iput-object p1, p0, Lcom/vk/im/ui/components/viewcontrollers/dialog_bar/DialogBarVc;->g:Landroid/view/View; + const/16 p2, 0x8 + + invoke-virtual {p1, p2}, Landroid/view/View;->setVisibility(I)V + .line 9 iget-object p1, p0, Lcom/vk/im/ui/components/viewcontrollers/dialog_bar/DialogBarVc;->b:Landroid/view/View; From 5f5fb650f2801ba29dd8ff13f5a501a5825f7333 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Mon, 28 Nov 2022 12:06:05 +0300 Subject: [PATCH 25/95] fixed volume control color --- .../com/vk/stories/view/VolumeControlView.smali | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/smali/smali_classes4/com/vk/stories/view/VolumeControlView.smali b/smali/smali_classes4/com/vk/stories/view/VolumeControlView.smali index 4e6e43d52..ce61b38f3 100644 --- a/smali/smali_classes4/com/vk/stories/view/VolumeControlView.smali +++ b/smali/smali_classes4/com/vk/stories/view/VolumeControlView.smali @@ -170,7 +170,9 @@ .line 6 iget-object v0, p0, Lcom/vk/stories/view/VolumeControlView;->c:Landroid/graphics/Paint; - const v1, -0xa96d29 + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I + + move-result v1 invoke-virtual {v0, v1}, Landroid/graphics/Paint;->setColor(I)V From b30ad26f54e4815a85f7f4331d193632b41af480 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Mon, 28 Nov 2022 12:23:26 +0300 Subject: [PATCH 26/95] fixed vk cringe bg color in volume control --- .../com/vk/stories/view/VolumeControlView.smali | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/smali/smali_classes4/com/vk/stories/view/VolumeControlView.smali b/smali/smali_classes4/com/vk/stories/view/VolumeControlView.smali index ce61b38f3..8088bb25e 100644 --- a/smali/smali_classes4/com/vk/stories/view/VolumeControlView.smali +++ b/smali/smali_classes4/com/vk/stories/view/VolumeControlView.smali @@ -128,7 +128,9 @@ .method private a()V .locals 2 - const/4 v0, -0x1 + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getBackgroundContent()I + + move-result v0 .line 1 invoke-virtual {p0, v0}, Landroid/view/View;->setBackgroundColor(I)V From d718851d0c253c293a8f18b02bd255886d3b46bc Mon Sep 17 00:00:00 2001 From: Vologhat Date: Tue, 29 Nov 2022 16:00:31 +0300 Subject: [PATCH 27/95] fix accent color resetting --- .../java/ru/vtosters/lite/ui/fragments/AccentsFragment.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java index 38c0c9a67..51fbc7547 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java @@ -3,6 +3,7 @@ package ru.vtosters.lite.ui.fragments; import android.content.res.ColorStateList; import android.graphics.Color; import android.os.Bundle; +import android.text.TextUtils; import android.view.ViewGroup; import android.widget.LinearLayout; @@ -52,8 +53,8 @@ public class AccentsFragment extends MaterialPreferenceToolbarFragment { builder.setView(linearLayout); builder.setPositiveButton("OK", (dialog, which) -> { String color = editText.getText().toString(); - if (color.equals("")) { - AndroidUtils.edit().putInt("theme_accent", ColorReferences.stockAccent).apply(); + if (TextUtils.isEmpty(color)) { + AndroidUtils.edit().putInt("accent_color", ColorReferences.stockAccent).commit(); ToastUtils.a("Функция отключена."); ThemesCore.clear(); ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); From 38f65997a6239a265316c8d307b0fdcd087658f6 Mon Sep 17 00:00:00 2001 From: Vologhat Date: Tue, 29 Nov 2022 22:13:30 +0300 Subject: [PATCH 28/95] add input format for color string, and reset button --- .../lite/ui/fragments/AccentsFragment.java | 107 ++++++++++++------ .../ru/vtosters/lite/utils/ThemesUtils.java | 6 + 2 files changed, 81 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java index 51fbc7547..d7eabad05 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java @@ -3,7 +3,9 @@ package ru.vtosters.lite.ui.fragments; import android.content.res.ColorStateList; import android.graphics.Color; import android.os.Bundle; +import android.text.Editable; import android.text.TextUtils; +import android.text.TextWatcher; import android.view.ViewGroup; import android.widget.LinearLayout; @@ -11,11 +13,12 @@ import androidx.preference.Preference; import com.vk.core.dialogs.alert.VkAlertDialog; import com.vk.core.util.ToastUtils; -import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; - import com.vtosters.lite.R; +import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.ui.EditText; +import java.util.Collections; + import ru.vtosters.lite.themes.ColorReferences; import ru.vtosters.lite.themes.ThemesCore; import ru.vtosters.lite.ui.PreferencesUtil; @@ -23,6 +26,9 @@ import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.ThemesUtils; public class AccentsFragment extends MaterialPreferenceToolbarFragment { + private static final int MAX_COLOR_STR_LEN = 7; // without transparency + private static final String HEX = "0123456789abcdefABCDEF"; + @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); @@ -31,6 +37,7 @@ public class AccentsFragment extends MaterialPreferenceToolbarFragment { } private class AccentHexDialog implements Preference.OnPreferenceClickListener { + @Override public boolean onPreferenceClick(Preference preference) { LinearLayout linearLayout = new LinearLayout(requireContext()); @@ -47,41 +54,77 @@ public class AccentsFragment extends MaterialPreferenceToolbarFragment { margin.setMargins(AndroidUtils.dp2px(24f), 0, AndroidUtils.dp2px(24f), 0); editText.setLayoutParams(margin); - VkAlertDialog.Builder builder = new VkAlertDialog.Builder(requireContext()); - builder.setTitle("Акценты"); - builder.setMessage("Это изменит цвет иконки таббара, ссылки и.т.д.\nДанная функция еще в разработке, поэтому возможны недокрасы!\n\nЦвет указывается в формате #RRGGBB (#9600FF).\n\nЧтобы вернуть стандартный акцент ВК, оставьте это поле пустым."); - builder.setView(linearLayout); - builder.setPositiveButton("OK", (dialog, which) -> { - String color = editText.getText().toString(); - if (TextUtils.isEmpty(color)) { - AndroidUtils.edit().putInt("accent_color", ColorReferences.stockAccent).commit(); - ToastUtils.a("Функция отключена."); - ThemesCore.clear(); - ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); - return; - } - if (!color.startsWith("#")) { - ToastUtils.a("Цвет надо вводить в HEX-формате!"); - return; - } - if (color.length() != 7) { - ToastUtils.a("Неправильная длина цвета (прозрачность не поддерживается)"); - return; - } - try { - Color.parseColor(color); - } catch (Exception e) { - ToastUtils.a("Ошибка: неправильный формат цвета."); - return; + editText.addTextChangedListener(new TextWatcher() { + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } - AndroidUtils.edit().putInt("accent_color", Color.parseColor(color)).apply(); - ThemesCore.setThemedColors(Color.parseColor(color)); - ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + if (s.length() > MAX_COLOR_STR_LEN) + // check if data is fully color string + if (s.charAt(0) == '#' && s.charAt(1) == '#') + s.replace(0, 1, ""); + else + s.replace(MAX_COLOR_STR_LEN - 1, s.length() - 1, ""); + int i = s.charAt(0) == '#' ? 1 : 0; + // If the first distinct character is found, then there is no need to return to the start of the array + while (i >= 0 && i < s.length()) { + if (HEX.indexOf(s.charAt(i)) == -1) { + s.delete(i, i + 1); + } else i++; + } + } else s.append("#"); + } }); - builder.show(); + + new VkAlertDialog.Builder(requireContext()) + .setTitle("Акценты") + .setMessage("Это изменит цвет иконки таббара, ссылки и.т.д." + + "\nДанная функция еще в разработке, поэтому возможны недокрасы!" + + "\n\nЦвет указывается в формате #RRGGBB (#9600FF).") + .setView(linearLayout) + .setPositiveButton("OK", + (dialog, which) + -> changeAccentColor(editText.getText() + .toString() + .toUpperCase())) + .setNeutralButton("Сброс", ((dialog, which) -> resetAccentColor())) + .show(); return false; } } + void changeAccentColor(String colorStr) { + if (TextUtils.isEmpty(colorStr)) { + resetAccentColor(); + return; + } + // fix color string length + if (colorStr.length() < MAX_COLOR_STR_LEN) + colorStr += String.join("", Collections.nCopies(MAX_COLOR_STR_LEN - colorStr.length(), "0")); + int color; + try { + color = Color.parseColor(colorStr); + } catch (Exception e) { + ToastUtils.a("Ошибка: неправильный формат цвета."); + return; + } + + ThemesUtils.setCustomAccentColor(color, false); + ThemesCore.setThemedColors(color); + ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); + } + + void resetAccentColor() { + changeAccentColor("#3f8ae0"); + } } diff --git a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java index fdd15bc92..7c869f141 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -90,6 +90,12 @@ public class ThemesUtils { return AndroidUtils.getPreferences().getInt("accent_color", ColorReferences.stockAccent); } // Color accent + public static void setCustomAccentColor(int newColor, boolean async) { + var editor = AndroidUtils.edit().putInt("accent_color", newColor); + if (async) editor.apply(); + else editor.commit(); + } + public static int getTextAttr() { return getColorFromAttr(R.attr.text_primary); } // Text Primary color From 4b6a7aeb84dcc409a8db1b743c96ef754b8ad0ee Mon Sep 17 00:00:00 2001 From: Vologhat Date: Tue, 29 Nov 2022 23:16:36 +0300 Subject: [PATCH 29/95] invalidate color state of dockbar tab titles --- .../lite/ui/bottomnavigation/BottomNavigationItemView.java | 7 ++++--- .../main/java/ru/vtosters/lite/hooks/DockBarInjector.java | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/vtosters/lite/ui/bottomnavigation/BottomNavigationItemView.java b/app/src/main/java/com/vtosters/lite/ui/bottomnavigation/BottomNavigationItemView.java index 4cbde195e..59ee7f61b 100644 --- a/app/src/main/java/com/vtosters/lite/ui/bottomnavigation/BottomNavigationItemView.java +++ b/app/src/main/java/com/vtosters/lite/ui/bottomnavigation/BottomNavigationItemView.java @@ -71,12 +71,11 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It this.mIcon.getLayoutParams().width = V.a(28.0F); this.mIcon.getLayoutParams().height = V.a(28.0F); - var colorStateList = getCSTDock(); this.mSmallLabel = this.findViewById(R.id.smallLabel); - mSmallLabel.setTextColor(colorStateList); + mSmallLabel.setTextColor(getCSTDock()); this.mLargeLabel = this.findViewById(R.id.largeLabel); - mLargeLabel.setTextColor(colorStateList); + mLargeLabel.setTextColor(getCSTDock()); LayoutInflater.from(this.getContext()).inflate(R.layout.navigation_bottom_counter, this, true); this.mCounterContainer = this.findViewById(R.id.counter_container); @@ -326,6 +325,8 @@ public class BottomNavigationItemView extends FrameLayout implements MenuView.It } public void setTextColor(ColorStateList colorStateList) { + this.mSmallLabel.setTextColor(colorStateList); + this.mLargeLabel.setTextColor(colorStateList); } @SuppressLint("RestrictedApi") diff --git a/app/src/main/java/ru/vtosters/lite/hooks/DockBarInjector.java b/app/src/main/java/ru/vtosters/lite/hooks/DockBarInjector.java index b1614f61b..a004f91db 100644 --- a/app/src/main/java/ru/vtosters/lite/hooks/DockBarInjector.java +++ b/app/src/main/java/ru/vtosters/lite/hooks/DockBarInjector.java @@ -102,6 +102,7 @@ public class DockBarInjector { item.setStaticMode(true); item.setIconsMode(false); item.setShiftingMode(false); + item.setTextColor(getCSTDock()); } } } From 63c3c0ee3237ead4659317e9ee543feac29ba0d8 Mon Sep 17 00:00:00 2001 From: Vologhat Date: Wed, 30 Nov 2022 00:25:52 +0300 Subject: [PATCH 30/95] refactoring --- .../lite/ui/fragments/AccentsFragment.java | 118 +++++++++--------- 1 file changed, 60 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java index d7eabad05..29645c1d0 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java @@ -19,7 +19,6 @@ import com.vtosters.lite.ui.EditText; import java.util.Collections; -import ru.vtosters.lite.themes.ColorReferences; import ru.vtosters.lite.themes.ThemesCore; import ru.vtosters.lite.ui.PreferencesUtil; import ru.vtosters.lite.utils.AndroidUtils; @@ -33,74 +32,77 @@ public class AccentsFragment extends MaterialPreferenceToolbarFragment { public void onCreate(Bundle bundle) { super.onCreate(bundle); addPreferencesFromResource(R.xml.empty); - PreferencesUtil.addPreference(this, "Выбор акцента через HEX", "", 0, new AccentHexDialog()); + + final var colorPickerPreference = new Preference(requireContext()); + colorPickerPreference.setTitle("Выбор акцента через HEX"); + colorPickerPreference.setIcon(R.drawable.bg_accent_circle); + colorPickerPreference.setOnPreferenceClickListener(preference -> { + showEditAccentColorDialog(); + return false; + }); + getPreferenceScreen().addPreference(colorPickerPreference); } - private class AccentHexDialog implements Preference.OnPreferenceClickListener { + void showEditAccentColorDialog() { + LinearLayout linearLayout = new LinearLayout(requireContext()); - @Override - public boolean onPreferenceClick(Preference preference) { - LinearLayout linearLayout = new LinearLayout(requireContext()); + final EditText editText = new EditText(requireContext()); + editText.setHint("Акцент"); + editText.setText(ThemesUtils.hex(ThemesUtils.getAccentColor())); + editText.setHintTextColor(PreferencesUtil.getSTextColor(requireActivity())); + editText.setBackgroundTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); - final EditText editText = new EditText(requireContext()); - editText.setHint("Акцент"); - editText.setText(ThemesUtils.hex(AndroidUtils.getPreferences().getInt("accent_color", ColorReferences.stockAccent))); - editText.setHintTextColor(PreferencesUtil.getSTextColor(requireActivity())); - editText.setBackgroundTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); + linearLayout.addView(editText); + editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; + ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams()); + margin.setMargins(AndroidUtils.dp2px(24f), 0, AndroidUtils.dp2px(24f), 0); + editText.setLayoutParams(margin); - linearLayout.addView(editText); - editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; - ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams()); - margin.setMargins(AndroidUtils.dp2px(24f), 0, AndroidUtils.dp2px(24f), 0); - editText.setLayoutParams(margin); + editText.addTextChangedListener(new TextWatcher() { - editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } - } + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { + } - } + @Override + public void afterTextChanged(Editable s) { + if (!TextUtils.isEmpty(s)) { + if (s.length() > MAX_COLOR_STR_LEN) + // check if data is fully color string + if (s.charAt(0) == '#' && s.charAt(1) == '#') + s.replace(0, 1, ""); + else + s.replace(MAX_COLOR_STR_LEN - 1, s.length() - 1, ""); + int i = s.charAt(0) == '#' ? 1 : 0; + // If the first distinct character is found, then there is no need to return to the start of the array + while (i >= 0 && i < s.length()) { + if (HEX.indexOf(s.charAt(i)) == -1) { + s.delete(i, i + 1); + } else i++; + } + } else s.append("#"); + } + }); - @Override - public void afterTextChanged(Editable s) { - if (!TextUtils.isEmpty(s)) { - if (s.length() > MAX_COLOR_STR_LEN) - // check if data is fully color string - if (s.charAt(0) == '#' && s.charAt(1) == '#') - s.replace(0, 1, ""); - else - s.replace(MAX_COLOR_STR_LEN - 1, s.length() - 1, ""); - int i = s.charAt(0) == '#' ? 1 : 0; - // If the first distinct character is found, then there is no need to return to the start of the array - while (i >= 0 && i < s.length()) { - if (HEX.indexOf(s.charAt(i)) == -1) { - s.delete(i, i + 1); - } else i++; - } - } else s.append("#"); - } - }); - - new VkAlertDialog.Builder(requireContext()) - .setTitle("Акценты") - .setMessage("Это изменит цвет иконки таббара, ссылки и.т.д." + - "\nДанная функция еще в разработке, поэтому возможны недокрасы!" + - "\n\nЦвет указывается в формате #RRGGBB (#9600FF).") - .setView(linearLayout) - .setPositiveButton("OK", - (dialog, which) - -> changeAccentColor(editText.getText() - .toString() - .toUpperCase())) - .setNeutralButton("Сброс", ((dialog, which) -> resetAccentColor())) - .show(); - return false; - } + new VkAlertDialog.Builder(requireContext()) + .setTitle("Акценты") + .setMessage("Это изменит цвет иконки таббара, ссылки и.т.д." + + "\nДанная функция еще в разработке, поэтому возможны недокрасы!" + + "\n\nЦвет указывается в формате #RRGGBB (#9600FF).") + .setView(linearLayout) + .setPositiveButton("OK", + (dialog, which) + -> changeAccentColor(editText.getText() + .toString() + .toUpperCase())) + .setNeutralButton("Сброс", (dialog, which) -> resetAccentColor()) + .show(); } void changeAccentColor(String colorStr) { From 1b797325f03f729101b04b6973b493d9f34c1a9d Mon Sep 17 00:00:00 2001 From: Vologhat Date: Wed, 30 Nov 2022 11:49:02 +0300 Subject: [PATCH 31/95] Update MessagesPreviewAdapter.java --- .../ui/adapters/MessagesPreviewAdapter.java | 58 +++++++++---------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/adapters/MessagesPreviewAdapter.java b/app/src/main/java/ru/vtosters/lite/ui/adapters/MessagesPreviewAdapter.java index 8431b108d..d6ccd751e 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/adapters/MessagesPreviewAdapter.java +++ b/app/src/main/java/ru/vtosters/lite/ui/adapters/MessagesPreviewAdapter.java @@ -1,39 +1,29 @@ package ru.vtosters.lite.ui.adapters; -import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr; - import android.content.Context; -import android.util.TypedValue; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.vk.core.widget.BubbleFluidLayout; +import com.vk.im.ui.components.viewcontrollers.msg_list.entry.MsgTextBuilder; +import com.vk.im.ui.views.msg.MsgPartTextView; import com.vk.im.ui.views.msg.bubble.MsgBubbleView; import com.vtosters.lite.R; import ru.vtosters.lite.utils.AndroidUtils; public class MessagesPreviewAdapter extends RecyclerView.Adapter { - private static final int ME = 0x0; - private static final int ANONYMOUS = -0x1; - private final String[] mMessages = AndroidUtils.getArray(R.array.wallpaper_change_dialog); - - private static int getColorFromAttribute(Context context, int attrId) { - TypedValue typedValue = new TypedValue(); - context.getTheme().resolveAttribute(attrId, typedValue, true); - return typedValue.data; - } + private static final String[] MESSAGES = AndroidUtils.getArray(R.array.wallpaper_change_dialog); @Override public int getItemViewType(int i) { - return i % 2 == 0 ? ANONYMOUS : ME; + return i % 2 == 0 ? Gravity.START : Gravity.END; } @NonNull @@ -41,7 +31,12 @@ public class MessagesPreviewAdapter extends RecyclerView.Adapter Date: Thu, 1 Dec 2022 20:34:48 +0300 Subject: [PATCH 32/95] updated color hooks --- .../vtosters/lite/themes/ColorReferences.java | 10 +- .../ru/vtosters/lite/utils/ThemesUtils.java | 115 ++++++++++-------- .../appcompat/app/AppCompatDelegateImpl.smali | 2 +- .../appcompat/widget/ResourcesWrapper.smali | 4 +- .../androidx/cardview/widget/CardView.smali | 4 +- .../widget/RoundRectDrawableWithShadow.smali | 4 +- .../core/content/res/ResourcesCompat.smali | 18 +-- .../datetimepicker/date/SimpleMonthView.smali | 4 +- .../date/TextViewWithCircularIndicator.smali | 4 +- .../datetimepicker/time/AmPmCirclesView.smali | 4 +- .../time/RadialSelectorView.smali | 4 +- .../time/RadialTimePickerDialog.smali | 4 +- .../com/vk/articles/ArticleFragment.smali | 4 +- .../VerifyInfoHelper$colorLightBlue$2.smali | 2 +- .../w/DefaultMentionSpanProvider.smali | 2 +- .../fragments/SuggestionsFragment.smali | 2 +- .../lite/ui/widget/WaveRecordCircleView.smali | 2 +- 17 files changed, 85 insertions(+), 104 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java index c3568d2e0..a917c197e 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java @@ -2,6 +2,7 @@ package ru.vtosters.lite.themes; import android.content.res.ColorStateList; import android.graphics.Color; +import ru.vtosters.lite.utils.ThemesUtils; import java.util.Arrays; import java.util.List; @@ -25,14 +26,7 @@ public class ColorReferences { } public static boolean isColorRefAccented(int target) { - return target == com.vtosters.lite.R.color.accent_blue || // accent_blue - target == com.vtosters.lite.R.color.blue_gray || // light_blue_gray - target == com.vtosters.lite.R.color.azure_300 || - target == com.vtosters.lite.R.color.light_blue_old || // light_blue - target == com.vtosters.lite.R.color.blue_200 || // blue_200 - target == com.vtosters.lite.R.color.vk_blue_400 || // blue_200 - target == com.vtosters.lite.R.color.header_blue || - target == com.vtosters.lite.R.color.blue_200_muted; // blue_200_muted + return ThemesUtils.isColorRefAccented(target); } public static boolean isCslNeedToBeThemed(ColorStateList csl) { diff --git a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java index 7c869f141..71f0adac0 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -124,36 +124,10 @@ public class ThemesUtils { return getColorFromAttr(R.attr.header_text); } // Header/Toolbar color text - public static int getAmoledTheme() { - return getIdentifier("BaseAmoledStyle", "style"); - } // Get Amoled theme id - - public static int picFix() { - return getIdentifier("ActionBarThemeFix", "style"); - } // Fix tabbar color in photo viewer - - public static int getAmoledImTheme() { - return getIdentifier("VkIm.Theme.VkApp.Amoled", "style"); - } // Get Amoled theme id for messages - - public static int getAmoledMeTheme() { - return getIdentifier("VkIm.Theme.VkMe.Amoled", "style"); - } // Get Amoled theme id for messages with rounded msg - public static int getAttrId(String attr) { return getIdentifier(attr, "attr"); } - public static void setBarTheme(View getview) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - getview.setSystemUiVisibility(getNeededColorNavbar() | getNeededColorStatusbar()); - } - } // Set white/dark statusbar/navbar icons - - public static int getNeededColorStatusbar() { - return !isDarkTheme() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? 8192 : 0; - } - public static int getNeededColorNavbar() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? isDarkTheme() ? SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR : 0 : 0; } @@ -191,21 +165,74 @@ public class ThemesUtils { } public static boolean isColorRefAccented(int color) { - for (int accent : new int[]{R.color.accent_blue, R.color.azure_A400, R.color.blue, R.color.blue_200, R.color.blue_200_muted, R.color.blue_300, R.color.blue_400, R.color.cool_blue, R.color.cornflower_blue, R.color.cornflower_blue_two, R.color.dot_unread, R.color.fave_promo_btn_pressed, R.color.header_blue, R.color.vkim_ripple_dark, R.color.colorAccent, R.color.light_blue, R.color.light_blue_gray, R.color.live_emoji_butt_hide, R.color.music_action_button_blue, R.color.name, R.color.picker_blue, R.color.picker_blue_pressed, R.color.picker_tab_bg_selected, R.color.picker_tab_text_selected, R.color.sharing_blue_btn_normal, R.color.sharing_blue_btn_pressed, R.color.sky_300, R.color.text_blue, R.color.tip_background, R.color.tw__blue_default, R.color.tw__blue_pressed, R.color.vkim_msg_sending_ic, R.color.vkim_playing_drawable_rect, R.color.white_blue32}) { - if (color == accent) return true; - } - return false; + return color == R.color.viewer_retry_button_text_color || + color == R.color.azure_300 || + color == R.color.light_blue_old || + color == R.color.picker_camera_button || + color == R.color.music_check_button_bg_pressed || + color == R.color.notification_color || + color == R.color.music_text_counter || + color == R.color.music_follow_button_bg_pressed || + color == R.color.music_blue_button_normal || + color == R.color.music_check_button_bg_normal || + color == R.color.vk_terms_link || + color == R.color.vk_blue_200_muted || + color == R.color.vk_blue_200 || + color == R.color.accent_blue || + color == R.color.azure_A400 || + color == R.color.vk_azure_A400 || + color == R.color.blue || + color == R.color.blue_200 || + color == R.color.blue_200_muted || + color == R.color.vk_blue_300 || + color == R.color.vk_blue_400 || + color == R.color.blue_300 || + color == R.color.blue_400 || + color == R.color.cool_blue || + color == R.color.cornflower_blue || + color == R.color.cornflower_blue_two || + color == R.color.dot_unread || + color == R.color.fave_promo_btn_pressed || + color == R.color.header_blue || + color == R.color.colorAccent || + color == R.color.blue_gray || + color == R.color.light_blue || + color == R.color.light_blue_gray || + color == R.color.live_emoji_butt_hide || + color == R.color.music_action_button_blue || + color == R.color.name || + color == R.color.picker_blue || + color == R.color.picker_blue_pressed || + color == R.color.picker_tab_bg_selected || + color == R.color.picker_tab_text_selected || + color == R.color.sharing_blue_btn_normal || + color == R.color.sharing_blue_btn_pressed || + color == R.color.vk_sky_300 || + color == R.color.vk_blue_A400 || + color == R.color.blue_A400 || + color == R.color.sky_300 || + color == R.color.muted_blue || + color == R.color.muted_blue_old || + color == R.color.text_blue || + color == R.color.tip_background || + color == R.color.tw__blue_default || + color == R.color.tw__blue_pressed || + color == R.color.vkim_msg_sending_ic || + color == R.color.vkim_playing_drawable_rect || + color == R.color.vk_white_blue32 || + color == R.color.date_picker_selector || + color == R.color.post_suggest_blue || + color == R.color.list_dialog_blue || + color == R.color.music_tab_bg_normal || + color == R.color.toolbar_blue_background || + color == R.color.toolbar_blue_statusBarColorBack || + color == R.color.white_blue32; } // Accent colors public static int replaceColor(int i){ return ColorReferences.isAccentedColor(i) ? getAccentColor() : i; } - public static void themeMonetToolbar(ImageButton imageButton, Toolbar toolbar) { - imageButton.setImageTintList(ColorStateList.valueOf(getHeaderText())); - toolbar.setElevation(0.0f); - } - public static void setImageViewColored(ImageView view){ view.setColorFilter(ThemesUtils.getAccentColor(), PorterDuff.Mode.MULTIPLY); } @@ -223,17 +250,6 @@ public class ThemesUtils { view.getBackground().setColorFilter(ThemesUtils.getAccentColor(), PorterDuff.Mode.SRC_OVER); } - public static Drawable recolorVKIconMenu(Drawable drawable) { - int accent = getHeaderText(); - - if (drawable == null) return null; - - if (isAndroidMonet() || isDarkTheme()) accent = getAccentColor(); - - return new RecoloredDrawable(drawable, accent); - } // Recolor vk icon to accent color - - public static int darken(int color, float by) { float[] hsl = new float[3]; ColorUtils.colorToHSL(color, hsl); @@ -260,9 +276,8 @@ public class ThemesUtils { return ColorUtils.setAlphaComponent(src, 169); } - public static int getColor(Context context, int i) { - if (isColorRefAccented(i) && isAndroidMonet()) { + if (isColorRefAccented(i)) { return getAccentColor(); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { @@ -272,8 +287,8 @@ public class ThemesUtils { } } // Android Support color injector + accent color checker - public static int getColor2(int i) { - if (isColorRefAccented(i) && isAndroidMonet()) { + public static int getColor(int i) { + if (isColorRefAccented(i)) { return getAccentColor(); } return getResources().getColor(i); diff --git a/smali/smali/androidx/appcompat/app/AppCompatDelegateImpl.smali b/smali/smali/androidx/appcompat/app/AppCompatDelegateImpl.smali index 835787efd..21190f970 100644 --- a/smali/smali/androidx/appcompat/app/AppCompatDelegateImpl.smali +++ b/smali/smali/androidx/appcompat/app/AppCompatDelegateImpl.smali @@ -5723,7 +5723,7 @@ sget v5, Landroidx/appcompat/R$color;->abc_input_method_navigation_guard:I .line 19 - invoke-virtual {v4, v5}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {v5}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result v4 diff --git a/smali/smali/androidx/appcompat/widget/ResourcesWrapper.smali b/smali/smali/androidx/appcompat/widget/ResourcesWrapper.smali index 99d4a4c39..5e342888d 100644 --- a/smali/smali/androidx/appcompat/widget/ResourcesWrapper.smali +++ b/smali/smali/androidx/appcompat/widget/ResourcesWrapper.smali @@ -79,9 +79,7 @@ .end annotation .line 1 - iget-object v0, p0, Landroidx/appcompat/widget/ResourcesWrapper;->mResources:Landroid/content/res/Resources; - - invoke-virtual {v0, p1}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {p1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result p1 diff --git a/smali/smali/androidx/cardview/widget/CardView.smali b/smali/smali/androidx/cardview/widget/CardView.smali index 5fefa8686..6b79426f9 100644 --- a/smali/smali/androidx/cardview/widget/CardView.smali +++ b/smali/smali/androidx/cardview/widget/CardView.smali @@ -235,7 +235,7 @@ sget v1, Landroidx/cardview/R$color;->cardview_light_background:I - invoke-virtual {p3, v1}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {v1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result p3 @@ -249,7 +249,7 @@ sget v1, Landroidx/cardview/R$color;->cardview_dark_background:I - invoke-virtual {p3, v1}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {v1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result p3 diff --git a/smali/smali/androidx/cardview/widget/RoundRectDrawableWithShadow.smali b/smali/smali/androidx/cardview/widget/RoundRectDrawableWithShadow.smali index ff323b3aa..c811f8280 100644 --- a/smali/smali/androidx/cardview/widget/RoundRectDrawableWithShadow.smali +++ b/smali/smali/androidx/cardview/widget/RoundRectDrawableWithShadow.smali @@ -95,7 +95,7 @@ .line 5 sget v1, Landroidx/cardview/R$color;->cardview_shadow_start_color:I - invoke-virtual {p1, v1}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {v1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result v1 @@ -104,7 +104,7 @@ .line 6 sget v1, Landroidx/cardview/R$color;->cardview_shadow_end_color:I - invoke-virtual {p1, v1}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {v1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result v1 diff --git a/smali/smali/androidx/core/content/res/ResourcesCompat.smali b/smali/smali/androidx/core/content/res/ResourcesCompat.smali index 3dca18323..19ce40c10 100644 --- a/smali/smali/androidx/core/content/res/ResourcesCompat.smali +++ b/smali/smali/androidx/core/content/res/ResourcesCompat.smali @@ -48,23 +48,7 @@ } .end annotation - .line 1 - sget v0, Landroid/os/Build$VERSION;->SDK_INT:I - - const/16 v1, 0x17 - - if-lt v0, v1, :cond_0 - - .line 2 - invoke-virtual {p0, p1, p2}, Landroid/content/res/Resources;->getColor(ILandroid/content/res/Resources$Theme;)I - - move-result p0 - - return p0 - - .line 3 - :cond_0 - invoke-virtual {p0, p1}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {p1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result p0 diff --git a/smali/smali/com/fourmob/datetimepicker/date/SimpleMonthView.smali b/smali/smali/com/fourmob/datetimepicker/date/SimpleMonthView.smali index 1d09d12c7..d42eba2a0 100644 --- a/smali/smali/com/fourmob/datetimepicker/date/SimpleMonthView.smali +++ b/smali/smali/com/fourmob/datetimepicker/date/SimpleMonthView.smali @@ -203,9 +203,7 @@ iput v0, p0, Lcom/fourmob/datetimepicker/date/SimpleMonthView;->e:I .line 20 - sget v0, Lcom/fourmob/datetimepicker/a;->blue:I - - invoke-virtual {p1, v0}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali/com/fourmob/datetimepicker/date/TextViewWithCircularIndicator.smali b/smali/smali/com/fourmob/datetimepicker/date/TextViewWithCircularIndicator.smali index 1cfeac2c9..3c130b6fa 100644 --- a/smali/smali/com/fourmob/datetimepicker/date/TextViewWithCircularIndicator.smali +++ b/smali/smali/com/fourmob/datetimepicker/date/TextViewWithCircularIndicator.smali @@ -33,9 +33,7 @@ move-result-object p2 .line 4 - sget v0, Lcom/fourmob/datetimepicker/a;->blue:I - - invoke-virtual {p2, v0}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result p2 diff --git a/smali/smali/com/fourmob/datetimepicker/time/AmPmCirclesView.smali b/smali/smali/com/fourmob/datetimepicker/time/AmPmCirclesView.smali index 31de84a99..ef7f74e96 100644 --- a/smali/smali/com/fourmob/datetimepicker/time/AmPmCirclesView.smali +++ b/smali/smali/com/fourmob/datetimepicker/time/AmPmCirclesView.smali @@ -204,9 +204,7 @@ iput v0, p0, Lcom/fourmob/datetimepicker/time/AmPmCirclesView;->c:I .line 6 - sget v0, Lcom/fourmob/datetimepicker/a;->blue:I - - invoke-virtual {p1, v0}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali/com/fourmob/datetimepicker/time/RadialSelectorView.smali b/smali/smali/com/fourmob/datetimepicker/time/RadialSelectorView.smali index 3606fc73c..a23508622 100644 --- a/smali/smali/com/fourmob/datetimepicker/time/RadialSelectorView.smali +++ b/smali/smali/com/fourmob/datetimepicker/time/RadialSelectorView.smali @@ -496,9 +496,7 @@ move-result-object p1 .line 4 - sget v0, Lcom/fourmob/datetimepicker/a;->blue:I - - invoke-virtual {p1, v0}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v0 diff --git a/smali/smali/com/fourmob/datetimepicker/time/RadialTimePickerDialog.smali b/smali/smali/com/fourmob/datetimepicker/time/RadialTimePickerDialog.smali index 893614d3e..5ee236e4d 100644 --- a/smali/smali/com/fourmob/datetimepicker/time/RadialTimePickerDialog.smali +++ b/smali/smali/com/fourmob/datetimepicker/time/RadialTimePickerDialog.smali @@ -2820,9 +2820,7 @@ iput-object v2, p0, Lcom/fourmob/datetimepicker/time/RadialTimePickerDialog;->V:Ljava/lang/String; .line 10 - sget v2, Lcom/fourmob/datetimepicker/a;->blue:I - - invoke-virtual {v1, v2}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {}, Lru/vtosters/lite/utils/ThemesUtils;->getAccentColor()I move-result v2 diff --git a/smali/smali_classes2/com/vk/articles/ArticleFragment.smali b/smali/smali_classes2/com/vk/articles/ArticleFragment.smali index f6aa78b5a..c8ce08c34 100644 --- a/smali/smali_classes2/com/vk/articles/ArticleFragment.smali +++ b/smali/smali_classes2/com/vk/articles/ArticleFragment.smali @@ -3494,14 +3494,14 @@ const v1, 0x7f060018 - invoke-static {v1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor2(I)I + invoke-static {v1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result v2 const v3, 0x7f060105 .line 20 - invoke-static {v3}, Lru/vtosters/lite/utils/ThemesUtils;->getColor2(I)I + invoke-static {v3}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result v4 diff --git a/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorLightBlue$2.smali b/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorLightBlue$2.smali index a099fe483..190539f14 100644 --- a/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorLightBlue$2.smali +++ b/smali/smali_classes2/com/vk/core/utils/VerifyInfoHelper$colorLightBlue$2.smali @@ -63,7 +63,7 @@ sget v1, Lb/h/z/c;->light_blue:I - invoke-static {v1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor2(I)I + invoke-static {v1}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result v0 diff --git a/smali/smali_classes3/com/vk/mentions/w/DefaultMentionSpanProvider.smali b/smali/smali_classes3/com/vk/mentions/w/DefaultMentionSpanProvider.smali index 43f952892..2b94edf24 100644 --- a/smali/smali_classes3/com/vk/mentions/w/DefaultMentionSpanProvider.smali +++ b/smali/smali_classes3/com/vk/mentions/w/DefaultMentionSpanProvider.smali @@ -27,7 +27,7 @@ .line 2 sget v0, Lcom/vk/mentions/p;->light_blue:I - invoke-static {v0}, Lru/vtosters/lite/utils/ThemesUtils;->getColor2(I)I + invoke-static {v0}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result p1 diff --git a/smali/smali_classes4/com/vtosters/lite/general/fragments/SuggestionsFragment.smali b/smali/smali_classes4/com/vtosters/lite/general/fragments/SuggestionsFragment.smali index b89ea902e..b15174de7 100644 --- a/smali/smali_classes4/com/vtosters/lite/general/fragments/SuggestionsFragment.smali +++ b/smali/smali_classes4/com/vtosters/lite/general/fragments/SuggestionsFragment.smali @@ -410,7 +410,7 @@ move-result-object p3 - invoke-virtual {p3, v2}, Landroid/content/res/Resources;->getColor(I)I + invoke-static {v2}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result p3 diff --git a/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali b/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali index 4c2f2e288..dcb1c5df1 100644 --- a/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali +++ b/smali/smali_classes5/com/vtosters/lite/ui/widget/WaveRecordCircleView.smali @@ -82,7 +82,7 @@ const v0, 0x7f0600f7 - invoke-static {v0}, Lru/vtosters/lite/utils/ThemesUtils;->getColor2(I)I + invoke-static {v0}, Lru/vtosters/lite/utils/ThemesUtils;->getColor(I)I move-result p3 From 2bdff722d4eb8cbc64e4f9ff0722936d56329490 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 1 Dec 2022 20:46:49 +0300 Subject: [PATCH 33/95] Updated default accent color --- app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java index a917c197e..81791e046 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java @@ -8,7 +8,7 @@ import java.util.Arrays; import java.util.List; public class ColorReferences { - public static final int stockAccent = Color.parseColor("#3f8ae0"); + public static final int stockAccent = Color.parseColor(ThemesUtils.isDarkTheme() ? "#71aaeb" : "#528bcc"); public static List accentColors = Arrays.asList( Color.parseColor("#3f8ae0"), // azure_300 (light accent) Color.parseColor("#4986cc"), // azure_a400 From 163cd44dcc11dea16ce40fc0d8612c0e8583a28f Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 1 Dec 2022 21:45:40 +0300 Subject: [PATCH 34/95] getAccenedColorStateList --- .../java/ru/vtosters/lite/themes/hooks/ToolbarHook.java | 3 ++- app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java | 3 ++- .../java/ru/vtosters/lite/ui/fragments/MediaFragment.java | 7 ++++--- .../lite/ui/fragments/tgstickers/StickersFragment.java | 7 ++++--- app/src/main/java/ru/vtosters/lite/utils/RenameTool.java | 6 +++--- app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java | 4 ++++ 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/themes/hooks/ToolbarHook.java b/app/src/main/java/ru/vtosters/lite/themes/hooks/ToolbarHook.java index b4275e0de..496bb6aa9 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/hooks/ToolbarHook.java +++ b/app/src/main/java/ru/vtosters/lite/themes/hooks/ToolbarHook.java @@ -1,12 +1,13 @@ package ru.vtosters.lite.themes.hooks; +import android.view.MenuItem; import android.view.View; import android.widget.Toolbar; public class ToolbarHook implements BaseHook { @Override public void inject(View view, int i, boolean z) { - if (view instanceof Toolbar) { + if (view instanceof MenuItem) { // wtf? } } diff --git a/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java b/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java index 54f140044..02f6e63d4 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java +++ b/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java @@ -25,6 +25,7 @@ import androidx.preference.PreferenceCategory; import com.vk.core.dialogs.alert.VkAlertDialog; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.ui.MaterialSwitchPreference; +import ru.vtosters.lite.utils.ThemesUtils; public class PreferencesUtil { @@ -231,7 +232,7 @@ public class PreferencesUtil { editText.setTextColor(getTextAttr()); editText.setHintTextColor(getSTextAttr()); - editText.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); + editText.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); linearLayout.addView(editText); editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/MediaFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/MediaFragment.java index c744ca629..7d0b53441 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/MediaFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/MediaFragment.java @@ -50,6 +50,7 @@ import ru.vtosters.lite.music.LastFMScrobbler; import ru.vtosters.lite.music.cache.CacheDatabaseDelegate; import ru.vtosters.lite.ui.adapters.ImagineArrayAdapter; import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.ThemesUtils; public class MediaFragment extends MaterialPreferenceToolbarFragment { private static final ExecutorService executor = Executors.newCachedThreadPool(); @@ -57,7 +58,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment { public static void download(Context ctx) { final EditText input = new EditText(ctx); input.setTextColor(getTextAttr()); - input.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); + input.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); var lp = new FrameLayout.LayoutParams(-1, -2); lp.leftMargin = AndroidUtils.dp2px(16); @@ -175,7 +176,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment { fn.setHint(R.string.lastfm_login); fn.setTextColor(getTextAttr()); fn.setHintTextColor(getSTextAttr()); - fn.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); + fn.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); linearLayout.addView(fn); fn.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) fn.getLayoutParams()); @@ -186,7 +187,7 @@ public class MediaFragment extends MaterialPreferenceToolbarFragment { ln.setHint(R.string.lastfm_password); ln.setTextColor(getTextAttr()); ln.setHintTextColor(getSTextAttr()); - ln.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); + ln.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); linearLayout.addView(ln); ln.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; ln.setLayoutParams(margin); diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java index b215e7de8..979e82315 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java @@ -46,6 +46,7 @@ import ru.vtosters.lite.ui.adapters.StickerPackAdapter; import ru.vtosters.lite.ui.components.StickerTouchHelperCallback; import ru.vtosters.lite.ui.fragments.BaseToolbarFragment; import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.ThemesUtils; public class StickersFragment extends BaseToolbarFragment { public final static String ACTION_RELOAD = "com.vtosters.lite.action.RELOAD_TGS_LIST"; @@ -132,7 +133,7 @@ public class StickersFragment extends BaseToolbarFragment { FloatingActionButton mAddStickerPack = new FloatingActionButton(getContext()); mAddStickerPack.setImageResource(R.drawable.ic_add_24); - mAddStickerPack.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); + mAddStickerPack.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); mAddStickerPack.setOnClickListener(v2 -> fabClick()); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(-2, -2); @@ -173,7 +174,7 @@ public class StickersFragment extends BaseToolbarFragment { final EditText editText = new EditText(getContext()); editText.setHintTextColor(getSTextAttr()); - editText.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); + editText.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); linearLayout.addView(editText); editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; @@ -231,7 +232,7 @@ public class StickersFragment extends BaseToolbarFragment { final EditText editText = new EditText(getContext()); editText.setHintTextColor(getSTextAttr()); - editText.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); + editText.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); linearLayout.addView(editText); editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; diff --git a/app/src/main/java/ru/vtosters/lite/utils/RenameTool.java b/app/src/main/java/ru/vtosters/lite/utils/RenameTool.java index 6c064fe1e..5f0ad775a 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/RenameTool.java +++ b/app/src/main/java/ru/vtosters/lite/utils/RenameTool.java @@ -153,7 +153,7 @@ public class RenameTool { fn.setHint(R.string.vk_auth_sign_up_first_name); fn.setTextColor(getTextAttr()); fn.setHintTextColor(getSTextAttr()); - fn.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); + fn.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); linearLayout.addView(fn); fn.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) fn.getLayoutParams()); @@ -164,7 +164,7 @@ public class RenameTool { ln.setHint(R.string.vk_auth_sign_up_last_name); ln.setTextColor(getTextAttr()); ln.setHintTextColor(getSTextAttr()); - ln.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); + ln.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); linearLayout.addView(ln); ln.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; ln.setLayoutParams(margin); @@ -235,7 +235,7 @@ public class RenameTool { fn.setHint(R.string.vk_auth_sign_up_first_name); fn.setHintTextColor(getSTextAttr()); fn.setTextColor(getTextAttr()); - fn.setBackgroundTintList(ColorStateList.valueOf(getAccentColor())); + fn.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); linearLayout.addView(fn); fn.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) fn.getLayoutParams()); diff --git a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java index 71f0adac0..e0ae448af 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -48,6 +48,10 @@ public class ThemesUtils { } } // Apply VKTheme and ImTheme (hard applying without dynamic theme changing) + public static ColorStateList getAccenedColorStateList() { + return ColorStateList.valueOf(getAccentColor()); + } + public static int getSystemModeTheme() { return AppCompatDelegate.getDefaultNightMode(); } From 09807a295478aece583568e9e804229662d3e8f5 Mon Sep 17 00:00:00 2001 From: Vologhat Date: Thu, 1 Dec 2022 22:52:21 +0300 Subject: [PATCH 35/95] coloring outgoing messages in accent --- .../ui/adapters/MessagesPreviewAdapter.java | 20 ++++++++++++++++--- .../ui/wallpapers/WallpaperPreferences.java | 3 ++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/adapters/MessagesPreviewAdapter.java b/app/src/main/java/ru/vtosters/lite/ui/adapters/MessagesPreviewAdapter.java index d6ccd751e..ee01a6fab 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/adapters/MessagesPreviewAdapter.java +++ b/app/src/main/java/ru/vtosters/lite/ui/adapters/MessagesPreviewAdapter.java @@ -1,6 +1,9 @@ package ru.vtosters.lite.ui.adapters; import android.content.Context; +import android.graphics.ColorFilter; +import android.graphics.ColorMatrixColorFilter; +import android.graphics.PorterDuff; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -12,14 +15,23 @@ import androidx.recyclerview.widget.RecyclerView; import com.vk.core.widget.BubbleFluidLayout; import com.vk.im.ui.components.viewcontrollers.msg_list.entry.MsgTextBuilder; import com.vk.im.ui.views.msg.MsgPartTextView; +import com.vk.im.ui.views.msg.bubble.MsgBubbleDrawable; +import com.vk.im.ui.views.msg.bubble.MsgBubblePart; +import com.vk.im.ui.views.msg.bubble.MsgBubbleStyle; import com.vk.im.ui.views.msg.bubble.MsgBubbleView; import com.vtosters.lite.R; +import com.vtosters.lite.m0.ToolbarHelper; import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.ThemesUtils; public class MessagesPreviewAdapter extends RecyclerView.Adapter { - private static final String[] MESSAGES = AndroidUtils.getArray(R.array.wallpaper_change_dialog); + private final String[] mMessages; + + public MessagesPreviewAdapter(String... messages) { + mMessages = messages; + } @Override public int getItemViewType(int i) { @@ -49,6 +61,8 @@ public class MessagesPreviewAdapter extends RecyclerView.Adapter Date: Thu, 1 Dec 2022 23:08:29 +0300 Subject: [PATCH 36/95] Update IOUtils.java --- .../java/ru/vtosters/lite/utils/IOUtils.java | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java b/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java index d06def389..9195e72c7 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java @@ -26,10 +26,7 @@ public class IOUtils { public static byte[] decodeStream(InputStream encIs, String keyURL) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IOException { CipherInputStream cip = new CipherInputStream(encIs, getCipher(keyURL)); - var bytes = readAllBytes(cip); - cip.close(); - - return bytes; + return readAllBytes(cip); } public static Cipher getCipher(String key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException { @@ -49,23 +46,15 @@ public class IOUtils { } public static String readAllLines(File file) throws IOException { - var is = new FileInputStream(file); - var bytes = readAllBytes(is); - is.close(); - - return new String(bytes, StandardCharsets.UTF_8); + return readAllLines(new FileInputStream(file)); } public static String readAllLines(InputStream is) throws IOException { - return new String(readAllBytes(is), StandardCharsets.UTF_8); + return new String(readAllBytes(is), "utf-8"); } public static byte[] readAllBytes(File file) throws IOException { - var is = new FileInputStream(file); - var bytes = readAllBytes(is); - is.close(); - - return bytes; + return readAllBytes(new FileInputStream(file)); } public static byte[] readAllBytes(InputStream is) throws IOException { @@ -74,11 +63,7 @@ public class IOUtils { int len; while ((len = is.read(buffer)) > 0) bos.write(buffer, 0, len); - - var bytes = bos.toByteArray(); - bos.close(); - - return bytes; + return bos.toByteArray(); } public static void writeToFile(File file, String content) throws IOException { @@ -86,9 +71,32 @@ public class IOUtils { } public static void writeToFile(File file, byte[] content) throws IOException { + if (!file.exists()) + file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); fos.write(content); - fos.close(); + } + + public static void copyFileToDirectory(File dest, File targetDir) throws IOException { + if (!targetDir.exists()) + targetDir.mkdirs(); + var path = dest.getAbsolutePath(); + var target = new File(targetDir, path.substring(path.lastIndexOf("/"))); + copyFile(dest, target); + } + + public static void copyFile(File dest, File target) throws IOException { + var parent = target.getParentFile(); + if (!parent.exists()) + parent.getParentFile().mkdirs(); + writeToFile(target, readAllBytes(dest)); + } + + public static void copyFile(InputStream is, File target) throws IOException { + var parent = target.getParentFile(); + if (!parent.exists()) + parent.getParentFile().mkdirs(); + writeToFile(target, readAllBytes(is)); } public static void deleteRecursive(File f) { @@ -117,8 +125,4 @@ public class IOUtils { return size; } - - public static String getValidFileName(String fileName) { - return fileName.replaceAll("[\\\\/:*?\"<>|]", ""); - } } From ee4249c688306ed96d7d35708bcdbc158bba579d Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 1 Dec 2022 23:17:40 +0300 Subject: [PATCH 37/95] Revert "Update IOUtils.java" This reverts commit 2f46c193dd1a2321b4d903c7c7d4c13876c87569. --- .../java/ru/vtosters/lite/utils/IOUtils.java | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java b/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java index 9195e72c7..d06def389 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java @@ -26,7 +26,10 @@ public class IOUtils { public static byte[] decodeStream(InputStream encIs, String keyURL) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IOException { CipherInputStream cip = new CipherInputStream(encIs, getCipher(keyURL)); - return readAllBytes(cip); + var bytes = readAllBytes(cip); + cip.close(); + + return bytes; } public static Cipher getCipher(String key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException { @@ -46,15 +49,23 @@ public class IOUtils { } public static String readAllLines(File file) throws IOException { - return readAllLines(new FileInputStream(file)); + var is = new FileInputStream(file); + var bytes = readAllBytes(is); + is.close(); + + return new String(bytes, StandardCharsets.UTF_8); } public static String readAllLines(InputStream is) throws IOException { - return new String(readAllBytes(is), "utf-8"); + return new String(readAllBytes(is), StandardCharsets.UTF_8); } public static byte[] readAllBytes(File file) throws IOException { - return readAllBytes(new FileInputStream(file)); + var is = new FileInputStream(file); + var bytes = readAllBytes(is); + is.close(); + + return bytes; } public static byte[] readAllBytes(InputStream is) throws IOException { @@ -63,7 +74,11 @@ public class IOUtils { int len; while ((len = is.read(buffer)) > 0) bos.write(buffer, 0, len); - return bos.toByteArray(); + + var bytes = bos.toByteArray(); + bos.close(); + + return bytes; } public static void writeToFile(File file, String content) throws IOException { @@ -71,32 +86,9 @@ public class IOUtils { } public static void writeToFile(File file, byte[] content) throws IOException { - if (!file.exists()) - file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); fos.write(content); - } - - public static void copyFileToDirectory(File dest, File targetDir) throws IOException { - if (!targetDir.exists()) - targetDir.mkdirs(); - var path = dest.getAbsolutePath(); - var target = new File(targetDir, path.substring(path.lastIndexOf("/"))); - copyFile(dest, target); - } - - public static void copyFile(File dest, File target) throws IOException { - var parent = target.getParentFile(); - if (!parent.exists()) - parent.getParentFile().mkdirs(); - writeToFile(target, readAllBytes(dest)); - } - - public static void copyFile(InputStream is, File target) throws IOException { - var parent = target.getParentFile(); - if (!parent.exists()) - parent.getParentFile().mkdirs(); - writeToFile(target, readAllBytes(is)); + fos.close(); } public static void deleteRecursive(File f) { @@ -125,4 +117,8 @@ public class IOUtils { return size; } + + public static String getValidFileName(String fileName) { + return fileName.replaceAll("[\\\\/:*?\"<>|]", ""); + } } From 9f2b3edbe88378a7455bed600c46ba8ecf6ab1aa Mon Sep 17 00:00:00 2001 From: Vologhat Date: Thu, 1 Dec 2022 23:23:55 +0300 Subject: [PATCH 38/95] Update IOUtils.java --- .../java/ru/vtosters/lite/utils/IOUtils.java | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java b/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java index d06def389..e1e2c00c3 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java @@ -26,10 +26,7 @@ public class IOUtils { public static byte[] decodeStream(InputStream encIs, String keyURL) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, IOException { CipherInputStream cip = new CipherInputStream(encIs, getCipher(keyURL)); - var bytes = readAllBytes(cip); - cip.close(); - - return bytes; + return readAllBytes(cip); } public static Cipher getCipher(String key) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException { @@ -49,23 +46,15 @@ public class IOUtils { } public static String readAllLines(File file) throws IOException { - var is = new FileInputStream(file); - var bytes = readAllBytes(is); - is.close(); - - return new String(bytes, StandardCharsets.UTF_8); + return readAllLines(new FileInputStream(file)); } public static String readAllLines(InputStream is) throws IOException { - return new String(readAllBytes(is), StandardCharsets.UTF_8); + return new String(readAllBytes(is), "utf-8"); } public static byte[] readAllBytes(File file) throws IOException { - var is = new FileInputStream(file); - var bytes = readAllBytes(is); - is.close(); - - return bytes; + return readAllBytes(new FileInputStream(file)); } public static byte[] readAllBytes(InputStream is) throws IOException { @@ -74,11 +63,7 @@ public class IOUtils { int len; while ((len = is.read(buffer)) > 0) bos.write(buffer, 0, len); - - var bytes = bos.toByteArray(); - bos.close(); - - return bytes; + return bos.toByteArray(); } public static void writeToFile(File file, String content) throws IOException { @@ -86,9 +71,32 @@ public class IOUtils { } public static void writeToFile(File file, byte[] content) throws IOException { + if (!file.exists()) + file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); fos.write(content); - fos.close(); + } + + public static void copyFileToDirectory(File dest, File targetDir) throws IOException { + if (!targetDir.exists()) + targetDir.mkdirs(); + var path = dest.getAbsolutePath(); + var target = new File(targetDir, path.substring(path.lastIndexOf("/"))); + copyFile(dest, target); + } + + public static void copyFile(File dest, File target) throws IOException { + var parent = target.getParentFile(); + if (!parent.exists()) + parent.getParentFile().mkdirs(); + writeToFile(target, readAllBytes(dest)); + } + + public static void copyFile(InputStream is, File target) throws IOException { + var parent = target.getParentFile(); + if (!parent.exists()) + parent.getParentFile().mkdirs(); + writeToFile(target, readAllBytes(is)); } public static void deleteRecursive(File f) { @@ -121,4 +129,4 @@ public class IOUtils { public static String getValidFileName(String fileName) { return fileName.replaceAll("[\\\\/:*?\"<>|]", ""); } -} +} \ No newline at end of file From 95958a85e946840d77c0d9f2acb4eff29b76b949 Mon Sep 17 00:00:00 2001 From: Vologhat Date: Fri, 2 Dec 2022 11:52:49 +0300 Subject: [PATCH 39/95] Update IOUtils.java --- app/src/main/java/ru/vtosters/lite/utils/IOUtils.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java b/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java index e1e2c00c3..28556f1cf 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/IOUtils.java @@ -63,6 +63,8 @@ public class IOUtils { int len; while ((len = is.read(buffer)) > 0) bos.write(buffer, 0, len); + is.close(); + bos.close(); return bos.toByteArray(); } @@ -73,8 +75,9 @@ public class IOUtils { public static void writeToFile(File file, byte[] content) throws IOException { if (!file.exists()) file.createNewFile(); - FileOutputStream fos = new FileOutputStream(file); + var fos = new FileOutputStream(file); fos.write(content); + fos.close(); } public static void copyFileToDirectory(File dest, File targetDir) throws IOException { @@ -106,8 +109,8 @@ public class IOUtils { public static void deleteRecursive(File f, boolean selfDeletion) { if (f.isDirectory()) { var fs = f.listFiles(); - if (fs != null) - for (File child : fs) + if (fs != null && fs.length > 0) + for (var child : fs) deleteRecursive(child, true); } if (selfDeletion) @@ -115,7 +118,7 @@ public class IOUtils { } public static long getDirSize(File dir) { - var arr = dir.listFiles(); + final var arr = dir.listFiles(); if (arr == null || arr.length == 0) return 0; From 1451e2d3ac8ad6277ed1cccfbfe329d9a53bc0b3 Mon Sep 17 00:00:00 2001 From: Vologhat Date: Fri, 2 Dec 2022 11:53:39 +0300 Subject: [PATCH 40/95] downgrade buildToolsVersion --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a72e5cf39..68f57463a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,7 +69,7 @@ task exportDex { android { compileSdkVersion 32 - buildToolsVersion '33.0.0' + buildToolsVersion '32.0.0' defaultConfig { applicationId "ru.vtosters.lite.utils.lite" From 5ce6ab3aa8ab01af28142b85b85dac296e946c2f Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Fri, 2 Dec 2022 13:43:50 +0300 Subject: [PATCH 41/95] removed global context from adding prefs --- .../ru/vtosters/lite/ui/PreferencesUtil.java | 64 ++++++++----------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java b/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java index 02f6e63d4..65986e0ed 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java +++ b/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java @@ -1,30 +1,22 @@ package ru.vtosters.lite.ui; -import static ru.vtosters.lite.utils.AndroidUtils.dp2px; -import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; -import static ru.vtosters.lite.utils.ImageUtils.setTint; -import static ru.vtosters.lite.utils.ThemesUtils.getAccentColor; -import static ru.vtosters.lite.utils.ThemesUtils.getSTextAttr; -import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr; - import android.content.Context; -import android.content.res.ColorStateList; import android.graphics.drawable.Drawable; import android.preference.PreferenceManager; import android.util.TypedValue; import android.view.ViewGroup; import android.widget.EditText; import android.widget.LinearLayout; - import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; - import com.vk.core.dialogs.alert.VkAlertDialog; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; import com.vtosters.lite.ui.MaterialSwitchPreference; +import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.ImageUtils; import ru.vtosters.lite.utils.ThemesUtils; public class PreferencesUtil { @@ -37,7 +29,7 @@ public class PreferencesUtil { CharSequence[] entries, CharSequence[] entriesValue ) { - ListPreference preference = new ListPreference(getGlobalContext()); + ListPreference preference = new ListPreference(fragment.requireContext()); preference.setEntries(entries); preference.setEntryValues(entriesValue); preference.setTitle(title); // setTitle @@ -58,7 +50,7 @@ public class PreferencesUtil { CharSequence[] entriesValue, Preference.OnPreferenceChangeListener listener ) { - ListPreference preference = new ListPreference(getGlobalContext()); + ListPreference preference = new ListPreference(fragment.requireContext()); preference.setEntries(entries); preference.setEntryValues(entriesValue); preference.setSummary(summary); // setSummary @@ -70,7 +62,7 @@ public class PreferencesUtil { preference.setOnPreferenceChangeListener(listener); if (iconRes != 0) - preference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), iconRes))); // preference.setIcon + preference.setIcon(ImageUtils.setTint(fragment.requireContext(), getDrawable(fragment.requireContext(), iconRes))); // preference.setIcon fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference) } @@ -81,7 +73,7 @@ public class PreferencesUtil { CharSequence summary, boolean defValue ) { - MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getGlobalContext()); + MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(materialPreferenceToolbarFragment.requireContext()); materialSwitchPreference.setTitle(title); // setTitle materialSwitchPreference.setSummary(summary); // setSummary materialSwitchPreference.setKey(key); // setKey @@ -99,7 +91,7 @@ public class PreferencesUtil { // boolean defValue, // Preference.OnPreferenceChangeListener listener // ) { -// MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getGlobalContext()); +// MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(fragment.requireContext()); // materialSwitchPreference.setTitle(title); // setTitle // materialSwitchPreference.setSummary(summary); // setSummary // materialSwitchPreference.setKey(key); // setKey @@ -107,7 +99,7 @@ public class PreferencesUtil { // materialSwitchPreference.setOnPreferenceChangeListener(listener); // setOnPreferenceClickListener // // if (iconRes != 0) -// materialSwitchPreference.setIcon(setTint(getGlobalContext(), Objects.requireNonNull(ContextCompat.getDrawable(getGlobalContext(), iconRes)))); // preference.setIcon +// materialSwitchPreference.setIcon(setTint(fragment.requireContext(), Objects.requireNonNull(ContextCompat.getDrawable(fragment.requireContext(), iconRes)))); // preference.setIcon // // fragment.getPreferenceScreen().addPreference(materialSwitchPreference); // fragment.getPreferenceScreen().addPreference(preference) // } @@ -121,7 +113,7 @@ public class PreferencesUtil { boolean defValue, Preference.OnPreferenceChangeListener listener ) { - MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getGlobalContext()); + MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(fragment.requireContext()); materialSwitchPreference.setTitle(title); // setTitle materialSwitchPreference.setSummary(summary); // setSummary materialSwitchPreference.setKey(key); // setKey @@ -129,7 +121,7 @@ public class PreferencesUtil { fragment.getPreferenceScreen().addPreference(materialSwitchPreference); // materialPreferenceToolbarFragment.getPreferenceScreen().addPreference(preference) if (iconRes != 0) - materialSwitchPreference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), iconRes))); // preference.setIcon + materialSwitchPreference.setIcon(ImageUtils.setTint(fragment.requireContext(), getDrawable(fragment.requireContext(), iconRes))); // preference.setIcon materialSwitchPreference.setOnPreferenceChangeListener(listener); // setOnPreferenceClickListener(listener) fragment.getPreferenceScreen().addPreference(materialSwitchPreference); // fragment.getPreferenceScreen().addPreference(preference) @@ -141,7 +133,7 @@ public class PreferencesUtil { CharSequence title, CharSequence summary ) { - Preference preference = new Preference(getGlobalContext()); + Preference preference = new Preference(fragment.requireContext()); preference.setSummary(summary); // setSummary preference.setTitle(title); // setTitle preference.setKey(key); // setKey @@ -156,12 +148,12 @@ public class PreferencesUtil { int iconRes, Preference.OnPreferenceClickListener listener ) { - Preference preference = new Preference(getGlobalContext()); + Preference preference = new Preference(fragment.requireContext()); preference.setSummary(summary); // setSummary preference.setTitle(title); // setTitle if (iconRes != 0) - preference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), iconRes))); // preference.setIcon + preference.setIcon(ImageUtils.setTint(fragment.requireContext(), getDrawable(fragment.requireContext(), iconRes))); // preference.setIcon preference.setOnPreferenceClickListener(listener); // preference.setOnPreferenceClickListener(listener) fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference) @@ -174,13 +166,13 @@ public class PreferencesUtil { CharSequence summary, int iconRes, Preference.OnPreferenceClickListener listener) { - Preference preference = new Preference(getGlobalContext()); + Preference preference = new Preference(fragment.requireContext()); preference.setSummary(summary); // setSummary preference.setTitle(title); // setTitle preference.setKey(key); // setKey if (iconRes != 0) - preference.setIcon(setTint(getGlobalContext(), getDrawable(getGlobalContext(), iconRes))); // preference.setIcon + preference.setIcon(ImageUtils.setTint(fragment.requireContext(), getDrawable(fragment.requireContext(), iconRes))); // preference.setIcon preference.setOnPreferenceClickListener(listener); // preference.setOnPreferenceClickListener(listener) fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference) @@ -194,7 +186,7 @@ public class PreferencesUtil { @Nullable Drawable icon, Preference.OnPreferenceClickListener listener ) { - Preference preference = new Preference(getGlobalContext()); + Preference preference = new Preference(fragment.requireContext()); preference.setSummary(summary); // setSummary preference.setTitle(title); // setTitle preference.setKey(key); // setKey @@ -207,37 +199,37 @@ public class PreferencesUtil { } public static void addPreferenceCategory(MaterialPreferenceToolbarFragment fragment, CharSequence title) { - PreferenceCategory preference = new PreferenceCategory(getGlobalContext(), null); + PreferenceCategory preference = new PreferenceCategory(fragment.requireContext(), null); preference.setTitle(title); // setTitle fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference) } public static void addPreferenceCategory(MaterialPreferenceToolbarFragment fragment, CharSequence title, int collapsedSize) { - PreferenceCategory preference = new PreferenceCategory(getGlobalContext(), null); + PreferenceCategory preference = new PreferenceCategory(fragment.requireContext(), null); preference.setTitle(title); // setTitle fragment.getPreferenceScreen().addPreference(preference); // fragment.getPreferenceScreen().addPreference(preference) } public static void addEditTextPreference(MaterialPreferenceToolbarFragment fragment, String key, CharSequence title, EditTextPrefChangeListener editTextPrefChangeListener) { - Preference preference = new Preference(getGlobalContext()); + Preference preference = new Preference(fragment.requireContext()); preference.setTitle(title); // setTitle preference.setKey(key); // setKey preference.setOnPreferenceClickListener(preference1 -> { - LinearLayout linearLayout = new LinearLayout(getGlobalContext()); + LinearLayout linearLayout = new LinearLayout(fragment.requireContext()); - final EditText editText = new EditText(getGlobalContext()); - editText.setText(PreferenceManager.getDefaultSharedPreferences(getGlobalContext()).getString(key, "")); + final EditText editText = new EditText(fragment.requireContext()); + editText.setText(PreferenceManager.getDefaultSharedPreferences(fragment.requireContext()).getString(key, "")); editText.setHint(title); - editText.setTextColor(getTextAttr()); - editText.setHintTextColor(getSTextAttr()); + editText.setTextColor(ThemesUtils.getTextAttr()); + editText.setHintTextColor(ThemesUtils.getSTextAttr()); editText.setBackgroundTintList(ThemesUtils.getAccenedColorStateList()); linearLayout.addView(editText); editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams()); - margin.setMargins(dp2px(20f), 0, dp2px(20f), 0); + margin.setMargins(AndroidUtils.dp2px(20f), 0, AndroidUtils.dp2px(20f), 0); editText.setLayoutParams(margin); new VkAlertDialog.Builder(fragment.getContext()) @@ -248,7 +240,7 @@ public class PreferencesUtil { if (!change) return; - PreferenceManager.getDefaultSharedPreferences(getGlobalContext()) + PreferenceManager.getDefaultSharedPreferences(fragment.requireContext()) .edit() .putString(key, editText.getText().toString()) .apply(); @@ -262,13 +254,13 @@ public class PreferencesUtil { public static int getTextColor(Context ctx) { TypedValue typedValue = new TypedValue(); - ctx.getTheme().resolveAttribute(getTextAttr(), typedValue, true); + ctx.getTheme().resolveAttribute(ThemesUtils.getTextAttr(), typedValue, true); return typedValue.data; } public static int getSTextColor(Context ctx) { TypedValue typedValue = new TypedValue(); - ctx.getTheme().resolveAttribute(getSTextAttr(), typedValue, true); + ctx.getTheme().resolveAttribute(ThemesUtils.getSTextAttr(), typedValue, true); return typedValue.data; } From 576890189c5c57d040366b1a3782eb09a1fb7637 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Fri, 2 Dec 2022 13:44:08 +0300 Subject: [PATCH 42/95] fixed accent fragment and color resetting --- .../lite/ui/fragments/AccentsFragment.java | 33 ++++++++++++++----- .../ru/vtosters/lite/utils/ThemesUtils.java | 3 +- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java index 29645c1d0..a8f1522c0 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java @@ -1,7 +1,9 @@ package ru.vtosters.lite.ui.fragments; +import android.content.Intent; import android.content.res.ColorStateList; import android.graphics.Color; +import android.net.Uri; import android.os.Bundle; import android.text.Editable; import android.text.TextUtils; @@ -22,25 +24,32 @@ import java.util.Collections; import ru.vtosters.lite.themes.ThemesCore; import ru.vtosters.lite.ui.PreferencesUtil; import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.LifecycleUtils; import ru.vtosters.lite.utils.ThemesUtils; public class AccentsFragment extends MaterialPreferenceToolbarFragment { private static final int MAX_COLOR_STR_LEN = 7; // without transparency private static final String HEX = "0123456789abcdefABCDEF"; - @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); addPreferencesFromResource(R.xml.empty); - final var colorPickerPreference = new Preference(requireContext()); - colorPickerPreference.setTitle("Выбор акцента через HEX"); - colorPickerPreference.setIcon(R.drawable.bg_accent_circle); - colorPickerPreference.setOnPreferenceClickListener(preference -> { + PreferencesUtil.addPreferenceCategory(this, "Выбор цвета"); + + PreferencesUtil.addPreferenceDrawable(this, "", "Выбор акцента через Hex", "Точная настройка цвета", ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.bg_accent_circle)), preference -> { showEditAccentColorDialog(); return false; }); - getPreferenceScreen().addPreference(colorPickerPreference); + + PreferencesUtil.addPreferenceCategory(this, "Полезная информация"); + + PreferencesUtil.addPreference(this, "Внимание!", "Функция находится на стадии тестирования и могут наблюдаться ошибки", 0, null); + + PreferencesUtil.addPreference(this, "Color-Hex", "Полезный ресурс со всевозможными hex-цветами", 0, preference -> { + requireContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://www.color-hex.com"))); + return false; + }); } void showEditAccentColorDialog() { @@ -107,7 +116,8 @@ public class AccentsFragment extends MaterialPreferenceToolbarFragment { void changeAccentColor(String colorStr) { if (TextUtils.isEmpty(colorStr)) { - resetAccentColor(); + ThemesUtils.setCustomAccentColor(0, false); + LifecycleUtils.restartApplicationWithTimer(); return; } // fix color string length @@ -123,10 +133,15 @@ public class AccentsFragment extends MaterialPreferenceToolbarFragment { ThemesUtils.setCustomAccentColor(color, false); ThemesCore.setThemedColors(color); - ThemesUtils.setTheme(ThemesUtils.getCurrentTheme(), requireActivity()); + LifecycleUtils.restartApplicationWithTimer(); } void resetAccentColor() { - changeAccentColor("#3f8ae0"); + changeAccentColor(""); + } + + @Override + public int T4() { + return R.string.vtlthemes; } } diff --git a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java index e0ae448af..c6f11aa1a 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -91,7 +91,8 @@ public class ThemesUtils { } public static int getAccentColor() { - return AndroidUtils.getPreferences().getInt("accent_color", ColorReferences.stockAccent); + var accent = AndroidUtils.getPreferences().getInt("accent_color", ColorReferences.stockAccent); + return accent == 0 ? ColorReferences.stockAccent : accent; } // Color accent public static void setCustomAccentColor(int newColor, boolean async) { From d2911e5b6b9fa64414d9cac16a1f2cc873ae1f6f Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Fri, 2 Dec 2022 14:52:54 +0300 Subject: [PATCH 43/95] updated msg colors --- .../ru/vtosters/lite/themes/ThemesCore.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java index 5bf652d42..711532db5 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ThemesCore.java @@ -21,8 +21,6 @@ public class ThemesCore { public static SparseBooleanArray ACCENT_THEME_ONLY_MILK_DARK = new SparseBooleanArray(); private static boolean cachedAccents = false; - - private static int wallDarkColor; private static int wallLightColor; static { @@ -59,6 +57,10 @@ public class ThemesCore { ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.header_alternate_tab_active_indicator, false); ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.im_dropdown_arrow_tint, false); + ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.im_bubble_wallpaper_outgoing, false); + ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.im_bubble_outgoing, false); + ACCENT_THEME_ONLY_MILK_LIGHT.put(com.vtosters.lite.R.attr.im_bubble_outgoing_highlighted, false); + ACCENT_THEME_ONLY_NOMILK.put(com.vtosters.lite.R.attr.im_dropdown_icon_color, false); } @@ -106,25 +108,20 @@ public class ThemesCore { themedColors.put(com.vtosters.lite.R.attr.action_sheet_action_foreground, accentColor); // messages - wallDarkColor = ThemesUtils.darken(accentColor, 0.25f); - wallLightColor = ThemesUtils.lighten(accentColor, 0.25f); - themedColors.put(com.vtosters.lite.R.attr.im_reply_separator, accentColor); themedColors.put(com.vtosters.lite.R.attr.im_text_name, accentColor); - //themedColors.put(com.vtosters.lite.R.attr.im_ic_send_msg, accentColor); + wallLightColor = ThemesUtils.lighten(accentColor, 0.67f); + + themedColors.put(com.vtosters.lite.R.attr.im_ic_send_msg, accentColor); themedColors.put(com.vtosters.lite.R.attr.im_bubble_wallpaper_outgoing, accentColor); themedColors.put(com.vtosters.lite.R.attr.im_bubble_outgoing, accentColor); themedColors.put(com.vtosters.lite.R.attr.im_bubble_outgoing_highlighted, accentColor); } public static int getThemedAttr(Context context, @IdRes int attr) { - if (attr == com.vtosters.lite.R.attr.im_bubble_wallpaper_outgoing || attr == com.vtosters.lite.R.attr.im_bubble_outgoing) { - return (!ThemesUtils.isDarkTheme()) ? wallLightColor : wallDarkColor; - } - - if (attr == com.vtosters.lite.R.attr.im_bubble_outgoing_highlighted) { - return (!ThemesUtils.isDarkTheme()) ? ThemesUtils.lighten(wallLightColor, 0.2f) : ThemesUtils.darken(wallDarkColor, 0.2f); + if (attr == com.vtosters.lite.R.attr.im_bubble_wallpaper_outgoing || attr == com.vtosters.lite.R.attr.im_bubble_outgoing || attr == com.vtosters.lite.R.attr.im_bubble_outgoing_highlighted) { + return wallLightColor; } return themedColors.get(attr); From f45de44c750e759be1ec466e8469155cf240a143 Mon Sep 17 00:00:00 2001 From: Vologhat Date: Fri, 2 Dec 2022 18:37:12 +0300 Subject: [PATCH 44/95] add color picker by Martin Stone Add own modification of HSV-Alpha Color Picker for Android https://github.com/martin-stone/hsv-alpha-color-picker-android --- .../lite/ui/views/rarepebble/AlphaView.java | 53 +++++ .../ui/views/rarepebble/ColorObserver.java | 6 + .../ui/views/rarepebble/ColorPickerView.java | 148 +++++++++++++ .../lite/ui/views/rarepebble/HexEdit.java | 96 ++++++++ .../lite/ui/views/rarepebble/HueSatView.java | 205 ++++++++++++++++++ .../ui/views/rarepebble/ObservableColor.java | 97 +++++++++ .../lite/ui/views/rarepebble/Resources.java | 46 ++++ .../ui/views/rarepebble/SliderViewBase.java | 112 ++++++++++ .../lite/ui/views/rarepebble/SquareView.java | 38 ++++ .../lite/ui/views/rarepebble/SwatchView.java | 125 +++++++++++ .../lite/ui/views/rarepebble/ValueView.java | 56 +++++ smali/res/drawable/checker_background.png | Bin 0 -> 397 bytes 12 files changed, 982 insertions(+) create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/AlphaView.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ColorObserver.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ColorPickerView.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HexEdit.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HueSatView.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ObservableColor.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/Resources.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SliderViewBase.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SquareView.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SwatchView.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ValueView.java create mode 100644 smali/res/drawable/checker_background.png diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/AlphaView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/AlphaView.java new file mode 100644 index 000000000..e99aff955 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/AlphaView.java @@ -0,0 +1,53 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +import android.content.Context; +import android.graphics.Bitmap; + +public class AlphaView extends SliderViewBase implements ColorObserver { + + private ObservableColor observableColor = new ObservableColor(0); + + public AlphaView(Context context) { + super(context); + } + + public void observeColor(ObservableColor observableColor) { + this.observableColor = observableColor; + observableColor.addObserver(this); + } + + @Override + public void updateColor(ObservableColor observableColor) { + setPos((float)observableColor.getAlpha()/0xff); + updateBitmap(); + invalidate(); + } + + @Override + protected void notifyListener(float currentPos) { + observableColor.updateAlpha((int)(currentPos * 0xff), this); + } + + @Override + protected int getPointerColor(float currentPos) { + float solidColorLightness = observableColor.getLightness(); + float posLightness = 1 + currentPos * (solidColorLightness - 1); + return posLightness > 0.5f ? 0xff000000 : 0xffffffff; + } + + @Override + protected Bitmap makeBitmap(int w, int h) { + final boolean isWide = w > h; + final int n = Math.max(w, h); + int color = observableColor.getColor(); + int[] colors = new int[n]; + for (int i = 0; i < n; ++i) { + float alpha = isWide ? (float)i / n : 1 - (float)i / n; + colors[i] = color & 0xffffff | (int)(alpha * 0xff) << 24; + } + final int bmpWidth = isWide ? w : 1; + final int bmpHeight = isWide ? 1 : h; + return Bitmap.createBitmap(colors, bmpWidth, bmpHeight, Bitmap.Config.ARGB_8888); + } + +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ColorObserver.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ColorObserver.java new file mode 100644 index 000000000..b660d98a0 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ColorObserver.java @@ -0,0 +1,6 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +public interface ColorObserver { + + void updateColor(ObservableColor observableColor); +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ColorPickerView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ColorPickerView.java new file mode 100644 index 000000000..78546aee7 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ColorPickerView.java @@ -0,0 +1,148 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +import static ru.vtosters.lite.utils.AndroidUtils.dp2px; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.Typeface; +import android.text.InputFilter; +import android.text.InputType; +import android.text.method.DigitsKeyListener; +import android.view.Gravity; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.LinearLayout; + +import ru.vtosters.lite.utils.LayoutUtils; + +public class ColorPickerView extends FrameLayout { + + private AlphaView alphaView; + private EditText hexEdit; + private ObservableColor observableColor = new ObservableColor(0); + private SwatchView swatchView; + + public ColorPickerView(Context context) { + super(context); + + var container = new LinearLayout(context); + container.setOrientation(LinearLayout.VERTICAL); + container.setPadding(dp2px(16), dp2px(16), dp2px(16), dp2px(16)); + container.setGravity(Gravity.CENTER); + this.addView(container, LayoutUtils.createFrame(-2, -2)); + + var colorPickerFrame = new FrameLayout(context); + var colorPickerFrameParams = LayoutUtils.createLinear(-2, -2); + colorPickerFrameParams.weight = 1.0f; + container.addView(colorPickerFrame, colorPickerFrameParams); + + swatchView = new SwatchView(context); + colorPickerFrame.addView(swatchView, LayoutUtils.createFrame(-2, -2)); + + HueSatView hueSatView = new HueSatView(context); + colorPickerFrame.addView(hueSatView, LayoutUtils.createFrame(-2, -2)); + + ValueView valueView = new ValueView(context); + var valueViewParams = LayoutUtils.createLinear(-1, dp2px(36)); + valueViewParams.topMargin = dp2px(16); + container.addView(valueView, valueViewParams); + + alphaView = new AlphaView(context); + var alphaViewParams = LayoutUtils.createLinear(-1, dp2px(36)); + valueViewParams.topMargin = dp2px(16); + container.addView(alphaView, alphaViewParams); + + hexEdit = new EditText(context); + hexEdit.setText("00000000"); + hexEdit.setKeyListener(DigitsKeyListener.getInstance("0123456789ABCDEFabcdef")); + hexEdit.setGravity(Gravity.CENTER_HORIZONTAL); + hexEdit.setFilters(new InputFilter[]{ new InputFilter.LengthFilter(4) }); + hexEdit.setBackground(null); + hexEdit.setTypeface(Typeface.MONOSPACE); + hexEdit.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + hexEdit.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); + container.addView(hexEdit, LayoutUtils.createLinear(-1, -2)); + + swatchView.observeColor(observableColor); + hueSatView.observeColor(observableColor); + valueView.observeColor(observableColor); + alphaView.observeColor(observableColor); + HexEdit.setUpListeners(hexEdit, observableColor); + + showAlpha(true); + showHex(true); + showPreview(true); + + // We get all our state saved and restored for free, + // thanks to the EditText and its listeners! + } + + /** Returns the color selected by the user */ + public int getColor() { + return observableColor.getColor(); + } + + /** + * Sets the original color swatch and the current color to the specified value.
+ * Using dark colors may lead to a loss of color information caused by the ARGB color space. + * Use {@link #setColor(int, float, float, float)} instead to avoid this. + */ + public void setColor(int color) { + setOriginalColor(color); + setCurrentColor(color); + } + + /** + * Sets the original color swatch and the current color to the specified value. + * + *
    + *
  • Alpha [0...255]
  • + *
  • Hue [0...360)
  • + *
  • Saturation [0...1]
  • + *
  • Brightness [0...1]
  • + *
+ */ public void setColor(int alpha, float hue, float sat, float bri) { + setOriginalColor(alpha, hue, sat, bri); + setCurrentColor(alpha, hue, sat, bri); + } + + /** Sets the original color swatch without changing the current color. */ + public void setOriginalColor(int color) { + swatchView.setOriginalColor(color); + } + + /** Sets the original color swatch without changing the current color. */ + public void setOriginalColor(int alpha, float hue, float sat, float bri) { + int color = Color.HSVToColor(alpha, new float[]{hue, sat, bri}); + swatchView.setOriginalColor(color); + } + + /** Updates the current color without changing the original color swatch. */ + public void setCurrentColor(int color) { + observableColor.updateColor(color, null); + } + + /** Updates the current color without changing the original color swatch. */ + public void setCurrentColor(int alpha, float hue, float sat, float bri) { + observableColor.updateColor(alpha, hue, sat, bri, null); + } + + public void showAlpha(boolean showAlpha) { + alphaView.setVisibility(showAlpha ? View.VISIBLE : View.GONE); + HexEdit.setShowAlphaDigits(hexEdit, showAlpha); + } + + public void addColorObserver(ColorObserver observer) { + observableColor.addObserver(observer); + } + + public void showHex(boolean showHex) { + hexEdit.setVisibility(showHex ? View.VISIBLE : View.GONE); + } + + public void showPreview(boolean showPreview) { + swatchView.setVisibility(showPreview ? View.VISIBLE : View.GONE); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HexEdit.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HexEdit.java new file mode 100644 index 000000000..e485009eb --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HexEdit.java @@ -0,0 +1,96 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +import android.graphics.Color; +import android.text.Editable; +import android.text.InputFilter; +import android.text.Spanned; +import android.text.TextWatcher; +import android.widget.EditText; + +class HexEdit { + + private static InputFilter[] withoutAlphaDigits = {new ColorPasteLengthFilter()}; + private static InputFilter[] withAlphaDigits = {new InputFilter.LengthFilter(8)}; + + public static void setUpListeners(final EditText hexEdit, final ObservableColor observableColor) { + + class MultiObserver implements ColorObserver, TextWatcher { + + @Override + public void updateColor(ObservableColor observableColor) { + final String colorString = formatColor(observableColor.getColor()); + // Prevent onTextChanged getting called when we update text programmatically + hexEdit.removeTextChangedListener(this); + hexEdit.setText(colorString); + hexEdit.addTextChangedListener(this); + } + + private String formatColor(int color) { + return shouldTrimAlphaDigits() + ? String.format("%06x", color & 0x00ffffff) + : String.format("%08x", color); + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + int color = parseHexColor(s); + if (shouldTrimAlphaDigits()) color = color | 0xff000000; + observableColor.updateColor(color, this); + } + + @Override + public void afterTextChanged(Editable s) { + } + + private boolean shouldTrimAlphaDigits() { + return hexEdit.getFilters() == withoutAlphaDigits; + } + } + + final MultiObserver multiObserver = new MultiObserver(); + hexEdit.addTextChangedListener(multiObserver); + observableColor.addObserver(multiObserver); + setShowAlphaDigits(hexEdit, true); + } + + private static int parseHexColor(CharSequence s) { + try { + return (int)(Long.parseLong(s.toString(), 16) & 0xffffffffL); + } + catch (NumberFormatException e) { + return Color.GRAY; + } + } + + public static void setShowAlphaDigits(final EditText hexEdit, boolean showAlphaDigits) { + hexEdit.setFilters(showAlphaDigits ? withAlphaDigits : withoutAlphaDigits); + hexEdit.setText(hexEdit.getText()); // trigger a reformat of text + } + + + private static class ColorPasteLengthFilter implements InputFilter { + + private static final int MAX_LENGTH = 6; + private static final int PASTED_LEN = 8; + private final InputFilter sixDigitFilter = new InputFilter.LengthFilter(MAX_LENGTH); + + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + // If 8 digits have been pasted, replacing all source, trim alpha digits. + // Otherwise standard LengthFilter behavior. + final int srcLength = end - start; + final int dstSelLength = dend - dstart; + if (srcLength == PASTED_LEN && dstSelLength == dest.length()) { + // Discard alpha digits: + return source.subSequence(PASTED_LEN - MAX_LENGTH, PASTED_LEN); + } + else { + return sixDigitFilter.filter(source, start, end, dest, dstart, dend); + } + } + } + +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HueSatView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HueSatView.java new file mode 100644 index 000000000..6a83f79a0 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/HueSatView.java @@ -0,0 +1,205 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PointF; +import android.graphics.Rect; +import android.graphics.RectF; +import android.os.Build; +import android.util.DisplayMetrics; +import android.view.MotionEvent; + +public class HueSatView extends SquareView implements ColorObserver { + + private Paint borderPaint; + private Paint pointerPaint; + private Path pointerPath; + private Path borderPath; + private Rect viewRect = new Rect(); + private int w; + private int h; + + // Bitmap is generated once and shared across instances. + private static Bitmap bitmap; + + private final PointF pointer = new PointF(); + private ObservableColor observableColor = new ObservableColor(0); + + public HueSatView(Context context) { + super(context); + + borderPaint = Resources.makeLinePaint(); + pointerPaint = Resources.makeLinePaint(); + pointerPaint.setColor(0xff000000); + pointerPath = Resources.makePointerPath(); + borderPath = new Path(); + if (bitmap == null) { + bitmap = makeBitmap(optimalBitmapSize()); + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + // Need clipPath() and setLayerType()... + throw new UnsupportedOperationException("Android API 10 and below is not supported."); + } + else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { + // clipPath() is only supported on a software layer. + setLayerType(LAYER_TYPE_SOFTWARE, null); + } + } + + private int optimalBitmapSize() { + final int scale = 2; + final int maxBitmapSize = 128; + final DisplayMetrics dm = getResources().getDisplayMetrics(); + return Math.min(maxBitmapSize, Math.min(dm.widthPixels, dm.heightPixels) / scale); + } + + public void observeColor(ObservableColor observableColor) { + this.observableColor = observableColor; + observableColor.addObserver(this); + } + + @Override + public void updateColor(ObservableColor observableColor) { + setPointer(pointer, observableColor.getHue(), observableColor.getSat(), w); + optimisePointerColor(); + invalidate(); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + this.w = w; + this.h = h; + viewRect.set(0, 0, w, h); + + float inset = borderPaint.getStrokeWidth() / 2; + makeBorderPath(borderPath, w, h, inset); + + // Sets pointer position + updateColor(observableColor); + } + + private static void makeBorderPath(Path borderPath, int w, int h, float inset) { + w -= inset; + h -= inset; + borderPath.reset(); + borderPath.moveTo(w, inset); + borderPath.lineTo(w, h); + borderPath.lineTo(inset, h); + borderPath.addArc(new RectF(inset, inset, 2 * w, 2 * h), 180, 270); + borderPath.close(); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + int action = event.getActionMasked(); + switch (action) { + case MotionEvent.ACTION_DOWN: + boolean withinPicker = clamp(pointer, event.getX(), event.getY(), true); + if (withinPicker) update(); + return withinPicker; + case MotionEvent.ACTION_MOVE: + clamp(pointer, event.getX(), event.getY(), false); + update(); + getParent().requestDisallowInterceptTouchEvent(true); + return true; + } + return super.onTouchEvent(event); + } + + private void update() { + observableColor.updateHueSat( + hueForPos(pointer.x, pointer.y, w), + satForPos(pointer.x, pointer.y, w), + this); + optimisePointerColor(); + invalidate(); + } + + private boolean clamp(PointF pointer, float x, float y, boolean rejectOutside) { + x = Math.min(x, w); + y = Math.min(y, h); + final float dx = w - x; + final float dy = h - y; + final float r = (float)Math.sqrt(dx * dx + dy * dy); + boolean outside = r > w; + if (!outside || !rejectOutside) { + if (outside) { + x = w - dx * w / r; + y = w - dy * w / r; + } + pointer.set(x, y); + } + return !outside; + } + + private void optimisePointerColor() { + pointerPaint.setColor( + observableColor.getLightnessWithValue(1) > 0.5 + ? 0xff000000 : 0xffffffff); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + canvas.save(); + + canvas.clipPath(borderPath); + canvas.drawBitmap(bitmap, null, viewRect, null); + canvas.translate(pointer.x, pointer.y); + canvas.drawPath(pointerPath, pointerPaint); + + canvas.restore(); + + canvas.drawPath(borderPath, borderPaint); + } + + private static Bitmap makeBitmap(int radiusPx) { + int[] colors = new int[radiusPx * radiusPx]; + float[] hsv = new float[]{0f, 0f, 1f}; + for (int y = 0; y < radiusPx; ++y) { + for (int x = 0; x < radiusPx; ++x) { + final int i = x + y * radiusPx; + final float sat = satForPos(x, y, radiusPx); + final float arcBleed = 2f / radiusPx; // extend curved edge pixels just outside clip area. + if (sat <= 1 + arcBleed) { + hsv[0] = hueForPos(x, y, radiusPx); + hsv[1] = sat; + colors[i] = Color.HSVToColor(0xff, hsv); + } + } + } + return Bitmap.createBitmap(colors, radiusPx, radiusPx, Bitmap.Config.ARGB_8888); + } + + private static float hueForPos(float x, float y, float radiusPx) { + final double r = radiusPx - 1; // gives values 0...1 inclusive + final double dx = (r - x) / r; + final double dy = (r - y) / r; + final double angle = Math.atan2(dy, dx); + final double hue = 360 * angle / (Math.PI / 2); + return (float)hue; + } + + private static float satForPos(float x, float y, float radiusPx) { + final double r = radiusPx - 1; // gives values 0...1 inclusive + final double dx = (r - x) / r; + final double dy = (r - y) / r; + final double sat = dx * dx + dy * dy; // leave it squared -- exaggerates pale colors + return (float)sat; + } + + private static void setPointer(PointF pointer, float hue, float sat, float radiusPx) { + final float r = radiusPx - 1; // for values 0...1 inclusive + final double distance = r * Math.sqrt(sat); + final double angle = hue / 360 * Math.PI / 2; + final double dx = distance * Math.cos(angle); + final double dy = distance * Math.sin(angle); + pointer.set(r - (float)dx, r - (float)dy); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ObservableColor.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ObservableColor.java new file mode 100644 index 000000000..8cf482ec1 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ObservableColor.java @@ -0,0 +1,97 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +import android.graphics.Color; + +import java.util.ArrayList; +import java.util.List; + +public class ObservableColor { + + // Store as HSV & A, otherwise round-trip to int causes color drift. + private final float[] hsv = {0, 0, 0}; + private int alpha; + private final List observers = new ArrayList(); + + public ObservableColor(int color) { + Color.colorToHSV(color, hsv); + alpha = Color.alpha(color); + } + + public void getHsv(float hsvOut[]) { + hsvOut[0] = hsv[0]; + hsvOut[1] = hsv[1]; + hsvOut[2] = hsv[2]; + } + + public int getColor() { + return Color.HSVToColor(alpha, hsv); + } + + public float getHue() { + return hsv[0]; + } + + public float getSat() { + return hsv[1]; + } + + public float getValue() { + return hsv[2]; + } + + public int getAlpha() { + return alpha; + } + + public float getLightness() { + return getLightnessWithValue(hsv[2]); + } + + public float getLightnessWithValue(float value) { + float[] hsV = {hsv[0], hsv[1], value}; + final int color = Color.HSVToColor(hsV); + return (Color.red(color) * 0.2126f + Color.green(color) * 0.7152f + Color.blue(color) * 0.0722f)/0xff; + } + + public void addObserver(ColorObserver observer) { + observers.add(observer); + } + + public void updateHueSat(float hue, float sat, ColorObserver sender) { + hsv[0] = hue; + hsv[1] = sat; + notifyOtherObservers(sender); + } + + public void updateValue(float value, ColorObserver sender) { + hsv[2] = value; + notifyOtherObservers(sender); + } + + public void updateAlpha(int alpha, ColorObserver sender) { + this.alpha = alpha; + notifyOtherObservers(sender); + } + + public void updateColor(int color, ColorObserver sender) { + Color.colorToHSV(color, hsv); + alpha = Color.alpha(color); + notifyOtherObservers(sender); + } + + public void updateColor(int alpha, float hue, float sat, float bri, ColorObserver sender) { + this.alpha = alpha; + hsv[0] = hue; + hsv[1] = sat; + hsv[2] = bri; + notifyOtherObservers(sender); + } + + private void notifyOtherObservers(ColorObserver sender) { + for (ColorObserver observer : observers) { + if (observer != sender) { + observer.updateColor(this); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/Resources.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/Resources.java new file mode 100644 index 000000000..df66096d3 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/Resources.java @@ -0,0 +1,46 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +import static ru.vtosters.lite.utils.AndroidUtils.dp2px; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.BitmapShader; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Shader; + +import ru.vtosters.lite.utils.AndroidUtils; + +class Resources { + + private static final float LINE_WIDTH_DIP = 1.5f; + private static final float POINTER_RADIUS_DIP = 7; + private static final int VIEW_OUTLINE_COLOR = 0xff808080; + + public static Paint makeLinePaint() { + Paint paint = new Paint(); + paint.setColor(VIEW_OUTLINE_COLOR); + paint.setStrokeWidth(dp2px(LINE_WIDTH_DIP)); + paint.setStyle(Paint.Style.STROKE); + paint.setAntiAlias(true); + return paint; + } + + public static Paint makeCheckerPaint(Context context) { + Paint paint = new Paint(); + final Bitmap checkerBmp = BitmapFactory.decodeResource(context.getResources(), AndroidUtils.getIdentifier("checker_background", "drawable")); + paint.setShader(new BitmapShader(checkerBmp, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)); + paint.setStrokeWidth(dp2px(LINE_WIDTH_DIP)); + paint.setStyle(Paint.Style.FILL); + paint.setAntiAlias(true); + return paint; + } + + public static Path makePointerPath() { + Path pointerPath = new Path(); + final float radiusPx = dp2px(POINTER_RADIUS_DIP); + pointerPath.addCircle(0, 0, radiusPx, Path.Direction.CW); + return pointerPath; + } +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SliderViewBase.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SliderViewBase.java new file mode 100644 index 000000000..90e28b064 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SliderViewBase.java @@ -0,0 +1,112 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Rect; +import android.graphics.RectF; +import android.view.MotionEvent; +import android.view.View; + +public abstract class SliderViewBase extends View { + + private final Paint borderPaint; + private final Paint checkerPaint; + private final Rect viewRect = new Rect(); + private int w; + private int h; + private final Path borderPath; + private Bitmap bitmap; + private final Path pointerPath; + private final Paint pointerPaint; + + private float currentPos; + + public SliderViewBase(Context context) { + super(context); + checkerPaint = Resources.makeCheckerPaint(context); + borderPaint = Resources.makeLinePaint(); + pointerPaint = Resources.makeLinePaint(); + pointerPath = Resources.makePointerPath(); + borderPath = new Path(); + } + + protected abstract void notifyListener(float currentPos); + + protected abstract Bitmap makeBitmap(int w, int h); + + protected abstract int getPointerColor(float currentPos); + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + this.w = w; + this.h = h; + viewRect.set(0, 0, w, h); + float inset = borderPaint.getStrokeWidth() / 2; + borderPath.reset(); + borderPath.addRect(new RectF(inset, inset, w - inset, h - inset), Path.Direction.CW); + updateBitmap(); + } + + protected void setPos(float pos) { + currentPos = pos; + optimisePointerColor(); + } + + protected void updateBitmap() { + if (w > 0 && h > 0) { + bitmap = makeBitmap(w, h); + optimisePointerColor(); + } + // else not ready yet + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + int action = event.getActionMasked(); + switch (action) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_MOVE: + currentPos = valueForTouchPos(event.getX(), event.getY()); + optimisePointerColor(); + notifyListener(currentPos); + invalidate(); + getParent().requestDisallowInterceptTouchEvent(true); + return true; + } + return super.onTouchEvent(event); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawPath(borderPath, checkerPaint); + canvas.drawBitmap(bitmap, null, viewRect, null); + canvas.drawPath(borderPath, borderPaint); + + canvas.save(); + if (isWide()) { + canvas.translate(w * currentPos, h / 2); + } + else { + canvas.translate(w / 2, h * (1 - currentPos)); + } + canvas.drawPath(pointerPath, pointerPaint); + canvas.restore(); + } + + private boolean isWide() { + return w > h; + } + + private float valueForTouchPos(float x, float y) { + final float val = isWide() ? x / w : 1 - y / h; + return Math.max(0, Math.min(1, val)); + } + + private void optimisePointerColor() { + pointerPaint.setColor(getPointerColor(currentPos)); + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SquareView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SquareView.java new file mode 100644 index 000000000..813aaee6c --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SquareView.java @@ -0,0 +1,38 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +import static ru.vtosters.lite.utils.AndroidUtils.dp2px; + +import android.content.Context; +import android.view.View; + +class SquareView extends View { + private static final int MIN_SIZE_DIP = 200; + + private final int minSizePx; + + public SquareView(Context context) { + super(context); + minSizePx = dp2px(MIN_SIZE_DIP); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // Constrain to square + final int w = MeasureSpec.getSize(widthMeasureSpec); + final int h = MeasureSpec.getSize(heightMeasureSpec); + final int modeW = MeasureSpec.getMode(widthMeasureSpec); + final int modeH = MeasureSpec.getMode(heightMeasureSpec); + int size = minSizePx; + if (modeW == MeasureSpec.UNSPECIFIED) { + size = h; + } + else if (modeH == MeasureSpec.UNSPECIFIED) { + size = w; + } + else { + size = Math.min(w, h); + } + size = Math.max(size, minSizePx); + setMeasuredDimension(size, size); + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SwatchView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SwatchView.java new file mode 100644 index 000000000..e2c9cf909 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/SwatchView.java @@ -0,0 +1,125 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; + +import ru.vtosters.lite.utils.AndroidUtils; + +public class SwatchView extends SquareView implements ColorObserver { + + private final Paint borderPaint; + private final Path borderPath; + private final Paint checkerPaint; + private final Path oldFillPath; + private final Path newFillPath; + private final Paint oldFillPaint; + private final Paint newFillPaint; + private final float radialMarginPx; + + public SwatchView(Context context) { + super(context); + + radialMarginPx = AndroidUtils.dp2px(16); + + borderPaint = Resources.makeLinePaint(); + checkerPaint = Resources.makeCheckerPaint(context); + oldFillPaint = new Paint(); + newFillPaint = new Paint(); + + borderPath = new Path(); + oldFillPath = new Path(); + newFillPath = new Path(); + } + + void setOriginalColor(int color) { + oldFillPaint.setColor(color); + invalidate(); + } + + void observeColor(ObservableColor observableColor) { + observableColor.addObserver(this); + } + + @Override + public void updateColor(ObservableColor observableColor) { + newFillPaint.setColor(observableColor.getColor()); + invalidate(); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + // We expect to be stacked behind a square HueSatView and fill the top left corner. + + final float inset = borderPaint.getStrokeWidth() / 2; + final float r = Math.min(w, h); + + // Trim the corners of the swatch is where it is radialMarginPx thick. + // find how long the outeredges are: + final float margin = radialMarginPx; + final float diagonal = r + 2 * margin; + final float opp = (float)Math.sqrt(diagonal * diagonal - r * r); + final float edgeLen = r - opp; + + // Arc angles for drawing CCW + final float outerAngle = (float)Math.toDegrees(Math.atan2(opp, r)); + final float startAngle = 270 - outerAngle; + // Sweep angle for each half of the swatch: + final float sweepAngle = outerAngle - 45; + // Sweep angle for the smooth corners: + final float cornerSweepAngle = 90 - outerAngle; + + // Outer border: + beginBorder(borderPath, inset, edgeLen, margin, cornerSweepAngle); + mainArc(borderPath, r, margin, startAngle, 2 * sweepAngle); + endBorder(borderPath, inset, edgeLen, margin, cornerSweepAngle); + + // Old fill shape: + oldFillPath.reset(); + oldFillPath.moveTo(inset, inset); + mainArc(oldFillPath, r, margin, 225, sweepAngle); + endBorder(oldFillPath, inset, edgeLen, margin, cornerSweepAngle); + + // New fill shape: + beginBorder(newFillPath, inset, edgeLen, margin, cornerSweepAngle); + mainArc(newFillPath, r, margin, startAngle, sweepAngle); + newFillPath.lineTo(inset, inset); + newFillPath.close(); + } + + private static void beginBorder(Path path, float inset, float edgeLen, float cornerRadius, float cornerSweepAngle) { + path.reset(); + path.moveTo(inset, inset); + cornerArc(path, edgeLen, inset, cornerRadius-inset, 0, cornerSweepAngle); + } + + private static void endBorder(Path path, float inset, float edgeLen, float cornerRadius, float cornerSweepAngle) { + cornerArc(path, inset, edgeLen, cornerRadius - inset, 90 - cornerSweepAngle, cornerSweepAngle); + path.lineTo(inset, inset); + path.close(); + } + + private static void cornerArc(Path path, float cx, float cy, float r, float startAngle, float sweepAngle) { + final RectF ovalRect = new RectF(-r, -r, r, r); + ovalRect.offset(cx, cy); + path.arcTo(ovalRect, startAngle, sweepAngle); + } + + private static void mainArc(Path path, float viewSize, float margin, float startAngle, float sweepAngle) { + float r = viewSize + margin; + final RectF ovalRect = new RectF(-r, -r, r, r); + ovalRect.offset(viewSize, viewSize); + path.arcTo(ovalRect, startAngle, sweepAngle); + } + + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawPath(borderPath, checkerPaint); + canvas.drawPath(oldFillPath, oldFillPaint); + canvas.drawPath(newFillPath, newFillPaint); + canvas.drawPath(borderPath, borderPaint); + } + +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ValueView.java b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ValueView.java new file mode 100644 index 000000000..ad4444f15 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/views/rarepebble/ValueView.java @@ -0,0 +1,56 @@ +package ru.vtosters.lite.ui.views.rarepebble; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Color; + +public class ValueView extends SliderViewBase implements ColorObserver { + + private ObservableColor observableColor = new ObservableColor(0); + + public ValueView(Context context) { + super(context); + } + + public void observeColor(ObservableColor observableColor) { + this.observableColor = observableColor; + observableColor.addObserver(this); + } + + @Override + public void updateColor(ObservableColor observableColor) { + setPos(this.observableColor.getValue()); + updateBitmap(); + invalidate(); + } + + @Override + protected void notifyListener(float currentPos) { + observableColor.updateValue(currentPos, this); + } + + @Override + protected int getPointerColor(float currentPos) { + float brightColorLightness = observableColor.getLightness(); + float posLightness = currentPos * brightColorLightness; + return posLightness > 0.5f ? 0xff000000 : 0xffffffff; + } + + protected Bitmap makeBitmap(int w, int h) { + final boolean isWide = w > h; + final int n = Math.max(w, h); + int[] colors = new int[n]; + + float[] hsv = new float[]{0, 0, 0}; + observableColor.getHsv(hsv); + + for (int i = 0; i < n; ++i) { + hsv[2] = isWide ? (float)i / n : 1 - (float)i / n; + colors[i] = Color.HSVToColor(hsv); + } + final int bmpWidth = isWide ? w : 1; + final int bmpHeight = isWide ? 1 : h; + return Bitmap.createBitmap(colors, bmpWidth, bmpHeight, Bitmap.Config.ARGB_8888); + } + +} \ No newline at end of file diff --git a/smali/res/drawable/checker_background.png b/smali/res/drawable/checker_background.png new file mode 100644 index 0000000000000000000000000000000000000000..284f906952a8d591d0b4a4c919d9e6fb046c12d4 GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoEX7WqAsj$Z!;#Vf4nJ zNUsNB#yF{oGC)De64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq!<_&xjbDQ zLn`LHy>pQBhyf47!6!TR`D&G0dBi0to)J-C>8^Ksey>`-dEM(-GWBb=x;^)Q|6h9U zIc>%yrXwsJoC3lMY7RaPGZ+l<3cPuL|J>%6fA Date: Fri, 2 Dec 2022 18:45:40 +0300 Subject: [PATCH 45/95] update ModalBottomSheetWrapper --- .../ui/components/NewsfeedListManager.java | 2 +- .../vtosters/lite/ui/dialogs/OTADialog.java | 26 +++---- .../lite/ui/vkui/ModalBottomSheetWrapper.java | 73 +++++++------------ .../lite/ui/vkui/VBottomSheetBuilder.java | 5 +- 4 files changed, 43 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/ru/vtosters/lite/ui/components/NewsfeedListManager.java b/app/src/main/java/ru/vtosters/lite/ui/components/NewsfeedListManager.java index 3266ffa04..5901db7c7 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/components/NewsfeedListManager.java +++ b/app/src/main/java/ru/vtosters/lite/ui/components/NewsfeedListManager.java @@ -50,7 +50,7 @@ public class NewsfeedListManager { sendToast(activity.getString(R.string.newsfeed_list_update_feed_to_work)); } ) - )); + ), "newsfeed_items_editor"); } public static void resetHideItems() { diff --git a/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java b/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java index d4def7cc8..5823a535d 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java +++ b/app/src/main/java/ru/vtosters/lite/ui/dialogs/OTADialog.java @@ -26,22 +26,22 @@ public class OTADialog implements OTAUtils.OTAListener { @Override public void onUpdateApplied() { - mActivity.runOnUiThread(() -> { - // Toast.makeText(mActivity, "Обновления найдены", Toast.LENGTH_SHORT).show(); - new ModalBottomSheetWrapper(mActivity) - .setTitle(mActivity.getString(R.string.newversion) + " " + mHelper.getNewVersionName()) - .setUpdateInfoView(mHelper.getUpdateDescription()) - .setPositiveButton(mActivity.getString(R.string.updateanddownload), () -> { - OTADownloader.downloadBuild(mHelper.getDownloadUrl(), mHelper.getCommitSHA()); - }) - .show(); - }); +// mActivity.runOnUiThread(() -> { +// // Toast.makeText(mActivity, "Обновления найдены", Toast.LENGTH_SHORT).show(); +// new ModalBottomSheetWrapper(mActivity) +// .setTitle(mActivity.getString(R.string.newversion) + " " + mHelper.getNewVersionName()) +// .setUpdateInfoView(mHelper.getUpdateDescription()) +// .setPositiveButton(mActivity.getString(R.string.updateanddownload), () -> { +// OTADownloader.downloadBuild(mHelper.getDownloadUrl(), mHelper.getCommitSHA()); +// }) +// .show(); +// }); } @Override public void onUpdateCanceled() { - mActivity.runOnUiThread(() -> { - // Toast.makeText(mActivity, "Обновлений не найдено", Toast.LENGTH_SHORT).show(); - }); +// mActivity.runOnUiThread(() -> { +// // Toast.makeText(mActivity, "Обновлений не найдено", Toast.LENGTH_SHORT).show(); +// }); } } diff --git a/app/src/main/java/ru/vtosters/lite/ui/vkui/ModalBottomSheetWrapper.java b/app/src/main/java/ru/vtosters/lite/ui/vkui/ModalBottomSheetWrapper.java index dba0ecdee..1e3e2a6f7 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/vkui/ModalBottomSheetWrapper.java +++ b/app/src/main/java/ru/vtosters/lite/ui/vkui/ModalBottomSheetWrapper.java @@ -1,76 +1,55 @@ package ru.vtosters.lite.ui.vkui; -import static ru.vtosters.lite.utils.AndroidUtils.dp2px; -import static ru.vtosters.lite.utils.AndroidUtils.getGlobalContext; -import static ru.vtosters.lite.utils.ThemesUtils.getTextAttr; - -import android.annotation.SuppressLint; import android.app.Activity; import android.view.View; -import android.widget.LinearLayout; -import android.widget.TextView; import com.vk.core.dialogs.bottomsheet.ModalBottomSheet; -import com.vtosters.lite.R; -public class ModalBottomSheetWrapper { - public final ModalBottomSheet.a builder; +public class ModalBottomSheetWrapper { + public final ModalBottomSheet.a mBuilder; + public ModalBottomSheet mBottomSheet; public ModalBottomSheetWrapper(Activity activity) { - builder = new ModalBottomSheet.a(activity); + mBuilder = new ModalBottomSheet.a(activity); } - public ModalBottomSheetWrapper setTitle(String title) { - builder.d(title); - return this; + public T setTitle(String title) { + mBuilder.d(title); + return (T) this; } - @SuppressLint("SetTextI18n") - public ModalBottomSheetWrapper setUpdateInfoView(String changelog) { - var context = getGlobalContext(); - var container = new LinearLayout(context); - var changelogView = new TextView(context); - - container.setOrientation(LinearLayout.VERTICAL); - - changelogView.setPadding(0, dp2px(8), 0, 0); - changelogView.setText(context.getString(R.string.changelog) + ": \n" + changelog); - changelogView.setTextColor(getTextAttr()); - container.addView(changelogView, new LinearLayout.LayoutParams(-1, -2)); - - builder.a(container); - - return this; - } - - public ModalBottomSheetWrapper setClickableMessage( + public T setClickableMessage( String text, Runnable callback ) { - builder.a(text, listener -> callback.run()); - return this; + mBuilder.a(text, listener -> callback.run()); + return (T) this; } - public ModalBottomSheetWrapper setPositiveButton( + public T setPositiveButton( String text, Runnable callback ) { - builder.a(text, kostil -> callback.run()); - return this; + mBuilder.a(text, kostil -> callback.run()); + return (T) this; } - public ModalBottomSheetWrapper setView(View view) { - builder.a(view); - return this; + public T setView(View view) { + mBuilder.a(view); + return (T) this; } - public ModalBottomSheet show() { - return builder.a(""); + public ModalBottomSheet show(String tag) { + return mBuilder.a(tag); } - public ModalBottomSheet show(boolean isCancellable) { - var sheet = builder.a(""); - sheet.setCancelable(isCancellable); - return sheet; + public ModalBottomSheet show(String tag, boolean isCancellable) { + mBottomSheet = mBuilder.a(tag); + mBottomSheet.setCancelable(isCancellable); + return mBottomSheet; + } + + public void dismiss() { + mBottomSheet.dismiss(); } } diff --git a/app/src/main/java/ru/vtosters/lite/ui/vkui/VBottomSheetBuilder.java b/app/src/main/java/ru/vtosters/lite/ui/vkui/VBottomSheetBuilder.java index dfafff93d..a3131ee20 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/vkui/VBottomSheetBuilder.java +++ b/app/src/main/java/ru/vtosters/lite/ui/vkui/VBottomSheetBuilder.java @@ -8,7 +8,7 @@ import android.view.View; import androidx.annotation.Nullable; public class VBottomSheetBuilder { - public static void show(Activity activity, VBSContent content) { + public static void show(Activity activity, VBSContent content, String tag) { ModalBottomSheetWrapper builder = new ModalBottomSheetWrapper(activity); builder.setView(content.view); @@ -20,9 +20,10 @@ public class VBottomSheetBuilder { new Handler(Looper.getMainLooper()).post(content.button.action); }); // Positive - builder.show(); // Build+Show + builder.show(tag); // Build+Show } + public static class VBSContent { public String title; @Nullable From 810e5c72c1f87fbf264321631aeaebca8e01a466 Mon Sep 17 00:00:00 2001 From: Vologhat Date: Fri, 2 Dec 2022 18:48:22 +0300 Subject: [PATCH 46/95] add palettes --- .../vtosters/lite/themes/items/VTLColor.java | 26 + .../lite/themes/items/VTLPalette.java | 94 + .../lite/themes/palettes/PalettesManager.java | 98 + .../lite/ui/adapters/ColorPickerAdapter.java | 81 + .../ui/dialogs/PalettesBottomSheetDialog.java | 22 + .../VTColorPickerBottomSheetDialog.java | 41 + .../assets/vtl_themes/palettes/html_w3c.json | 2387 +++++++++++++++++ .../assets/vtl_themes/palettes/material.json | 1118 ++++++++ smali/res/layout/color_picker_item.xml | 48 + smali/res/values/public.xml | 4 + 10 files changed, 3919 insertions(+) create mode 100644 app/src/main/java/ru/vtosters/lite/themes/items/VTLColor.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/items/VTLPalette.java create mode 100644 app/src/main/java/ru/vtosters/lite/themes/palettes/PalettesManager.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/adapters/ColorPickerAdapter.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/dialogs/PalettesBottomSheetDialog.java create mode 100644 app/src/main/java/ru/vtosters/lite/ui/dialogs/VTColorPickerBottomSheetDialog.java create mode 100644 smali/assets/vtl_themes/palettes/html_w3c.json create mode 100644 smali/assets/vtl_themes/palettes/material.json create mode 100644 smali/res/layout/color_picker_item.xml diff --git a/app/src/main/java/ru/vtosters/lite/themes/items/VTLColor.java b/app/src/main/java/ru/vtosters/lite/themes/items/VTLColor.java new file mode 100644 index 000000000..1c086ee17 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/items/VTLColor.java @@ -0,0 +1,26 @@ +package ru.vtosters.lite.themes.items; + +public class VTLColor { + + public String resName; + public int id; + public int color; + + public VTLColor(int id, int color) { + this.id = id; + this.color = color; + } + public VTLColor(String resName, int id, int color) { + this.resName = resName; + this.id = id; + this.color = color; + } + + public static VTLColor create(int id, int color) { + return new VTLColor(id, color); + } + + public static VTLColor create(String resName, int id, int color) { + return new VTLColor(resName, id, color); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/themes/items/VTLPalette.java b/app/src/main/java/ru/vtosters/lite/themes/items/VTLPalette.java new file mode 100644 index 000000000..19d723329 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/items/VTLPalette.java @@ -0,0 +1,94 @@ +package ru.vtosters.lite.themes.items; + +import android.graphics.Color; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class VTLPalette { + public String id; + public String name; + public String author; + public List colors = new ArrayList<>(); + + public VTLPalette() { + + } + + public VTLPalette(String id, String name, String author, List colors) { + this.id = id; + this.name = name; + this.author = author; + this.colors = colors; + } + + public VTLPalette setId(String id) { + this.id = id; + return this; + } + + public VTLPalette setName(String name) { + this.name = name; + return this; + } + + public VTLPalette setAuthor(String author) { + this.author = author; + return this; + } + + public VTLPalette setColors(List colors) { + this.colors = colors; + return this; + } + + public VTLPalette setColor(String name, int color) { + this.colors.add(new VTLColor(name, 0, color)); + return this; + } + + public int getColor(String name) { + for (var item : colors) + if (name.equals(item.resName)) + return item.color; + return -1; + } + + public static VTLPalette fromJson(JSONObject json) throws JSONException { + var palette = new VTLPalette() + .setId(json.optString("palette_id")) + .setName(json.optString("name")) + .setAuthor(json.optString("author")); + var paletteNode = json.getJSONArray("palette"); + for (int i = 0; i < paletteNode.length(); i++) { + var colorNode = paletteNode.getJSONObject(i); + var name = colorNode.getString("name"); + if (colorNode.has("colors")) { + var colorsNode = colorNode.getJSONArray("colors"); + for (int j = 0; j < colorsNode.length(); j++) { + var subColorNode = colorsNode.getJSONObject(j); + var index = subColorNode.getString("index"); + var subColor = subColorNode.getString("color"); + if (!subColor.startsWith("#")) subColor = "#" + subColor; + palette.setColor(name + " " + index, Color.parseColor(subColor)); + } + } else { + var color = colorNode.getString("color"); + if (!color.startsWith("#")) color = "#" + color; + palette.setColor(name, Color.parseColor(color)); + } + } + return palette; + } + + public static VTLPalette valuesOf(String id, String name, String author, List colors) { + return new VTLPalette() + .setId(id) + .setName(name) + .setAuthor(author) + .setColors(colors); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/themes/palettes/PalettesManager.java b/app/src/main/java/ru/vtosters/lite/themes/palettes/PalettesManager.java new file mode 100644 index 000000000..5e6184374 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/themes/palettes/PalettesManager.java @@ -0,0 +1,98 @@ +package ru.vtosters.lite.themes.palettes; + +import android.os.Environment; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import ru.vtosters.lite.themes.items.VTLPalette; +import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.IOUtils; + +public class PalettesManager { + + private final static File PALETTES_DIR = new File(Environment.getExternalStorageDirectory(), "VTL/palettes"); + private final static String ASSETS_DIR = "vtl_themes/palettes/"; + + private static PalettesManager sInstance; + + private final List mPalettes = new ArrayList<>(); + + public static PalettesManager getInstance() { + if (sInstance == null) + sInstance = new PalettesManager(); + return sInstance; + } + + public PalettesManager() { + load(); + } + + public void load() { + mPalettes.clear(); + if (!PALETTES_DIR.exists()) + PALETTES_DIR.mkdirs(); + final var palettes = PALETTES_DIR.listFiles((dir, name) -> name.endsWith(".json")); + if (palettes == null || palettes.length == 0) + copyPaletteFromAssets(); + parsePalettes(); + } + + private boolean copyPaletteFromAssets() { + try { + final var manager = AndroidUtils.getGlobalContext().getAssets(); + final var assets = manager.list(ASSETS_DIR); + if (assets == null || assets.length == 0) return false; + for (var asset : assets) { + try { + IOUtils.copyFile(manager.open(ASSETS_DIR + asset), new File(PALETTES_DIR, asset)); + } catch (IOException e) { + e.printStackTrace(); + } + } + return true; + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + private void parsePalettes() { + var arr = PALETTES_DIR.listFiles((dir, name) -> name.endsWith(".json")); + if (arr == null || arr.length == 0) + throw new RuntimeException("Can't load palettes"); + for (var file : arr) { + try { + var json = new JSONObject(IOUtils.readAllLines(file)); + mPalettes.add(VTLPalette.fromJson(json)); + } catch (IOException | JSONException e) { + e.printStackTrace(); + } + } + } + + @Nullable + public VTLPalette getPalette(String id) { + for (var palette : mPalettes) + if (id.equals(palette.id)) + return palette; + return null; + } + + @NonNull + public VTLPalette getPalette(int i) { + return mPalettes.get(i); + } + + public int getPalettesCount() { + return mPalettes.size(); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/adapters/ColorPickerAdapter.java b/app/src/main/java/ru/vtosters/lite/ui/adapters/ColorPickerAdapter.java new file mode 100644 index 000000000..38239838f --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/adapters/ColorPickerAdapter.java @@ -0,0 +1,81 @@ +package ru.vtosters.lite.ui.adapters; + +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.vk.core.drawable.BorderDrawable; +import com.vk.core.util.Screen; +import com.vk.stories.view.StoryCircleImageView; + +import java.util.List; + +import ru.vtosters.lite.themes.items.VTLColor; +import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.lite.utils.ThemesUtils; + +public class ColorPickerAdapter extends RecyclerView.Adapter { + + private List mColors; + private OnColorSelectListener mSelectListener; + + public ColorPickerAdapter(List colors, OnColorSelectListener selectListener) { + this.mColors = colors; + this.mSelectListener = selectListener; + } + + @NonNull + @Override + public ColorPickerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + var container = LayoutInflater.from(parent.getContext()) + .inflate(AndroidUtils.getIdentifier("color_picker_item", "layout"), parent, false); + return new ColorPickerViewHolder(container); + } + + @Override + public void onBindViewHolder(@NonNull ColorPickerViewHolder holder, int pos) { + holder.bind(mColors.get(pos)); + } + + @Override + public int getItemCount() { + return mColors.size(); + } + + public class ColorPickerViewHolder extends RecyclerView.ViewHolder { + private View mContainer; + private FrameLayout mColorPreviewBorder; + private StoryCircleImageView mColorPreview; + private TextView mColorName; + private TextView mColorValue; + + public ColorPickerViewHolder(@NonNull View view) { + super(view); + + mContainer = view; + mColorPreviewBorder = view.findViewById(AndroidUtils.getIdentifier("color_preview_border", "id")); + mColorPreview = view.findViewById(AndroidUtils.getIdentifier("color_preview", "id")); + mColorName = view.findViewById(AndroidUtils.getIdentifier("color_name", "id")); + mColorValue = view.findViewById(AndroidUtils.getIdentifier("color_value", "id")); + } + + public void bind(VTLColor item) { + mContainer.setOnClickListener(v -> mSelectListener.onColorSelected(ColorPickerAdapter.this, item)); + mColorPreviewBorder.setBackground(new BorderDrawable(ThemesUtils.isDarkTheme() ? Color.WHITE : Color.BLACK, Screen.c(24.0f), Screen.c(1.0f))); + mColorPreview.setPlaceholderColor(item.color); + mColorName.setText(item.resName); + mColorValue.setText("#" + Integer.toHexString(item.color).toUpperCase()); + } + } + + public interface OnColorSelectListener { + + void onColorSelected(ColorPickerAdapter adapter, VTLColor vtlcolor); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/dialogs/PalettesBottomSheetDialog.java b/app/src/main/java/ru/vtosters/lite/ui/dialogs/PalettesBottomSheetDialog.java new file mode 100644 index 000000000..9f2fb0b6f --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/dialogs/PalettesBottomSheetDialog.java @@ -0,0 +1,22 @@ +package ru.vtosters.lite.ui.dialogs; + +import android.app.Activity; + +import ru.vtosters.lite.themes.items.VTLPalette; +import ru.vtosters.lite.ui.adapters.ColorPickerAdapter; + +public class PalettesBottomSheetDialog { + + private static final String TAG = "palettes_copy_color"; + + public static void create(Activity activity, VTLPalette palette, ColorPickerAdapter.OnColorSelectListener action) { + var instance = new VTColorPickerBottomSheetDialog(activity); + var colorPickerAdapter = new ColorPickerAdapter(palette.colors, (adapter, vtlcolor) -> { + action.onColorSelected(adapter, vtlcolor); + instance.dismiss(); + }); + instance.setTitle(palette.name) + .setAdapter(colorPickerAdapter, true) + .show(TAG, true); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/dialogs/VTColorPickerBottomSheetDialog.java b/app/src/main/java/ru/vtosters/lite/ui/dialogs/VTColorPickerBottomSheetDialog.java new file mode 100644 index 000000000..8444ca3d1 --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/dialogs/VTColorPickerBottomSheetDialog.java @@ -0,0 +1,41 @@ +package ru.vtosters.lite.ui.dialogs; + +import android.app.Activity; +import android.widget.LinearLayout; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import ru.vtosters.lite.ui.adapters.ColorPickerAdapter; +import ru.vtosters.lite.ui.vkui.ModalBottomSheetWrapper; +import ru.vtosters.lite.utils.LayoutUtils; + +public class VTColorPickerBottomSheetDialog extends ModalBottomSheetWrapper { + + private Activity mActivity; + private LinearLayout mContainer; + + public VTColorPickerBottomSheetDialog(Activity activity) { + super(activity); + this.mActivity = activity; + mContainer = new LinearLayout(mActivity); + mContainer.setLayoutParams(LayoutUtils.createLinear(-1, -1)); + mContainer.setOrientation(LinearLayout.VERTICAL); + } + + public VTColorPickerBottomSheetDialog setAdapter(ColorPickerAdapter adapter, boolean searchMode) { + var recyclerView = new RecyclerView(mActivity); + recyclerView.setAdapter(adapter); + recyclerView.setHasFixedSize(true); + recyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); + var recyclerViewParams = LayoutUtils.createLinear(-1, -1); + mContainer.addView(recyclerView, recyclerViewParams); + + mBuilder.a(mContainer); + return setView(mContainer); + } + + public LinearLayout getContainer() { + return mContainer; + } +} diff --git a/smali/assets/vtl_themes/palettes/html_w3c.json b/smali/assets/vtl_themes/palettes/html_w3c.json new file mode 100644 index 000000000..e74e4028b --- /dev/null +++ b/smali/assets/vtl_themes/palettes/html_w3c.json @@ -0,0 +1,2387 @@ +{ + "palette_id": "html_w3c", + "name": "HTML W3C Palette", + "author": "Vologhat", + "palette": [ + { + "name": "Black (W3C)", + "color": "000000" + }, + { + "name": "Night", + "color": "0C090A" + }, + { + "name": "Charcoal", + "color": "34282C" + }, + { + "name": "Oil", + "color": "3B3131" + }, + { + "name": "Dark Gray", + "color": "3A3B3C" + }, + { + "name": "Light Black", + "color": "454545" + }, + { + "name": "Black Cat", + "color": "413839" + }, + { + "name": "Iridium", + "color": "3D3C3A" + }, + { + "name": "Black Eel", + "color": "463E3F" + }, + { + "name": "Black Cow", + "color": "4C4646" + }, + { + "name": "Gray Wolf", + "color": "504A4B" + }, + { + "name": "Vampire Gray", + "color": "565051" + }, + { + "name": "Iron Gray", + "color": "52595D" + }, + { + "name": "Gray Dolphin", + "color": "5C5858" + }, + { + "name": "Carbon Gray", + "color": "625D5D" + }, + { + "name": "Ash Gray", + "color": "666362" + }, + { + "name": "DimGray or DimGrey (W3C)", + "color": "696969" + }, + { + "name": "Nardo Gray", + "color": "686A6C" + }, + { + "name": "Cloudy Gray", + "color": "6D6968" + }, + { + "name": "Smokey Gray", + "color": "726E6D" + }, + { + "name": "Alien Gray", + "color": "736F6E" + }, + { + "name": "Sonic Silver", + "color": "757575" + }, + { + "name": "Platinum Gray", + "color": "797979" + }, + { + "name": "Granite", + "color": "837E7C" + }, + { + "name": "Gray or Grey (W3C)", + "color": "808080" + }, + { + "name": "Battleship Gray", + "color": "848482" + }, + { + "name": "Gunmetal Gray", + "color": "8D918D" + }, + { + "name": "DarkGray or DarkGrey (W3C)", + "color": "A9A9A9" + }, + { + "name": "Gray Cloud", + "color": "B6B6B4" + }, + { + "name": "Silver (W3C)", + "color": "C0C0C0" + }, + { + "name": "Pale Silver", + "color": "C9C0BB" + }, + { + "name": "Gray Goose", + "color": "D1D0CE" + }, + { + "name": "Platinum Silver", + "color": "CECECE" + }, + { + "name": "LightGray or LightGrey (W3C)", + "color": "D3D3D3" + }, + { + "name": "Gainsboro (W3C)", + "color": "DCDCDC" + }, + { + "name": "Platinum", + "color": "E5E4E2" + }, + { + "name": "Metallic Silver", + "color": "BCC6CC" + }, + { + "name": "Blue Gray", + "color": "98AFC7" + }, + { + "name": "Roman Silver", + "color": "838996" + }, + { + "name": "LightSlateGray or LightSlateGrey (W3C)", + "color": "778899" + }, + { + "name": "SlateGray or SlateGrey (W3C)", + "color": "708090" + }, + { + "name": "Rat Gray", + "color": "6D7B8D" + }, + { + "name": "Slate Granite Gray", + "color": "657383" + }, + { + "name": "Jet Gray", + "color": "616D7E" + }, + { + "name": "Mist Blue", + "color": "646D7E" + }, + { + "name": "Marble Blue", + "color": "566D7E" + }, + { + "name": "Slate Blue Grey", + "color": "737CA1" + }, + { + "name": "Light Purple Blue", + "color": "728FCE" + }, + { + "name": "Azure Blue", + "color": "4863A0" + }, + { + "name": "Blue Jay", + "color": "2B547E" + }, + { + "name": "Charcoal Blue", + "color": "36454F" + }, + { + "name": "Dark Blue Grey", + "color": "29465B" + }, + { + "name": "Dark Slate", + "color": "2B3856" + }, + { + "name": "Deep-Sea Blue", + "color": "123456" + }, + { + "name": "Night Blue", + "color": "151B54" + }, + { + "name": "MidnightBlue (W3C)", + "color": "191970" + }, + { + "name": "Navy (W3C)", + "color": "000080" + }, + { + "name": "Denim Dark Blue", + "color": "151B8D" + }, + { + "name": "DarkBlue (W3C)", + "color": "00008B" + }, + { + "name": "Lapis Blue", + "color": "15317E" + }, + { + "name": "New Midnight Blue", + "color": "0000A0" + }, + { + "name": "Earth Blue", + "color": "0000A5" + }, + { + "name": "Cobalt Blue", + "color": "0020C2" + }, + { + "name": "MediumBlue (W3C)", + "color": "0000CD" + }, + { + "name": "Blueberry Blue", + "color": "0041C2" + }, + { + "name": "Canary Blue", + "color": "2916F5" + }, + { + "name": "Blue (W3C)", + "color": "0000FF" + }, + { + "name": "Bright Blue", + "color": "0909FF" + }, + { + "name": "Blue Orchid", + "color": "1F45FC" + }, + { + "name": "Sapphire Blue", + "color": "2554C7" + }, + { + "name": "Blue Eyes", + "color": "1569C7" + }, + { + "name": "Bright Navy Blue", + "color": "1974D2" + }, + { + "name": "Balloon Blue", + "color": "2B60DE" + }, + { + "name": "RoyalBlue (W3C)", + "color": "4169E1" + }, + { + "name": "Ocean Blue", + "color": "2B65EC" + }, + { + "name": "Blue Ribbon", + "color": "306EFF" + }, + { + "name": "Blue Dress", + "color": "157DEC" + }, + { + "name": "Neon Blue", + "color": "1589FF" + }, + { + "name": "DodgerBlue (W3C)", + "color": "1E90FF" + }, + { + "name": "Glacial Blue Ice", + "color": "368BC1" + }, + { + "name": "SteelBlue (W3C)", + "color": "4682B4" + }, + { + "name": "Silk Blue", + "color": "488AC7" + }, + { + "name": "Windows Blue", + "color": "357EC7" + }, + { + "name": "Blue Ivy", + "color": "3090C7" + }, + { + "name": "Blue Koi", + "color": "659EC7" + }, + { + "name": "Columbia Blue", + "color": "87AFC7" + }, + { + "name": "Baby Blue", + "color": "95B9C7" + }, + { + "name": "CornflowerBlue (W3C)", + "color": "6495ED" + }, + { + "name": "Sky Blue Dress", + "color": "6698FF" + }, + { + "name": "Iceberg", + "color": "56A5EC" + }, + { + "name": "Butterfly Blue", + "color": "38ACEC" + }, + { + "name": "DeepSkyBlue (W3C)", + "color": "00BFFF" + }, + { + "name": "Midday Blue", + "color": "3BB9FF" + }, + { + "name": "Crystal Blue", + "color": "5CB3FF" + }, + { + "name": "Denim Blue", + "color": "79BAEC" + }, + { + "name": "Day Sky Blue", + "color": "82CAFF" + }, + { + "name": "LightSkyBlue (W3C)", + "color": "87CEFA" + }, + { + "name": "SkyBlue (W3C)", + "color": "87CEEB" + }, + { + "name": "Jeans Blue", + "color": "A0CFEC" + }, + { + "name": "Blue Angel", + "color": "B7CEEC" + }, + { + "name": "Pastel Blue", + "color": "B4CFEC" + }, + { + "name": "Light Day Blue", + "color": "ADDFFF" + }, + { + "name": "Sea Blue", + "color": "C2DFFF" + }, + { + "name": "Heavenly Blue", + "color": "C6DEFF" + }, + { + "name": "Robin Egg Blue", + "color": "BDEDFF" + }, + { + "name": "PowderBlue (W3C)", + "color": "B0E0E6" + }, + { + "name": "Coral Blue", + "color": "AFDCEC" + }, + { + "name": "LightBlue (W3C)", + "color": "ADD8E6" + }, + { + "name": "LightSteelBlue (W3C)", + "color": "B0CFDE" + }, + { + "name": "Gulf Blue", + "color": "C9DFEC" + }, + { + "name": "Pastel Light Blue", + "color": "D5D6EA" + }, + { + "name": "Lavender Blue", + "color": "E3E4FA" + }, + { + "name": "Lavender (W3C)", + "color": "E6E6FA" + }, + { + "name": "Water", + "color": "EBF4FA" + }, + { + "name": "AliceBlue (W3C)", + "color": "F0F8FF" + }, + { + "name": "GhostWhite (W3C)", + "color": "F8F8FF" + }, + { + "name": "Azure (W3C)", + "color": "F0FFFF" + }, + { + "name": "LightCyan (W3C)", + "color": "E0FFFF" + }, + { + "name": "Light Slate", + "color": "CCFFFF" + }, + { + "name": "Electric Blue", + "color": "9AFEFF" + }, + { + "name": "Tron Blue", + "color": "7DFDFE" + }, + { + "name": "Blue Zircon", + "color": "57FEFF" + }, + { + "name": "Aqua or Cyan (W3C)", + "color": "00FFFF" + }, + { + "name": "Bright Cyan", + "color": "0AFFFF" + }, + { + "name": "Celeste", + "color": "50EBEC" + }, + { + "name": "Blue Diamond", + "color": "4EE2EC" + }, + { + "name": "Bright Turquoise", + "color": "16E2F5" + }, + { + "name": "Blue Lagoon", + "color": "8EEBEC" + }, + { + "name": "PaleTurquoise (W3C)", + "color": "AFEEEE" + }, + { + "name": "Pale Blue Lily", + "color": "CFECEC" + }, + { + "name": "Tiffany Blue", + "color": "81D8D0" + }, + { + "name": "Blue Hosta", + "color": "77BFC7" + }, + { + "name": "Cyan Opaque", + "color": "92C7C7" + }, + { + "name": "Northern Lights Blue", + "color": "78C7C7" + }, + { + "name": "Blue Green", + "color": "7BCCB5" + }, + { + "name": "MediumAquaMarine (W3C)", + "color": "66CDAA" + }, + { + "name": "Magic Mint", + "color": "AAF0D1" + }, + { + "name": "Aquamarine (W3C)", + "color": "7FFFD4" + }, + { + "name": "Light Aquamarine", + "color": "93FFE8" + }, + { + "name": "Turquoise (W3C)", + "color": "40E0D0" + }, + { + "name": "MediumTurquoise (W3C)", + "color": "48D1CC" + }, + { + "name": "Deep Turquoise", + "color": "48CCCD" + }, + { + "name": "Jellyfish", + "color": "46C7C7" + }, + { + "name": "Blue Turquoise", + "color": "43C6DB" + }, + { + "name": "DarkTurquoise (W3C)", + "color": "00CED1" + }, + { + "name": "Macaw Blue Green", + "color": "43BFC7" + }, + { + "name": "LightSeaGreen (W3C)", + "color": "20B2AA" + }, + { + "name": "Seafoam Green", + "color": "3EA99F" + }, + { + "name": "CadetBlue (W3C)", + "color": "5F9EA0" + }, + { + "name": "Deep-Sea", + "color": "3B9C9C" + }, + { + "name": "DarkCyan (W3C)", + "color": "008B8B" + }, + { + "name": "Teal (W3C)", + "color": "008080" + }, + { + "name": "Medium Teal", + "color": "045F5F" + }, + { + "name": "Deep Teal", + "color": "033E3E" + }, + { + "name": "DarkSlateGray or DarkSlateGrey (W3C)", + "color": "25383C" + }, + { + "name": "Gunmetal", + "color": "2C3539" + }, + { + "name": "Blue Moss Green", + "color": "3C565B" + }, + { + "name": "Beetle Green", + "color": "4C787E" + }, + { + "name": "Grayish Turquoise", + "color": "5E7D7E" + }, + { + "name": "Greenish Blue", + "color": "307D7E" + }, + { + "name": "Aquamarine Stone", + "color": "348781" + }, + { + "name": "Sea Turtle Green", + "color": "438D80" + }, + { + "name": "Dull-Sea Green", + "color": "4E8975" + }, + { + "name": "Deep-Sea Green", + "color": "306754" + }, + { + "name": "SeaGreen (W3C)", + "color": "2E8B57" + }, + { + "name": "Dark Mint", + "color": "31906E" + }, + { + "name": "Jade", + "color": "00A36C" + }, + { + "name": "Earth Green", + "color": "34A56F" + }, + { + "name": "Emerald", + "color": "50C878" + }, + { + "name": "Mint", + "color": "3EB489" + }, + { + "name": "MediumSeaGreen (W3C)", + "color": "3CB371" + }, + { + "name": "Camouflage Green", + "color": "78866B" + }, + { + "name": "Sage Green", + "color": "848B79" + }, + { + "name": "Hazel Green", + "color": "617C58" + }, + { + "name": "Venom Green", + "color": "728C00" + }, + { + "name": "OliveDrab (W3C)", + "color": "6B8E23" + }, + { + "name": "Olive (W3C)", + "color": "808000" + }, + { + "name": "DarkOliveGreen (W3C)", + "color": "556B2F" + }, + { + "name": "Army Green", + "color": "4B5320" + }, + { + "name": "Fern Green", + "color": "667C26" + }, + { + "name": "Fall Forest Green", + "color": "4E9258" + }, + { + "name": "Pine Green", + "color": "387C44" + }, + { + "name": "Medium Forest Green", + "color": "347235" + }, + { + "name": "Jungle Green", + "color": "347C2C" + }, + { + "name": "ForestGreen (W3C)", + "color": "228B22" + }, + { + "name": "Green (W3C)", + "color": "008000" + }, + { + "name": "DarkGreen (W3C)", + "color": "006400" + }, + { + "name": "Deep Emerald Green", + "color": "046307" + }, + { + "name": "Dark Forest Green", + "color": "254117" + }, + { + "name": "Seaweed Green", + "color": "437C17" + }, + { + "name": "Shamrock Green", + "color": "347C17" + }, + { + "name": "Green Onion", + "color": "6AA121" + }, + { + "name": "Green Pepper", + "color": "4AA02C" + }, + { + "name": "Dark Lime Green", + "color": "41A317" + }, + { + "name": "Parrot Green", + "color": "12AD2B" + }, + { + "name": "Clover Green", + "color": "3EA055" + }, + { + "name": "Dinosaur Green", + "color": "73A16C" + }, + { + "name": "Green Snake", + "color": "6CBB3C" + }, + { + "name": "Alien Green", + "color": "6CC417" + }, + { + "name": "Green Apple", + "color": "4CC417" + }, + { + "name": "LimeGreen (W3C)", + "color": "32CD32" + }, + { + "name": "Pea Green", + "color": "52D017" + }, + { + "name": "Kelly Green", + "color": "4CC552" + }, + { + "name": "Zombie Green", + "color": "54C571" + }, + { + "name": "Frog Green", + "color": "99C68E" + }, + { + "name": "DarkSeaGreen (W3C)", + "color": "8FBC8F" + }, + { + "name": "Green Peas", + "color": "89C35C" + }, + { + "name": "Dollar Bill Green", + "color": "85BB65" + }, + { + "name": "Iguana Green", + "color": "9CB071" + }, + { + "name": "Acid Green", + "color": "B0BF1A" + }, + { + "name": "Avocado Green", + "color": "B2C248" + }, + { + "name": "Pistachio Green", + "color": "9DC209" + }, + { + "name": "Salad Green", + "color": "A1C935" + }, + { + "name": "YellowGreen (W3C)", + "color": "9ACD32" + }, + { + "name": "Pastel Green", + "color": "77DD77" + }, + { + "name": "Hummingbird Green", + "color": "7FE817" + }, + { + "name": "Nebula Green", + "color": "59E817" + }, + { + "name": "Stoplight Go Green", + "color": "57E964" + }, + { + "name": "Neon Green", + "color": "16F529" + }, + { + "name": "Jade Green", + "color": "5EFB6E" + }, + { + "name": "Lime Mint Green", + "color": "36F57F" + }, + { + "name": "SpringGreen (W3C)", + "color": "00FF7F" + }, + { + "name": "MediumSpringGreen (W3C)", + "color": "00FA9A" + }, + { + "name": "Emerald Green", + "color": "5FFB17" + }, + { + "name": "Lime (W3C)", + "color": "00FF00" + }, + { + "name": "LawnGreen (W3C)", + "color": "7CFC00" + }, + { + "name": "Bright Green", + "color": "66FF00" + }, + { + "name": "Chartreuse (W3C)", + "color": "7FFF00" + }, + { + "name": "Yellow Lawn Green", + "color": "87F717" + }, + { + "name": "Aloe Vera Green", + "color": "98F516" + }, + { + "name": "Dull Green Yellow", + "color": "B1FB17" + }, + { + "name": "GreenYellow (W3C)", + "color": "ADFF2F" + }, + { + "name": "Chameleon Green", + "color": "BDF516" + }, + { + "name": "Neon Yellow Green", + "color": "DAEE01" + }, + { + "name": "Yellow Green Grosbeak", + "color": "E2F516" + }, + { + "name": "Tea Green", + "color": "CCFB5D" + }, + { + "name": "Slime Green", + "color": "BCE954" + }, + { + "name": "Algae Green", + "color": "64E986" + }, + { + "name": "LightGreen (W3C)", + "color": "90EE90" + }, + { + "name": "Dragon Green", + "color": "6AFB92" + }, + { + "name": "PaleGreen (W3C)", + "color": "98FB98" + }, + { + "name": "Mint Green", + "color": "98FF98" + }, + { + "name": "Green Thumb", + "color": "B5EAAA" + }, + { + "name": "Organic Brown", + "color": "E3F9A6" + }, + { + "name": "Light Jade", + "color": "C3FDB8" + }, + { + "name": "Light Rose Green", + "color": "DBF9DB" + }, + { + "name": "HoneyDew (W3C)", + "color": "F0FFF0" + }, + { + "name": "MintCream (W3C)", + "color": "F5FFFA" + }, + { + "name": "LemonChiffon (W3C)", + "color": "FFFACD" + }, + { + "name": "Parchment", + "color": "FFFFC2" + }, + { + "name": "Cream", + "color": "FFFFCC" + }, + { + "name": "Cream White", + "color": "FFFDD0" + }, + { + "name": "LightGoldenRodYellow (W3C)", + "color": "FAFAD2" + }, + { + "name": "LightYellow (W3C)", + "color": "FFFFE0" + }, + { + "name": "Beige (W3C)", + "color": "F5F5DC" + }, + { + "name": "Cornsilk (W3C)", + "color": "FFF8DC" + }, + { + "name": "Blonde", + "color": "FBF6D9" + }, + { + "name": "Champagne", + "color": "F7E7CE" + }, + { + "name": "AntiqueWhite (W3C)", + "color": "FAEBD7" + }, + { + "name": "PapayaWhip (W3C)", + "color": "FFEFD5" + }, + { + "name": "BlanchedAlmond (W3C)", + "color": "FFEBCD" + }, + { + "name": "Bisque (W3C)", + "color": "FFE4C4" + }, + { + "name": "Wheat (W3C)", + "color": "F5DEB3" + }, + { + "name": "Moccasin (W3C)", + "color": "FFE4B5" + }, + { + "name": "Peach", + "color": "FFE5B4" + }, + { + "name": "Light Orange", + "color": "FED8B1" + }, + { + "name": "PeachPuff (W3C)", + "color": "FFDAB9" + }, + { + "name": "NavajoWhite (W3C)", + "color": "FFDEAD" + }, + { + "name": "Golden Blonde", + "color": "FBE7A1" + }, + { + "name": "Golden Silk", + "color": "F3E3C3" + }, + { + "name": "Dark Blonde", + "color": "F0E2B6" + }, + { + "name": "Light Gold", + "color": "F1E5AC" + }, + { + "name": "Vanilla", + "color": "F3E5AB" + }, + { + "name": "Tan Brown", + "color": "ECE5B6" + }, + { + "name": "Dirty White", + "color": "E8E4C9" + }, + { + "name": "PaleGoldenRod (W3C)", + "color": "EEE8AA" + }, + { + "name": "Khaki (W3C)", + "color": "F0E68C" + }, + { + "name": "Cardboard Brown", + "color": "EDDA74" + }, + { + "name": "Harvest Gold", + "color": "EDE275" + }, + { + "name": "Sun Yellow", + "color": "FFE87C" + }, + { + "name": "Corn Yellow", + "color": "FFF380" + }, + { + "name": "Pastel Yellow", + "color": "FAF884" + }, + { + "name": "Neon Yellow", + "color": "FFFF33" + }, + { + "name": "Yellow (W3C)", + "color": "FFFF00" + }, + { + "name": "Canary Yellow", + "color": "FFEF00" + }, + { + "name": "Banana Yellow", + "color": "F5E216" + }, + { + "name": "Mustard Yellow", + "color": "FFDB58" + }, + { + "name": "Golden Yellow", + "color": "FFDF00" + }, + { + "name": "Bold Yellow", + "color": "F9DB24" + }, + { + "name": "Rubber Ducky Yellow", + "color": "FFD801" + }, + { + "name": "Gold (W3C)", + "color": "FFD700" + }, + { + "name": "Bright Gold", + "color": "FDD017" + }, + { + "name": "Chrome Gold", + "color": "FFCE44" + }, + { + "name": "Golden Brown", + "color": "EAC117" + }, + { + "name": "Deep Yellow", + "color": "F6BE00" + }, + { + "name": "Macaroni and Cheese", + "color": "F2BB66" + }, + { + "name": "Saffron", + "color": "FBB917" + }, + { + "name": "Beer", + "color": "FBB117" + }, + { + "name": "Yellow Orange or Orange Yellow", + "color": "FFAE42" + }, + { + "name": "Cantaloupe", + "color": "FFA62F" + }, + { + "name": "Orange (W3C)", + "color": "FFA500" + }, + { + "name": "Brown Sand", + "color": "EE9A4D" + }, + { + "name": "SandyBrown (W3C)", + "color": "F4A460" + }, + { + "name": "Brown Sugar", + "color": "E2A76F" + }, + { + "name": "Camel Brown", + "color": "C19A6B" + }, + { + "name": "Deer Brown", + "color": "E6BF83" + }, + { + "name": "BurlyWood (W3C)", + "color": "DEB887" + }, + { + "name": "Tan (W3C)", + "color": "D2B48C" + }, + { + "name": "Light French Beige", + "color": "C8AD7F" + }, + { + "name": "Sand", + "color": "C2B280" + }, + { + "name": "Sage", + "color": "BCB88A" + }, + { + "name": "Fall Leaf Brown", + "color": "C8B560" + }, + { + "name": "Ginger Brown", + "color": "C9BE62" + }, + { + "name": "DarkKhaki (W3C)", + "color": "BDB76B" + }, + { + "name": "Olive Green", + "color": "BAB86C" + }, + { + "name": "Brass", + "color": "B5A642" + }, + { + "name": "Cookie Brown", + "color": "C7A317" + }, + { + "name": "Metallic Gold", + "color": "D4AF37" + }, + { + "name": "Bee Yellow", + "color": "E9AB17" + }, + { + "name": "School Bus Yellow", + "color": "E8A317" + }, + { + "name": "GoldenRod (W3C)", + "color": "DAA520" + }, + { + "name": "Orange Gold", + "color": "D4A017" + }, + { + "name": "Caramel", + "color": "C68E17" + }, + { + "name": "DarkGoldenRod (W3C)", + "color": "B8860B" + }, + { + "name": "Cinnamon", + "color": "C58917" + }, + { + "name": "Peru (W3C)", + "color": "CD853F" + }, + { + "name": "Bronze", + "color": "CD7F32" + }, + { + "name": "Tiger Orange", + "color": "C88141" + }, + { + "name": "Copper", + "color": "B87333" + }, + { + "name": "Dark Gold", + "color": "AA6C39" + }, + { + "name": "Dark Almond", + "color": "AB784E" + }, + { + "name": "Wood", + "color": "966F33" + }, + { + "name": "Oak Brown", + "color": "806517" + }, + { + "name": "Antique Bronze", + "color": "665D1E" + }, + { + "name": "Hazel", + "color": "8E7618" + }, + { + "name": "Dark Yellow", + "color": "8B8000" + }, + { + "name": "Dark Moccasin", + "color": "827839" + }, + { + "name": "Khaki Green", + "color": "8A865D" + }, + { + "name": "Bullet Shell", + "color": "AF9B60" + }, + { + "name": "Army Brown", + "color": "827B60" + }, + { + "name": "Sandstone", + "color": "786D5F" + }, + { + "name": "Taupe", + "color": "483C32" + }, + { + "name": "Mocha", + "color": "493D26" + }, + { + "name": "Milk Chocolate", + "color": "513B1C" + }, + { + "name": "Gray Brown", + "color": "3D3635" + }, + { + "name": "Dark Coffee", + "color": "3B2F2F" + }, + { + "name": "Old Burgundy", + "color": "43302E" + }, + { + "name": "Western Charcoal", + "color": "49413F" + }, + { + "name": "Bakers Brown", + "color": "5C3317" + }, + { + "name": "Dark Brown", + "color": "654321" + }, + { + "name": "Sepia Brown", + "color": "704214" + }, + { + "name": "Dark Bronze", + "color": "804A00" + }, + { + "name": "Coffee", + "color": "6F4E37" + }, + { + "name": "Brown Bear", + "color": "835C3B" + }, + { + "name": "Red Dirt", + "color": "7F5217" + }, + { + "name": "Sepia", + "color": "7F462C" + }, + { + "name": "Sienna (W3C)", + "color": "A0522D" + }, + { + "name": "SaddleBrown (W3C)", + "color": "8B4513" + }, + { + "name": "Dark Sienna", + "color": "8A4117" + }, + { + "name": "Sangria", + "color": "7E3817" + }, + { + "name": "Blood Red", + "color": "7E3517" + }, + { + "name": "Chestnut", + "color": "954535" + }, + { + "name": "Chestnut Red", + "color": "C34A2C" + }, + { + "name": "Mahogany", + "color": "C04000" + }, + { + "name": "Red Fox", + "color": "C35817" + }, + { + "name": "Dark Bisque", + "color": "B86500" + }, + { + "name": "Light Brown", + "color": "B5651D" + }, + { + "name": "Petra Gold", + "color": "B76734" + }, + { + "name": "Rust", + "color": "C36241" + }, + { + "name": "Copper Red", + "color": "CB6D51" + }, + { + "name": "Orange Salmon", + "color": "C47451" + }, + { + "name": "Chocolate (W3C)", + "color": "D2691E" + }, + { + "name": "Sedona", + "color": "CC6600" + }, + { + "name": "Papaya Orange", + "color": "E56717" + }, + { + "name": "Halloween Orange", + "color": "E66C2C" + }, + { + "name": "Neon Orange", + "color": "FF6700" + }, + { + "name": "Bright Orange", + "color": "FF5F1F" + }, + { + "name": "Pumpkin Orange", + "color": "F87217" + }, + { + "name": "Carrot Orange", + "color": "F88017" + }, + { + "name": "DarkOrange (W3C)", + "color": "FF8C00" + }, + { + "name": "Construction Cone Orange", + "color": "F87431" + }, + { + "name": "Indian Saffron", + "color": "FF7722" + }, + { + "name": "Sunrise Orange", + "color": "E67451" + }, + { + "name": "Mango Orange", + "color": "FF8040" + }, + { + "name": "Coral (W3C)", + "color": "FF7F50" + }, + { + "name": "Basket Ball Orange", + "color": "F88158" + }, + { + "name": "Light Salmon Rose", + "color": "F9966B" + }, + { + "name": "LightSalmon (W3C)", + "color": "FFA07A" + }, + { + "name": "DarkSalmon (W3C)", + "color": "E9967A" + }, + { + "name": "Tangerine", + "color": "E78A61" + }, + { + "name": "Light Copper", + "color": "DA8A67" + }, + { + "name": "Salmon (W3C)", + "color": "FA8072" + }, + { + "name": "LightCoral (W3C)", + "color": "F08080" + }, + { + "name": "Pastel Red", + "color": "F67280" + }, + { + "name": "Pink Coral", + "color": "E77471" + }, + { + "name": "Bean Red", + "color": "F75D59" + }, + { + "name": "Valentine Red", + "color": "E55451" + }, + { + "name": "IndianRed (W3C)", + "color": "CD5C5C" + }, + { + "name": "Tomato (W3C)", + "color": "FF6347" + }, + { + "name": "Shocking Orange", + "color": "E55B3C" + }, + { + "name": "OrangeRed (W3C)", + "color": "FF4500" + }, + { + "name": "Red (W3C)", + "color": "FF0000" + }, + { + "name": "Neon Red", + "color": "FD1C03" + }, + { + "name": "Scarlet", + "color": "FF2400" + }, + { + "name": "Ruby Red", + "color": "F62217" + }, + { + "name": "Ferrari Red", + "color": "F70D1A" + }, + { + "name": "Fire Engine Red", + "color": "F62817" + }, + { + "name": "Lava Red", + "color": "E42217" + }, + { + "name": "Love Red", + "color": "E41B17" + }, + { + "name": "Grapefruit", + "color": "DC381F" + }, + { + "name": "Cherry Red", + "color": "C24641" + }, + { + "name": "Chilli Pepper", + "color": "C11B17" + }, + { + "name": "FireBrick (W3C)", + "color": "B22222" + }, + { + "name": "Tomato Sauce Red", + "color": "B21807" + }, + { + "name": "Brown (W3C)", + "color": "A52A2A" + }, + { + "name": "Carbon Red", + "color": "A70D2A" + }, + { + "name": "Cranberry", + "color": "9F000F" + }, + { + "name": "Saffron Red", + "color": "931314" + }, + { + "name": "Crimson Red", + "color": "990000" + }, + { + "name": "Red Wine or Wine Red", + "color": "990012" + }, + { + "name": "DarkRed (W3C)", + "color": "8B0000" + }, + { + "name": "Maroon (W3C)", + "color": "800000" + }, + { + "name": "Burgundy", + "color": "8C001A" + }, + { + "name": "Vermilion", + "color": "7E191B" + }, + { + "name": "Deep Red", + "color": "800517" + }, + { + "name": "Red Blood", + "color": "660000" + }, + { + "name": "Blood Night", + "color": "551606" + }, + { + "name": "Dark Scarlet", + "color": "560319" + }, + { + "name": "Black Bean", + "color": "3D0C02" + }, + { + "name": "Chocolate Brown", + "color": "3F000F" + }, + { + "name": "Midnight", + "color": "2B1B17" + }, + { + "name": "Purple Lily", + "color": "550A35" + }, + { + "name": "Purple Maroon", + "color": "810541" + }, + { + "name": "Plum Pie", + "color": "7D0541" + }, + { + "name": "Plum Velvet", + "color": "7D0552" + }, + { + "name": "Dark Raspberry", + "color": "872657" + }, + { + "name": "Velvet Maroon", + "color": "7E354D" + }, + { + "name": "Rosy-Finch", + "color": "7F4E52" + }, + { + "name": "Dull Purple", + "color": "7F525D" + }, + { + "name": "Puce", + "color": "7F5A58" + }, + { + "name": "Rose Dust", + "color": "997070" + }, + { + "name": "Rosy Pink", + "color": "B38481" + }, + { + "name": "RosyBrown (W3C)", + "color": "BC8F8F" + }, + { + "name": "Khaki Rose", + "color": "C5908E" + }, + { + "name": "Lipstick Pink", + "color": "C48793" + }, + { + "name": "Pink Brown", + "color": "C48189" + }, + { + "name": "Pink Daisy", + "color": "E799A3" + }, + { + "name": "Dusty Pink", + "color": "D58A94" + }, + { + "name": "Rose", + "color": "E8ADAA" + }, + { + "name": "Silver Pink", + "color": "C4AEAD" + }, + { + "name": "Rose Gold", + "color": "ECC5C0" + }, + { + "name": "Deep Peach", + "color": "FFCBA4" + }, + { + "name": "Pastel Orange", + "color": "F8B88B" + }, + { + "name": "Desert Sand", + "color": "EDC9AF" + }, + { + "name": "Unbleached Silk", + "color": "FFDDCA" + }, + { + "name": "Pig Pink", + "color": "FDD7E4" + }, + { + "name": "Blush", + "color": "FFE6E8" + }, + { + "name": "MistyRose (W3C)", + "color": "FFE4E1" + }, + { + "name": "Pink Bubble Gum", + "color": "FFDFDD" + }, + { + "name": "Light Red", + "color": "FFCCCB" + }, + { + "name": "Light Rose", + "color": "FBCFCD" + }, + { + "name": "Deep Rose", + "color": "FBBBB9" + }, + { + "name": "Pink (W3C)", + "color": "FFC0CB" + }, + { + "name": "LightPink (W3C)", + "color": "FFB6C1" + }, + { + "name": "Donut Pink", + "color": "FAAFBE" + }, + { + "name": "Baby Pink", + "color": "FAAFBA" + }, + { + "name": "Flamingo Pink", + "color": "F9A7B0" + }, + { + "name": "Pastel Pink", + "color": "FEA3AA" + }, + { + "name": "Rose Pink or Pink Rose", + "color": "E7A1B0" + }, + { + "name": "Cadillac Pink", + "color": "E38AAE" + }, + { + "name": "Carnation Pink", + "color": "F778A1" + }, + { + "name": "Blush Red", + "color": "E56E94" + }, + { + "name": "PaleVioletRed (W3C)", + "color": "DB7093" + }, + { + "name": "Purple Pink", + "color": "D16587" + }, + { + "name": "Tulip Pink", + "color": "C25A7C" + }, + { + "name": "Bashful Pink", + "color": "C25283" + }, + { + "name": "Dark Pink", + "color": "E75480" + }, + { + "name": "Dark Hot Pink", + "color": "F660AB" + }, + { + "name": "HotPink (W3C)", + "color": "FF69B4" + }, + { + "name": "Watermelon Pink", + "color": "FC6C85" + }, + { + "name": "Violet Red", + "color": "F6358A" + }, + { + "name": "Hot Deep Pink", + "color": "F52887" + }, + { + "name": "DeepPink (W3C)", + "color": "FF1493" + }, + { + "name": "Neon Pink", + "color": "F535AA" + }, + { + "name": "Neon Hot Pink", + "color": "FD349C" + }, + { + "name": "Pink Cupcake", + "color": "E45E9D" + }, + { + "name": "Dimorphotheca Magenta", + "color": "E3319D" + }, + { + "name": "Pink Lemonade", + "color": "E4287C" + }, + { + "name": "Raspberry", + "color": "E30B5D" + }, + { + "name": "Crimson (W3C)", + "color": "DC143C" + }, + { + "name": "Bright Maroon", + "color": "C32148" + }, + { + "name": "Rose Red", + "color": "C21E56" + }, + { + "name": "Rogue Pink", + "color": "C12869" + }, + { + "name": "Burnt Pink", + "color": "C12267" + }, + { + "name": "Pink Violet", + "color": "CA226B" + }, + { + "name": "MediumVioletRed (W3C)", + "color": "C71585" + }, + { + "name": "Dark Carnation Pink", + "color": "C12283" + }, + { + "name": "Raspberry Purple", + "color": "B3446C" + }, + { + "name": "Pink Plum", + "color": "B93B8F" + }, + { + "name": "Orchid (W3C)", + "color": "DA70D6" + }, + { + "name": "Deep Mauve", + "color": "DF73D4" + }, + { + "name": "Violet (W3C)", + "color": "EE82EE" + }, + { + "name": "Bright Neon Pink", + "color": "F433FF" + }, + { + "name": "Fuchsia or Magenta (W3C)", + "color": "FF00FF" + }, + { + "name": "Crimson Purple", + "color": "E238EC" + }, + { + "name": "Heliotrope Purple", + "color": "D462FF" + }, + { + "name": "Tyrian Purple", + "color": "C45AEC" + }, + { + "name": "MediumOrchid (W3C)", + "color": "BA55D3" + }, + { + "name": "Purple Flower", + "color": "A74AC7" + }, + { + "name": "Orchid Purple", + "color": "B048B5" + }, + { + "name": "Pastel Violet", + "color": "D291BC" + }, + { + "name": "Mauve Taupe", + "color": "915F6D" + }, + { + "name": "Viola Purple", + "color": "7E587E" + }, + { + "name": "Eggplant", + "color": "614051" + }, + { + "name": "Plum Purple", + "color": "583759" + }, + { + "name": "Grape", + "color": "5E5A80" + }, + { + "name": "Purple Navy", + "color": "4E5180" + }, + { + "name": "SlateBlue (W3C)", + "color": "6A5ACD" + }, + { + "name": "Blue Lotus", + "color": "6960EC" + }, + { + "name": "Light Slate Blue", + "color": "736AFF" + }, + { + "name": "MediumSlateBlue (W3C)", + "color": "7B68EE" + }, + { + "name": "Periwinkle Purple", + "color": "7575CF" + }, + { + "name": "Very Peri", + "color": "6667AB" + }, + { + "name": "Bright Grape", + "color": "6F2DA8" + }, + { + "name": "Purple Amethyst", + "color": "6C2DC7" + }, + { + "name": "Bright Purple", + "color": "6A0DAD" + }, + { + "name": "Deep Periwinkle", + "color": "5453A6" + }, + { + "name": "DarkSlateBlue (W3C)", + "color": "483D8B" + }, + { + "name": "Purple Haze", + "color": "4E387E" + }, + { + "name": "Purple Iris", + "color": "571B7E" + }, + { + "name": "Dark Purple", + "color": "4B0150" + }, + { + "name": "Deep Purple", + "color": "36013F" + }, + { + "name": "Purple Monster", + "color": "461B7E" + }, + { + "name": "Indigo (W3C)", + "color": "4B0082" + }, + { + "name": "Blue Whale", + "color": "342D7E" + }, + { + "name": "RebeccaPurple (W3C)", + "color": "663399" + }, + { + "name": "Purple Jam", + "color": "6A287E" + }, + { + "name": "DarkMagenta (W3C)", + "color": "8B008B" + }, + { + "name": "Purple (W3C)", + "color": "800080" + }, + { + "name": "French Lilac", + "color": "86608E" + }, + { + "name": "DarkOrchid (W3C)", + "color": "9932CC" + }, + { + "name": "DarkViolet (W3C)", + "color": "9400D3" + }, + { + "name": "Purple Violet", + "color": "8D38C9" + }, + { + "name": "Jasmine Purple", + "color": "A23BEC" + }, + { + "name": "Purple Daffodil", + "color": "B041FF" + }, + { + "name": "Clematis Violet", + "color": "842DCE" + }, + { + "name": "BlueViolet (W3C)", + "color": "8A2BE2" + }, + { + "name": "Purple Sage Bush", + "color": "7A5DC7" + }, + { + "name": "Lovely Purple", + "color": "7F38EC" + }, + { + "name": "Neon Purple", + "color": "9D00FF" + }, + { + "name": "Purple Plum", + "color": "8E35EF" + }, + { + "name": "Aztech Purple", + "color": "893BFF" + }, + { + "name": "Lavender Purple", + "color": "967BB6" + }, + { + "name": "MediumPurple (W3C)", + "color": "9370DB" + }, + { + "name": "Light Purple", + "color": "8467D7" + }, + { + "name": "Crocus Purple", + "color": "9172EC" + }, + { + "name": "Purple Mimosa", + "color": "9E7BFF" + }, + { + "name": "Periwinkle", + "color": "CCCCFF" + }, + { + "name": "Pale Lilac", + "color": "DCD0FF" + }, + { + "name": "Mauve", + "color": "E0B0FF" + }, + { + "name": "Bright Lilac", + "color": "D891EF" + }, + { + "name": "Rich Lilac", + "color": "B666D2" + }, + { + "name": "Purple Dragon", + "color": "C38EC7" + }, + { + "name": "Lilac", + "color": "C8A2C8" + }, + { + "name": "Plum (W3C)", + "color": "DDA0DD" + }, + { + "name": "Blush Pink", + "color": "E6A9EC" + }, + { + "name": "Pastel Purple", + "color": "F2A2E8" + }, + { + "name": "Blossom Pink", + "color": "F9B7FF" + }, + { + "name": "Wisteria Purple", + "color": "C6AEC7" + }, + { + "name": "Purple Thistle", + "color": "D2B9D3" + }, + { + "name": "Thistle (W3C)", + "color": "D8BFD8" + }, + { + "name": "Periwinkle Pink", + "color": "E9CFEC" + }, + { + "name": "Cotton Candy", + "color": "FCDFFF" + }, + { + "name": "Lavender Pinocchio", + "color": "EBDDE2" + }, + { + "name": "Dark White", + "color": "E1D9D1" + }, + { + "name": "Ash White", + "color": "E9E4D4" + }, + { + "name": "White Chocolate", + "color": "EDE6D6" + }, + { + "name": "Soft Ivory", + "color": "FAF0DD" + }, + { + "name": "Off White", + "color": "F8F0E3" + }, + { + "name": "Pearl White", + "color": "F8F6F0" + }, + { + "name": "LavenderBlush (W3C)", + "color": "FFF0F5" + }, + { + "name": "Pearl", + "color": "FDEEF4" + }, + { + "name": "Egg Shell", + "color": "FFF9E3" + }, + { + "name": "OldLace (W3C)", + "color": "FDF5E6" + }, + { + "name": "Linen (W3C)", + "color": "FAF0E6" + }, + { + "name": "SeaShell (W3C)", + "color": "FFF5EE" + }, + { + "name": "Rice", + "color": "FAF5EF" + }, + { + "name": "FloralWhite (W3C)", + "color": "FFFAF0" + }, + { + "name": "Ivory (W3C)", + "color": "FFFFF0" + }, + { + "name": "Light White", + "color": "FFFFF7" + }, + { + "name": "WhiteSmoke (W3C)", + "color": "F5F5F5" + }, + { + "name": "Cotton", + "color": "FBFBF9" + }, + { + "name": "Snow (W3C)", + "color": "FFFAFA" + }, + { + "name": "Milk White", + "color": "FEFCFF" + }, + { + "name": "White (W3C)", + "color": "FFFFFF" + } + ] +} \ No newline at end of file diff --git a/smali/assets/vtl_themes/palettes/material.json b/smali/assets/vtl_themes/palettes/material.json new file mode 100644 index 000000000..410a548a5 --- /dev/null +++ b/smali/assets/vtl_themes/palettes/material.json @@ -0,0 +1,1118 @@ +{ + "palette_id": "material", + "name": "Material Palette", + "author": "Vologhat", + "palette": [ + { + "name": "Red", + "colors": [ + { + "index": "50", + "color": "FFEBEE" + }, + { + "index": "100", + "color": "FFCDD2" + }, + { + "index": "200", + "color": "EF9A9A" + }, + { + "index": "300", + "color": "E57373" + }, + { + "index": "400", + "color": "EF5350" + }, + { + "index": "500", + "color": "F44336" + }, + { + "index": "600", + "color": "E53935" + }, + { + "index": "700", + "color": "D32F2F" + }, + { + "index": "800", + "color": "C62828" + }, + { + "index": "900", + "color": "B71C1C" + }, + { + "index": "A700", + "color": "D50000" + }, + { + "index": "A100", + "color": "FF8A80" + }, + { + "index": "A200", + "color": "FF5252" + }, + { + "index": "A400", + "color": "FF1744" + } + ] + }, + { + "name": "Pink", + "colors": [ + { + "index": "50", + "color": "FCE4EC" + }, + { + "index": "100", + "color": "F8BBD0" + }, + { + "index": "200", + "color": "F48FB1" + }, + { + "index": "300", + "color": "F06292" + }, + { + "index": "400", + "color": "EC407A" + }, + { + "index": "500", + "color": "E91E63" + }, + { + "index": "600", + "color": "D81B60" + }, + { + "index": "700", + "color": "C2185B" + }, + { + "index": "800", + "color": "AD1457" + }, + { + "index": "900", + "color": "880E4F" + }, + { + "index": "A700", + "color": "C51162" + }, + { + "index": "A100", + "color": "FF80AB" + }, + { + "index": "A200", + "color": "FF4081" + }, + { + "index": "A400", + "color": "F50057" + } + ] + }, + { + "name": "Purple", + "colors": [ + { + "index": "50", + "color": "F3E5F5" + }, + { + "index": "100", + "color": "E1BEE7" + }, + { + "index": "200", + "color": "CE93D8" + }, + { + "index": "300", + "color": "BA68C8" + }, + { + "index": "400", + "color": "AB47BC" + }, + { + "index": "500", + "color": "9C27B0" + }, + { + "index": "600", + "color": "8E24AA" + }, + { + "index": "700", + "color": "7B1FA2" + }, + { + "index": "800", + "color": "6A1B9A" + }, + { + "index": "900", + "color": "4A148C" + }, + { + "index": "A700", + "color": "AA00FF" + }, + { + "index": "A100", + "color": "EA80FC" + }, + { + "index": "A200", + "color": "E040FB" + }, + { + "index": "A400", + "color": "D500F9" + } + ] + }, + { + "name": "Deep Purple", + "colors": [ + { + "index": "50", + "color": "EDE7F6" + }, + { + "index": "100", + "color": "D1C4E9" + }, + { + "index": "200", + "color": "B39DDB" + }, + { + "index": "300", + "color": "9575CD" + }, + { + "index": "400", + "color": "7E57C2" + }, + { + "index": "500", + "color": "673AB7" + }, + { + "index": "600", + "color": "5E35B1" + }, + { + "index": "700", + "color": "512DA8" + }, + { + "index": "800", + "color": "4527A0" + }, + { + "index": "900", + "color": "311B92" + }, + { + "index": "A700", + "color": "6200EA" + }, + { + "index": "A100", + "color": "B388FF" + }, + { + "index": "A200", + "color": "7C4DFF" + }, + { + "index": "A400", + "color": "651FFF" + } + ] + }, + { + "name": "Indigo", + "colors": [ + { + "index": "50", + "color": "E8EAF6" + }, + { + "index": "100", + "color": "C5CAE9" + }, + { + "index": "200", + "color": "9FA8DA" + }, + { + "index": "300", + "color": "7986CB" + }, + { + "index": "400", + "color": "5C6BC0" + }, + { + "index": "500", + "color": "3F51B5" + }, + { + "index": "600", + "color": "3949AB" + }, + { + "index": "700", + "color": "303F9F" + }, + { + "index": "800", + "color": "283593" + }, + { + "index": "900", + "color": "1A237E" + }, + { + "index": "A700", + "color": "304FFE" + }, + { + "index": "A100", + "color": "8C9EFF" + }, + { + "index": "A200", + "color": "536DFE" + }, + { + "index": "A400", + "color": "3D5AFE" + } + ] + }, + { + "name": "Blue", + "colors": [ + { + "index": "50", + "color": "E3F2FD" + }, + { + "index": "100", + "color": "BBDEFB" + }, + { + "index": "200", + "color": "90CAF9" + }, + { + "index": "300", + "color": "64B5F6" + }, + { + "index": "400", + "color": "42A5F5" + }, + { + "index": "500", + "color": "2196F3" + }, + { + "index": "600", + "color": "1E88E5" + }, + { + "index": "700", + "color": "1976D2" + }, + { + "index": "800", + "color": "1565C0" + }, + { + "index": "900", + "color": "0D47A1" + }, + { + "index": "A700", + "color": "2962FF" + }, + { + "index": "A100", + "color": "82B1FF" + }, + { + "index": "A200", + "color": "448AFF" + }, + { + "index": "A400", + "color": "2979FF" + } + ] + }, + { + "name": "Light Blue", + "colors": [ + { + "index": "50", + "color": "E1F5FE" + }, + { + "index": "100", + "color": "B3E5FC" + }, + { + "index": "200", + "color": "81D4FA" + }, + { + "index": "300", + "color": "4FC3F7" + }, + { + "index": "400", + "color": "29B6F6" + }, + { + "index": "500", + "color": "03A9F4" + }, + { + "index": "600", + "color": "039BE5" + }, + { + "index": "700", + "color": "0288D1" + }, + { + "index": "800", + "color": "0277BD" + }, + { + "index": "900", + "color": "01579B" + }, + { + "index": "A700", + "color": "0091EA" + }, + { + "index": "A100", + "color": "80D8FF" + }, + { + "index": "A200", + "color": "40C4FF" + }, + { + "index": "A400", + "color": "00B0FF" + } + ] + }, + { + "name": "Cyan", + "colors": [ + { + "index": "50", + "color": "E0F7FA" + }, + { + "index": "100", + "color": "B2EBF2" + }, + { + "index": "200", + "color": "80DEEA" + }, + { + "index": "300", + "color": "4DD0E1" + }, + { + "index": "400", + "color": "26C6DA" + }, + { + "index": "500", + "color": "00BCD4" + }, + { + "index": "600", + "color": "00ACC1" + }, + { + "index": "700", + "color": "0097A7" + }, + { + "index": "800", + "color": "00838F" + }, + { + "index": "900", + "color": "006064" + }, + { + "index": "A700", + "color": "00B8D4" + }, + { + "index": "A100", + "color": "84FFFF" + }, + { + "index": "A200", + "color": "18FFFF" + }, + { + "index": "A400", + "color": "00E5FF" + } + ] + }, + { + "name": "Teal", + "colors": [ + { + "index": "50", + "color": "E0F2F1" + }, + { + "index": "100", + "color": "B2DFDB" + }, + { + "index": "200", + "color": "80CBC4" + }, + { + "index": "300", + "color": "4DB6AC" + }, + { + "index": "400", + "color": "26A69A" + }, + { + "index": "500", + "color": "009688" + }, + { + "index": "600", + "color": "00897B" + }, + { + "index": "700", + "color": "00796B" + }, + { + "index": "800", + "color": "00695C" + }, + { + "index": "900", + "color": "004D40" + }, + { + "index": "A700", + "color": "00BFA5" + }, + { + "index": "A100", + "color": "A7FFEB" + }, + { + "index": "A200", + "color": "64FFDA" + }, + { + "index": "A400", + "color": "1DE9B6" + } + ] + }, + { + "name": "Green", + "colors": [ + { + "index": "50", + "color": "E8F5E9" + }, + { + "index": "100", + "color": "C8E6C9" + }, + { + "index": "200", + "color": "A5D6A7" + }, + { + "index": "300", + "color": "81C784" + }, + { + "index": "400", + "color": "66BB6A" + }, + { + "index": "500", + "color": "4CAF50" + }, + { + "index": "600", + "color": "43A047" + }, + { + "index": "700", + "color": "388E3C" + }, + { + "index": "800", + "color": "2E7D32" + }, + { + "index": "900", + "color": "1B5E20" + }, + { + "index": "A700", + "color": "00C853" + }, + { + "index": "A100", + "color": "B9F6CA" + }, + { + "index": "A200", + "color": "69F0AE" + }, + { + "index": "A400", + "color": "00E676" + } + ] + }, + { + "name": "Light Green", + "colors": [ + { + "index": "50", + "color": "F1F8E9" + }, + { + "index": "100", + "color": "DCEDC8" + }, + { + "index": "200", + "color": "C5E1A5" + }, + { + "index": "300", + "color": "AED581" + }, + { + "index": "400", + "color": "9CCC65" + }, + { + "index": "500", + "color": "8BC34A" + }, + { + "index": "600", + "color": "7CB342" + }, + { + "index": "700", + "color": "689F38" + }, + { + "index": "800", + "color": "558B2F" + }, + { + "index": "900", + "color": "33691E" + }, + { + "index": "A700", + "color": "64DD17" + }, + { + "index": "A100", + "color": "CCFF90" + }, + { + "index": "A200", + "color": "B2FF59" + }, + { + "index": "A400", + "color": "76FF03" + } + ] + }, + { + "name": "Lime", + "colors": [ + { + "index": "50", + "color": "F9FBE7" + }, + { + "index": "100", + "color": "F0F4C3" + }, + { + "index": "200", + "color": "E6EE9C" + }, + { + "index": "300", + "color": "DCE775" + }, + { + "index": "400", + "color": "D4E157" + }, + { + "index": "500", + "color": "CDDC39" + }, + { + "index": "600", + "color": "C0CA33" + }, + { + "index": "700", + "color": "AFB42B" + }, + { + "index": "800", + "color": "9E9D24" + }, + { + "index": "900", + "color": "827717" + }, + { + "index": "A700", + "color": "AEEA00" + }, + { + "index": "A100", + "color": "F4FF81" + }, + { + "index": "A200", + "color": "EEFF41" + }, + { + "index": "A400", + "color": "C6FF00" + } + ] + }, + { + "name": "Yellow", + "colors": [ + { + "index": "50", + "color": "FFFDE7" + }, + { + "index": "100", + "color": "FFF9C4" + }, + { + "index": "200", + "color": "FFF59D" + }, + { + "index": "300", + "color": "FFF176" + }, + { + "index": "400", + "color": "FFEE58" + }, + { + "index": "500", + "color": "FFEB3B" + }, + { + "index": "600", + "color": "FDD835" + }, + { + "index": "700", + "color": "FBC02D" + }, + { + "index": "800", + "color": "F9A825" + }, + { + "index": "900", + "color": "F57F17" + }, + { + "index": "A700", + "color": "FFD600" + }, + { + "index": "A100", + "color": "FFFF8D" + }, + { + "index": "A200", + "color": "FFFF00" + }, + { + "index": "A400", + "color": "FFEA00" + } + ] + }, + { + "name": "Amber", + "colors": [ + { + "index": "50", + "color": "FFF8E1" + }, + { + "index": "100", + "color": "FFECB3" + }, + { + "index": "200", + "color": "FFE082" + }, + { + "index": "300", + "color": "FFD54F" + }, + { + "index": "400", + "color": "FFCA28" + }, + { + "index": "500", + "color": "FFC107" + }, + { + "index": "600", + "color": "FFB300" + }, + { + "index": "700", + "color": "FFA000" + }, + { + "index": "800", + "color": "FF8F00" + }, + { + "index": "900", + "color": "FF6F00" + }, + { + "index": "A700", + "color": "FFAB00" + }, + { + "index": "A100", + "color": "FFE57F" + }, + { + "index": "A200", + "color": "FFD740" + }, + { + "index": "A400", + "color": "FFC400" + } + ] + }, + { + "name": "Orange", + "colors": [ + { + "index": "50", + "color": "FFF3E0" + }, + { + "index": "100", + "color": "FFE0B2" + }, + { + "index": "200", + "color": "FFCC80" + }, + { + "index": "300", + "color": "FFB74D" + }, + { + "index": "400", + "color": "FFA726" + }, + { + "index": "500", + "color": "FF9800" + }, + { + "index": "600", + "color": "FB8C00" + }, + { + "index": "700", + "color": "F57C00" + }, + { + "index": "800", + "color": "EF6C00" + }, + { + "index": "900", + "color": "E65100" + }, + { + "index": "A700", + "color": "FF6D00" + }, + { + "index": "A100", + "color": "FFD180" + }, + { + "index": "A200", + "color": "FFAB40" + }, + { + "index": "A400", + "color": "FF9100" + } + ] + }, + { + "name": "Deep Orange", + "colors": [ + { + "index": "50", + "color": "FBE9E7" + }, + { + "index": "100", + "color": "FFCCBC" + }, + { + "index": "200", + "color": "FFAB91" + }, + { + "index": "300", + "color": "FF8A65" + }, + { + "index": "400", + "color": "FF7043" + }, + { + "index": "500", + "color": "FF5722" + }, + { + "index": "600", + "color": "F4511E" + }, + { + "index": "700", + "color": "E64A19" + }, + { + "index": "800", + "color": "D84315" + }, + { + "index": "900", + "color": "BF360C" + }, + { + "index": "A700", + "color": "DD2C00" + }, + { + "index": "A100", + "color": "FF9E80" + }, + { + "index": "A200", + "color": "FF6E40" + }, + { + "index": "A400", + "color": "FF3D00" + } + ] + }, + { + "name": "Brown", + "colors": [ + { + "index": "50", + "color": "EFEBE9" + }, + { + "index": "100", + "color": "D7CCC8" + }, + { + "index": "200", + "color": "BCAAA4" + }, + { + "index": "300", + "color": "A1887F" + }, + { + "index": "400", + "color": "8D6E63" + }, + { + "index": "500", + "color": "795548" + }, + { + "index": "600", + "color": "6D4C41" + }, + { + "index": "700", + "color": "5D4037" + }, + { + "index": "800", + "color": "4E342E" + }, + { + "index": "900", + "color": "3E2723" + } + ] + }, + { + "name": "Grey", + "colors": [ + { + "index": "50", + "color": "FAFAFA" + }, + { + "index": "100", + "color": "F5F5F5" + }, + { + "index": "200", + "color": "EEEEEE" + }, + { + "index": "300", + "color": "E0E0E0" + }, + { + "index": "400", + "color": "BDBDBD" + }, + { + "index": "500", + "color": "9E9E9E" + }, + { + "index": "600", + "color": "757575" + }, + { + "index": "700", + "color": "616161" + }, + { + "index": "800", + "color": "424242" + }, + { + "index": "900", + "color": "212121" + } + ] + }, + { + "name": "Blue Grey", + "colors": [ + { + "index": "50", + "color": "ECEFF1" + }, + { + "index": "100", + "color": "CFD8DC" + }, + { + "index": "200", + "color": "B0BEC5" + }, + { + "index": "300", + "color": "90A4AE" + }, + { + "index": "400", + "color": "78909C" + }, + { + "index": "500", + "color": "607D8B" + }, + { + "index": "600", + "color": "546E7A" + }, + { + "index": "700", + "color": "455A64" + }, + { + "index": "800", + "color": "37474F" + }, + { + "index": "900", + "color": "263238" + } + ] + } + ] +} \ No newline at end of file diff --git a/smali/res/layout/color_picker_item.xml b/smali/res/layout/color_picker_item.xml new file mode 100644 index 000000000..c8e98abef --- /dev/null +++ b/smali/res/layout/color_picker_item.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/smali/res/values/public.xml b/smali/res/values/public.xml index ad152e46d..056c40213 100644 --- a/smali/res/values/public.xml +++ b/smali/res/values/public.xml @@ -6867,6 +6867,10 @@ + + + + From 23dd5a71e081abb76a82b533a41b6aa0e98d7b2d Mon Sep 17 00:00:00 2001 From: Vologhat Date: Fri, 2 Dec 2022 18:48:47 +0300 Subject: [PATCH 47/95] add new accent choices --- .../lite/ui/fragments/AccentsFragment.java | 147 ------------- .../ui/fragments/BaseToolbarFragment.java | 6 +- .../lite/ui/fragments/ThemesFragment.java | 196 +++++++++++++----- .../tgstickers/StickersFragment.java | 4 +- smali/res/xml/preferences_themes.xml | 1 + 5 files changed, 149 insertions(+), 205 deletions(-) delete mode 100644 app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java deleted file mode 100644 index a8f1522c0..000000000 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/AccentsFragment.java +++ /dev/null @@ -1,147 +0,0 @@ -package ru.vtosters.lite.ui.fragments; - -import android.content.Intent; -import android.content.res.ColorStateList; -import android.graphics.Color; -import android.net.Uri; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextUtils; -import android.text.TextWatcher; -import android.view.ViewGroup; -import android.widget.LinearLayout; - -import androidx.preference.Preference; - -import com.vk.core.dialogs.alert.VkAlertDialog; -import com.vk.core.util.ToastUtils; -import com.vtosters.lite.R; -import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; -import com.vtosters.lite.ui.EditText; - -import java.util.Collections; - -import ru.vtosters.lite.themes.ThemesCore; -import ru.vtosters.lite.ui.PreferencesUtil; -import ru.vtosters.lite.utils.AndroidUtils; -import ru.vtosters.lite.utils.LifecycleUtils; -import ru.vtosters.lite.utils.ThemesUtils; - -public class AccentsFragment extends MaterialPreferenceToolbarFragment { - private static final int MAX_COLOR_STR_LEN = 7; // without transparency - private static final String HEX = "0123456789abcdefABCDEF"; - @Override - public void onCreate(Bundle bundle) { - super.onCreate(bundle); - addPreferencesFromResource(R.xml.empty); - - PreferencesUtil.addPreferenceCategory(this, "Выбор цвета"); - - PreferencesUtil.addPreferenceDrawable(this, "", "Выбор акцента через Hex", "Точная настройка цвета", ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.bg_accent_circle)), preference -> { - showEditAccentColorDialog(); - return false; - }); - - PreferencesUtil.addPreferenceCategory(this, "Полезная информация"); - - PreferencesUtil.addPreference(this, "Внимание!", "Функция находится на стадии тестирования и могут наблюдаться ошибки", 0, null); - - PreferencesUtil.addPreference(this, "Color-Hex", "Полезный ресурс со всевозможными hex-цветами", 0, preference -> { - requireContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://www.color-hex.com"))); - return false; - }); - } - - void showEditAccentColorDialog() { - LinearLayout linearLayout = new LinearLayout(requireContext()); - - final EditText editText = new EditText(requireContext()); - editText.setHint("Акцент"); - editText.setText(ThemesUtils.hex(ThemesUtils.getAccentColor())); - editText.setHintTextColor(PreferencesUtil.getSTextColor(requireActivity())); - editText.setBackgroundTintList(ColorStateList.valueOf(ThemesUtils.getAccentColor())); - - linearLayout.addView(editText); - editText.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT; - ViewGroup.MarginLayoutParams margin = ((ViewGroup.MarginLayoutParams) editText.getLayoutParams()); - margin.setMargins(AndroidUtils.dp2px(24f), 0, AndroidUtils.dp2px(24f), 0); - editText.setLayoutParams(margin); - - editText.addTextChangedListener(new TextWatcher() { - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - - } - - @Override - public void afterTextChanged(Editable s) { - if (!TextUtils.isEmpty(s)) { - if (s.length() > MAX_COLOR_STR_LEN) - // check if data is fully color string - if (s.charAt(0) == '#' && s.charAt(1) == '#') - s.replace(0, 1, ""); - else - s.replace(MAX_COLOR_STR_LEN - 1, s.length() - 1, ""); - int i = s.charAt(0) == '#' ? 1 : 0; - // If the first distinct character is found, then there is no need to return to the start of the array - while (i >= 0 && i < s.length()) { - if (HEX.indexOf(s.charAt(i)) == -1) { - s.delete(i, i + 1); - } else i++; - } - } else s.append("#"); - } - }); - - new VkAlertDialog.Builder(requireContext()) - .setTitle("Акценты") - .setMessage("Это изменит цвет иконки таббара, ссылки и.т.д." + - "\nДанная функция еще в разработке, поэтому возможны недокрасы!" + - "\n\nЦвет указывается в формате #RRGGBB (#9600FF).") - .setView(linearLayout) - .setPositiveButton("OK", - (dialog, which) - -> changeAccentColor(editText.getText() - .toString() - .toUpperCase())) - .setNeutralButton("Сброс", (dialog, which) -> resetAccentColor()) - .show(); - } - - void changeAccentColor(String colorStr) { - if (TextUtils.isEmpty(colorStr)) { - ThemesUtils.setCustomAccentColor(0, false); - LifecycleUtils.restartApplicationWithTimer(); - return; - } - // fix color string length - if (colorStr.length() < MAX_COLOR_STR_LEN) - colorStr += String.join("", Collections.nCopies(MAX_COLOR_STR_LEN - colorStr.length(), "0")); - int color; - try { - color = Color.parseColor(colorStr); - } catch (Exception e) { - ToastUtils.a("Ошибка: неправильный формат цвета."); - return; - } - - ThemesUtils.setCustomAccentColor(color, false); - ThemesCore.setThemedColors(color); - LifecycleUtils.restartApplicationWithTimer(); - } - - void resetAccentColor() { - changeAccentColor(""); - } - - @Override - public int T4() { - return R.string.vtlthemes; - } -} diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/BaseToolbarFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/BaseToolbarFragment.java index 308cc39c2..1a1e5f905 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/BaseToolbarFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/BaseToolbarFragment.java @@ -25,7 +25,7 @@ public abstract class BaseToolbarFragment extends FragmentImpl { private Toolbar mToolbar; private FrameLayout mContentLayout; - @CallSuper + protected void onCreateMenu(Menu menu) { if (menu.size() > 0) for (int i = 0; i < menu.size(); i++) @@ -63,6 +63,10 @@ public abstract class BaseToolbarFragment extends FragmentImpl { return mRootView; } + public Toolbar getToolbar() { + return mToolbar; + } + public abstract View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle); private void initToolbar() { diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java index 285f82758..aecd38451 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/ThemesFragment.java @@ -1,19 +1,27 @@ package ru.vtosters.lite.ui.fragments; -import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; +import android.util.Log; -import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; +import com.vk.core.dialogs.alert.VkAlertDialog; +import com.vk.core.fragments.FragmentImpl; import com.vk.navigation.Navigator; import com.vtosters.lite.R; import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment; +import ru.vtosters.lite.themes.ColorReferences; +import ru.vtosters.lite.themes.ThemesCore; +import ru.vtosters.lite.themes.palettes.PalettesManager; +import ru.vtosters.lite.ui.dialogs.PalettesBottomSheetDialog; +import ru.vtosters.lite.ui.views.rarepebble.ColorPickerView; import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.LifecycleUtils; import ru.vtosters.lite.utils.Preferences; - +import ru.vtosters.lite.utils.ThemesUtils; public class ThemesFragment extends MaterialPreferenceToolbarFragment { @@ -21,24 +29,75 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { public void onCreate(Bundle bundle) { super.onCreate(bundle); addPreferencesFromResource(R.xml.preferences_themes); - prefs(); + initPreferences(); } - private void prefs() { - findPreference("accent_color").setOnPreferenceClickListener(new Accents()); - findPreference("navbar").setOnPreferenceClickListener(new restart()); - findPreference("milkshake").setOnPreferenceClickListener(new restart()); - findPreference("darktheme").setOnPreferenceChangeListener(new restartdark()); - findPreference("lighttheme").setOnPreferenceChangeListener(new restartlight()); - findPreference("iconmanager").setOnPreferenceClickListener(new openicons()); - findPreference("dockbar_tab_titles").setOnPreferenceClickListener(new restart()); - findPreference("dockbar_accent").setOnPreferenceClickListener(new restart()); - findPreference("dockcounter").setOnPreferenceClickListener(new restart()); - findPreference("newsfeed_notif").setOnPreferenceClickListener(new restart()); - findPreference("newsfeed_notif").setVisible(Preferences.milkshake()); + private void initPreferences() { + var accentColorPreference = findPreference("accent_color"); + accentColorPreference.setIcon(ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.bg_accent_circle))); + accentColorPreference.setOnPreferenceClickListener(preference -> { + changeAccent(); + return false; + }); + + var navBarPreference = findPreference("navbar"); + navBarPreference.setOnPreferenceClickListener(preference -> { + restart(); + return false; + }); + + var milkshakePreference = findPreference("milkshake"); + milkshakePreference.setOnPreferenceClickListener(preference -> { + restart(); + return false; + }); + + var darkThemePreference = findPreference("darktheme"); + darkThemePreference.setOnPreferenceChangeListener((preference, o) -> { + restartDark(o.toString()); + return false; + }); + + var lightThemePreference = findPreference("lighttheme"); + lightThemePreference.setOnPreferenceChangeListener(((preference, o) -> { + restartLight(o.toString()); + return false; + })); + + var iconManagerPreference = findPreference("iconmanager"); + iconManagerPreference.setOnPreferenceClickListener(preference -> { + switchFragment(IconsFragment.class); + return false; + }); + + var dockbarTabTitlesPreference = findPreference("dockbar_tab_titles"); + dockbarTabTitlesPreference.setOnPreferenceClickListener(preference -> { + restart(); + return false; + }); + + var dockbarAccentPreference = findPreference("dockbar_accent"); + dockbarAccentPreference.setOnPreferenceClickListener(preference -> { + restart(); + return false; + }); + + var dockCounterPreference = findPreference("dockcounter"); + dockCounterPreference.setOnPreferenceClickListener(preference -> { + restart(); + return false; + }); + + var newsfeedNotificationsPreference = findPreference("newsfeed_notif"); + newsfeedNotificationsPreference.setOnPreferenceClickListener(preference -> { + restart(); + return false; + }); + newsfeedNotificationsPreference.setVisible(Preferences.milkshake()); if (AndroidUtils.isTablet()) { - findPreference("dockbarsett").setVisible(false); + PreferenceCategory dockbarSettingsPreferenceCategory = (PreferenceCategory) findPreference("dockbarsett"); + dockbarSettingsPreferenceCategory.setVisible(false); } } @@ -47,51 +106,78 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment { return R.string.vtlthemes; } - public static class restart implements Preference.OnPreferenceClickListener { - @Override - public boolean onPreferenceClick(Preference preference) { - LifecycleUtils.restartApplicationWithTimer(); - return true; - } + void changeAccent() { + final var titles = new String[] { + "Advanced Color Picker by Martin Stone", + "From Palettes" + }; + new VkAlertDialog.Builder(requireContext()) + .setTitle("Change accent color") + .setItems(titles, (dialog, which) -> { + switch (which) { + case 0: + showColorPicker(); + break; + case 1: + showPalettesDialog(); + break; + } + }) + .setNegativeButton(R.string.reset, (dialog, which) -> setAccentColor(ColorReferences.stockAccent)) + .setPositiveButton(R.string.cancel, null) + .show(); } - public static class restartlight implements Preference.OnPreferenceChangeListener { - @Override - public boolean onPreferenceChange(Preference preference, Object o) { - AndroidUtils.edit().putString("lighttheme", o.toString()).commit(); - LifecycleUtils.restartApplicationWithTimer(); - return false; - } + void showColorPicker() { + final var colorPickerView = new ColorPickerView(requireContext()); + colorPickerView.setColor(ThemesUtils.getAccentColor()); + new VkAlertDialog.Builder(requireContext()) + .setTitle("Select color") + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.select, (dialog, which) -> setAccentColor(colorPickerView.getColor())) + .setView(colorPickerView) + .show(); } - public static class restartdark implements Preference.OnPreferenceChangeListener { - @Override - public boolean onPreferenceChange(Preference preference, Object o) { - AndroidUtils.edit().putString("darktheme", o.toString()).commit(); - LifecycleUtils.restartApplicationWithTimer(); - return false; - } + void showPalettesDialog() { + final var manager = PalettesManager.getInstance(); + final var titles = new String[manager.getPalettesCount()]; + for (int i = 0; i < titles.length; ++i) + titles[i] = manager.getPalette(i).name; + new VkAlertDialog.Builder(requireContext()) + .setTitle("Select palette") + .setItems(titles, (dialog, which) -> + PalettesBottomSheetDialog.create(requireActivity(), manager.getPalette(which), + (adapter, vtlcolor) -> setAccentColor(vtlcolor.color)) + ) + .setPositiveButton(R.string.cancel, null) + .show(); } - public class openicons implements Preference.OnPreferenceClickListener { - @Override - public boolean onPreferenceClick(Preference preference) { - Context context = requireContext(); - Intent a2 = new Navigator(IconsFragment.class).b(context); - a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(a2); - return true; - } + void setAccentColor(int color) { + ThemesUtils.setCustomAccentColor(color, false); + ThemesCore.setThemedColors(color); + LifecycleUtils.restartApplicationWithTimer(); } - private class Accents implements Preference.OnPreferenceClickListener { - @Override - public boolean onPreferenceClick(Preference preference) { - Context context = requireContext(); - Intent a2 = new Navigator(AccentsFragment.class).b(context); - a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(a2); - return true; - } + void restart() { + LifecycleUtils.restartApplicationWithTimer(); + } + + void restartLight(String value) { + AndroidUtils.edit().putString("lighttheme", value).commit(); + LifecycleUtils.restartApplicationWithTimer(); + } + + void restartDark(String value) { + AndroidUtils.edit().putString("darktheme", value).commit(); + LifecycleUtils.restartApplicationWithTimer(); + } + + private void switchFragment(Class fragmentClz) { + var intent = new Navigator(fragmentClz) + .b(requireContext()) + .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + requireContext().startActivity(intent); } } diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java index 979e82315..3f74ae13b 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/tgstickers/StickersFragment.java @@ -84,8 +84,8 @@ public class StickersFragment extends BaseToolbarFragment { @Override protected void onCreateMenu(Menu menu) { var item = menu.add(0, 0, 0, ""); - item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); - item.setIcon(R.drawable.ic_settings_24); + item.setIcon(R.drawable.ic_settings_24) + .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); super.onCreateMenu(menu); } diff --git a/smali/res/xml/preferences_themes.xml b/smali/res/xml/preferences_themes.xml index 2376a8fc2..9ce754a98 100644 --- a/smali/res/xml/preferences_themes.xml +++ b/smali/res/xml/preferences_themes.xml @@ -4,6 +4,7 @@
From 1344e88b95ee831fa33266819f1c29c2222558c0 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Fri, 2 Dec 2022 18:52:49 +0300 Subject: [PATCH 48/95] added alpha dark/amoled theme monet on sdk 31 todo light theme --- .../vtosters/lite/themes/ColorReferences.java | 1 - .../ru/vtosters/lite/utils/ThemesUtils.java | 4 +- smali/res/values-v31/styles.xml | 2126 +++++++++++++++++ smali/res/values/styles.xml | 3 - 4 files changed, 2128 insertions(+), 6 deletions(-) create mode 100644 smali/res/values-v31/styles.xml diff --git a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java index 81791e046..05297d4c4 100644 --- a/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java +++ b/app/src/main/java/ru/vtosters/lite/themes/ColorReferences.java @@ -8,7 +8,6 @@ import java.util.Arrays; import java.util.List; public class ColorReferences { - public static final int stockAccent = Color.parseColor(ThemesUtils.isDarkTheme() ? "#71aaeb" : "#528bcc"); public static List accentColors = Arrays.asList( Color.parseColor("#3f8ae0"), // azure_300 (light accent) Color.parseColor("#4986cc"), // azure_a400 diff --git a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java index c6f11aa1a..d585c363a 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -91,8 +91,8 @@ public class ThemesUtils { } public static int getAccentColor() { - var accent = AndroidUtils.getPreferences().getInt("accent_color", ColorReferences.stockAccent); - return accent == 0 ? ColorReferences.stockAccent : accent; + var accent = AndroidUtils.getPreferences().getInt("accent_color", getColorFromAttr(R.attr.accent)); + return accent == 0 ? getColorFromAttr(R.attr.accent) : accent; } // Color accent public static void setCustomAccentColor(int newColor, boolean async) { diff --git a/smali/res/values-v31/styles.xml b/smali/res/values-v31/styles.xml new file mode 100644 index 000000000..0f06c7e8a --- /dev/null +++ b/smali/res/values-v31/styles.xml @@ -0,0 +1,2126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/smali/res/values/styles.xml b/smali/res/values/styles.xml index 123775232..ef80fd093 100644 --- a/smali/res/values/styles.xml +++ b/smali/res/values/styles.xml @@ -9209,8 +9209,6 @@ @menu/bottom_navigation_milkshake - - -