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] [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 @@ + + + - +