From f15e4c004d063e181cdc1e951cb6cb31efd74ebe Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Thu, 8 Dec 2022 13:28:50 +0300 Subject: [PATCH] color handles --- .../lite/themes/hooks/TextViewHook.java | 1 + .../ru/vtosters/lite/utils/ThemesUtils.java | 70 ++++++++++++++++--- 2 files changed, 61 insertions(+), 10 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 ea67e5ecb..da8e65948 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 @@ -106,6 +106,7 @@ public class TextViewHook implements BaseHook { ThemesUtils.setCursorColor((EditText) view); } + ThemesUtils.colorHandles(textView); VkUiThemer.autoThemeVkuiButtons(textView); ThemesHacks.fixProfileSelector(textView); ThemesHacks.fixThemedFeed(textView, i); 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 023ff5aa9..5e332108c 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java +++ b/app/src/main/java/ru/vtosters/lite/utils/ThemesUtils.java @@ -106,7 +106,7 @@ public class ThemesUtils { public static void setCursorColor(EditText view) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - view.setTextCursorDrawable(recolorDrawable(view.getTextCursorDrawable())); + view.getTextCursorDrawable().setColorFilter(ThemesUtils.getAccentColor(), PorterDuff.Mode.SRC_IN); } else { Field field = TextView.class.getDeclaredField("mCursorDrawableRes"); field.setAccessible(true); @@ -116,17 +116,67 @@ public class ThemesUtils { field.setAccessible(true); Object editor = field.get(view); - Drawable drawable = ContextCompat.getDrawable(view.getContext(), drawableResId); - drawable.setColorFilter(getAccentColor(), PorterDuff.Mode.SRC_IN); - Drawable[] drawables = {drawable, drawable}; + if (editor != null) { + Drawable drawable = ContextCompat.getDrawable(view.getContext(), drawableResId); + drawable.setColorFilter(getAccentColor(), PorterDuff.Mode.SRC_IN); + Drawable[] drawables = {drawable, drawable}; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - field = editor.getClass().getDeclaredField("mCursorDrawable"); - } else { - field = editor.getClass().getDeclaredField("mDrawableForCursor"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + field = editor.getClass().getDeclaredField("mCursorDrawable"); + } else { + field = editor.getClass().getDeclaredField("mDrawableForCursor"); + } + field.setAccessible(true); + field.set(editor, drawables); + } + } + } catch (Exception ignored) { + } + } + @SuppressLint("DiscouragedPrivateApi") + public static void colorHandles(TextView view) { + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + view.getTextSelectHandle().setColorFilter(ThemesUtils.getAccentColor(), PorterDuff.Mode.SRC_IN); + } else { + Field editorField = TextView.class.getDeclaredField("mEditor"); + + if (!editorField.isAccessible()) editorField.setAccessible(true); + + Object editor = editorField.get(view); + + if (editor != null) { + Class editorClass; + + editorClass = editor.getClass(); + + String[] handleNames = {"mSelectHandleLeft", "mSelectHandleRight", "mSelectHandleCenter"}; + String[] resNames = {"mTextSelectHandleLeftRes", "mTextSelectHandleRightRes", "mTextSelectHandleRes"}; + + for (int i = 0; i < handleNames.length; i++) { + Field handleField = editorClass.getDeclaredField(handleNames[i]); + if (!handleField.isAccessible()) { + handleField.setAccessible(true); + } + + Drawable handleDrawable = (Drawable) handleField.get(editor); + + if (handleDrawable == null) { + Field resField = TextView.class.getDeclaredField(resNames[i]); + if (!resField.isAccessible()) { + resField.setAccessible(true); + } + int resId = resField.getInt(view); + handleDrawable = view.getResources().getDrawable(resId); + } + + if (handleDrawable != null) { + Drawable drawable = handleDrawable.mutate(); + drawable.setColorFilter(getAccentColor(), PorterDuff.Mode.SRC_IN); + handleField.set(editor, drawable); + } + } } - field.setAccessible(true); - field.set(editor, drawables); } } catch (Exception ignored) { }