add new accent choices

This commit is contained in:
Vologhat
2022-12-02 18:48:47 +03:00
parent 810e5c72c1
commit 23dd5a71e0
5 changed files with 149 additions and 205 deletions
@@ -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;
}
}
@@ -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() {
@@ -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<? extends FragmentImpl> fragmentClz) {
var intent = new Navigator(fragmentClz)
.b(requireContext())
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
requireContext().startActivity(intent);
}
}
@@ -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);
}
+1
View File
@@ -4,6 +4,7 @@
<Preference
android:key="accent_color"
android:summary="Цвет акцента в приложении"
android:icon="@drawable/bg_accent_circle"
android:title="Цвет акцента" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/vtlthemes">