diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index f46d0e832..2277704d2 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -1,48 +1,43 @@ package org.joinmastodon.android; +import static org.joinmastodon.android.api.MastodonAPIController.gson; + import android.content.Context; import android.content.SharedPreferences; -import android.content.res.Resources; -import android.os.Build; -import android.os.LocaleList; -import java.util.ArrayList; -import java.util.Arrays; + +import com.google.gson.JsonSyntaxException; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.HashMap; import java.util.List; -import java.util.Locale; -import java.util.stream.Collectors; +import java.util.Map; public class GlobalUserPreferences{ public static boolean playGifs; public static boolean useCustomTabs; public static boolean trueBlackTheme; public static ThemePreference theme; - public static List recentLanguages; - private static String defaultRecentLanguages; - - static { - List systemLocales = new ArrayList<>();; - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { - systemLocales.add(Resources.getSystem().getConfiguration().locale); - } else { - LocaleList localeList = Resources.getSystem().getConfiguration().getLocales(); - for (int i = 0; i < localeList.size(); i++) systemLocales.add(localeList.get(i)); - } - - defaultRecentLanguages = systemLocales.stream().map(Locale::getLanguage).collect(Collectors.joining(",")); - } + private final static Type recentLanguagesType = new TypeToken>>() {}.getType(); + public static Map> recentLanguages; private static SharedPreferences getPrefs(){ return MastodonApp.context.getSharedPreferences("global", Context.MODE_PRIVATE); } + private static T fromJson(String json, Type type, T orElse) { + try { return gson.fromJson(json, type); } + catch (JsonSyntaxException ignored) { return orElse; } + } + public static void load(){ SharedPreferences prefs=getPrefs(); playGifs=prefs.getBoolean("playGifs", true); useCustomTabs=prefs.getBoolean("useCustomTabs", true); trueBlackTheme=prefs.getBoolean("trueBlackTheme", false); theme=ThemePreference.values()[prefs.getInt("theme", 0)]; - recentLanguages=Arrays.stream(prefs.getString("recentLanguages", defaultRecentLanguages).split(",")).filter(s->!s.isEmpty()).collect(Collectors.toList()); + recentLanguages=fromJson(prefs.getString("recentLanguages", "{}"), recentLanguagesType, new HashMap<>()); } public static void save(){ @@ -51,7 +46,7 @@ public class GlobalUserPreferences{ .putBoolean("useCustomTabs", useCustomTabs) .putBoolean("trueBlackTheme", trueBlackTheme) .putInt("theme", theme.ordinal()) - .putString("recentLanguages", String.join(",", recentLanguages)) + .putString("recentLanguages", gson.toJson(recentLanguages)) .apply(); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java index 6fda1fc26..9649a0a4b 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/ComposeFragment.java @@ -1,6 +1,8 @@ package org.joinmastodon.android.fragments; +import static org.joinmastodon.android.GlobalUserPreferences.recentLanguages; import static org.joinmastodon.android.utils.MastodonLanguage.allLanguages; +import static org.joinmastodon.android.utils.MastodonLanguage.defaultRecentLanguages; import android.animation.ObjectAnimator; import android.annotation.SuppressLint; @@ -109,6 +111,7 @@ import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Optional; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -624,7 +627,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr Menu languageMenu = languagePopup.getMenu(); - for (String recentLanguage : GlobalUserPreferences.recentLanguages) { + for (String recentLanguage : Optional.ofNullable(recentLanguages.get(accountID)).orElse(defaultRecentLanguages)) { MastodonLanguage l = languageResolver.from(recentLanguage); languageMenu.add(0, allLanguages.indexOf(l), Menu.NONE, getActivity().getString(R.string.language_name, l.getDefaultName(), l.getLanguageName())); } @@ -788,10 +791,10 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr } if (replyTo == null) { - List recentLanguages = new ArrayList<>(GlobalUserPreferences.recentLanguages); - recentLanguages.remove(language); - recentLanguages.add(0, language); - GlobalUserPreferences.recentLanguages = recentLanguages.stream().limit(4).collect(Collectors.toList()); + List newRecentLanguages = new ArrayList<>(Optional.ofNullable(recentLanguages.get(accountID)).orElse(defaultRecentLanguages)); + newRecentLanguages.remove(language); + newRecentLanguages.add(0, language); + recentLanguages.put(accountID, newRecentLanguages.stream().limit(4).collect(Collectors.toList())); GlobalUserPreferences.save(); } } 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 e98a6107d..2a3a459cf 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/SettingsFragment.java @@ -48,6 +48,7 @@ import org.joinmastodon.android.ui.utils.UiUtils; import org.joinmastodon.android.updater.GithubSelfUpdater; import java.util.ArrayList; +import java.util.Objects; import java.util.function.Consumer; import androidx.annotation.DrawableRes; @@ -121,7 +122,7 @@ public class SettingsFragment extends MastodonToolbarFragment{ items.add(new RedHeaderItem(R.string.settings_spicy)); items.add(new TextItem(R.string.settings_clear_cache, this::clearImageCache)); items.add(new TextItem(R.string.clear_recent_languages, ()->UiUtils.showConfirmationAlert(getActivity(), R.string.clear_recent_languages, R.string.confirm_clear_recent_languages, R.string.clear, ()->{ - GlobalUserPreferences.recentLanguages.clear(); + GlobalUserPreferences.recentLanguages.remove(accountID); GlobalUserPreferences.save(); }))); items.add(new TextItem(R.string.log_out, this::confirmLogOut)); diff --git a/mastodon/src/main/java/org/joinmastodon/android/utils/MastodonLanguage.java b/mastodon/src/main/java/org/joinmastodon/android/utils/MastodonLanguage.java index b0b19e72c..2e4eb949a 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/utils/MastodonLanguage.java +++ b/mastodon/src/main/java/org/joinmastodon/android/utils/MastodonLanguage.java @@ -3,6 +3,10 @@ package org.joinmastodon.android.utils; import static org.joinmastodon.android.api.MastodonAPIController.gson; +import android.content.res.Resources; +import android.os.Build; +import android.os.LocaleList; + import org.joinmastodon.android.model.Instance; import java.util.ArrayList; @@ -11,6 +15,7 @@ import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.stream.Collectors; public class MastodonLanguage { // On an up-to-date Mastodon instance: @@ -27,6 +32,20 @@ public class MastodonLanguage { Collections.sort(allLanguages, Comparator.comparing(MastodonLanguage::getDefaultName)); } + public static List defaultRecentLanguages; + + static { + List systemLocales = new ArrayList<>();; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + systemLocales.add(Resources.getSystem().getConfiguration().locale); + } else { + LocaleList localeList = Resources.getSystem().getConfiguration().getLocales(); + for (int i = 0; i < localeList.size(); i++) systemLocales.add(localeList.get(i)); + } + + defaultRecentLanguages = systemLocales.stream().map(Locale::getLanguage).collect(Collectors.toList()); + } + public final String languageTag, name, englishName; public final Locale locale;