1
0
Fork 0

added 'automatic dark theme' option

This commit is contained in:
sspanak 2023-08-01 17:46:47 +03:00 committed by Dimo Karaivanov
parent 0190e84053
commit 9f65cb5ce8
19 changed files with 178 additions and 40 deletions

View file

@ -136,9 +136,7 @@ public class PreferencesActivity extends AppCompatActivity implements Preference
private void applyTheme() {
AppCompatDelegate.setDefaultNightMode(
settings.getDarkTheme() ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO
);
AppCompatDelegate.setDefaultNightMode(settings.getTheme());
}

View file

@ -2,7 +2,9 @@ package io.github.sspanak.tt9.preferences;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.preference.PreferenceManager;
import java.util.ArrayList;
@ -226,7 +228,22 @@ public class SettingsStore {
/************* UI settings *************/
public boolean getDarkTheme() { return prefs.getBoolean("pref_dark_theme", true); }
public boolean getDarkTheme() {
int theme = getTheme();
if (theme == AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) {
return (context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES;
} else {
return theme == AppCompatDelegate.MODE_NIGHT_YES;
}
}
public int getTheme() {
try {
return Integer.parseInt(prefs.getString("pref_theme", String.valueOf(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)));
} catch (NumberFormatException e) {
return AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
}
}
public boolean getShowSoftKeys() { return prefs.getBoolean("pref_show_soft_keys", true); }

View file

@ -0,0 +1,72 @@
package io.github.sspanak.tt9.preferences.items;
import androidx.preference.DropDownPreference;
import androidx.preference.Preference;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import io.github.sspanak.tt9.Logger;
public class ItemDropDown {
private final DropDownPreference item;
private LinkedHashMap<Integer, String> values;
public ItemDropDown(DropDownPreference item) {
this.item = item;
}
protected void populate(LinkedHashMap<Integer, String> values) {
if (item == null) {
Logger.w("tt9/ItemDropDown.populate", "Cannot populate a NULL item. Ignoring.");
return;
}
this.values = values != null ? values : new LinkedHashMap<>();
ArrayList<String> keys = new ArrayList<>();
for (int key : this.values.keySet()) {
keys.add(String.valueOf(key));
}
item.setEntryValues(keys.toArray(new CharSequence[0]));
item.setEntries(this.values.values().toArray(new CharSequence[0]));
}
public ItemDropDown enableClickHandler() {
if (item == null) {
Logger.w("tt9/SectionKeymap.populateItem", "Cannot set a click listener a NULL item. Ignoring.");
return this;
}
item.setOnPreferenceChangeListener(this::onClick);
return this;
}
protected boolean onClick(Preference preference, Object newKey) {
try {
String previewValue = values.get(Integer.parseInt(newKey.toString()));
((DropDownPreference) preference).setValue(newKey.toString());
setPreview(previewValue);
return true;
} catch (NumberFormatException e) {
return false;
}
}
private void setPreview(String value) {
if (item != null) {
item.setSummary(value);
}
}
public ItemDropDown preview() {
try {
setPreview(values.get(Integer.parseInt(item.getValue())));
} catch (NumberFormatException e) {
setPreview("");
}
return this;
}
}

View file

@ -0,0 +1,43 @@
package io.github.sspanak.tt9.preferences.items;
import android.content.Context;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.preference.DropDownPreference;
import androidx.preference.Preference;
import java.util.LinkedHashMap;
import io.github.sspanak.tt9.R;
public class ItemSelectTheme extends ItemDropDown {
public static final String NAME = "pref_theme";
private final Context context;
public ItemSelectTheme(Context context, DropDownPreference item) {
super(item);
this.context = context;
}
public ItemDropDown populate() {
LinkedHashMap<Integer, String> themes = new LinkedHashMap<>();
themes.put(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, context.getString(R.string.pref_dark_theme_auto));
themes.put(AppCompatDelegate.MODE_NIGHT_NO, context.getString(R.string.pref_dark_theme_no));
themes.put(AppCompatDelegate.MODE_NIGHT_YES, context.getString(R.string.pref_dark_theme_yes));
super.populate(themes);
return this;
}
@Override
protected boolean onClick(Preference preference, Object newKey) {
if (super.onClick(preference, newKey)) {
AppCompatDelegate.setDefaultNightMode(Integer.parseInt(newKey.toString()));
return true;
}
return false;
}
}

View file

@ -1,27 +0,0 @@
package io.github.sspanak.tt9.preferences.items;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.preference.Preference;
import androidx.preference.SwitchPreferenceCompat;
public class ItemToggleDarkTheme {
public static final String NAME = "pref_dark_theme";
private final SwitchPreferenceCompat themeToggle;
public ItemToggleDarkTheme(SwitchPreferenceCompat item) {
themeToggle = item;
}
public void enableToggleHandler() {
themeToggle.setOnPreferenceChangeListener(this::onChange);
}
private boolean onChange(Preference p, Object newValue) {
AppCompatDelegate.setDefaultNightMode(
((boolean) newValue) ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO
);
return true;
}
}

View file

@ -2,7 +2,7 @@ package io.github.sspanak.tt9.preferences.screens;
import io.github.sspanak.tt9.R;
import io.github.sspanak.tt9.preferences.PreferencesActivity;
import io.github.sspanak.tt9.preferences.items.ItemToggleDarkTheme;
import io.github.sspanak.tt9.preferences.items.ItemSelectTheme;
public class AppearanceScreen extends BaseScreenFragment {
public AppearanceScreen() { init(); }
@ -13,6 +13,9 @@ public class AppearanceScreen extends BaseScreenFragment {
@Override
protected void onCreate() {
(new ItemToggleDarkTheme(findPreference(ItemToggleDarkTheme.NAME))).enableToggleHandler();
(new ItemSelectTheme(activity, findPreference(ItemSelectTheme.NAME)))
.populate()
.enableClickHandler()
.preview();
}
}

View file

@ -27,9 +27,7 @@ public class AddWordAct extends AppCompatActivity {
protected void onCreate(Bundle savedData) {
settings = new SettingsStore(this);
AppCompatDelegate.setDefaultNightMode(
settings.getDarkTheme() ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO
);
AppCompatDelegate.setDefaultNightMode(settings.getTheme());
super.onCreate(savedData);