diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index 471807f5e..f28e8a7d9 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -4,7 +4,6 @@ import android.content.Context; import android.content.SharedPreferences; public class GlobalUserPreferences{ - public static boolean originalColors; public static boolean playGifs; public static boolean useCustomTabs; public static boolean trueBlackTheme; @@ -15,6 +14,7 @@ public class GlobalUserPreferences{ public static boolean alwaysExpandContentWarnings; public static boolean disableMarquee; public static ThemePreference theme; + public static ColorPreference color; private static SharedPreferences getPrefs(){ return MastodonApp.context.getSharedPreferences("global", Context.MODE_PRIVATE); @@ -22,7 +22,6 @@ public class GlobalUserPreferences{ public static void load(){ SharedPreferences prefs=getPrefs(); - originalColors=prefs.getBoolean("originalColors", false); playGifs=prefs.getBoolean("playGifs", true); useCustomTabs=prefs.getBoolean("useCustomTabs", true); trueBlackTheme=prefs.getBoolean("trueBlackTheme", false); @@ -33,11 +32,11 @@ public class GlobalUserPreferences{ alwaysExpandContentWarnings=prefs.getBoolean("alwaysExpandContentWarnings", false); disableMarquee=prefs.getBoolean("disableMarquee", false); theme=ThemePreference.values()[prefs.getInt("theme", 0)]; + color=ColorPreference.values()[prefs.getInt("color", 0)]; } public static void save(){ getPrefs().edit() - .putBoolean("originalColors", originalColors) .putBoolean("playGifs", playGifs) .putBoolean("useCustomTabs", useCustomTabs) .putBoolean("showReplies", showReplies) @@ -48,9 +47,15 @@ public class GlobalUserPreferences{ .putBoolean("alwaysExpandContentWarnings", alwaysExpandContentWarnings) .putBoolean("disableMarquee", disableMarquee) .putInt("theme", theme.ordinal()) + .putInt("color", color.ordinal()) .apply(); } + public enum ColorPreference{ + PINK, + PURPLE + } + public enum ThemePreference{ AUTO, LIGHT, diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java index cf44646d9..0b2c63f76 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -9,6 +9,7 @@ import android.graphics.Canvas; import android.graphics.Rect; import android.os.Build; import android.os.Bundle; +import android.provider.Settings; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -99,8 +100,7 @@ public class SettingsFragment extends MastodonToolbarFragment{ GlobalUserPreferences.disableMarquee=i.checked; GlobalUserPreferences.save(); })); - items.add(new SwitchItem(R.string.enable_mastodon_original_colors, R.drawable.bg_button_green, GlobalUserPreferences.originalColors, this::onOriginalColorChanged)); - + items.add(new ColorPicker()); items.add(new HeaderItem(R.string.settings_behavior)); items.add(new SwitchItem(R.string.settings_gif, R.drawable.ic_fluent_gif_24_regular, GlobalUserPreferences.playGifs, i->{ @@ -226,6 +226,12 @@ public class SettingsFragment extends MastodonToolbarFragment{ restartActivityToApplyNewTheme(); } + private void onColorPreferenceClick(GlobalUserPreferences.ColorPreference color){ + GlobalUserPreferences.color=color; + GlobalUserPreferences.save(); + restartActivityToApplyNewTheme(); + } + private void onTrueBlackThemeChanged(SwitchItem item){ GlobalUserPreferences.trueBlackTheme=item.checked; GlobalUserPreferences.save(); @@ -242,12 +248,6 @@ public class SettingsFragment extends MastodonToolbarFragment{ } } - private void onOriginalColorChanged(SwitchItem item){ - GlobalUserPreferences.originalColors=item.checked; - GlobalUserPreferences.save(); - restartActivityToApplyNewTheme(); - } - private void restartActivityToApplyNewTheme(){ // Calling activity.recreate() causes a black screen for like half a second. // So, let's take a screenshot and overlay it on top to create the illusion of a smoother transition. @@ -434,6 +434,13 @@ public class SettingsFragment extends MastodonToolbarFragment{ } } + public class ColorPicker extends Item{ + @Override + public int getViewType(){ + return 8; + } + } + private static class ThemeItem extends Item{ @Override @@ -518,6 +525,7 @@ public class SettingsFragment extends MastodonToolbarFragment{ case 5 -> new HeaderViewHolder(true); case 6 -> new FooterViewHolder(); case 7 -> new UpdateViewHolder(); + case 8 -> new ColorPickerViewHolder(); default -> throw new IllegalStateException("Unexpected value: "+viewType); }; } @@ -646,6 +654,45 @@ public class SettingsFragment extends MastodonToolbarFragment{ } } } + private class ColorPickerViewHolder extends BindableViewHolder{ + private final Button button; + private final PopupMenu popupMenu; + + @SuppressLint("ClickableViewAccessibility") + public ColorPickerViewHolder(){ + super(getActivity(), R.layout.item_settings_color_picker, list); + button=findViewById(R.id.color_picker_button); + popupMenu=new PopupMenu(getActivity(), button, Gravity.CENTER_HORIZONTAL); + popupMenu.inflate(R.menu.color_picker); + popupMenu.setOnMenuItemClickListener(item->{ + GlobalUserPreferences.ColorPreference pref; + int id=item.getItemId(); + if(id==R.id.pink_color) { + pref = GlobalUserPreferences.ColorPreference.PINK; + onColorPreferenceClick(pref); + } + else if(id==R.id.purple_color) { + pref = GlobalUserPreferences.ColorPreference.PURPLE; + onColorPreferenceClick(pref); + } + else + return false; + return true; + }); + UiUtils.enablePopupMenuIcons(getActivity(), popupMenu); + button.setOnTouchListener(popupMenu.getDragToOpenListener()); + button.setOnClickListener(v->popupMenu.show()); + } + + @Override + public void onBind(ColorPicker item){ + button.setText(switch(GlobalUserPreferences.color){ + case PINK -> R.string.pink_color; + case PURPLE -> R.string.purple_color; + }); + } + } + private class NotificationPolicyViewHolder extends BindableViewHolder{ private final Button button; diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index 037b74255..1f8c02e2a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -20,6 +20,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.provider.OpenableColumns; +import android.provider.Settings; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.view.Menu; @@ -656,14 +657,29 @@ public class UiUtils{ public static void setUserPreferredTheme(Context context){ // boolean isDarkTheme = isDarkTheme(); - context.setTheme(switch(GlobalUserPreferences.theme){ - case AUTO -> - GlobalUserPreferences.originalColors ? (GlobalUserPreferences.trueBlackTheme ? R.style.Theme_Mastodon_AutoLightDark_TrueBlack_Original : R.style.Theme_Mastodon_AutoLightDark_Original) : (GlobalUserPreferences.trueBlackTheme ? R.style.Theme_Mastodon_AutoLightDark_TrueBlack : R.style.Theme_Mastodon_AutoLightDark); - case LIGHT -> - GlobalUserPreferences.originalColors ? R.style.Theme_Mastodon_Light_Original : R.style.Theme_Mastodon_Light; - case DARK -> - GlobalUserPreferences.originalColors ? (GlobalUserPreferences.trueBlackTheme ? R.style.Theme_Mastodon_Dark_TrueBlack_Original : R.style.Theme_Mastodon_Dark_Original) : (GlobalUserPreferences.trueBlackTheme ? R.style.Theme_Mastodon_Dark_TrueBlack : R.style.Theme_Mastodon_Dark); - }); + switch(GlobalUserPreferences.color){ + case PINK: + context.setTheme(switch(GlobalUserPreferences.theme){ + case AUTO -> + GlobalUserPreferences.trueBlackTheme ? R.style.Theme_Mastodon_AutoLightDark_TrueBlack : R.style.Theme_Mastodon_AutoLightDark; + case LIGHT -> + R.style.Theme_Mastodon_Light; + case DARK -> + GlobalUserPreferences.trueBlackTheme ? R.style.Theme_Mastodon_Dark_TrueBlack : R.style.Theme_Mastodon_Dark; + }); + break; + case PURPLE: + context.setTheme(switch(GlobalUserPreferences.theme){ + case AUTO -> + GlobalUserPreferences.trueBlackTheme ? R.style.Theme_Mastodon_AutoLightDark_TrueBlack_Original : R.style.Theme_Mastodon_AutoLightDark_Original; + case LIGHT -> + R.style.Theme_Mastodon_Light_Original; + case DARK -> + GlobalUserPreferences.trueBlackTheme ? R.style.Theme_Mastodon_Dark_TrueBlack_Original : R.style.Theme_Mastodon_Dark_Original; + }); + break; + } + } public static boolean isDarkTheme(){ if(GlobalUserPreferences.theme==GlobalUserPreferences.ThemePreference.AUTO) diff --git a/mastodon/src/main/res/layout/item_settings_color_picker.xml b/mastodon/src/main/res/layout/item_settings_color_picker.xml new file mode 100644 index 000000000..9cab20a59 --- /dev/null +++ b/mastodon/src/main/res/layout/item_settings_color_picker.xml @@ -0,0 +1,37 @@ + + + + + +