[WIP] Accent picker in settings

This commit is contained in:
aliveoutside
2022-11-23 22:24:25 +03:00
parent c17e604db6
commit 76468d8863
5 changed files with 95 additions and 14 deletions
@@ -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<Integer> accentColors = Arrays.asList(
Color.parseColor("#3f8ae0"), // azure_300 (light accent)
Color.parseColor("#4986cc"), // azure_a400
@@ -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;
}
@@ -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;
}
}
}
@@ -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() {
+9 -1
View File
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Акценты">
<Preference
android:key="accent_color"
android:summary="Цвет акцента в приложении"
android:title="Цвет акцента" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/vtlthemes">
<com.vtosters.lite.ui.MaterialSwitchPreference
android:defaultValue="true"
@@ -25,7 +31,9 @@
android:key="lighttheme"
android:title="@string/appearance_theme_light_theme" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/vtl_settings_dockbar_title" android:key="dockbarsett">
<PreferenceCategory
android:key="dockbarsett"
android:title="@string/vtl_settings_dockbar_title">
<com.vtosters.lite.ui.MaterialSwitchPreference
android:defaultValue="true"
android:key="dockbar_tab_titles"