From 9a10a7aaf65ad7eb75e7438bf494b202e993a992 Mon Sep 17 00:00:00 2001 From: Thomas Date: Tue, 29 Nov 2022 15:18:46 +0100 Subject: [PATCH] switch between themes --- .../app/fedilab/android/MainApplication.java | 3 + .../fedilab/android/helper/ThemeHelper.java | 21 ++++++ .../settings/FragmentThemingSettings.java | 15 ++-- .../res/navigation/nav_graph_settings.xml | 14 ++-- app/src/main/res/values/strings.xml | 18 +++++ app/src/main/res/xml/pref_theming.xml | 71 ++++--------------- 6 files changed, 71 insertions(+), 71 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/MainApplication.java b/app/src/main/java/app/fedilab/android/MainApplication.java index 0f699a8e..e53e23c3 100644 --- a/app/src/main/java/app/fedilab/android/MainApplication.java +++ b/app/src/main/java/app/fedilab/android/MainApplication.java @@ -30,6 +30,7 @@ import org.acra.config.DialogConfigurationBuilder; import org.acra.config.MailSenderConfigurationBuilder; import org.acra.data.StringFormat; +import app.fedilab.android.helper.ThemeHelper; import es.dmoral.toasty.Toasty; @@ -68,6 +69,8 @@ public class MainApplication extends MultiDexApplication { MultiDex.install(MainApplication.this); SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(MainApplication.this); boolean send_crash_reports = sharedpreferences.getBoolean(getString(R.string.SET_SEND_CRASH_REPORTS), false); + String currentTheme = sharedpreferences.getString(getString(R.string.SET_THEME_BASE), getString(R.string.SET_DEFAULT_THEME)); + ThemeHelper.switchTo(currentTheme); if (send_crash_reports) { ACRA.init(this, new CoreConfigurationBuilder() //core configuration: diff --git a/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java b/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java index 63707ab3..2a3045ac 100644 --- a/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/ThemeHelper.java @@ -23,6 +23,7 @@ import android.content.res.ColorStateList; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; +import android.os.Build; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; @@ -32,6 +33,7 @@ import android.view.animation.TranslateAnimation; import androidx.annotation.AttrRes; import androidx.annotation.ColorInt; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; @@ -264,6 +266,25 @@ public class ThemeHelper { activity.getBaseContext().getResources().updateConfiguration(configuration, metrics); } + public static void switchTo(String themePref) { + if (themes.LIGHT.name().equals(themePref)) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + } else if (themes.DARK.name().equals(themePref)) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); + } else { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY); + } + } + } + + public enum themes { + LIGHT, + DARK, + SYSTEM + } public interface SlideAnimation { void onAnimationEnded(); diff --git a/app/src/main/java/app/fedilab/android/ui/fragment/settings/FragmentThemingSettings.java b/app/src/main/java/app/fedilab/android/ui/fragment/settings/FragmentThemingSettings.java index 0ca7432c..545b5c51 100644 --- a/app/src/main/java/app/fedilab/android/ui/fragment/settings/FragmentThemingSettings.java +++ b/app/src/main/java/app/fedilab/android/ui/fragment/settings/FragmentThemingSettings.java @@ -60,6 +60,7 @@ import java.util.List; import app.fedilab.android.R; import app.fedilab.android.activities.ComposeActivity; +import app.fedilab.android.databinding.ActivityThemeSettingsBinding; import app.fedilab.android.databinding.PopupStatusThemeBinding; import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.ThemeHelper; @@ -72,7 +73,6 @@ public class FragmentThemingSettings extends PreferenceFragmentCompat implements private List> listOfThemes; private SharedPreferences appPref; private SharedPreferences cyneaPref; - private boolean shouldRestart; @Override public void onCreatePreferences(Bundle bundle, String s) { @@ -80,7 +80,6 @@ public class FragmentThemingSettings extends PreferenceFragmentCompat implements appPref = PreferenceManager.getDefaultSharedPreferences(requireActivity()); createPref(); listOfThemes = ThemeHelper.getContributorsTheme(requireActivity()); - shouldRestart = false; } @@ -109,7 +108,12 @@ public class FragmentThemingSettings extends PreferenceFragmentCompat implements if (key.equals("use_custom_theme")) { createPref(); } - shouldRestart = true; + if (key.compareTo(getString(R.string.SET_THEME_BASE)) == 0) { + ListPreference SET_THEME_BASE = findPreference(getString(R.string.SET_THEME_BASE)); + if (SET_THEME_BASE != null) { + ThemeHelper.switchTo(SET_THEME_BASE.getValue()); + } + } Helper.recreateMainActivity(requireActivity()); } @@ -300,8 +304,7 @@ public class FragmentThemingSettings extends PreferenceFragmentCompat implements Preference launch_custom_theme = findPreference("launch_custom_theme"); if (launch_custom_theme != null) { launch_custom_theme.setOnPreferenceClickListener(preference -> { - - shouldRestart = true; + startActivity(new Intent(requireActivity(), ActivityThemeSettingsBinding.class)); return false; }); @@ -418,7 +421,6 @@ public class FragmentThemingSettings extends PreferenceFragmentCompat implements ComposeActivity.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); return true; } - shouldRestart = true; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); @@ -439,7 +441,6 @@ public class FragmentThemingSettings extends PreferenceFragmentCompat implements createPref(); }); - shouldRestart = true; dialogBuilder.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss()); AlertDialog alertDialog = dialogBuilder.create(); alertDialog.setCancelable(false); diff --git a/app/src/main/res/navigation/nav_graph_settings.xml b/app/src/main/res/navigation/nav_graph_settings.xml index 7c3426b3..56b5caf2 100644 --- a/app/src/main/res/navigation/nav_graph_settings.xml +++ b/app/src/main/res/navigation/nav_graph_settings.xml @@ -55,7 +55,11 @@ + app:destination="@id/FragmentThemingSettings" + app:enterAnim="@anim/enter" + app:exitAnim="@anim/exit" + app:popEnterAnim="@anim/pop_enter" + app:popExitAnim="@anim/pop_exit" /> + - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6b6885f3..845f5dd8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -695,6 +695,18 @@ List name is not valid! No accounts found for this list! Scheduled + + + Light + Dark + System default + + + LIGHT + DARK + SYSTEM + + Push notifications Fetch at fixed times @@ -1252,6 +1264,9 @@ SET_SHOW_REPLIES SET_DISABLE_ANIMATED_EMOJI SET_CAPITALIZE + SET_THEME_BASE + SYSTEM + SET_FULL_PREVIEW SET_SHARE_DETAILS SET_CUSTOM_SHARING @@ -1957,4 +1972,7 @@ Changes have been saved! Create domain block Are you sure to mute the tag %1$s? + Pickup a mode for the theme + Customize colors + Allow to set your custom colors for themes. \ No newline at end of file diff --git a/app/src/main/res/xml/pref_theming.xml b/app/src/main/res/xml/pref_theming.xml index 66ed42c4..517c6048 100644 --- a/app/src/main/res/xml/pref_theming.xml +++ b/app/src/main/res/xml/pref_theming.xml @@ -5,19 +5,22 @@ android:layout_height="match_parent"> + + + app:summary="@string/pref_customize_summary" + app:title="@string/pref_customize" /> - -