add new accent choices
This commit is contained in:
@@ -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 Toolbar mToolbar;
|
||||||
private FrameLayout mContentLayout;
|
private FrameLayout mContentLayout;
|
||||||
|
|
||||||
@CallSuper
|
|
||||||
protected void onCreateMenu(Menu menu) {
|
protected void onCreateMenu(Menu menu) {
|
||||||
if (menu.size() > 0)
|
if (menu.size() > 0)
|
||||||
for (int i = 0; i < menu.size(); i++)
|
for (int i = 0; i < menu.size(); i++)
|
||||||
@@ -63,6 +63,10 @@ public abstract class BaseToolbarFragment extends FragmentImpl {
|
|||||||
return mRootView;
|
return mRootView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Toolbar getToolbar() {
|
||||||
|
return mToolbar;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle);
|
public abstract View onCreateContent(@NonNull LayoutInflater inflater, @Nullable Bundle bundle);
|
||||||
|
|
||||||
private void initToolbar() {
|
private void initToolbar() {
|
||||||
|
|||||||
@@ -1,19 +1,27 @@
|
|||||||
package ru.vtosters.lite.ui.fragments;
|
package ru.vtosters.lite.ui.fragments;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
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.vk.navigation.Navigator;
|
||||||
import com.vtosters.lite.R;
|
import com.vtosters.lite.R;
|
||||||
import com.vtosters.lite.general.fragments.MaterialPreferenceToolbarFragment;
|
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.AndroidUtils;
|
||||||
import ru.vtosters.lite.utils.LifecycleUtils;
|
import ru.vtosters.lite.utils.LifecycleUtils;
|
||||||
import ru.vtosters.lite.utils.Preferences;
|
import ru.vtosters.lite.utils.Preferences;
|
||||||
|
import ru.vtosters.lite.utils.ThemesUtils;
|
||||||
|
|
||||||
public class ThemesFragment extends MaterialPreferenceToolbarFragment {
|
public class ThemesFragment extends MaterialPreferenceToolbarFragment {
|
||||||
|
|
||||||
@@ -21,24 +29,75 @@ public class ThemesFragment extends MaterialPreferenceToolbarFragment {
|
|||||||
public void onCreate(Bundle bundle) {
|
public void onCreate(Bundle bundle) {
|
||||||
super.onCreate(bundle);
|
super.onCreate(bundle);
|
||||||
addPreferencesFromResource(R.xml.preferences_themes);
|
addPreferencesFromResource(R.xml.preferences_themes);
|
||||||
prefs();
|
initPreferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void prefs() {
|
private void initPreferences() {
|
||||||
findPreference("accent_color").setOnPreferenceClickListener(new Accents());
|
var accentColorPreference = findPreference("accent_color");
|
||||||
findPreference("navbar").setOnPreferenceClickListener(new restart());
|
accentColorPreference.setIcon(ThemesUtils.recolorDrawable(requireContext().getDrawable(R.drawable.bg_accent_circle)));
|
||||||
findPreference("milkshake").setOnPreferenceClickListener(new restart());
|
accentColorPreference.setOnPreferenceClickListener(preference -> {
|
||||||
findPreference("darktheme").setOnPreferenceChangeListener(new restartdark());
|
changeAccent();
|
||||||
findPreference("lighttheme").setOnPreferenceChangeListener(new restartlight());
|
return false;
|
||||||
findPreference("iconmanager").setOnPreferenceClickListener(new openicons());
|
});
|
||||||
findPreference("dockbar_tab_titles").setOnPreferenceClickListener(new restart());
|
|
||||||
findPreference("dockbar_accent").setOnPreferenceClickListener(new restart());
|
var navBarPreference = findPreference("navbar");
|
||||||
findPreference("dockcounter").setOnPreferenceClickListener(new restart());
|
navBarPreference.setOnPreferenceClickListener(preference -> {
|
||||||
findPreference("newsfeed_notif").setOnPreferenceClickListener(new restart());
|
restart();
|
||||||
findPreference("newsfeed_notif").setVisible(Preferences.milkshake());
|
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()) {
|
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;
|
return R.string.vtlthemes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class restart implements Preference.OnPreferenceClickListener {
|
void changeAccent() {
|
||||||
@Override
|
final var titles = new String[] {
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
"Advanced Color Picker by Martin Stone",
|
||||||
LifecycleUtils.restartApplicationWithTimer();
|
"From Palettes"
|
||||||
return true;
|
};
|
||||||
}
|
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 {
|
void showColorPicker() {
|
||||||
@Override
|
final var colorPickerView = new ColorPickerView(requireContext());
|
||||||
public boolean onPreferenceChange(Preference preference, Object o) {
|
colorPickerView.setColor(ThemesUtils.getAccentColor());
|
||||||
AndroidUtils.edit().putString("lighttheme", o.toString()).commit();
|
new VkAlertDialog.Builder(requireContext())
|
||||||
LifecycleUtils.restartApplicationWithTimer();
|
.setTitle("Select color")
|
||||||
return false;
|
.setNegativeButton(R.string.cancel, null)
|
||||||
}
|
.setPositiveButton(R.string.select, (dialog, which) -> setAccentColor(colorPickerView.getColor()))
|
||||||
|
.setView(colorPickerView)
|
||||||
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class restartdark implements Preference.OnPreferenceChangeListener {
|
void showPalettesDialog() {
|
||||||
@Override
|
final var manager = PalettesManager.getInstance();
|
||||||
public boolean onPreferenceChange(Preference preference, Object o) {
|
final var titles = new String[manager.getPalettesCount()];
|
||||||
AndroidUtils.edit().putString("darktheme", o.toString()).commit();
|
for (int i = 0; i < titles.length; ++i)
|
||||||
LifecycleUtils.restartApplicationWithTimer();
|
titles[i] = manager.getPalette(i).name;
|
||||||
return false;
|
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 {
|
void setAccentColor(int color) {
|
||||||
@Override
|
ThemesUtils.setCustomAccentColor(color, false);
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
ThemesCore.setThemedColors(color);
|
||||||
Context context = requireContext();
|
LifecycleUtils.restartApplicationWithTimer();
|
||||||
Intent a2 = new Navigator(IconsFragment.class).b(context);
|
|
||||||
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
context.startActivity(a2);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Accents implements Preference.OnPreferenceClickListener {
|
void restart() {
|
||||||
@Override
|
LifecycleUtils.restartApplicationWithTimer();
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
}
|
||||||
Context context = requireContext();
|
|
||||||
Intent a2 = new Navigator(AccentsFragment.class).b(context);
|
void restartLight(String value) {
|
||||||
a2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
AndroidUtils.edit().putString("lighttheme", value).commit();
|
||||||
context.startActivity(a2);
|
LifecycleUtils.restartApplicationWithTimer();
|
||||||
return true;
|
}
|
||||||
}
|
|
||||||
|
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
|
@Override
|
||||||
protected void onCreateMenu(Menu menu) {
|
protected void onCreateMenu(Menu menu) {
|
||||||
var item = menu.add(0, 0, 0, "");
|
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);
|
super.onCreateMenu(menu);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
<Preference
|
<Preference
|
||||||
android:key="accent_color"
|
android:key="accent_color"
|
||||||
android:summary="Цвет акцента в приложении"
|
android:summary="Цвет акцента в приложении"
|
||||||
|
android:icon="@drawable/bg_accent_circle"
|
||||||
android:title="Цвет акцента" />
|
android:title="Цвет акцента" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory android:title="@string/vtlthemes">
|
<PreferenceCategory android:title="@string/vtlthemes">
|
||||||
|
|||||||
Reference in New Issue
Block a user