From fcef6f965db8d8a616a732f20c2e0c8f1fe48138 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 14 Jun 2022 17:32:26 -0400 Subject: [PATCH] Fix crash that can occur when using non-standard font sizes. --- .../appearance/AppearanceSettingsFragment.kt | 4 +-- .../securesms/keyvalue/SettingsValues.java | 30 +++++++++++++++---- .../securesms/util/TextSecurePreferences.java | 2 +- app/src/main/res/values/arrays.xml | 8 ++--- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt index c7f75db492..72b71a530c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/appearance/AppearanceSettingsFragment.kt @@ -19,7 +19,7 @@ class AppearanceSettingsFragment : DSLSettingsFragment(R.string.preferences__app private val themeValues by lazy { resources.getStringArray(R.array.pref_theme_values) } private val messageFontSizeLabels by lazy { resources.getStringArray(R.array.pref_message_font_size_entries) } - private val messageFontSizeValues by lazy { resources.getStringArray(R.array.pref_message_font_size_values) } + private val messageFontSizeValues by lazy { resources.getIntArray(R.array.pref_message_font_size_values) } private val languageLabels by lazy { resources.getStringArray(R.array.language_entries) } private val languageValues by lazy { resources.getStringArray(R.array.language_values) } @@ -53,7 +53,7 @@ class AppearanceSettingsFragment : DSLSettingsFragment(R.string.preferences__app radioListPref( title = DSLSettingsText.from(R.string.preferences_chats__message_text_size), listItems = messageFontSizeLabels, - selected = messageFontSizeValues.indexOf(state.messageFontSize.toString()), + selected = messageFontSizeValues.indexOf(state.messageFontSize), onSelected = { viewModel.setMessageFontSize(messageFontSizeValues[it].toInt()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java index fd7aab72e5..6d2f6e7a81 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/SettingsValues.java @@ -23,6 +23,7 @@ import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.webrtc.CallBandwidthMode; import java.util.Arrays; +import java.util.Collections; import java.util.List; @SuppressWarnings("deprecation") @@ -196,12 +197,31 @@ public final class SettingsValues extends SignalStoreValues { } public int getMessageQuoteFontSize(@NonNull Context context) { - String messageFontSize = String.valueOf(getMessageFontSize()); - String[] messageSizes = context.getResources().getStringArray(R.array.pref_message_font_size_values); - String[] quoteSizes = context.getResources().getStringArray(R.array.pref_message_font_quote_size_values); - int index = Arrays.binarySearch(messageSizes, messageFontSize); + int currentMessageSize = getMessageFontSize(); + int[] possibleMessageSizes = context.getResources().getIntArray(R.array.pref_message_font_size_values); + int[] possibleQuoteSizes = context.getResources().getIntArray(R.array.pref_message_font_quote_size_values); + int sizeIndex = Arrays.binarySearch(possibleMessageSizes, currentMessageSize); - return Integer.parseInt(quoteSizes[index]); + if (sizeIndex < 0) { + int closestSizeIndex = 0; + int closestSizeDiff = Integer.MAX_VALUE; + + for (int i = 0; i < possibleMessageSizes.length; i++) { + int diff = Math.abs(possibleMessageSizes[i] - currentMessageSize); + if (diff < closestSizeDiff) { + closestSizeIndex = i; + closestSizeDiff = diff; + } + } + + int newSize = possibleMessageSizes[closestSizeIndex]; + Log.w(TAG, "Using non-standard font size of " + currentMessageSize + ". Closest match was " + newSize + ". Updating."); + + setMessageFontSize(newSize); + sizeIndex = Arrays.binarySearch(possibleMessageSizes, newSize); + } + + return possibleQuoteSizes[sizeIndex]; } public void setMessageFontSize(int messageFontSize) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java index a4e9b94a51..ce22fe885e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java @@ -498,7 +498,7 @@ public class TextSecurePreferences { * @deprecated Use {@link SettingsValues#getMessageFontSize()} via {@link org.thoughtcrime.securesms.keyvalue.SignalStore} instead. */ public static int getMessageBodyTextSize(Context context) { - return Integer.valueOf(getStringPreference(context, MESSAGE_BODY_TEXT_SIZE_PREF, "16")); + return Integer.parseInt(getStringPreference(context, MESSAGE_BODY_TEXT_SIZE_PREF, "16")); } public static boolean isTurnOnly(Context context) { diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index e63719fd44..feed6e538c 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -343,19 +343,19 @@ @string/arrays__extra_large - + 14 16 22 28 - + - + 12 14 18 22 - + @string/arrays__default